gsl-2.7.1/0000755016036000116100000000000014151602577007316 500000000000000gsl-2.7.1/Makefile.am0000644016036000116100000000676213377336121011303 00000000000000## Process this file with automake to produce Makefile.in # AUTOMAKE_OPTIONS = readme-alpha SUBDIRS = gsl utils sys test err bst 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 filter movstat 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 bst/libgslbst.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 filter/libgslfilter.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 movstat/libgslmovstat.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-2.7.1/configure0000755016036000116100000170754014151557213011157 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.71 for gsl 2.7.1. # # # Copyright (C) 1992-1996, 1998-2017, 2020-2021 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 as_nop=: if test ${ZSH_VERSION+y} && (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 $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; 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 # 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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 printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # 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'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 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="as_nop=: if test \${ZSH_VERSION+y} && (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 \$as_nop 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 \$as_nop exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || 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_nop as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else $as_nop if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi fi 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'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$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_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # 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=`printf "%s\n" "$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 || printf "%s\n" 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_nop 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_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # 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 printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$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 || printf "%s\n" 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" || { printf "%s\n" "$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 } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. 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 # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' 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.7.1' PACKAGE_STRING='gsl 2.7.1' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="gsl_math.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_STDIO_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_c_list= ac_func_c_list= 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 LT_SYS_LIBRARY_PATH 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__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 runstatedir 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 am__quote' 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_aix_soname with_gnu_ld with_sysroot enable_libtool_lock ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP LT_SYS_LIBRARY_PATH' # 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' runstatedir='${localstatedir}/run' 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 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=`printf "%s\n" "$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=`printf "%s\n" "$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 ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -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=`printf "%s\n" "$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=`printf "%s\n" "$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. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$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" ;; *) printf "%s\n" "$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 runstatedir 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 || printf "%s\n" 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.7.1 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] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --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.7.1:";; 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-aix-soname=aix|svr4|both shared library versioning (aka "SONAME") variant to provide on AIX, [default=aix]. --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 LT_SYS_LIBRARY_PATH User-defined run-time library search path. 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=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$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 configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. 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 printf "%s\n" "$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.7.1 generated by GNU Autoconf 2.71 Copyright (C) 2021 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 conftest.beam 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\"" printf "%s\n" "$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 printf "%s\n" "$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_nop printf "%s\n" "$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\"" printf "%s\n" "$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 printf "%s\n" "$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_nop printf "%s\n" "$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.beam 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\"" printf "%s\n" "$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 printf "%s\n" "$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_nop printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop 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 $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop 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. */ #include #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 (void) { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" else $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { 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 (void) { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else $as_nop eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR # ------------------------------------------------------------------ # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR. ac_fn_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 printf %s "checking whether $as_decl_name is declared... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` eval ac_save_FLAGS=\$$6 as_fn_append $6 " $5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { #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 $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext eval $6=\$ac_save_FLAGS fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_check_decl # ac_fn_c_try_run LINENO # ---------------------- # Try to run 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\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$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\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: program exited with status $ac_status" >&5 printf "%s\n" "$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_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac 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.7.1, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw _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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "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=`printf "%s\n" "$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=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## 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_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$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 printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$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 printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*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 do not provoke an error unfortunately, instead are silently treated as an "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 is necessary to write \x00 == 0 to get something that is 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 **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' // Does the compiler advertise C99 conformance? #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' // Does the compiler advertise C11 conformance? #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" as_fn_append ac_func_c_list " vprintf HAVE_VPRINTF" # Auxiliary files required by this configure script. ac_aux_files="ltmain.sh compile config.guess config.sub missing install-sh" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else $as_nop as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$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. if test -f "${ac_aux_dir}config.guess"; then ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_configure="$SHELL ${ac_aux_dir}configure" 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,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 printf "%s\n" "$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=`printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`${MAKE-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.16' # 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. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac # Account for fact that we put trailing slashes in our PATH walk. 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+y}; 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 printf "%s\n" "$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' { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 printf %s "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "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=`printf "%s\n" "$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 MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 printf "%s\n" "$STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 printf "%s\n" "$ac_ct_STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 printf %s "checking for a race-free mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test ${ac_cv_path_mkdir+y} then : printf %s "(cached) " >&6 else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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 ('*'coreutils) '* | \ 'BusyBox '* | \ '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+y}; 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 printf "%s\n" "$AWK" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AWK" && break done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SET_MAKE= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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+y} 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} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 printf %s "checking whether $am_make supports nested variables... " >&6; } if test ${am_cv_make_support_nested_variables+y} then : printf %s "(cached) " >&6 else $as_nop if printf "%s\n" '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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 printf "%s\n" "$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.7.1' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h # 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 (and possibly the TAP driver). 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 -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi ac_config_headers="$ac_config_headers config.h" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test ${enable_maintainer_mode+y} then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else $as_nop USE_MAINTAINER_MODE=no fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 printf "%s\n" "$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=27 GSL_REVISION=0 GSL_AGE=0 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 *+) ;; *) printf "%s\n" "#define RELEASED /**/" >>confdefs.h ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 printf %s "checking for a sed that does not truncate output... " >&6; } if test ${ac_cv_path_SED+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" '' >> "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 printf "%s\n" "$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/'` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SET_MAKE= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 printf %s "checking build system type... " >&6; } if test ${ac_cv_build+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 printf %s "checking host system type... " >&6; } if test ${ac_cv_host+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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}clang" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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="clang" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$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. printf "%s\n" "$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 -version; 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\"" printf "%s\n" "$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 printf "%s\n" "$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 (void) { ; 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. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$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\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$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+y} && 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 $as_nop ac_file='' fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$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_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "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\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$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_nop { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$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 (void) { 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. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "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\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$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\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$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 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; 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\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$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_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else $as_nop 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 (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else $as_nop CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else $as_nop ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; 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.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; 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 ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _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 conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 printf %s "checking whether $CC understands -c and -o together... " >&6; } if test ${am_cv_prog_cc_c_o+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" 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" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in #( '0:this is the am__doit target') : case $s in #( BSD) : am__include='.include' am__quote='"' ;; #( *) : am__include='include' am__quote='' ;; esac ;; #( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 printf "%s\n" "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. if test ${enable_dependency_tracking+y} 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= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CC_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 printf %s "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 test ${ac_cv_prog_CPP+y} then : printf %s "(cached) " >&6 else $as_nop # Double quotes because $CC needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" 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. # 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. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else $as_nop # 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 $as_nop # 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 printf "%s\n" "$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. # 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. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else $as_nop # 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 $as_nop # 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_nop { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 printf %s "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 printf "%s\n" "no, using $LN_S" >&6; } fi case `pwd` in *\ * | *\ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.6' macro_revision='2.4.6' 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 printf %s "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*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 printf "%s\n" "printf" >&6; } ;; print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 printf "%s\n" "print -r" >&6; } ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 printf "%s\n" "cat" >&6; } ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 printf %s "checking for a sed that does not truncate output... " >&6; } if test ${ac_cv_path_SED+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" '' >> "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 printf "%s\n" "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 printf %s "checking for grep that handles long lines and -e... " >&6; } if test ${ac_cv_path_GREP+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" '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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 printf "%s\n" "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 printf %s "checking for egrep... " >&6; } if test ${ac_cv_path_EGREP+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" '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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 printf "%s\n" "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 printf %s "checking for fgrep... " >&6; } if test ${ac_cv_path_FGREP+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" '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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 printf "%s\n" "$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+y} then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else $as_nop with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 printf %s "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 yes = "$with_gnu_ld"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 printf %s "checking for GNU ld... " >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 printf %s "checking for non-GNU ld... " >&6; } fi if test ${lt_cv_path_LD+y} then : printf %s "(cached) " >&6 else $as_nop 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 printf "%s\n" "$LD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 printf %s "checking if the linker ($LD) is GNU ld... " >&6; } if test ${lt_cv_prog_gnu_ld+y} then : printf %s "(cached) " >&6 else $as_nop # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if test ${lt_cv_path_NM+y} then : printf %s "(cached) " >&6 else $as_nop 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 # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 printf "%s\n" "$lt_cv_path_NM" >&6; } if test no != "$lt_cv_path_NM"; 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DUMPBIN+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 printf "%s\n" "$DUMPBIN" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DUMPBIN+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 printf "%s\n" "$ac_ct_DUMPBIN" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 printf %s "checking the name lister ($NM) interface... " >&6; } if test ${lt_cv_nm_interface+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 printf "%s\n" "$lt_cv_nm_interface" >&6; } # find the maximum length of command line arguments { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 printf %s "checking the maximum length of command line arguments... " >&6; } if test ${lt_cv_sys_max_cmd_len+y} then : printf %s "(cached) " >&6 else $as_nop 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; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # 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" && \ test undefined != "$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 17 != "$i" # 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 printf "%s\n" "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 printf %s "checking how to convert $build file names to $host format... " >&6; } if test ${lt_cv_to_host_file_cmd+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 printf %s "checking how to convert $build file names to toolchain format... " >&6; } if test ${lt_cv_to_tool_file_cmd+y} then : printf %s "(cached) " >&6 else $as_nop #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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 printf %s "checking for $LD option to reload object files... " >&6; } if test ${lt_cv_ld_reload_flag+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_ld_reload_flag='-r' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 printf "%s\n" "$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 yes != "$GCC"; then reload_cmds=false fi ;; darwin*) if test yes = "$GCC"; 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OBJDUMP+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 printf "%s\n" "$OBJDUMP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OBJDUMP+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 printf "%s\n" "$ac_ct_OBJDUMP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 printf %s "checking how to recognize dependent libraries... " >&6; } if test ${lt_cv_deplibs_check_method+y} then : printf %s "(cached) " >&6 else $as_nop 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 # that 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. if ( 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 ;; 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 | 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* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; 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 ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DLLTOOL+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 printf "%s\n" "$DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DLLTOOL+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 printf "%s\n" "$ac_ct_DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 printf %s "checking how to associate runtime and link libraries... " >&6; } if test ${lt_cv_sharedlib_from_linklib_cmd+y} then : printf %s "(cached) " >&6 else $as_nop 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 one 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AR+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 printf "%s\n" "$AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_AR+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 printf "%s\n" "$ac_ct_AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 printf %s "checking for archiver @FILE support... " >&6; } if test ${lt_cv_ar_at_file+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; 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=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -eq "$ac_status"; 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=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 printf "%s\n" "$lt_cv_ar_at_file" >&6; } if test no = "$lt_cv_ar_at_file"; 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 printf "%s\n" "$STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 printf "%s\n" "$ac_ct_STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 printf "%s\n" "$RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 printf "%s\n" "$ac_ct_RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 bitrig* | 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. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 printf %s "checking command to parse $NM output from $compiler object... " >&6; } if test ${lt_cv_sys_global_symbol_pipe+y} then : printf %s "(cached) " >&6 else $as_nop # 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 ia64 = "$host_cpu"; 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 if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # 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"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$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"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/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, # D for any global variable and I for any imported 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};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,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=$? printf "%s\n" "$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=$? printf "%s\n" "$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 can'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* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$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=$? printf "%s\n" "$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 yes = "$pipe_works"; 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 printf "%s\n" "failed" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 printf %s "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test ${with_sysroot+y} then : withval=$with_sysroot; else $as_nop with_sysroot=no fi lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 printf "%s\n" "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 printf "%s\n" "${lt_sysroot:-no}" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 printf %s "checking for a working dd... " >&6; } if test ${ac_cv_path_lt_DD+y} then : printf %s "(cached) " >&6 else $as_nop printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} if test -z "$lt_DD"; then ac_path_lt_DD_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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in dd do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi $ac_path_lt_DD_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_lt_DD"; then : fi else ac_cv_path_lt_DD=$lt_DD fi rm -f conftest.i conftest2.i conftest.out fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 printf "%s\n" "$ac_cv_path_lt_DD" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 printf %s "checking how to truncate binary pipes... " >&6; } if test ${lt_cv_truncate_bin+y} then : printf %s "(cached) " >&6 else $as_nop printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 printf "%s\n" "$lt_cv_truncate_bin" >&6; } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # Check whether --enable-libtool-lock was given. if test ${enable_libtool_lock+y} then : enableval=$enable_libtool_lock; fi test no = "$enable_libtool_lock" || 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 what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$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 what ABI is being produced by ac_compile, and set linker # options accordingly. 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=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test yes = "$lt_cv_prog_gnu_ld"; 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* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. 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=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$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*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; 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" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; 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" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 printf %s "checking whether the C compiler needs -belf... " >&6; } if test ${lt_cv_cc_needs_belf+y} then : printf %s "(cached) " >&6 else $as_nop 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 (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_cc_needs_belf=yes else $as_nop lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$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*|x86_64-*-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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 printf "%s\n" "$MANIFEST_TOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if test ${lt_cv_path_mainfest_tool+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } if test yes != "$lt_cv_path_mainfest_tool"; 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DSYMUTIL+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 printf "%s\n" "$DSYMUTIL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_NMEDIT+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 printf "%s\n" "$NMEDIT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_NMEDIT+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 printf "%s\n" "$ac_ct_NMEDIT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_LIPO+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 printf "%s\n" "$LIPO" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_LIPO+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 printf "%s\n" "$ac_ct_LIPO" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OTOOL+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 printf "%s\n" "$OTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OTOOL+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 printf "%s\n" "$ac_ct_OTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OTOOL64+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 printf "%s\n" "$OTOOL64" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OTOOL64+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 printf "%s\n" "$ac_ct_OTOOL64" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 printf %s "checking for -single_module linker flag... " >&6; } if test ${lt_cv_apple_cc_single_mod+y} then : printf %s "(cached) " >&6 else $as_nop 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 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 printf %s "checking for -exported_symbols_list linker flag... " >&6; } if test ${lt_cv_ld_exported_symbols_list+y} then : printf %s "(cached) " >&6 else $as_nop 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 (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_ld_exported_symbols_list=yes else $as_nop lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 printf %s "checking for -force_load linker flag... " >&6; } if test ${lt_cv_ld_force_load+y} then : printf %s "(cached) " >&6 else $as_nop 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 0 = "$_lt_result" && $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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 printf "%s\n" "$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 yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; 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 no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } ac_header= ac_cache= for ac_item in $ac_header_c_list do if test $ac_cache; then ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then printf "%s\n" "#define $ac_item 1" >> confdefs.h fi ac_header= ac_cache= elif test $ac_header; then ac_cache=$ac_item else ac_header=$ac_item fi done if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes then : printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h fi 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 : printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h fi # 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AS+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 printf "%s\n" "$AS" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_AS+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 printf "%s\n" "$ac_ct_AS" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DLLTOOL+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 printf "%s\n" "$DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DLLTOOL+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 printf "%s\n" "$ac_ct_DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OBJDUMP+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 printf "%s\n" "$OBJDUMP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OBJDUMP+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 printf "%s\n" "$ac_ct_OBJDUMP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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+y} 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 $as_nop enable_shared=yes fi # Check whether --enable-static was given. if test ${enable_static+y} 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 $as_nop enable_static=yes fi # Check whether --with-pic was given. if test ${with_pic+y} 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 $as_nop pic_mode=default fi # Check whether --enable-fast-install was given. if test ${enable_fast_install+y} 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 $as_nop enable_fast_install=yes fi shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 printf %s "checking which variant of shared library versioning to provide... " >&6; } # Check whether --with-aix-soname was given. if test ${with_aix_soname+y} then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; *) as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 ;; esac lt_cv_with_aix_soname=$with_aix_soname else $as_nop if test ${lt_cv_with_aix_soname+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_with_aix_soname=aix fi with_aix_soname=$lt_cv_with_aix_soname fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 printf "%s\n" "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac # 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 printf %s "checking for objdir... " >&6; } if test ${lt_cv_objdir+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 printf "%s\n" "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h 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 set != "${COLLECT_NAMES+set}"; 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 func_cc_basename $compiler cc_basename=$func_cc_basename_result # 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 printf %s "checking for ${ac_tool_prefix}file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 printf "%s\n" "$MAGIC_CMD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 printf %s "checking for file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 printf "%s\n" "$MAGIC_CMD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 yes = "$GCC"; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if test ${lt_cv_prog_compiler_rtti_exceptions+y} then : printf %s "(cached) " >&6 else $as_nop 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" ## exclude from sc_useless_quotes_in_assignment # 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; 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 yes = "$GCC"; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi lt_prog_compiler_pic='-fPIC' ;; 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' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; 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 ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; esac ;; 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' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; 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 | 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' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; 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 that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 printf %s "checking for $compiler option to produce PIC... " >&6; } if test ${lt_cv_prog_compiler_pic+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if test ${lt_cv_prog_compiler_pic_works+y} then : printf %s "(cached) " >&6 else $as_nop 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" ## exclude from sc_useless_quotes_in_assignment # 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; 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\" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if test ${lt_cv_prog_compiler_static_works+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : else lt_prog_compiler_static= fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 printf %s "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 printf "%s\n" "$hard_links" >&6; } if test no = "$hard_links"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 printf %s "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 yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) 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 yes = "$with_gnu_ld"; 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 yes = "$lt_use_gnu_ld_interface"; 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 | $SED -e 's/(^)\+)\s\+//' 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 ia64 != "$host_cpu"; 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, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; 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 ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=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 linux-dietlibc = "$host_os"; 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 no = "$tmp_diet" 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' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-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 yes = "$supports_anon_versioning"; 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 tcc*) export_dynamic_flag_spec='-rdynamic' ;; 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 yes = "$supports_anon_versioning"; 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 cannot *** 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 no = "$ld_shlibs"; 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 yes = "$GCC" && 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 ia64 = "$host_cpu"; 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 GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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 # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; 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,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct=no hardcode_direct_absolute=no ;; esac if test yes = "$GCC"; 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 yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; 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 set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath_+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; 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.beam \ 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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; 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 set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath_+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; 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.beam \ 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 yes = "$with_gnu_ld"; 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 archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' 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,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $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 yes = "$lt_cv_ld_force_load"; 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*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; 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 yes = "$GCC"; 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 "x$output_objdir/$soname" = "x$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 "x$output_objdir/$soname" = "x$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 yes,no = "$GCC,$with_gnu_ld"; 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 no = "$with_gnu_ld"; 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 yes,no = "$GCC,$with_gnu_ld"; 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) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 printf %s "checking if $CC understands -b... " >&6; } if test ${lt_cv_prog_compiler__b+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } if test yes = "$lt_cv_prog_compiler__b"; 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 no = "$with_gnu_ld"; 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 yes = "$GCC"; 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. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if test ${lt_cv_irix_exported_symbol+y} then : printf %s "(cached) " >&6 else $as_nop 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 $as_nop lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; 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 ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler ld_shlibs=yes archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; 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* | bitrig*) 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__`"; 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 archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='$wl-rpath,$libdir' fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; osf3*) if test yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 sequent = "$host_vendor"; 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 yes = "$GCC"; 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 CANNOT 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 yes = "$GCC"; 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 sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='$wl-Blargedynsym' ;; esac fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 printf "%s\n" "$ld_shlibs" >&6; } test no = "$ld_shlibs" && 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 yes,yes = "$GCC,$enable_shared"; 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. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 printf %s "checking whether -lc should be explicitly linked in... " >&6; } if test ${lt_cv_archive_cmds_need_lc+y} then : printf %s "(cached) " >&6 else $as_nop $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=$? printf "%s\n" "$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=$? printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 printf %s "checking dynamic linker characteristics... " >&6; } if test yes = "$GCC"; 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` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac 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" elif test -n "$lt_multi_os_dir"; then 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 ia64 = "$host_cpu"; 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 # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # 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' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # 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' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac 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%'\''`; $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$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' 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 ;; 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=no 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 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; 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 yes = "$lt_cv_prog_gnu_ld"; 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 ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # 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 dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | 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 test ${lt_cv_shlibpath_overrides_runpath+y} then : printf %s "(cached) " >&6 else $as_nop 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 (void) { ; 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.beam \ 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 # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) 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="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; 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* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi 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 shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec 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' ;; 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 yes = "$with_gnu_ld"; 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=sco 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 yes = "$with_gnu_ld"; 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 printf "%s\n" "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 printf %s "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test yes = "$hardcode_automatic"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct" && # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && test no != "$hardcode_minus_L"; 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 printf "%s\n" "$hardcode_action" >&6; } if test relink = "$hardcode_action" || test yes = "$inherit_rpath"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi if test yes != "$enable_dlopen"; 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 else $as_nop 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. */ char dlopen (); int main (void) { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes else $as_nop ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$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_nop lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) 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_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 printf %s "checking for shl_load in -ldld... " >&6; } if test ${ac_cv_lib_dld_shl_load+y} then : printf %s "(cached) " >&6 else $as_nop 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. */ char shl_load (); int main (void) { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_shl_load=yes else $as_nop ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 printf "%s\n" "$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 $as_nop 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_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 else $as_nop 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. */ char dlopen (); int main (void) { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes else $as_nop ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$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_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 printf %s "checking for dlopen in -lsvld... " >&6; } if test ${ac_cv_lib_svld_dlopen+y} then : printf %s "(cached) " >&6 else $as_nop 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. */ char dlopen (); int main (void) { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_svld_dlopen=yes else $as_nop ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 printf "%s\n" "$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_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 printf %s "checking for dld_link in -ldld... " >&6; } if test ${ac_cv_lib_dld_dld_link+y} then : printf %s "(cached) " >&6 else $as_nop 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. */ char dld_link (); int main (void) { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_dld_link=yes else $as_nop ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 printf "%s\n" "$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 no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && 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" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 printf %s "checking whether a program can dlopen itself... " >&6; } if test ${lt_cv_dlopen_self+y} then : printf %s "(cached) " >&6 else $as_nop if test yes = "$cross_compiling"; 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 -fvisibility=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=$? printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 printf "%s\n" "$lt_cv_dlopen_self" >&6; } if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 printf %s "checking whether a statically linked program can dlopen itself... " >&6; } if test ${lt_cv_dlopen_self_static+y} then : printf %s "(cached) " >&6 else $as_nop if test yes = "$cross_compiling"; 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 -fvisibility=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=$? printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 printf "%s\n" "$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= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 printf %s "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" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "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" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac fi # Report what library types will actually be built { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 printf %s "checking if libtool supports shared libraries... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 printf "%s\n" "$can_build_shared" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 printf %s "checking whether to build shared libraries... " >&6; } test no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 printf "%s\n" "$enable_shared" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 printf %s "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 printf "%s\n" "$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 $as_nop printf "%s\n" "#define size_t unsigned int" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 printf %s "checking for working volatile... " >&6; } if test ${ac_cv_c_volatile+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { 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 $as_nop ac_cv_c_volatile=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 printf "%s\n" "$ac_cv_c_volatile" >&6; } if test $ac_cv_c_volatile = no; then printf "%s\n" "#define volatile /**/" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 printf %s "checking for inline... " >&6; } if test ${ac_cv_c_inline+y} then : printf %s "(cached) " >&6 else $as_nop 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 (void) {return 0; } $ac_kw foo_t foo (void) {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.beam conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether char is unsigned" >&5 printf %s "checking whether char is unsigned... " >&6; } if test ${ac_cv_c_char_unsigned+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main (void) { 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 $as_nop ac_cv_c_char_unsigned=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_char_unsigned" >&5 printf "%s\n" "$ac_cv_c_char_unsigned" >&6; } if test $ac_cv_c_char_unsigned = yes; then printf "%s\n" "#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*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _mwvalidcheckl in -lmw" >&5 printf %s "checking for _mwvalidcheckl in -lmw... " >&6; } if test ${ac_cv_lib_mw__mwvalidcheckl+y} then : printf %s "(cached) " >&6 else $as_nop 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. */ char _mwvalidcheckl (); int main (void) { return _mwvalidcheckl (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_mw__mwvalidcheckl=yes else $as_nop ac_cv_lib_mw__mwvalidcheckl=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mw__mwvalidcheckl" >&5 printf "%s\n" "$ac_cv_lib_mw__mwvalidcheckl" >&6; } if test "x$ac_cv_lib_mw__mwvalidcheckl" = xyes then : LIBM=-lmw fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 printf %s "checking for cos in -lm... " >&6; } if test ${ac_cv_lib_m_cos+y} then : printf %s "(cached) " >&6 else $as_nop 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. */ char cos (); int main (void) { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_m_cos=yes else $as_nop ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 printf "%s\n" "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = xyes then : LIBM="$LIBM -lm" fi ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 printf %s "checking for cos in -lm... " >&6; } if test ${ac_cv_lib_m_cos+y} then : printf %s "(cached) " >&6 else $as_nop 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. */ char cos (); int main (void) { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_m_cos=yes else $as_nop ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU-style extern inline" >&5 printf %s "checking for GNU-style extern inline... " >&6; } if test ${ac_cv_c_extern_inline+y} then : printf %s "(cached) " >&6 else $as_nop 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 (void) { 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.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_extern_inline" >&5 printf "%s\n" "$ac_cv_c_extern_inline" >&6; } if test "$ac_cv_c_extern_inline" != no ; then printf "%s\n" "#define HAVE_INLINE 1" >>confdefs.h else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C99-style inline" >&5 printf %s "checking for C99-style inline... " >&6; } if test ${ac_cv_c_c99inline+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_c_c99inline=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern inline void* foo() { foo(); return &foo ; }; int main (void) { 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.beam 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 (void) { return foo() != 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else $as_nop ac_cv_c_c99inline="no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_c99inline" >&5 printf "%s\n" "$ac_cv_c_c99inline" >&6; } if test "$ac_cv_c_c99inline" != no ; then printf "%s\n" "#define HAVE_INLINE 1" >>confdefs.h printf "%s\n" "#define HAVE_C99_INLINE 1" >>confdefs.h fi fi fi ac_fn_c_check_header_compile "$LINENO" "ieeefp.h" "ac_cv_header_ieeefp_h" "$ac_includes_default" if test "x$ac_cv_header_ieeefp_h" = xyes then : printf "%s\n" "#define HAVE_IEEEFP_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "complex.h" "ac_cv_header_complex_h" "$ac_includes_default" if test "x$ac_cv_header_complex_h" = xyes then : printf "%s\n" "#define HAVE_COMPLEX_H 1" >>confdefs.h fi 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_func= for ac_item in $ac_func_c_list do if test $ac_func; then ac_fn_c_check_func "$LINENO" $ac_func ac_cv_func_$ac_func if eval test \"x\$ac_cv_func_$ac_func\" = xyes; then echo "#define $ac_item 1" >> confdefs.h fi ac_func= else ac_func=$ac_item fi done if test "x$ac_cv_func_vprintf" = xno then : ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" if test "x$ac_cv_func__doprnt" = xyes then : printf "%s\n" "#define HAVE_DOPRNT 1" >>confdefs.h fi fi ac_fn_c_check_func "$LINENO" "memcpy" "ac_cv_func_memcpy" if test "x$ac_cv_func_memcpy" = xyes then : printf "%s\n" "#define HAVE_MEMCPY 1" >>confdefs.h else $as_nop 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 : printf "%s\n" "#define HAVE_MEMMOVE 1" >>confdefs.h else $as_nop 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 : printf "%s\n" "#define HAVE_STRDUP 1" >>confdefs.h else $as_nop 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 : printf "%s\n" "#define HAVE_STRTOL 1" >>confdefs.h else $as_nop 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 : printf "%s\n" "#define HAVE_STRTOUL 1" >>confdefs.h else $as_nop case " $LIBOBJS " in *" strtoul.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strtoul.$ac_objext" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for EXIT_SUCCESS and EXIT_FAILURE" >&5 printf %s "checking for EXIT_SUCCESS and EXIT_FAILURE... " >&6; } if test ${ac_cv_decl_exit_success_and_failure+y} then : printf %s "(cached) " >&6 else $as_nop 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 $as_nop ac_cv_decl_exit_success_and_failure=no fi rm -rf conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_decl_exit_success_and_failure" >&5 printf "%s\n" "$ac_cv_decl_exit_success_and_failure" >&6; } if test "$ac_cv_decl_exit_success_and_failure" = yes ; then printf "%s\n" "#define HAVE_EXIT_SUCCESS_AND_FAILURE 1" >>confdefs.h fi ; if test "x$LIBS" = "x" ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 printf %s "checking for cos in -lm... " >&6; } if test ${ac_cv_lib_m_cos+y} then : printf %s "(cached) " >&6 else $as_nop 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. */ char cos (); int main (void) { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_m_cos=yes else $as_nop ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 printf "%s\n" "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = xyes then : printf "%s\n" "#define HAVE_LIBM 1" >>confdefs.h LIBS="-lm $LIBS" fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5 printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; } if test ${ac_cv_c_undeclared_builtin_options+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_CFLAGS=$CFLAGS ac_cv_c_undeclared_builtin_options='cannot detect' for ac_arg in '' -fno-builtin; do CFLAGS="$ac_save_CFLAGS $ac_arg" # This test program should *not* compile successfully. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { (void) strchr; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else $as_nop # This test program should compile successfully. # No library function is consistently available on # freestanding implementations, so test against a dummy # declaration. Include always-available headers on the # off chance that they somehow elicit warnings. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include extern void ac_decl (int, char *); int main (void) { (void) ac_decl (0, (char *) 0); (void) ac_decl; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : if test x"$ac_arg" = x then : ac_cv_c_undeclared_builtin_options='none needed' else $as_nop ac_cv_c_undeclared_builtin_options=$ac_arg fi break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done CFLAGS=$ac_save_CFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5 printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; } case $ac_cv_c_undeclared_builtin_options in #( 'cannot detect') : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot make $CC report undeclared builtins See \`config.log' for more details" "$LINENO" 5; } ;; #( 'none needed') : ac_c_undeclared_builtin_options='' ;; #( *) : ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;; esac ac_fn_check_decl "$LINENO" "feenableexcept" "ac_cv_have_decl_feenableexcept" "#define _GNU_SOURCE 1 #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_feenableexcept" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_FEENABLEEXCEPT $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "fesettrapenable" "ac_cv_have_decl_fesettrapenable" "#define _GNU_SOURCE 1 #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_fesettrapenable" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_FESETTRAPENABLE $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "hypot" "ac_cv_have_decl_hypot" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_hypot" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_HYPOT $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "expm1" "ac_cv_have_decl_expm1" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_expm1" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_EXPM1 $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "acosh" "ac_cv_have_decl_acosh" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_acosh" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_ACOSH $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "asinh" "ac_cv_have_decl_asinh" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_asinh" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_ASINH $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "atanh" "ac_cv_have_decl_atanh" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_atanh" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_ATANH $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "ldexp" "ac_cv_have_decl_ldexp" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_ldexp" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_LDEXP $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "frexp" "ac_cv_have_decl_frexp" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_frexp" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_FREXP $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "fprnd_t" "ac_cv_have_decl_fprnd_t" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_fprnd_t" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_FPRND_T $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "isinf" "ac_cv_have_decl_isinf" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_isinf" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_ISINF $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "isfinite" "ac_cv_have_decl_isfinite" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_isfinite" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_ISFINITE $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "finite" "ac_cv_have_decl_finite" "#include #if HAVE_IEEEFP_H #include #endif " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_finite" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_FINITE $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "isnan" "ac_cv_have_decl_isnan" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_isnan" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_ISNAN $ac_have_decl" >>confdefs.h case "$host" in *-*-*openbsd*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: avoiding OpenBSD system log1p - using gsl version" >&5 printf "%s\n" "avoiding OpenBSD system log1p - using gsl version" >&6; } ;; *) ac_fn_check_decl "$LINENO" "log1p" "ac_cv_have_decl_log1p" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_log1p" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_LOG1P $ac_have_decl" >>confdefs.h ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for long double stdio" >&5 printf %s "checking for long double stdio... " >&6; } if test ${ac_cv_func_printf_longdouble+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : ac_cv_func_printf_longdouble="no" else $as_nop 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 $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_printf_longdouble" >&5 printf "%s\n" "$ac_cv_func_printf_longdouble" >&6; } if test "$ac_cv_func_printf_longdouble" != no; then printf "%s\n" "#define HAVE_PRINTF_LONGDOUBLE 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for extended floating point registers" >&5 printf %s "checking for extended floating point registers... " >&6; } if test ${ac_cv_c_extended_fp+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_extended_fp" >&5 printf "%s\n" "$ac_cv_c_extended_fp" >&6; } if test $ac_cv_c_extended_fp != "no" ; then printf "%s\n" "#define HAVE_EXTENDED_PRECISION_REGISTERS 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for IEEE arithmetic interface type" >&5 printf %s "checking for IEEE arithmetic interface type... " >&6; } if test ${ac_cv_c_ieee_interface+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_ieee_interface" >&5 printf "%s\n" "$ac_cv_c_ieee_interface" >&6; } if test "$ac_cv_c_ieee_interface" = "gnux86" ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for FPU_SETCW" >&5 printf %s "checking for FPU_SETCW... " >&6; } if test ${ac_cv_c_fpu_setcw+y} then : printf %s "(cached) " >&6 else $as_nop 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 (void) { 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 $as_nop ac_cv_c_ieee_interface=unknown fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_fpu_setcw" >&5 printf "%s\n" "$ac_cv_c_fpu_setcw" >&6; } fi if test "$ac_cv_c_ieee_interface" = "gnux86" ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SSE extensions" >&5 printf %s "checking for SSE extensions... " >&6; } if test ${ac_cv_c_fpu_sse+y} then : printf %s "(cached) " >&6 else $as_nop 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 (void) { 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 $as_nop ac_cv_c_fpu_sse="no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext else $as_nop 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 (void) { 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 $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_fpu_sse" >&5 printf "%s\n" "$ac_cv_c_fpu_sse" >&6; } if test $ac_cv_c_fpu_sse = yes; then printf "%s\n" "#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 printf "%s\n" "#define $ac_tr_ieee_interface 1" >>confdefs.h save_cflags="$CFLAGS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for IEEE compiler flags" >&5 printf %s "checking for IEEE compiler flags... " >&6; } if test ${ac_cv_c_ieee_flags+y} then : printf %s "(cached) " >&6 else $as_nop 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 (void) { int foo; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_ieee_flags="$ieee_flags" else $as_nop ac_cv_c_ieee_flags="none" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext else ac_cv_c_ieee_flags="none" fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_ieee_flags" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for IEEE comparisons" >&5 printf %s "checking for IEEE comparisons... " >&6; } if test ${ac_cv_c_ieee_comparisons+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : ac_cv_c_ieee_comparisons="yes" else $as_nop 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 $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_ieee_comparisons" >&5 printf "%s\n" "$ac_cv_c_ieee_comparisons" >&6; } if test "$ac_cv_c_ieee_comparisons" != no ; then printf "%s\n" "#define HAVE_IEEE_COMPARISONS 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for IEEE denormalized values" >&5 printf %s "checking for IEEE denormalized values... " >&6; } if test ${ac_cv_c_ieee_denormals+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : ac_cv_c_ieee_denormals="yes" else $as_nop 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 $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_ieee_denormals" >&5 printf "%s\n" "$ac_cv_c_ieee_denormals" >&6; } if test "$ac_cv_c_ieee_denormals" != no ; then printf "%s\n" "#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 bst/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 fft/Makefile filter/Makefile fit/Makefile gsl/Makefile histogram/Makefile ieee-utils/Makefile integration/Makefile interpolation/Makefile linalg/Makefile matrix/Makefile min/Makefile monte/Makefile movstat/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_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$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+y} || &/ 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$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=`printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 printf %s "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 printf "%s\n" "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" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$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 as_nop=: if test ${ZSH_VERSION+y} && (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 $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; 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 # 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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 printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # 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 printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$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_nop 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_nop 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 || printf "%s\n" 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 # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. 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 # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' 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=`printf "%s\n" "$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 || printf "%s\n" 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.7.1, which was generated by GNU Autoconf 2.71. 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 ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ gsl config.status 2.7.1 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" Copyright (C) 2021 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 ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$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=`printf "%s\n" "$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 ) printf "%s\n" "$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 \printf "%s\n" "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 printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" # 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"`' shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $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_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $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"`' lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $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"`' lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $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"`' configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $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_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ lt_cv_nm_interface \ nm_file_list_spec \ lt_cv_truncate_bin \ 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\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) 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 \ configure_time_dlsearch_path \ configure_time_lt_sys_library_path; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' # See if we are running on zsh, and set the options that 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' 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" ;; "bst/Makefile") CONFIG_FILES="$CONFIG_FILES bst/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" ;; "fft/Makefile") CONFIG_FILES="$CONFIG_FILES fft/Makefile" ;; "filter/Makefile") CONFIG_FILES="$CONFIG_FILES filter/Makefile" ;; "fit/Makefile") CONFIG_FILES="$CONFIG_FILES fit/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" ;; "movstat/Makefile") CONFIG_FILES="$CONFIG_FILES movstat/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+y} || CONFIG_FILES=$config_files test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers test ${CONFIG_COMMANDS+y} || 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=`printf "%s\n" "$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 '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$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 || printf "%s\n" 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=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$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@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$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"; } && { printf "%s\n" "$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 printf "%s\n" "$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 { printf "%s\n" "/* $configure_input */" >&1 \ && 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 printf "%s\n" "$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 printf "%s\n" "/* $configure_input */" >&1 \ && 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 || printf "%s\n" 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) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 printf "%s\n" "$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. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in #( *\'*) : eval set x "$CONFIG_FILES" ;; #( *) : set x $CONFIG_FILES ;; #( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE=\"gmake\" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; "libtool":C) # See if we are running on zsh, and set the options that 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 # Generated automatically by $as_me ($PACKAGE) $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. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 # Copyright (C) 2014 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 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 this program. If not, see . # The names of the tagged configurations supported by this script. available_tags='' # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### 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 # Shared archive member basename,for filename based shared library versioning on AIX. shared_archive_member_spec=$shared_archive_member_spec # 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 into a list of symbols to manually relocate. global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import # 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 # The name lister interface. nm_interface=$lt_lt_cv_nm_interface # 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 where our libraries should be installed. lt_sysroot=$lt_sysroot # Command to truncate a binary pipe. lt_truncate_bin=$lt_lt_cv_truncate_bin # 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 # Detected run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path # Explicit LT_SYS_LIBRARY_PATH set during ./configure time. configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # 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 cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # ### END FUNCTIONS SHARED WITH CONFIGURE _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 set != "${COLLECT_NAMES+set}"; 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) 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gsl-2.7.1/configure.ac0000644016036000116100000004646314151557205011536 00000000000000dnl Process this file with autoconf to produce a configure script. AC_INIT([gsl],[2.7.1]) AC_CONFIG_SRCDIR(gsl_math.h) AM_INIT_AUTOMAKE([gnu]) AC_CONFIG_HEADERS([config.h]) AM_MAINTAINER_MODE dnl Library versioning (C:R:A == current:revision:age) dnl See the libtool manual for an explanation of the numbers dnl dnl gsl-1.0 libgsl 0:0:0 libgslcblas 0:0:0 dnl gsl-1.1 libgsl 1:0:1 libgslcblas 0:0:0 dnl gsl-1.1.1 libgsl 2:0:2 libgslcblas 0:0:0 dnl gsl-1.2 libgsl 3:0:3 libgslcblas 0:0:0 dnl gsl-1.3 libgsl 4:0:4 libgslcblas 0:0:0 dnl gsl-1.4 libgsl 5:0:5 libgslcblas 0:0:0 dnl gsl-1.5 libgsl 6:0:6 libgslcblas 0:0:0 dnl gsl-1.6 libgsl 7:0:7 libgslcblas 0:0:0 dnl gsl-1.7 libgsl 8:0:8 libgslcblas 0:0:0 dnl gsl-1.8 libgsl 9:0:9 libgslcblas 0:0:0 dnl gsl-1.9 libgsl 10:0:10 libgslcblas 0:0:0 dnl gsl-1.10 libgsl 10:0:10 (*) libgslcblas 0:0:0 dnl gsl-1.11 libgsl 12:0:12 libgslcblas 0:0:0 dnl gsl-1.12 libgsl 13:0:13 libgslcblas 0:0:0 dnl gsl-1.13 libgsl 14:0:14 libgslcblas 0:0:0 dnl gsl-1.14 libgsl 15:0:15 libgslcblas 0:0:0 dnl gsl-1.15 libgsl 16:0:16 libgslcblas 0:0:0 dnl gsl-1.16 libgsl 17:0:17 libgslcblas 0:0:0 dnl gsl-2.0 libgsl 18:0:18 (**) libgslcblas 0:0:0 dnl gsl-2.1 libgsl 19:0:0 libgslcblas 0:0:0 dnl gsl-2.2 libgsl 20:0:1 libgslcblas 0:0:0 dnl gsl-2.2.1 libgsl 21:0:2 libgslcblas 0:0:0 dnl gsl-2.3 libgsl 22:0:3 libgslcblas 0:0:0 dnl gsl-2.4 libgsl 23:0:0 libgslcblas 0:0:0 dnl gsl-2.5 libgsl 24:0:1 libgslcblas 0:0:0 dnl gsl-2.6 libgsl 25:0:0 libgslcblas 0:0:0 dnl gsl-2.7 libgsl 26:0:1 libgslcblas 0:0:0 (***) dnl gsl-2.7.1 libgsl 27:0:0 libgslcblas 0:0:0 dnl dnl (*) There was an error on this release. Firstly, the versioning dnl numbers were not updated. Secondly, 2 functions were removed, but dnl the age not reset--this should have been 11:0:0. However these dnl functions were not documented and are regarded as internal, so we dnl will assume 11:0:11. dnl dnl (**) There was an error on this release. Age should have been dnl reset to 18:0:0 dnl dnl (***) There was an error on this release. Age should have been dnl reset to 26:0:0 dnl dnl How to update library version number dnl ==================================== dnl dnl C: increment if the interface has additions, changes, removals. dnl dnl R: increment any time the source changes; set to 0 if you dnl incremented CURRENT dnl dnl A: increment if any interfaces have been added; set to 0 if any dnl interfaces have been removed. removal has precedence over adding, dnl so set to 0 if both happened. dnl dnl See https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html dnl for more detailed info dnl GSL_CURRENT=27 GSL_REVISION=0 GSL_AGE=0 dnl CBLAS_CURRENT=0 CBLAS_REVISION=0 CBLAS_AGE=0 GSL_LT_VERSION="${GSL_CURRENT}:${GSL_REVISION}:${GSL_AGE}" AC_SUBST(GSL_LT_VERSION) GSL_LT_CBLAS_VERSION="${CBLAS_CURRENT}:${CBLAS_REVISION}:${CBLAS_AGE}" AC_SUBST(GSL_LT_CBLAS_VERSION) case "$VERSION" in *+) ;; *) AC_DEFINE(RELEASED,[],[Defined if this is an official release]) ;; esac dnl Split VERSION into GSL_VERSION_MAJOR and GSL_VERSION_MINOR dnl Follows AX_SPLIT_VERSION macro from AC-Archive dnl Rhys Ulerich 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) AC_PROG_MKDIR_P 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) AC_CHECK_HEADERS(complex.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 */ #undef GSL_DISABLE_DEPRECATED]) dnl AC_CONFIG_FILES([ \ Makefile \ gsl_version.h \ gsl.spec \ blas/Makefile \ block/Makefile \ bspline/Makefile \ bst/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 \ fft/Makefile \ filter/Makefile \ fit/Makefile \ gsl/Makefile \ histogram/Makefile \ ieee-utils/Makefile \ integration/Makefile \ interpolation/Makefile \ linalg/Makefile \ matrix/Makefile \ min/Makefile \ monte/Makefile \ movstat/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-2.7.1/aclocal.m40000644016036000116100000133206314151557211011100 00000000000000# generated automatically by aclocal 1.16.3 -*- Autoconf -*- # Copyright (C) 1996-2020 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.71],, [m4_warning([this file was generated for autoconf 2.71. 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-2001, 2003-2015 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) 2014 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 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 this program. If not, see . ]) # serial 58 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.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK 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_PREPARE_CC_BASENAME # ----------------------- m4_defun([_LT_PREPARE_CC_BASENAME], [ # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in @S|@*""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } ])# _LT_PREPARE_CC_BASENAME # _LT_CC_BASENAME(CC) # ------------------- # It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, # but that macro is also expanded into generated libtool script, which # arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], [m4_require([_LT_PREPARE_CC_BASENAME])dnl AC_REQUIRE([_LT_DECL_SED])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl func_cc_basename $1 cc_basename=$func_cc_basename_result ]) # _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 m4_require([_LT_CMD_TRUNCATE])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options that 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 set != "${COLLECT_NAMES+set}"; 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\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) 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\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) 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 0 = "$lt_write_fail" && 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 yes = "$silent" && 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 that 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 # Generated automatically by $as_me ($PACKAGE) $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. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 _LT_COPYING _LT_LIBTOOL_TAGS # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE _LT_PREPARE_MUNGE_PATH_LIST _LT_PREPARE_CC_BASENAME # ### END FUNCTIONS SHARED WITH CONFIGURE _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 set != "${COLLECT_NAMES+set}"; 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) 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' 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 0 = "$_lt_result"; 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 0 = "$_lt_result" && $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 yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; 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 no = "$lt_cv_ld_force_load"; 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 yes = "$lt_cv_ld_force_load"; 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*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; 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 yes != "$lt_cv_apple_cc_single_mod"; 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 set = "${lt_cv_aix_libpath+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 that will find a shell with a builtin # printf (that 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], [AS_HELP_STRING([--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 yes = "$GCC"; 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 where 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 no = "$enable_libtool_lock" || 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 what ABI is being produced by ac_compile, and set mode # options accordingly. 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 what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test yes = "$lt_cv_prog_gnu_ld"; 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* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. 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*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; 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" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; 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 yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. 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*|x86_64-*-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 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test no = "$lt_cv_ar_at_file"; 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 bitrig* | 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" ## exclude from sc_useless_quotes_in_assignment # 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 yes = "[$]$2"; 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 yes = "[$]$2"; 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; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # 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" && \ test undefined != "$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 17 != "$i" # 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 yes = "$cross_compiling"; 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 -fvisibility=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 yes != "$enable_dlopen"; 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 ]) ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) 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 no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && 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 yes = "$lt_cv_dlopen_self"; 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 no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; 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 no = "$hard_links"; 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 where 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 yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then # We can hardcode non-existent directories. if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; 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 relink = "$_LT_TAGVAR(hardcode_action, $1)" || test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; 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_PREPARE_MUNGE_PATH_LIST # --------------------------- # Make sure func_munge_path_list() is defined correctly. m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], [[# func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x@S|@2 in x) ;; *:) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" ;; x:*) eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; *::*) eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" ;; *) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; esac } ]])# _LT_PREPARE_PATH_LIST # _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 m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test yes = "$GCC"; 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` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac 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" elif test -n "$lt_multi_os_dir"; then 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 AC_ARG_VAR([LT_SYS_LIBRARY_PATH], [User-defined run-time library search path.]) 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 ia64 = "$host_cpu"; 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 # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # 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' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a[(]lib.so.V[)]' # 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' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac 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%'\''`; $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$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' 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 ;; 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=no 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 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; 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 yes = "$lt_cv_prog_gnu_ld"; 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 ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # 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 dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | 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 # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) 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="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; 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* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi 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 shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec 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' ;; 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 yes = "$with_gnu_ld"; 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=sco 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 yes = "$with_gnu_ld"; 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 no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH _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], [configure_time_dlsearch_path], [2], [Detected run-time system search path for libraries]) _LT_DECL([], [configure_time_lt_sys_library_path], [2], [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program that 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 that 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 no = "$withval" || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test yes = "$GCC"; 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 yes = "$with_gnu_ld"; 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 conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], [if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi]) rm -f conftest.i conftest2.i conftest.out]) ])# _LT_PATH_DD # _LT_CMD_TRUNCATE # ---------------- # find command to truncate a binary pipe m4_defun([_LT_CMD_TRUNCATE], [m4_require([_LT_PATH_DD]) AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], [printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) _LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], [Command to truncate a binary pipe]) ])# _LT_CMD_TRUNCATE # _LT_CHECK_MAGIC_METHOD # ---------------------- # how to check for library dependencies # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_MAGIC_METHOD], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) AC_CACHE_CHECK([how to recognize dependent libraries], lt_cv_deplibs_check_method, [lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that 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. if ( 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 ;; 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 | 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* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; 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 ;; os2*) 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 # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) 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 no != "$lt_cv_path_NM"; 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 -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) 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 one 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 yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # _LT_DLL_DEF_P([FILE]) # --------------------- # True iff FILE is a Windows DLL '.def' file. # Keep in sync with func_dll_def_p in the libtool script AC_DEFUN([_LT_DLL_DEF_P], [dnl test DEF = "`$SED -n dnl -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl -e q dnl Only consider the first "real" line $1`" dnl ])# _LT_DLL_DEF_P # 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 yes = "$GCC"; 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 ia64 = "$host_cpu"; 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 if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # 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"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$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"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/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, # D for any global variable and I for any imported 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};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,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 can'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* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$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 yes = "$pipe_works"; 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_import], [lt_cv_sys_global_symbol_to_import], [1], [Transform the output of nm into a list of symbols to manually relocate]) _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_interface], [lt_cv_nm_interface], [1], [The name lister interface]) _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 yes = "$GXX"; 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 ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; 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']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; 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 ia64 = "$host_cpu"; 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 ia64 != "$host_cpu"; 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 | 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 yes = "$GCC"; 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 ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; 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']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; 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 ia64 = "$host_cpu"; 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 ;; 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' case $cc_basename in 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' ;; esac ;; 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']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; 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 | 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' ;; tcc*) # Fabrice Bellard et al's Tiny 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)='-static' ;; 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 that 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 GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. 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) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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 yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) 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 yes = "$with_gnu_ld"; 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 yes = "$lt_use_gnu_ld_interface"; 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 | $SED -e 's/([^)]\+)\s\+//' 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 ia64 != "$host_cpu"; 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, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); 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 ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $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 linux-dietlibc = "$host_os"; 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 no = "$tmp_diet" 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' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-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 yes = "$supports_anon_versioning"; 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 tcc*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' ;; 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 yes = "$supports_anon_versioning"; 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 cannot *** 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 no = "$_LT_TAGVAR(ld_shlibs, $1)"; 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 yes = "$GCC" && 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 ia64 = "$host_cpu"; 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 GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. 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) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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 # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; 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,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GCC"; 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 yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; 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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; 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 yes = "$with_gnu_ld"; 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 _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' 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,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $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 yes = "$GCC"; 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 "x$output_objdir/$soname" = "x$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 "x$output_objdir/$soname" = "x$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 yes,no = "$GCC,$with_gnu_ld"; 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 no = "$with_gnu_ld"; 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 yes,no = "$GCC,$with_gnu_ld"; 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 no = "$with_gnu_ld"; 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 yes = "$GCC"; 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 yes = "$lt_cv_irix_exported_symbol"; 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 ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; 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* | bitrig*) 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__`"; 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 _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' 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 shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; osf3*) if test yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 sequent = "$host_vendor"; 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 yes = "$GCC"; 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 CANNOT 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 yes = "$GCC"; 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 sni = "$host_vendor"; 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 no = "$_LT_TAGVAR(ld_shlibs, $1)" && 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 yes,yes = "$GCC,$enable_shared"; 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 what 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac 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 yes = "$enable_shared" || 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 no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); 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 yes != "$_lt_caught_CXX_error"; 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 yes = "$GXX"; 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 yes = "$GXX"; 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 yes = "$with_gnu_ld"; 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 ia64 = "$host_cpu"; 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 # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive 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 if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; 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,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GXX"; 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 yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' # 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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; 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 yes = "$with_gnu_ld"; 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 _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' 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,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $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, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); 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) ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; 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 ;; 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 "x$output_objdir/$soname" = "x$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 yes = "$GXX"; 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 "x$output_objdir/$soname" = "x$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 no = "$with_gnu_ld"; 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 yes = "$GXX"; then if test no = "$with_gnu_ld"; 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 yes = "$GXX"; then if test no = "$with_gnu_ld"; 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 | 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 yes = "$supports_anon_versioning"; 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 ;; openbsd* | bitrig*) 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__`"; 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 yes,no = "$GXX,$with_gnu_ld"; 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 yes,no = "$GXX,$with_gnu_ld"; 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 $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 $wl-h $wl$soname -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 $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 $wl-h $wl$soname -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 CANNOT 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 no = "$_LT_TAGVAR(ld_shlibs, $1)" && 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 yes != "$_lt_caught_CXX_error" 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 @S|@2 in .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@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 x-L = "$p" || test x-R = "$p"; 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 no = "$pre_test_object_deps_done"; 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 no = "$pre_test_object_deps_done"; 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)= ;; 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 no = "$F77"; 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 yes != "$_lt_disable_F77"; 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac 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 yes = "$enable_shared" || 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 yes != "$_lt_disable_F77" 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 no = "$FC"; 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 yes != "$_lt_disable_FC"; 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac 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 yes = "$enable_shared" || 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 yes != "$_lt_disable_FC" 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 set = "${GCJFLAGS+set}" || 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 10 -lt "$lt_ac_count" && 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], [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_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine what 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-2009, 2011-2015 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 8 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_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], [_LT_WITH_AIX_SONAME([aix])]) ]) ])# _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_AIX_SONAME([DEFAULT]) # ---------------------------------- # implement the --with-aix-soname flag, and support the `aix-soname=aix' # and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT # is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. m4_define([_LT_WITH_AIX_SONAME], [m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[[5-9]]*,yes) AC_MSG_CHECKING([which variant of shared library versioning to provide]) AC_ARG_WITH([aix-soname], [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], [case $withval in aix|svr4|both) ;; *) AC_MSG_ERROR([Unknown argument to --with-aix-soname]) ;; esac lt_cv_with_aix_soname=$with_aix_soname], [AC_CACHE_VAL([lt_cv_with_aix_soname], [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) with_aix_soname=$lt_cv_with_aix_soname]) AC_MSG_RESULT([$with_aix_soname]) if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac _LT_DECL([], [shared_archive_member_spec], [0], [Shared archive member basename, for filename based shared library versioning on AIX])dnl ])# _LT_WITH_AIX_SONAME LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) # _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=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, 2011-2015 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, 2011-2015 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 4179 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.6]) m4_define([LT_PACKAGE_REVISION], [2.4.6]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.6' macro_revision='2.4.6' _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, 2011-2015 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-2020 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.16' 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.16.3], [], [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.16.3])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-2020 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], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2020 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-2020 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-2020 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. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. AS_CASE([$CONFIG_FILES], [*\'*], [eval set x "$CONFIG_FILES"], [*], [set x $CONFIG_FILES]) shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`AS_DIRNAME(["$am_mf"])` am_filepart=`AS_BASENAME(["$am_mf"])` AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) || am_rc=$? done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE="gmake" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi AS_UNSET([am_dirpart]) AS_UNSET([am_filepart]) AS_UNSET([am_mf]) AS_UNSET([am_rc]) rm -f conftest-deps.mk } ])# _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. # This creates each '.Po' and '.Plo' makefile fragment that we'll 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" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2020 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. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # 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 (and possibly the TAP driver). 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 # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) 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-2020 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+set}" != 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-2020 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-2020 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-2020 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 whether make has an 'include' directive that can support all # the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) AS_CASE([$?:`cat confinc.out 2>/dev/null`], ['0:this is the am__doit target'], [AS_CASE([$s], [BSD], [am__include='.include' am__quote='"'], [am__include='include' am__quote=''])]) if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* AC_MSG_RESULT([${_am_result}]) AC_SUBST([am__include])]) AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2020 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 MISSING="\${SHELL} '$am_aux_dir/missing'" 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-2020 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])]) # Copyright (C) 1999-2020 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_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2020 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_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2020 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-2020 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-2020 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-2020 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-2020 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-2.7.1/templates_on.h0000644016036000116100000001443713373111456012106 00000000000000/* 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-2.7.1/templates_off.h0000644016036000116100000000204113135126237012227 00000000000000#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-2.7.1/build.h0000644016036000116100000000175713373111454010512 00000000000000/* 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-2.7.1/gsl_math.h0000644016036000116100000001037113373111455011202 00000000000000/* 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-2.7.1/gsl_pow_int.h0000644016036000116100000000437513373111455011737 00000000000000/* 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-2.7.1/gsl_nan.h0000644016036000116100000000246713373111455011034 00000000000000/* 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-2.7.1/gsl_machine.h0000644016036000116100000000733513135145630011661 00000000000000/* 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-2.7.1/gsl_mode.h0000644016036000116100000000454513373111455011203 00000000000000/* 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-2.7.1/gsl_precision.h0000644016036000116100000000336413135126237012250 00000000000000/* 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__ */ gsl-2.7.1/gsl_types.h0000644016036000116100000000217513135126237011420 00000000000000/* 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-2.7.1/gsl_version.h0000644016036000116100000000071414151573056011742 00000000000000#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.7.1" #define GSL_MAJOR_VERSION 2 #define GSL_MINOR_VERSION 7 GSL_VAR const char * gsl_version; __END_DECLS #endif /* __GSL_VERSION_H__ */ gsl-2.7.1/gsl_minmax.h0000644016036000116100000000511013373111455011535 00000000000000/* 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-2.7.1/gsl_inline.h0000644016036000116100000000465513532545736011551 00000000000000/* 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-2.7.1/Makefile.in0000644016036000116100000016123014151557213011302 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 = . 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) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" \ "$(DESTDIR)$(bindir)" "$(DESTDIR)$(m4datadir)" \ "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(pkgincludedir)" PROGRAMS = $(bin_PROGRAMS) 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; }; \ } 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 $@ 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/gsl-histogram.Po \ ./$(DEPDIR)/gsl-randist.Po ./$(DEPDIR)/version.Plo 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 distdir-am 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/gsl.spec.in $(srcdir)/gsl_version.h.in AUTHORS \ COPYING ChangeLog INSTALL NEWS README THANKS TODO compile \ config.guess config.sub depcomp install-sh ltmain.sh mdate-sh \ missing mkinstalldirs test-driver 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 # Exists only to be overridden by the user if desired. AM_DISTCHECK_DVI_TARGET = dvi 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 bst 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 filter movstat 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 bst/libgslbst.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 filter/libgslfilter.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 \ movstat/libgslmovstat.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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ 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 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 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-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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsl-randist.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_SCRIPTS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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) | eval GZIP= gzip $(GZIP_ENV) -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-zstd: distdir tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -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*) \ eval GZIP= gzip $(GZIP_ENV) -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*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ *.tar.zst*) \ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(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/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ && $(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 $(PROGRAMS) $(LTLIBRARIES) $(SCRIPTS) $(DATA) \ $(HEADERS) config.h install-binPROGRAMS: install-libLTLIBRARIES installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" "$(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 -f ./$(DEPDIR)/gsl-histogram.Po -rm -f ./$(DEPDIR)/gsl-randist.Po -rm -f ./$(DEPDIR)/version.Plo -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 -f ./$(DEPDIR)/gsl-histogram.Po -rm -f ./$(DEPDIR)/gsl-randist.Po -rm -f ./$(DEPDIR)/version.Plo -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--depfiles 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 dist-zstd 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 .PRECIOUS: Makefile 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-2.7.1/config.h.in0000644016036000116100000002037114001745050011250 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Disable deprecated functions and enums while building */ #undef GSL_DISABLE_DEPRECATED /* Define if you have inline with C99 behavior */ #undef HAVE_C99_INLINE /* Define to 1 if you have the header file. */ #undef HAVE_COMPLEX_H /* 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 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_STDIO_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 where 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 all of the C90 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define to 1 if type `char' is unsigned and your compiler does not predefine this macro. */ #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-2.7.1/gsl.spec.in0000644016036000116100000000510613135126237011301 00000000000000Name: 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-2.7.1/gsl_version.h.in0000644016036000116100000000076413373111455012350 00000000000000#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-2.7.1/AUTHORS0000644016036000116100000000360114151556700010302 00000000000000Mark 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@free.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, linear algebra, 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-2.7.1/COPYING0000644016036000116100000010451313135126236010267 00000000000000 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-2.7.1/ChangeLog0000644016036000116100000007432613373111454011016 000000000000002012-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-2.7.1/INSTALL0000644016036000116100000003661013373111454010267 00000000000000Installation 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 command `./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-2.7.1/NEWS0000644016036000116100000022021214151601503007720 00000000000000* What is new in gsl-2.7.1: ** update libtool version numbers * What was new in gsl-2.7: ** fixed doc bug for gsl_histogram_min_bin (lhcsky at 163.com) ** fixed bug #60335 (spmatrix test failure, J. Lamb) ** fixed bug #36577 ** clarified documentation on interpolation accelerators (V. Krishnan) ** fixed bug #45521 (erroneous GSL_ERROR_NULL in ode-initval2, thanks to M. Sitte) ** fixed doc bug #59758 ** fixed bug #58202 (rstat median for n=5) ** added support for native C complex number types in gsl_complex when using a C11 compiler ** upgraded to autoconf 2.71, automake 1.16.3, libtool 2.4.6 ** updated exponential fitting example for nonlinear least squares ** added banded LU decomposition and solver (gsl_linalg_LU_band) ** New functions added to the library: - gsl_matrix_norm1 - gsl_spmatrix_norm1 - gsl_matrix_complex_conjtrans_memcpy - gsl_linalg_QL: decomp, unpack - gsl_linalg_complex_QR_* (thanks to Christian Krueger) - gsl_vector_sum - gsl_matrix_scale_rows - gsl_matrix_scale_columns - gsl_multilarge_linear_matrix_ptr - gsl_multilarge_linear_rhs_ptr - gsl_spmatrix_dense_add (renamed from gsl_spmatrix_add_to_dense) - gsl_spmatrix_dense_sub - gsl_linalg_cholesky_band: solvem, svxm, scale, scale_apply - gsl_linalg_QR_UD: decomp, lssolve - gsl_linalg_QR_UU: decomp, lssolve, QTvec - gsl_linalg_QR_UZ: decomp - gsl_multifit_linear_lcurvature - gsl_spline2d_eval_extrap ** bug fix in checking vector lengths in gsl_vector_memcpy (dieggsy@pm.me) ** made gsl_sf_legendre_array_index() inline and documented gsl_sf_legendre_nlm() * What was new in gsl-2.6: ** add BLAS calls for the following functions: - gsl_vector_memcpy - gsl_vector_scale - gsl_matrix_memcpy - gsl_matrix_transpose_memcpy - gsl_matrix_tricpy - gsl_matrix_transpose_tricpy ** deprecated functions gsl_linalg_complex_householder_hm and gsl_linalg_complex_householder_mh ** add unit tests for gsl_linalg_symmtd and gsl_linalg_hermtd ** multilarge TSQR algorithm has been converted to use the new Level 3 QR decomposition ** nonlinear least squares Cholesky solver now uses the new Level 3 BLAS method; the old modified Cholesky solver is still available under gsl_multifit_nlinear_solver_mcholesky and gsl_multilarge_nlinear_solver_mcholesky ** implemented Level 3 BLAS versions of several linear algebra routines: - Triangular matrix inversion - Cholesky decomposition and inversion (real and complex) - LU decomposition and inversion (real and complex) - QR decomposition (courtesy of Julien Langou) - Generalized symmetric/hermitian eigensystem reduction to standard form ** removed deprecated function gsl_linalg_hessenberg() ** renamed gsl_interp2d_eval_e_extrap() to gsl_interp2d_eval_extrap_e() to match documentation (reported by D. Lebrun-Grandie) ** renamed some of the gsl_sf_hermite functions to be more consistent with rest of the library, and deprecated old function names ** updated gsl_sf_hermite_func() to use a newer algorithm due to B. Bunck which is more stable for large x; also added gsl_sf_hermite_func_fast() which uses the faster Cauchy integral algorithm in the same paper by Bunck ** add gsl_vector_axpby() ** add un-pivoted LDLT decomposition and its banded variant (gsl_linalg_ldlt_* and gsl_linalg_ldlt_band_*) ** add binary search tree module (gsl_bst); based on GNU libavl ** remove -u flag to gsl-histogram ** updated spmatrix module - added routines and data structures for all types (float,uint,char,...) - added gsl_spmatrix_scale_columns() and gsl_spmatrix_scale_rows() - added gsl_spmatrix_add_to_dense() - more efficient reallocation of COO/triplet matrices (no longer rebuilds binary tree) - enhanced test suite - added gsl_spmatrix_min_index() ** add routines for banded Cholesky decomposition (gsl_linalg_cholesky_band_*) ** documented gsl_linalg_LQ routines and added gsl_linalg_LQ_lssolve() * What was new in gsl-2.5: ** doc bug fix in binomial distribution figure (Damien Desfontaines) ** added Wishart distribution (Timothée Flutre) ** added new module for digital filtering (gsl_filter); current filters include: Gaussian filter median filter recursive median filter impulse detection filter ** added new module for moving window statistics (gsl_movstat) ** added statistics functions: gsl_stats_median() gsl_stats_select() gsl_stats_mad() gsl_stats_mad0() gsl_stats_Sn_from_sorted_data() gsl_stats_Qn_from_sorted_data() gsl_stats_gastwirth_from_sorted_data() gsl_stats_trmean_from_sorted_data() ** added Romberg integration (gsl_integration_romberg) ** bug fix in deprecated functions gsl_multifit_wlinear_svd and gsl_multifit_wlinear_usvd (reported by Vlad Koli) ** documentation corrected to state that gsl_sf_legendre functions do not include Condon-Shortley phase by default ** bug fix in exponential fitting example when using larger number of points (reported by Anna Russo) ** changed internal workspace inside gsl_spmatrix to a union to avoid casting (suggested by Manuel Schmitz) ** bug fixes in ode-initval2 for very rare solver crashing cases: #52230 in msadams (reported by Michael Kaufman) and #52336 in msbdf (reported by Andrew Benson). As a fix, the maximum scaling of controlled step length was decreased from 5.0 to 4.9. ** add histogram2d figure to manual (was missing in 2.4) ** bug fix in gsl_spmatrix_add for duplicate input arguments (reported by Alfredo Correa) ** add support for negative arguments nu in gsl_sf_bessel_Jnu and gsl_sf_bessel_Ynu (Konrad Griessinger) ** better texinfo documentation for gsl_sf_hyperg functions ** fix vector and matrix fread/fwrite testing on windows systems when tmpfile() fails ** fix for rstat/test.c on PPC64 (reported by Adam Majer) * What was new in gsl-2.4: ** migrated documentation to Sphinx software, which has built-in support for latex equations and figures in HTML output ** add const to declaration of appropriate gsl_rstat routines ** bug fix for #45730: change gsl_sf_sin/cos to libm sin/cos ** fix Cholesky documentation regarding upper triangle on output ** added routines to compute integrals with fixed-point quadrature, based on IQPACK (Konrad Griessinger) ** added routines for Hermite polynomials, gsl_sf_hermite_* (Konrad Griessinger) ** added new nonlinear least squares example for fitting a Gaussian to data ** deprecated routines: gsl_sf_coupling_6j_INCORRECT gsl_sf_coupling_6j_INCORRECT_e ** deprecated routine 'gsl_linalg_hessenberg' (replaced by gsl_linalg_hessenberg_decomp) ** removed routines which were deprecated in v2.1: gsl_bspline_deriv_alloc gsl_bspline_deriv_free ** changed COD expression to Q R Z^T instead of Q R Z to be consistent with standard texts ** added check for nz == 0 in gsl_spmatrix_get (reported by Manuel Schmitz) ** permit zero-dimension blocks, vectors, matrics, subvectors, submatrices, and views of the above (bug #49988) ** added routine gsl_linalg_COD_lssolve2 for regularized least squares problems * What was 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-2.7.1/README0000644016036000116100000000501413373111454010110 00000000000000GSL - 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-2.7.1/THANKS0000644016036000116100000004163313373111454010152 00000000000000* 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-2.7.1/TODO0000644016036000116100000001730513373111454007726 00000000000000# -*- 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-2.7.1/compile0000755016036000116100000001635014001452707010611 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2020 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute 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 # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN* | MSYS*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/* | msys/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gsl-2.7.1/config.guess0000755016036000116100000013036113135126273011555 00000000000000#! /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-2.7.1/config.sub0000755016036000116100000010531513135126273011221 00000000000000#! /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-2.7.1/depcomp0000755016036000116100000005601613135126273010616 00000000000000#! /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-2.7.1/install-sh0000755016036000116100000003325513373111455011245 00000000000000#!/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-2.7.1/ltmain.sh0000644016036000116100000117077114001452706011063 00000000000000#! /bin/sh ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in ## by inline-source v2014-01-03.01 # libtool (GNU libtool) 2.4.6 # Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996-2015 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 this program. If not, see . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.6 package_revision=2.4.6 ## ------ ## ## Usage. ## ## ------ ## # Run './libtool --help' for help with using this script from the # command line. ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # After configure completes, it has a better idea of some of the # shell tools we need than the defaults used by the functions shared # with bootstrap, so set those here where they can still be over- # ridden by the user, but otherwise take precedence. : ${AUTOCONF="autoconf"} : ${AUTOMAKE="automake"} ## -------------------------- ## ## Source external libraries. ## ## -------------------------- ## # Much of our low-level functionality needs to be sourced from external # libraries, which are installed to $pkgauxdir. # Set a version string for this script. scriptversion=2015-01-20.17; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 # Copyright (C) 2004-2015 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. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 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. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU # 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 . # Please report bugs or propose patches to gary@gnu.org. ## ------ ## ## Usage. ## ## ------ ## # Evaluate this file near the top of your script to gain access to # the functions and variables defined here: # # . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh # # If you need to override any of the default environment variable # settings, do that before evaluating this file. ## -------------------- ## ## Shell normalisation. ## ## -------------------- ## # Some shells need a little help to be as Bourne compatible as possible. # Before doing anything else, make sure all that help has been provided! 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 # NLS nuisances: We save the old values in case they are required later. _G_user_locale= _G_safe_locale= for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test set = \"\${$_G_var+set}\"; then save_$_G_var=\$$_G_var $_G_var=C export $_G_var _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" fi" done # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Make sure IFS has a sensible default sp=' ' nl=' ' IFS="$sp $nl" # There are apparently some retarded systems that use ';' as a PATH separator! 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 ## ------------------------- ## ## Locate command utilities. ## ## ------------------------- ## # func_executable_p FILE # ---------------------- # Check that FILE is an executable regular file. func_executable_p () { test -f "$1" && test -x "$1" } # func_path_progs PROGS_LIST CHECK_FUNC [PATH] # -------------------------------------------- # Search for either a program that responds to --version with output # containing "GNU", or else returned by CHECK_FUNC otherwise, by # trying all the directories in PATH with each of the elements of # PROGS_LIST. # # CHECK_FUNC should accept the path to a candidate program, and # set $func_check_prog_result if it truncates its output less than # $_G_path_prog_max characters. func_path_progs () { _G_progs_list=$1 _G_check_func=$2 _G_PATH=${3-"$PATH"} _G_path_prog_max=0 _G_path_prog_found=false _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} for _G_dir in $_G_PATH; do IFS=$_G_save_IFS test -z "$_G_dir" && _G_dir=. for _G_prog_name in $_G_progs_list; do for _exeext in '' .EXE; do _G_path_prog=$_G_dir/$_G_prog_name$_exeext func_executable_p "$_G_path_prog" || continue case `"$_G_path_prog" --version 2>&1` in *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; *) $_G_check_func $_G_path_prog func_path_progs_result=$func_check_prog_result ;; esac $_G_path_prog_found && break 3 done done done IFS=$_G_save_IFS test -z "$func_path_progs_result" && { echo "no acceptable sed could be found in \$PATH" >&2 exit 1 } } # We want to be able to use the functions in this file before configure # has figured out where the best binaries are kept, which means we have # to search for them ourselves - except when the results are already set # where we skip the searches. # Unless the user overrides by setting SED, search the path for either GNU # sed, or the sed that truncates its output the least. test -z "$SED" && { _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for _G_i in 1 2 3 4 5 6 7; do _G_sed_script=$_G_sed_script$nl$_G_sed_script done echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed _G_sed_script= func_check_prog_sed () { _G_path_prog=$1 _G_count=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo '' >> conftest.nl "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin rm -f conftest.sed SED=$func_path_progs_result } # Unless the user overrides by setting GREP, search the path for either GNU # grep, or the grep that truncates its output the least. test -z "$GREP" && { func_check_prog_grep () { _G_path_prog=$1 _G_count=0 _G_path_prog_max=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo 'GREP' >> conftest.nl "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin GREP=$func_path_progs_result } ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # All uppercase variable names are used for environment variables. These # variables can be overridden by the user before calling a script that # uses them if a suitable command of that name is not already available # in the command search PATH. : ${CP="cp -f"} : ${ECHO="printf %s\n"} : ${EGREP="$GREP -E"} : ${FGREP="$GREP -F"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} ## -------------------- ## ## Useful sed snippets. ## ## -------------------- ## sed_dirname='s|/[^/]*$||' sed_basename='s|^.*/||' # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s|\([`"$\\]\)|\\\1|g' # Same as above, but do not quote variable references. sed_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 # that contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-'\' parameter expansions in output of sed_double_quote_subst that # were '\'-ed in input to the same. If an odd number of '\' preceded a # '$' in input to sed_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 '$'. _G_bs='\\' _G_bs2='\\\\' _G_bs4='\\\\\\\\' _G_dollar='\$' sed_double_backslash="\ s/$_G_bs4/&\\ /g s/^$_G_bs2$_G_dollar/$_G_bs&/ s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g s/\n//g" ## ----------------- ## ## Global variables. ## ## ----------------- ## # Except for the global variables explicitly listed below, the following # functions in the '^func_' namespace, and the '^require_' namespace # variables initialised in the 'Resource management' section, sourcing # this file will not pollute your global namespace with anything # else. There's no portable way to scope variables in Bourne shell # though, so actually running these functions will sometimes place # results into a variable named after the function, and often use # temporary variables in the '^_G_' namespace. If you are careful to # avoid using those namespaces casually in your sourcing script, things # should continue to work as you expect. And, of course, you can freely # overwrite any of the functions or variables defined here before # calling anything to customize them. 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. # Allow overriding, eg assuming that you follow the convention of # putting '$debug_cmd' at the start of all your functions, you can get # bash to show function call trace with: # # debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name debug_cmd=${debug_cmd-":"} exit_cmd=: # By convention, finish your script with: # # exit $exit_status # # so that you can set exit_status to non-zero if you want to indicate # something went wrong during execution without actually bailing out at # the point of failure. exit_status=$EXIT_SUCCESS # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath=$0 # The name of this program. progname=`$ECHO "$progpath" |$SED "$sed_basename"` # Make sure we have an absolute progpath for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` progdir=`cd "$progdir" && pwd` progpath=$progdir/$progname ;; *) _G_IFS=$IFS IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS=$_G_IFS test -x "$progdir/$progname" && break done IFS=$_G_IFS test -n "$progdir" || progdir=`pwd` progpath=$progdir/$progname ;; esac ## ----------------- ## ## Standard options. ## ## ----------------- ## # The following options affect the operation of the functions defined # below, and should be set appropriately depending on run-time para- # meters passed on the command line. opt_dry_run=false opt_quiet=false opt_verbose=false # Categories 'all' and 'none' are always available. Append any others # you will pass as the first argument to func_warning from your own # code. warning_categories= # By default, display warnings according to 'opt_warning_types'. Set # 'warning_func' to ':' to elide all warnings, or func_fatal_error to # treat the next displayed warning as a fatal error. warning_func=func_warn_and_continue # Set to 'all' to display all warnings, 'none' to suppress all # warnings, or a space delimited list of some subset of # 'warning_categories' to display only the listed warnings. opt_warning_types=all ## -------------------- ## ## Resource management. ## ## -------------------- ## # This section contains definitions for functions that each ensure a # particular resource (a file, or a non-empty configuration variable for # example) is available, and if appropriate to extract default values # from pertinent package files. Call them using their associated # 'require_*' variable to ensure that they are executed, at most, once. # # It's entirely deliberate that calling these functions can set # variables that don't obey the namespace limitations obeyed by the rest # of this file, in order that that they be as useful as possible to # callers. # require_term_colors # ------------------- # Allow display of bold text on terminals that support it. require_term_colors=func_require_term_colors func_require_term_colors () { $debug_cmd test -t 1 && { # COLORTERM and USE_ANSI_COLORS environment variables take # precedence, because most terminfo databases neglect to describe # whether color sequences are supported. test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} if test 1 = "$USE_ANSI_COLORS"; then # Standard ANSI escape sequences tc_reset='' tc_bold=''; tc_standout='' tc_red=''; tc_green='' tc_blue=''; tc_cyan='' else # Otherwise trust the terminfo database after all. test -n "`tput sgr0 2>/dev/null`" && { tc_reset=`tput sgr0` test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` tc_standout=$tc_bold test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` } fi } require_term_colors=: } ## ----------------- ## ## Function library. ## ## ----------------- ## # This section contains a variety of useful functions to call in your # scripts. Take note of the portable wrappers for features provided by # some modern shells, which will fall back to slower equivalents on # less featureful shells. # func_append VAR VALUE # --------------------- # Append VALUE onto the existing contents of VAR. # We should try to minimise forks, especially on Windows where they are # unreasonably slow, so skip the feature probes when bash or zsh are # being used: if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then : ${_G_HAVE_ARITH_OP="yes"} : ${_G_HAVE_XSI_OPS="yes"} # The += operator was introduced in bash 3.1 case $BASH_VERSION in [12].* | 3.0 | 3.0*) ;; *) : ${_G_HAVE_PLUSEQ_OP="yes"} ;; esac fi # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is # useable or anything else if it does not work. test -z "$_G_HAVE_PLUSEQ_OP" \ && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ && _G_HAVE_PLUSEQ_OP=yes if test yes = "$_G_HAVE_PLUSEQ_OP" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_append () { $debug_cmd eval "$1+=\$2" }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_append () { $debug_cmd eval "$1=\$$1\$2" } fi # func_append_quoted VAR VALUE # ---------------------------- # Quote VALUE and append to the end of shell variable VAR, separated # by a space. if test yes = "$_G_HAVE_PLUSEQ_OP"; then eval 'func_append_quoted () { $debug_cmd func_quote_for_eval "$2" eval "$1+=\\ \$func_quote_for_eval_result" }' else func_append_quoted () { $debug_cmd func_quote_for_eval "$2" eval "$1=\$$1\\ \$func_quote_for_eval_result" } fi # func_append_uniq VAR VALUE # -------------------------- # Append unique VALUE onto the existing contents of VAR, assuming # entries are delimited by the first character of VALUE. For example: # # func_append_uniq options " --another-option option-argument" # # will only append to $options if " --another-option option-argument " # is not already present somewhere in $options already (note spaces at # each end implied by leading space in second argument). func_append_uniq () { $debug_cmd eval _G_current_value='`$ECHO $'$1'`' _G_delim=`expr "$2" : '\(.\)'` case $_G_delim$_G_current_value$_G_delim in *"$2$_G_delim"*) ;; *) func_append "$@" ;; esac } # func_arith TERM... # ------------------ # Set func_arith_result to the result of evaluating TERMs. test -z "$_G_HAVE_ARITH_OP" \ && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ && _G_HAVE_ARITH_OP=yes if test yes = "$_G_HAVE_ARITH_OP"; then eval 'func_arith () { $debug_cmd func_arith_result=$(( $* )) }' else func_arith () { $debug_cmd func_arith_result=`expr "$@"` } fi # func_basename FILE # ------------------ # Set func_basename_result to FILE with everything up to and including # the last / stripped. if test yes = "$_G_HAVE_XSI_OPS"; then # If this shell supports suffix pattern removal, then use it to avoid # forking. Hide the definitions single quotes in case the shell chokes # on unsupported syntax... _b='func_basename_result=${1##*/}' _d='case $1 in */*) func_dirname_result=${1%/*}$2 ;; * ) func_dirname_result=$3 ;; esac' else # ...otherwise fall back to using sed. _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` if test "X$func_dirname_result" = "X$1"; then func_dirname_result=$3 else func_append func_dirname_result "$2" fi' fi eval 'func_basename () { $debug_cmd '"$_b"' }' # func_dirname FILE APPEND NONDIR_REPLACEMENT # ------------------------------------------- # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. eval 'func_dirname () { $debug_cmd '"$_d"' }' # 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" # For efficiency, we do not delegate to the functions above but instead # duplicate the functionality here. eval 'func_dirname_and_basename () { $debug_cmd '"$_b"' '"$_d"' }' # func_echo ARG... # ---------------- # Echo program name prefixed message. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname: $_G_line" done IFS=$func_echo_IFS } # func_echo_all ARG... # -------------------- # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_echo_infix_1 INFIX ARG... # ------------------------------ # Echo program name, followed by INFIX on the first line, with any # additional lines not showing INFIX. func_echo_infix_1 () { $debug_cmd $require_term_colors _G_infix=$1; shift _G_indent=$_G_infix _G_prefix="$progname: $_G_infix: " _G_message=$* # Strip color escape sequences before counting printable length for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" do test -n "$_G_tc" && { _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` } done _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes func_echo_infix_1_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_infix_1_IFS $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 _G_prefix=$_G_indent done IFS=$func_echo_infix_1_IFS } # func_error ARG... # ----------------- # Echo program name prefixed message to standard error. func_error () { $debug_cmd $require_term_colors func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 } # func_fatal_error ARG... # ----------------------- # Echo program name prefixed message to standard error, and exit. func_fatal_error () { $debug_cmd func_error "$*" exit $EXIT_FAILURE } # func_grep EXPRESSION FILENAME # ----------------------------- # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $debug_cmd $GREP "$1" "$2" >/dev/null 2>&1 } # func_len STRING # --------------- # Set func_len_result to the length of STRING. STRING may not # start with a hyphen. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_len () { $debug_cmd func_len_result=${#1} }' else func_len () { $debug_cmd func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } fi # func_mkdir_p DIRECTORY-PATH # --------------------------- # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { $debug_cmd _G_directory_path=$1 _G_dir_list= if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then # Protect directory names starting with '-' case $_G_directory_path in -*) _G_directory_path=./$_G_directory_path ;; esac # While some portion of DIR does not yet exist... while test ! -d "$_G_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. _G_dir_list=$_G_directory_path:$_G_dir_list # If the last portion added has no slash in it, the list is done case $_G_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` done _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` func_mkdir_p_IFS=$IFS; IFS=: for _G_dir in $_G_dir_list; do IFS=$func_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 "$_G_dir" 2>/dev/null || : done IFS=$func_mkdir_p_IFS # Bail out if we (or some other process) failed to create a directory. test -d "$_G_directory_path" || \ func_fatal_error "Failed to create '$1'" fi } # func_mktempdir [BASENAME] # ------------------------- # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, BASENAME is the basename for that directory. func_mktempdir () { $debug_cmd _G_template=${TMPDIR-/tmp}/${1-$progname} if test : = "$opt_dry_run"; then # Return a directory name, but don't create it in dry-run mode _G_tmpdir=$_G_template-$$ else # If mktemp works, use that first and foremost _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` if test ! -d "$_G_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race _G_tmpdir=$_G_template-${RANDOM-0}$$ func_mktempdir_umask=`umask` umask 0077 $MKDIR "$_G_tmpdir" umask $func_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$_G_tmpdir" || \ func_fatal_error "cannot create temporary directory '$_G_tmpdir'" fi $ECHO "$_G_tmpdir" } # 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. func_normal_abspath () { $debug_cmd # These SED scripts presuppose an absolute path with a trailing slash. _G_pathcar='s|^/\([^/]*\).*$|\1|' _G_pathcdr='s|^/[^/]*||' _G_removedotparts=':dotsl s|/\./|/|g t dotsl s|/\.$|/|' _G_collapseslashes='s|/\{1,\}|/|g' _G_finalslash='s|/*$|/|' # 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 "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_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 "$_G_pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_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_append 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_notquiet ARG... # -------------------- # Echo program name prefixed message only when not in quiet mode. func_notquiet () { $debug_cmd $opt_quiet || 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_relative_path SRCDIR DSTDIR # -------------------------------- # Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. func_relative_path () { $debug_cmd 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 -z "$func_relative_path_tlibdir"; 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 -n "$func_stripname_result"; then func_append func_relative_path_result "/$func_stripname_result" fi # Normalisation. If bindir is libdir, return '.' else relative path. if test -n "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result" func_relative_path_result=$func_stripname_result fi test -n "$func_relative_path_result" || func_relative_path_result=. : } # func_quote_for_eval ARG... # -------------------------- # Aesthetically quote ARGs to be evaled later. # This function returns two values: # i) func_quote_for_eval_result # double-quoted, suitable for a subsequent eval # ii) func_quote_for_eval_unquoted_result # has all characters that are still active within double # quotes backslashified. func_quote_for_eval () { $debug_cmd func_quote_for_eval_unquoted_result= func_quote_for_eval_result= while test 0 -lt $#; do case $1 in *[\\\`\"\$]*) _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; *) _G_unquoted_arg=$1 ;; esac if test -n "$func_quote_for_eval_unquoted_result"; then func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" else func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" fi case $_G_unquoted_arg in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and variable expansion # for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") _G_quoted_arg=\"$_G_unquoted_arg\" ;; *) _G_quoted_arg=$_G_unquoted_arg ;; esac if test -n "$func_quote_for_eval_result"; then func_append func_quote_for_eval_result " $_G_quoted_arg" else func_append func_quote_for_eval_result "$_G_quoted_arg" fi shift done } # 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 () { $debug_cmd case $1 in *[\\\`\"]*) _G_arg=`$ECHO "$1" | $SED \ -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; *) _G_arg=$1 ;; esac case $_G_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. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") _G_arg=\"$_G_arg\" ;; esac func_quote_for_expand_result=$_G_arg } # func_stripname PREFIX SUFFIX NAME # --------------------------------- # strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. # 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). if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_stripname () { $debug_cmd # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary variable first. func_stripname_result=$3 func_stripname_result=${func_stripname_result#"$1"} func_stripname_result=${func_stripname_result%"$2"} }' else func_stripname () { $debug_cmd case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; esac } fi # func_show_eval CMD [FAIL_EXP] # ----------------------------- # Unless opt_quiet 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 () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} func_quote_for_expand "$_G_cmd" eval "func_notquiet $func_quote_for_expand_result" $opt_dry_run || { eval "$_G_cmd" _G_status=$? if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_show_eval_locale CMD [FAIL_EXP] # ------------------------------------ # Unless opt_quiet 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 () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} $opt_quiet || { func_quote_for_expand "$_G_cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || { eval "$_G_user_locale $_G_cmd" _G_status=$? eval "$_G_safe_locale" if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" 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 () { $debug_cmd case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_verbose ARG... # ------------------- # Echo program name prefixed message in verbose mode only. func_verbose () { $debug_cmd $opt_verbose && func_echo "$*" : } # func_warn_and_continue ARG... # ----------------------------- # Echo program name prefixed warning message to standard error. func_warn_and_continue () { $debug_cmd $require_term_colors func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 } # func_warning CATEGORY ARG... # ---------------------------- # Echo program name prefixed warning message to standard error. Warning # messages can be filtered according to CATEGORY, where this function # elides messages where CATEGORY is not listed in the global variable # 'opt_warning_types'. func_warning () { $debug_cmd # CATEGORY must be in the warning_categories list! case " $warning_categories " in *" $1 "*) ;; *) func_internal_error "invalid warning category '$1'" ;; esac _G_category=$1 shift case " $opt_warning_types " in *" $_G_category "*) $warning_func ${1+"$@"} ;; esac } # func_sort_ver VER1 VER2 # ----------------------- # 'sort -V' is not generally available. # Note this deviates from the version comparison in automake # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a # but this should suffice as we won't be specifying old # version formats or redundant trailing .0 in bootstrap.conf. # If we did want full compatibility then we should probably # use m4_version_compare from autoconf. func_sort_ver () { $debug_cmd printf '%s\n%s\n' "$1" "$2" \ | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n } # func_lt_ver PREV CURR # --------------------- # Return true if PREV and CURR are in the correct order according to # func_sort_ver, otherwise false. Use it like this: # # func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." func_lt_ver () { $debug_cmd test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: #! /bin/sh # Set a version string for this script. scriptversion=2014-01-07.03; # UTC # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 # Copyright (C) 2010-2015 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. # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU 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 . # Please report bugs or propose patches to gary@gnu.org. ## ------ ## ## Usage. ## ## ------ ## # This file is a library for parsing options in your shell scripts along # with assorted other useful supporting features that you can make use # of too. # # For the simplest scripts you might need only: # # #!/bin/sh # . relative/path/to/funclib.sh # . relative/path/to/options-parser # scriptversion=1.0 # func_options ${1+"$@"} # eval set dummy "$func_options_result"; shift # ...rest of your script... # # In order for the '--version' option to work, you will need to have a # suitably formatted comment like the one at the top of this file # starting with '# Written by ' and ending with '# warranty; '. # # For '-h' and '--help' to work, you will also need a one line # description of your script's purpose in a comment directly above the # '# Written by ' line, like the one at the top of this file. # # The default options also support '--debug', which will turn on shell # execution tracing (see the comment above debug_cmd below for another # use), and '--verbose' and the func_verbose function to allow your script # to display verbose messages only when your user has specified # '--verbose'. # # After sourcing this file, you can plug processing for additional # options by amending the variables from the 'Configuration' section # below, and following the instructions in the 'Option parsing' # section further down. ## -------------- ## ## Configuration. ## ## -------------- ## # You should override these variables in your script after sourcing this # file so that they reflect the customisations you have added to the # option parser. # The usage line for option parsing errors and the start of '-h' and # '--help' output messages. You can embed shell variables for delayed # expansion at the time the message is displayed, but you will need to # quote other shell meta-characters carefully to prevent them being # expanded when the contents are evaled. usage='$progpath [OPTION]...' # Short help message in response to '-h' and '--help'. Add to this or # override it after sourcing this library to reflect the full set of # options your script accepts. usage_message="\ --debug enable verbose shell tracing -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -v, --verbose verbosely report processing --version print version information and exit -h, --help print short or long help message and exit " # Additional text appended to 'usage_message' in response to '--help'. long_help_message=" Warning categories include: 'all' show all warnings 'none' turn off all the warnings 'error' warnings are treated as fatal errors" # Help message printed before fatal option parsing errors. fatal_help="Try '\$progname --help' for more information." ## ------------------------- ## ## Hook function management. ## ## ------------------------- ## # This section contains functions for adding, removing, and running hooks # to the main code. A hook is just a named list of of function, that can # be run in order later on. # func_hookable FUNC_NAME # ----------------------- # Declare that FUNC_NAME will run hooks added with # 'func_add_hook FUNC_NAME ...'. func_hookable () { $debug_cmd func_append hookable_fns " $1" } # func_add_hook FUNC_NAME HOOK_FUNC # --------------------------------- # Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must # first have been declared "hookable" by a call to 'func_hookable'. func_add_hook () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not accept hook functions." ;; esac eval func_append ${1}_hooks '" $2"' } # func_remove_hook FUNC_NAME HOOK_FUNC # ------------------------------------ # Remove HOOK_FUNC from the list of functions called by FUNC_NAME. func_remove_hook () { $debug_cmd eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' } # func_run_hooks FUNC_NAME [ARG]... # --------------------------------- # Run all hook functions registered to FUNC_NAME. # It is assumed that the list of hook functions contains nothing more # than a whitespace-delimited list of legal shell function names, and # no effort is wasted trying to catch shell meta-characters or preserve # whitespace. func_run_hooks () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not support hook funcions.n" ;; esac eval _G_hook_fns=\$$1_hooks; shift for _G_hook in $_G_hook_fns; do eval $_G_hook '"$@"' # store returned options list back into positional # parameters for next 'cmd' execution. eval _G_hook_result=\$${_G_hook}_result eval set dummy "$_G_hook_result"; shift done func_quote_for_eval ${1+"$@"} func_run_hooks_result=$func_quote_for_eval_result } ## --------------- ## ## Option parsing. ## ## --------------- ## # In order to add your own option parsing hooks, you must accept the # full positional parameter list in your hook function, remove any # options that you action, and then pass back the remaining unprocessed # options in '_result', escaped suitably for # 'eval'. Like this: # # my_options_prep () # { # $debug_cmd # # # Extend the existing usage message. # usage_message=$usage_message' # -s, --silent don'\''t print informational messages # ' # # func_quote_for_eval ${1+"$@"} # my_options_prep_result=$func_quote_for_eval_result # } # func_add_hook func_options_prep my_options_prep # # # my_silent_option () # { # $debug_cmd # # # Note that for efficiency, we parse as many options as we can # # recognise in a loop before passing the remainder back to the # # caller on the first unrecognised argument we encounter. # while test $# -gt 0; do # opt=$1; shift # case $opt in # --silent|-s) opt_silent=: ;; # # Separate non-argument short options: # -s*) func_split_short_opt "$_G_opt" # set dummy "$func_split_short_opt_name" \ # "-$func_split_short_opt_arg" ${1+"$@"} # shift # ;; # *) set dummy "$_G_opt" "$*"; shift; break ;; # esac # done # # func_quote_for_eval ${1+"$@"} # my_silent_option_result=$func_quote_for_eval_result # } # func_add_hook func_parse_options my_silent_option # # # my_option_validation () # { # $debug_cmd # # $opt_silent && $opt_verbose && func_fatal_help "\ # '--silent' and '--verbose' options are mutually exclusive." # # func_quote_for_eval ${1+"$@"} # my_option_validation_result=$func_quote_for_eval_result # } # func_add_hook func_validate_options my_option_validation # # You'll alse need to manually amend $usage_message to reflect the extra # options you parse. It's preferable to append if you can, so that # multiple option parsing hooks can be added safely. # func_options [ARG]... # --------------------- # All the functions called inside func_options are hookable. See the # individual implementations for details. func_hookable func_options func_options () { $debug_cmd func_options_prep ${1+"$@"} eval func_parse_options \ ${func_options_prep_result+"$func_options_prep_result"} eval func_validate_options \ ${func_parse_options_result+"$func_parse_options_result"} eval func_run_hooks func_options \ ${func_validate_options_result+"$func_validate_options_result"} # save modified positional parameters for caller func_options_result=$func_run_hooks_result } # func_options_prep [ARG]... # -------------------------- # All initialisations required before starting the option parse loop. # Note that when calling hook functions, we pass through the list of # positional parameters. If a hook function modifies that list, and # needs to propogate that back to rest of this script, then the complete # modified list must be put in 'func_run_hooks_result' before # returning. func_hookable func_options_prep func_options_prep () { $debug_cmd # Option defaults: opt_verbose=false opt_warning_types= func_run_hooks func_options_prep ${1+"$@"} # save modified positional parameters for caller func_options_prep_result=$func_run_hooks_result } # func_parse_options [ARG]... # --------------------------- # The main option parsing loop. func_hookable func_parse_options func_parse_options () { $debug_cmd func_parse_options_result= # this just eases exit handling while test $# -gt 0; do # Defer to hook functions for initial option parsing, so they # get priority in the event of reusing an option name. func_run_hooks func_parse_options ${1+"$@"} # Adjust func_parse_options positional parameters to match eval set dummy "$func_run_hooks_result"; shift # Break out of the loop if we already parsed every option. test $# -gt 0 || break _G_opt=$1 shift case $_G_opt in --debug|-x) debug_cmd='set -x' func_echo "enabling shell trace mode" $debug_cmd ;; --no-warnings|--no-warning|--no-warn) set dummy --warnings none ${1+"$@"} shift ;; --warnings|--warning|-W) test $# = 0 && func_missing_arg $_G_opt && break case " $warning_categories $1" in *" $1 "*) # trailing space prevents matching last $1 above func_append_uniq opt_warning_types " $1" ;; *all) opt_warning_types=$warning_categories ;; *none) opt_warning_types=none warning_func=: ;; *error) opt_warning_types=$warning_categories warning_func=func_fatal_error ;; *) func_fatal_error \ "unsupported warning category: '$1'" ;; esac shift ;; --verbose|-v) opt_verbose=: ;; --version) func_version ;; -\?|-h) func_usage ;; --help) func_help ;; # Separate optargs to long options (plugins may need this): --*=*) func_split_equals "$_G_opt" set dummy "$func_split_equals_lhs" \ "$func_split_equals_rhs" ${1+"$@"} shift ;; # Separate optargs to short options: -W*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "$func_split_short_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-v*|-x*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; esac done # save modified positional parameters for caller func_quote_for_eval ${1+"$@"} func_parse_options_result=$func_quote_for_eval_result } # func_validate_options [ARG]... # ------------------------------ # Perform any sanity checks on option settings and/or unconsumed # arguments. func_hookable func_validate_options func_validate_options () { $debug_cmd # Display all warnings if -W was not given. test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" func_run_hooks func_validate_options ${1+"$@"} # Bail if the options were screwed! $exit_cmd $EXIT_FAILURE # save modified positional parameters for caller func_validate_options_result=$func_run_hooks_result } ## ----------------- ## ## Helper functions. ## ## ----------------- ## # This section contains the helper functions used by the rest of the # hookable option parser framework in ascii-betical order. # func_fatal_help ARG... # ---------------------- # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { $debug_cmd eval \$ECHO \""Usage: $usage"\" eval \$ECHO \""$fatal_help"\" func_error ${1+"$@"} exit $EXIT_FAILURE } # func_help # --------- # Echo long help message to standard output and exit. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message" exit 0 } # func_missing_arg ARGNAME # ------------------------ # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $debug_cmd func_error "Missing argument for '$1'." exit_cmd=exit } # func_split_equals STRING # ------------------------ # Set func_split_equals_lhs and func_split_equals_rhs shell variables after # splitting STRING at the '=' sign. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_equals () { $debug_cmd func_split_equals_lhs=${1%%=*} func_split_equals_rhs=${1#*=} test "x$func_split_equals_lhs" = "x$1" \ && func_split_equals_rhs= }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_equals () { $debug_cmd func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` func_split_equals_rhs= test "x$func_split_equals_lhs" = "x$1" \ || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` } fi #func_split_equals # 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. if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_short_opt () { $debug_cmd func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"} }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_short_opt () { $debug_cmd func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` } fi #func_split_short_opt # func_usage # ---------- # Echo short help message to standard output and exit. func_usage () { $debug_cmd func_usage_message $ECHO "Run '$progname --help |${PAGER-more}' for full usage" exit 0 } # func_usage_message # ------------------ # Echo short help message to standard output. func_usage_message () { $debug_cmd eval \$ECHO \""Usage: $usage"\" echo $SED -n 's|^# || /^Written by/{ x;p;x } h /^Written by/q' < "$progpath" echo eval \$ECHO \""$usage_message"\" } # func_version # ------------ # Echo version message to standard output and exit. func_version () { $debug_cmd printf '%s\n' "$progname $scriptversion" $SED -n ' /(C)/!b go :more /\./!{ N s|\n# | | b more } :go /^# Written by /,/# warranty; / { s|^# || s|^# *$|| s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| p } /^# Written by / { s|^# || p } /^warranty; /q' < "$progpath" exit $? } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: # Set a version string. scriptversion='(GNU libtool) 2.4.6' # func_echo ARG... # ---------------- # Libtool also displays the current mode in messages, so override # funclib.sh func_echo with this custom definition. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" done IFS=$func_echo_IFS } # func_warning ARG... # ------------------- # Libtool warnings are not categorized, so override funclib.sh # func_warning with this simpler definition. func_warning () { $debug_cmd $warning_func ${1+"$@"} } ## ---------------- ## ## Options parsing. ## ## ---------------- ## # Hook in the functions to make sure our own options are parsed during # the option parsing loop. usage='$progpath [OPTION]... [MODE-ARG]...' # Short help message in response to '-h'. usage_message="Options: --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 --no-warnings equivalent to '-Wnone' --preserve-dup-deps don't remove duplicate dependency libraries --quiet, --silent don't print informational messages --tag=TAG use configuration variables from tag TAG -v, --verbose print more informational messages than default --version print version information -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -h, --help, --help-all print short, long, or detailed help message " # Additional text appended to 'usage_message' in response to '--help'. func_help () { $debug_cmd func_usage_message $ECHO "$long_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) version: $progname (GNU libtool) 2.4.6 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . GNU libtool home page: . General help using GNU software: ." exit 0 } # func_lo2o OBJECT-NAME # --------------------- # Transform OBJECT-NAME from a '.lo' suffix to the platform specific # object suffix. lo2o=s/\\.lo\$/.$objext/ o2lo=s/\\.$objext\$/.lo/ if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_lo2o () { case $1 in *.lo) func_lo2o_result=${1%.lo}.$objext ;; * ) func_lo2o_result=$1 ;; esac }' # func_xform LIBOBJ-OR-SOURCE # --------------------------- # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) # suffix to a '.lo' libtool-object suffix. eval 'func_xform () { func_xform_result=${1%.*}.lo }' else # ...otherwise fall back to using sed. func_lo2o () { func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` } func_xform () { func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` } fi # func_fatal_configuration ARG... # ------------------------------- # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func__fatal_error ${1+"$@"} \ "See the $PACKAGE documentation for more information." \ "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 yes = "$build_libtool_libs"; then echo "enable shared libraries" else echo "disable shared libraries" fi if test yes = "$build_old_libs"; 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 } # libtool_options_prep [ARG]... # ----------------------------- # Preparation for options parsed by libtool. libtool_options_prep () { $debug_mode # Option defaults: opt_config=false opt_dlopen= opt_dry_run=false opt_help=false opt_mode= opt_preserve_dup_deps=false opt_quiet=false nonopt= preserve_args= # 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 # Pass back the list of options. func_quote_for_eval ${1+"$@"} libtool_options_prep_result=$func_quote_for_eval_result } func_add_hook func_options_prep libtool_options_prep # libtool_parse_options [ARG]... # --------------------------------- # Provide handling for libtool specific options. libtool_parse_options () { $debug_cmd # Perform our own loop to consume as many options as possible in # each iteration. while test $# -gt 0; do _G_opt=$1 shift case $_G_opt in --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) func_config ;; --dlopen|-dlopen) opt_dlopen="${opt_dlopen+$opt_dlopen }$1" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) func_features ;; --finish) set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $_G_opt && break opt_mode=$1 case $1 in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $_G_opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_quiet=false func_append preserve_args " $_G_opt" ;; --no-warnings|--no-warning|--no-warn) opt_warning=false func_append preserve_args " $_G_opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $_G_opt" ;; --silent|--quiet) opt_quiet=: opt_verbose=false func_append preserve_args " $_G_opt" ;; --tag) test $# = 0 && func_missing_arg $_G_opt && break opt_tag=$1 func_append preserve_args " $_G_opt $1" func_enable_tag "$1" shift ;; --verbose|-v) opt_quiet=false opt_verbose=: func_append preserve_args " $_G_opt" ;; # An option not handled by this hook function: *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; esac done # save modified positional parameters for caller func_quote_for_eval ${1+"$@"} libtool_parse_options_result=$func_quote_for_eval_result } func_add_hook func_parse_options libtool_parse_options # libtool_validate_options [ARG]... # --------------------------------- # Perform any sanity checks on option settings and/or unconsumed # arguments. libtool_validate_options () { # save first non-option argument if test 0 -lt $#; then nonopt=$1 shift fi # preserve --debug test : = "$debug_cmd" || func_append preserve_args " --debug" case $host in # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) # 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 test yes != "$build_libtool_libs" \ && test yes != "$build_old_libs" \ && func_fatal_configuration "not configured to build any kind of library" # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test execute != "$opt_mode"; 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." } # Pass back the unparsed argument list func_quote_for_eval ${1+"$@"} libtool_validate_options_result=$func_quote_for_eval_result } func_add_hook func_validate_options libtool_validate_options # Process options as early as possible so that --help and --version # can return quickly. func_options ${1+"$@"} eval set dummy "$func_options_result"; shift ## ----------- ## ## Main. ## ## ----------- ## magic='%%%MAGIC variable%%%' magic_exe='%%%MAGIC EXE variable%%%' # Global variables. 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= # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # func_generated_by_libtool # True iff stdin has been generated by Libtool. This function is only # a basic sanity check; it will hardly flush out determined imposters. func_generated_by_libtool_p () { $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # 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 | func_generated_by_libtool_p } # 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 yes = "$lalib_p" } # 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 () { test -f "$1" && $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p } # 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 () { $debug_cmd save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs 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 () { $debug_cmd 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 () { $debug_cmd 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 yes = "$build_libtool_libs"; then write_lobj=\'$2\' else write_lobj=none fi if test yes = "$build_old_libs"; 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 "$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 () { $debug_cmd # 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 () { $debug_cmd 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 () { $debug_cmd # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd $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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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 () { $debug_cmd 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_dll_def_p FILE # True iff FILE is a Windows DLL '.def' file. # Keep in sync with _LT_DLL_DEF_P in libtool.m4 func_dll_def_p () { $debug_cmd func_dll_def_p_tmp=`$SED -n \ -e 's/^[ ]*//' \ -e '/^\(;.*\)*$/d' \ -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ -e q \ "$1"` test DEF = "$func_dll_def_p_tmp" } # func_mode_compile arg... func_mode_compile () { $debug_cmd # 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 yes = "$build_libtool_libs" \ || func_fatal_configuration "cannot 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 yes = "$build_old_libs"; 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 no = "$pic_mode" && test pass_all != "$deplibs_check_method"; 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 no = "$compiler_c_o"; 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 yes = "$need_locks"; 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 warn = "$need_locks"; 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 yes = "$build_libtool_libs"; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test no != "$pic_mode"; 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 warn = "$need_locks" && 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 yes = "$suppress_opt"; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test yes = "$build_old_libs"; then if test yes != "$pic_mode"; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test yes = "$compiler_c_o"; 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 warn = "$need_locks" && 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 no != "$need_locks"; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test compile = "$opt_mode" && 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 -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) -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 () { $debug_cmd # 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 $opt_dry_run; then # 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 else 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 fi } test execute = "$opt_mode" && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $debug_cmd 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_quiet && 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 finish = "$opt_mode" && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $debug_cmd # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || # 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=false 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=: ;; -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-m = "X$prev" && 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=: if $isdir; 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 ;; os2*) 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 yes = "$build_old_libs"; 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=: 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'` if test -n "$libdir" && test ! -f "$libfile"; then func_warning "'$lib' has not been installed in '$libdir'" finalize=false fi done relink_command= func_source "$wrapper" outputname= if test no = "$fast_install" && test -n "$relink_command"; then $opt_dry_run || { if $finalize; 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_quiet || { 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 install = "$opt_mode" && 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 () { $debug_cmd my_outputname=$1 my_originator=$2 my_pic_p=${3-false} my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; 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) $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 can'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 #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* External symbol declarations for the compiler. */\ " if test yes = "$dlself"; 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 func_show_eval '$RM "${nlist}I"' if test -n "$global_symbol_to_import"; then eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' 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[];\ " if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ static void lt_syminit(void) { LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; for (; symbol->name; ++symbol) {" $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" echo >> "$output_objdir/$my_dlsyms" "\ } }" fi echo >> "$output_objdir/$my_dlsyms" "\ LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = { {\"$my_originator\", (void *) 0}," if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ {\"@INIT@\", (void *) <_syminit}," fi 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" ;; *) $my_pic_p && pic_flag_for_symtable=" $pic_flag" ;; 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" "${nlist}I"' # 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_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 () { $debug_cmd 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 () { $debug_cmd 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_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 () { $debug_cmd 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 case $nm_interface in "MS dumpbin") if func_cygming_ms_implib_p "$1" || func_cygming_gnu_implib_p "$1" then win32_nmres=import else win32_nmres= fi ;; *) 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 } }'` ;; esac 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 () { $debug_cmd 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 () { $debug_cmd 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 that possess that section. Heuristic: eliminate # all those that 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_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 () { $debug_cmd 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 () { $debug_cmd f_ex_an_ar_dir=$1; shift f_ex_an_ar_oldlib=$1 if test yes = "$lock_old_archive_extraction"; 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 yes = "$lock_old_archive_extraction"; 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 () { $debug_cmd 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` func_basename "$darwin_archive" darwin_base_archive=$func_basename_result 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 "$sed_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 where 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) $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/ that is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options that 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) $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 yes = "$fast_install"; 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 yes = "$shlibpath_overrides_runpath" && 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 #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* 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_platform || defined ... */ #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 #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 (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]; size_t 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 = (size_t) (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 (STREQ (str, pat)) *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 size_t 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) { size_t orig_value_len = strlen (orig_value); size_t 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 #' */ size_t len = strlen (new_value); while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[--len] = '\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 () { $debug_cmd case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_suncc_cstd_abi # !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! # Several compiler flags select an ABI that is incompatible with the # Cstd library. Avoid specifying it if any are in CXXFLAGS. func_suncc_cstd_abi () { $debug_cmd case " $compile_command " in *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) suncc_use_cstd_abi=no ;; *) suncc_use_cstd_abi=yes ;; esac } # func_mode_link arg... func_mode_link () { $debug_cmd 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 # what 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 that 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= os2dllname= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=false 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 yes != "$build_libtool_libs" \ && func_fatal_configuration "cannot build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test yes = "$build_libtool_libs" && 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) $preload || { # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=: } case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test no = "$dlself"; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test dlprefiles = "$prev"; then dlself=yes elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test dlfiles = "$prev"; 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 ;; mllvm) # Clang does not use LLVM to link, so we can simply discard any # '-mllvm $arg' options when doing the link step. 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 none = "$pic_object" && test none = "$non_pic_object"; 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 none != "$pic_object"; then # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; 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 dlprefiles = "$prev"; 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 none != "$non_pic_object"; 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 none = "$pic_object"; 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 ;; os2dllname) os2dllname=$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 rpath = "$prev"; 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-export-symbols = "X$arg"; 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-lc = "X$arg" || test X-lm = "X$arg"; 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-lc = "X$arg" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc due to us having libc/libc_r. test X-lc = "X$arg" && 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-lc = "X$arg" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test X-lc = "X$arg" && continue ;; esac elif test X-lc_r = "X$arg"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -mllvm) prev=mllvm 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 ;; -os2dllname) prev=os2dllname 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 # -fstack-protector* stack protector flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization # -stdlib=* select c++ std lib with clang -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*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*) 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 ;; -Z*) if test os2 = "`expr $host : '.*\(os2\)'`"; then # OS/2 uses -Zxxx to specify OS/2-specific options compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case $arg in -Zlinker | -Zstack) prev=xcompiler ;; esac continue else # Otherwise treat like 'Some other compiler flag' below func_quote_for_eval "$arg" arg=$func_quote_for_eval_result fi ;; # 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 none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result test none = "$pic_object" || { # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; 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 dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object } # Non-PIC object. if test none != "$non_pic_object"; 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 none = "$pic_object"; 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 dlfiles = "$prev"; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test dlprefiles = "$prev"; 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 yes = "$export_dynamic" && 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\" # Definition is injected by LT_CONFIG during libtool generation. func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" 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 lib = "$linkmode"; 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=false 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 lib,link = "$linkmode,$pass"; 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 lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass"; then libs=$deplibs deplibs= fi if test prog = "$linkmode"; then case $pass in dlopen) libs=$dlfiles ;; dlpreopen) libs=$dlprefiles ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test lib,dlpreopen = "$linkmode,$pass"; 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 dlopen = "$pass"; then # Collect dlpreopened libraries save_deplibs=$deplibs deplibs= fi for deplib in $libs; do lib= found=false case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test lib != "$linkmode" && test prog != "$linkmode"; then func_warning "'-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test lib = "$linkmode"; 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 .la = "$search_ext"; then found=: else found=false fi break 2 fi done done if $found; then # 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 yes = "$allow_libtool_libs_with_static_runtimes"; 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=false func_dirname "$lib" "" "." ladir=$func_dirname_result lib=$ladir/$old_library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi else # deplib doesn't seem to be a libtool library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi ;; # -l *.ltframework) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test lib = "$linkmode"; 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 conv = "$pass" && 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 conv = "$pass"; then deplibs="$deplib $deplibs" continue fi if test scan = "$pass"; 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 link = "$pass"; 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 conv = "$pass"; 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=false 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=: fi ;; pass_all) valid_a_lib=: ;; esac if $valid_a_lib; then echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" else 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." fi ;; esac continue ;; prog) if test link != "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test conv = "$pass"; then deplibs="$deplib $deplibs" elif test prog = "$linkmode"; then if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; 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=: continue ;; esac # case $deplib $found || test -f "$lib" \ || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" # 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 lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass" || { test prog != "$linkmode" && test lib != "$linkmode"; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test conv = "$pass"; 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 prog != "$linkmode" && test lib != "$linkmode"; 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 yes = "$prefer_static_libs" || test built,no = "$prefer_static_libs,$installed"; }; 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 dlopen = "$pass"; then test -z "$libdir" \ && func_fatal_error "cannot -dlopen a convenience library: '$lib'" if test -z "$dlname" || test yes != "$dlopen_support" || test no = "$build_libtool_libs" 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 yes = "$installed"; 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 yes = "$hardcode_automatic" && 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 dlpreopen = "$pass"; then if test -z "$libdir" && test prog = "$linkmode"; 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 lib = "$linkmode"; then deplibs="$dir/$old_library $deplibs" elif test prog,link = "$linkmode,$pass"; 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 prog = "$linkmode" && test link != "$pass"; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=false if test no != "$link_all_deplibs" || test -z "$library_names" || test no = "$build_libtool_libs"; then linkalldeplibs=: 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 $linkalldeplibs; 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 prog,link = "$linkmode,$pass"; then if test -n "$library_names" && { { test no = "$prefer_static_libs" || test built,yes = "$prefer_static_libs,$installed"; } || 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 $alldeplibs && { test pass_all = "$deplibs_check_method" || { test yes = "$build_libtool_libs" && 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 built = "$use_static_libs" && test yes = "$installed"; then use_static_libs=no fi if test -n "$library_names" && { test no = "$use_static_libs" || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc* | *os2*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test no = "$installed"; 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 yes = "$shouldnotlink" && test link = "$pass"; then echo if test prog = "$linkmode"; 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 lib = "$linkmode" && test yes = "$hardcode_into_libs"; 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* | *os2*) 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 prog = "$linkmode" || test relink != "$opt_mode"; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test no = "$hardcode_direct"; 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 cannot # 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 no = "$hardcode_minus_L"; then case $host in *-*-sunos*) add_shlibpath=$dir ;; esac add_dir=-L$dir add=-l$name elif test no = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; relink) if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$dir/$linklib elif test yes = "$hardcode_minus_L"; 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 yes = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; *) lib_linked=no ;; esac if test yes != "$lib_linked"; 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 prog = "$linkmode"; 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 yes != "$hardcode_direct" && test yes != "$hardcode_minus_L" && test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test prog = "$linkmode" || test relink = "$opt_mode"; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$libdir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$libdir add=-l$name elif test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add=-l$name elif test yes = "$hardcode_automatic"; 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 prog = "$linkmode"; 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 prog = "$linkmode"; 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 unsupported != "$hardcode_direct"; 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 yes = "$build_libtool_libs"; then # Not a shared library if test pass_all != "$deplibs_check_method"; 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 cannot 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 yes = "$module"; 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 no = "$build_old_libs"; 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 lib = "$linkmode"; then if test -n "$dependency_libs" && { test yes != "$hardcode_into_libs" || test yes = "$build_old_libs" || test yes = "$link_static"; }; 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 no = "$link_static" && 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 no != "$link_all_deplibs"; 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 link = "$pass"; then if test prog = "$linkmode"; 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 dlpreopen = "$pass"; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test dlopen != "$pass"; then test conv = "$pass" || { # 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= } if test prog,link = "$linkmode,$pass"; then vars="compile_deplibs finalize_deplibs" else vars=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 # Add Sun CC postdeps if required: test CXX = "$tagname" && { case $host_os in linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; solaris*) func_cc_basename "$CC" case $func_cc_basename_result in CC* | sunCC*) func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; esac } # 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 prog = "$linkmode"; then dlfiles=$newdlfiles fi if test prog = "$linkmode" || test lib = "$linkmode"; then dlprefiles=$newdlprefiles fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; 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 no = "$module" \ && func_fatal_help "libtool library '$output' must begin with 'lib'" if test no != "$need_lib_prefix"; 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 pass_all != "$deplibs_check_method"; 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 no = "$dlself" \ || func_warning "'-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test 1 -lt "$#" \ && func_warning "ignoring multiple '-rpath's for a libtool library" install_libdir=$1 oldlibs= if test -z "$rpath"; then if test yes = "$build_libtool_libs"; 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 # that has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|freebsd-elf|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_revision ;; freebsd-aout|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" # On Darwin other compilers case $CC in nagfor*) verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" ;; *) verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; esac ;; freebsd-aout) major=.$current versuffix=.$current.$revision ;; freebsd-elf) func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; irix | nonstopux) if test no = "$lt_irix_increment"; 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 0 -ne "$loop"; 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 0 -ne "$loop"; 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 ;; sco) major=.$current versuffix=.$current ;; sunos) major=.$current versuffix=.$current.$revision ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 file systems. 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 no = "$need_version"; then versuffix= else versuffix=.0.0 fi fi # Remove version info from name if versioning should be avoided if test yes,no = "$avoid_version,$need_version"; then major= versuffix= verstring= fi # Check to see if the archive will have undefined symbols. if test yes = "$allow_undefined"; then if test unsupported = "$allow_undefined_flag"; then if test yes = "$build_old_libs"; then func_warning "undefined symbols not allowed in $host shared libraries; building static only" build_libtool_libs=no else func_fatal_error "can't build $host shared library unless -no-undefined is specified" fi fi else # Don't allow undefined symbols. allow_undefined_flag=$no_undefined_flag fi fi func_generate_dlsyms "$libname" "$libname" : func_append libobjs " $symfileobj" test " " = "$libobjs" && libobjs= if test relink != "$opt_mode"; 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 -n "$precious_files_regex"; 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 yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; 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 yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; 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 yes = "$build_libtool_libs"; 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 yes = "$build_libtool_need_lc"; 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 yes = "$allow_libtool_libs_with_static_runtimes"; 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 yes = "$allow_libtool_libs_with_static_runtimes"; 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 none = "$deplibs_check_method"; 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 yes = "$droppeddeps"; then if test yes = "$module"; 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 no = "$build_old_libs"; 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 no = "$allow_undefined"; 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 no = "$build_old_libs"; 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 yes = "$build_libtool_libs"; then # Remove $wl instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test yes = "$hardcode_into_libs"; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath=$finalize_rpath test relink = "$opt_mode" || 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 relink = "$opt_mode" || 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 func_dll_def_p "$export_symbols" || { # 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 ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test yes = "$always_export_symbols" || 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 yes = "$try_normal_branch" \ && { 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 : != "$skipped_export"; 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 : != "$skipped_export" && 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 yes = "$compiler_needs_object" && 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 yes = "$thread_safe" && 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 relink = "$opt_mode"; 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 yes = "$module" && 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 : != "$skipped_export" && 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 : != "$skipped_export" && test yes = "$with_gnu_ld"; 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 : != "$skipped_export" && test -n "$file_list_spec"; then output=$output_objdir/$output_la.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test yes = "$compiler_needs_object"; 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 -z "$objlist" || 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 1 -eq "$k"; 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 ${skipped_export-false} && { 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 } 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_quiet || { 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 relink = "$opt_mode"; 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 ${skipped_export-false} && { 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 } 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 yes = "$module" && 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=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs $opt_quiet || { 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 relink = "$opt_mode"; 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 relink = "$opt_mode"; 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 yes = "$module" || test yes = "$export_dynamic"; then # On all known operating systems, these are identical. dlname=$soname fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; 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= # if reload_cmds runs $LD directly, get rid of -Wl from # whole_archive_flag_spec and hope we can get by with turning comma # into space. case $reload_cmds in *\$LD[\ \$]*) wl= ;; esac if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags 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 yes = "$build_libtool_libs" || 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 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 test yes = "$build_libtool_libs" || { 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 } if test -n "$pic_flag" || test default != "$pic_mode"; 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" $preload \ && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ && 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 CXX = "$tagname"; 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 yes = "$build_old_libs"; 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@" false # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=: case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=false ;; *cygwin* | *mingw* ) test yes = "$build_libtool_libs" || wrappers_required=false ;; *) if test no = "$need_relink" || test yes != "$build_libtool_libs"; then wrappers_required=false fi ;; esac $wrappers_required || { # 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 } 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 yes = "$no_install"; 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 case $hardcode_action,$fast_install in relink,*) # 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" ;; *,yes) link_command=$finalize_var$compile_command$finalize_rpath relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` ;; *,no) link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath ;; *,needless) link_command=$finalize_var$compile_command$finalize_rpath relink_command= ;; esac # 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 case $build_libtool_libs in convenience) oldobjs="$libobjs_save $symfileobj" addlibs=$convenience build_libtool_libs=no ;; module) oldobjs=$libobjs_save addlibs=$old_convenience build_libtool_libs=no ;; *) oldobjs="$old_deplibs $non_pic_objects" $preload && test -f "$symfileobj" \ && func_append oldobjs " $symfileobj" addlibs=$old_convenience ;; esac 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 yes = "$build_libtool_libs"; 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 -z "$oldobjs"; 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 yes = "$build_old_libs" && 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 yes = "$hardcode_automatic"; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test yes = "$installed"; 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 -n "$bindir"; 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) $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 cannot 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 no,yes = "$installed,$need_relink"; 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 } if test link = "$opt_mode" || test relink = "$opt_mode"; then func_mode_link ${1+"$@"} fi # func_mode_uninstall arg... func_mode_uninstall () { $debug_cmd RM=$nonopt files= rmforce=false 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=: ;; -*) 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 . = "$dir"; then odir=$objdir else odir=$dir/$objdir fi func_basename "$file" name=$func_basename_result test uninstall = "$opt_mode" && odir=$dir # Remember odir for removal later, being careful to avoid duplicates if test clean = "$opt_mode"; 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 $rmforce; 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" '$rmforce || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" '$rmforce || 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 none != "$pic_object"; 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 none != "$non_pic_object"; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test clean = "$opt_mode"; 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 yes = "$fast_install" && 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 } if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then func_mode_uninstall ${1+"$@"} fi 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 # where 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: gsl-2.7.1/mdate-sh0000644016036000116100000000500313373111455010654 00000000000000#!/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-2.7.1/missing0000755016036000116100000001533113373111455010633 00000000000000#! /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-2.7.1/mkinstalldirs0000755016036000116100000000672213373111455012046 00000000000000#! /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-2.7.1/test-driver0000755016036000116100000000761113135126273011434 00000000000000#! /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-2.7.1/version.c0000644016036000116100000000217113135126237011063 00000000000000/* 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-2.7.1/gsl-histogram.c0000644016036000116100000000364013377336115012166 00000000000000/* 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 int main (int argc, char **argv) { double a = 0.0, b = 1.0; size_t n = 10; if (argc != 3 && argc !=4) { printf ("Usage: gsl-histogram xmin xmax [n]\n"); printf ( "Computes a histogram of the data on stdin using n bins from xmin to xmax.\n" "If n is unspecified then bins of integer width are used.\n"); exit (0); } a = atof (argv[1]); b = atof (argv[2]); if (argc == 4) { n = atoi (argv[3]); } else { n = (int)(b - a) ; } { double x; gsl_histogram *h = gsl_histogram_alloc (n); gsl_histogram_set_ranges_uniform (h, a, b); while (fscanf(stdin, "%lg", &x) == 1) { gsl_histogram_increment(h, x); } #ifdef DISPLAY_STATS { double mean = gsl_histogram_mean (h); double sigma = gsl_histogram_sigma (h); fprintf (stdout, "# mean = %g\n", mean); fprintf (stdout, "# sigma = %g\n", sigma); } #endif gsl_histogram_fprintf (stdout, h, "%g", "%g"); gsl_histogram_free (h); } return 0; } gsl-2.7.1/gsl-randist.c0000644016036000116100000002330713373111455011631 00000000000000/* 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-2.7.1/autogen.sh0000755016036000116100000000042213373111454011227 00000000000000#! /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-2.7.1/gsl-config.in0000755016036000116100000000233313373111455011615 00000000000000#! /bin/sh prefix=@prefix@ exec_prefix=@exec_prefix@ includedir=@includedir@ usage() { cat <, 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-2.7.1/test_gsl_histogram.sh0000755016036000116100000000034513135126237013473 00000000000000#! /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-2.7.1/pkgconfig.test0000755016036000116100000000036313373111456012107 00000000000000#!/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-2.7.1/gsl/0000755016036000116100000000000014151602574010100 500000000000000gsl-2.7.1/gsl/Makefile.am0000644016036000116100000000047713373111455012062 00000000000000 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-2.7.1/gsl/Makefile.in0000644016036000116100000003254214151557214012073 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 .PRECIOUS: Makefile 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-2.7.1/utils/0000755016036000116100000000000014151602574010453 500000000000000gsl-2.7.1/utils/Makefile.am0000644016036000116100000000030113135126237012417 00000000000000noinst_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-2.7.1/utils/Makefile.in0000644016036000116100000004715614151557216012457 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = $(DEPDIR)/memcpy.Po $(DEPDIR)/memmove.Po \ $(DEPDIR)/strdup.Po $(DEPDIR)/strtol.Po $(DEPDIR)/strtoul.Po \ ./$(DEPDIR)/placeholder.Plo 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 am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs README memcpy.c memmove.c strdup.c \ strtol.c strtoul.c 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/memmove.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strdup.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strtol.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strtoul.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/placeholder.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f $(DEPDIR)/memcpy.Po -rm -f $(DEPDIR)/memmove.Po -rm -f $(DEPDIR)/strdup.Po -rm -f $(DEPDIR)/strtol.Po -rm -f $(DEPDIR)/strtoul.Po -rm -f ./$(DEPDIR)/placeholder.Plo -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 -f $(DEPDIR)/memcpy.Po -rm -f $(DEPDIR)/memmove.Po -rm -f $(DEPDIR)/strdup.Po -rm -f $(DEPDIR)/strtol.Po -rm -f $(DEPDIR)/strtoul.Po -rm -f ./$(DEPDIR)/placeholder.Plo -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/utils/README0000644016036000116100000000027013135126237011250 00000000000000Some 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-2.7.1/utils/memcpy.c0000644016036000116100000000065013373111456012031 00000000000000/* 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-2.7.1/utils/memmove.c0000644016036000116100000000133113373111456012201 00000000000000/* 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-2.7.1/utils/strdup.c0000644016036000116100000000226713135126237012065 00000000000000/* 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-2.7.1/utils/strtol.c0000644016036000116100000000744413135126237012075 00000000000000/* 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-2.7.1/utils/strtoul.c0000644016036000116100000000155513135126237012257 00000000000000/* 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-2.7.1/utils/system.h0000644016036000116100000000463313373111456012075 00000000000000/* 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-2.7.1/utils/placeholder.c0000644016036000116100000000014013135126237013012 00000000000000void gsl_utils_placeholder (void); void gsl_utils_placeholder (void) { int i = 0; i++ ; } gsl-2.7.1/sys/0000755016036000116100000000000014151602574010131 500000000000000gsl-2.7.1/sys/Makefile.am0000644016036000116100000000065513373111456012112 00000000000000noinst_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-2.7.1/sys/gsl_sys.h0000644016036000116100000000364213135126237011710 00000000000000/* 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-2.7.1/sys/Makefile.in0000644016036000116100000011102714151557215012121 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/coerce.Plo ./$(DEPDIR)/expm1.Plo \ ./$(DEPDIR)/fcmp.Plo ./$(DEPDIR)/fdiv.Plo \ ./$(DEPDIR)/hypot.Plo ./$(DEPDIR)/infnan.Plo \ ./$(DEPDIR)/invhyp.Plo ./$(DEPDIR)/ldfrexp.Plo \ ./$(DEPDIR)/log1p.Plo ./$(DEPDIR)/minmax.Plo \ ./$(DEPDIR)/pow_int.Plo ./$(DEPDIR)/prec.Plo \ ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expm1.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fcmp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdiv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hypot.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/infnan.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invhyp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ldfrexp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log1p.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minmax.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pow_int.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/coerce.Plo -rm -f ./$(DEPDIR)/expm1.Plo -rm -f ./$(DEPDIR)/fcmp.Plo -rm -f ./$(DEPDIR)/fdiv.Plo -rm -f ./$(DEPDIR)/hypot.Plo -rm -f ./$(DEPDIR)/infnan.Plo -rm -f ./$(DEPDIR)/invhyp.Plo -rm -f ./$(DEPDIR)/ldfrexp.Plo -rm -f ./$(DEPDIR)/log1p.Plo -rm -f ./$(DEPDIR)/minmax.Plo -rm -f ./$(DEPDIR)/pow_int.Plo -rm -f ./$(DEPDIR)/prec.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/coerce.Plo -rm -f ./$(DEPDIR)/expm1.Plo -rm -f ./$(DEPDIR)/fcmp.Plo -rm -f ./$(DEPDIR)/fdiv.Plo -rm -f ./$(DEPDIR)/hypot.Plo -rm -f ./$(DEPDIR)/infnan.Plo -rm -f ./$(DEPDIR)/invhyp.Plo -rm -f ./$(DEPDIR)/ldfrexp.Plo -rm -f ./$(DEPDIR)/log1p.Plo -rm -f ./$(DEPDIR)/minmax.Plo -rm -f ./$(DEPDIR)/pow_int.Plo -rm -f ./$(DEPDIR)/prec.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/sys/ChangeLog0000644016036000116100000001216413373111456011626 000000000000002011-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-2.7.1/sys/minmax.c0000644016036000116100000000221313373111456011503 00000000000000/* 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-2.7.1/sys/prec.c0000644016036000116100000000342713373111456011153 00000000000000/* 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-2.7.1/sys/hypot.c0000644016036000116100000000367713373111456011374 00000000000000/* 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-2.7.1/sys/log1p.c0000644016036000116100000000203313373111456011234 00000000000000/* 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-2.7.1/sys/expm1.c0000644016036000116100000000253713135126237011254 00000000000000/* 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-2.7.1/sys/coerce.c0000644016036000116100000000233113373111456011453 00000000000000/* 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-2.7.1/sys/invhyp.c0000644016036000116100000000417213135126237011534 00000000000000/* 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-2.7.1/sys/pow_int.c0000644016036000116100000000256213373111456011700 00000000000000/* 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-2.7.1/sys/infnan.c0000644016036000116100000000527213373111456011473 00000000000000/* 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-2.7.1/sys/fdiv.c0000644016036000116100000000163113373111456011145 00000000000000/* 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-2.7.1/sys/fcmp.c0000644016036000116100000000320713135126237011142 00000000000000/* 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-2.7.1/sys/ldfrexp.c0000644016036000116100000000436113373111456011664 00000000000000/* 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-2.7.1/sys/test.c0000644016036000116100000004436013373111456011202 00000000000000/* 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-2.7.1/test/0000755016036000116100000000000014151602574010272 500000000000000gsl-2.7.1/test/Makefile.am0000644016036000116100000000036113135126237012244 00000000000000noinst_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-2.7.1/test/gsl_test.h0000644016036000116100000000347213135126237012213 00000000000000/* 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-2.7.1/test/Makefile.in0000644016036000116100000005212414151557215012264 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/results.Plo 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 am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs ChangeLog 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/results.Plo -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 -f ./$(DEPDIR)/results.Plo -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 am--depfiles 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 .PRECIOUS: Makefile #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-2.7.1/test/ChangeLog0000644016036000116100000000214513135126237011764 000000000000002005-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-2.7.1/test/results.c0000644016036000116100000002215013135126237012055 00000000000000/* 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-2.7.1/err/0000755016036000116100000000000014151602574010103 500000000000000gsl-2.7.1/err/Makefile.am0000644016036000116100000000046213135126237012057 00000000000000noinst_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-2.7.1/err/gsl_errno.h0000644016036000116100000001351513135126237012171 00000000000000/* 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-2.7.1/err/gsl_message.h0000644016036000116100000000456413135126237012474 00000000000000/* 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-2.7.1/err/Makefile.in0000644016036000116100000010566214151557214012102 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/error.Plo ./$(DEPDIR)/message.Plo \ ./$(DEPDIR)/stream.Plo ./$(DEPDIR)/strerror.Plo \ ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/message.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strerror.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/error.Plo -rm -f ./$(DEPDIR)/message.Plo -rm -f ./$(DEPDIR)/stream.Plo -rm -f ./$(DEPDIR)/strerror.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/error.Plo -rm -f ./$(DEPDIR)/message.Plo -rm -f ./$(DEPDIR)/stream.Plo -rm -f ./$(DEPDIR)/strerror.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/err/ChangeLog0000644016036000116100000001251413135126237011576 000000000000002004-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-2.7.1/err/TODO0000644016036000116100000000017213373111455010511 00000000000000# -*- org -*- #+CATEGORY: err * Add a GSL_ERROR_MODE environment variable for choosing error behavior at runtime (???). gsl-2.7.1/err/error.c0000644016036000116100000000400613135126237011316 00000000000000/* 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-2.7.1/err/stream.c0000644016036000116100000000345713135126237011471 00000000000000/* 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-2.7.1/err/message.c0000644016036000116100000000230713135126237011613 00000000000000/* 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-2.7.1/err/strerror.c0000644016036000116100000000651213135126237012053 00000000000000/* 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-2.7.1/err/test.c0000644016036000116100000000532013135126237011144 00000000000000/* 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-2.7.1/bst/0000755016036000116100000000000014151602574010103 500000000000000gsl-2.7.1/bst/Makefile.am0000644016036000116100000000061013521440113012041 00000000000000noinst_LTLIBRARIES = libgslbst.la check_PROGRAMS = test pkginclude_HEADERS = gsl_bst.h gsl_bst_types.h gsl_bst_avl.h gsl_bst_rb.h libgslbst_la_SOURCES = avl.c bst.c rb.c trav.c AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslbst.la ../test/libgsltest.la ../sys/libgslsys.la ../err/libgslerr.la ../sort/libgslsort.la ../rng/libgslrng.la gsl-2.7.1/bst/gsl_bst.h0000644016036000116100000001000713626554557011644 00000000000000/* bst/gsl_bst.h * * Copyright (C) 2018, 2019 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_BST_H__ #define __GSL_BST_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 /* type of binary search tree */ typedef struct { const char *name; const size_t node_size; int (*init)(const gsl_bst_allocator * allocator, gsl_bst_cmp_function * compare, void * params, void * vtable); size_t (*nodes) (const void * vtable); void * (*insert) (void * item, void * vtable); void * (*find) (const void *item, const void * vtable); void * (*remove) (const void *item, void * vtable); int (*empty) (void * vtable); int (*trav_init) (void * vtrav, const void * vtable); void * (*trav_first) (void * vtrav, const void * vtable); void * (*trav_last) (void * vtrav, const void * vtable); void * (*trav_find) (const void * item, void * vtrav, const void * vtable); void * (*trav_insert) (void * item, void * vtrav, void * vtable); void * (*trav_copy) (void * vtrav, const void * vsrc); void * (*trav_next) (void * vtrav); void * (*trav_prev) (void * vtrav); void * (*trav_cur) (const void * vtrav); void * (*trav_replace) (void * vtrav, void * new_item); } gsl_bst_type; typedef struct { const gsl_bst_type * type; /* binary search tree type */ union { gsl_bst_avl_table avl_table; gsl_bst_rb_table rb_table; } table; } gsl_bst_workspace; typedef struct { const gsl_bst_type * type; /* binary search tree type */ union { gsl_bst_avl_traverser avl_trav; gsl_bst_rb_traverser rb_trav; } trav_data; } gsl_bst_trav; /* tree types */ GSL_VAR const gsl_bst_type * gsl_bst_avl; GSL_VAR const gsl_bst_type * gsl_bst_rb; /* * Prototypes */ gsl_bst_workspace * gsl_bst_alloc(const gsl_bst_type * T, const gsl_bst_allocator * allocator, gsl_bst_cmp_function * compare, void * params); void gsl_bst_free(gsl_bst_workspace * w); int gsl_bst_empty(gsl_bst_workspace * w); void * gsl_bst_insert(void * item, gsl_bst_workspace * w); void * gsl_bst_find(const void * item, const gsl_bst_workspace * w); void * gsl_bst_remove(const void * item, gsl_bst_workspace * w); size_t gsl_bst_nodes(const gsl_bst_workspace * w); size_t gsl_bst_node_size(const gsl_bst_workspace * w); const char * gsl_bst_name(const gsl_bst_workspace * w); int gsl_bst_trav_init(gsl_bst_trav * trav, const gsl_bst_workspace * w); void * gsl_bst_trav_first(gsl_bst_trav * trav, const gsl_bst_workspace * w); void * gsl_bst_trav_last (gsl_bst_trav * trav, const gsl_bst_workspace * w); void * gsl_bst_trav_find (const void * item, gsl_bst_trav * trav, const gsl_bst_workspace * w); void * gsl_bst_trav_insert (void * item, gsl_bst_trav * trav, gsl_bst_workspace * w); void * gsl_bst_trav_copy(gsl_bst_trav * dest, const gsl_bst_trav * src); void * gsl_bst_trav_next(gsl_bst_trav * trav); void * gsl_bst_trav_prev(gsl_bst_trav * trav); void * gsl_bst_trav_cur(const gsl_bst_trav * trav); void * gsl_bst_trav_replace (gsl_bst_trav * trav, void * new_item); __END_DECLS #endif /* __GSL_BST_H__ */ gsl-2.7.1/bst/gsl_bst_types.h0000644016036000116100000000253513626554502013065 00000000000000/* bst/gsl_bst_types.h * * Copyright (C) 2019 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_BST_TYPES_H__ #define __GSL_BST_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 int gsl_bst_cmp_function (const void * a, const void * b, void * params); /* allocation routines */ typedef struct { void * (*alloc) (size_t size, void * params); void (*free) (void * block, void * params); } gsl_bst_allocator; __END_DECLS #endif /* __GSL_BST_TYPES_H__ */ gsl-2.7.1/bst/gsl_bst_avl.h0000644016036000116100000000466613626554452012516 00000000000000/* bst/gsl_bst_avl.h * * Copyright (C) 2018 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_BST_AVL_H__ #define __GSL_BST_AVL_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 #ifndef GSL_BST_AVL_MAX_HEIGHT #define GSL_BST_AVL_MAX_HEIGHT 32 #endif /* AVL node */ struct gsl_bst_avl_node { struct gsl_bst_avl_node *avl_link[2]; /* subtrees */ void *avl_data; /* pointer to data */ signed char avl_balance; /* balance factor */ }; /* tree data structure */ typedef struct { struct gsl_bst_avl_node *avl_root; /* tree's root */ gsl_bst_cmp_function *avl_compare; /* comparison function */ void *avl_param; /* extra argument to |avl_compare| */ const gsl_bst_allocator *avl_alloc; /* memory allocator */ size_t avl_count; /* number of items in tree */ unsigned long avl_generation; /* generation number */ } gsl_bst_avl_table; /* AVL traverser structure */ typedef struct { const gsl_bst_avl_table *avl_table; /* tree being traversed */ struct gsl_bst_avl_node *avl_node; /* current node in tree */ struct gsl_bst_avl_node *avl_stack[GSL_BST_AVL_MAX_HEIGHT]; /* all the nodes above |avl_node| */ size_t avl_height; /* number of nodes in |avl_parent| */ unsigned long avl_generation; /* generation number */ } gsl_bst_avl_traverser; __END_DECLS #endif /* __GSL_BST_AVL_H__ */ gsl-2.7.1/bst/gsl_bst_rb.h0000644016036000116100000000447113626554636012335 00000000000000/* bst/gsl_bst_rb.h * * Copyright (C) 2018 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_BST_RB_H__ #define __GSL_BST_RB_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 #ifndef GSL_BST_RB_MAX_HEIGHT #define GSL_BST_RB_MAX_HEIGHT 48 #endif /* red-black node */ struct gsl_bst_rb_node { struct gsl_bst_rb_node *rb_link[2]; /* subtrees */ void *rb_data; /* pointer to data */ unsigned char rb_color; /* color */ }; /* red-black tree data structure */ typedef struct { struct gsl_bst_rb_node *rb_root; /* tree's root */ gsl_bst_cmp_function *rb_compare; /* comparison function */ void *rb_param; /* extra argument to |rb_compare| */ const gsl_bst_allocator *rb_alloc; /* memory allocator */ size_t rb_count; /* number of items in tree */ unsigned long rb_generation; /* generation number */ } gsl_bst_rb_table; /* red-black traverser structure */ typedef struct { const gsl_bst_rb_table *rb_table; /* tree being traversed */ struct gsl_bst_rb_node *rb_node; /* current node in tree */ struct gsl_bst_rb_node *rb_stack[GSL_BST_RB_MAX_HEIGHT]; /* all the nodes above |rb_node| */ size_t rb_height; /* number of nodes in |rb_parent| */ unsigned long rb_generation; /* generation number */ } gsl_bst_rb_traverser; __END_DECLS #endif /* __GSL_BST_RB_H__ */ gsl-2.7.1/bst/Makefile.in0000644016036000116100000010573014151557213012075 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 = bst 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslbst_la_LIBADD = am_libgslbst_la_OBJECTS = avl.lo bst.lo rb.lo trav.lo libgslbst_la_OBJECTS = $(am_libgslbst_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 = libgslbst.la ../test/libgsltest.la \ ../sys/libgslsys.la ../err/libgslerr.la ../sort/libgslsort.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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/avl.Plo ./$(DEPDIR)/bst.Plo \ ./$(DEPDIR)/rb.Plo ./$(DEPDIR)/test.Po ./$(DEPDIR)/trav.Plo 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 = $(libgslbst_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslbst_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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 = libgslbst.la pkginclude_HEADERS = gsl_bst.h gsl_bst_types.h gsl_bst_avl.h gsl_bst_rb.h libgslbst_la_SOURCES = avl.c bst.c rb.c trav.c AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslbst.la ../test/libgsltest.la ../sys/libgslsys.la ../err/libgslerr.la ../sort/libgslsort.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 bst/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu bst/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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}; \ } libgslbst.la: $(libgslbst_la_OBJECTS) $(libgslbst_la_DEPENDENCIES) $(EXTRA_libgslbst_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslbst_la_OBJECTS) $(libgslbst_la_LIBADD) $(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)/avl.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bst.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rb.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trav.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/avl.Plo -rm -f ./$(DEPDIR)/bst.Plo -rm -f ./$(DEPDIR)/rb.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/trav.Plo -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 -f ./$(DEPDIR)/avl.Plo -rm -f ./$(DEPDIR)/bst.Plo -rm -f ./$(DEPDIR)/rb.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/trav.Plo -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/bst/avl.c0000644016036000116100000006267713377341665011005 00000000000000/* avl.c * * Copyright (C) 1998-2002, 2004 Free Software Foundation, Inc. * Copyright (C) 2018 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, with some modifications */ #include #include #include #include #include #include #include typedef struct gsl_bst_avl_node avl_node; typedef gsl_bst_avl_table avl_table; typedef gsl_bst_avl_traverser avl_traverser; #ifndef AVL_MAX_HEIGHT #define AVL_MAX_HEIGHT GSL_BST_AVL_MAX_HEIGHT #endif /* Function types. */ typedef void avl_item_func (void *avl_item, void *avl_param); typedef void *avl_copy_func (void *avl_item, void *avl_param); /* tree functions */ static int avl_init(const gsl_bst_allocator * allocator, gsl_bst_cmp_function * compare, void * params, void * vtable); static size_t avl_nodes (const void * vtable); static int avl_empty (void * vtable); static void ** avl_probe (void * item, avl_table * table); static void * avl_insert (void * item, void * vtable); static void * avl_find (const void *item, const void * vtable); static void * avl_remove (const void *item, void * vtable); /* traverser functions */ static int avl_t_init (void * vtrav, const void * vtable); static void * avl_t_first (void * vtrav, const void * vtable); static void * avl_t_last (void * vtrav, const void * vtable); static void * avl_t_find (const void * item, void * vtrav, const void * vtable); static void * avl_t_insert (void * item, void * vtrav, void * vtable); static void * avl_t_copy (void * vtrav, const void * vsrc); static void * avl_t_next (void * vtrav); static void * avl_t_prev (void * vtrav); static void * avl_t_cur (const void * vtrav); static void * avl_t_replace (void * vtrav, void * new_item); static void avl_trav_refresh (avl_traverser * trav); #if 0 static avl_table * avl_copy (const avl_table *, avl_copy_func *, avl_item_func *); static void *avl_replace (avl_table *, void *); #endif static int avl_init(const gsl_bst_allocator * allocator, gsl_bst_cmp_function * compare, void * params, void * vtable) { avl_table * table = (avl_table *) vtable; table->avl_alloc = allocator; table->avl_compare = compare; table->avl_param = params; table->avl_root = NULL; table->avl_count = 0; table->avl_generation = 0; return GSL_SUCCESS; } static size_t avl_nodes (const void * vtable) { const avl_table * table = (const avl_table *) vtable; return table->avl_count; } /* empty tree (delete all nodes) but do not free the tree itself */ static int avl_empty (void * vtable) { avl_table * table = (avl_table *) vtable; avl_node *p, *q; for (p = table->avl_root; p != NULL; p = q) { if (p->avl_link[0] == NULL) { q = p->avl_link[1]; table->avl_alloc->free (p, table->avl_param); } else { q = p->avl_link[0]; p->avl_link[0] = q->avl_link[1]; q->avl_link[1] = p; } } table->avl_root = NULL; table->avl_count = 0; table->avl_generation = 0; return GSL_SUCCESS; } /* avl_probe() 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 existing item without inserting |item|. Returns |NULL| in case of memory allocation failure. */ static void ** avl_probe (void * item, avl_table * table) { avl_node *y, *z; /* top node to update balance factor, and parent */ avl_node *p, *q; /* iterator, and parent */ avl_node *n; /* newly inserted node */ 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 = (avl_node *) &table->avl_root; y = table->avl_root; dir = 0; for (q = z, p = y; p != NULL; q = p, p = p->avl_link[dir]) { int cmp = table->avl_compare (item, p->avl_data, table->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; } /* allocate a new node */ n = q->avl_link[dir] = table->avl_alloc->alloc (sizeof *n, table->avl_param); if (n == NULL) return NULL; table->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) { 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) { 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; table->avl_generation++; return &n->avl_data; } /* avl_insert() Inserts |item| into |table|. Returns NULL if item successfully inserted, or if a memory allocation error occurred. Otherwise, return duplicate item. */ static void * avl_insert (void * item, void * vtable) { void **p = avl_probe (item, vtable); return p == NULL || *p == item ? NULL : *p; } /* avl_find() Search for |item| in |table| and return a pointer to item if found. Return NULL if not found. */ static void * avl_find (const void * item, const void * vtable) { const avl_table * table = (const avl_table *) vtable; avl_node *p; for (p = table->avl_root; p != NULL; ) { int cmp = table->avl_compare (item, p->avl_data, table->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; } /* avl_remove() Deletes from |table| and returns an item matching |item|. Returns a null pointer if no matching item found. */ static void * avl_remove (const void * item, void * vtable) { avl_table * table = (avl_table *) vtable; /* stack of nodes */ avl_node *pa[AVL_MAX_HEIGHT]; /* nodes */ unsigned char da[AVL_MAX_HEIGHT]; /* |link[]| indexes */ int k; /* stack pointer */ avl_node *p; /* traverses tree to find node to delete */ int cmp; /* result of comparison between |item| and |p| */ k = 0; p = (avl_node *) &table->avl_root; for (cmp = -1; cmp != 0; cmp = table->avl_compare (item, p->avl_data, table->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 { 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 { 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; } } table->avl_alloc->free (p, table->avl_param); while (--k > 0) { avl_node *y = pa[k]; if (da[k] == 0) { y->avl_balance++; if (y->avl_balance == +1) break; else if (y->avl_balance == +2) { avl_node *x = y->avl_link[1]; if (x->avl_balance == -1) { 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) { avl_node *x = y->avl_link[0]; if (x->avl_balance == +1) { 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; } } } } table->avl_count--; table->avl_generation++; return (void *) item; } #if 0 /* 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 (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; } } /* 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 (avl_node **stack, int height, 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 avl_table * avl_copy (const avl_table *org, avl_copy_func *copy, avl_item_func *destroy, struct libavl_allocator *allocator) { avl_node *stack[2 * (AVL_MAX_HEIGHT + 1)]; int height = 0; avl_table *new; const avl_node *x; avl_node *y; new = avl_alloc (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 avl_node *) &org->avl_root; y = (avl_node *) &new->avl_root; for (;;) { while (x->avl_link[0] != NULL) { y->avl_link[0] = new->allocator->alloc (sizeof *y->avl_link[0], new->avl_param); if (y->avl_link[0] == NULL) { if (y != (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++] = (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->allocator->alloc (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]; } } } #endif /* avl_t_init() Initializes |trav| for use with |tree| and selects the null node. */ static int avl_t_init (void * vtrav, const void * vtable) { avl_traverser * trav = (avl_traverser *) vtrav; const avl_table * table = (const avl_table *) vtable; trav->avl_table = table; trav->avl_node = NULL; trav->avl_height = 0; trav->avl_generation = table->avl_generation; return GSL_SUCCESS; } /* avl_t_first() Initializes |trav| for |tree| and selects and returns a pointer to its least-valued item. Returns |NULL| if |tree| contains no nodes. */ static void * avl_t_first (void * vtrav, const void * vtable) { const avl_table * table = (const avl_table *) vtable; avl_traverser * trav = (avl_traverser *) vtrav; avl_node *x; trav->avl_table = table; trav->avl_height = 0; trav->avl_generation = table->avl_generation; x = table->avl_root; if (x != NULL) { while (x->avl_link[0] != NULL) { if (trav->avl_height >= AVL_MAX_HEIGHT) { GSL_ERROR_NULL("traverser height exceeds maximum", GSL_ETABLE); } trav->avl_stack[trav->avl_height++] = x; x = x->avl_link[0]; } } trav->avl_node = x; return x != NULL ? x->avl_data : NULL; } /* avl_t_last() Initializes |trav| for |tree| and selects and returns a pointer to its greatest-valued item. Returns |NULL| if |tree| contains no nodes. */ static void * avl_t_last (void * vtrav, const void * vtable) { const avl_table * table = (const avl_table *) vtable; avl_traverser * trav = (avl_traverser *) vtrav; avl_node *x; trav->avl_table = table; trav->avl_height = 0; trav->avl_generation = table->avl_generation; x = table->avl_root; if (x != NULL) { while (x->avl_link[1] != NULL) { if (trav->avl_height >= AVL_MAX_HEIGHT) { GSL_ERROR_NULL("traverser height exceeds maximum", GSL_ETABLE); } trav->avl_stack[trav->avl_height++] = x; x = x->avl_link[1]; } } trav->avl_node = x; return x != NULL ? x->avl_data : NULL; } /* avl_t_find() Searches for |item| in |table|. If found, initializes |trav| to the item found and returns the item as well. If there is no matching item, initializes |trav| to the null item and returns |NULL|. */ static void * avl_t_find (const void * item, void * vtrav, const void * vtable) { const avl_table * table = (const avl_table *) vtable; avl_traverser * trav = (avl_traverser *) vtrav; avl_node *p, *q; trav->avl_table = table; trav->avl_height = 0; trav->avl_generation = table->avl_generation; for (p = table->avl_root; p != NULL; p = q) { int cmp = table->avl_compare (item, p->avl_data, table->avl_param); if (cmp < 0) q = p->avl_link[0]; else if (cmp > 0) q = p->avl_link[1]; else /* |cmp == 0| */ { trav->avl_node = p; return p->avl_data; } if (trav->avl_height >= AVL_MAX_HEIGHT) { GSL_ERROR_NULL("traverser height exceeds maximum", GSL_ETABLE); } trav->avl_stack[trav->avl_height++] = p; } trav->avl_height = 0; trav->avl_node = NULL; return NULL; } /* avl_t_insert() Attempts to insert |item| into |table|. If |item| is inserted successfully, it is returned and |trav| is initialized to its location. If a duplicate is found, it is returned and |trav| is initialized to its location. No replacement of the item occurs. If a memory allocation failure occurs, |NULL| is returned and |trav| is initialized to the null item. */ static void * avl_t_insert (void * item, void * vtrav, void * vtable) { avl_table * table = (avl_table *) vtable; avl_traverser * trav = (avl_traverser *) vtrav; void **p; p = avl_probe (item, table); if (p != NULL) { trav->avl_table = table; trav->avl_node = ((avl_node *) ((char *) p - offsetof (avl_node, avl_data))); trav->avl_generation = table->avl_generation - 1; return *p; } else { avl_t_init (vtrav, vtable); return NULL; } } /* avl_t_copy() Initializes |trav| to have the same current node as |src|. */ static void * avl_t_copy (void * vtrav, const void * vsrc) { const avl_traverser * src = (const avl_traverser *) vsrc; avl_traverser * trav = (avl_traverser *) vtrav; if (trav != src) { trav->avl_table = src->avl_table; trav->avl_node = src->avl_node; trav->avl_generation = src->avl_generation; if (trav->avl_generation == trav->avl_table->avl_generation) { trav->avl_height = src->avl_height; memcpy (trav->avl_stack, (const void *) src->avl_stack, sizeof *trav->avl_stack * trav->avl_height); } } return trav->avl_node != NULL ? trav->avl_node->avl_data : NULL; } /* avl_t_next() Returns the next data item in in-order within the tree being traversed with |trav|, or if there are no more data items returns NULL. */ static void * avl_t_next (void * vtrav) { avl_traverser * trav = (avl_traverser *) vtrav; avl_node *x; if (trav->avl_generation != trav->avl_table->avl_generation) avl_trav_refresh (trav); x = trav->avl_node; if (x == NULL) { return avl_t_first (vtrav, trav->avl_table); } else if (x->avl_link[1] != NULL) { if (trav->avl_height >= AVL_MAX_HEIGHT) { GSL_ERROR_NULL("traverser height exceeds maximum", GSL_ETABLE); } trav->avl_stack[trav->avl_height++] = x; x = x->avl_link[1]; while (x->avl_link[0] != NULL) { if (trav->avl_height >= AVL_MAX_HEIGHT) { GSL_ERROR_NULL("traverser height exceeds maximum", GSL_ETABLE); } trav->avl_stack[trav->avl_height++] = x; x = x->avl_link[0]; } } else { avl_node *y; do { if (trav->avl_height == 0) { trav->avl_node = NULL; return NULL; } y = x; x = trav->avl_stack[--trav->avl_height]; } while (y == x->avl_link[1]); } trav->avl_node = x; return x->avl_data; } /* avl_t_prev() Returns the previous data item in inorder within the tree being traversed with |trav|, or if there are no more data items returns NULL. */ static void * avl_t_prev (void * vtrav) { avl_traverser * trav = (avl_traverser *) vtrav; avl_node *x; if (trav->avl_generation != trav->avl_table->avl_generation) avl_trav_refresh (trav); x = trav->avl_node; if (x == NULL) { return avl_t_last (vtrav, trav->avl_table); } else if (x->avl_link[0] != NULL) { if (trav->avl_height >= AVL_MAX_HEIGHT) { GSL_ERROR_NULL("traverser height exceeds maximum", GSL_ETABLE); } trav->avl_stack[trav->avl_height++] = x; x = x->avl_link[0]; while (x->avl_link[1] != NULL) { if (trav->avl_height >= AVL_MAX_HEIGHT) { GSL_ERROR_NULL("traverser height exceeds maximum", GSL_ETABLE); } trav->avl_stack[trav->avl_height++] = x; x = x->avl_link[1]; } } else { avl_node *y; do { if (trav->avl_height == 0) { trav->avl_node = NULL; return NULL; } y = x; x = trav->avl_stack[--trav->avl_height]; } while (y == x->avl_link[0]); } trav->avl_node = x; return x->avl_data; } static void * avl_t_cur (const void * vtrav) { const avl_traverser * trav = (const avl_traverser *) vtrav; return trav->avl_node != NULL ? trav->avl_node->avl_data : NULL; } /* avl_t_replace() Replaces the current item in |trav| by |new| and returns the item replaced. |trav| must not have the null item selected. The new item must not upset the ordering of the tree. */ static void * avl_t_replace (void * vtrav, void * new_item) { avl_traverser * trav = (avl_traverser *) vtrav; void *old; old = trav->avl_node->avl_data; trav->avl_node->avl_data = new_item; return old; } /* avl_trav_refresh() Refreshes the stack of parent pointers in |trav| and updates its generation number */ static void avl_trav_refresh (avl_traverser * trav) { trav->avl_generation = trav->avl_table->avl_generation; if (trav->avl_node != NULL) { gsl_bst_cmp_function *cmp = trav->avl_table->avl_compare; void *param = trav->avl_table->avl_param; avl_node *node = trav->avl_node; avl_node *i; trav->avl_height = 0; for (i = trav->avl_table->avl_root; i != node; ) { if (trav->avl_height >= AVL_MAX_HEIGHT) { GSL_ERROR_VOID("traverser height exceeds maximum", GSL_ETABLE); } trav->avl_stack[trav->avl_height++] = i; i = i->avl_link[cmp (node->avl_data, i->avl_data, param) > 0]; } } } static const gsl_bst_type avl_tree_type = { "AVL", sizeof(avl_node), avl_init, avl_nodes, avl_insert, avl_find, avl_remove, avl_empty, avl_t_init, avl_t_first, avl_t_last, avl_t_find, avl_t_insert, avl_t_copy, avl_t_next, avl_t_prev, avl_t_cur, avl_t_replace }; const gsl_bst_type * gsl_bst_avl = &avl_tree_type; gsl-2.7.1/bst/bst.c0000644016036000116100000000703313377341702010764 00000000000000/* bst.c * * Copyright (C) 2018 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 static void * bst_malloc(size_t size, void * params); static void bst_free(void * block, void * params); static const gsl_bst_allocator bst_default_allocator = { bst_malloc, bst_free }; /* gsl_bst_alloc() Allocate binary search tree Inputs: T - tree type allocator - memory allocator compare - comparison function params - parameters to pass to allocator and compare */ gsl_bst_workspace * gsl_bst_alloc(const gsl_bst_type * T, const gsl_bst_allocator * allocator, gsl_bst_cmp_function * compare, void * params) { int status; gsl_bst_workspace *w; w = calloc(1, sizeof(gsl_bst_workspace)); if (w == NULL) { GSL_ERROR_NULL("failed to allocate bst workspace", GSL_ENOMEM); } w->type = T; status = (w->type->init)(allocator != NULL ? allocator : &bst_default_allocator, compare, params, (void *) &w->table); if (status) { gsl_bst_free(w); GSL_ERROR_NULL("failed to initialize bst", GSL_EFAILED); } return w; } void gsl_bst_free(gsl_bst_workspace * w) { /* free tree nodes */ gsl_bst_empty(w); free(w); } /* delete all nodes from tree */ int gsl_bst_empty(gsl_bst_workspace * w) { return (w->type->empty)((void *) &w->table); } /* gsl_bst_insert() Inserts |item| into tree AVL: if duplicate found, returns pointer to item without inserting AVLmult: if duplicate found, increase multiplicity for that node If no duplicate found, insert item and return pointer to item. Returns NULL if a memory allocation error occurred. */ void * gsl_bst_insert(void * item, gsl_bst_workspace * w) { return (w->type->insert)(item, (void *) &w->table); } void * gsl_bst_find(const void * item, const gsl_bst_workspace * w) { return (w->type->find)(item, (const void *) &w->table); } void * gsl_bst_remove(const void * item, gsl_bst_workspace * w) { return (w->type->remove)(item, (void *) &w->table); } /* return number of nodes in tree */ size_t gsl_bst_nodes(const gsl_bst_workspace * w) { return (w->type->nodes)((const void *) &w->table); } /* return size (in bytes) of each node in tree */ size_t gsl_bst_node_size(const gsl_bst_workspace * w) { return w->type->node_size; } const char * gsl_bst_name(const gsl_bst_workspace * w) { return w->type->name; } /********************************************** * INTERNAL ROUTINES * **********************************************/ static void * bst_malloc(size_t size, void * params) { (void) params; /* avoid unused parameter warning */ return malloc(size); } static void bst_free(void * block, void * params) { (void) params; /* avoid unused parameter warning */ free(block); } gsl-2.7.1/bst/rb.c0000644016036000116100000006326013377341712010604 00000000000000/* rb.c * * Copyright (C) 1998-2002, 2004 Free Software Foundation, Inc. * Copyright (C) 2018 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, with some modifications */ #include #include #include #include #include #include #include typedef struct gsl_bst_rb_node rb_node; typedef gsl_bst_rb_table rb_table; typedef gsl_bst_rb_traverser rb_traverser; enum rb_color { RB_BLACK, /* black */ RB_RED /* red */ }; #ifndef RB_MAX_HEIGHT #define RB_MAX_HEIGHT GSL_BST_RB_MAX_HEIGHT #endif /* tree functions */ static int rb_init(const gsl_bst_allocator * allocator, gsl_bst_cmp_function * compare, void * params, void * vtable); static size_t rb_nodes (const void * vtable); static int rb_empty (void * vtable); static void ** rb_probe (void * item, rb_table * table); static void * rb_insert (void * item, void * vtable); static void * rb_find (const void * item, const void * vtable); static void * rb_remove (const void * item, void * vtable); /* traverser functions */ static int rb_t_init (void * vtrav, const void * vtable); static void * rb_t_first (void * vtrav, const void * vtable); static void * rb_t_last (void * vtrav, const void * vtable); static void * rb_t_find (const void * item, void * vtrav, const void * vtable); static void * rb_t_insert (void * item, void * vtrav, void * vtable); static void * rb_t_copy (void * vtrav, const void * vsrc); static void * rb_t_next (void * vtrav); static void * rb_t_prev (void * vtrav); static void * rb_t_cur (const void * vtrav); static void * rb_t_replace (void * vtrav, void * new_item); static void rb_trav_refresh (rb_traverser *trav); static int rb_init(const gsl_bst_allocator * allocator, gsl_bst_cmp_function * compare, void * params, void * vtable) { rb_table * table = (rb_table *) vtable; table->rb_alloc = allocator; table->rb_compare = compare; table->rb_param = params; table->rb_root = NULL; table->rb_count = 0; table->rb_generation = 0; return GSL_SUCCESS; } static size_t rb_nodes (const void * vtable) { const rb_table * table = (const rb_table *) vtable; return table->rb_count; } /* empty tree (delete all nodes) but do not free the tree itself */ static int rb_empty (void * vtable) { rb_table * table = (rb_table *) vtable; rb_node *p, *q; for (p = table->rb_root; p != NULL; p = q) { if (p->rb_link[0] == NULL) { q = p->rb_link[1]; table->rb_alloc->free (p, table->rb_param); } else { q = p->rb_link[0]; p->rb_link[0] = q->rb_link[1]; q->rb_link[1] = p; } } table->rb_root = NULL; table->rb_count = 0; table->rb_generation = 0; return GSL_SUCCESS; } /* Inserts |item| into |table| 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 ** rb_probe (void * item, rb_table * table) { rb_node *pa[RB_MAX_HEIGHT]; /* nodes on stack */ unsigned char da[RB_MAX_HEIGHT]; /* directions moved from stack nodes */ int k; /* stack height */ rb_node *p; /* traverses tree looking for insertion point */ rb_node *n; /* newly inserted node */ pa[0] = (rb_node *) &table->rb_root; da[0] = 0; k = 1; for (p = table->rb_root; p != NULL; p = p->rb_link[da[k - 1]]) { int cmp = table->rb_compare (item, p->rb_data, table->rb_param); if (cmp == 0) return &p->rb_data; pa[k] = p; da[k++] = cmp > 0; } n = pa[k - 1]->rb_link[da[k - 1]] = table->rb_alloc->alloc (sizeof *n, table->rb_param); if (n == NULL) return NULL; n->rb_data = item; n->rb_link[0] = n->rb_link[1] = NULL; n->rb_color = RB_RED; table->rb_count++; table->rb_generation++; while (k >= 3 && pa[k - 1]->rb_color == RB_RED) { if (da[k - 2] == 0) { rb_node *y = pa[k - 2]->rb_link[1]; if (y != NULL && y->rb_color == RB_RED) { pa[k - 1]->rb_color = y->rb_color = RB_BLACK; pa[k - 2]->rb_color = RB_RED; k -= 2; } else { rb_node *x; if (da[k - 1] == 0) y = pa[k - 1]; else { x = pa[k - 1]; y = x->rb_link[1]; x->rb_link[1] = y->rb_link[0]; y->rb_link[0] = x; pa[k - 2]->rb_link[0] = y; } x = pa[k - 2]; x->rb_color = RB_RED; y->rb_color = RB_BLACK; x->rb_link[0] = y->rb_link[1]; y->rb_link[1] = x; pa[k - 3]->rb_link[da[k - 3]] = y; break; } } else { rb_node *y = pa[k - 2]->rb_link[0]; if (y != NULL && y->rb_color == RB_RED) { pa[k - 1]->rb_color = y->rb_color = RB_BLACK; pa[k - 2]->rb_color = RB_RED; k -= 2; } else { rb_node *x; if (da[k - 1] == 1) y = pa[k - 1]; else { x = pa[k - 1]; y = x->rb_link[0]; x->rb_link[0] = y->rb_link[1]; y->rb_link[1] = x; pa[k - 2]->rb_link[1] = y; } x = pa[k - 2]; x->rb_color = RB_RED; y->rb_color = RB_BLACK; x->rb_link[1] = y->rb_link[0]; y->rb_link[0] = x; pa[k - 3]->rb_link[da[k - 3]] = y; break; } } } table->rb_root->rb_color = RB_BLACK; return &n->rb_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 * rb_insert (void * item, void * vtable) { void **p = rb_probe (item, vtable); return p == NULL || *p == item ? NULL : *p; } /* Search |table| for an item matching |item|, and return it if found. Otherwise return |NULL|. */ static void * rb_find (const void * item, const void * vtable) { const rb_table * table = (const rb_table *) vtable; const rb_node *p; for (p = table->rb_root; p != NULL; ) { int cmp = table->rb_compare (item, p->rb_data, table->rb_param); if (cmp < 0) p = p->rb_link[0]; else if (cmp > 0) p = p->rb_link[1]; else /* |cmp == 0| */ return p->rb_data; } return NULL; } #if 0 /*XXX*/ /* 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. */ void * rb_replace (struct rb_table *table, void *item) { void **p = rb_probe (table, item); if (p == NULL || *p == item) return NULL; else { void *r = *p; *p = item; return r; } } #endif /* Deletes from |table| and returns an item matching |item|. Returns a null pointer if no matching item found. */ static void * rb_remove (const void * item, void * vtable) { rb_table * table = (rb_table *) vtable; rb_node *pa[RB_MAX_HEIGHT]; /* nodes on stack */ unsigned char da[RB_MAX_HEIGHT]; /* directions moved from stack nodes */ int k; /* stack height */ rb_node *p; /* the node to delete, or a node part way to it */ int cmp; /* result of comparison between |item| and |p| */ k = 0; p = (rb_node *) &table->rb_root; for (cmp = -1; cmp != 0; cmp = table->rb_compare (item, p->rb_data, table->rb_param)) { int dir = cmp > 0; pa[k] = p; da[k++] = dir; p = p->rb_link[dir]; if (p == NULL) return NULL; } item = p->rb_data; if (p->rb_link[1] == NULL) pa[k - 1]->rb_link[da[k - 1]] = p->rb_link[0]; else { enum rb_color t; rb_node *r = p->rb_link[1]; if (r->rb_link[0] == NULL) { r->rb_link[0] = p->rb_link[0]; t = r->rb_color; r->rb_color = p->rb_color; p->rb_color = t; pa[k - 1]->rb_link[da[k - 1]] = r; da[k] = 1; pa[k++] = r; } else { rb_node *s; int j = k++; for (;;) { da[k] = 0; pa[k++] = r; s = r->rb_link[0]; if (s->rb_link[0] == NULL) break; r = s; } da[j] = 1; pa[j] = s; pa[j - 1]->rb_link[da[j - 1]] = s; s->rb_link[0] = p->rb_link[0]; r->rb_link[0] = s->rb_link[1]; s->rb_link[1] = p->rb_link[1]; t = s->rb_color; s->rb_color = p->rb_color; p->rb_color = t; } } if (p->rb_color == RB_BLACK) { for (;;) { rb_node *x = pa[k - 1]->rb_link[da[k - 1]]; if (x != NULL && x->rb_color == RB_RED) { x->rb_color = RB_BLACK; break; } if (k < 2) break; if (da[k - 1] == 0) { rb_node *w = pa[k - 1]->rb_link[1]; if (w->rb_color == RB_RED) { w->rb_color = RB_BLACK; pa[k - 1]->rb_color = RB_RED; pa[k - 1]->rb_link[1] = w->rb_link[0]; w->rb_link[0] = pa[k - 1]; pa[k - 2]->rb_link[da[k - 2]] = w; pa[k] = pa[k - 1]; da[k] = 0; pa[k - 1] = w; k++; w = pa[k - 1]->rb_link[1]; } if ((w->rb_link[0] == NULL || w->rb_link[0]->rb_color == RB_BLACK) && (w->rb_link[1] == NULL || w->rb_link[1]->rb_color == RB_BLACK)) w->rb_color = RB_RED; else { if (w->rb_link[1] == NULL || w->rb_link[1]->rb_color == RB_BLACK) { rb_node *y = w->rb_link[0]; y->rb_color = RB_BLACK; w->rb_color = RB_RED; w->rb_link[0] = y->rb_link[1]; y->rb_link[1] = w; w = pa[k - 1]->rb_link[1] = y; } w->rb_color = pa[k - 1]->rb_color; pa[k - 1]->rb_color = RB_BLACK; w->rb_link[1]->rb_color = RB_BLACK; pa[k - 1]->rb_link[1] = w->rb_link[0]; w->rb_link[0] = pa[k - 1]; pa[k - 2]->rb_link[da[k - 2]] = w; break; } } else { rb_node *w = pa[k - 1]->rb_link[0]; if (w->rb_color == RB_RED) { w->rb_color = RB_BLACK; pa[k - 1]->rb_color = RB_RED; pa[k - 1]->rb_link[0] = w->rb_link[1]; w->rb_link[1] = pa[k - 1]; pa[k - 2]->rb_link[da[k - 2]] = w; pa[k] = pa[k - 1]; da[k] = 1; pa[k - 1] = w; k++; w = pa[k - 1]->rb_link[0]; } if ((w->rb_link[0] == NULL || w->rb_link[0]->rb_color == RB_BLACK) && (w->rb_link[1] == NULL || w->rb_link[1]->rb_color == RB_BLACK)) w->rb_color = RB_RED; else { if (w->rb_link[0] == NULL || w->rb_link[0]->rb_color == RB_BLACK) { rb_node *y = w->rb_link[1]; y->rb_color = RB_BLACK; w->rb_color = RB_RED; w->rb_link[1] = y->rb_link[0]; y->rb_link[0] = w; w = pa[k - 1]->rb_link[0] = y; } w->rb_color = pa[k - 1]->rb_color; pa[k - 1]->rb_color = RB_BLACK; w->rb_link[0]->rb_color = RB_BLACK; pa[k - 1]->rb_link[0] = w->rb_link[1]; w->rb_link[1] = pa[k - 1]; pa[k - 2]->rb_link[da[k - 2]] = w; break; } } k--; } } table->rb_alloc->free (p, table->rb_param); table->rb_count--; table->rb_generation++; return (void *) item; } /* Initializes |trav| for use with |tree| and selects the null node. */ static int rb_t_init (void * vtrav, const void * vtable) { rb_traverser * trav = (rb_traverser *) vtrav; const rb_table * table = (const rb_table *) vtable; trav->rb_table = table; trav->rb_node = NULL; trav->rb_height = 0; trav->rb_generation = table->rb_generation; return GSL_SUCCESS; } /* Initializes |trav| for |table| and selects and returns a pointer to its least-valued item. Returns |NULL| if |table| contains no nodes. */ static void * rb_t_first (void * vtrav, const void * vtable) { const rb_table * table = (const rb_table *) vtable; rb_traverser * trav = (rb_traverser *) vtrav; rb_node *x; trav->rb_table = table; trav->rb_height = 0; trav->rb_generation = table->rb_generation; x = table->rb_root; if (x != NULL) { while (x->rb_link[0] != NULL) { if (trav->rb_height >= RB_MAX_HEIGHT) { GSL_ERROR_NULL ("traverser height exceeds maximum", GSL_ETABLE); } trav->rb_stack[trav->rb_height++] = x; x = x->rb_link[0]; } } trav->rb_node = x; return x != NULL ? x->rb_data : NULL; } /* Initializes |trav| for |table| and selects and returns a pointer to its greatest-valued item. Returns |NULL| if |table| contains no nodes. */ static void * rb_t_last (void * vtrav, const void * vtable) { const rb_table * table = (const rb_table *) vtable; rb_traverser * trav = (rb_traverser *) vtrav; rb_node *x; trav->rb_table = table; trav->rb_height = 0; trav->rb_generation = table->rb_generation; x = table->rb_root; if (x != NULL) { while (x->rb_link[1] != NULL) { if (trav->rb_height >= RB_MAX_HEIGHT) { GSL_ERROR_NULL ("traverser height exceeds maximum", GSL_ETABLE); } trav->rb_stack[trav->rb_height++] = x; x = x->rb_link[1]; } } trav->rb_node = x; return x != NULL ? x->rb_data : NULL; } /* Searches for |item| in |table|. If found, initializes |trav| to the item found and returns the item as well. If there is no matching item, initializes |trav| to the null item and returns |NULL|. */ static void * rb_t_find (const void * item, void * vtrav, const void * vtable) { const rb_table * table = (const rb_table *) vtable; rb_traverser * trav = (rb_traverser *) vtrav; rb_node *p, *q; trav->rb_table = table; trav->rb_height = 0; trav->rb_generation = table->rb_generation; for (p = table->rb_root; p != NULL; p = q) { int cmp = table->rb_compare (item, p->rb_data, table->rb_param); if (cmp < 0) q = p->rb_link[0]; else if (cmp > 0) q = p->rb_link[1]; else /* |cmp == 0| */ { trav->rb_node = p; return p->rb_data; } if (trav->rb_height >= RB_MAX_HEIGHT) { GSL_ERROR_NULL ("traverser height exceeds maximum", GSL_ETABLE); } trav->rb_stack[trav->rb_height++] = p; } trav->rb_height = 0; trav->rb_node = NULL; return NULL; } /* Attempts to insert |item| into |table|. If |item| is inserted successfully, it is returned and |trav| is initialized to its location. If a duplicate is found, it is returned and |trav| is initialized to its location. No replacement of the item occurs. If a memory allocation failure occurs, |NULL| is returned and |trav| is initialized to the null item. */ static void * rb_t_insert (void * item, void * vtrav, void * vtable) { rb_table * table = (rb_table *) vtable; rb_traverser * trav = (rb_traverser *) vtrav; void **p; p = rb_probe (item, table); if (p != NULL) { trav->rb_table = table; trav->rb_node = ((rb_node *) ((char *) p - offsetof (rb_node, rb_data))); trav->rb_generation = table->rb_generation - 1; return *p; } else { rb_t_init (vtrav, vtable); return NULL; } } /* Initializes |trav| to have the same current node as |src|. */ static void * rb_t_copy (void * vtrav, const void * vsrc) { const rb_traverser * src = (const rb_traverser *) vsrc; rb_traverser * trav = (rb_traverser *) vtrav; if (trav != src) { trav->rb_table = src->rb_table; trav->rb_node = src->rb_node; trav->rb_generation = src->rb_generation; if (trav->rb_generation == trav->rb_table->rb_generation) { trav->rb_height = src->rb_height; memcpy (trav->rb_stack, (const void *) src->rb_stack, sizeof *trav->rb_stack * trav->rb_height); } } return trav->rb_node != NULL ? trav->rb_node->rb_data : NULL; } /* Returns the next data item in inorder within the tree being traversed with |trav|, or if there are no more data items returns |NULL|. */ static void * rb_t_next (void * vtrav) { rb_traverser * trav = (rb_traverser *) vtrav; rb_node *x; if (trav->rb_generation != trav->rb_table->rb_generation) rb_trav_refresh (trav); x = trav->rb_node; if (x == NULL) { return rb_t_first (vtrav, trav->rb_table); } else if (x->rb_link[1] != NULL) { if (trav->rb_height >= RB_MAX_HEIGHT) { GSL_ERROR_NULL ("traverser height exceeds maximum", GSL_ETABLE); } trav->rb_stack[trav->rb_height++] = x; x = x->rb_link[1]; while (x->rb_link[0] != NULL) { if (trav->rb_height >= RB_MAX_HEIGHT) { GSL_ERROR_NULL ("traverser height exceeds maximum", GSL_ETABLE); } trav->rb_stack[trav->rb_height++] = x; x = x->rb_link[0]; } } else { rb_node *y; do { if (trav->rb_height == 0) { trav->rb_node = NULL; return NULL; } y = x; x = trav->rb_stack[--trav->rb_height]; } while (y == x->rb_link[1]); } trav->rb_node = x; return x->rb_data; } /* Returns the previous data item in inorder within the tree being traversed with |trav|, or if there are no more data items returns |NULL|. */ static void * rb_t_prev (void * vtrav) { rb_traverser * trav = (rb_traverser *) vtrav; rb_node *x; if (trav->rb_generation != trav->rb_table->rb_generation) rb_trav_refresh (trav); x = trav->rb_node; if (x == NULL) { return rb_t_last (vtrav, trav->rb_table); } else if (x->rb_link[0] != NULL) { if (trav->rb_height >= RB_MAX_HEIGHT) { GSL_ERROR_NULL ("traverser height exceeds maximum", GSL_ETABLE); } trav->rb_stack[trav->rb_height++] = x; x = x->rb_link[0]; while (x->rb_link[1] != NULL) { if (trav->rb_height >= RB_MAX_HEIGHT) { GSL_ERROR_NULL ("traverser height exceeds maximum", GSL_ETABLE); } trav->rb_stack[trav->rb_height++] = x; x = x->rb_link[1]; } } else { rb_node *y; do { if (trav->rb_height == 0) { trav->rb_node = NULL; return NULL; } y = x; x = trav->rb_stack[--trav->rb_height]; } while (y == x->rb_link[0]); } trav->rb_node = x; return x->rb_data; } /* Returns |trav|'s current item. */ static void * rb_t_cur (const void * vtrav) { const rb_traverser * trav = (const rb_traverser *) vtrav; return trav->rb_node != NULL ? trav->rb_node->rb_data : NULL; } /* Replaces the current item in |trav| by |new| and returns the item replaced. |trav| must not have the null item selected. The new item must not upset the ordering of the tree. */ static void * rb_t_replace (void * vtrav, void * new_item) { rb_traverser * trav = (rb_traverser *) vtrav; void *old; old = trav->rb_node->rb_data; trav->rb_node->rb_data = new_item; return old; } #if 0 /*XXX*/ /* Destroys |new| with |rb_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 (rb_node **stack, int height, struct rb_table *new, rb_item_func *destroy) { assert (stack != NULL && height >= 0 && new != NULL); for (; height > 2; height -= 2) stack[height - 1]->rb_link[1] = NULL; rb_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. */ struct rb_table * rb_copy (const struct rb_table *org, rb_copy_func *copy, rb_item_func *destroy, struct libavl_allocator *allocator) { rb_node *stack[2 * (RB_MAX_HEIGHT + 1)]; int height = 0; struct rb_table *new; const rb_node *x; rb_node *y; assert (org != NULL); new = rb_create (org->rb_compare, org->rb_param, allocator != NULL ? allocator : org->rb_alloc); if (new == NULL) return NULL; new->rb_count = org->rb_count; if (new->rb_count == 0) return new; x = (const rb_node *) &org->rb_root; y = (rb_node *) &new->rb_root; for (;;) { while (x->rb_link[0] != NULL) { assert (height < 2 * (RB_MAX_HEIGHT + 1)); y->rb_link[0] = new->rb_alloc->libavl_malloc (new->rb_alloc, sizeof *y->rb_link[0]); if (y->rb_link[0] == NULL) { if (y != (rb_node *) &new->rb_root) { y->rb_data = NULL; y->rb_link[1] = NULL; } copy_error_recovery (stack, height, new, destroy); return NULL; } stack[height++] = (rb_node *) x; stack[height++] = y; x = x->rb_link[0]; y = y->rb_link[0]; } y->rb_link[0] = NULL; for (;;) { y->rb_color = x->rb_color; if (copy == NULL) y->rb_data = x->rb_data; else { y->rb_data = copy (x->rb_data, org->rb_param); if (y->rb_data == NULL) { y->rb_link[1] = NULL; copy_error_recovery (stack, height, new, destroy); return NULL; } } if (x->rb_link[1] != NULL) { y->rb_link[1] = new->rb_alloc->libavl_malloc (new->rb_alloc, sizeof *y->rb_link[1]); if (y->rb_link[1] == NULL) { copy_error_recovery (stack, height, new, destroy); return NULL; } x = x->rb_link[1]; y = y->rb_link[1]; break; } else y->rb_link[1] = NULL; if (height <= 2) return new; y = stack[--height]; x = stack[--height]; } } } #endif /* Refreshes the stack of parent pointers in |trav| and updates its generation number. */ static void rb_trav_refresh (rb_traverser *trav) { trav->rb_generation = trav->rb_table->rb_generation; if (trav->rb_node != NULL) { gsl_bst_cmp_function *cmp = trav->rb_table->rb_compare; void *param = trav->rb_table->rb_param; rb_node *node = trav->rb_node; rb_node *i; trav->rb_height = 0; for (i = trav->rb_table->rb_root; i != node; ) { if (trav->rb_height >= RB_MAX_HEIGHT) { GSL_ERROR_VOID ("traverser height exceeds maximum", GSL_ETABLE); } trav->rb_stack[trav->rb_height++] = i; i = i->rb_link[cmp (node->rb_data, i->rb_data, param) > 0]; } } } static const gsl_bst_type rb_tree_type = { "red-black", sizeof(rb_node), rb_init, rb_nodes, rb_insert, rb_find, rb_remove, rb_empty, rb_t_init, rb_t_first, rb_t_last, rb_t_find, rb_t_insert, rb_t_copy, rb_t_next, rb_t_prev, rb_t_cur, rb_t_replace }; const gsl_bst_type * gsl_bst_rb = &rb_tree_type; gsl-2.7.1/bst/trav.c0000644016036000116100000000772513377341724011164 00000000000000/* trav.c * * Copyright (C) 2018 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 int gsl_bst_trav_init(gsl_bst_trav * trav, const gsl_bst_workspace * w) { int status = (w->type->trav_init)((void *) &trav->trav_data, (const void *) &w->table); trav->type = w->type; return status; } /* gsl_bst_trav_first() Initialize traverser to least-valued item in tree and return a pointer to it. Return NULL if tree has no nodes. */ void * gsl_bst_trav_first(gsl_bst_trav * trav, const gsl_bst_workspace * w) { trav->type = w->type; return (w->type->trav_first)((void *) &trav->trav_data, (const void *) &w->table); } /* gsl_bst_trav_last() Initializes |trav| for |tree| and selects and returns a pointer to its greatest-valued item. Returns NULL if |tree| contains no nodes. */ void * gsl_bst_trav_last (gsl_bst_trav * trav, const gsl_bst_workspace * w) { trav->type = w->type; return (w->type->trav_last)((void * ) &trav->trav_data, (const void *) &w->table); } /* gsl_bst_trav_find() Searches for |item| in tree. If found, initializes |trav| to the item found and returns the item as well. If there is no matching item, initializes |trav| to the null item and returns |NULL|. */ void * gsl_bst_trav_find (const void * item, gsl_bst_trav * trav, const gsl_bst_workspace * w) { trav->type = w->type; return (w->type->trav_find)(item, (void * ) &trav->trav_data, (const void *) &w->table); } /* gsl_bst_trav_insert() Attempts to insert |item| into tree. If |item| is inserted successfully, it is returned and |trav| is initialized to its location. If a duplicate is found, it is returned and |trav| is initialized to its location. No replacement of the item occurs. If a memory allocation failure occurs, |NULL| is returned and |trav| is initialized to the null item. */ void * gsl_bst_trav_insert (void * item, gsl_bst_trav * trav, gsl_bst_workspace * w) { trav->type = w->type; return (w->type->trav_insert)(item, (void * ) &trav->trav_data, (void *) &w->table); } /* gsl_bst_trav_copy() Copy traverser 'src' into 'dest' */ void * gsl_bst_trav_copy(gsl_bst_trav * dest, const gsl_bst_trav * src) { dest->type = src->type; return (src->type->trav_copy)((void * ) &dest->trav_data, (const void *) &src->trav_data); } /* gsl_bst_trav_next() Update traverser to point to next sequential node, and return a pointer to its data */ void * gsl_bst_trav_next(gsl_bst_trav * trav) { return (trav->type->trav_next)((void *) &trav->trav_data); } /* gsl_bst_trav_prev() Update traverser to point to previous sequential node, and return a pointer to its data */ void * gsl_bst_trav_prev(gsl_bst_trav * trav) { return (trav->type->trav_prev)((void *) &trav->trav_data); } /* gsl_bst_trav_cur() Return a pointer to data of current traverser node */ void * gsl_bst_trav_cur(const gsl_bst_trav * trav) { return (trav->type->trav_cur)((const void *) &trav->trav_data); } /* gsl_bst_trav_replace() Replace current item in trav with new_item and returns the item replaced. The new item must not change the ordering of the tree. */ void * gsl_bst_trav_replace (gsl_bst_trav * trav, void * new_item) { return (trav->type->trav_replace)((void * ) &trav->trav_data, new_item); } gsl-2.7.1/bst/test.c0000644016036000116100000002257113377341754011166 00000000000000/* test.c * * Copyright (C) 2018 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 enum array_order { ORD_RANDOM = 0, /* random order */ ORD_ASCENDING, /* ascending order */ ORD_DESCENDING, /* descending order */ ORD_BALANCED, /* balanced tree order */ ORD_ZIGZAG, /* zig-zag order */ ORD_ASCENDING_SHIFTED, /* ascending from middle, then beginning */ ORD_END_NODUP, /* end of no-duplicate ordering */ ORD_RANDOM_DUP /* random order with duplicates */ }; /* fill array[] with random integers in [lower,upper] with duplicates allowed */ static void random_integers(const size_t n, const int lower, const int upper, int array[], gsl_rng * r) { size_t i; for (i = 0; i < n; ++i) array[i] = (int) ((upper - lower) * gsl_rng_uniform(r) + lower); } /* fills array[] with a random permutation of the integers between 0 and n - 1 */ static void random_permuted_integers (const size_t n, int array[], gsl_rng * r) { size_t i; for (i = 0; i < n; i++) array[i] = i; for (i = 0; i < n; i++) { size_t j = i + (unsigned) (gsl_rng_uniform(r) * (n - i)); int t = array[j]; array[j] = array[i]; array[i] = t; } } static int compare_ints(const void *pa, const void *pb, void *params) { const int *a = pa; const int *b = pb; (void) params; return (*a < *b) ? -1 : (*a > *b); } /* Generates a list of integers that produce a balanced tree when inserted in order into a binary tree in the usual way. |min| and |max| inclusively bound the values to be inserted. Output is deposited starting at |*array|. */ static void gen_balanced_tree (const int min, const int max, int **array) { int i; if (min > max) return; i = (min + max + 1) / 2; *(*array)++ = i; gen_balanced_tree (min, i - 1, array); gen_balanced_tree (i + 1, max, array); } /* generates a permutation of the integers |0| to |n - 1| */ static void gen_int_array (const size_t n, const enum array_order order, int array[], gsl_rng * r) { size_t i; switch (order) { case ORD_RANDOM: random_permuted_integers (n, array, r); break; case ORD_ASCENDING: for (i = 0; i < n; i++) array[i] = i; break; case ORD_DESCENDING: for (i = 0; i < n; i++) array[i] = n - i - 1; break; case ORD_BALANCED: gen_balanced_tree (0, n - 1, &array); break; case ORD_ZIGZAG: for (i = 0; i < n; i++) { if (i % 2 == 0) array[i] = i / 2; else array[i] = n - i / 2 - 1; } break; case ORD_ASCENDING_SHIFTED: for (i = 0; i < n; i++) { array[i] = i + n / 2; if ((size_t) array[i] >= n) array[i] -= n; } break; case ORD_RANDOM_DUP: random_integers(n, -10, 10, array, r); break; default: assert (0); } } static void check_traverser(const size_t n, const enum array_order order, gsl_bst_trav * trav, int data, const char *desc, const gsl_bst_workspace * w) { int *prev, *cur, *next; prev = gsl_bst_trav_prev(trav); if (prev != NULL) { gsl_test(*prev > data, "bst %s[n=%zu,order=%d] %s traverser ahead of %d, but should be ahead of %d", gsl_bst_name(w), n, order, desc, *prev, data); } gsl_bst_trav_next(trav); cur = gsl_bst_trav_cur(trav); gsl_test(*cur != data, "bst %s[n=%zu,order=%d] %s traverser at %d, but should be at %d", gsl_bst_name(w), n, order, desc, *cur, data); next = gsl_bst_trav_next(trav); if (next != NULL) { gsl_test(*next < data, "bst %s[n=%zu,order=%d] %s traverser behind %d, but should be behind %d", gsl_bst_name(w), n, order, desc, *next, data); } gsl_bst_trav_prev(trav); } static void test_bst_int(const size_t n, const gsl_bst_type * T, const enum array_order order, gsl_rng * r) { int *data = malloc(n * sizeof(int)); int *data_delete = malloc(n * sizeof(int)); int *sorted_data = malloc(n * sizeof(int)); gsl_bst_workspace * w = gsl_bst_alloc(T, NULL, compare_ints, NULL); gsl_bst_trav trav; int *p; int i; size_t nodes; /* generate data to be inserted in tree */ gen_int_array(n, order, data, r); for (i = 0; i < (int) n; ++i) sorted_data[i] = data[i]; gsl_sort_int(sorted_data, 1, n); if (order != ORD_RANDOM_DUP) { /* generate random order to delete data from tree */ gen_int_array(n, ORD_RANDOM, data_delete, r); } else { for (i = 0; i < (int) n; ++i) data_delete[i] = sorted_data[i]; } /* insert data */ for (i = 0; i < (int) n; ++i) { p = gsl_bst_insert(&data[i], w); gsl_test(p != NULL, "bst_int %s[n=%zu,order=%d] insert i=%d", gsl_bst_name(w), n, order, i); } if (order != ORD_RANDOM_DUP) { nodes = gsl_bst_nodes(w); gsl_test(nodes != n, "bst_int %s[n=%zu,order=%d] after insertion count = %zu/%zu", gsl_bst_name(w), n, order, nodes, n); } /* test data was inserted and can be found */ for (i = 0; i < (int) n; ++i) { p = gsl_bst_find(&data[i], w); gsl_test(*p != data[i], "bst_int %s[n=%zu,order=%d] find [%d,%d]", gsl_bst_name(w), n, order, *p, data[i]); p = gsl_bst_trav_find(&data[i], &trav, w); gsl_test(p == NULL, "bst_int %s[n=%zu,order=%d] trav_find unable to find item %d", gsl_bst_name(w), n, order, data[i]); check_traverser(n, order, &trav, data[i], "post-insertion", w); } /* traverse tree in-order */ p = gsl_bst_trav_first(&trav, w); i = 0; while (p != NULL) { int *q = gsl_bst_trav_cur(&trav); gsl_test(*p != sorted_data[i], "bst_int %s[n=%zu,order=%d] traverse i=%d [%d,%d]", gsl_bst_name(w), n, order, i, *p, sorted_data[i]); gsl_test(*p != *q, "bst_int %s[n=%zu,order=%d] traverse cur i=%d [%d,%d]", gsl_bst_name(w), n, order, i, *p, *q); p = gsl_bst_trav_next(&trav); ++i; } gsl_test(i != (int) n, "bst_int %s[n=%zu,order=%d] traverse number=%d", gsl_bst_name(w), n, order, i); /* traverse tree in reverse order */ p = gsl_bst_trav_last(&trav, w); i = n - 1; while (p != NULL) { int *q = gsl_bst_trav_cur(&trav); gsl_test(*p != sorted_data[i], "bst_int %s[n=%zu,order=%d] traverse reverse i=%d [%d,%d]", gsl_bst_name(w), n, order, i, *p, sorted_data[i]); gsl_test(*p != *q, "bst_int %s[n=%zu,order=%d] traverse reverse cur i=%d [%d,%d]", gsl_bst_name(w), n, order, i, *p, *q); p = gsl_bst_trav_prev(&trav); --i; } gsl_test(i != -1, "bst_int %s[n=%zu,order=%d] traverse reverse number=%d", gsl_bst_name(w), n, order, i); /* test traversal during tree modifications */ for (i = 0; i < (int) n; ++i) { gsl_bst_trav x, y, z; gsl_bst_trav_find(&data[i], &x, w); check_traverser(n, order, &x, data[i], "pre-deletion", w); if (data[i] == data_delete[i]) continue; p = gsl_bst_remove(&data_delete[i], w); gsl_test(*p != data_delete[i], "bst_int %s[n=%zu,order=%d] remove i=%d [%d,%d]", gsl_bst_name(w), n, order, i, *p, data_delete[i]); p = gsl_bst_trav_copy(&y, &x); gsl_test(*p != data[i], "bst_int %s[n=%zu,order=%d] copy i=%d [%d,%d]", gsl_bst_name(w), n, order, i, *p, data[i]); /* re-insert item */ p = gsl_bst_trav_insert(&data_delete[i], &z, w); check_traverser(n, order, &x, data[i], "post-deletion", w); check_traverser(n, order, &y, data[i], "copied", w); check_traverser(n, order, &z, data_delete[i], "insertion", w); #if 0 /* delete again */ gsl_bst_remove(&data[i], w); #endif } /* emmpty tree */ gsl_bst_empty(w); nodes = gsl_bst_nodes(w); gsl_test(nodes != 0, "bst_int %s[n=%zu,order=%d] empty count = %zu", gsl_bst_name(w), n, order, nodes); gsl_bst_free(w); free(data); free(data_delete); free(sorted_data); } static void test_bst(const gsl_bst_type * T, gsl_rng * r) { enum array_order order; for (order = 0; order < ORD_END_NODUP; ++order) { test_bst_int(50, T, order, r); test_bst_int(100, T, order, r); test_bst_int(500, T, order, r); } } int main(void) { gsl_rng * r = gsl_rng_alloc(gsl_rng_default); test_bst(gsl_bst_avl, r); test_bst(gsl_bst_rb, r); gsl_rng_free(r); exit (gsl_test_summary()); } gsl-2.7.1/const/0000755016036000116100000000000014151602574010441 500000000000000gsl-2.7.1/const/Makefile.am0000644016036000116100000000054213373111454012413 00000000000000pkginclude_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-2.7.1/const/gsl_const.h0000644016036000116100000000204013135126237012517 00000000000000/* 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-2.7.1/const/gsl_const_cgs.h0000644016036000116100000001413013373111454013355 00000000000000/* 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-2.7.1/const/gsl_const_mks.h0000644016036000116100000001542113373111454013377 00000000000000/* 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-2.7.1/const/gsl_const_cgsm.h0000644016036000116100000001517313373111454013542 00000000000000/* 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-2.7.1/const/gsl_const_mksa.h0000644016036000116100000001557213373111454013547 00000000000000/* 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-2.7.1/const/gsl_const_num.h0000644016036000116100000000334113373111454013402 00000000000000/* 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-2.7.1/const/Makefile.in0000644016036000116100000010303214151557214012425 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/const/ChangeLog0000644016036000116100000000511013373111454012125 000000000000002009-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-2.7.1/const/TODO0000644016036000116100000000014413373111454011045 00000000000000# -*- org -*- #+CATEGORY: const could add RADIATION_DENSITY_CONSTANT (7.56591e-16) /* J m-3 K-4 */ gsl-2.7.1/const/test.c0000644016036000116100000000525513135126237011511 00000000000000/* 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-2.7.1/complex/0000755016036000116100000000000014151602574010762 500000000000000gsl-2.7.1/complex/Makefile.am0000644016036000116100000000167114002204234012725 00000000000000noinst_LTLIBRARIES = libgslcomplex.la pkginclude_HEADERS = gsl_complex.h gsl_complex_math.h test_source.c AM_CPPFLAGS = -I$(top_srcdir) libgslcomplex_la_SOURCES = math.c inline.c TESTS = $(check_PROGRAMS) check_PROGRAMS = test test_c11 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 test_c11_SOURCES = $(test_SOURCES) test_c11_CFLAGS = -DTEST_C11 test_c11_LDADD = $(test_LDADD) 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-2.7.1/complex/gsl_complex.h0000644016036000116100000001315314055214522013365 00000000000000/* complex/gsl_complex.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough * Copyright (C) 2020, 2021 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_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 ; /* * If is included, use the C99 complex type. Otherwise * define a type bit-compatible with C99 complex. The GSL_REAL and GSL_IMAG * macros require C11 functionality also (_Generic) */ /* older gcc compilers claim to be C11 compliant but do not support _Generic */ #if defined(__GNUC__) && (__GNUC__ < 7) # define GSL_COMPLEX_LEGACY 1 #endif #if !defined(GSL_COMPLEX_LEGACY) && \ defined(_Complex_I) && \ defined(complex) && \ defined(I) && \ defined(__STDC__) && (__STDC__ == 1) && \ defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */ # define GSL_COMPLEX_DEFINE(R, C) typedef R _Complex C ; # define GSL_COMPLEX_P(zp) (&(zp)) # define GSL_COMPLEX_EQ(z1,z2) ((z1) == (z2)) # define GSL_SET_COMPLEX(zp,x,y) (*(zp) = (x) + I * (y)) # define GSL_REAL(z) (_Generic((z), \ complex float : ((float *) &(z)), \ complex double : ((double *) &(z)), \ complex long double : ((long double *) &(z)))[0]) # define GSL_IMAG(z) (_Generic((z), \ complex float : ((float *) &(z)), \ complex double : ((double *) &(z)), \ complex long double : ((long double *) &(z)))[1]) # define GSL_COMPLEX_P_REAL(zp) GSL_REAL(*(zp)) # define GSL_COMPLEX_P_IMAG(zp) GSL_IMAG(*(zp)) # define GSL_SET_REAL(zp,x) do { GSL_REAL(*(zp)) = (x); } while(0) # define GSL_SET_IMAG(zp,x) do { GSL_IMAG(*(zp)) = (x); } while(0) #else /* legacy complex definitions */ /* * According to the C17 standard, 6.2.5 paragraph 13: * * "Each complex type has the same representation and alignment requirements * as an array type containing exactly two elements of the corresponding real * type; the first element is equal to the real part, and the second element to * the imaginary part, of the complex number." */ /*# define GSL_COMPLEX_DEFINE(R, C) typedef R C[2]*/ # define GSL_COMPLEX_DEFINE(R, C) typedef struct { R dat[2]; } C ; # 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) #endif GSL_COMPLEX_DEFINE(double, gsl_complex) GSL_COMPLEX_DEFINE(long double, gsl_complex_long_double) GSL_COMPLEX_DEFINE(float, gsl_complex_float) #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-2.7.1/complex/gsl_complex_math.h0000644016036000116100000001364013373111454014401 00000000000000/* 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-2.7.1/complex/test_source.c0000644016036000116100000001613714002204234013377 00000000000000/* complex/test_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Brian Gough * Copyright (C) 2021 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. */ 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 static int FUNCTION (test, all) () { size_t i = 0; #if defined(BASE_DOUBLE) const double tol = GSL_DBL_EPSILON; #endif gsl_ieee_env_setup(); for (i = 0 ; i < 10; i++) { ATOMIC x = (i - 5.0) * 0.3; ATOMIC y = (i + 2.1) * 0.5; TYPE(gsl_complex) z = gsl_complex_rect(x, y); gsl_test_rel (GSL_REAL(z), x, tol, "gsl_complex_rect real part at (x=%g,y=%g)", x, y); gsl_test_rel (GSL_IMAG(z), y, tol, "gsl_complex_rect imag part at (x=%g,y=%g)", x, y); GSL_REAL(z) = y; gsl_test_rel (GSL_REAL(z), y, tol, "assignment real part (%g)", y); GSL_IMAG(z) = x; gsl_test_rel (GSL_IMAG(z), x, tol, "assignment imag part (%g)", x); } for (i = 0 ; i < 10; i++) { ATOMIC r = (i - 5.0) * 0.3 ; ATOMIC t = 2.0 * M_PI * i / 5 ; ATOMIC x = r * cos(t), y = r * sin(t) ; TYPE(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]; TYPE(gsl_complex) z = gsl_complex_rect (t.x, t.y); ATOMIC 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]; TYPE(gsl_complex) z = gsl_complex_rect (t.x, t.y); TYPE(gsl_complex) fz = (t.f) (z); ATOMIC fx = GSL_REAL (fz), fy = GSL_IMAG (fz); #ifdef DEBUG printf("x = "); gsl_ieee_fprintf_double (stdout, &t.x); printf("\n"); printf("y = "); gsl_ieee_fprintf_double (stdout, &t.y); printf("\n"); printf("fx = "); gsl_ieee_fprintf_double (stdout, &fx); printf("\n"); printf("ex = "); gsl_ieee_fprintf_double (stdout, &t.fx); printf("\n"); printf("fy = "); gsl_ieee_fprintf_double (stdout, &fy); printf("\n"); printf("ey = "); gsl_ieee_fprintf_double (stdout, &t.fy); printf("\n"); #endif gsl_test_rel (fx, t.fx, 10.0 * tol, "%s real part at (%g,%g)", t.name, t.x, t.y); gsl_test_rel (fy, t.fy, 10.0 * 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]; TYPE(gsl_complex) z1 = gsl_complex_rect (t.x1, t.y1); TYPE(gsl_complex) z2 = gsl_complex_rect (t.x2, t.y2); TYPE(gsl_complex) fz = (t.f) (z1, z2); ATOMIC 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, 1.0e3 * tol, "%s real part at (%g,%g;%g,%g)", t.name, t.x1, t.y1, t.x2, t.y2); gsl_test_rel (fy, t.fy, 1.0e3 * tol, "%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]; TYPE(gsl_complex) fz = (t.f) (t.x); ATOMIC 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]; TYPE(gsl_complex) z = gsl_complex_rect (t.x, t.y); TYPE(gsl_complex) fz = (t.f) (z, t.a); ATOMIC 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, 10.0 * tol, "%s real part at (%g,0)", t.name, t.x); gsl_test_rel (fy, t.fy, 10.0 * tol, "%s imag part at (%g,0)", t.name, t.x); i++; } return 0; } gsl-2.7.1/complex/Makefile.in0000644016036000116100000011402014151557214012745 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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_c11$(EXEEXT) subdir = complex 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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__objects_1 = test_c11-test.$(OBJEXT) am_test_c11_OBJECTS = $(am__objects_1) test_c11_OBJECTS = $(am_test_c11_OBJECTS) test_c11_DEPENDENCIES = $(test_LDADD) test_c11_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test_c11_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/inline.Plo ./$(DEPDIR)/math.Plo \ ./$(DEPDIR)/test.Po ./$(DEPDIR)/test_c11-test.Po 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) \ $(test_c11_SOURCES) DIST_SOURCES = $(libgslcomplex_la_SOURCES) $(test_SOURCES) \ $(test_c11_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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 test_source.c 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 test_c11_SOURCES = $(test_SOURCES) test_c11_CFLAGS = -DTEST_C11 test_c11_LDADD = $(test_LDADD) 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) test_c11$(EXEEXT): $(test_c11_OBJECTS) $(test_c11_DEPENDENCIES) $(EXTRA_test_c11_DEPENDENCIES) @rm -f test_c11$(EXEEXT) $(AM_V_CCLD)$(test_c11_LINK) $(test_c11_OBJECTS) $(test_c11_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/math.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_c11-test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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 $@ $< test_c11-test.o: test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_c11_CFLAGS) $(CFLAGS) -MT test_c11-test.o -MD -MP -MF $(DEPDIR)/test_c11-test.Tpo -c -o test_c11-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_c11-test.Tpo $(DEPDIR)/test_c11-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test.c' object='test_c11-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_c11_CFLAGS) $(CFLAGS) -c -o test_c11-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c test_c11-test.obj: test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_c11_CFLAGS) $(CFLAGS) -MT test_c11-test.obj -MD -MP -MF $(DEPDIR)/test_c11-test.Tpo -c -o test_c11-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_c11-test.Tpo $(DEPDIR)/test_c11-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test.c' object='test_c11-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_c11_CFLAGS) $(CFLAGS) -c -o test_c11-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi` 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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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_c11.log: test_c11$(EXEEXT) @p='test_c11$(EXEEXT)'; \ b='test_c11'; \ $(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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/inline.Plo -rm -f ./$(DEPDIR)/math.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test_c11-test.Po -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 -f ./$(DEPDIR)/inline.Plo -rm -f ./$(DEPDIR)/math.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test_c11-test.Po -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 am--depfiles 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 .PRECIOUS: Makefile 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-2.7.1/complex/ChangeLog0000644016036000116100000000505513373111454012456 000000000000002010-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-2.7.1/complex/TODO0000644016036000116100000000156713373111454011400 00000000000000# -*- 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-2.7.1/complex/math.c0000644016036000116100000005556113373111454012010 00000000000000/* 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-2.7.1/complex/inline.c0000644016036000116100000000161613373111454012325 00000000000000/* 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-2.7.1/complex/test.c0000644016036000116100000000245614002204234012016 00000000000000/* complex/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Brian Gough * Copyright (C) 2020, 2021 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 #if defined(HAVE_COMPLEX_H) && defined(TEST_C11) #include #endif #include #include #include #include #include #define BASE_DOUBLE #include "templates_on.h" #include "test_source.c" #include "templates_off.h" #undef BASE_DOUBLE int main (void) { test_all(); exit (gsl_test_summary ()); } gsl-2.7.1/complex/results.h0000644016036000116100000172434713373111454012573 00000000000000 {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-2.7.1/complex/results1.h0000644016036000116100000013176113135126237012644 00000000000000 {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-2.7.1/complex/results2.h0000644016036000116100000001056313373111454012640 00000000000000 {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-2.7.1/complex/results_real.h0000644016036000116100000002060413135126237013557 00000000000000 {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-2.7.1/complex/results_zreal.h0000644016036000116100000000434413373111454013753 00000000000000 {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-2.7.1/cheb/0000755016036000116100000000000014151602574010214 500000000000000gsl-2.7.1/cheb/Makefile.am0000644016036000116100000000057413373111454012173 00000000000000noinst_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-2.7.1/cheb/gsl_chebyshev.h0000644016036000116100000001066113626554176013150 00000000000000/* 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 #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-2.7.1/cheb/Makefile.in0000644016036000116100000010602414151557213012203 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/deriv.Plo ./$(DEPDIR)/eval.Plo \ ./$(DEPDIR)/init.Plo ./$(DEPDIR)/integ.Plo ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eval.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/integ.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/deriv.Plo -rm -f ./$(DEPDIR)/eval.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/integ.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/deriv.Plo -rm -f ./$(DEPDIR)/eval.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/integ.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/cheb/ChangeLog0000644016036000116100000000415413373111454011707 000000000000002010-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-2.7.1/cheb/TODO0000644016036000116100000000015313373111454010620 00000000000000# -*- org -*- #+CATEGORY: cheb Provide a way to save/restore coefficients, or access the coefficient data.gsl-2.7.1/cheb/deriv.c0000644016036000116100000000327413373111454011414 00000000000000/* 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-2.7.1/cheb/eval.c0000644016036000116100000001070513135126237011230 00000000000000/* 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-2.7.1/cheb/init.c0000644016036000116100000000540713373111454011246 00000000000000/* 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-2.7.1/cheb/integ.c0000644016036000116100000000346513135126237011414 00000000000000/* 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-2.7.1/cheb/test.c0000644016036000116100000001744013373111454011262 00000000000000/* 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; xsize ; } ATOMIC * FUNCTION(gsl_block,data) (const TYPE(gsl_block) * b) { return b->data ; } gsl-2.7.1/block/init_source.c0000644016036000116100000000371613373111454013020 00000000000000/* 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; 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 && n > 0) /* malloc may return NULL when n == 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-2.7.1/block/fprintf_source.c0000644016036000116100000000762613373111454013531 00000000000000/* 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-2.7.1/block/fwrite_source.c0000644016036000116100000000551313135126237013353 00000000000000/* 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-2.7.1/block/test_complex_source.c0000644016036000116100000000711113373111454014554 00000000000000/* 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, alloc_zero_length) (void) { TYPE (gsl_block) * b = FUNCTION (gsl_block, alloc) (0); gsl_test (b == 0, NAME (gsl_block) "_alloc permits zero length"); gsl_test (b->size != 0, NAME (gsl_block) "_alloc reflects zero length"); FUNCTION (gsl_block, free) (b); } void FUNCTION (test, calloc_zero_length) (void) { TYPE (gsl_block) * b = FUNCTION (gsl_block, calloc) (0); gsl_test (b == 0, NAME (gsl_block) "_calloc permits zero length"); gsl_test (b->size != 0, NAME (gsl_block) "_calloc reflects zero length"); FUNCTION (gsl_block, free) (b); } gsl-2.7.1/block/test_source.c0000644016036000116100000000672313373111454013035 00000000000000/* 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, alloc_zero_length) (void) { TYPE (gsl_block) * b = FUNCTION (gsl_block, alloc) (0); gsl_test (b == 0, NAME (gsl_block) "_alloc permits zero length"); gsl_test (b->size != 0, NAME (gsl_block) "_alloc reflects zero length"); FUNCTION (gsl_block, free) (b); } void FUNCTION (test, calloc_zero_length) (void) { TYPE (gsl_block) * b = FUNCTION (gsl_block, calloc) (0); gsl_test (b == 0, NAME (gsl_block) "_calloc permits zero length"); gsl_test (b->size != 0, NAME (gsl_block) "_calloc reflects zero length"); FUNCTION (gsl_block, free) (b); } gsl-2.7.1/block/test_io.c0000644016036000116100000000311413135126237012134 00000000000000/* 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-2.7.1/block/test_complex_io.c0000644016036000116100000000325613135126237013672 00000000000000/* 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-2.7.1/block/gsl_block.h0000644016036000116100000000110413135126237012427 00000000000000#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-2.7.1/block/gsl_block_char.h0000644016036000116100000000436213135126237013435 00000000000000/* 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-2.7.1/block/gsl_block_complex_double.h0000644016036000116100000000456113135126237015522 00000000000000/* 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-2.7.1/block/gsl_block_complex_float.h0000644016036000116100000000477513135126237015364 00000000000000/* 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-2.7.1/block/gsl_block_complex_long_double.h0000644016036000116100000000531713135126237016541 00000000000000/* 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-2.7.1/block/gsl_block_double.h0000644016036000116100000000421113135126237013763 00000000000000/* 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-2.7.1/block/gsl_block_float.h0000644016036000116100000000442513135126237013625 00000000000000/* 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-2.7.1/block/gsl_block_int.h0000644016036000116100000000431713135126237013312 00000000000000/* 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-2.7.1/block/gsl_block_long.h0000644016036000116100000000436213135126237013457 00000000000000/* 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-2.7.1/block/gsl_block_long_double.h0000644016036000116100000000474713135126237015020 00000000000000/* 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-2.7.1/block/gsl_block_short.h0000644016036000116100000000442513135126237013657 00000000000000/* 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-2.7.1/block/gsl_block_uchar.h0000644016036000116100000000450513135126237013621 00000000000000/* 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-2.7.1/block/gsl_block_uint.h0000644016036000116100000000444213135126237013476 00000000000000/* 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-2.7.1/block/gsl_block_ulong.h0000644016036000116100000000450513135126237013643 00000000000000/* 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-2.7.1/block/gsl_block_ushort.h0000644016036000116100000000455013135126237014043 00000000000000/* 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-2.7.1/block/gsl_check_range.h0000644016036000116100000000305313135126237013573 00000000000000/* 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-2.7.1/block/Makefile.in0000644016036000116100000010662314151557213012401 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/block.Plo ./$(DEPDIR)/file.Plo \ ./$(DEPDIR)/init.Plo ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/block.Plo -rm -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/block.Plo -rm -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/block/ChangeLog0000644016036000116100000000301213373111454012070 000000000000002017-01-07 Rhys Ulerich * init_source.c: permit zero-length blocks (#49988) * test_source.c: zero-length for alloc and calloc * test_complex_source.c: zero-length for alloc and calloc * test.c: rename trap as alloc_zero_length, add calloc tests 2009-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-2.7.1/block/init.c0000644016036000116100000000337513373111454011441 00000000000000#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-2.7.1/block/file.c0000644016036000116100000000424713135126237011415 00000000000000#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-2.7.1/block/block.c0000644016036000116100000000337613135126237011572 00000000000000#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-2.7.1/block/test.c0000644016036000116100000001310413373111454011444 00000000000000/* 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_alloc_zero_length (); test_float_alloc_zero_length (); test_long_double_alloc_zero_length (); test_ulong_alloc_zero_length (); test_long_alloc_zero_length (); test_uint_alloc_zero_length (); test_int_alloc_zero_length (); test_ushort_alloc_zero_length (); test_short_alloc_zero_length (); test_uchar_alloc_zero_length (); test_char_alloc_zero_length (); test_complex_alloc_zero_length (); test_complex_float_alloc_zero_length (); test_complex_long_double_alloc_zero_length (); test_calloc_zero_length (); test_float_calloc_zero_length (); test_long_double_calloc_zero_length (); test_ulong_calloc_zero_length (); test_long_calloc_zero_length (); test_uint_calloc_zero_length (); test_int_calloc_zero_length (); test_ushort_calloc_zero_length (); test_short_calloc_zero_length (); test_uchar_calloc_zero_length (); test_char_calloc_zero_length (); test_complex_calloc_zero_length (); test_complex_float_calloc_zero_length (); test_complex_long_double_calloc_zero_length (); 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-2.7.1/vector/0000755016036000116100000000000014151602574010615 500000000000000gsl-2.7.1/vector/Makefile.am0000644016036000116100000000253714151556700012577 00000000000000noinst_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 ../blas/libgslblas.la ../cblas/libgslcblas.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 ../blas/libgslblas.la ../cblas/libgslcblas.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 test_static.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-2.7.1/vector/init_source.c0000644016036000116100000001143713373111456013231 00000000000000/* 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; 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 (stride == 0) { GSL_ERROR_VAL ("stride must be positive integer", GSL_EINVAL, 0); } if (block->size <= offset + (n > 0 ? n - 1 : 0) * 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 (stride == 0) { GSL_ERROR_VAL ("stride must be positive integer", GSL_EINVAL, 0); } if (offset + (n > 0 ? n - 1 : 0) * 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-2.7.1/vector/file_source.c0000644016036000116100000000443413135126237013203 00000000000000/* 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-2.7.1/vector/copy_source.c0000644016036000116100000000345613541764770013254 00000000000000/* vector/copy_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough * Copyright (C) 2019 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. */ 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); } #if defined(BASE_DOUBLE) gsl_blas_dcopy(src, dest); #elif defined(BASE_FLOAT) gsl_blas_scopy(src, dest); #elif defined(BASE_GSL_COMPLEX) gsl_blas_zcopy(src, dest); #elif defined(BASE_GSL_COMPLEX_FLOAT) gsl_blas_ccopy(src, dest); #else { 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]; } } } #endif return GSL_SUCCESS; } gsl-2.7.1/vector/swap_source.c0000644016036000116100000000507313135126237013236 00000000000000/* 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-2.7.1/vector/prop_source.c0000644016036000116100000000575213373111456013251 00000000000000/* 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-2.7.1/vector/test_complex_source.c0000644016036000116100000005167414151556700015003 00000000000000/* 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"); } { BASE alpha, beta; GSL_REAL(alpha) = (ATOMIC) 1; GSL_IMAG(alpha) = (ATOMIC) 2; GSL_REAL(beta) = (ATOMIC) 3; GSL_IMAG(beta) = (ATOMIC) 4; FUNCTION(gsl_vector, memcpy) (v, a); FUNCTION(gsl_vector, axpby) (alpha, b, beta, v); } { int status = 0; for (i = 0; i < N; i++) { BASE r = FUNCTION(gsl_vector,get) (v, i); ATOMIC real = (-3*(ATOMIC)i-81); ATOMIC imag = (90+13*(ATOMIC)i); if (fabs(GSL_REAL(r) - real) > 100 * BASE_EPSILON || fabs(GSL_IMAG(r) - imag) > 100 * BASE_EPSILON) status = 1; } TEST2 (status, "_axpby first"); } { BASE alpha, beta; GSL_REAL(alpha) = (ATOMIC) 1; GSL_IMAG(alpha) = (ATOMIC) 2; GSL_REAL(beta) = (ATOMIC) 0; GSL_IMAG(beta) = (ATOMIC) 0; FUNCTION(gsl_vector, memcpy) (v, a); FUNCTION(gsl_vector, axpby) (alpha, b, beta, v); } { int status = 0; for (i = 0; i < N; i++) { BASE r = FUNCTION(gsl_vector,get) (v, i); ATOMIC real = (-2*(ATOMIC)i-38); ATOMIC imag = (39+6*(ATOMIC)i); if (fabs(GSL_REAL(r) - real) > 100 * BASE_EPSILON || fabs(GSL_IMAG(r) - imag) > 100 * BASE_EPSILON) status = 1; } TEST2 (status, "_axpby second"); } 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; #ifdef NO_INLINE char filename[] = "test_static.dat"; #else char filename[] = "test.dat"; #endif { /* write file */ FILE *f = fopen(filename, "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); } { /* read file */ 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; }; gsl_test (status, NAME (gsl_vector) "_write and read work"); fclose (f); } FUNCTION (gsl_vector, free) (v); FUNCTION (gsl_vector, free) (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; #ifdef NO_INLINE char filename[] = "test_static.dat"; #else char filename[] = "test.dat"; #endif { /* write file */ FILE *f = fopen(filename, "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); } { /* read file */ 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; }; gsl_test (status, NAME (gsl_vector) "_fprintf and fscanf"); fclose (f); } FUNCTION (gsl_vector, free) (v); FUNCTION (gsl_vector, free) (w); } #endif void FUNCTION (test, trap) (size_t stride, size_t N) { 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); } void FUNCTION (test, alloc_zero_length) (void) { TYPE (gsl_vector) * b = FUNCTION (gsl_vector, alloc) (0); gsl_test (b == 0, NAME (gsl_vector) "_alloc permits zero length"); gsl_test (b->size != 0, NAME (gsl_vector) "_alloc reflects zero length"); FUNCTION (gsl_vector, free) (b); } void FUNCTION (test, calloc_zero_length) (void) { TYPE (gsl_vector) * b = FUNCTION (gsl_vector, calloc) (0); gsl_test (b == 0, NAME (gsl_vector) "_calloc permits zero length"); gsl_test (b->size != 0, NAME (gsl_vector) "_calloc reflects zero length"); FUNCTION (gsl_vector, free) (b); } gsl-2.7.1/vector/test_source.c0000644016036000116100000005526713614613637013264 00000000000000/* 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; TYPE (gsl_vector) * w0 = FUNCTION (gsl_vector, alloc) (N * stride); QUALIFIED_VIEW(gsl_vector,view) view2 = FUNCTION (gsl_vector, subvector_with_stride) (w0, 0, stride, N); TYPE (gsl_vector) * w = &view2.vector; for (i = 0; i < N; i++) { FUNCTION (gsl_vector, set) (v, i, (ATOMIC) i); FUNCTION (gsl_vector, set) (w, i, (ATOMIC) i); } FUNCTION (gsl_vector, axpby) ((ATOMIC)2, v, (ATOMIC)3, w); for (i = 0; i < N; i++) { if (FUNCTION (gsl_vector, get) (w, i) != (ATOMIC) ((ATOMIC)i*(ATOMIC)2.0 + (ATOMIC)i*(ATOMIC)3.0)) status = 1; } TEST (status, "_axpby" DESC " by (2,3)") ; for (i = 0; i < N; i++) { FUNCTION (gsl_vector, set) (v, i, (ATOMIC) i); FUNCTION (gsl_vector, set) (w, i, (ATOMIC) i); } FUNCTION (gsl_vector, axpby) ((ATOMIC)2, v, (ATOMIC)0, w); for (i = 0; i < N; i++) { if (FUNCTION (gsl_vector, get) (w, i) != (ATOMIC) ((ATOMIC)i*(ATOMIC)2.0)) status = 1; } TEST (status, "_axpby" DESC " by (2,0)") ; FUNCTION (gsl_vector, free) (w0); } { int status = 0; for (i = 0; i < N; i++) { FUNCTION (gsl_vector, set) (v, i, (ATOMIC) i); } FUNCTION (gsl_vector, scale) (v, (ATOMIC)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); BASE exact_sum_a = (BASE) 0, exact_sum_b = (BASE) 0; for (i = 0; i < N; i++) { BASE ai = (BASE)(3 + i); BASE bi = (BASE)(3 + 2 * i); FUNCTION (gsl_vector, set) (a, i, ai); FUNCTION (gsl_vector, set) (b, i, bi); exact_sum_a += ai; exact_sum_b += bi; } { 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"); } { int status; BASE sum_a = FUNCTION(gsl_vector, sum) (a); BASE sum_b = FUNCTION(gsl_vector, sum) (b); status = 0; if (fabs(sum_a - exact_sum_a) > GSL_FLT_EPSILON) status = 1; gsl_test (status, NAME (gsl_vector) "_sum a"); status = 0; if (fabs(sum_b - exact_sum_b) > GSL_FLT_EPSILON) status = 1; gsl_test (status, NAME (gsl_vector) "_sum b"); } 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; #ifdef NO_INLINE char filename[] = "test_static.dat"; #else char filename[] = "test.dat"; #endif { /* write file */ FILE *f = fopen(filename, "wb"); for (i = 0; i < N; i++) { FUNCTION (gsl_vector, set) (v, i, (ATOMIC) (N - i)); }; FUNCTION (gsl_vector, fwrite) (f, v); fclose(f); } { /* read file */ 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); } 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; #ifdef NO_INLINE char filename[] = "test_static.dat"; #else char filename[] = "test.dat"; #endif { /* write file */ FILE *f = fopen(filename, "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); } { /* read file */ 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); } 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 */ } void FUNCTION (test, alloc_zero_length) (void) { TYPE (gsl_vector) * b = FUNCTION (gsl_vector, alloc) (0); gsl_test (b == 0, NAME (gsl_vector) "_alloc permits zero length"); gsl_test (b->size != 0, NAME (gsl_vector) "_alloc reflects zero length"); FUNCTION (gsl_vector, free) (b); } void FUNCTION (test, calloc_zero_length) (void) { TYPE (gsl_vector) * b = FUNCTION (gsl_vector, calloc) (0); gsl_test (b == 0, NAME (gsl_vector) "_calloc permits zero length"); gsl_test (b->size != 0, NAME (gsl_vector) "_calloc reflects zero length"); FUNCTION (gsl_vector, free) (b); } gsl-2.7.1/vector/minmax_source.c0000644016036000116100000001007113135126237013547 00000000000000/* 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-2.7.1/vector/oper_source.c0000644016036000116100000001066414013631504013225 00000000000000/* 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 ATOMIC x) { #if defined(BASE_DOUBLE) gsl_blas_dscal(x, a); #elif defined(BASE_FLOAT) gsl_blas_sscal(x, a); #else 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; } #endif return GSL_SUCCESS; } int FUNCTION(gsl_vector, add_constant) (TYPE(gsl_vector) * a, const ATOMIC 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, axpby) (const BASE alpha, const TYPE (gsl_vector) * x, const BASE beta, TYPE (gsl_vector) * y) { const size_t x_size = x->size; if (x_size != y->size) { GSL_ERROR ("vector lengths are not equal", GSL_EBADLEN); } else if (beta == (ATOMIC) 0) { const size_t x_stride = x->stride; const size_t y_stride = y->stride; size_t j; for (j = 0; j < x_size; j++) { y->data[y_stride * j] = alpha * x->data[x_stride * j]; } return GSL_SUCCESS; } else { const size_t x_stride = x->stride; const size_t y_stride = y->stride; size_t j; for (j = 0; j < x_size; j++) { y->data[y_stride * j] = alpha * x->data[x_stride * j] + beta * y->data[y_stride * j]; } return GSL_SUCCESS; } } BASE FUNCTION(gsl_vector, sum) (const TYPE(gsl_vector) * a) { const size_t N = a->size; const size_t stride = a->stride; BASE sum = (BASE) 0; size_t i; for (i = 0; i < N; i++) { sum += a->data[i * stride]; } return sum; } gsl-2.7.1/vector/oper_complex_source.c0000644016036000116100000001401713517466663014774 00000000000000/* 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) { #if defined(BASE_GSL_COMPLEX) gsl_blas_zscal(x, a); #elif defined(BASE_GSL_COMPLEX_FLOAT) gsl_blas_cscal(x, a); #else 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; } #endif 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; } int FUNCTION (gsl_vector, axpby) (const BASE alpha, const TYPE (gsl_vector) * x, const BASE beta, TYPE (gsl_vector) * y) { const size_t x_size = x->size; if (x_size != y->size) { GSL_ERROR ("vector lengths are not equal", GSL_EBADLEN); } else if (GSL_REAL(beta) == (ATOMIC) 0 && GSL_IMAG(beta) == (ATOMIC) 0) { const size_t x_stride = x->stride; const size_t y_stride = y->stride; const ATOMIC ar = GSL_REAL(alpha); const ATOMIC ai = GSL_IMAG(alpha); size_t j; for (j = 0; j < x_size; j++) { ATOMIC xr = x->data[2 * j * x_stride]; ATOMIC xi = x->data[2 * j * x_stride + 1]; y->data[2 * j * y_stride] = ar * xr - ai * xi; y->data[2 * j * y_stride + 1] = ai * xr + ar * xi; } return GSL_SUCCESS; } else { const size_t x_stride = x->stride; const size_t y_stride = y->stride; const ATOMIC ar = GSL_REAL(alpha); const ATOMIC ai = GSL_IMAG(alpha); const ATOMIC br = GSL_REAL(beta); const ATOMIC bi = GSL_IMAG(beta); size_t j; for (j = 0; j < x_size; j++) { ATOMIC xr = x->data[2 * j * x_stride]; ATOMIC xi = x->data[2 * j * x_stride + 1]; ATOMIC yr = y->data[2 * j * y_stride]; ATOMIC yi = y->data[2 * j * y_stride + 1]; y->data[2 * j * y_stride] = ar * xr - ai * xi + br * yr - bi * yi; y->data[2 * j * y_stride + 1] = ai * xr + ar * xi + bi * yr + br * yi; } return GSL_SUCCESS; } } gsl-2.7.1/vector/reim_source.c0000644016036000116100000000323213135126237013213 00000000000000/* 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-2.7.1/vector/subvector_source.c0000644016036000116100000000420413373111456014274 00000000000000/* 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 (offset + (n > 0 ? n - 1 : 0) >= 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 (stride == 0) { GSL_ERROR_VAL ("stride must be positive integer", GSL_EINVAL, view); } if (offset + (n > 0 ? n - 1 : 0) * 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-2.7.1/vector/view_source.c0000644016036000116100000000341513373111456013235 00000000000000/* 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; { 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 (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-2.7.1/vector/gsl_vector.h0000644016036000116100000000112613135126237013053 00000000000000#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-2.7.1/vector/gsl_vector_char.h0000644016036000116100000001652314061424067014060 00000000000000/* 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 char x); int gsl_vector_char_add_constant (gsl_vector_char * a, const char x); int gsl_vector_char_axpby (const char alpha, const gsl_vector_char * x, const char beta, gsl_vector_char * y); char gsl_vector_char_sum (const gsl_vector_char * a); 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-2.7.1/vector/gsl_vector_complex.h0000644016036000116100000000137413373111456014610 00000000000000#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-2.7.1/vector/gsl_vector_complex_double.h0000644016036000116100000002032214151556700016134 00000000000000/* 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); int gsl_vector_complex_axpby (const gsl_complex alpha, const gsl_vector_complex * x, const gsl_complex beta, gsl_vector_complex * y); 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-2.7.1/vector/gsl_vector_complex_float.h0000644016036000116100000002203314151556700015770 00000000000000/* 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); int gsl_vector_complex_float_axpby (const gsl_complex_float alpha, const gsl_vector_complex_float * x, const gsl_complex_float beta, gsl_vector_complex_float * y); 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-2.7.1/vector/gsl_vector_complex_long_double.h0000644016036000116100000002366114151556700017164 00000000000000/* 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); int gsl_vector_complex_long_double_axpby (const gsl_complex_long_double alpha, const gsl_vector_complex_long_double * x, const gsl_complex_long_double beta, gsl_vector_complex_long_double * y); 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-2.7.1/vector/gsl_vector_double.h0000644016036000116100000001543114061424067014412 00000000000000/* 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_axpby (const double alpha, const gsl_vector * x, const double beta, gsl_vector * y); double gsl_vector_sum (const gsl_vector * a); 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-2.7.1/vector/gsl_vector_float.h0000644016036000116100000001675714013631330014247 00000000000000/* 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 float x); int gsl_vector_float_add_constant (gsl_vector_float * a, const float x); int gsl_vector_float_axpby (const float alpha, const gsl_vector_float * x, const float beta, gsl_vector_float * y); float gsl_vector_float_sum (const gsl_vector_float * a); 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-2.7.1/vector/gsl_vector_int.h0000644016036000116100000001626714061424067013742 00000000000000/* 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 int x); int gsl_vector_int_add_constant (gsl_vector_int * a, const int x); int gsl_vector_int_axpby (const int alpha, const gsl_vector_int * x, const int beta, gsl_vector_int * y); int gsl_vector_int_sum (const gsl_vector_int * a); 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-2.7.1/vector/gsl_vector_long.h0000644016036000116100000001652314061424067014102 00000000000000/* 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 long x); int gsl_vector_long_add_constant (gsl_vector_long * a, const long x); int gsl_vector_long_axpby (const long alpha, const gsl_vector_long * x, const long beta, gsl_vector_long * y); long gsl_vector_long_sum (const gsl_vector_long * a); 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-2.7.1/vector/gsl_vector_long_double.h0000644016036000116100000002062714061424067015434 00000000000000/* 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 long double x); int gsl_vector_long_double_add_constant (gsl_vector_long_double * a, const long double x); int gsl_vector_long_double_axpby (const long double alpha, const gsl_vector_long_double * x, const long double beta, gsl_vector_long_double * y); long double gsl_vector_long_double_sum (const gsl_vector_long_double * a); 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-2.7.1/vector/gsl_vector_short.h0000644016036000116100000001675714061424067014313 00000000000000/* 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 short x); int gsl_vector_short_add_constant (gsl_vector_short * a, const short x); int gsl_vector_short_axpby (const short alpha, const gsl_vector_short * x, const short beta, gsl_vector_short * y); short gsl_vector_short_sum (const gsl_vector_short * a); 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-2.7.1/vector/gsl_vector_uchar.h0000644016036000116100000001726714061424067014253 00000000000000/* 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 unsigned char x); int gsl_vector_uchar_add_constant (gsl_vector_uchar * a, const unsigned char x); int gsl_vector_uchar_axpby (const unsigned char alpha, const gsl_vector_uchar * x, const unsigned char beta, gsl_vector_uchar * y); unsigned char gsl_vector_uchar_sum (const gsl_vector_uchar * a); 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-2.7.1/vector/gsl_vector_uint.h0000644016036000116100000001703314061424067014117 00000000000000/* 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 unsigned int x); int gsl_vector_uint_add_constant (gsl_vector_uint * a, const unsigned int x); int gsl_vector_uint_axpby (const unsigned int alpha, const gsl_vector_uint * x, const unsigned int beta, gsl_vector_uint * y); unsigned int gsl_vector_uint_sum (const gsl_vector_uint * a); 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-2.7.1/vector/gsl_vector_ulong.h0000644016036000116100000001726714061424067014275 00000000000000/* 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 unsigned long x); int gsl_vector_ulong_add_constant (gsl_vector_ulong * a, const unsigned long x); int gsl_vector_ulong_axpby (const unsigned long alpha, const gsl_vector_ulong * x, const unsigned long beta, gsl_vector_ulong * y); unsigned long gsl_vector_ulong_sum (const gsl_vector_ulong * a); 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-2.7.1/vector/gsl_vector_ushort.h0000644016036000116100000001752314061424067014470 00000000000000/* 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 unsigned short x); int gsl_vector_ushort_add_constant (gsl_vector_ushort * a, const unsigned short x); int gsl_vector_ushort_axpby (const unsigned short alpha, const gsl_vector_ushort * x, const unsigned short beta, gsl_vector_ushort * y); unsigned short gsl_vector_ushort_sum (const gsl_vector_ushort * a); 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-2.7.1/vector/Makefile.in0000644016036000116100000011501614151557216012610 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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 ../blas/libgslblas.la \ ../cblas/libgslcblas.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 ../blas/libgslblas.la \ ../cblas/libgslcblas.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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/copy.Plo ./$(DEPDIR)/file.Plo \ ./$(DEPDIR)/init.Plo ./$(DEPDIR)/minmax.Plo \ ./$(DEPDIR)/oper.Plo ./$(DEPDIR)/prop.Plo ./$(DEPDIR)/reim.Plo \ ./$(DEPDIR)/subvector.Plo ./$(DEPDIR)/swap.Plo \ ./$(DEPDIR)/test.Po ./$(DEPDIR)/test_static.Po \ ./$(DEPDIR)/vector.Plo ./$(DEPDIR)/view.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 ../blas/libgslblas.la ../cblas/libgslcblas.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 ../blas/libgslblas.la ../cblas/libgslcblas.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 test_static.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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minmax.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oper.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prop.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reim.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subvector.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/swap.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_static.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/view.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/copy.Plo -rm -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/minmax.Plo -rm -f ./$(DEPDIR)/oper.Plo -rm -f ./$(DEPDIR)/prop.Plo -rm -f ./$(DEPDIR)/reim.Plo -rm -f ./$(DEPDIR)/subvector.Plo -rm -f ./$(DEPDIR)/swap.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test_static.Po -rm -f ./$(DEPDIR)/vector.Plo -rm -f ./$(DEPDIR)/view.Plo -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 -f ./$(DEPDIR)/copy.Plo -rm -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/minmax.Plo -rm -f ./$(DEPDIR)/oper.Plo -rm -f ./$(DEPDIR)/prop.Plo -rm -f ./$(DEPDIR)/reim.Plo -rm -f ./$(DEPDIR)/subvector.Plo -rm -f ./$(DEPDIR)/swap.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test_static.Po -rm -f ./$(DEPDIR)/vector.Plo -rm -f ./$(DEPDIR)/view.Plo -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/vector/ChangeLog0000644016036000116100000001745713373111456012324 000000000000002017-01-07 Rhys Ulerich * init_source.c: permit zero-length vectors (#49988) * subvector_source.c: permit zero-length subvectors (#49988) * test.c: change trap into alloc_zero_length, add calloc tests * test_complex_source.c: zero-length for alloc and calloc * test_source.c: zero-length for alloc and calloc * view_source.c: permit zero-length views * Audit range checking regarding n - 1 underflow for n = 0 2010-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-2.7.1/vector/TODO0000644016036000116100000000011413373111456011220 00000000000000# -*- org -*- #+CATEGORY: vector * Pretty print function * Vector p-norms gsl-2.7.1/vector/init.c0000644016036000116100000000337613373111456011654 00000000000000#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-2.7.1/vector/file.c0000644016036000116100000000343713135126237011625 00000000000000#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-2.7.1/vector/vector.c0000644016036000116100000000207313373111456012204 00000000000000/* 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-2.7.1/vector/copy.c0000644016036000116100000000341314151556700011653 00000000000000#include #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-2.7.1/vector/swap.c0000644016036000116100000000336113135126237011654 00000000000000#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-2.7.1/vector/prop.c0000644016036000116100000000336113135126237011662 00000000000000#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-2.7.1/vector/minmax.c0000644016036000116100000000260313135126237012171 00000000000000#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-2.7.1/vector/oper.c0000644016036000116100000000351213517166757011664 00000000000000#include #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-2.7.1/vector/reim.c0000644016036000116100000000167013135126237011637 00000000000000#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-2.7.1/vector/subvector.c0000644016036000116100000000713613135126237012722 00000000000000#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-2.7.1/vector/view.c0000644016036000116100000000672213135126237011660 00000000000000#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-2.7.1/vector/view.h0000644016036000116100000000011713135126237011655 00000000000000#define NULL_VECTOR {0, 0, 0, 0, 0} #define NULL_VECTOR_VIEW {{0, 0, 0, 0, 0}} gsl-2.7.1/vector/test.c0000644016036000116100000001744613373111456011673 00000000000000/* 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); } } test_alloc_zero_length (); test_float_alloc_zero_length (); test_long_double_alloc_zero_length (); test_ulong_alloc_zero_length (); test_long_alloc_zero_length (); test_uint_alloc_zero_length (); test_int_alloc_zero_length (); test_ushort_alloc_zero_length (); test_short_alloc_zero_length (); test_uchar_alloc_zero_length (); test_char_alloc_zero_length (); test_complex_alloc_zero_length (); test_complex_float_alloc_zero_length (); test_complex_long_double_alloc_zero_length (); test_calloc_zero_length (); test_float_calloc_zero_length (); test_long_double_calloc_zero_length (); test_ulong_calloc_zero_length (); test_long_calloc_zero_length (); test_uint_calloc_zero_length (); test_int_calloc_zero_length (); test_ushort_calloc_zero_length (); test_short_calloc_zero_length (); test_uchar_calloc_zero_length (); test_char_calloc_zero_length (); test_complex_calloc_zero_length (); test_complex_float_calloc_zero_length (); test_complex_long_double_calloc_zero_length (); #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-2.7.1/vector/test_static.c0000644016036000116100000000015113135126237013222 00000000000000#undef HAVE_INLINE #ifndef NO_INLINE #define NO_INLINE #endif #define DESC " (static)" #include "test.c" gsl-2.7.1/matrix/0000755016036000116100000000000014151602574010617 500000000000000gsl-2.7.1/matrix/Makefile.am0000644016036000116100000000266713667014161012606 00000000000000noinst_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 ../blas/libgslblas.la ../cblas/libgslcblas.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 ../blas/libgslblas.la ../cblas/libgslcblas.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 test_static.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 swap_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-2.7.1/matrix/init_source.c0000644016036000116100000001226213373111455013227 00000000000000/* 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; 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 (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 (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-2.7.1/matrix/file_source.c0000644016036000116100000001052613373111455013204 00000000000000/* 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-2.7.1/matrix/rowcol_source.c0000644016036000116100000001157413373111455013576 00000000000000/* 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-2.7.1/matrix/swap_source.c0000644016036000116100000002304213521372075013236 00000000000000/* 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; if (dest_size2 != src_size1 || dest_size1 != src_size2) { GSL_ERROR ("dimensions of dest matrix must be transpose of src matrix", GSL_EBADLEN); } #if defined(BASE_DOUBLE) || defined(BASE_FLOAT) || defined(BASE_GSL_COMPLEX) || defined(BASE_GSL_COMPLEX_FLOAT) for (i = 0; i < src_size1; ++i) { VIEW (gsl_vector, const_view) a = FUNCTION (gsl_matrix, const_row) (src, i); VIEW (gsl_vector, view) b = FUNCTION (gsl_matrix, column) (dest, i); #if defined(BASE_DOUBLE) gsl_blas_dcopy(&a.vector, &b.vector); #elif defined(BASE_FLOAT) gsl_blas_scopy(&a.vector, &b.vector); #elif defined(BASE_GSL_COMPLEX) gsl_blas_zcopy(&a.vector, &b.vector); #elif defined(BASE_GSL_COMPLEX_FLOAT) gsl_blas_ccopy(&a.vector, &b.vector); #endif } #else for (i = 0; i < dest_size1; i++) { size_t j, k; 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] ; } } } #endif return GSL_SUCCESS; } int FUNCTION (gsl_matrix, transpose_tricpy) (CBLAS_UPLO_t Uplo_src, CBLAS_DIAG_t Diag, TYPE (gsl_matrix) * dest, const TYPE (gsl_matrix) * src) { const size_t M = src->size1; const size_t N = src->size2; const size_t K = GSL_MIN(M, N); size_t i; if (M != dest->size2 || N != dest->size1) { GSL_ERROR ("matrix sizes are different", GSL_EBADLEN); } #if defined(BASE_DOUBLE) || defined(BASE_FLOAT) || defined(BASE_GSL_COMPLEX) || defined(BASE_GSL_COMPLEX_FLOAT) if (Uplo_src == CblasLower) { for (i = 1; i < K; i++) { VIEW (gsl_vector, const_view) a = FUNCTION (gsl_matrix, const_subrow) (src, i, 0, i); VIEW (gsl_vector, view) b = FUNCTION (gsl_matrix, subcolumn) (dest, i, 0, i); #if defined(BASE_DOUBLE) gsl_blas_dcopy(&a.vector, &b.vector); #elif defined(BASE_FLOAT) gsl_blas_scopy(&a.vector, &b.vector); #elif defined(BASE_GSL_COMPLEX) gsl_blas_zcopy(&a.vector, &b.vector); #elif defined(BASE_GSL_COMPLEX_FLOAT) gsl_blas_ccopy(&a.vector, &b.vector); #endif } } else if (Uplo_src == CblasUpper) { for (i = 0; i < K - 1; i++) { VIEW (gsl_vector, const_view) a = FUNCTION (gsl_matrix, const_subrow) (src, i, i + 1, K - i - 1); VIEW (gsl_vector, view) b = FUNCTION (gsl_matrix, subcolumn) (dest, i, i + 1, K - i - 1); #if defined(BASE_DOUBLE) gsl_blas_dcopy(&a.vector, &b.vector); #elif defined(BASE_FLOAT) gsl_blas_scopy(&a.vector, &b.vector); #elif defined(BASE_GSL_COMPLEX) gsl_blas_zcopy(&a.vector, &b.vector); #elif defined(BASE_GSL_COMPLEX_FLOAT) gsl_blas_ccopy(&a.vector, &b.vector); #endif } } if (Diag == CblasNonUnit) { VIEW (gsl_vector, const_view) a = FUNCTION (gsl_matrix, const_diagonal) (src); VIEW (gsl_vector, view) b = FUNCTION (gsl_matrix, diagonal) (dest); #if defined(BASE_DOUBLE) gsl_blas_dcopy(&a.vector, &b.vector); #elif defined(BASE_FLOAT) gsl_blas_scopy(&a.vector, &b.vector); #elif defined(BASE_GSL_COMPLEX) gsl_blas_zcopy(&a.vector, &b.vector); #elif defined(BASE_GSL_COMPLEX_FLOAT) gsl_blas_ccopy(&a.vector, &b.vector); #endif } #else { const size_t src_tda = src->tda ; const size_t dest_tda = dest->tda ; size_t j, k; if (Uplo_src == CblasLower) { /* copy lower triangle of src to upper triangle of dest */ for (i = 0; i < K; 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 == CblasUpper) { /* copy upper triangle of src to lower triangle of dest */ for (i = 0; i < K; i++) { for (j = i + 1; j < K; 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 (Diag == CblasNonUnit) { for (i = 0; i < K; 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]; } } } } #endif return GSL_SUCCESS; } gsl-2.7.1/matrix/copy_source.c0000644016036000116100000001702113521351014013224 00000000000000/* matrix/copy_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough * Copyright (C) 2019 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. */ 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; size_t i; if (src_size1 != dest_size1 || src_size2 != dest_size2) { GSL_ERROR ("matrix sizes are different", GSL_EBADLEN); } #if defined(BASE_DOUBLE) || defined(BASE_FLOAT) || defined(BASE_GSL_COMPLEX) || defined(BASE_GSL_COMPLEX_FLOAT) for (i = 0; i < src_size1; ++i) { VIEW (gsl_vector, const_view) sv = FUNCTION (gsl_matrix, const_row) (src, i); VIEW (gsl_vector, view) dv = FUNCTION (gsl_matrix, row) (dest, i); #if defined(BASE_DOUBLE) gsl_blas_dcopy(&sv.vector, &dv.vector); #elif defined(BASE_FLOAT) gsl_blas_scopy(&sv.vector, &dv.vector); #elif defined(BASE_GSL_COMPLEX) gsl_blas_zcopy(&sv.vector, &dv.vector); #elif defined(BASE_GSL_COMPLEX_FLOAT) gsl_blas_ccopy(&sv.vector, &dv.vector); #endif } #else { const size_t src_tda = src->tda ; const size_t dest_tda = dest->tda ; size_t 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]; } } } #endif 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; size_t i; if (src_size1 != dest_size1 || src_size2 != dest_size2) { GSL_ERROR ("matrix sizes are different", GSL_EBADLEN); } #if defined(BASE_DOUBLE) || defined(BASE_FLOAT) || defined(BASE_GSL_COMPLEX) || defined(BASE_GSL_COMPLEX_FLOAT) for (i = 0; i < src_size1; ++i) { VIEW (gsl_vector, view) sv = FUNCTION (gsl_matrix, row) (src, i); VIEW (gsl_vector, view) dv = FUNCTION (gsl_matrix, row) (dest, i); #if defined(BASE_DOUBLE) gsl_blas_dswap(&sv.vector, &dv.vector); #elif defined(BASE_FLOAT) gsl_blas_sswap(&sv.vector, &dv.vector); #elif defined(BASE_GSL_COMPLEX) gsl_blas_zswap(&sv.vector, &dv.vector); #elif defined(BASE_GSL_COMPLEX_FLOAT) gsl_blas_cswap(&sv.vector, &dv.vector); #endif } #else { const size_t src_tda = src->tda ; const size_t dest_tda = dest->tda ; size_t 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 ; } } } #endif return GSL_SUCCESS; } int FUNCTION (gsl_matrix, tricpy) (CBLAS_UPLO_t Uplo, CBLAS_DIAG_t Diag, TYPE (gsl_matrix) * dest, const TYPE (gsl_matrix) * src) { const size_t M = src->size1; const size_t N = src->size2; size_t i; if (M != dest->size1 || N != dest->size2) { GSL_ERROR ("matrix sizes are different", GSL_EBADLEN); } #if defined(BASE_DOUBLE) || defined(BASE_FLOAT) || defined(BASE_GSL_COMPLEX) || defined(BASE_GSL_COMPLEX_FLOAT) if (Uplo == CblasLower) { for (i = 1; i < M; i++) { size_t k = GSL_MIN (i, N); VIEW (gsl_vector, const_view) a = FUNCTION (gsl_matrix, const_subrow) (src, i, 0, k); VIEW (gsl_vector, view) b = FUNCTION (gsl_matrix, subrow) (dest, i, 0, k); #if defined(BASE_DOUBLE) gsl_blas_dcopy(&a.vector, &b.vector); #elif defined(BASE_FLOAT) gsl_blas_scopy(&a.vector, &b.vector); #elif defined(BASE_GSL_COMPLEX) gsl_blas_zcopy(&a.vector, &b.vector); #elif defined(BASE_GSL_COMPLEX_FLOAT) gsl_blas_ccopy(&a.vector, &b.vector); #endif } } else if (Uplo == CblasUpper) { for (i = 0; i < GSL_MIN(M, N - 1); i++) { VIEW (gsl_vector, const_view) a = FUNCTION (gsl_matrix, const_subrow) (src, i, i + 1, N - i - 1); VIEW (gsl_vector, view) b = FUNCTION (gsl_matrix, subrow) (dest, i, i + 1, N - i - 1); #if defined(BASE_DOUBLE) gsl_blas_dcopy(&a.vector, &b.vector); #elif defined(BASE_FLOAT) gsl_blas_scopy(&a.vector, &b.vector); #elif defined(BASE_GSL_COMPLEX) gsl_blas_zcopy(&a.vector, &b.vector); #elif defined(BASE_GSL_COMPLEX_FLOAT) gsl_blas_ccopy(&a.vector, &b.vector); #endif } } if (Diag == CblasNonUnit) { VIEW (gsl_vector, const_view) a = FUNCTION (gsl_matrix, const_diagonal) (src); VIEW (gsl_vector, view) b = FUNCTION (gsl_matrix, diagonal) (dest); #if defined(BASE_DOUBLE) gsl_blas_dcopy(&a.vector, &b.vector); #elif defined(BASE_FLOAT) gsl_blas_scopy(&a.vector, &b.vector); #elif defined(BASE_GSL_COMPLEX) gsl_blas_zcopy(&a.vector, &b.vector); #elif defined(BASE_GSL_COMPLEX_FLOAT) gsl_blas_ccopy(&a.vector, &b.vector); #endif } #else { const size_t src_tda = src->tda ; const size_t dest_tda = dest->tda ; size_t j, k; if (Uplo == CblasLower) { for (i = 1; i < M ; i++) { for (j = 0; j < GSL_MIN(i, N); 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 == CblasUpper) { for (i = 0; i < M ; i++) { for (j = i + 1; j < N; 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 parameter", GSL_EINVAL); } if (Diag == CblasNonUnit) { for (i = 0; i < GSL_MIN(M, N); 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]; } } } } #endif return GSL_SUCCESS; } gsl-2.7.1/matrix/test_complex_source.c0000644016036000116100000007105614151556700015001 00000000000000/* matrix/test_complex_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough * Copyright (C) 2019 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. */ 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, k; #ifdef NO_INLINE char filename[] = "test_static.dat"; #else char filename[] = "test.dat"; #endif /* write file */ { FILE *f = fopen(filename, "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); } /* read file */ { 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"); FUNCTION (gsl_matrix, free) (mm); fclose (f); } 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, k; #ifdef NO_INLINE char filename[] = "test_static.dat"; #else char filename[] = "test.dat"; #endif /* write file */ { FILE *f = fopen(filename, "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); } /* read file */ { 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"); FUNCTION (gsl_matrix, free) (mm); fclose (f); } 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, k; #ifdef NO_INLINE char filename[] = "test_static.dat"; #else char filename[] = "test.dat"; #endif /* write file */ { FILE *f = fopen(filename, "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); } /* read file */ { 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)"); FUNCTION (gsl_matrix, free) (ll); fclose (f); } 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) * c = FUNCTION (gsl_matrix, alloc) (Q, P); 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"); } { TYPE (gsl_vector) * v = FUNCTION (gsl_vector, alloc) (P); for (i = 0; i < P; i++) { BASE s; GSL_SET_COMPLEX(&s, (ATOMIC) (i + 1), (ATOMIC) (i + 2)); FUNCTION (gsl_vector, set) (v, i, s); } FUNCTION (gsl_matrix, memcpy) (m, a); FUNCTION (gsl_matrix, scale_rows) (m, v); status = 0; for (i = 0; i < P; i++) { BASE s; GSL_SET_COMPLEX(&s, (ATOMIC) (i + 1), (ATOMIC) (i + 2)); for (j = 0; j < Q; j++) { BASE aij = FUNCTION (gsl_matrix, get) (a, i, j); ATOMIC real = GSL_REAL(aij)*(i+1) - GSL_IMAG(aij)*(i+2); ATOMIC imag = GSL_REAL(aij)*(i+2) + GSL_IMAG(aij)*(i+1); BASE mij = FUNCTION (gsl_matrix, get) (m, i, j); if (GSL_REAL (mij) != real || GSL_IMAG (mij) != imag) { status = 1; } k++; } } gsl_test (status, NAME (gsl_matrix) "_scale_rows[%zu,%zu]", P, Q); } { TYPE (gsl_vector) * v = FUNCTION (gsl_vector, alloc) (Q); for (i = 0; i < Q; i++) { BASE s; GSL_SET_COMPLEX(&s, (ATOMIC) (i + 1), (ATOMIC) (i + 2)); FUNCTION (gsl_vector, set) (v, i, s); } FUNCTION (gsl_matrix, memcpy) (m, a); FUNCTION (gsl_matrix, scale_columns) (m, v); status = 0; for (j = 0; j < Q; j++) { BASE s; GSL_SET_COMPLEX(&s, (ATOMIC) (i + 1), (ATOMIC) (i + 2)); for (i = 0; i < P; i++) { BASE aij = FUNCTION (gsl_matrix, get) (a, i, j); ATOMIC real = GSL_REAL(aij)*(j+1) - GSL_IMAG(aij)*(j+2); ATOMIC imag = GSL_REAL(aij)*(j+2) + GSL_IMAG(aij)*(j+1); BASE mij = FUNCTION (gsl_matrix, get) (m, i, j); if (GSL_REAL (mij) != real || GSL_IMAG (mij) != imag) { status = 1; } k++; } } gsl_test (status, NAME (gsl_matrix) "_scale_columns[%zu,%zu]", P, Q); } { 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, transpose_memcpy) (c, a); 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) (c, j, i); if (GSL_REAL (x) != GSL_REAL (y) || GSL_IMAG (x) != GSL_IMAG (y)) { status = 1; } k++; } } gsl_test (status, NAME (gsl_matrix) "_transpose_memcpy"); } { FUNCTION (gsl_matrix, conjtrans_memcpy) (c, a); 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) (c, j, i); if (GSL_REAL (x) != GSL_REAL (y) || GSL_IMAG (x) != -GSL_IMAG (y)) { status = 1; } k++; } } gsl_test (status, NAME (gsl_matrix) "_conjtrans_memcpy"); } { FUNCTION (gsl_matrix, set_zero) (m); FUNCTION (gsl_matrix, tricpy) (CblasLower, CblasUnit, m, a); k = 0; status = 0; for (i = 0; i < P; i++) { for (j = 0; j < GSL_MIN(i, Q); j++) { BASE x = FUNCTION (gsl_matrix, get) (m, i, j); BASE y = FUNCTION (gsl_matrix, get) (a, i, j); if (GSL_REAL (x) != GSL_REAL (y) || GSL_IMAG (x) != GSL_IMAG (y)) { status = 1; } k++; } } gsl_test (status, NAME (gsl_matrix) "_tricpy CblasLower CblasUnit"); } { FUNCTION (gsl_matrix, set_zero) (m); FUNCTION (gsl_matrix, tricpy) (CblasLower, CblasNonUnit, m, a); k = 0; status = 0; for (i = 0; i < P; i++) { for (j = 0; j < GSL_MIN(i + 1, Q); j++) { BASE x = FUNCTION (gsl_matrix, get) (m, i, j); BASE y = FUNCTION (gsl_matrix, get) (a, i, j); if (GSL_REAL (x) != GSL_REAL (y) || GSL_IMAG (x) != GSL_IMAG (y)) { status = 1; } k++; } } gsl_test (status, NAME (gsl_matrix) "_tricpy CblasLower CblasNonUnit"); } { FUNCTION (gsl_matrix, set_zero) (m); FUNCTION (gsl_matrix, tricpy) (CblasUpper, CblasUnit, m, a); k = 0; status = 0; for (i = 0; i < P; i++) { for (j = i + 1; j < Q; j++) { BASE x = FUNCTION (gsl_matrix, get) (m, i, j); BASE y = FUNCTION (gsl_matrix, get) (a, i, j); if (GSL_REAL (x) != GSL_REAL (y) || GSL_IMAG (x) != GSL_IMAG (y)) { status = 1; } k++; } } gsl_test (status, NAME (gsl_matrix) "_tricpy CblasUpper CblasUnit"); } { FUNCTION (gsl_matrix, set_zero) (m); FUNCTION (gsl_matrix, tricpy) (CblasUpper, CblasNonUnit, m, a); k = 0; status = 0; for (i = 0; i < P; i++) { for (j = i; j < Q; j++) { BASE x = FUNCTION (gsl_matrix, get) (m, i, j); BASE y = FUNCTION (gsl_matrix, get) (a, i, j); if (GSL_REAL (x) != GSL_REAL (y) || GSL_IMAG (x) != GSL_IMAG (y)) { status = 1; } k++; } } gsl_test (status, NAME (gsl_matrix) "_tricpy CblasUpper CblasNonUnit"); } { FUNCTION (gsl_matrix, set_zero) (c); FUNCTION (gsl_matrix, transpose_tricpy) (CblasLower, CblasUnit, c, a); k = 0; status = 0; for (i = 0; i < GSL_MIN(P, Q); i++) { for (j = 0; j < i; j++) { BASE x = FUNCTION (gsl_matrix, get) (a, i, j); BASE y = FUNCTION (gsl_matrix, get) (c, j, i); if (GSL_REAL (x) != GSL_REAL (y) || GSL_IMAG (x) != GSL_IMAG (y)) { status = 1; } k++; } } gsl_test (status, NAME (gsl_matrix) "_transpose_tricpy CblasLower CblasUnit"); } { FUNCTION (gsl_matrix, set_zero) (c); FUNCTION (gsl_matrix, transpose_tricpy) (CblasLower, CblasNonUnit, c, a); k = 0; status = 0; for (i = 0; i < GSL_MIN(P, Q); i++) { for (j = 0; j <= i; j++) { BASE x = FUNCTION (gsl_matrix, get) (a, i, j); BASE y = FUNCTION (gsl_matrix, get) (c, j, i); if (GSL_REAL (x) != GSL_REAL (y) || GSL_IMAG (x) != GSL_IMAG (y)) { status = 1; } k++; } } gsl_test (status, NAME (gsl_matrix) "_transpose_tricpy CblasLower CblasNonUnit"); } { FUNCTION (gsl_matrix, set_zero) (c); FUNCTION (gsl_matrix, transpose_tricpy) (CblasUpper, CblasUnit, c, a); k = 0; status = 0; for (i = 0; i < GSL_MIN(P, Q); i++) { for (j = i + 1; j < GSL_MIN(P, Q); j++) { BASE x = FUNCTION (gsl_matrix, get) (a, i, j); BASE y = FUNCTION (gsl_matrix, get) (c, j, i); if (GSL_REAL (x) != GSL_REAL (y) || GSL_IMAG (x) != GSL_IMAG (y)) { status = 1; } k++; } } gsl_test (status, NAME (gsl_matrix) "_transpose_tricpy CblasUpper CblasUnit"); } { FUNCTION (gsl_matrix, set_zero) (c); FUNCTION (gsl_matrix, transpose_tricpy) (CblasUpper, CblasNonUnit, c, a); k = 0; status = 0; for (i = 0; i < GSL_MIN(P, Q); i++) { for (j = i; j < GSL_MIN(P, Q); j++) { BASE x = FUNCTION (gsl_matrix, get) (a, i, j); BASE y = FUNCTION (gsl_matrix, get) (c, j, i); if (GSL_REAL (x) != GSL_REAL (y) || GSL_IMAG (x) != GSL_IMAG (y)) { status = 1; } k++; } } gsl_test (status, NAME (gsl_matrix) "_transpose_tricpy CblasUpper CblasNonUnit"); } FUNCTION (gsl_matrix, free) (a); FUNCTION (gsl_matrix, free) (b); FUNCTION (gsl_matrix, free) (c); FUNCTION (gsl_matrix, free) (m); } gsl-2.7.1/matrix/test_source.c0000644016036000116100000007055314013632373013251 00000000000000/* matrix/test_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough * Copyright (C) 2019 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. */ 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"); } #if !defined(UNSIGNED) && !defined(BASE_CHAR) { ATOMIC norm1 = FUNCTION (gsl_matrix, norm1) (m); ATOMIC norm1_expected = N*M*(M+1)/2; status = (norm1 != norm1_expected); gsl_test (status, NAME (gsl_matrix) "_norm1"); } #endif 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) * c = FUNCTION (gsl_matrix, calloc) (N, M); 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, (ATOMIC) 2); { 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); { int status = 0; TYPE (gsl_vector) * v = FUNCTION (gsl_vector, alloc) (M); for (i = 0; i < M; i++) FUNCTION (gsl_vector, set) (v, i, (ATOMIC) (i + 1)); FUNCTION (gsl_matrix, scale_rows) (m, v); 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)((i+1)*x)) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_scale_rows[%zu,%zu]", M, N); FUNCTION (gsl_vector, free) (v); } FUNCTION(gsl_matrix, memcpy) (m, a); { int status = 0; TYPE (gsl_vector) * v = FUNCTION (gsl_vector, alloc) (N); for (i = 0; i < N; i++) FUNCTION (gsl_vector, set) (v, i, (ATOMIC) (i + 1)); FUNCTION (gsl_matrix, scale_columns) (m, v); 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)((j+1)*x)) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_scale_columns[%zu,%zu]", M, N); FUNCTION (gsl_vector, free) (v); } FUNCTION(gsl_matrix, memcpy) (m, a); FUNCTION(gsl_matrix, add_constant) (m, (ATOMIC) 3); { 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 + (ATOMIC) 3; 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, (ATOMIC) 5); { 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) : 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, transpose_memcpy) (c, a); { int status = 0; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { BASE aij = FUNCTION(gsl_matrix,get) (a,i,j); BASE cji = FUNCTION(gsl_matrix,get) (c,j,i); if (aij != cji) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_transpose_memcpy"); } FUNCTION (gsl_matrix, set_zero) (m); FUNCTION (gsl_matrix, tricpy) (CblasLower, CblasNonUnit, m, a); { int status = 0; for (i = 0; i < M; i++) { for (j = 0; j < GSL_MIN(i + 1, N); j++) { BASE r = FUNCTION(gsl_matrix,get) (m,i,j); BASE x = FUNCTION(gsl_matrix,get) (a,i,j); if (r != x) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_tricpy CblasLower CblasNonUnit"); } FUNCTION (gsl_matrix, set_zero) (m); FUNCTION (gsl_matrix, tricpy) (CblasLower, CblasUnit, m, b); { int status = 0; for (i = 0; i < M; i++) { for (j = 0; j < GSL_MIN(i, N); j++) { BASE r = FUNCTION(gsl_matrix,get) (m,i,j); BASE x = FUNCTION(gsl_matrix,get) (b,i,j); if (r != x) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_tricpy CblasLower CblasUnit"); } FUNCTION (gsl_matrix, set_zero) (m); FUNCTION (gsl_matrix, tricpy) (CblasUpper, CblasNonUnit, m, a); { int status = 0; for (i = 0; i < M; i++) { for (j = i; j < N; j++) { BASE r = FUNCTION(gsl_matrix,get) (m,i,j); BASE x = FUNCTION(gsl_matrix,get) (a,i,j); if (r != x) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_tricpy CblasUpper CblasNonUnit"); } FUNCTION (gsl_matrix, set_zero) (m); FUNCTION (gsl_matrix, tricpy) (CblasUpper, CblasUnit, m, b); { int status = 0; for (i = 0; i < M; i++) { for (j = i + 1; j < N; j++) { BASE r = FUNCTION(gsl_matrix,get) (m,i,j); BASE x = FUNCTION(gsl_matrix,get) (b,i,j); if (r != x) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_tricpy CblasUpper CblasUnit"); } FUNCTION (gsl_matrix, set_zero) (c); FUNCTION (gsl_matrix, transpose_tricpy) (CblasLower, CblasUnit, c, a); { int status = 0; for (i = 0; i < GSL_MIN(M, N); i++) { for (j = 0; j < i; j++) { BASE aij = FUNCTION(gsl_matrix,get) (a,i,j); BASE cji = FUNCTION(gsl_matrix,get) (c,j,i); if (aij != cji) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_transpose_tricpy CblasLower CblasUnit"); } FUNCTION (gsl_matrix, set_zero) (c); FUNCTION (gsl_matrix, transpose_tricpy) (CblasLower, CblasNonUnit, c, a); { int status = 0; for (i = 0; i < GSL_MIN(M, N); i++) { for (j = 0; j <= i; j++) { BASE aij = FUNCTION(gsl_matrix,get) (a,i,j); BASE cji = FUNCTION(gsl_matrix,get) (c,j,i); if (aij != cji) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_transpose_tricpy CblasLower CblasNonUnit"); } FUNCTION (gsl_matrix, set_zero) (c); FUNCTION (gsl_matrix, transpose_tricpy) (CblasUpper, CblasUnit, c, a); { int status = 0; for (i = 0; i < GSL_MIN(M, N); i++) { for (j = i + 1; j < GSL_MIN(M, N); j++) { BASE aij = FUNCTION(gsl_matrix,get) (a,i,j); BASE cji = FUNCTION(gsl_matrix,get) (c,j,i); if (aij != cji) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_transpose_tricpy CblasUpper CblasUnit"); } FUNCTION (gsl_matrix, set_zero) (c); FUNCTION (gsl_matrix, transpose_tricpy) (CblasUpper, CblasNonUnit, c, a); { int status = 0; for (i = 0; i < GSL_MIN(M, N); i++) { for (j = i; j < GSL_MIN(M, N); j++) { BASE aij = FUNCTION(gsl_matrix,get) (a,i,j); BASE cji = FUNCTION(gsl_matrix,get) (c,j,i); if (aij != cji) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_transpose_tricpy CblasUpper CblasNonUnit"); } FUNCTION(gsl_matrix, free) (a); FUNCTION(gsl_matrix, free) (b); FUNCTION(gsl_matrix, free) (c); 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, k; #ifdef NO_INLINE char filename[] = "test_static.dat"; #else char filename[] = "test.dat"; #endif { /* write file */ FILE *f = fopen(filename, "w"); 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, fprintf) (f, m, OUT_FORMAT); fclose(f); } /* read file */ { 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"); FUNCTION (gsl_matrix, free) (mm); fclose (f); } 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, k; #ifdef NO_INLINE char filename[] = "test_static.dat"; #else char filename[] = "test.dat"; #endif /* write file */ { FILE *f = fopen(filename, "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); } /* read file */ { 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"); FUNCTION (gsl_matrix, free) (mm); fclose (f); } 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, k; #ifdef NO_INLINE char filename[] = "test_static.dat"; #else char filename[] = "test.dat"; #endif /* write file */ { FILE *f = fopen(filename, "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); } /* read file */ { 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)"); FUNCTION (gsl_matrix, free) (ll); fclose (f); } 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-2.7.1/matrix/minmax_source.c0000644016036000116100000001256513135126237013563 00000000000000/* 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-2.7.1/matrix/prop_source.c0000644016036000116100000001077113673043275013256 00000000000000/* 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; } #if !defined(UNSIGNED) && !defined(BASE_GSL_COMPLEX) && !defined(BASE_GSL_COMPLEX_FLOAT) && !defined(BASE_GSL_COMPLEX_LONG) ATOMIC FUNCTION (gsl_matrix, norm1) (const TYPE (gsl_matrix) * m) { ATOMIC value = (ATOMIC) 0; size_t j; for (j = 0; j < m->size2; ++j) { VIEW (gsl_vector, const_view) mj = FUNCTION (gsl_matrix, const_column) (m, j); ATOMIC sum; #if defined(BASE_DOUBLE) sum = gsl_blas_dasum(&mj.vector); #elif defined(BASE_FLOAT) sum = gsl_blas_sasum(&mj.vector); #else { size_t i; sum = (ATOMIC) 0; for (i = 0; i < m->size1; ++i) { ATOMIC mij = FUNCTION (gsl_vector, get) (&mj.vector, i); if (mij >= (ATOMIC) 0) sum += mij; else sum += -mij; } } #endif if (sum > value) value = sum; } return value; } #endif gsl-2.7.1/matrix/oper_source.c0000644016036000116100000001216514013632250013224 00000000000000/* 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 ATOMIC 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, scale_rows) (TYPE(gsl_matrix) * a, const TYPE(gsl_vector) * x) { const size_t M = a->size1; if (x->size != M) { GSL_ERROR ("x must match number of rows of A", GSL_EBADLEN); } else { size_t i; for (i = 0; i < M; ++i) { const ATOMIC xi = FUNCTION (gsl_vector, get) (x, i); VIEW (gsl_vector, view) v = FUNCTION (gsl_matrix, row) (a, i); FUNCTION (gsl_vector, scale) (&v.vector, xi); } return GSL_SUCCESS; } } int FUNCTION(gsl_matrix, scale_columns) (TYPE(gsl_matrix) * a, const TYPE(gsl_vector) * x) { const size_t N = a->size2; if (x->size != N) { GSL_ERROR ("x must match number of columns of A", GSL_EBADLEN); } else { size_t i; for (i = 0; i < N; ++i) { const ATOMIC xi = FUNCTION (gsl_vector, get) (x, i); VIEW (gsl_vector, view) v = FUNCTION (gsl_matrix, column) (a, i); FUNCTION (gsl_vector, scale) (&v.vector, xi); } return GSL_SUCCESS; } } int FUNCTION(gsl_matrix, add_constant) (TYPE(gsl_matrix) * a, const ATOMIC 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 ATOMIC 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-2.7.1/matrix/getset_source.c0000644016036000116100000001167613135126237013567 00000000000000/**********************************************************************/ /* 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-2.7.1/matrix/view_source.c0000644016036000116100000001310213373111455013230 00000000000000/* 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; { 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 (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 (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 (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 (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-2.7.1/matrix/submatrix_source.c0000644016036000116100000000347313373111455014306 00000000000000/* 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 (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-2.7.1/matrix/oper_complex_source.c0000644016036000116100000001521514151556700014762 00000000000000/* 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, scale_rows) (TYPE(gsl_matrix) * a, const TYPE(gsl_vector) * x) { const size_t M = a->size1; if (x->size != M) { GSL_ERROR ("x must match number of rows of A", GSL_EBADLEN); } else { size_t i; for (i = 0; i < M; ++i) { const BASE xi = FUNCTION (gsl_vector, get) (x, i); VIEW (gsl_vector, view) v = FUNCTION (gsl_matrix, row) (a, i); FUNCTION (gsl_vector, scale) (&v.vector, xi); } return GSL_SUCCESS; } } int FUNCTION(gsl_matrix, scale_columns) (TYPE(gsl_matrix) * a, const TYPE(gsl_vector) * x) { const size_t N = a->size2; if (x->size != N) { GSL_ERROR ("x must match number of columns of A", GSL_EBADLEN); } else { size_t i; for (i = 0; i < N; ++i) { const BASE xi = FUNCTION (gsl_vector, get) (x, i); VIEW (gsl_vector, view) v = FUNCTION (gsl_matrix, column) (a, i); FUNCTION (gsl_vector, scale) (&v.vector, xi); } 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-2.7.1/matrix/swap_complex_source.c0000644016036000116100000000315013667013643014767 00000000000000/* matrix/swap_complex_source.c * * Copyright (C) 2020 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. */ int FUNCTION (gsl_matrix, conjtrans_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; 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++) { size_t j; for (j = 0 ; j < dest_size2; j++) { size_t e1 = (i * dest->tda + j) * 2; size_t e2 = (j * src->tda + i) * 2; dest->data[e1] = src->data[e2]; dest->data[e1 + 1] = -src->data[e2 + 1]; } } return GSL_SUCCESS; } gsl-2.7.1/matrix/gsl_matrix.h0000644016036000116100000000112613135126237013057 00000000000000#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-2.7.1/matrix/gsl_matrix_char.h0000644016036000116100000003042714113500204014045 00000000000000/* 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 #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(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t 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 (CBLAS_UPLO_t Uplo_src, CBLAS_DIAG_t 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); char gsl_matrix_char_norm1 (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 char x); int gsl_matrix_char_scale_rows (gsl_matrix_char * a, const gsl_vector_char * x); int gsl_matrix_char_scale_columns (gsl_matrix_char * a, const gsl_vector_char * x); int gsl_matrix_char_add_constant (gsl_matrix_char * a, const char x); int gsl_matrix_char_add_diagonal (gsl_matrix_char * a, const char 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-2.7.1/matrix/gsl_matrix_complex_double.h0000644016036000116100000003154514151556700016151 00000000000000/* 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 #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(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t 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(CBLAS_UPLO_t Uplo_src, CBLAS_DIAG_t Diag, gsl_matrix_complex * dest, const gsl_matrix_complex * src); int gsl_matrix_complex_conjtrans_memcpy (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_scale_rows (gsl_matrix_complex * a, const gsl_vector_complex * x); int gsl_matrix_complex_scale_columns (gsl_matrix_complex * a, const gsl_vector_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-2.7.1/matrix/gsl_matrix_complex_float.h0000644016036000116100000003415314151556700016002 00000000000000/* 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 #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(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t 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(CBLAS_UPLO_t Uplo_src, CBLAS_DIAG_t Diag, gsl_matrix_complex_float * dest, const gsl_matrix_complex_float * src); int gsl_matrix_complex_float_conjtrans_memcpy (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_scale_rows (gsl_matrix_complex_float * a, const gsl_vector_complex_float * x); int gsl_matrix_complex_float_scale_columns (gsl_matrix_complex_float * a, const gsl_vector_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-2.7.1/matrix/gsl_matrix_complex_long_double.h0000644016036000116100000003666714151556700017202 00000000000000/* 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 #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(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t 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(CBLAS_UPLO_t Uplo_src, CBLAS_DIAG_t Diag, gsl_matrix_complex_long_double * dest, const gsl_matrix_complex_long_double * src); int gsl_matrix_complex_long_double_conjtrans_memcpy (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_scale_rows (gsl_matrix_complex_long_double * a, const gsl_vector_complex_long_double * x); int gsl_matrix_complex_long_double_scale_columns (gsl_matrix_complex_long_double * a, const gsl_vector_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-2.7.1/matrix/gsl_matrix_double.h0000644016036000116100000002646714113500204014413 00000000000000/* 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 #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(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t 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 (CBLAS_UPLO_t Uplo_src, CBLAS_DIAG_t 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); double gsl_matrix_norm1 (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_scale_rows (gsl_matrix * a, const gsl_vector * x); int gsl_matrix_scale_columns (gsl_matrix * a, const gsl_vector * 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-2.7.1/matrix/gsl_matrix_float.h0000644016036000116100000003100614013632200014230 00000000000000/* 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 #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(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t 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 (CBLAS_UPLO_t Uplo_src, CBLAS_DIAG_t 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); float gsl_matrix_float_norm1 (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 float x); int gsl_matrix_float_scale_rows (gsl_matrix_float * a, const gsl_vector_float * x); int gsl_matrix_float_scale_columns (gsl_matrix_float * a, const gsl_vector_float * x); int gsl_matrix_float_add_constant (gsl_matrix_float * a, const float x); int gsl_matrix_float_add_diagonal (gsl_matrix_float * a, const float 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-2.7.1/matrix/gsl_matrix_int.h0000644016036000116100000003005014113500204013712 00000000000000/* 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 #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(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t 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 (CBLAS_UPLO_t Uplo_src, CBLAS_DIAG_t 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_norm1 (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 int x); int gsl_matrix_int_scale_rows (gsl_matrix_int * a, const gsl_vector_int * x); int gsl_matrix_int_scale_columns (gsl_matrix_int * a, const gsl_vector_int * x); int gsl_matrix_int_add_constant (gsl_matrix_int * a, const int x); int gsl_matrix_int_add_diagonal (gsl_matrix_int * a, const int 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-2.7.1/matrix/gsl_matrix_long.h0000644016036000116100000003042714113500204014067 00000000000000/* 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 #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(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t 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 (CBLAS_UPLO_t Uplo_src, CBLAS_DIAG_t 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); long gsl_matrix_long_norm1 (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 long x); int gsl_matrix_long_scale_rows (gsl_matrix_long * a, const gsl_vector_long * x); int gsl_matrix_long_scale_columns (gsl_matrix_long * a, const gsl_vector_long * x); int gsl_matrix_long_add_constant (gsl_matrix_long * a, const long x); int gsl_matrix_long_add_diagonal (gsl_matrix_long * a, const long 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-2.7.1/matrix/gsl_matrix_long_double.h0000644016036000116100000003364014113500204015421 00000000000000/* 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 #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(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t 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 (CBLAS_UPLO_t Uplo_src, CBLAS_DIAG_t 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); long double gsl_matrix_long_double_norm1 (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 long double x); int gsl_matrix_long_double_scale_rows (gsl_matrix_long_double * a, const gsl_vector_long_double * x); int gsl_matrix_long_double_scale_columns (gsl_matrix_long_double * a, const gsl_vector_long_double * x); int gsl_matrix_long_double_add_constant (gsl_matrix_long_double * a, const long double x); int gsl_matrix_long_double_add_diagonal (gsl_matrix_long_double * a, const long 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-2.7.1/matrix/gsl_matrix_short.h0000644016036000116100000003100614113500204014261 00000000000000/* 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 #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(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t 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 (CBLAS_UPLO_t Uplo_src, CBLAS_DIAG_t 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); short gsl_matrix_short_norm1 (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 short x); int gsl_matrix_short_scale_rows (gsl_matrix_short * a, const gsl_vector_short * x); int gsl_matrix_short_scale_columns (gsl_matrix_short * a, const gsl_vector_short * x); int gsl_matrix_short_add_constant (gsl_matrix_short * a, const short x); int gsl_matrix_short_add_diagonal (gsl_matrix_short * a, const short 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-2.7.1/matrix/gsl_matrix_uchar.h0000644016036000116100000003130614113500204014227 00000000000000/* 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 #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(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t 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 (CBLAS_UPLO_t Uplo_src, CBLAS_DIAG_t 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); unsigned char gsl_matrix_uchar_norm1 (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 unsigned char x); int gsl_matrix_uchar_scale_rows (gsl_matrix_uchar * a, const gsl_vector_uchar * x); int gsl_matrix_uchar_scale_columns (gsl_matrix_uchar * a, const gsl_vector_uchar * x); int gsl_matrix_uchar_add_constant (gsl_matrix_uchar * a, const unsigned char x); int gsl_matrix_uchar_add_diagonal (gsl_matrix_uchar * a, const unsigned char 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-2.7.1/matrix/gsl_matrix_uint.h0000644016036000116100000003072714113500204014112 00000000000000/* 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 #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(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t 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 (CBLAS_UPLO_t Uplo_src, CBLAS_DIAG_t 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); unsigned int gsl_matrix_uint_norm1 (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 unsigned int x); int gsl_matrix_uint_scale_rows (gsl_matrix_uint * a, const gsl_vector_uint * x); int gsl_matrix_uint_scale_columns (gsl_matrix_uint * a, const gsl_vector_uint * x); int gsl_matrix_uint_add_constant (gsl_matrix_uint * a, const unsigned int x); int gsl_matrix_uint_add_diagonal (gsl_matrix_uint * a, const unsigned int 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-2.7.1/matrix/gsl_matrix_ulong.h0000644016036000116100000003130614113500204014251 00000000000000/* 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 #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(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t 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 (CBLAS_UPLO_t Uplo_src, CBLAS_DIAG_t 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); unsigned long gsl_matrix_ulong_norm1 (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 unsigned long x); int gsl_matrix_ulong_scale_rows (gsl_matrix_ulong * a, const gsl_vector_ulong * x); int gsl_matrix_ulong_scale_columns (gsl_matrix_ulong * a, const gsl_vector_ulong * x); int gsl_matrix_ulong_add_constant (gsl_matrix_ulong * a, const unsigned long x); int gsl_matrix_ulong_add_diagonal (gsl_matrix_ulong * a, const unsigned long 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-2.7.1/matrix/gsl_matrix_ushort.h0000644016036000116100000003166514113500204014461 00000000000000/* 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 #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(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t 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 (CBLAS_UPLO_t Uplo_src, CBLAS_DIAG_t 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); unsigned short gsl_matrix_ushort_norm1 (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 unsigned short x); int gsl_matrix_ushort_scale_rows (gsl_matrix_ushort * a, const gsl_vector_ushort * x); int gsl_matrix_ushort_scale_columns (gsl_matrix_ushort * a, const gsl_vector_ushort * x); int gsl_matrix_ushort_add_constant (gsl_matrix_ushort * a, const unsigned short x); int gsl_matrix_ushort_add_diagonal (gsl_matrix_ushort * a, const unsigned short 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-2.7.1/matrix/Makefile.in0000644016036000116100000011555014151557214012613 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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 \ ../blas/libgslblas.la ../cblas/libgslcblas.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 \ ../blas/libgslblas.la ../cblas/libgslcblas.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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/copy.Plo ./$(DEPDIR)/file.Plo \ ./$(DEPDIR)/getset.Plo ./$(DEPDIR)/init.Plo \ ./$(DEPDIR)/matrix.Plo ./$(DEPDIR)/minmax.Plo \ ./$(DEPDIR)/oper.Plo ./$(DEPDIR)/prop.Plo \ ./$(DEPDIR)/rowcol.Plo ./$(DEPDIR)/submatrix.Plo \ ./$(DEPDIR)/swap.Plo ./$(DEPDIR)/test.Po \ ./$(DEPDIR)/test_static.Po ./$(DEPDIR)/view.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 ../blas/libgslblas.la ../cblas/libgslcblas.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 ../blas/libgslblas.la ../cblas/libgslcblas.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 test_static.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 swap_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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getset.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minmax.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oper.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prop.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rowcol.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/submatrix.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/swap.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_static.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/view.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/copy.Plo -rm -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/getset.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/matrix.Plo -rm -f ./$(DEPDIR)/minmax.Plo -rm -f ./$(DEPDIR)/oper.Plo -rm -f ./$(DEPDIR)/prop.Plo -rm -f ./$(DEPDIR)/rowcol.Plo -rm -f ./$(DEPDIR)/submatrix.Plo -rm -f ./$(DEPDIR)/swap.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test_static.Po -rm -f ./$(DEPDIR)/view.Plo -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 -f ./$(DEPDIR)/copy.Plo -rm -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/getset.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/matrix.Plo -rm -f ./$(DEPDIR)/minmax.Plo -rm -f ./$(DEPDIR)/oper.Plo -rm -f ./$(DEPDIR)/prop.Plo -rm -f ./$(DEPDIR)/rowcol.Plo -rm -f ./$(DEPDIR)/submatrix.Plo -rm -f ./$(DEPDIR)/swap.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test_static.Po -rm -f ./$(DEPDIR)/view.Plo -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/matrix/ChangeLog0000644016036000116100000001751313373111455012316 000000000000002017-01-07 Rhys Ulerich * init_source.c: permit zero-dimensioned matrices (#49988) * submatrix_source.c: permit zero-dimensioned submatrices (#49988) * view_source.c: permit zero-dimensioned views * Audit for n-1 underflows when n = 0 2011-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-2.7.1/matrix/TODO0000644016036000116100000000055413373111455011231 00000000000000# -*- 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-2.7.1/matrix/init.c0000644016036000116100000000340513373111455011646 00000000000000#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-2.7.1/matrix/matrix.c0000644016036000116100000000031113373111455012200 00000000000000#include #include #include /* Compile all the inline matrix functions */ #define COMPILE_INLINE_STATIC #include "build.h" #include gsl-2.7.1/matrix/file.c0000644016036000116100000000341513135126237011623 00000000000000#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-2.7.1/matrix/rowcol.c0000644016036000116100000000710713135126237012213 00000000000000#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-2.7.1/matrix/swap.c0000644016036000116100000000364413667013667011676 00000000000000#include #include #include #include #include #include #define BASE_GSL_COMPLEX_LONG #include "templates_on.h" #include "swap_source.c" #include "swap_complex_source.c" #include "templates_off.h" #undef BASE_GSL_COMPLEX_LONG #define BASE_GSL_COMPLEX #include "templates_on.h" #include "swap_source.c" #include "swap_complex_source.c" #include "templates_off.h" #undef BASE_GSL_COMPLEX #define BASE_GSL_COMPLEX_FLOAT #include "templates_on.h" #include "swap_source.c" #include "swap_complex_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-2.7.1/matrix/copy.c0000644016036000116100000000350013521343130011641 00000000000000#include #include #include #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-2.7.1/matrix/minmax.c0000644016036000116100000000260313135126237012173 00000000000000#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-2.7.1/matrix/prop.c0000644016036000116100000000341313673037100011657 00000000000000#include #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-2.7.1/matrix/oper.c0000644016036000116100000000346013135126237011651 00000000000000#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-2.7.1/matrix/getset.c0000644016036000116100000000345113135126237012177 00000000000000#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-2.7.1/matrix/view.c0000644016036000116100000000673113135126237011662 00000000000000#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-2.7.1/matrix/submatrix.c0000644016036000116100000000723313135126237012724 00000000000000#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-2.7.1/matrix/view.h0000644016036000116100000000024513135126237011661 00000000000000#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-2.7.1/matrix/test.c0000644016036000116100000001462313521347701011666 00000000000000/* 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); test_ops (N, M); test_float_ops (N, M); test_long_double_ops (N, M); test_ulong_ops (N, M); test_long_ops (N, M); test_uint_ops (N, M); test_int_ops (N, M); test_ushort_ops (N, M); test_short_ops (N, M); test_uchar_ops (N, M); test_char_ops (N, M); /* 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-2.7.1/matrix/test_static.c0000644016036000116100000000015213135126237013225 00000000000000 #undef HAVE_INLINE #ifndef NO_INLINE #define NO_INLINE #endif #define DESC " (static)" #include "test.c" gsl-2.7.1/permutation/0000755016036000116100000000000014151602574011662 500000000000000gsl-2.7.1/permutation/Makefile.am0000644016036000116100000000331713373111456013641 00000000000000noinst_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-2.7.1/permutation/permute_source.c0000644016036000116100000001051113373111456015004 00000000000000/* 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-2.7.1/permutation/gsl_permutation.h0000644016036000116100000000642213373111456015172 00000000000000/* 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-2.7.1/permutation/gsl_permute.h0000644016036000116100000000114613135126237014301 00000000000000#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-2.7.1/permutation/gsl_permute_char.h0000644016036000116100000000262613135126237015302 00000000000000/* 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-2.7.1/permutation/gsl_permute_complex_double.h0000644016036000116100000000274513135126237017370 00000000000000/* 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-2.7.1/permutation/gsl_permute_complex_float.h0000644016036000116100000000275313135126237017222 00000000000000/* 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-2.7.1/permutation/gsl_permute_complex_long_double.h0000644016036000116100000000303313135126237020376 00000000000000/* 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-2.7.1/permutation/gsl_permute_double.h0000644016036000116100000000263013135126237015632 00000000000000/* 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-2.7.1/permutation/gsl_permute_float.h0000644016036000116100000000263613135126237015473 00000000000000/* 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-2.7.1/permutation/gsl_permute_int.h0000644016036000116100000000261613135126237015156 00000000000000/* 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-2.7.1/permutation/gsl_permute_long.h0000644016036000116100000000262613135126237015324 00000000000000/* 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-2.7.1/permutation/gsl_permute_long_double.h0000644016036000116100000000271613135126237016656 00000000000000/* 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-2.7.1/permutation/gsl_permute_short.h0000644016036000116100000000263613135126237015525 00000000000000/* 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-2.7.1/permutation/gsl_permute_uchar.h0000644016036000116100000000265613135126237015472 00000000000000/* 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-2.7.1/permutation/gsl_permute_uint.h0000644016036000116100000000264613135126237015346 00000000000000/* 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-2.7.1/permutation/gsl_permute_ulong.h0000644016036000116100000000265613135126237015514 00000000000000/* 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-2.7.1/permutation/gsl_permute_ushort.h0000644016036000116100000000266613135126237015715 00000000000000/* 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-2.7.1/permutation/gsl_permute_vector.h0000644016036000116100000000133513135126237015663 00000000000000#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-2.7.1/permutation/gsl_permute_vector_char.h0000644016036000116100000000267113135126237016664 00000000000000/* 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-2.7.1/permutation/gsl_permute_vector_complex_double.h0000644016036000116100000000276713135126237020756 00000000000000/* 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-2.7.1/permutation/gsl_permute_vector_complex_float.h0000644016036000116100000000301213135126237020571 00000000000000/* 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-2.7.1/permutation/gsl_permute_vector_complex_long_double.h0000644016036000116100000000310013135126237021753 00000000000000/* 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-2.7.1/permutation/gsl_permute_vector_double.h0000644016036000116100000000265713135126237017225 00000000000000/* 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-2.7.1/permutation/gsl_permute_vector_float.h0000644016036000116100000000270213135126237017047 00000000000000/* 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-2.7.1/permutation/gsl_permute_vector_int.h0000644016036000116100000000266013135126237016537 00000000000000/* 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-2.7.1/permutation/gsl_permute_vector_long.h0000644016036000116100000000267113135126237016706 00000000000000/* 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-2.7.1/permutation/gsl_permute_vector_long_double.h0000644016036000116100000000277013135126237020240 00000000000000/* 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-2.7.1/permutation/gsl_permute_vector_short.h0000644016036000116100000000270213135126237017101 00000000000000/* 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-2.7.1/permutation/gsl_permute_vector_uchar.h0000644016036000116100000000270213135126237017044 00000000000000/* 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-2.7.1/permutation/gsl_permute_vector_uint.h0000644016036000116100000000267113135126237016726 00000000000000/* 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-2.7.1/permutation/gsl_permute_vector_ulong.h0000644016036000116100000000270213135126237017066 00000000000000/* 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-2.7.1/permutation/gsl_permute_vector_ushort.h0000644016036000116100000000271313135126237017270 00000000000000/* 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-2.7.1/permutation/gsl_permute_matrix_char.h0000644016036000116100000000250713373111456016665 00000000000000/* 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-2.7.1/permutation/gsl_permute_matrix_complex_long_double.h0000644016036000116100000000266013373111456021770 00000000000000/* 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-2.7.1/permutation/gsl_permute_matrix.h0000644016036000116100000000133513373111456015666 00000000000000#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-2.7.1/permutation/gsl_permute_matrix_long.h0000644016036000116100000000250713373111456016707 00000000000000/* 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-2.7.1/permutation/gsl_permute_matrix_uint.h0000644016036000116100000000250713373111456016727 00000000000000/* 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-2.7.1/permutation/gsl_permute_matrix_complex_double.h0000644016036000116100000000257713373111456020760 00000000000000/* 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-2.7.1/permutation/gsl_permute_matrix_double.h0000644016036000116100000000250713373111456017222 00000000000000/* 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-2.7.1/permutation/gsl_permute_matrix_int.h0000644016036000116100000000250013373111456016533 00000000000000/* 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-2.7.1/permutation/gsl_permute_matrix_short.h0000644016036000116100000000251613373111456017107 00000000000000/* 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-2.7.1/permutation/gsl_permute_matrix_ulong.h0000644016036000116100000000251613373111456017074 00000000000000/* 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-2.7.1/permutation/gsl_permute_matrix_complex_float.h0000644016036000116100000000260613373111456020604 00000000000000/* 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-2.7.1/permutation/gsl_permute_matrix_float.h0000644016036000116100000000251613373111456017055 00000000000000/* 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-2.7.1/permutation/gsl_permute_matrix_long_double.h0000644016036000116100000000257013373111456020241 00000000000000/* 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-2.7.1/permutation/gsl_permute_matrix_uchar.h0000644016036000116100000000251613373111456017052 00000000000000/* 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-2.7.1/permutation/gsl_permute_matrix_ushort.h0000644016036000116100000000252513373111456017274 00000000000000/* 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-2.7.1/permutation/Makefile.in0000644016036000116100000011204614151557215013654 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/canonical.Plo ./$(DEPDIR)/file.Plo \ ./$(DEPDIR)/init.Plo ./$(DEPDIR)/inline.Plo \ ./$(DEPDIR)/permutation.Plo ./$(DEPDIR)/permute.Plo \ ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/permutation.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/permute.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/canonical.Plo -rm -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/inline.Plo -rm -f ./$(DEPDIR)/permutation.Plo -rm -f ./$(DEPDIR)/permute.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/canonical.Plo -rm -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/inline.Plo -rm -f ./$(DEPDIR)/permutation.Plo -rm -f ./$(DEPDIR)/permute.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile #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-2.7.1/permutation/ChangeLog0000644016036000116100000000432413373111456013356 000000000000002009-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-2.7.1/permutation/init.c0000644016036000116100000000425413373111456012715 00000000000000/* 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-2.7.1/permutation/file.c0000644016036000116100000000463113135126237012667 00000000000000/* 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-2.7.1/permutation/permutation.c0000644016036000116100000001221113373111456014311 00000000000000/* 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-2.7.1/permutation/permute.c0000644016036000116100000000363413373111456013434 00000000000000#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-2.7.1/permutation/canonical.c0000644016036000116100000000703013135126237013673 00000000000000/* 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-2.7.1/permutation/inline.c0000644016036000116100000000170113373111456013222 00000000000000/* 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-2.7.1/permutation/test.c0000644016036000116100000002340413135126237012726 00000000000000/* 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-2.7.1/combination/0000755016036000116100000000000014151602575011616 500000000000000gsl-2.7.1/combination/Makefile.am0000644016036000116100000000130013373111454013560 00000000000000noinst_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-2.7.1/combination/gsl_combination.h0000644016036000116100000000546213373111454015061 00000000000000/* 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-2.7.1/combination/Makefile.in0000644016036000116100000010711214151557214013604 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/combination.Plo ./$(DEPDIR)/file.Plo \ ./$(DEPDIR)/init.Plo ./$(DEPDIR)/inline.Plo \ ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/combination.Plo -rm -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/inline.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/combination.Plo -rm -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/inline.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile #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-2.7.1/combination/ChangeLog0000644016036000116100000000261713373111454013312 000000000000002012-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-2.7.1/combination/TODO0000644016036000116100000000020713373111454012221 00000000000000# -*- org -*- #+CATEGORY: combination * The module has a lot of overlap with multiset/ some of the functions could be abstracted out. gsl-2.7.1/combination/init.c0000644016036000116100000000537313373111454012651 00000000000000/* 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-2.7.1/combination/file.c0000644016036000116100000000464413135126237012626 00000000000000/* 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-2.7.1/combination/combination.c0000644016036000116100000000706113373111454014204 00000000000000/* 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-2.7.1/combination/inline.c0000644016036000116100000000162113373111454013154 00000000000000/* 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-2.7.1/combination/test.c0000644016036000116100000001460313135126237012662 00000000000000/* 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-2.7.1/multiset/0000755016036000116100000000000014151602575011162 500000000000000gsl-2.7.1/multiset/Makefile.am0000644016036000116100000000121113373111456013127 00000000000000noinst_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-2.7.1/multiset/gsl_multiset.h0000644016036000116100000000534013373111456013766 00000000000000/* 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-2.7.1/multiset/Makefile.in0000644016036000116100000010672414151557215013161 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/file.Plo ./$(DEPDIR)/init.Plo \ ./$(DEPDIR)/inline.Plo ./$(DEPDIR)/multiset.Plo \ ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiset.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/inline.Plo -rm -f ./$(DEPDIR)/multiset.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/inline.Plo -rm -f ./$(DEPDIR)/multiset.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile #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-2.7.1/multiset/ChangeLog0000644016036000116100000000077613373111456012664 000000000000002011-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-2.7.1/multiset/TODO0000644016036000116100000000020713373111456011567 00000000000000# -*- org -*- #+CATEGORY: multiset * The module has a lot of overlap with combination/ some of the functions could be abstracted out. gsl-2.7.1/multiset/init.c0000644016036000116100000000523013373111456012207 00000000000000/* 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-2.7.1/multiset/file.c0000644016036000116100000000470213373111456012166 00000000000000/* 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-2.7.1/multiset/multiset.c0000644016036000116100000000655613373111456013126 00000000000000/* 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-2.7.1/multiset/inline.c0000644016036000116100000000160713373111456012526 00000000000000/* 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-2.7.1/multiset/test.c0000644016036000116100000002057613373111456012235 00000000000000/* 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-2.7.1/sort/0000755016036000116100000000000014151602575010303 500000000000000gsl-2.7.1/sort/Makefile.am0000644016036000116100000000214313517225234012255 00000000000000noinst_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 ../blas/libgslblas.la ../cblas/libgslcblas.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la gsl-2.7.1/sort/sortvec_source.c0000644016036000116100000000777213373111456013447 00000000000000/* * 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-2.7.1/sort/sortvecind_source.c0000644016036000116100000000467713135126237014142 00000000000000/* * 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-2.7.1/sort/subset_source.c0000644016036000116100000000563013135126237013255 00000000000000/* 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-2.7.1/sort/subsetind_source.c0000644016036000116100000000574113135126237013753 00000000000000/* 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-2.7.1/sort/test_source.c0000644016036000116100000002454313373111456012734 00000000000000/* 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-2.7.1/sort/test_heapsort.c0000644016036000116100000000776313135126237013265 00000000000000/* 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-2.7.1/sort/gsl_heapsort.h0000644016036000116100000000265613135126237013074 00000000000000/* 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-2.7.1/sort/gsl_sort.h0000644016036000116100000000066313135126237012232 00000000000000#ifndef __GSL_SORT_H__ #define __GSL_SORT_H__ #include #include #include #include #include #include #include #include #include #include #include #endif /* __GSL_SORT_H__ */ gsl-2.7.1/sort/gsl_sort_char.h0000644016036000116100000000366613373111456013236 00000000000000/* 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-2.7.1/sort/gsl_sort_double.h0000644016036000116100000000365713373111456013573 00000000000000/* 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-2.7.1/sort/gsl_sort_float.h0000644016036000116100000000371313373111456013417 00000000000000/* 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-2.7.1/sort/gsl_sort_int.h0000644016036000116100000000364113373111456013104 00000000000000/* 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-2.7.1/sort/gsl_sort_long.h0000644016036000116100000000366613373111456013260 00000000000000/* 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-2.7.1/sort/gsl_sort_long_double.h0000644016036000116100000000411113373111456014574 00000000000000/* 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-2.7.1/sort/gsl_sort_short.h0000644016036000116100000000371313373111456013451 00000000000000/* 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-2.7.1/sort/gsl_sort_uchar.h0000644016036000116100000000403313373111456013410 00000000000000/* 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-2.7.1/sort/gsl_sort_uint.h0000644016036000116100000000400613373111456013265 00000000000000/* 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-2.7.1/sort/gsl_sort_ulong.h0000644016036000116100000000403313373111456013432 00000000000000/* 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-2.7.1/sort/gsl_sort_ushort.h0000644016036000116100000000406013373111456013632 00000000000000/* 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-2.7.1/sort/gsl_sort_vector.h0000644016036000116100000000102513135126237013605 00000000000000#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-2.7.1/sort/gsl_sort_vector_char.h0000644016036000116100000000352613373111456014613 00000000000000/* 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-2.7.1/sort/gsl_sort_vector_double.h0000644016036000116100000000343113373111456015143 00000000000000/* 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-2.7.1/sort/gsl_sort_vector_float.h0000644016036000116100000000355413373111456015004 00000000000000/* 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-2.7.1/sort/gsl_sort_vector_int.h0000644016036000116100000000350013373111456014460 00000000000000/* 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-2.7.1/sort/gsl_sort_vector_long.h0000644016036000116100000000352613373111456014635 00000000000000/* 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-2.7.1/sort/gsl_sort_vector_long_double.h0000644016036000116100000000376013373111456016167 00000000000000/* 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-2.7.1/sort/gsl_sort_vector_short.h0000644016036000116100000000355413373111456015036 00000000000000/* 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-2.7.1/sort/gsl_sort_vector_uchar.h0000644016036000116100000000357413373111456015003 00000000000000/* 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-2.7.1/sort/gsl_sort_vector_uint.h0000644016036000116100000000354613373111456014657 00000000000000/* 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-2.7.1/sort/gsl_sort_vector_ulong.h0000644016036000116100000000357413373111456015025 00000000000000/* 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-2.7.1/sort/gsl_sort_vector_ushort.h0000644016036000116100000000362213373111456015217 00000000000000/* 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-2.7.1/sort/Makefile.in0000644016036000116100000011052714151557215012276 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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 ../blas/libgslblas.la \ ../cblas/libgslcblas.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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/sort.Plo ./$(DEPDIR)/sortind.Plo \ ./$(DEPDIR)/sortvec.Plo ./$(DEPDIR)/sortvecind.Plo \ ./$(DEPDIR)/subset.Plo ./$(DEPDIR)/subsetind.Plo \ ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 ../blas/libgslblas.la ../cblas/libgslcblas.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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sortind.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sortvec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sortvecind.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subset.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subsetind.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/sort.Plo -rm -f ./$(DEPDIR)/sortind.Plo -rm -f ./$(DEPDIR)/sortvec.Plo -rm -f ./$(DEPDIR)/sortvecind.Plo -rm -f ./$(DEPDIR)/subset.Plo -rm -f ./$(DEPDIR)/subsetind.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/sort.Plo -rm -f ./$(DEPDIR)/sortind.Plo -rm -f ./$(DEPDIR)/sortvec.Plo -rm -f ./$(DEPDIR)/sortvecind.Plo -rm -f ./$(DEPDIR)/subset.Plo -rm -f ./$(DEPDIR)/subsetind.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/sort/ChangeLog0000644016036000116100000000412613373111456011776 000000000000002008-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-2.7.1/sort/TODO0000644016036000116100000000225713373111456010717 00000000000000# -*- 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-2.7.1/sort/sort.c0000644016036000116100000000523713135126237011362 00000000000000/* * 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-2.7.1/sort/sortind.c0000644016036000116100000000472513135126237012056 00000000000000/* * 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-2.7.1/sort/sortvec.c0000644016036000116100000000415213135126237012053 00000000000000/* * 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-2.7.1/sort/sortvecind.c0000644016036000116100000000421313135126237012544 00000000000000/* * 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-2.7.1/sort/subset.c0000644016036000116100000000371413135126237011676 00000000000000/* 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-2.7.1/sort/subsetind.c0000644016036000116100000000376013135126237012372 00000000000000/* 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-2.7.1/sort/test.c0000644016036000116100000000647313135126237011355 00000000000000/* 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-2.7.1/ieee-utils/0000755016036000116100000000000014151602575011361 500000000000000gsl-2.7.1/ieee-utils/Makefile.am0000644016036000116100000000121413373111455013330 00000000000000noinst_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-2.7.1/ieee-utils/fp-aix.c0000644016036000116100000000772013373111455012634 00000000000000/* 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-2.7.1/ieee-utils/fp-darwin.c0000644016036000116100000000555313135126237013341 00000000000000/* 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-2.7.1/ieee-utils/fp-darwin86.c0000644016036000116100000001237513135126237013517 00000000000000/* 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-2.7.1/ieee-utils/fp-hpux.c0000644016036000116100000000545713135126237013044 00000000000000/* 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-2.7.1/ieee-utils/fp-hpux11.c0000644016036000116100000000536513135126237013204 00000000000000/* 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-2.7.1/ieee-utils/fp-irix.c0000644016036000116100000000542013135126237013021 00000000000000/* 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-2.7.1/ieee-utils/fp-gnum68k.c0000644016036000116100000000527313135126237013353 00000000000000/* 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-2.7.1/ieee-utils/fp-gnuppc.c0000644016036000116100000000533613135126237013350 00000000000000/* 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-2.7.1/ieee-utils/fp-solaris.c0000644016036000116100000000544613135126237013532 00000000000000/* 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-2.7.1/ieee-utils/fp-gnusparc.c0000644016036000116100000000466213135126237013677 00000000000000/* 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-2.7.1/ieee-utils/fp-sunos4.c0000644016036000116100000000632213135126237013303 00000000000000/* 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-2.7.1/ieee-utils/fp-tru64.c0000644016036000116100000001317713135126237013042 00000000000000/* 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-2.7.1/ieee-utils/fp-unknown.c0000644016036000116100000000213113135126237013541 00000000000000/* 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-2.7.1/ieee-utils/fp-gnux86.c0000644016036000116100000000545613135126237013216 00000000000000/* 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-2.7.1/ieee-utils/fp-freebsd.c0000644016036000116100000000466013135126237013465 00000000000000/* 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-2.7.1/ieee-utils/fp-os2emx.c0000644016036000116100000000452713135126237013272 00000000000000/* 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-2.7.1/ieee-utils/fp-netbsd.c0000644016036000116100000000561013135126237013326 00000000000000/* 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-2.7.1/ieee-utils/fp-openbsd.c0000644016036000116100000000575113135126237013507 00000000000000/* 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-2.7.1/ieee-utils/fp-gnuc99.c0000644016036000116100000001046013135126237013164 00000000000000/* 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-2.7.1/ieee-utils/endian.c0000644016036000116100000000216613135126237012705 00000000000000/* 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-2.7.1/ieee-utils/standardize.c0000644016036000116100000000257613135126237013764 00000000000000/* 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-2.7.1/ieee-utils/gsl_ieee_utils.h0000644016036000116100000000523313135126237014446 00000000000000/* 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-2.7.1/ieee-utils/Makefile.in0000644016036000116100000010706214151557214013353 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/env.Plo ./$(DEPDIR)/fp.Plo \ ./$(DEPDIR)/make_rep.Plo ./$(DEPDIR)/print.Plo \ ./$(DEPDIR)/read.Plo ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/make_rep.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/env.Plo -rm -f ./$(DEPDIR)/fp.Plo -rm -f ./$(DEPDIR)/make_rep.Plo -rm -f ./$(DEPDIR)/print.Plo -rm -f ./$(DEPDIR)/read.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/env.Plo -rm -f ./$(DEPDIR)/fp.Plo -rm -f ./$(DEPDIR)/make_rep.Plo -rm -f ./$(DEPDIR)/print.Plo -rm -f ./$(DEPDIR)/read.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/ieee-utils/ChangeLog0000644016036000116100000001661213373111455013056 000000000000002010-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-2.7.1/ieee-utils/TODO0000644016036000116100000000016413373111455011767 00000000000000# -*- org -*- #+CATEGORY: ieee-utils * Fix up ieee-utils/fp-m68klinux.c for correct behavior and actually test it. gsl-2.7.1/ieee-utils/print.c0000644016036000116100000000523413135126237012602 00000000000000/* 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-2.7.1/ieee-utils/make_rep.c0000644016036000116100000001064713135126237013235 00000000000000/* 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-2.7.1/ieee-utils/env.c0000644016036000116100000000613113373111455012233 00000000000000/* 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; if(p == 0 || *p == '\0') 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-2.7.1/ieee-utils/fp.c0000644016036000116100000000235413135126237012053 00000000000000#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-2.7.1/ieee-utils/read.c0000644016036000116100000001210013373111455012347 00000000000000/* 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-2.7.1/ieee-utils/test.c0000644016036000116100000003510513135126237012425 00000000000000/* 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-2.7.1/cblas/0000755016036000116100000000000014151602575010400 500000000000000gsl-2.7.1/cblas/Makefile.am0000644016036000116100000000626113373111454012355 00000000000000lib_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-2.7.1/cblas/tests.c0000644016036000116100000000127413135126237011627 00000000000000 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-2.7.1/cblas/tests.h0000644016036000116100000000176013135126237011634 00000000000000void 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-2.7.1/cblas/error_cblas.h0000644016036000116100000000617013373111454012766 00000000000000/* 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-2.7.1/cblas/error_cblas_l2.h0000644016036000116100000001562213373111454013365 00000000000000/* 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 "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) 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-2.7.1/cblas/source_asum_c.h0000644016036000116100000000200013135126237013305 00000000000000/* 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-2.7.1/cblas/source_asum_r.h0000644016036000116100000000173213135126237013337 00000000000000/* 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-2.7.1/cblas/source_axpy_c.h0000644016036000116100000000247213135126237013336 00000000000000/* 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-2.7.1/cblas/source_axpy_r.h0000644016036000116100000000251713135126237013355 00000000000000/* 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-2.7.1/cblas/source_copy_c.h0000644016036000116100000000201013135126237013313 00000000000000/* 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-2.7.1/cblas/source_copy_r.h0000644016036000116100000000172113135126237013342 00000000000000/* 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-2.7.1/cblas/source_dot_c.h0000644016036000116100000000250013135126237013133 00000000000000/* 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-2.7.1/cblas/source_dot_r.h0000644016036000116100000000177313135126237013165 00000000000000/* 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-2.7.1/cblas/source_gbmv_c.h0000644016036000116100000001353613373111454013312 00000000000000/* 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-2.7.1/cblas/source_gbmv_r.h0000644016036000116100000000537413373111454013332 00000000000000/* 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-2.7.1/cblas/source_gemm_c.h0000644016036000116100000001423713373111454013303 00000000000000/* 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-2.7.1/cblas/source_gemm_r.h0000644016036000116100000000617013373111454013317 00000000000000/* 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-2.7.1/cblas/source_gemv_c.h0000644016036000116100000001212413373111454013305 00000000000000/* 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-2.7.1/cblas/source_gemv_r.h0000644016036000116100000000467413373111454013337 00000000000000/* 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-2.7.1/cblas/source_ger.h0000644016036000116100000000277513373111454012635 00000000000000/* 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-2.7.1/cblas/source_gerc.h0000644016036000116100000000470213373111454012770 00000000000000/* 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-2.7.1/cblas/source_geru.h0000644016036000116100000000470013373111454013010 00000000000000/* 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-2.7.1/cblas/source_hbmv.h0000644016036000116100000001246713373111454013013 00000000000000/* 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-2.7.1/cblas/source_hemm.h0000644016036000116100000002050013373111454012770 00000000000000/* 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-2.7.1/cblas/source_hemv.h0000644016036000116100000001230013373111454013000 00000000000000/* 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-2.7.1/cblas/source_her.h0000644016036000116100000000541713373111454012632 00000000000000/* 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-2.7.1/cblas/source_her2.h0000644016036000116100000001065113373111454012710 00000000000000/* 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-2.7.1/cblas/source_her2k.h0000644016036000116100000002542213373111454013065 00000000000000/* 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-2.7.1/cblas/source_herk.h0000644016036000116100000001215413373111454013001 00000000000000/* 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-2.7.1/cblas/source_hpmv.h0000644016036000116100000001230113373111454013014 00000000000000/* 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-2.7.1/cblas/source_hpr.h0000644016036000116100000000544313373111454012644 00000000000000/* 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-2.7.1/cblas/source_hpr2.h0000644016036000116100000001070313373111454012721 00000000000000/* 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-2.7.1/cblas/source_iamax_c.h0000644016036000116100000000215013135126237013445 00000000000000/* 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-2.7.1/cblas/source_iamax_r.h0000644016036000116100000000206513135126237013471 00000000000000/* 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-2.7.1/cblas/source_nrm2_c.h0000644016036000116100000000300313135126237013222 00000000000000/* 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-2.7.1/cblas/source_nrm2_r.h0000644016036000116100000000243713135126237013253 00000000000000/* 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-2.7.1/cblas/source_rot.h0000644016036000116100000000204513135126237012653 00000000000000/* 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-2.7.1/cblas/source_rotg.h0000644016036000116100000000246513135126237013030 00000000000000/* 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-2.7.1/cblas/source_rotm.h0000644016036000116100000000270413373111454013031 00000000000000/* 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-2.7.1/cblas/source_rotmg.h0000644016036000116100000000552013135126237013200 00000000000000/* 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-2.7.1/cblas/source_sbmv.h0000644016036000116100000000546713373111454013030 00000000000000/* 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-2.7.1/cblas/source_scal_c.h0000644016036000116100000000230613373111454013272 00000000000000/* 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-2.7.1/cblas/source_scal_c_s.h0000644016036000116100000000173413373111454013620 00000000000000/* 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-2.7.1/cblas/source_scal_r.h0000644016036000116100000000167213373111454013316 00000000000000/* 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-2.7.1/cblas/source_spmv.h0000644016036000116100000000541113373111454013033 00000000000000/* 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-2.7.1/cblas/source_spr.h0000644016036000116100000000332213373111454012651 00000000000000/* 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-2.7.1/cblas/source_spr2.h0000644016036000116100000000401513373111454012733 00000000000000/* 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-2.7.1/cblas/source_swap_c.h0000644016036000116100000000220213135126237013316 00000000000000/* 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-2.7.1/cblas/source_swap_r.h0000644016036000116100000000177513135126237013353 00000000000000/* 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-2.7.1/cblas/source_symm_c.h0000644016036000116100000002105513373111454013337 00000000000000/* 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-2.7.1/cblas/source_symm_r.h0000644016036000116100000000701213373111454013353 00000000000000/* 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-2.7.1/cblas/source_symv.h0000644016036000116100000000540613373111454013050 00000000000000/* 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-2.7.1/cblas/source_syr.h0000644016036000116100000000331713373111454012666 00000000000000/* 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-2.7.1/cblas/source_syr2.h0000644016036000116100000000401413373111454012743 00000000000000/* 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-2.7.1/cblas/source_syr2k_c.h0000644016036000116100000001714113373111454013425 00000000000000/* 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-2.7.1/cblas/source_syr2k_r.h0000644016036000116100000000652013373111454013443 00000000000000/* 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-2.7.1/cblas/source_syrk_c.h0000644016036000116100000001415513373111454013345 00000000000000/* 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-2.7.1/cblas/source_syrk_r.h0000644016036000116100000000616213373111454013363 00000000000000/* 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-2.7.1/cblas/source_tbmv_c.h0000644016036000116100000001432113373111454013320 00000000000000/* 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-2.7.1/cblas/source_tbmv_r.h0000644016036000116100000000677313373111454013353 00000000000000/* 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-2.7.1/cblas/source_tbsv_c.h0000644016036000116100000001514413373111454013332 00000000000000/* 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-2.7.1/cblas/source_tbsv_r.h0000644016036000116100000000755313373111454013356 00000000000000/* 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-2.7.1/cblas/source_tpmv_c.h0000644016036000116100000001367613373111454013352 00000000000000/* 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-2.7.1/cblas/source_tpmv_r.h0000644016036000116100000000637113373111454013363 00000000000000/* 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-2.7.1/cblas/source_tpsv_c.h0000644016036000116100000002017613373111454013351 00000000000000/* 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-2.7.1/cblas/source_tpsv_r.h0000644016036000116100000000745213373111454013372 00000000000000/* 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-2.7.1/cblas/source_trmm_c.h0000644016036000116100000003113213373111454013326 00000000000000/* 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-2.7.1/cblas/source_trmm_r.h0000644016036000116100000001245513373111454013354 00000000000000/* 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-2.7.1/cblas/source_trmv_c.h0000644016036000116100000001356313373111454013347 00000000000000/* 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-2.7.1/cblas/source_trmv_r.h0000644016036000116100000000702313373111454013360 00000000000000/* 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-2.7.1/cblas/source_trsm_c.h0000644016036000116100000003622713373111454013346 00000000000000/* 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-2.7.1/cblas/source_trsm_r.h0000644016036000116100000001447613373111454013367 00000000000000/* 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-2.7.1/cblas/source_trsv_c.h0000644016036000116100000002003113373111454013341 00000000000000/* 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-2.7.1/cblas/source_trsv_r.h0000644016036000116100000000735013373111454013371 00000000000000/* 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-2.7.1/cblas/hypot.c0000644016036000116100000000065613135126237011633 00000000000000#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-2.7.1/cblas/gsl_cblas.h0000644016036000116100000010161513135126237012423 00000000000000/* 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-2.7.1/cblas/Makefile.in0000644016036000116100000022241014151557213012364 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/caxpy.Plo ./$(DEPDIR)/ccopy.Plo \ ./$(DEPDIR)/cdotc_sub.Plo ./$(DEPDIR)/cdotu_sub.Plo \ ./$(DEPDIR)/cgbmv.Plo ./$(DEPDIR)/cgemm.Plo \ ./$(DEPDIR)/cgemv.Plo ./$(DEPDIR)/cgerc.Plo \ ./$(DEPDIR)/cgeru.Plo ./$(DEPDIR)/chbmv.Plo \ ./$(DEPDIR)/chemm.Plo ./$(DEPDIR)/chemv.Plo \ ./$(DEPDIR)/cher.Plo ./$(DEPDIR)/cher2.Plo \ ./$(DEPDIR)/cher2k.Plo ./$(DEPDIR)/cherk.Plo \ ./$(DEPDIR)/chpmv.Plo ./$(DEPDIR)/chpr.Plo \ ./$(DEPDIR)/chpr2.Plo ./$(DEPDIR)/cscal.Plo \ ./$(DEPDIR)/csscal.Plo ./$(DEPDIR)/cswap.Plo \ ./$(DEPDIR)/csymm.Plo ./$(DEPDIR)/csyr2k.Plo \ ./$(DEPDIR)/csyrk.Plo ./$(DEPDIR)/ctbmv.Plo \ ./$(DEPDIR)/ctbsv.Plo ./$(DEPDIR)/ctpmv.Plo \ ./$(DEPDIR)/ctpsv.Plo ./$(DEPDIR)/ctrmm.Plo \ ./$(DEPDIR)/ctrmv.Plo ./$(DEPDIR)/ctrsm.Plo \ ./$(DEPDIR)/ctrsv.Plo ./$(DEPDIR)/dasum.Plo \ ./$(DEPDIR)/daxpy.Plo ./$(DEPDIR)/dcopy.Plo \ ./$(DEPDIR)/ddot.Plo ./$(DEPDIR)/dgbmv.Plo \ ./$(DEPDIR)/dgemm.Plo ./$(DEPDIR)/dgemv.Plo \ ./$(DEPDIR)/dger.Plo ./$(DEPDIR)/dnrm2.Plo \ ./$(DEPDIR)/drot.Plo ./$(DEPDIR)/drotg.Plo \ ./$(DEPDIR)/drotm.Plo ./$(DEPDIR)/drotmg.Plo \ ./$(DEPDIR)/dsbmv.Plo ./$(DEPDIR)/dscal.Plo \ ./$(DEPDIR)/dsdot.Plo ./$(DEPDIR)/dspmv.Plo \ ./$(DEPDIR)/dspr.Plo ./$(DEPDIR)/dspr2.Plo \ ./$(DEPDIR)/dswap.Plo ./$(DEPDIR)/dsymm.Plo \ ./$(DEPDIR)/dsymv.Plo ./$(DEPDIR)/dsyr.Plo \ ./$(DEPDIR)/dsyr2.Plo ./$(DEPDIR)/dsyr2k.Plo \ ./$(DEPDIR)/dsyrk.Plo ./$(DEPDIR)/dtbmv.Plo \ ./$(DEPDIR)/dtbsv.Plo ./$(DEPDIR)/dtpmv.Plo \ ./$(DEPDIR)/dtpsv.Plo ./$(DEPDIR)/dtrmm.Plo \ ./$(DEPDIR)/dtrmv.Plo ./$(DEPDIR)/dtrsm.Plo \ ./$(DEPDIR)/dtrsv.Plo ./$(DEPDIR)/dzasum.Plo \ ./$(DEPDIR)/dznrm2.Plo ./$(DEPDIR)/icamax.Plo \ ./$(DEPDIR)/idamax.Plo ./$(DEPDIR)/isamax.Plo \ ./$(DEPDIR)/izamax.Plo ./$(DEPDIR)/sasum.Plo \ ./$(DEPDIR)/saxpy.Plo ./$(DEPDIR)/scasum.Plo \ ./$(DEPDIR)/scnrm2.Plo ./$(DEPDIR)/scopy.Plo \ ./$(DEPDIR)/sdot.Plo ./$(DEPDIR)/sdsdot.Plo \ ./$(DEPDIR)/sgbmv.Plo ./$(DEPDIR)/sgemm.Plo \ ./$(DEPDIR)/sgemv.Plo ./$(DEPDIR)/sger.Plo \ ./$(DEPDIR)/snrm2.Plo ./$(DEPDIR)/srot.Plo \ ./$(DEPDIR)/srotg.Plo ./$(DEPDIR)/srotm.Plo \ ./$(DEPDIR)/srotmg.Plo ./$(DEPDIR)/ssbmv.Plo \ ./$(DEPDIR)/sscal.Plo ./$(DEPDIR)/sspmv.Plo \ ./$(DEPDIR)/sspr.Plo ./$(DEPDIR)/sspr2.Plo \ ./$(DEPDIR)/sswap.Plo ./$(DEPDIR)/ssymm.Plo \ ./$(DEPDIR)/ssymv.Plo ./$(DEPDIR)/ssyr.Plo \ ./$(DEPDIR)/ssyr2.Plo ./$(DEPDIR)/ssyr2k.Plo \ ./$(DEPDIR)/ssyrk.Plo ./$(DEPDIR)/stbmv.Plo \ ./$(DEPDIR)/stbsv.Plo ./$(DEPDIR)/stpmv.Plo \ ./$(DEPDIR)/stpsv.Plo ./$(DEPDIR)/strmm.Plo \ ./$(DEPDIR)/strmv.Plo ./$(DEPDIR)/strsm.Plo \ ./$(DEPDIR)/strsv.Plo ./$(DEPDIR)/test.Po \ ./$(DEPDIR)/test_amax.Po ./$(DEPDIR)/test_asum.Po \ ./$(DEPDIR)/test_axpy.Po ./$(DEPDIR)/test_copy.Po \ ./$(DEPDIR)/test_dot.Po ./$(DEPDIR)/test_gbmv.Po \ ./$(DEPDIR)/test_gemm.Po ./$(DEPDIR)/test_gemv.Po \ ./$(DEPDIR)/test_ger.Po ./$(DEPDIR)/test_hbmv.Po \ ./$(DEPDIR)/test_hemm.Po ./$(DEPDIR)/test_hemv.Po \ ./$(DEPDIR)/test_her.Po ./$(DEPDIR)/test_her2.Po \ ./$(DEPDIR)/test_her2k.Po ./$(DEPDIR)/test_herk.Po \ ./$(DEPDIR)/test_hpmv.Po ./$(DEPDIR)/test_hpr.Po \ ./$(DEPDIR)/test_hpr2.Po ./$(DEPDIR)/test_nrm2.Po \ ./$(DEPDIR)/test_rot.Po ./$(DEPDIR)/test_rotg.Po \ ./$(DEPDIR)/test_rotm.Po ./$(DEPDIR)/test_rotmg.Po \ ./$(DEPDIR)/test_sbmv.Po ./$(DEPDIR)/test_scal.Po \ ./$(DEPDIR)/test_spmv.Po ./$(DEPDIR)/test_spr.Po \ ./$(DEPDIR)/test_spr2.Po ./$(DEPDIR)/test_swap.Po \ ./$(DEPDIR)/test_symm.Po ./$(DEPDIR)/test_symv.Po \ ./$(DEPDIR)/test_syr.Po ./$(DEPDIR)/test_syr2.Po \ ./$(DEPDIR)/test_syr2k.Po ./$(DEPDIR)/test_syrk.Po \ ./$(DEPDIR)/test_tbmv.Po ./$(DEPDIR)/test_tbsv.Po \ ./$(DEPDIR)/test_tpmv.Po ./$(DEPDIR)/test_tpsv.Po \ ./$(DEPDIR)/test_trmm.Po ./$(DEPDIR)/test_trmv.Po \ ./$(DEPDIR)/test_trsm.Po ./$(DEPDIR)/test_trsv.Po \ ./$(DEPDIR)/xerbla.Plo ./$(DEPDIR)/zaxpy.Plo \ ./$(DEPDIR)/zcopy.Plo ./$(DEPDIR)/zdotc_sub.Plo \ ./$(DEPDIR)/zdotu_sub.Plo ./$(DEPDIR)/zdscal.Plo \ ./$(DEPDIR)/zgbmv.Plo ./$(DEPDIR)/zgemm.Plo \ ./$(DEPDIR)/zgemv.Plo ./$(DEPDIR)/zgerc.Plo \ ./$(DEPDIR)/zgeru.Plo ./$(DEPDIR)/zhbmv.Plo \ ./$(DEPDIR)/zhemm.Plo ./$(DEPDIR)/zhemv.Plo \ ./$(DEPDIR)/zher.Plo ./$(DEPDIR)/zher2.Plo \ ./$(DEPDIR)/zher2k.Plo ./$(DEPDIR)/zherk.Plo \ ./$(DEPDIR)/zhpmv.Plo ./$(DEPDIR)/zhpr.Plo \ ./$(DEPDIR)/zhpr2.Plo ./$(DEPDIR)/zscal.Plo \ ./$(DEPDIR)/zswap.Plo ./$(DEPDIR)/zsymm.Plo \ ./$(DEPDIR)/zsyr2k.Plo ./$(DEPDIR)/zsyrk.Plo \ ./$(DEPDIR)/ztbmv.Plo ./$(DEPDIR)/ztbsv.Plo \ ./$(DEPDIR)/ztpmv.Plo ./$(DEPDIR)/ztpsv.Plo \ ./$(DEPDIR)/ztrmm.Plo ./$(DEPDIR)/ztrmv.Plo \ ./$(DEPDIR)/ztrsm.Plo ./$(DEPDIR)/ztrsv.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ccopy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdotc_sub.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdotu_sub.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgbmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgemm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgemv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgerc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgeru.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chbmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chemm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chemv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cher.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cher2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cher2k.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cherk.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chpmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chpr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chpr2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cscal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csscal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cswap.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csymm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csyr2k.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csyrk.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctbmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctbsv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctpmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctpsv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctrmm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctrmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctrsm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctrsv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dasum.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/daxpy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dcopy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ddot.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgbmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgemm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgemv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dger.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dnrm2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drot.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drotg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drotm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drotmg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsbmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dscal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsdot.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dspmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dspr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dspr2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dswap.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsymm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsymv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsyr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsyr2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsyr2k.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsyrk.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtbmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtbsv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtpmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtpsv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtrmm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtrmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtrsm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtrsv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dzasum.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dznrm2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icamax.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/idamax.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isamax.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/izamax.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sasum.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/saxpy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scasum.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scnrm2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scopy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sdot.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sdsdot.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgbmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgemm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgemv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sger.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snrm2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/srot.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/srotg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/srotm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/srotmg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssbmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sscal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sspmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sspr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sspr2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sswap.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssymm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssymv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssyr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssyr2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssyr2k.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssyrk.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stbmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stbsv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stpmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stpsv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strmm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strsm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strsv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_amax.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_asum.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_axpy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_copy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_dot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_gbmv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_gemm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_gemv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ger.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hbmv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hemm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hemv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_her.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_her2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_her2k.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_herk.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hpmv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hpr.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hpr2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_nrm2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rotg.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rotm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rotmg.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_sbmv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_scal.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_spmv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_spr.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_spr2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_swap.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_symm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_symv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_syr.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_syr2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_syr2k.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_syrk.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_tbmv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_tbsv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_tpmv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_tpsv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_trmm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_trmv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_trsm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_trsv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xerbla.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zaxpy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zcopy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zdotc_sub.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zdotu_sub.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zdscal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zgbmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zgemm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zgemv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zgerc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zgeru.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zhbmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zhemm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zhemv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zher.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zher2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zher2k.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zherk.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zhpmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zhpr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zhpr2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zscal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zswap.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsymm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsyr2k.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsyrk.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztbmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztbsv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztpmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztpsv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztrmm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztrmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztrsm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztrsv.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/caxpy.Plo -rm -f ./$(DEPDIR)/ccopy.Plo -rm -f ./$(DEPDIR)/cdotc_sub.Plo -rm -f ./$(DEPDIR)/cdotu_sub.Plo -rm -f ./$(DEPDIR)/cgbmv.Plo -rm -f ./$(DEPDIR)/cgemm.Plo -rm -f ./$(DEPDIR)/cgemv.Plo -rm -f ./$(DEPDIR)/cgerc.Plo -rm -f ./$(DEPDIR)/cgeru.Plo -rm -f ./$(DEPDIR)/chbmv.Plo -rm -f ./$(DEPDIR)/chemm.Plo -rm -f ./$(DEPDIR)/chemv.Plo -rm -f ./$(DEPDIR)/cher.Plo -rm -f ./$(DEPDIR)/cher2.Plo -rm -f ./$(DEPDIR)/cher2k.Plo -rm -f ./$(DEPDIR)/cherk.Plo -rm -f ./$(DEPDIR)/chpmv.Plo -rm -f ./$(DEPDIR)/chpr.Plo -rm -f ./$(DEPDIR)/chpr2.Plo -rm -f ./$(DEPDIR)/cscal.Plo -rm -f ./$(DEPDIR)/csscal.Plo -rm -f ./$(DEPDIR)/cswap.Plo -rm -f ./$(DEPDIR)/csymm.Plo -rm -f ./$(DEPDIR)/csyr2k.Plo -rm -f ./$(DEPDIR)/csyrk.Plo -rm -f ./$(DEPDIR)/ctbmv.Plo -rm -f ./$(DEPDIR)/ctbsv.Plo -rm -f ./$(DEPDIR)/ctpmv.Plo -rm -f ./$(DEPDIR)/ctpsv.Plo -rm -f ./$(DEPDIR)/ctrmm.Plo -rm -f ./$(DEPDIR)/ctrmv.Plo -rm -f ./$(DEPDIR)/ctrsm.Plo -rm -f ./$(DEPDIR)/ctrsv.Plo -rm -f ./$(DEPDIR)/dasum.Plo -rm -f ./$(DEPDIR)/daxpy.Plo -rm -f ./$(DEPDIR)/dcopy.Plo -rm -f ./$(DEPDIR)/ddot.Plo -rm -f ./$(DEPDIR)/dgbmv.Plo -rm -f ./$(DEPDIR)/dgemm.Plo -rm -f ./$(DEPDIR)/dgemv.Plo -rm -f ./$(DEPDIR)/dger.Plo -rm -f ./$(DEPDIR)/dnrm2.Plo -rm -f ./$(DEPDIR)/drot.Plo -rm -f ./$(DEPDIR)/drotg.Plo -rm -f ./$(DEPDIR)/drotm.Plo -rm -f ./$(DEPDIR)/drotmg.Plo -rm -f ./$(DEPDIR)/dsbmv.Plo -rm -f ./$(DEPDIR)/dscal.Plo -rm -f ./$(DEPDIR)/dsdot.Plo -rm -f ./$(DEPDIR)/dspmv.Plo -rm -f ./$(DEPDIR)/dspr.Plo -rm -f ./$(DEPDIR)/dspr2.Plo -rm -f ./$(DEPDIR)/dswap.Plo -rm -f ./$(DEPDIR)/dsymm.Plo -rm -f ./$(DEPDIR)/dsymv.Plo -rm -f ./$(DEPDIR)/dsyr.Plo -rm -f ./$(DEPDIR)/dsyr2.Plo -rm -f ./$(DEPDIR)/dsyr2k.Plo -rm -f ./$(DEPDIR)/dsyrk.Plo -rm -f ./$(DEPDIR)/dtbmv.Plo -rm -f ./$(DEPDIR)/dtbsv.Plo -rm -f ./$(DEPDIR)/dtpmv.Plo -rm -f ./$(DEPDIR)/dtpsv.Plo -rm -f ./$(DEPDIR)/dtrmm.Plo -rm -f ./$(DEPDIR)/dtrmv.Plo -rm -f ./$(DEPDIR)/dtrsm.Plo -rm -f ./$(DEPDIR)/dtrsv.Plo -rm -f ./$(DEPDIR)/dzasum.Plo -rm -f ./$(DEPDIR)/dznrm2.Plo -rm -f ./$(DEPDIR)/icamax.Plo -rm -f ./$(DEPDIR)/idamax.Plo -rm -f ./$(DEPDIR)/isamax.Plo -rm -f ./$(DEPDIR)/izamax.Plo -rm -f ./$(DEPDIR)/sasum.Plo -rm -f ./$(DEPDIR)/saxpy.Plo -rm -f ./$(DEPDIR)/scasum.Plo -rm -f ./$(DEPDIR)/scnrm2.Plo -rm -f ./$(DEPDIR)/scopy.Plo -rm -f ./$(DEPDIR)/sdot.Plo -rm -f ./$(DEPDIR)/sdsdot.Plo -rm -f ./$(DEPDIR)/sgbmv.Plo -rm -f ./$(DEPDIR)/sgemm.Plo -rm -f ./$(DEPDIR)/sgemv.Plo -rm -f ./$(DEPDIR)/sger.Plo -rm -f ./$(DEPDIR)/snrm2.Plo -rm -f ./$(DEPDIR)/srot.Plo -rm -f ./$(DEPDIR)/srotg.Plo -rm -f ./$(DEPDIR)/srotm.Plo -rm -f ./$(DEPDIR)/srotmg.Plo -rm -f ./$(DEPDIR)/ssbmv.Plo -rm -f ./$(DEPDIR)/sscal.Plo -rm -f ./$(DEPDIR)/sspmv.Plo -rm -f ./$(DEPDIR)/sspr.Plo -rm -f ./$(DEPDIR)/sspr2.Plo -rm -f ./$(DEPDIR)/sswap.Plo -rm -f ./$(DEPDIR)/ssymm.Plo -rm -f ./$(DEPDIR)/ssymv.Plo -rm -f ./$(DEPDIR)/ssyr.Plo -rm -f ./$(DEPDIR)/ssyr2.Plo -rm -f ./$(DEPDIR)/ssyr2k.Plo -rm -f ./$(DEPDIR)/ssyrk.Plo -rm -f ./$(DEPDIR)/stbmv.Plo -rm -f ./$(DEPDIR)/stbsv.Plo -rm -f ./$(DEPDIR)/stpmv.Plo -rm -f ./$(DEPDIR)/stpsv.Plo -rm -f ./$(DEPDIR)/strmm.Plo -rm -f ./$(DEPDIR)/strmv.Plo -rm -f ./$(DEPDIR)/strsm.Plo -rm -f ./$(DEPDIR)/strsv.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test_amax.Po -rm -f ./$(DEPDIR)/test_asum.Po -rm -f ./$(DEPDIR)/test_axpy.Po -rm -f ./$(DEPDIR)/test_copy.Po -rm -f ./$(DEPDIR)/test_dot.Po -rm -f ./$(DEPDIR)/test_gbmv.Po -rm -f ./$(DEPDIR)/test_gemm.Po -rm -f ./$(DEPDIR)/test_gemv.Po -rm -f ./$(DEPDIR)/test_ger.Po -rm -f ./$(DEPDIR)/test_hbmv.Po -rm -f ./$(DEPDIR)/test_hemm.Po -rm -f ./$(DEPDIR)/test_hemv.Po -rm -f ./$(DEPDIR)/test_her.Po -rm -f ./$(DEPDIR)/test_her2.Po -rm -f ./$(DEPDIR)/test_her2k.Po -rm -f ./$(DEPDIR)/test_herk.Po -rm -f ./$(DEPDIR)/test_hpmv.Po -rm -f ./$(DEPDIR)/test_hpr.Po -rm -f ./$(DEPDIR)/test_hpr2.Po -rm -f ./$(DEPDIR)/test_nrm2.Po -rm -f ./$(DEPDIR)/test_rot.Po -rm -f ./$(DEPDIR)/test_rotg.Po -rm -f ./$(DEPDIR)/test_rotm.Po -rm -f ./$(DEPDIR)/test_rotmg.Po -rm -f ./$(DEPDIR)/test_sbmv.Po -rm -f ./$(DEPDIR)/test_scal.Po -rm -f ./$(DEPDIR)/test_spmv.Po -rm -f ./$(DEPDIR)/test_spr.Po -rm -f ./$(DEPDIR)/test_spr2.Po -rm -f ./$(DEPDIR)/test_swap.Po -rm -f ./$(DEPDIR)/test_symm.Po -rm -f ./$(DEPDIR)/test_symv.Po -rm -f ./$(DEPDIR)/test_syr.Po -rm -f ./$(DEPDIR)/test_syr2.Po -rm -f ./$(DEPDIR)/test_syr2k.Po -rm -f ./$(DEPDIR)/test_syrk.Po -rm -f ./$(DEPDIR)/test_tbmv.Po -rm -f ./$(DEPDIR)/test_tbsv.Po -rm -f ./$(DEPDIR)/test_tpmv.Po -rm -f ./$(DEPDIR)/test_tpsv.Po -rm -f ./$(DEPDIR)/test_trmm.Po -rm -f ./$(DEPDIR)/test_trmv.Po -rm -f ./$(DEPDIR)/test_trsm.Po -rm -f ./$(DEPDIR)/test_trsv.Po -rm -f ./$(DEPDIR)/xerbla.Plo -rm -f ./$(DEPDIR)/zaxpy.Plo -rm -f ./$(DEPDIR)/zcopy.Plo -rm -f ./$(DEPDIR)/zdotc_sub.Plo -rm -f ./$(DEPDIR)/zdotu_sub.Plo -rm -f ./$(DEPDIR)/zdscal.Plo -rm -f ./$(DEPDIR)/zgbmv.Plo -rm -f ./$(DEPDIR)/zgemm.Plo -rm -f ./$(DEPDIR)/zgemv.Plo -rm -f ./$(DEPDIR)/zgerc.Plo -rm -f ./$(DEPDIR)/zgeru.Plo -rm -f ./$(DEPDIR)/zhbmv.Plo -rm -f ./$(DEPDIR)/zhemm.Plo -rm -f ./$(DEPDIR)/zhemv.Plo -rm -f ./$(DEPDIR)/zher.Plo -rm -f ./$(DEPDIR)/zher2.Plo -rm -f ./$(DEPDIR)/zher2k.Plo -rm -f ./$(DEPDIR)/zherk.Plo -rm -f ./$(DEPDIR)/zhpmv.Plo -rm -f ./$(DEPDIR)/zhpr.Plo -rm -f ./$(DEPDIR)/zhpr2.Plo -rm -f ./$(DEPDIR)/zscal.Plo -rm -f ./$(DEPDIR)/zswap.Plo -rm -f ./$(DEPDIR)/zsymm.Plo -rm -f ./$(DEPDIR)/zsyr2k.Plo -rm -f ./$(DEPDIR)/zsyrk.Plo -rm -f ./$(DEPDIR)/ztbmv.Plo -rm -f ./$(DEPDIR)/ztbsv.Plo -rm -f ./$(DEPDIR)/ztpmv.Plo -rm -f ./$(DEPDIR)/ztpsv.Plo -rm -f ./$(DEPDIR)/ztrmm.Plo -rm -f ./$(DEPDIR)/ztrmv.Plo -rm -f ./$(DEPDIR)/ztrsm.Plo -rm -f ./$(DEPDIR)/ztrsv.Plo -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 -f ./$(DEPDIR)/caxpy.Plo -rm -f ./$(DEPDIR)/ccopy.Plo -rm -f ./$(DEPDIR)/cdotc_sub.Plo -rm -f ./$(DEPDIR)/cdotu_sub.Plo -rm -f ./$(DEPDIR)/cgbmv.Plo -rm -f ./$(DEPDIR)/cgemm.Plo -rm -f ./$(DEPDIR)/cgemv.Plo -rm -f ./$(DEPDIR)/cgerc.Plo -rm -f ./$(DEPDIR)/cgeru.Plo -rm -f ./$(DEPDIR)/chbmv.Plo -rm -f ./$(DEPDIR)/chemm.Plo -rm -f ./$(DEPDIR)/chemv.Plo -rm -f ./$(DEPDIR)/cher.Plo -rm -f ./$(DEPDIR)/cher2.Plo -rm -f ./$(DEPDIR)/cher2k.Plo -rm -f ./$(DEPDIR)/cherk.Plo -rm -f ./$(DEPDIR)/chpmv.Plo -rm -f ./$(DEPDIR)/chpr.Plo -rm -f ./$(DEPDIR)/chpr2.Plo -rm -f ./$(DEPDIR)/cscal.Plo -rm -f ./$(DEPDIR)/csscal.Plo -rm -f ./$(DEPDIR)/cswap.Plo -rm -f ./$(DEPDIR)/csymm.Plo -rm -f ./$(DEPDIR)/csyr2k.Plo -rm -f ./$(DEPDIR)/csyrk.Plo -rm -f ./$(DEPDIR)/ctbmv.Plo -rm -f ./$(DEPDIR)/ctbsv.Plo -rm -f ./$(DEPDIR)/ctpmv.Plo -rm -f ./$(DEPDIR)/ctpsv.Plo -rm -f ./$(DEPDIR)/ctrmm.Plo -rm -f ./$(DEPDIR)/ctrmv.Plo -rm -f ./$(DEPDIR)/ctrsm.Plo -rm -f ./$(DEPDIR)/ctrsv.Plo -rm -f ./$(DEPDIR)/dasum.Plo -rm -f ./$(DEPDIR)/daxpy.Plo -rm -f ./$(DEPDIR)/dcopy.Plo -rm -f ./$(DEPDIR)/ddot.Plo -rm -f ./$(DEPDIR)/dgbmv.Plo -rm -f ./$(DEPDIR)/dgemm.Plo -rm -f ./$(DEPDIR)/dgemv.Plo -rm -f ./$(DEPDIR)/dger.Plo -rm -f ./$(DEPDIR)/dnrm2.Plo -rm -f ./$(DEPDIR)/drot.Plo -rm -f ./$(DEPDIR)/drotg.Plo -rm -f ./$(DEPDIR)/drotm.Plo -rm -f ./$(DEPDIR)/drotmg.Plo -rm -f ./$(DEPDIR)/dsbmv.Plo -rm -f ./$(DEPDIR)/dscal.Plo -rm -f ./$(DEPDIR)/dsdot.Plo -rm -f ./$(DEPDIR)/dspmv.Plo -rm -f ./$(DEPDIR)/dspr.Plo -rm -f ./$(DEPDIR)/dspr2.Plo -rm -f ./$(DEPDIR)/dswap.Plo -rm -f ./$(DEPDIR)/dsymm.Plo -rm -f ./$(DEPDIR)/dsymv.Plo -rm -f ./$(DEPDIR)/dsyr.Plo -rm -f ./$(DEPDIR)/dsyr2.Plo -rm -f ./$(DEPDIR)/dsyr2k.Plo -rm -f ./$(DEPDIR)/dsyrk.Plo -rm -f ./$(DEPDIR)/dtbmv.Plo -rm -f ./$(DEPDIR)/dtbsv.Plo -rm -f ./$(DEPDIR)/dtpmv.Plo -rm -f ./$(DEPDIR)/dtpsv.Plo -rm -f ./$(DEPDIR)/dtrmm.Plo -rm -f ./$(DEPDIR)/dtrmv.Plo -rm -f ./$(DEPDIR)/dtrsm.Plo -rm -f ./$(DEPDIR)/dtrsv.Plo -rm -f ./$(DEPDIR)/dzasum.Plo -rm -f ./$(DEPDIR)/dznrm2.Plo -rm -f ./$(DEPDIR)/icamax.Plo -rm -f ./$(DEPDIR)/idamax.Plo -rm -f ./$(DEPDIR)/isamax.Plo -rm -f ./$(DEPDIR)/izamax.Plo -rm -f ./$(DEPDIR)/sasum.Plo -rm -f ./$(DEPDIR)/saxpy.Plo -rm -f ./$(DEPDIR)/scasum.Plo -rm -f ./$(DEPDIR)/scnrm2.Plo -rm -f ./$(DEPDIR)/scopy.Plo -rm -f ./$(DEPDIR)/sdot.Plo -rm -f ./$(DEPDIR)/sdsdot.Plo -rm -f ./$(DEPDIR)/sgbmv.Plo -rm -f ./$(DEPDIR)/sgemm.Plo -rm -f ./$(DEPDIR)/sgemv.Plo -rm -f ./$(DEPDIR)/sger.Plo -rm -f ./$(DEPDIR)/snrm2.Plo -rm -f ./$(DEPDIR)/srot.Plo -rm -f ./$(DEPDIR)/srotg.Plo -rm -f ./$(DEPDIR)/srotm.Plo -rm -f ./$(DEPDIR)/srotmg.Plo -rm -f ./$(DEPDIR)/ssbmv.Plo -rm -f ./$(DEPDIR)/sscal.Plo -rm -f ./$(DEPDIR)/sspmv.Plo -rm -f ./$(DEPDIR)/sspr.Plo -rm -f ./$(DEPDIR)/sspr2.Plo -rm -f ./$(DEPDIR)/sswap.Plo -rm -f ./$(DEPDIR)/ssymm.Plo -rm -f ./$(DEPDIR)/ssymv.Plo -rm -f ./$(DEPDIR)/ssyr.Plo -rm -f ./$(DEPDIR)/ssyr2.Plo -rm -f ./$(DEPDIR)/ssyr2k.Plo -rm -f ./$(DEPDIR)/ssyrk.Plo -rm -f ./$(DEPDIR)/stbmv.Plo -rm -f ./$(DEPDIR)/stbsv.Plo -rm -f ./$(DEPDIR)/stpmv.Plo -rm -f ./$(DEPDIR)/stpsv.Plo -rm -f ./$(DEPDIR)/strmm.Plo -rm -f ./$(DEPDIR)/strmv.Plo -rm -f ./$(DEPDIR)/strsm.Plo -rm -f ./$(DEPDIR)/strsv.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test_amax.Po -rm -f ./$(DEPDIR)/test_asum.Po -rm -f ./$(DEPDIR)/test_axpy.Po -rm -f ./$(DEPDIR)/test_copy.Po -rm -f ./$(DEPDIR)/test_dot.Po -rm -f ./$(DEPDIR)/test_gbmv.Po -rm -f ./$(DEPDIR)/test_gemm.Po -rm -f ./$(DEPDIR)/test_gemv.Po -rm -f ./$(DEPDIR)/test_ger.Po -rm -f ./$(DEPDIR)/test_hbmv.Po -rm -f ./$(DEPDIR)/test_hemm.Po -rm -f ./$(DEPDIR)/test_hemv.Po -rm -f ./$(DEPDIR)/test_her.Po -rm -f ./$(DEPDIR)/test_her2.Po -rm -f ./$(DEPDIR)/test_her2k.Po -rm -f ./$(DEPDIR)/test_herk.Po -rm -f ./$(DEPDIR)/test_hpmv.Po -rm -f ./$(DEPDIR)/test_hpr.Po -rm -f ./$(DEPDIR)/test_hpr2.Po -rm -f ./$(DEPDIR)/test_nrm2.Po -rm -f ./$(DEPDIR)/test_rot.Po -rm -f ./$(DEPDIR)/test_rotg.Po -rm -f ./$(DEPDIR)/test_rotm.Po -rm -f ./$(DEPDIR)/test_rotmg.Po -rm -f ./$(DEPDIR)/test_sbmv.Po -rm -f ./$(DEPDIR)/test_scal.Po -rm -f ./$(DEPDIR)/test_spmv.Po -rm -f ./$(DEPDIR)/test_spr.Po -rm -f ./$(DEPDIR)/test_spr2.Po -rm -f ./$(DEPDIR)/test_swap.Po -rm -f ./$(DEPDIR)/test_symm.Po -rm -f ./$(DEPDIR)/test_symv.Po -rm -f ./$(DEPDIR)/test_syr.Po -rm -f ./$(DEPDIR)/test_syr2.Po -rm -f ./$(DEPDIR)/test_syr2k.Po -rm -f ./$(DEPDIR)/test_syrk.Po -rm -f ./$(DEPDIR)/test_tbmv.Po -rm -f ./$(DEPDIR)/test_tbsv.Po -rm -f ./$(DEPDIR)/test_tpmv.Po -rm -f ./$(DEPDIR)/test_tpsv.Po -rm -f ./$(DEPDIR)/test_trmm.Po -rm -f ./$(DEPDIR)/test_trmv.Po -rm -f ./$(DEPDIR)/test_trsm.Po -rm -f ./$(DEPDIR)/test_trsv.Po -rm -f ./$(DEPDIR)/xerbla.Plo -rm -f ./$(DEPDIR)/zaxpy.Plo -rm -f ./$(DEPDIR)/zcopy.Plo -rm -f ./$(DEPDIR)/zdotc_sub.Plo -rm -f ./$(DEPDIR)/zdotu_sub.Plo -rm -f ./$(DEPDIR)/zdscal.Plo -rm -f ./$(DEPDIR)/zgbmv.Plo -rm -f ./$(DEPDIR)/zgemm.Plo -rm -f ./$(DEPDIR)/zgemv.Plo -rm -f ./$(DEPDIR)/zgerc.Plo -rm -f ./$(DEPDIR)/zgeru.Plo -rm -f ./$(DEPDIR)/zhbmv.Plo -rm -f ./$(DEPDIR)/zhemm.Plo -rm -f ./$(DEPDIR)/zhemv.Plo -rm -f ./$(DEPDIR)/zher.Plo -rm -f ./$(DEPDIR)/zher2.Plo -rm -f ./$(DEPDIR)/zher2k.Plo -rm -f ./$(DEPDIR)/zherk.Plo -rm -f ./$(DEPDIR)/zhpmv.Plo -rm -f ./$(DEPDIR)/zhpr.Plo -rm -f ./$(DEPDIR)/zhpr2.Plo -rm -f ./$(DEPDIR)/zscal.Plo -rm -f ./$(DEPDIR)/zswap.Plo -rm -f ./$(DEPDIR)/zsymm.Plo -rm -f ./$(DEPDIR)/zsyr2k.Plo -rm -f ./$(DEPDIR)/zsyrk.Plo -rm -f ./$(DEPDIR)/ztbmv.Plo -rm -f ./$(DEPDIR)/ztbsv.Plo -rm -f ./$(DEPDIR)/ztpmv.Plo -rm -f ./$(DEPDIR)/ztpsv.Plo -rm -f ./$(DEPDIR)/ztrmm.Plo -rm -f ./$(DEPDIR)/ztrmv.Plo -rm -f ./$(DEPDIR)/ztrsm.Plo -rm -f ./$(DEPDIR)/ztrsv.Plo -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/cblas/ChangeLog0000644016036000116100000000237013373111454012070 000000000000002010-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-2.7.1/cblas/TODO0000644016036000116100000000063113373111454011004 00000000000000# -*- 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-2.7.1/cblas/sasum.c0000644016036000116100000000030713135126237011611 00000000000000#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-2.7.1/cblas/saxpy.c0000644016036000116100000000040013135126237011617 00000000000000#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-2.7.1/cblas/scasum.c0000644016036000116100000000030713135126237011754 00000000000000#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-2.7.1/cblas/scnrm2.c0000644016036000116100000000030713135126237011665 00000000000000#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-2.7.1/cblas/scopy.c0000644016036000116100000000035513135126237011621 00000000000000#include #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-2.7.1/cblas/sdot.c0000644016036000116100000000047713135126237011442 00000000000000#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-2.7.1/cblas/sdsdot.c0000644016036000116100000000053113135126237011760 00000000000000#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-2.7.1/cblas/sgbmv.c0000644016036000116100000000072113373111454011576 00000000000000#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-2.7.1/cblas/sgemm.c0000644016036000116100000000076013373111454011573 00000000000000#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-2.7.1/cblas/sgemv.c0000644016036000116100000000066513373111454011610 00000000000000#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-2.7.1/cblas/sger.c0000644016036000116100000000055513373111454011425 00000000000000#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-2.7.1/cblas/snrm2.c0000644016036000116100000000030713135126237011522 00000000000000#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-2.7.1/cblas/srot.c0000644016036000116100000000040013135126237011442 00000000000000#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-2.7.1/cblas/srotg.c0000644016036000116100000000027713135126237011625 00000000000000#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-2.7.1/cblas/srotm.c0000644016036000116100000000036513135126237011631 00000000000000#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-2.7.1/cblas/srotmg.c0000644016036000116100000000032413135126237011773 00000000000000#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-2.7.1/cblas/ssbmv.c0000644016036000116100000000065413373111454011617 00000000000000#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-2.7.1/cblas/sscal.c0000644016036000116100000000032313135126237011564 00000000000000#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-2.7.1/cblas/sspmv.c0000644016036000116100000000060413373111454011630 00000000000000#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-2.7.1/cblas/sspr.c0000644016036000116100000000051613373111454011451 00000000000000#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-2.7.1/cblas/sspr2.c0000644016036000116100000000056313373111454011535 00000000000000#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-2.7.1/cblas/sswap.c0000644016036000116100000000033213135126237011614 00000000000000#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-2.7.1/cblas/ssymm.c0000644016036000116100000000071013373111454011626 00000000000000#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-2.7.1/cblas/ssymv.c0000644016036000116100000000063713373111454011647 00000000000000#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-2.7.1/cblas/ssyr.c0000644016036000116100000000053413373111454011462 00000000000000#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-2.7.1/cblas/ssyr2.c0000644016036000116100000000060013373111454011536 00000000000000#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-2.7.1/cblas/ssyr2k.c0000644016036000116100000000074113373111454011717 00000000000000#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-2.7.1/cblas/ssyrk.c0000644016036000116100000000065713373111454011643 00000000000000#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-2.7.1/cblas/stbmv.c0000644016036000116100000000065013373111454011614 00000000000000#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-2.7.1/cblas/stbsv.c0000644016036000116100000000065013373111454011622 00000000000000#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-2.7.1/cblas/stpmv.c0000644016036000116100000000060013373111454011625 00000000000000#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-2.7.1/cblas/stpsv.c0000644016036000116100000000060013373111454011633 00000000000000#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-2.7.1/cblas/strmm.c0000644016036000116100000000074313373111454011626 00000000000000#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-2.7.1/cblas/strmv.c0000644016036000116100000000063313373111454011635 00000000000000#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-2.7.1/cblas/strsm.c0000644016036000116100000000074313373111454011634 00000000000000#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-2.7.1/cblas/strsv.c0000644016036000116100000000063313373111454011643 00000000000000#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-2.7.1/cblas/dasum.c0000644016036000116100000000031213135126237011566 00000000000000#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-2.7.1/cblas/daxpy.c0000644016036000116100000000040413135126237011604 00000000000000#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-2.7.1/cblas/dcopy.c0000644016036000116100000000036013135126237011576 00000000000000#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-2.7.1/cblas/ddot.c0000644016036000116100000000050413135126237011412 00000000000000#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-2.7.1/cblas/dgbmv.c0000644016036000116100000000074413373111454011564 00000000000000#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-2.7.1/cblas/dgemm.c0000644016036000116100000000076613373111454011562 00000000000000#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-2.7.1/cblas/dgemv.c0000644016036000116100000000067313373111454011570 00000000000000#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-2.7.1/cblas/dger.c0000644016036000116100000000056213373111454011404 00000000000000#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-2.7.1/cblas/dnrm2.c0000644016036000116100000000031213135126237011477 00000000000000#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-2.7.1/cblas/drot.c0000644016036000116100000000040513135126237011430 00000000000000#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-2.7.1/cblas/drotg.c0000644016036000116100000000030413135126237011575 00000000000000#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-2.7.1/cblas/drotm.c0000644016036000116100000000037113135126237011607 00000000000000#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-2.7.1/cblas/drotmg.c0000644016036000116100000000033213135126237011753 00000000000000#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-2.7.1/cblas/dsbmv.c0000644016036000116100000000066213373111454011577 00000000000000#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-2.7.1/cblas/dscal.c0000644016036000116100000000032613135126237011550 00000000000000#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-2.7.1/cblas/dsdot.c0000644016036000116100000000050313135126237011574 00000000000000#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-2.7.1/cblas/dspmv.c0000644016036000116100000000062713373111454011616 00000000000000#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-2.7.1/cblas/dspr.c0000644016036000116100000000052213373111454011427 00000000000000#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-2.7.1/cblas/dspr2.c0000644016036000116100000000056713373111454011522 00000000000000#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-2.7.1/cblas/dswap.c0000644016036000116100000000035213135126237011577 00000000000000#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-2.7.1/cblas/dsymm.c0000644016036000116100000000073313373111454011614 00000000000000#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-2.7.1/cblas/dsymv.c0000644016036000116100000000064513373111454011627 00000000000000#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-2.7.1/cblas/dsyr.c0000644016036000116100000000054013373111454011440 00000000000000#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-2.7.1/cblas/dsyr2.c0000644016036000116100000000060513373111454011524 00000000000000#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-2.7.1/cblas/dsyr2k.c0000644016036000116100000000074713373111454011706 00000000000000#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-2.7.1/cblas/dsyrk.c0000644016036000116100000000066413373111454011622 00000000000000#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-2.7.1/cblas/dtbmv.c0000644016036000116100000000065313373111454011600 00000000000000#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-2.7.1/cblas/dtbsv.c0000644016036000116100000000065313373111454011606 00000000000000#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-2.7.1/cblas/dtpmv.c0000644016036000116100000000060313373111454011611 00000000000000#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-2.7.1/cblas/dtpsv.c0000644016036000116100000000060313373111454011617 00000000000000#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-2.7.1/cblas/dtrmm.c0000644016036000116100000000074713373111454011613 00000000000000#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-2.7.1/cblas/dtrmv.c0000644016036000116100000000063613373111454011621 00000000000000#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-2.7.1/cblas/dtrsm.c0000644016036000116100000000074713373111454011621 00000000000000#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-2.7.1/cblas/dtrsv.c0000644016036000116100000000063613373111454011627 00000000000000#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-2.7.1/cblas/dzasum.c0000644016036000116100000000031113135126237011757 00000000000000#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-2.7.1/cblas/dznrm2.c0000644016036000116100000000031113135126237011670 00000000000000#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-2.7.1/cblas/caxpy.c0000644016036000116100000000037613135126237011613 00000000000000#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-2.7.1/cblas/ccopy.c0000644016036000116100000000035313135126237011577 00000000000000#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-2.7.1/cblas/cdotc_sub.c0000644016036000116100000000045413135126237012431 00000000000000#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-2.7.1/cblas/cdotu_sub.c0000644016036000116100000000045113135126237012450 00000000000000#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-2.7.1/cblas/cgbmv.c0000644016036000116100000000071613373111454011562 00000000000000#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-2.7.1/cblas/cgemm.c0000644016036000116100000000075513373111454011557 00000000000000#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-2.7.1/cblas/cgemv.c0000644016036000116100000000066213373111454011565 00000000000000#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-2.7.1/cblas/cgerc.c0000644016036000116100000000055613373111454011551 00000000000000#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-2.7.1/cblas/cgeru.c0000644016036000116100000000055613373111454011573 00000000000000#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-2.7.1/cblas/chbmv.c0000644016036000116100000000065113373111454011561 00000000000000#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-2.7.1/cblas/chemm.c0000644016036000116100000000070313373111454011551 00000000000000#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-2.7.1/cblas/chemv.c0000644016036000116100000000063413373111454011565 00000000000000#include #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-2.7.1/cblas/cher.c0000644016036000116100000000053213373111454011401 00000000000000#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-2.7.1/cblas/cher2.c0000644016036000116100000000057513373111454011472 00000000000000#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-2.7.1/cblas/cher2k.c0000644016036000116100000000071613373111454011642 00000000000000#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-2.7.1/cblas/cherk.c0000644016036000116100000000065313373111454011560 00000000000000#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-2.7.1/cblas/chpmv.c0000644016036000116100000000060113373111454011572 00000000000000#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-2.7.1/cblas/chpr.c0000644016036000116100000000051413373111454011414 00000000000000#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-2.7.1/cblas/chpr2.c0000644016036000116100000000055713373111454011505 00000000000000#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-2.7.1/cblas/cscal.c0000644016036000116100000000032213135126237011543 00000000000000#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-2.7.1/cblas/csscal.c0000644016036000116100000000032513135126237011731 00000000000000#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-2.7.1/cblas/cswap.c0000644016036000116100000000033013135126237011572 00000000000000#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-2.7.1/cblas/csymm.c0000644016036000116100000000070513373111454011612 00000000000000#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-2.7.1/cblas/csyr2k.c0000644016036000116100000000072013373111454011674 00000000000000#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-2.7.1/cblas/csyrk.c0000644016036000116100000000065513373111454011621 00000000000000#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-2.7.1/cblas/ctbmv.c0000644016036000116100000000064613373111454011601 00000000000000#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-2.7.1/cblas/ctbsv.c0000644016036000116100000000067213373111454011606 00000000000000#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-2.7.1/cblas/ctpmv.c0000644016036000116100000000057613373111454011621 00000000000000#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-2.7.1/cblas/ctpsv.c0000644016036000116100000000062213373111454011617 00000000000000#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-2.7.1/cblas/ctrmm.c0000644016036000116100000000074113373111454011604 00000000000000#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-2.7.1/cblas/ctrmv.c0000644016036000116100000000063113373111454011613 00000000000000#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-2.7.1/cblas/ctrsm.c0000644016036000116100000000076513373111454011620 00000000000000#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-2.7.1/cblas/ctrsv.c0000644016036000116100000000065513373111454011627 00000000000000#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-2.7.1/cblas/zaxpy.c0000644016036000116100000000037713135126237011643 00000000000000#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-2.7.1/cblas/zcopy.c0000644016036000116100000000035413135126237011627 00000000000000#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-2.7.1/cblas/zdotc_sub.c0000644016036000116100000000045513135126237012461 00000000000000#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-2.7.1/cblas/zdotu_sub.c0000644016036000116100000000045213135126237012500 00000000000000#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-2.7.1/cblas/zdscal.c0000644016036000116100000000032713135126237011743 00000000000000#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-2.7.1/cblas/zgbmv.c0000644016036000116100000000071713373111454011612 00000000000000#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-2.7.1/cblas/zgemm.c0000644016036000116100000000075613373111454011607 00000000000000#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-2.7.1/cblas/zgemv.c0000644016036000116100000000066313373111454011615 00000000000000#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-2.7.1/cblas/zgerc.c0000644016036000116100000000055713373111454011601 00000000000000#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-2.7.1/cblas/zgeru.c0000644016036000116100000000055713373111454011623 00000000000000#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-2.7.1/cblas/zhbmv.c0000644016036000116100000000065213373111454011611 00000000000000#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-2.7.1/cblas/zhemm.c0000644016036000116100000000070413373111454011601 00000000000000#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-2.7.1/cblas/zhemv.c0000644016036000116100000000063513373111454011615 00000000000000#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-2.7.1/cblas/zher.c0000644016036000116100000000053413373111454011432 00000000000000#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-2.7.1/cblas/zher2.c0000644016036000116100000000057613373111454011522 00000000000000#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-2.7.1/cblas/zher2k.c0000644016036000116100000000072013373111454011664 00000000000000#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-2.7.1/cblas/zherk.c0000644016036000116100000000065613373111454011612 00000000000000#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-2.7.1/cblas/zhpmv.c0000644016036000116100000000060213373111454011622 00000000000000#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-2.7.1/cblas/zhpr.c0000644016036000116100000000051613373111454011445 00000000000000#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-2.7.1/cblas/zhpr2.c0000644016036000116100000000056013373111454011526 00000000000000#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-2.7.1/cblas/zscal.c0000644016036000116100000000032313135126237011573 00000000000000#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-2.7.1/cblas/zswap.c0000644016036000116100000000033113135126237011622 00000000000000#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-2.7.1/cblas/zsymm.c0000644016036000116100000000070613373111454011642 00000000000000#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-2.7.1/cblas/zsyr2k.c0000644016036000116100000000072113373111454011724 00000000000000#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-2.7.1/cblas/zsyrk.c0000644016036000116100000000065613373111454011651 00000000000000#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-2.7.1/cblas/ztbmv.c0000644016036000116100000000064713373111454011631 00000000000000#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-2.7.1/cblas/ztbsv.c0000644016036000116100000000067313373111454011636 00000000000000#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-2.7.1/cblas/ztpmv.c0000644016036000116100000000057713373111454011651 00000000000000#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-2.7.1/cblas/ztpsv.c0000644016036000116100000000062313373111454011647 00000000000000#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-2.7.1/cblas/ztrmm.c0000644016036000116100000000074213373111454011634 00000000000000#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-2.7.1/cblas/ztrmv.c0000644016036000116100000000063213373111454011643 00000000000000#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-2.7.1/cblas/ztrsm.c0000644016036000116100000000076613373111454011650 00000000000000#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-2.7.1/cblas/ztrsv.c0000644016036000116100000000065613373111454011657 00000000000000#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-2.7.1/cblas/icamax.c0000644016036000116100000000031613135126237011723 00000000000000#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-2.7.1/cblas/idamax.c0000644016036000116100000000032113135126237011720 00000000000000#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-2.7.1/cblas/isamax.c0000644016036000116100000000031713135126237011744 00000000000000#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-2.7.1/cblas/izamax.c0000644016036000116100000000031713135126237011753 00000000000000#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-2.7.1/cblas/xerbla.c0000644016036000116100000000226613135126237011744 00000000000000/* 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-2.7.1/cblas/test.c0000644016036000116100000000204113135126237011435 00000000000000/* 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-2.7.1/cblas/test_amax.c0000644016036000116100000000466113135126237012455 00000000000000#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-2.7.1/cblas/test_asum.c0000644016036000116100000000523513135126237012472 00000000000000#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-2.7.1/cblas/test_axpy.c0000644016036000116100000001170113135126237012501 00000000000000#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-2.7.1/cblas/test_copy.c0000644016036000116100000001103213135126237012467 00000000000000#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-2.7.1/cblas/test_dot.c0000644016036000116100000002112213135126237012304 00000000000000#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-2.7.1/cblas/test_gbmv.c0000644016036000116100000004602413135126237012461 00000000000000#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-2.7.1/cblas/test_gemm.c0000644016036000116100000012251713135126237012455 00000000000000#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-2.7.1/cblas/test_gemv.c0000644016036000116100000003054713135126237012467 00000000000000#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-2.7.1/cblas/test_ger.c0000644016036000116100000001476413135126237012311 00000000000000#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-2.7.1/cblas/test_hbmv.c0000644016036000116100000003372113135126237012462 00000000000000#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-2.7.1/cblas/test_hemm.c0000644016036000116100000002746413135126237012463 00000000000000#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-2.7.1/cblas/test_hemv.c0000644016036000116100000002375113135126237012467 00000000000000#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-2.7.1/cblas/test_her.c0000644016036000116100000001032413135126237012276 00000000000000#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-2.7.1/cblas/test_her2.c0000644016036000116100000001147513135126237012370 00000000000000#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-2.7.1/cblas/test_her2k.c0000644016036000116100000002570513135126237012544 00000000000000#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-2.7.1/cblas/test_herk.c0000644016036000116100000002621013135126237012452 00000000000000#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-2.7.1/cblas/test_hpmv.c0000644016036000116100000002615113135126237012477 00000000000000#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-2.7.1/cblas/test_hpr.c0000644016036000116100000001141213135126237012310 00000000000000#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-2.7.1/cblas/test_hpr2.c0000644016036000116100000001131113135126237012370 00000000000000#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-2.7.1/cblas/test_nrm2.c0000644016036000116100000000527213135126237012404 00000000000000#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-2.7.1/cblas/test_rot.c0000644016036000116100000003117213135126237012330 00000000000000#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-2.7.1/cblas/test_rotg.c0000644016036000116100000013527713135126237012512 00000000000000#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-2.7.1/cblas/test_rotm.c0000644016036000116100000010502513135126237012504 00000000000000#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-2.7.1/cblas/test_rotmg.c0000644016036000116100000001430113135126237012647 00000000000000#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-2.7.1/cblas/test_sbmv.c0000644016036000116100000002327513135126237012500 00000000000000#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-2.7.1/cblas/test_scal.c0000644016036000116100000005076213135126237012454 00000000000000#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-2.7.1/cblas/test_spmv.c0000644016036000116100000002021113135126237012501 00000000000000#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-2.7.1/cblas/test_spr.c0000644016036000116100000000710413135126237012326 00000000000000#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-2.7.1/cblas/test_spr2.c0000644016036000116100000001001113135126237012377 00000000000000#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-2.7.1/cblas/test_swap.c0000644016036000116100000001611713135126237012500 00000000000000#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-2.7.1/cblas/test_symm.c0000644016036000116100000005075413135126237012520 00000000000000#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-2.7.1/cblas/test_symv.c0000644016036000116100000001740113135126237012521 00000000000000#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-2.7.1/cblas/test_syr.c0000644016036000116100000000653013135126237012341 00000000000000#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-2.7.1/cblas/test_syr2.c0000644016036000116100000000735113135126237012425 00000000000000#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-2.7.1/cblas/test_syr2k.c0000644016036000116100000004715413135126237012605 00000000000000#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-2.7.1/cblas/test_syrk.c0000644016036000116100000004765613135126237012532 00000000000000#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-2.7.1/cblas/test_tbmv.c0000644016036000116100000015104113135126237012472 00000000000000#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-2.7.1/cblas/test_tbsv.c0000644016036000116100000015223413135126237012505 00000000000000#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-2.7.1/cblas/test_tpmv.c0000644016036000116100000012305113135126237012510 00000000000000#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-2.7.1/cblas/test_tpsv.c0000644016036000116100000012343113135126237012520 00000000000000#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-2.7.1/cblas/test_trmm.c0000644016036000116100000036501613135126237012512 00000000000000#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-2.7.1/cblas/test_trmv.c0000644016036000116100000011525113135126237012515 00000000000000#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-2.7.1/cblas/test_trsm.c0000644016036000116100000036547313135126237012527 00000000000000#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-2.7.1/cblas/test_trsv.c0000644016036000116100000011554113135126237012525 00000000000000#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-2.7.1/blas/0000755016036000116100000000000014151602575010235 500000000000000gsl-2.7.1/blas/Makefile.am0000644016036000116100000000056213373111454012210 00000000000000noinst_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-2.7.1/blas/gsl_blas.h0000644016036000116100000005265613135126237012127 00000000000000/* 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-2.7.1/blas/gsl_blas_types.h0000644016036000116100000000305313135126237013336 00000000000000/* 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-2.7.1/blas/Makefile.in0000644016036000116100000005231014151557213012221 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/blas.Plo 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 am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/blas.Plo -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 -f ./$(DEPDIR)/blas.Plo -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 am--depfiles 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 .PRECIOUS: Makefile #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-2.7.1/blas/ChangeLog0000644016036000116100000000467413373111454011736 000000000000002009-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-2.7.1/blas/TODO0000644016036000116100000000041613373111454010642 00000000000000# -*- 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-2.7.1/blas/blas.c0000644016036000116100000016000213373111454011235 00000000000000/* 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-2.7.1/linalg/0000755016036000116100000000000014151602575010562 500000000000000gsl-2.7.1/linalg/Makefile.am0000644016036000116100000000233513754520364012544 00000000000000noinst_LTLIBRARIES = libgsllinalg.la pkginclude_HEADERS = gsl_linalg.h AM_CPPFLAGS = -I$(top_srcdir) libgsllinalg_la_SOURCES = cod.c condest.c invtri.c invtri_complex.c multiply.c exponential.c tridiag.c tridiag.h lu.c lu_band.c luc.c hh.c ql.c qr.c qr_band.c qrc.c qrpt.c qr_ud.c qr_ur.c qr_uu.c qr_uz.c rqr.c rqrc.c lq.c ptlq.c svd.c householder.c householdercomplex.c hessenberg.c hesstri.c cholesky.c choleskyc.c mcholesky.c pcholesky.c cholesky_band.c ldlt.c ldlt_band.c symmtd.c hermtd.c bidiag.c balance.c balancemat.c inline.c trimult.c trimult_complex.c noinst_HEADERS = apply_givens.c cholesky_common.c recurse.h svdstep.c tridiag.h test_cholesky.c test_choleskyc.c test_cod.c test_common.c test_ldlt.c test_lu.c test_lu_band.c test_luc.c test_lq.c test_ql.c test_qr.c test_qr_band.c test_qrc.c test_tri.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-2.7.1/linalg/apply_givens.c0000644016036000116100000000675513373111455013360 00000000000000/* 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-2.7.1/linalg/cholesky_common.c0000644016036000116100000000451413373111455014040 00000000000000/* 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-2.7.1/linalg/recurse.h0000644016036000116100000000070513476347663012342 00000000000000/* define how a problem is split recursively */ #define GSL_LINALG_SPLIT(n) ((n >= 16) ? ((n + 8) / 16) * 8 : n / 2) #define GSL_LINALG_SPLIT_COMPLEX(n) ((n >= 8) ? ((n + 4) / 8) * 4 : n / 2) /* matrix size for crossover to Level 2 algorithms */ #define CROSSOVER 24 #define CROSSOVER_LU CROSSOVER #define CROSSOVER_CHOLESKY CROSSOVER #define CROSSOVER_INVTRI CROSSOVER #define CROSSOVER_TRIMULT CROSSOVER gsl-2.7.1/linalg/svdstep.c0000644016036000116100000003213413373111455012336 00000000000000/* 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-2.7.1/linalg/tridiag.h0000644016036000116100000000363713135126237012304 00000000000000/* 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-2.7.1/linalg/test_cholesky.c0000644016036000116100000007252513752357673013555 00000000000000/* 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 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 double test_cholesky_norm1(const gsl_matrix * m) { const size_t N = m->size2; double value = 0.0; size_t j; for (j = 0; j < N; ++j) { gsl_vector_const_view v = gsl_matrix_const_column(m, j); double sum = gsl_blas_dasum(&v.vector); value = GSL_MAX(value, sum); } return value; } 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(CblasLower, CblasNonUnit, L, V); gsl_matrix_transpose_tricpy(CblasLower, CblasNonUnit, 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 = 200; 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, 1.0e3 * N * GSL_DBL_EPSILON, "cholesky_decomp unscaled random"); test_cholesky_decomp_eps(1, m, -1.0, 1.0e3 * 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, N * 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 = 200; 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, 1.0e2 * 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(CblasLower, CblasUnit, L, LDLT); gsl_matrix_transpose_tricpy(CblasLower, CblasUnit, 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(CblasLower, CblasUnit, 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, 1.0e3 * N * GSL_DBL_EPSILON, "mcholesky_decomp unscaled random posdef"); create_symm_matrix(m, r); test_mcholesky_decomp_eps(0, 0, m, -1.0, 1.0e5 * 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, 128.0 * 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_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_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, 1.0e3 * 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, 512.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(CblasLower, CblasUnit, L, LDLT); gsl_matrix_transpose_tricpy(CblasLower, CblasUnit, 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(CblasLower, CblasUnit, 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, 1024.0 * N * GSL_DBL_EPSILON, "pcholesky_decomp unscaled hilbert"); test_pcholesky_decomp_eps(1, m, expected_rcond, 1024.0 * 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 <= 3) { 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 = 200; 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, 1.0e2 * N * GSL_DBL_EPSILON, "pcholesky_invert unscaled random"); if (N <= 4) { create_hilbert_matrix2(m); test_pcholesky_invert_eps(m, 1024.0 * N * GSL_DBL_EPSILON, "pcholesky_invert unscaled hilbert"); } gsl_matrix_free(m); } return s; } static int test_cholesky_band_decomp_eps(const size_t p, const gsl_matrix * m, const double eps, const char * desc) { int s = 0; size_t i, j, N = m->size2; double rcond_expected, rcond; gsl_matrix * V = gsl_matrix_alloc(N, p + 1); 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 * work = gsl_vector_alloc(3 * N); /* convert m to packed banded format */ symm2band_matrix(p, m, V); s += gsl_linalg_cholesky_band_decomp(V); /* compute L and LT */ gsl_linalg_cholesky_band_unpack(V, L); gsl_matrix_transpose_tricpy(CblasLower, CblasNonUnit, LT, L); /* 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: (p=%zu,N=%zu)[%lu,%lu]: %22.18g %22.18g\n", desc, p, N, i, j, Aij, mij); } } /* test 1-norm calculation */ if (p > 0) { double norm1_expected = test_cholesky_norm1(m); double norm1 = gsl_matrix_get(V, N - 1, p); gsl_test_rel(norm1, norm1_expected, eps, "%s: (p=%zu,N=%zu) 1-norm: %22.18g %22.18g\n", desc, p, N, norm1, norm1_expected); } /* test rcond */ gsl_matrix_memcpy(A, m); s += gsl_linalg_cholesky_decomp1(A); s += gsl_linalg_cholesky_rcond(A, &rcond_expected, work); s += gsl_linalg_cholesky_band_rcond(V, &rcond, work); gsl_test_rel(rcond, rcond_expected, eps, "%s: (p=%zu,N=%zu) rcond: %22.18g %22.18g\n", desc, p, N, rcond, rcond_expected); gsl_matrix_free(V); gsl_matrix_free(A); gsl_matrix_free(L); gsl_matrix_free(LT); gsl_vector_free(work); return s; } static int test_cholesky_band_decomp(gsl_rng * r) { int s = 0; const size_t N_max = 50; size_t N, p; for (N = 1; N <= N_max; ++N) { gsl_matrix * m = gsl_matrix_alloc(N, N); for (p = 0; p < GSL_MIN(N, 10); ++p) { create_posdef_band_matrix(p, m, r); s += test_cholesky_band_decomp_eps(p, m, 1.0e5 * N * GSL_DBL_EPSILON, "cholesky_band_decomp random"); } gsl_matrix_free(m); } return s; } int test_cholesky_band_solve_eps(const int scale, const size_t p, const gsl_matrix * m, const gsl_vector * rhs, const gsl_vector * sol, const double eps, const char * desc) { int status = 0; size_t i, N = m->size1; gsl_matrix * u = gsl_matrix_alloc(N, p + 1); gsl_vector * x = gsl_vector_calloc(N); gsl_vector * s = gsl_vector_alloc(N); /* convert m to packed banded format */ symm2band_matrix(p, m, u); if (scale) { gsl_linalg_cholesky_band_scale(u, s); gsl_linalg_cholesky_band_scale_apply(u, s); } status += gsl_linalg_cholesky_band_decomp(u); if (scale) { gsl_vector_memcpy(x, rhs); gsl_vector_mul(x, s); status += gsl_linalg_cholesky_band_svx(u, x); gsl_vector_mul(x, s); } else { status += gsl_linalg_cholesky_band_solve(u, 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: p=%zu N=%zu [%lu]: %22.18g %22.18g\n", desc, p, N, i, xi, yi); } gsl_vector_free(x); gsl_vector_free(s); gsl_matrix_free(u); return status; } static int test_cholesky_band_solve(gsl_rng * r) { int s = 0; const size_t N_max = 50; size_t N, p; 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); for (p = 0; p < GSL_MIN(N, 10); ++p) { create_posdef_band_matrix(p, m, r); create_random_vector(sol, r); gsl_blas_dsymv(CblasLower, 1.0, m, sol, 0.0, rhs); test_cholesky_band_solve_eps(0, p, m, rhs, sol, 1.0e3 * N * GSL_DBL_EPSILON, "cholesky_band_solve random unscaled"); test_cholesky_band_solve_eps(1, p, m, rhs, sol, 1.0e3 * N * GSL_DBL_EPSILON, "cholesky_band_solve random scaled"); } gsl_matrix_free(m); gsl_vector_free(rhs); gsl_vector_free(sol); } return s; } int test_cholesky_band_invert_eps(const size_t p, 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, p + 1); gsl_matrix * minv = gsl_matrix_alloc(N, N); gsl_matrix * c = gsl_matrix_alloc(N, N); /* convert m to packed banded format */ symm2band_matrix(p, m, v); s += gsl_linalg_cholesky_band_decomp(v); s += gsl_linalg_cholesky_band_invert(v, 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 (p=%zu,N=%zu)[%lu,%lu]: %22.18g %22.18g\n", desc, p, N, i, j, cij, expected); } } gsl_matrix_free(v); gsl_matrix_free(minv); gsl_matrix_free(c); return s; } int test_cholesky_band_invert(gsl_rng * r) { int s = 0; const size_t N_max = 50; size_t N, p; for (N = 1; N <= N_max; ++N) { gsl_matrix * m = gsl_matrix_alloc(N, N); for (p = 0; p < GSL_MIN(N, 10); ++p) { create_posdef_band_matrix(p, m, r); test_cholesky_band_invert_eps(p, m, N * 1.0e1 * GSL_DBL_EPSILON, "cholesky_band_invert random"); } gsl_matrix_free(m); } return s; } gsl-2.7.1/linalg/test_choleskyc.c0000644016036000116100000001214313502600472013663 00000000000000/* 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 test_choleskyc_decomp_eps(const gsl_matrix_complex * m, const double eps, const char * desc); static int test_choleskyc_decomp(gsl_rng * r); static int test_choleskyc_invert(gsl_rng * r); static int test_choleskyc_decomp_eps(const gsl_matrix_complex * m, const double eps, const char * desc) { int s = 0; const size_t M = m->size1; const size_t N = m->size2; size_t i, j; 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; i < M; i++) { for (j = 0; j < N; j++) { gsl_complex aij = gsl_matrix_complex_get(a, i, j); gsl_complex mij = gsl_matrix_complex_get(m, i, j); gsl_test_rel(GSL_REAL(aij), GSL_REAL(mij), eps, "%s: real (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, N, i, j, GSL_REAL(aij), GSL_REAL(mij)); gsl_test_rel(GSL_IMAG(aij), GSL_IMAG(mij), eps, "%s: imag (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, N, i, j, GSL_IMAG(aij), GSL_IMAG(mij)); } } gsl_matrix_complex_free(v); gsl_matrix_complex_free(a); gsl_matrix_complex_free(l); gsl_matrix_complex_free(lh); return s; } static int test_choleskyc_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_complex * m = gsl_matrix_complex_alloc(N, N); create_posdef_complex_matrix(m, r); test_choleskyc_decomp_eps(m, 1.0e6 * N * GSL_DBL_EPSILON, "cholesky_complex_decomp random"); gsl_matrix_complex_free(m); } return s; } static int test_choleskyc_invert_eps(const gsl_matrix_complex * m, const double eps, const char * desc) { int s = 0; const size_t N = m->size1; size_t i, j; 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_blas_zhemm(CblasLeft, CblasUpper, GSL_COMPLEX_ONE, m, v, GSL_COMPLEX_ZERO, c); /* c should be the identity matrix */ for (i = 0; i < N; ++i) { for (j = 0; j < N; ++j) { gsl_complex cij = gsl_matrix_complex_get(c, i, j); double expected = (i == j) ? 1.0 : 0.0; /* check real part */ gsl_test_rel(GSL_REAL(cij), expected, eps, "%s: real (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, N, i, j, GSL_REAL(cij), expected); /* check imaginary part */ gsl_test_rel(GSL_IMAG(cij), 0.0, eps, "%s: imag (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, N, i, j, GSL_IMAG(cij), 0.0); } } gsl_matrix_complex_free(v); gsl_matrix_complex_free(c); return s; } static int test_choleskyc_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_complex * m = gsl_matrix_complex_alloc(N, N); create_posdef_complex_matrix(m, r); test_choleskyc_invert_eps(m, 32.0 * N * GSL_DBL_EPSILON, "cholesky_complex_invert random"); gsl_matrix_complex_free(m); } return s; } gsl-2.7.1/linalg/test_cod.c0000644016036000116100000003042313666057324012462 00000000000000/* linalg/test_cod.c * * Copyright (C) 2017 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 test_COD_decomp_eps(const gsl_matrix * m, const double eps, const char *desc); static int test_COD_decomp(gsl_rng *r); static int test_COD_lssolve_eps(const gsl_matrix * m, const double * actual, const double eps, const char *desc); static int test_COD_lssolve(void); static int test_COD_lssolve2_eps(const double lambda, const gsl_matrix * A, const gsl_vector * b, const double eps, const char *desc); static int test_COD_lssolve2(gsl_rng * r); /* create a matrix of a given rank */ static int create_rank_matrix(const size_t rank, gsl_matrix * m, gsl_rng * r) { const size_t M = m->size1; const size_t N = m->size2; size_t i; gsl_vector *u = gsl_vector_alloc(M); gsl_vector *v = gsl_vector_alloc(N); gsl_matrix_set_zero(m); /* add several rank-1 matrices together */ for (i = 0; i < rank; ++i) { create_random_vector(u, r); create_random_vector(v, r); gsl_blas_dger(1.0, u, v, m); } gsl_vector_free(u); gsl_vector_free(v); return GSL_SUCCESS; } static int test_COD_decomp_eps(const gsl_matrix * m, const double eps, const char *desc) { int s = 0; size_t i, j, M = m->size1, 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^T */ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, Q, R, 0.0, QR); gsl_blas_dgemm (CblasNoTrans, CblasTrans, 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); gsl_test_rel(aij, bij, eps, "%s (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, M, N, i, j, aij, bij); } } 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; } static int test_COD_decomp(gsl_rng *r) { int s = 0; size_t N; gsl_matrix *m; /* test COD decomposition on Hilbert matrices */ for (N = 1; N <= 12; ++N) { m = gsl_matrix_alloc(N, N); create_hilbert_matrix2(m); test_COD_decomp_eps(m, 256.0 * N * GSL_DBL_EPSILON, "COD_decomp hilbert"); gsl_matrix_free(m); } /* build some matrices of a given rank and test */ m = gsl_matrix_alloc(100, 50); create_rank_matrix(26, m, r); test_COD_decomp_eps(m, 1.0e2 * GSL_DBL_EPSILON, "COD_decomp rank 26"); gsl_matrix_free(m); m = gsl_matrix_alloc(550, 200); create_rank_matrix(176, m, r); test_COD_decomp_eps(m, 1.0e3 * GSL_DBL_EPSILON, "COD_decomp rank 176"); gsl_matrix_free(m); test_COD_decomp_eps(m35, 1.0e1 * GSL_DBL_EPSILON, "COD_decomp m(3,5)"); test_COD_decomp_eps(m53, 1.0e1 * GSL_DBL_EPSILON, "COD_decomp m(5,3)"); test_COD_decomp_eps(s35, 1.0e1 * GSL_DBL_EPSILON, "COD_decomp s(3,5)"); test_COD_decomp_eps(s53, 1.0e1 * GSL_DBL_EPSILON, "COD_decomp s(5,3)"); test_COD_decomp_eps(vander2, 1.0e1 * GSL_DBL_EPSILON, "COD_decomp vander(2)"); test_COD_decomp_eps(vander3, 1.0e1 * GSL_DBL_EPSILON, "COD_decomp vander(3)"); test_COD_decomp_eps(vander4, 1.0e1 * GSL_DBL_EPSILON, "COD_decomp vander(4)"); test_COD_decomp_eps(vander12, 1e-3, "COD_decomp vander(12)"); /* FIXME: large tolerance needed */ return s; } static int test_COD_lssolve_eps(const gsl_matrix * m, const double * actual, const double eps, const char *desc) { 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); for (i = 0; i < N; i++) { double xi = gsl_vector_get(x, i); gsl_test_rel(xi, actual[i], eps, "%s (%3lu,%3lu)[%lu]: %22.18g %22.18g\n", desc, M, N, i, xi, actual[i]); } /* 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++) { double r1 = gsl_vector_get(res, i); double r2 = gsl_vector_get(r, i); if (fabs(r2) < 1.0e3 * GSL_DBL_EPSILON) { gsl_test_abs(r1, r2, 10.0 * eps, "%s res (%3lu,%3lu)[%lu]: %22.18g %22.18g\n", desc, M, N, i, r1, r2); } else { gsl_test_rel(r1, r2, eps, "%s res (%3lu,%3lu)[%lu]: %22.18g %22.18g\n", desc, M, N, i, r1, r2); } } 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; } static int test_COD_lssolve(void) { int s = 0; test_COD_lssolve_eps(m53, m53_lssolution, 1.0e4 * GSL_DBL_EPSILON, "COD_lssolve m(5,3)"); test_COD_lssolve_eps(hilb2, hilb2_solution, 1.0e2 * GSL_DBL_EPSILON, "COD_lssolve hilbert(2)"); test_COD_lssolve_eps(hilb3, hilb3_solution, 1.0e2 * GSL_DBL_EPSILON, "COD_lssolve hilbert(3)"); test_COD_lssolve_eps(hilb4, hilb4_solution, 1.0e4 * GSL_DBL_EPSILON, "COD_lssolve hilbert(4)"); test_COD_lssolve_eps(vander2, vander2_solution, 1.0e1 * GSL_DBL_EPSILON, "COD_lssolve vander(2)"); test_COD_lssolve_eps(vander3, vander3_solution, 1.0e1 * GSL_DBL_EPSILON, "COD_lssolve vander(3)"); test_COD_lssolve_eps(vander4, vander4_solution, 1.0e2 * GSL_DBL_EPSILON, "COD_lssolve vander(4)"); /* rank-1 least squares problem from the 'lin2' test dataset for multifit_nlinear */ { const size_t M = 20; const size_t N = 5; /* unique minimum norm solution from "Factorize" matlab package */ const double x_ls[] = { 1.818181818181817e-02, 3.636363636363636e-02, 5.454545454545454e-02, 7.272727272727272e-02, 9.090909090909088e-02 }; gsl_matrix *m = gsl_matrix_alloc(M, N); size_t i, j; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { gsl_matrix_set(m, i, j, (i + 1.0) * (j + 1.0)); } } test_COD_lssolve_eps(m, x_ls, 1.0e2 * GSL_DBL_EPSILON, "COD_lssolve lin2"); gsl_matrix_free(m); } return s; } /* solve: min ||b - A x||^2 + lambda^2 ||x||^2 */ static int test_COD_lssolve2_eps(const double lambda, const gsl_matrix * A, const gsl_vector * b, const double eps, const char *desc) { int s = 0; size_t i, M = A->size1, N = A->size2; gsl_vector * lhs = 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 * x_aug = 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; /* form full rank augmented system B = [ A ; lambda*I_N ], f = [ rhs ; 0 ] and solve with QRPT */ { gsl_vector_view v; gsl_matrix_view m; gsl_permutation *p = gsl_permutation_alloc(N); gsl_matrix * B = gsl_matrix_calloc(M + N, N); gsl_vector * f = gsl_vector_calloc(M + N); gsl_vector * tau = gsl_vector_alloc(N); gsl_vector * residual = gsl_vector_alloc(M + N); int signum; m = gsl_matrix_submatrix(B, 0, 0, M, N); gsl_matrix_memcpy(&m.matrix, A); m = gsl_matrix_submatrix(B, M, 0, N, N); v = gsl_matrix_diagonal(&m.matrix); gsl_vector_set_all(&v.vector, lambda); v = gsl_vector_subvector(f, 0, M); gsl_vector_memcpy(&v.vector, b); /* solve: [ A ; lambda*I ] x_aug = [ b ; 0 ] */ gsl_linalg_QRPT_decomp(B, tau, p, &signum, work); gsl_linalg_QRPT_lssolve(B, tau, p, f, x_aug, residual); gsl_permutation_free(p); gsl_matrix_free(B); gsl_vector_free(f); gsl_vector_free(tau); gsl_vector_free(residual); } gsl_matrix_memcpy(QRZT, A); s += gsl_linalg_COD_decomp(QRZT, tau_Q, tau_Z, perm, &rank, work); { gsl_matrix *S = gsl_matrix_alloc(rank, rank); gsl_vector *workr = gsl_vector_alloc(rank); s += gsl_linalg_COD_lssolve2(lambda, QRZT, tau_Q, tau_Z, perm, rank, b, x, res, S, workr); gsl_matrix_free(S); gsl_vector_free(workr); } for (i = 0; i < N; i++) { double xi = gsl_vector_get(x, i); double yi = gsl_vector_get(x_aug, i); gsl_test_rel(xi, yi, eps, "%s (%3lu,%3lu)[%lu]: %22.18g %22.18g\n", desc, M, N, i, xi, yi); } /* compute residual r = b - A x */ if (M == N) { gsl_vector_set_zero(r); } else { gsl_vector_memcpy(r, b); gsl_blas_dgemv(CblasNoTrans, -1.0, A, x, 1.0, r); } for (i = 0; i < N; i++) { double xi = gsl_vector_get(res, i); double yi = gsl_vector_get(r, i); gsl_test_rel(xi, yi, sqrt(eps), "%s res (%3lu,%3lu)[%lu]: %22.18g %22.18g\n", desc, M, N, i, xi, yi); } gsl_vector_free(r); gsl_vector_free(res); gsl_vector_free(x); gsl_vector_free(x_aug); gsl_vector_free(tau_Q); gsl_vector_free(tau_Z); gsl_matrix_free(QRZT); gsl_vector_free(lhs); gsl_vector_free(work); gsl_permutation_free(perm); return s; } static int test_COD_lssolve2(gsl_rng * r) { int s = 0; gsl_matrix *m; gsl_vector *b; size_t M, N; const double lambda = 2.3; M = 100; N = 50; m = gsl_matrix_alloc(M, N); b = gsl_vector_alloc(M); create_rank_matrix(26, m, r); create_random_vector(b, r); test_COD_lssolve2_eps(lambda, m, b, 1.0e4 * M * GSL_DBL_EPSILON, "COD_lssolve2 rank 26"); gsl_matrix_free(m); gsl_vector_free(b); M = 500; N = 450; m = gsl_matrix_alloc(M, N); b = gsl_vector_alloc(M); create_rank_matrix(278, m, r); create_random_vector(b, r); test_COD_lssolve2_eps(lambda, m, b, 1.0e6 * M * GSL_DBL_EPSILON, "COD_lssolve2 rank 278"); gsl_matrix_free(m); gsl_vector_free(b); return s; } gsl-2.7.1/linalg/test_common.c0000644016036000116100000001730213677534666013221 00000000000000/* linalg/test_common.c * * Copyright (C) 2017, 2018, 2019, 2020 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 int create_random_vector(gsl_vector * v, gsl_rng * r); static int create_random_matrix(gsl_matrix * m, gsl_rng * r); static int create_posdef_matrix(gsl_matrix * m, gsl_rng * r); static int create_hilbert_matrix2(gsl_matrix * m); 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_random_complex_vector(gsl_vector_complex * v, gsl_rng * r) { const size_t N = v->size; size_t i; for (i = 0; i < N; ++i) { gsl_complex vi; GSL_REAL(vi) = gsl_rng_uniform(r); GSL_IMAG(vi) = gsl_rng_uniform(r); gsl_vector_complex_set(v, i, vi); } return GSL_SUCCESS; } static int create_random_matrix(gsl_matrix * m, gsl_rng * r) { const size_t M = m->size1; const size_t N = m->size2; size_t i, j; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { double mij = gsl_rng_uniform(r); gsl_matrix_set(m, i, j, mij); } } return GSL_SUCCESS; } static int create_random_complex_matrix(gsl_matrix_complex * m, gsl_rng * r) { const size_t M = m->size1; const size_t N = m->size2; size_t i, j; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { gsl_complex mij; GSL_REAL(mij) = gsl_rng_uniform(r); GSL_IMAG(mij) = gsl_rng_uniform(r); gsl_matrix_complex_set(m, i, j, mij); } } 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(CblasLower, CblasUnit, m, m); return GSL_SUCCESS; } static int create_herm_matrix(gsl_matrix_complex * 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 re = gsl_rng_uniform(r); double im = (i != j) ? gsl_rng_uniform(r) : 0.0; gsl_complex z = gsl_complex_rect(re, im); gsl_matrix_complex_set(m, i, j, z); if (i != j) gsl_matrix_complex_set(m, j, i, gsl_complex_conjugate(z)); } } return GSL_SUCCESS; } /* create symmetric banded matrix with p sub/super-diagonals */ static int create_symm_band_matrix(const size_t p, gsl_matrix * m, gsl_rng * r) { size_t i; gsl_matrix_set_zero(m); for (i = 0; i < p + 1; ++i) { gsl_vector_view subdiag = gsl_matrix_subdiagonal(m, i); create_random_vector(&subdiag.vector, r); if (i > 0) { gsl_vector_view superdiag = gsl_matrix_superdiagonal(m, i); gsl_vector_memcpy(&superdiag.vector, &subdiag.vector); } } return GSL_SUCCESS; } /* create (p,q) banded matrix */ static int create_band_matrix(const size_t p, const size_t q, gsl_matrix * m, gsl_rng * r) { size_t i; gsl_matrix_set_zero(m); for (i = 0; i <= p; ++i) { gsl_vector_view v = gsl_matrix_subdiagonal(m, i); create_random_vector(&v.vector, r); } for (i = 1; i <= q; ++i) { gsl_vector_view v = gsl_matrix_superdiagonal(m, i); create_random_vector(&v.vector, r); } 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_posdef_complex_matrix(gsl_matrix_complex *m, gsl_rng *r) { const size_t N = m->size1; const double alpha = 10.0 * N; size_t i; create_herm_matrix(m, r); for (i = 0; i < N; ++i) { gsl_complex * mii = gsl_matrix_complex_ptr(m, i, i); GSL_REAL(*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 create_posdef_band_matrix(const size_t p, 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_band_matrix(p, m, r); for (i = 0; i < N; ++i) { double *mii = gsl_matrix_ptr(m, i, i); *mii += alpha; } return GSL_SUCCESS; } /* transform dense symmetric banded matrix to compact form, with bandwidth p */ static int symm2band_matrix(const size_t p, const gsl_matrix * m, gsl_matrix * bm) { const size_t N = m->size1; if (bm->size1 != N) { GSL_ERROR("banded matrix requires N rows", GSL_EBADLEN); } else if (bm->size2 != p + 1) { GSL_ERROR("banded matrix requires p + 1 columns", GSL_EBADLEN); } else { size_t i; gsl_matrix_set_zero(bm); for (i = 0; i < p + 1; ++i) { gsl_vector_const_view diag = gsl_matrix_const_subdiagonal(m, i); gsl_vector_view v = gsl_matrix_subcolumn(bm, i, 0, N - i); gsl_vector_memcpy(&v.vector, &diag.vector); } return GSL_SUCCESS; } } /* transform general dense (p,q) banded matrix to compact banded form */ static int gen2band_matrix(const size_t p, const size_t q, const gsl_matrix * A, gsl_matrix * AB) { const size_t N = A->size2; if (AB->size1 != N) { GSL_ERROR("banded matrix requires N rows", GSL_EBADLEN); } else if (AB->size2 != 2*p + q + 1) { GSL_ERROR("banded matrix requires 2*p + q + 1 columns", GSL_EBADLEN); } else { size_t i; gsl_matrix_set_zero(AB); /* copy diagonal and subdiagonals */ for (i = 0; i <= p; ++i) { gsl_vector_const_view v = gsl_matrix_const_subdiagonal(A, i); gsl_vector_view w = gsl_matrix_subcolumn(AB, p + q + i, 0, v.vector.size); gsl_vector_memcpy(&w.vector, &v.vector); } /* copy superdiagonals */ for (i = 1; i <= q; ++i) { gsl_vector_const_view v = gsl_matrix_const_superdiagonal(A, i); gsl_vector_view w = gsl_matrix_subcolumn(AB, p + q - i, i, v.vector.size); gsl_vector_memcpy(&w.vector, &v.vector); } return GSL_SUCCESS; } } gsl-2.7.1/linalg/test_ldlt.c0000644016036000116100000002231613667327773012667 00000000000000/* linalg/test_ldlt.c * * Copyright (C) 2018 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 double test_ldlt_norm1(const gsl_matrix * m) { const size_t N = m->size2; double value = 0.0; size_t j; for (j = 0; j < N; ++j) { gsl_vector_const_view v = gsl_matrix_const_column(m, j); double sum = gsl_blas_dasum(&v.vector); value = GSL_MAX(value, sum); } return value; } static int test_ldlt_decomp_eps(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_view d; gsl_matrix_memcpy(V, m); s += gsl_linalg_ldlt_decomp(V); /* compute L and LT */ gsl_matrix_tricpy(CblasLower, CblasUnit, L, V); d = gsl_matrix_diagonal(L); gsl_vector_set_all(&d.vector, 1.0); gsl_matrix_transpose_tricpy(CblasLower, CblasNonUnit, LT, L); /* compute L <- L D */ d = gsl_matrix_diagonal(V); for (i = 0; i < N; ++i) { gsl_vector_view c = gsl_matrix_column(L, i); double di = gsl_vector_get(&d.vector, i); gsl_vector_scale(&c.vector, di); } /* compute A = L D 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) { gsl_vector *work = gsl_vector_alloc(3 * N); double rcond; gsl_linalg_ldlt_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); return s; } static int test_ldlt_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_ldlt_decomp_eps(m, -1.0, 1.0e2 * N * GSL_DBL_EPSILON, "ldlt_decomp 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_ldlt_decomp_eps(m, expected_rcond, N * GSL_DBL_EPSILON, "ldlt_decomp hilbert"); } gsl_matrix_free(m); } return s; } int test_ldlt_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_matrix_memcpy(u, m); s += gsl_linalg_ldlt_decomp(u); s += gsl_linalg_ldlt_solve(u, 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_matrix_free(u); return s; } static int test_ldlt_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_ldlt_solve_eps(m, rhs, sol, 64.0 * N * GSL_DBL_EPSILON, "ldlt_solve random"); if (N <= 3) { create_hilbert_matrix2(m); gsl_blas_dsymv(CblasLower, 1.0, m, sol, 0.0, rhs); test_ldlt_solve_eps(m, rhs, sol, 1024.0 * N * GSL_DBL_EPSILON, "ldlt_solve hilbert"); } gsl_matrix_free(m); gsl_vector_free(rhs); gsl_vector_free(sol); } return s; } static int test_ldlt_band_decomp_eps(const size_t p, const gsl_matrix * m, const double eps, const char * desc) { int s = 0; size_t i, j, N = m->size2; double rcond, rcond_expected; gsl_matrix * V = gsl_matrix_alloc(N, p + 1); 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 * D = gsl_vector_alloc(N); gsl_vector * work = gsl_vector_alloc(3 * N); /* convert m to packed banded format */ symm2band_matrix(p, m, V); s += gsl_linalg_ldlt_band_decomp(V); /* compute L and LT */ gsl_linalg_ldlt_band_unpack(V, L, D); gsl_matrix_transpose_tricpy(CblasLower, CblasNonUnit, LT, L); /* compute L <- L D */ for (i = 0; i < N; ++i) { gsl_vector_view c = gsl_matrix_column(L, i); double di = gsl_vector_get(D, i); gsl_vector_scale(&c.vector, di); } /* compute A = L D 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: (p=%zu,N=%zu)[%lu,%lu]: %22.18g %22.18g\n", desc, p, N, i, j, Aij, mij); } } /* test 1-norm calculation */ if (p > 0) { double norm1_expected = test_ldlt_norm1(m); double norm1 = gsl_matrix_get(V, N - 1, p); gsl_test_rel(norm1, norm1_expected, eps, "%s: (p=%zu,N=%zu) 1-norm: %22.18g %22.18g\n", desc, p, N, norm1, norm1_expected); } /* test rcond */ gsl_matrix_memcpy(A, m); s += gsl_linalg_ldlt_decomp(A); s += gsl_linalg_ldlt_rcond(A, &rcond_expected, work); s += gsl_linalg_ldlt_band_rcond(V, &rcond, work); gsl_test_rel(rcond, rcond_expected, eps, "%s: (p=%zu,N=%zu) rcond: %22.18g %22.18g\n", desc, p, N, rcond, rcond_expected); gsl_matrix_free(V); gsl_matrix_free(A); gsl_matrix_free(L); gsl_matrix_free(LT); gsl_vector_free(D); gsl_vector_free(work); return s; } static int test_ldlt_band_decomp(gsl_rng * r) { int s = 0; const size_t N_max = 50; size_t N, p; for (N = 1; N <= N_max; ++N) { gsl_matrix * m = gsl_matrix_alloc(N, N); for (p = 0; p < GSL_MIN(N, 10); ++p) { create_posdef_band_matrix(p, m, r); s += test_ldlt_band_decomp_eps(p, m, 1.0e3 * N * GSL_DBL_EPSILON, "ldlt_band_decomp random"); } gsl_matrix_free(m); } return s; } int test_ldlt_band_solve_eps(const size_t p, 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, p + 1); gsl_vector * x = gsl_vector_alloc(N); /* convert m to packed banded format */ symm2band_matrix(p, m, u); s += gsl_linalg_ldlt_band_decomp(u); s += gsl_linalg_ldlt_band_solve(u, 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: p=%zu N=%zu [%lu]: %22.18g %22.18g\n", desc, p, N, i, xi, yi); } gsl_vector_free(x); gsl_matrix_free(u); return s; } static int test_ldlt_band_solve(gsl_rng * r) { int s = 0; const size_t N_max = 50; size_t N, p; 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); for (p = 0; p < GSL_MIN(N, 10); ++p) { create_posdef_band_matrix(p, m, r); create_random_vector(sol, r); gsl_blas_dsymv(CblasLower, 1.0, m, sol, 0.0, rhs); test_ldlt_band_solve_eps(p, m, rhs, sol, 64.0 * N * GSL_DBL_EPSILON, "ldlt_band_solve random"); } gsl_matrix_free(m); gsl_vector_free(rhs); gsl_vector_free(sol); } return s; } gsl-2.7.1/linalg/test_lu.c0000644016036000116100000001630114151556700012324 00000000000000/* linalg/test_lu.c * * Copyright (C) 2019 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 test_LU_decomp_eps(const gsl_matrix * m, const double eps, const char * desc) { int s = 0; const size_t M = m->size1; const size_t N = m->size2; gsl_matrix * A = gsl_matrix_alloc(M, N); gsl_matrix * PLU = gsl_matrix_calloc(M, N); gsl_permutation * p = gsl_permutation_alloc(M); size_t i, j; int signum; gsl_matrix_memcpy(A, m); gsl_linalg_LU_decomp(A, p, &signum); if (M >= N) { gsl_matrix_view U = gsl_matrix_submatrix(A, 0, 0, N, N); /* copy L factor into PLU */ for (j = 0; j < GSL_MIN(M, N); ++j) { gsl_vector_view v1 = gsl_matrix_subcolumn(A, j, j, M - j); gsl_vector_view v2 = gsl_matrix_subcolumn(PLU, j, j, M - j); gsl_vector_memcpy(&v2.vector, &v1.vector); gsl_matrix_set(PLU, j, j, 1.0); } /* PLU := L * U */ gsl_blas_dtrmm(CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, 1.0, &U.matrix, PLU); } else { gsl_matrix_view L = gsl_matrix_submatrix(A, 0, 0, M, M); /* copy U factor into PLU */ for (i = 0; i < GSL_MIN(M, N); ++i) { gsl_vector_view v1 = gsl_matrix_subrow(A, i, i, N - i); gsl_vector_view v2 = gsl_matrix_subrow(PLU, i, i, N - i); gsl_vector_memcpy(&v2.vector, &v1.vector); } /* PLU := L * U */ gsl_blas_dtrmm(CblasLeft, CblasLower, CblasNoTrans, CblasUnit, 1.0, &L.matrix, PLU); } /* PLU := P * L * U */ for (j = 0; j < N; ++j) { gsl_vector_view v = gsl_matrix_column(PLU, j); gsl_permute_vector_inverse(p, &v.vector); } /* now test m = PLU */ for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { double aij = gsl_matrix_get(PLU, 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, M, N, i, j, aij, mij); } } gsl_matrix_free(A); gsl_matrix_free(PLU); gsl_permutation_free(p); return s; } static int test_LU_decomp(gsl_rng * r) { int s = 0; size_t n; /* test square matrices */ for (n = 1; n <= 50; ++n) { gsl_matrix * m = gsl_matrix_alloc(n, n); create_random_matrix(m, r); test_LU_decomp_eps(m, 4096.0 * n * GSL_DBL_EPSILON, "LU_decomp random"); create_hilbert_matrix2(m); test_LU_decomp_eps(m, 256.0 * n * GSL_DBL_EPSILON, "LU_decomp hilbert"); gsl_matrix_free(m); } { gsl_matrix * m = gsl_matrix_alloc(100, 50); create_random_matrix(m, r); test_LU_decomp_eps(m, 256.0 * n * GSL_DBL_EPSILON, "LU_decomp rect1"); gsl_matrix_free(m); } { gsl_matrix * m = gsl_matrix_alloc(50, 100); create_random_matrix(m, r); test_LU_decomp_eps(m, 1.0e3 * n * GSL_DBL_EPSILON, "LU_decomp rect2"); gsl_matrix_free(m); } { gsl_matrix * m = gsl_matrix_alloc(80, 100); create_random_matrix(m, r); test_LU_decomp_eps(m, 1.0e4 * n * GSL_DBL_EPSILON, "LU_decomp rect3"); gsl_matrix_free(m); } return s; } static int test_LU_solve_eps(const gsl_matrix * m, const gsl_vector * rhs, const gsl_vector * sol, const double eps, const char * desc) { int s = 0; const size_t N = m->size1; int signum; size_t i; gsl_permutation * perm = gsl_permutation_alloc(N); gsl_matrix * lu = gsl_matrix_alloc(N, N); gsl_vector * x = gsl_vector_alloc(N); gsl_vector * residual = gsl_vector_alloc(N); gsl_matrix_memcpy(lu, m); s += gsl_linalg_LU_decomp(lu, perm, &signum); s += gsl_linalg_LU_solve(lu, 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); } s += gsl_linalg_LU_refine(m, lu, perm, rhs, x, residual); 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: improved %3lu[%lu]: %22.18g %22.18g\n", desc, N, i, xi, yi); } gsl_vector_free(residual); gsl_vector_free(x); gsl_matrix_free(lu); gsl_permutation_free(perm); return s; } static int test_LU_solve(gsl_rng * r) { int s = 0; size_t n; for (n = 1; n <= 50; ++n) { gsl_matrix * m = gsl_matrix_alloc(n, n); gsl_vector * rhs = gsl_vector_alloc(n); gsl_vector * sol = gsl_vector_alloc(n); create_random_matrix(m, r); create_random_vector(sol, r); gsl_blas_dgemv(CblasNoTrans, 1.0, m, sol, 0.0, rhs); test_LU_solve_eps(m, rhs, sol, 1.0e5 * n * GSL_DBL_EPSILON, "LU_solve random"); if (n <= 4) { create_hilbert_matrix2(m); gsl_blas_dsymv(CblasLower, 1.0, m, sol, 0.0, rhs); test_LU_solve_eps(m, rhs, sol, 4096.0 * n * GSL_DBL_EPSILON, "LU_solve hilbert"); } gsl_matrix_free(m); gsl_vector_free(rhs); gsl_vector_free(sol); } return s; } int test_LU_invert_eps(const gsl_matrix * m, const double eps, const char *desc) { int s = 0; size_t i, j, N = m->size1; gsl_matrix * lu = gsl_matrix_alloc(N, N); gsl_matrix * c = gsl_matrix_alloc(N, N); gsl_permutation * perm = gsl_permutation_alloc(N); int signum; gsl_matrix_memcpy(lu, m); s += gsl_linalg_LU_decomp(lu, perm, &signum); s += gsl_linalg_LU_invx(lu, perm); /* c = m m^{-1} */ gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, m, lu, 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(lu); gsl_matrix_free(c); gsl_permutation_free(perm); return s; } static int test_LU_invert(gsl_rng * r) { int s = 0; size_t n; for (n = 1; n <= 50; ++n) { gsl_matrix * m = gsl_matrix_alloc(n, n); create_random_matrix(m, r); test_LU_invert_eps(m, 1.0e5 * n * GSL_DBL_EPSILON, "LU_invert random"); gsl_matrix_free(m); } return s; } gsl-2.7.1/linalg/test_lu_band.c0000644016036000116100000001205413703250610013302 00000000000000/* linalg/test_lu_band.c * * Copyright (C) 2020 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 test_LU_band_decomp_eps(const size_t p, const size_t q, const gsl_matrix * A, const double eps, const char * desc) { int s = 0; const size_t M = A->size1; const size_t N = A->size2; const size_t minMN = GSL_MIN(M, N); size_t i, j; gsl_matrix * AB = gsl_matrix_alloc(N, 2*p + q + 1); gsl_vector_uint * piv = gsl_vector_uint_alloc(minMN); gsl_matrix * L = gsl_matrix_alloc(M, minMN); gsl_matrix * U = gsl_matrix_alloc(minMN, N); gsl_matrix * B = gsl_matrix_alloc(M, N); /* convert A to packed banded format */ gen2band_matrix(p, q, A, AB); s += gsl_linalg_LU_band_decomp(M, p, q, AB, piv); s += gsl_linalg_LU_band_unpack(M, p, q, AB, piv, L, U); /* compute B = L U */ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, L, U, 0.0, B); for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { double aij = gsl_matrix_get(A, i, j); double bij = gsl_matrix_get(B, i, j); gsl_test_rel(bij, aij, eps, "%s (M=%lu,N=%lu)(p=%lu,q=%lu)[%lu,%lu]: %22.18g %22.18g\n", desc, M, N, p, q, i, j, aij, bij); } } gsl_matrix_free(AB); gsl_vector_uint_free(piv); gsl_matrix_free(L); gsl_matrix_free(U); gsl_matrix_free(B); return s; } static int test_LU_band_decomp(gsl_rng * r) { int s = 0; const size_t N_max = 20; gsl_matrix * A = gsl_matrix_alloc(N_max, N_max); size_t M, N, p, q; for (M = 1; M <= N_max; ++M) { for (N = 1; N <= N_max; ++N) { gsl_matrix_view m = gsl_matrix_submatrix(A, 0, 0, M, N); for (p = 0; p < GSL_MIN(M, 10); ++p) { for (q = 0; q < GSL_MIN(N, 10); ++q) { create_band_matrix(p, q, &m.matrix, r); s += test_LU_band_decomp_eps(p, q, &m.matrix, 1.0e5 * GSL_MAX(M,N) * GSL_DBL_EPSILON, "LU_band_decomp random"); } } } } gsl_matrix_free(A); return s; } static int test_LU_band_solve_eps(const size_t p, const size_t q, const gsl_matrix * A, const gsl_vector * rhs, const gsl_vector * sol, const double eps, const char * desc) { int s = 0; const size_t N = A->size2; size_t i; gsl_matrix * AB = gsl_matrix_alloc(N, 2*p + q + 1); gsl_vector_uint * piv = gsl_vector_uint_alloc(N); gsl_matrix * L = gsl_matrix_alloc(N, N); gsl_matrix * U = gsl_matrix_alloc(N, N); gsl_vector * x = gsl_vector_alloc(N); /* convert A to packed banded format */ gen2band_matrix(p, q, A, AB); s += gsl_linalg_LU_band_decomp(N, p, q, AB, piv); s += gsl_linalg_LU_band_solve(p, q, AB, piv, 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_matrix_free(AB); gsl_vector_uint_free(piv); gsl_matrix_free(L); gsl_matrix_free(U); gsl_vector_free(x); return s; } static int test_LU_band_solve(gsl_rng * r) { int s = 0; const size_t N_max = 20; gsl_matrix * A = gsl_matrix_alloc(N_max, N_max); gsl_vector * b = gsl_vector_alloc(N_max); gsl_vector * x = gsl_vector_alloc(N_max); size_t N, p, q; for (N = 1; N <= N_max; ++N) { gsl_matrix_view m = gsl_matrix_submatrix(A, 0, 0, N, N); gsl_vector_view sol = gsl_vector_subvector(x, 0, N); gsl_vector_view rhs = gsl_vector_subvector(b, 0, N); for (p = 0; p < GSL_MIN(N, 10); ++p) { for (q = 0; q < GSL_MIN(N, 10); ++q) { create_band_matrix(p, q, &m.matrix, r); create_random_vector(&sol.vector, r); gsl_blas_dgemv(CblasNoTrans, 1.0, &m.matrix, &sol.vector, 0.0, &rhs.vector); s += test_LU_band_solve_eps(p, q, &m.matrix, &rhs.vector, &sol.vector, 1.0e8 * N * GSL_DBL_EPSILON, "LU_band_solve random"); } } } gsl_matrix_free(A); gsl_vector_free(b); gsl_vector_free(x); return s; } gsl-2.7.1/linalg/test_luc.c0000644016036000116100000002111614151556700012467 00000000000000/* linalg/test_luc.c * * Copyright (C) 2019 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 test_LUc_decomp_eps(const gsl_matrix_complex * m, const double eps, const char * desc) { int s = 0; const size_t M = m->size1; const size_t N = m->size2; gsl_matrix_complex * A = gsl_matrix_complex_alloc(M, N); gsl_matrix_complex * PLU = gsl_matrix_complex_calloc(M, N); gsl_permutation * p = gsl_permutation_alloc(M); size_t i, j; int signum; gsl_matrix_complex_memcpy(A, m); gsl_linalg_complex_LU_decomp(A, p, &signum); if (M >= N) { gsl_matrix_complex_view U = gsl_matrix_complex_submatrix(A, 0, 0, N, N); /* copy L factor into PLU */ for (j = 0; j < GSL_MIN(M, N); ++j) { gsl_vector_complex_view v1 = gsl_matrix_complex_subcolumn(A, j, j, M - j); gsl_vector_complex_view v2 = gsl_matrix_complex_subcolumn(PLU, j, j, M - j); gsl_vector_complex_memcpy(&v2.vector, &v1.vector); gsl_matrix_complex_set(PLU, j, j, GSL_COMPLEX_ONE); } /* PLU := L * U */ gsl_blas_ztrmm(CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, GSL_COMPLEX_ONE, &U.matrix, PLU); } else { gsl_matrix_complex_view L = gsl_matrix_complex_submatrix(A, 0, 0, M, M); /* copy U factor into PLU */ for (i = 0; i < GSL_MIN(M, N); ++i) { gsl_vector_complex_view v1 = gsl_matrix_complex_subrow(A, i, i, N - i); gsl_vector_complex_view v2 = gsl_matrix_complex_subrow(PLU, i, i, N - i); gsl_vector_complex_memcpy(&v2.vector, &v1.vector); } /* PLU := L * U */ gsl_blas_ztrmm(CblasLeft, CblasLower, CblasNoTrans, CblasUnit, GSL_COMPLEX_ONE, &L.matrix, PLU); } /* PLU := P * L * U */ for (j = 0; j < N; ++j) { gsl_vector_complex_view v = gsl_matrix_complex_column(PLU, j); gsl_permute_vector_complex_inverse(p, &v.vector); } /* now test m = PLU */ for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { gsl_complex aij = gsl_matrix_complex_get(PLU, i, j); gsl_complex mij = gsl_matrix_complex_get(m, i, j); gsl_test_rel(GSL_REAL(aij), GSL_REAL(mij), eps, "%s real: (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, M, N, i, j, GSL_REAL(aij), GSL_REAL(mij)); gsl_test_rel(GSL_IMAG(aij), GSL_IMAG(mij), eps, "%s imag: (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, M, N, i, j, GSL_IMAG(aij), GSL_IMAG(mij)); } } gsl_matrix_complex_free(A); gsl_matrix_complex_free(PLU); gsl_permutation_free(p); return s; } static int test_LUc_decomp(gsl_rng * r) { int s = 0; size_t n; /* test square matrices */ for (n = 1; n <= 50; ++n) { gsl_matrix_complex * m = gsl_matrix_complex_alloc(n, n); create_random_complex_matrix(m, r); test_LUc_decomp_eps(m, 1.0e4 * n * GSL_DBL_EPSILON, "complex_LU_decomp random"); gsl_matrix_complex_free(m); } { gsl_matrix_complex * m = gsl_matrix_complex_alloc(100, 50); create_random_complex_matrix(m, r); test_LUc_decomp_eps(m, 256.0 * n * GSL_DBL_EPSILON, "complex_LU_decomp rect1"); gsl_matrix_complex_free(m); } { gsl_matrix_complex * m = gsl_matrix_complex_alloc(50, 100); create_random_complex_matrix(m, r); test_LUc_decomp_eps(m, 1.0e3 * n * GSL_DBL_EPSILON, "complex_LU_decomp rect2"); gsl_matrix_complex_free(m); } { gsl_matrix_complex * m = gsl_matrix_complex_alloc(80, 100); create_random_complex_matrix(m, r); test_LUc_decomp_eps(m, 1.0e3 * n * GSL_DBL_EPSILON, "complex_LU_decomp rect3"); gsl_matrix_complex_free(m); } return s; } static int test_LUc_solve_eps(const gsl_matrix_complex * m, const gsl_vector_complex * rhs, const gsl_vector_complex * sol, const double eps, const char * desc) { int s = 0; const size_t N = m->size1; int signum; size_t i; gsl_permutation * perm = gsl_permutation_alloc(N); gsl_matrix_complex * lu = gsl_matrix_complex_alloc(N, N); gsl_vector_complex * x = gsl_vector_complex_alloc(N); gsl_vector_complex * residual = gsl_vector_complex_alloc(N); gsl_matrix_complex_memcpy(lu, m); s += gsl_linalg_complex_LU_decomp(lu, perm, &signum); s += gsl_linalg_complex_LU_solve(lu, perm, rhs, x); for (i = 0; i < N; i++) { gsl_complex xi = gsl_vector_complex_get(x, i); gsl_complex yi = gsl_vector_complex_get(sol, i); gsl_test_rel(GSL_REAL(xi), GSL_REAL(yi), eps, "%s: real %3lu[%lu]: %22.18g %22.18g\n", desc, N, i, GSL_REAL(xi), GSL_REAL(yi)); gsl_test_rel(GSL_IMAG(xi), GSL_IMAG(yi), eps, "%s: imag %3lu[%lu]: %22.18g %22.18g\n", desc, N, i, GSL_IMAG(xi), GSL_IMAG(yi)); } s += gsl_linalg_complex_LU_refine(m, lu, perm, rhs, x, residual); for (i = 0; i < N; i++) { gsl_complex xi = gsl_vector_complex_get(x, i); gsl_complex yi = gsl_vector_complex_get(sol, i); gsl_test_rel(GSL_REAL(xi), GSL_REAL(yi), eps, "%s: improved real %3lu[%lu]: %22.18g %22.18g\n", desc, N, i, GSL_REAL(xi), GSL_REAL(yi)); gsl_test_rel(GSL_IMAG(xi), GSL_IMAG(yi), eps, "%s: improved imag %3lu[%lu]: %22.18g %22.18g\n", desc, N, i, GSL_IMAG(xi), GSL_IMAG(yi)); } gsl_vector_complex_free(residual); gsl_vector_complex_free(x); gsl_matrix_complex_free(lu); gsl_permutation_free(perm); return s; } static int test_LUc_solve(gsl_rng * r) { int s = 0; size_t n; for (n = 1; n <= 50; ++n) { gsl_matrix_complex * m = gsl_matrix_complex_alloc(n, n); gsl_vector_complex * rhs = gsl_vector_complex_alloc(n); gsl_vector_complex * sol = gsl_vector_complex_alloc(n); create_random_complex_matrix(m, r); create_random_complex_vector(sol, r); gsl_blas_zgemv(CblasNoTrans, GSL_COMPLEX_ONE, m, sol, GSL_COMPLEX_ZERO, rhs); test_LUc_solve_eps(m, rhs, sol, 1.0e5 * n * GSL_DBL_EPSILON, "complex_LU_solve random"); gsl_matrix_complex_free(m); gsl_vector_complex_free(rhs); gsl_vector_complex_free(sol); } return s; } int test_LUc_invert_eps(const gsl_matrix_complex * m, const double eps, const char *desc) { int s = 0; size_t i, j, N = m->size1; gsl_matrix_complex * lu = gsl_matrix_complex_alloc(N, N); gsl_matrix_complex * c = gsl_matrix_complex_alloc(N, N); gsl_permutation * perm = gsl_permutation_alloc(N); int signum; gsl_matrix_complex_memcpy(lu, m); s += gsl_linalg_complex_LU_decomp(lu, perm, &signum); s += gsl_linalg_complex_LU_invx(lu, perm); /* c = m m^{-1} */ gsl_blas_zgemm(CblasNoTrans, CblasNoTrans, GSL_COMPLEX_ONE, m, lu, GSL_COMPLEX_ZERO, c); /* c should be the identity matrix */ for (i = 0; i < N; ++i) { for (j = 0; j < N; ++j) { gsl_complex cij = gsl_matrix_complex_get(c, i, j); double expected = (i == j) ? 1.0 : 0.0; gsl_test_rel(GSL_REAL(cij), expected, eps, "%s real (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, N, i, j, GSL_REAL(cij), expected); gsl_test_rel(GSL_IMAG(cij), 0.0, eps, "%s imag (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, N, i, j, GSL_IMAG(cij), 0.0); } } gsl_matrix_complex_free(lu); gsl_matrix_complex_free(c); gsl_permutation_free(perm); return s; } static int test_LUc_invert(gsl_rng * r) { int s = 0; size_t n; for (n = 1; n <= 50; ++n) { gsl_matrix_complex * m = gsl_matrix_complex_alloc(n, n); create_random_complex_matrix(m, r); test_LUc_invert_eps(m, 1.0e5 * n * GSL_DBL_EPSILON, "complex_LU_invert random"); gsl_matrix_complex_free(m); } return s; } gsl-2.7.1/linalg/test_lq.c0000644016036000116100000005531313373111455012325 00000000000000/* linalg/test_lq.c * * Copyright (C) 2018 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 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_T_dim(const gsl_matrix * m, const double * actual, double eps); int test_LQ_lssolve_T(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_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_vector * rhs = gsl_vector_alloc(M); gsl_matrix * lq = 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); for (i = 0; i < M; i++) gsl_vector_set(rhs, i, i + 1.0); gsl_matrix_memcpy(lq, m); gsl_linalg_LQ_decomp(lq, tau); gsl_linalg_LQ_lssolve(lq, tau, 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(lq); gsl_vector_free(rhs); return s; } int test_LQ_lssolve_T(void) { int f; int s = 0; f = test_LQ_lssolve_T_dim(m53, m53_lssolution, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_lssolve_T m(5,3)"); s += f; f = test_LQ_lssolve_T_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_lssolve_T hilbert(2)"); s += f; f = test_LQ_lssolve_T_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_lssolve_T hilbert(3)"); s += f; f = test_LQ_lssolve_T_dim(hilb4, hilb4_solution, 4 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_lssolve_T hilbert(4)"); s += f; f = test_LQ_lssolve_T_dim(hilb12, hilb12_solution, 0.5); gsl_test(f, " LQ_lssolve_T hilbert(12)"); s += f; f = test_LQ_lssolve_T_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_lssolve_T vander(2)"); s += f; f = test_LQ_lssolve_T_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_lssolve_T vander(3)"); s += f; f = test_LQ_lssolve_T_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_lssolve_T vander(4)"); s += f; f = test_LQ_lssolve_T_dim(vander12, vander12_solution, 0.05); gsl_test(f, " LQ_lssolve_T vander(12)"); s += f; return s; } int test_LQ_lssolve(void) { int f; int s = 0; f = test_LQ_lssolve_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_lssolve hilbert(2)"); s += f; f = test_LQ_lssolve_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_lssolve hilbert(3)"); s += f; f = test_LQ_lssolve_dim(hilb4, hilb4_solution, 4 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_lssolve hilbert(4)"); s += f; f = test_LQ_lssolve_dim(hilb12, hilb12_solution, 0.5); gsl_test(f, " LQ_lssolve hilbert(12)"); s += f; f = test_LQ_lssolve_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_lssolve vander(2)"); s += f; f = test_LQ_lssolve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_lssolve vander(3)"); s += f; f = test_LQ_lssolve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_lssolve vander(4)"); s += f; f = test_LQ_lssolve_dim(vander12, vander12_solution, 0.05); gsl_test(f, " LQ_lssolve vander(12)"); s += f; return s; } int test_LQ_decomp_dim(const gsl_matrix * m, double eps) { int s = 0; unsigned long i,j, M = m->size1, N = m->size2; gsl_matrix * lq = gsl_matrix_alloc(M,N); gsl_matrix * a = gsl_matrix_alloc(M,N); gsl_matrix * q = gsl_matrix_alloc(N,N); gsl_matrix * l = gsl_matrix_alloc(M,N); gsl_vector * d = gsl_vector_alloc(GSL_MIN(M,N)); gsl_matrix_memcpy(lq,m); s += gsl_linalg_LQ_decomp(lq, d); s += gsl_linalg_LQ_unpack(lq, d, q, l); /* compute a = q r */ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, l, q, 0.0, a); for(i=0; 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; i #include #include #include #include #include #include #include #include #include static int test_QL_decomp_eps(const gsl_matrix * m, const double eps, const char * desc) { int s = 0; const size_t M = m->size1; const size_t N = m->size2; size_t i, j; gsl_matrix * QL = gsl_matrix_alloc(M, N); gsl_vector * tau = gsl_vector_alloc(N); gsl_matrix * A = gsl_matrix_alloc(M, N); gsl_matrix * L = gsl_matrix_alloc(M, N); gsl_matrix * Q = gsl_matrix_alloc(M, M); gsl_matrix_memcpy(QL, m); s += gsl_linalg_QL_decomp(QL, tau); s += gsl_linalg_QL_unpack(QL, tau, Q, L); /* compute A = Q L */ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, Q, L, 0.0, A); for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { double aij = gsl_matrix_get(A, i, j); double mij = gsl_matrix_get(m, i, j); gsl_test_rel(aij, mij, eps, "%s (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, M, N, i,j, aij, mij); } } gsl_matrix_free(QL); gsl_vector_free(tau); gsl_matrix_free(A); gsl_matrix_free(Q); gsl_matrix_free(L); return s; } static int test_QL_decomp(gsl_rng * r) { int s = 0; size_t M, N; for (M = 1; M <= 30; ++M) { for (N = 1; N <= M; ++N) { gsl_matrix * A = gsl_matrix_alloc(M, N); create_random_matrix(A, r); s += test_QL_decomp_eps(A, 1.0e5 * GSL_MAX(M, N) * GSL_DBL_EPSILON, "QL_decomp random"); gsl_matrix_free(A); } } s += test_QL_decomp_eps(m53, 1.0e2 * GSL_DBL_EPSILON, "QL_decomp m(5,3)"); s += test_QL_decomp_eps(hilb2, 1.0e2 * GSL_DBL_EPSILON, "QL_decomp hilbert(2)"); s += test_QL_decomp_eps(hilb3, 1.0e2 * GSL_DBL_EPSILON, "QL_decomp hilbert(3)"); s += test_QL_decomp_eps(hilb4, 1.0e2 * GSL_DBL_EPSILON, "QL_decomp hilbert(4)"); s += test_QL_decomp_eps(hilb12, 1.0e2 * GSL_DBL_EPSILON, "QL_decomp hilbert(12)"); s += test_QL_decomp_eps(vander2, 1.0e1 * GSL_DBL_EPSILON, "QL_decomp vander(2)"); s += test_QL_decomp_eps(vander3, 1.0e1 * GSL_DBL_EPSILON, "QL_decomp vander(3)"); s += test_QL_decomp_eps(vander4, 1.0e2 * GSL_DBL_EPSILON, "QL_decomp vander(4)"); return s; } gsl-2.7.1/linalg/test_qr.c0000644016036000116100000007402314151556700012333 00000000000000/* linalg/test_qr.c * * Copyright (C) 2019-2020 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 test_QR_decomp_dim(const gsl_matrix * m, double eps) { int s = 0; const size_t M = m->size1; const size_t N = m->size2; size_t i, j; 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(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; const size_t N = m->size2; size_t i, j; gsl_matrix * QR = gsl_matrix_alloc(M, N); gsl_matrix * T = gsl_matrix_alloc(N, N); gsl_matrix * A = gsl_matrix_alloc(M, N); gsl_matrix * R = gsl_matrix_alloc(N, N); gsl_matrix * Q = gsl_matrix_alloc(M, M); gsl_matrix_view Q1 = gsl_matrix_submatrix(Q, 0, 0, M, N); gsl_matrix_memcpy(QR, m); s += gsl_linalg_QR_decomp_r(QR, T); s += gsl_linalg_QR_unpack_r(QR, T, Q, R); /* compute A = Q R */ gsl_matrix_memcpy(A, &Q1.matrix); gsl_blas_dtrmm (CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, 1.0, R, A); for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { double aij = gsl_matrix_get(A, i, j); double mij = gsl_matrix_get(m, i, j); gsl_test_rel(aij, mij, eps, "%s (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, M, N, i,j, aij, mij); } } if (M > N) { gsl_matrix * R_alt = gsl_matrix_alloc(M, N); gsl_matrix * Q_alt = gsl_matrix_alloc(M, M); gsl_vector_view tau = gsl_matrix_diagonal(T); /* test that Q2 was computed correctly by comparing with Level 2 algorithm */ gsl_linalg_QR_unpack(QR, &tau.vector, Q_alt, R_alt); for (i = 0; i < M; i++) { for (j = 0; j < M; j++) { double aij = gsl_matrix_get(Q, i, j); double bij = gsl_matrix_get(Q_alt, i, j); gsl_test_rel(aij, bij, eps, "%s Q (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, M, N, i, j, aij, bij); } } gsl_matrix_free(R_alt); gsl_matrix_free(Q_alt); } gsl_matrix_free(QR); gsl_matrix_free(T); gsl_matrix_free(A); gsl_matrix_free(Q); gsl_matrix_free(R); return s; } static int test_QR_decomp_r(gsl_rng * r) { int s = 0; size_t M, N; for (M = 1; M <= 50; ++M) { for (N = 1; N <= M; ++N) { gsl_matrix * A = gsl_matrix_alloc(M, N); create_random_matrix(A, r); s += test_QR_decomp_r_eps(A, 1.0e6 * M * GSL_DBL_EPSILON, "QR_decomp_r random"); gsl_matrix_free(A); } } s += test_QR_decomp_r_eps(m53, 1.0e2 * GSL_DBL_EPSILON, "QR_decomp_r m(5,3)"); s += test_QR_decomp_r_eps(hilb2, 1.0e2 * GSL_DBL_EPSILON, "QR_decomp_r hilbert(2)"); s += test_QR_decomp_r_eps(hilb3, 1.0e2 * GSL_DBL_EPSILON, "QR_decomp_r hilbert(3)"); s += test_QR_decomp_r_eps(hilb4, 1.0e2 * GSL_DBL_EPSILON, "QR_decomp_r hilbert(4)"); s += test_QR_decomp_r_eps(hilb12, 1.0e2 * GSL_DBL_EPSILON, "QR_decomp_r hilbert(12)"); s += test_QR_decomp_r_eps(vander2, 1.0e1 * GSL_DBL_EPSILON, "QR_decomp_r vander(2)"); s += test_QR_decomp_r_eps(vander3, 1.0e1 * GSL_DBL_EPSILON, "QR_decomp_r vander(3)"); s += test_QR_decomp_r_eps(vander4, 1.0e1 * GSL_DBL_EPSILON, "QR_decomp_r vander(4)"); return s; } static int test_QR_QTmat_r_eps(const gsl_matrix * A, const gsl_matrix * B, const double eps, const char * desc) { int s = 0; const size_t M = A->size1; const size_t N = A->size2; const size_t K = B->size2; size_t i, j; gsl_matrix * QR = gsl_matrix_alloc(M, N); gsl_matrix * T = gsl_matrix_alloc(N, N); gsl_matrix * work = gsl_matrix_alloc(N, K); gsl_matrix * B1 = gsl_matrix_alloc(M, K); gsl_matrix * B2 = gsl_matrix_alloc(M, K); gsl_vector_view tau = gsl_matrix_diagonal(T); gsl_matrix_memcpy(QR, A); gsl_matrix_memcpy(B1, B); gsl_matrix_memcpy(B2, B); s += gsl_linalg_QR_decomp_r(QR, T); /* compute Q^T B with both recursive and non-recursive methods and compare */ s += gsl_linalg_QR_QTmat_r(QR, T, B1, work); s += gsl_linalg_QR_QTmat(QR, &tau.vector, B2); for (i = 0; i < M; i++) { for (j = 0; j < K; j++) { double aij = gsl_matrix_get(B1, i, j); double bij = gsl_matrix_get(B2, i, j); gsl_test_rel(aij, bij, eps, "%s (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, M, K, i,j, aij, bij); } } gsl_matrix_free(QR); gsl_matrix_free(T); gsl_matrix_free(B1); gsl_matrix_free(B2); gsl_matrix_free(work); return s; } static int test_QR_QTmat_r(gsl_rng * r) { int s = 0; size_t M, N; for (M = 1; M <= 50; ++M) { for (N = 1; N <= M; ++N) { const size_t K = GSL_MAX(N / 2, 1); gsl_matrix * A = gsl_matrix_alloc(M, N); gsl_matrix * B = gsl_matrix_alloc(M, K); create_random_matrix(A, r); create_random_matrix(B, r); s += test_QR_QTmat_r_eps(A, B, 1.0e6 * M * GSL_DBL_EPSILON, "QR_QTmat_r random"); gsl_matrix_free(A); gsl_matrix_free(B); } } return s; } static int test_QR_solve_r_eps(const gsl_matrix * A, const gsl_vector * rhs, const gsl_vector * sol, const double eps, const char * desc) { int s = 0; const size_t M = A->size1; const size_t N = A->size2; size_t i; gsl_matrix * QR = gsl_matrix_alloc(M, N); gsl_matrix * T = gsl_matrix_alloc(N, N); gsl_vector * x = gsl_vector_alloc(N); gsl_matrix_memcpy(QR, A); s += gsl_linalg_QR_decomp_r(QR, T); s += gsl_linalg_QR_solve_r(QR, T, rhs, x); for (i = 0; i < M; 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_matrix_free(QR); gsl_matrix_free(T); gsl_vector_free(x); return s; } static int test_QR_solve_r(gsl_rng * r) { int s = 0; size_t N; for (N = 1; N <= 50; ++N) { gsl_matrix * A = gsl_matrix_alloc(N, N); gsl_vector * sol = gsl_vector_alloc(N); gsl_vector * rhs = gsl_vector_alloc(N); create_random_matrix(A, r); create_random_vector(sol, r); gsl_blas_dgemv(CblasNoTrans, 1.0, A, sol, 0.0, rhs); s += test_QR_solve_r_eps(A, rhs, sol, 1.0e5 * N * GSL_DBL_EPSILON, "QR_solve_r random"); gsl_matrix_free(A); gsl_vector_free(sol); gsl_vector_free(rhs); } return s; } static int test_QR_lssolve_r_eps(const gsl_matrix * A, const gsl_vector * b, const double eps, const char * desc) { int s = 0; const size_t M = A->size1; const size_t N = A->size2; size_t i; gsl_matrix * QR = gsl_matrix_alloc(M, N); gsl_matrix * T = gsl_matrix_alloc(N, N); gsl_vector * x = gsl_vector_alloc(M); gsl_vector * work = gsl_vector_alloc(N); gsl_matrix * U = gsl_matrix_alloc(M, N); gsl_matrix * V = gsl_matrix_alloc(N, N); gsl_vector * S = gsl_vector_alloc(N); gsl_vector * x_svd = gsl_vector_alloc(N); gsl_vector * residual = gsl_vector_alloc(M); gsl_matrix_memcpy(QR, A); s += gsl_linalg_QR_decomp_r(QR, T); s += gsl_linalg_QR_lssolve_r(QR, T, b, x, work); gsl_matrix_memcpy(U, A); gsl_linalg_SV_decomp(U, V, S, work); gsl_linalg_SV_solve(U, V, S, b, x_svd); /* compare QR with SVD solution */ for (i = 0; i < N; i++) { double xi = gsl_vector_get(x, i); double yi = gsl_vector_get(x_svd, i); gsl_test_rel(xi, yi, eps, "%s (%3lu,%3lu)[%lu]: %22.18g %22.18g\n", desc, M, N, i, xi, yi); } if (M > N) { gsl_vector_view x1 = gsl_vector_subvector(x, 0, N); gsl_vector_view x2 = gsl_vector_subvector(x, N, M - N); double norm = gsl_blas_dnrm2(&x2.vector); double norm_expected; /* compute residual and check || x(N+1:end) || = || b - A x || */ gsl_vector_memcpy(residual, b); gsl_blas_dgemv(CblasNoTrans, -1.0, A, &x1.vector, 1.0, residual); norm_expected = gsl_blas_dnrm2(residual); gsl_test_rel(norm, norm_expected, eps, "%s rnorm (%3lu,%3lu): %22.18g %22.18g\n", desc, M, N, norm, norm_expected); } gsl_matrix_free(QR); gsl_matrix_free(T); gsl_vector_free(x); gsl_matrix_free(U); gsl_matrix_free(V); gsl_vector_free(x_svd); gsl_vector_free(work); gsl_vector_free(S); gsl_vector_free(residual); return s; } static int test_QR_lssolve_r(gsl_rng * r) { int s = 0; size_t M, N; for (M = 1; M <= 30; ++M) { for (N = 1; N <= M; ++N) { gsl_matrix * A = gsl_matrix_alloc(M, N); gsl_vector * b = gsl_vector_alloc(M); create_random_matrix(A, r); create_random_vector(b, r); s += test_QR_lssolve_r_eps(A, b, 1.0e5 * M * GSL_DBL_EPSILON, "QR_lssolve_r random"); gsl_matrix_free(A); gsl_vector_free(b); } } return s; } static int test_QR_UR_decomp_eps(const gsl_matrix * S, const gsl_matrix * A, const double eps, const char * desc) { int s = 0; const size_t M = A->size1; const size_t N = A->size2; size_t i, j; gsl_matrix * R = gsl_matrix_calloc(N, N); gsl_matrix * V = gsl_matrix_alloc(M, N); gsl_matrix * T = gsl_matrix_alloc(N, N); gsl_matrix * B1 = gsl_matrix_calloc(N, N); gsl_matrix * B2 = gsl_matrix_alloc(M, N); gsl_matrix_tricpy(CblasUpper, CblasNonUnit, R, S); gsl_matrix_memcpy(V, A); s += gsl_linalg_QR_UR_decomp(R, V, T); /* * compute B = Q R = [ R - T R ] * [ -V~ T R ] */ gsl_matrix_tricpy(CblasUpper, CblasNonUnit, B1, T); gsl_matrix_memcpy(B2, V); gsl_blas_dtrmm (CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, 1.0, R, B1); /* B1 = T R */ gsl_blas_dtrmm (CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, -1.0, B1, B2); /* B2 = -V~ T R */ gsl_matrix_sub (B1, R); /* B1 = T R - R */ gsl_matrix_scale (B1, -1.0); /* B1 = R - T R */ /* test S = B1 */ for (i = 0; i < N; i++) { for (j = i; j < N; j++) { double aij = gsl_matrix_get(B1, i, j); double mij = gsl_matrix_get(S, i, j); gsl_test_rel(aij, mij, eps, "%s B1 (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, M, N, i,j, aij, mij); } } /* test A = B2 */ for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { double aij = gsl_matrix_get(B2, i, j); double mij = gsl_matrix_get(A, i, j); gsl_test_rel(aij, mij, eps, "%s B2 (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, M, N, i,j, aij, mij); } } gsl_matrix_free(R); gsl_matrix_free(V); gsl_matrix_free(T); gsl_matrix_free(B1); gsl_matrix_free(B2); return s; } static int test_QR_UR_decomp(gsl_rng * r) { int s = 0; size_t M, N; for (M = 1; M <= 50; ++M) { for (N = 1; N <= M; ++N) { gsl_matrix * S = gsl_matrix_alloc(N, N); gsl_matrix * A = gsl_matrix_alloc(M, N); create_random_matrix(A, r); create_random_matrix(S, r); s += test_QR_UR_decomp_eps(S, A, 1.0e6 * M * GSL_DBL_EPSILON, "QR_UR_decomp random"); gsl_matrix_free(S); gsl_matrix_free(A); } } return s; } static int test_QR_UZ_decomp_eps(const gsl_matrix * S, const gsl_matrix * A, const double eps, const char * desc) { int s = 0; const size_t M = A->size1; const size_t N = A->size2; size_t i, j; gsl_matrix * R = gsl_matrix_calloc(N, N); gsl_matrix * V = gsl_matrix_alloc(M, N); gsl_matrix * T = gsl_matrix_alloc(N, N); gsl_matrix * B1 = gsl_matrix_calloc(N, N); gsl_matrix * B2 = gsl_matrix_alloc(M, N); gsl_matrix_tricpy(CblasUpper, CblasNonUnit, R, S); gsl_matrix_memcpy(V, A); s += gsl_linalg_QR_UZ_decomp(R, V, T); /* * compute B = Q R = [ R - T R ] * [ -V~ T R ] */ gsl_matrix_tricpy(CblasUpper, CblasNonUnit, B1, T); gsl_blas_dtrmm (CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, 1.0, R, B1); /* B1 = T R */ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, -1.0, V, B1, 0.0, B2); /* B2 = -V~ T R */ gsl_matrix_sub (B1, R); /* B1 = T R - R */ gsl_matrix_scale (B1, -1.0); /* B1 = R - T R */ /* test S = B1 */ for (i = 0; i < N; i++) { for (j = i; j < N; j++) { double aij = gsl_matrix_get(B1, i, j); double mij = gsl_matrix_get(S, i, j); gsl_test_rel(aij, mij, eps, "%s B1 (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, M, N, i,j, aij, mij); } } /* test A = B2 */ for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { double aij = gsl_matrix_get(B2, i, j); double mij = gsl_matrix_get(A, i, j); gsl_test_rel(aij, mij, eps, "%s B2 (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, M, N, i,j, aij, mij); } } gsl_matrix_free(R); gsl_matrix_free(V); gsl_matrix_free(T); gsl_matrix_free(B1); gsl_matrix_free(B2); return s; } static int test_QR_UZ_decomp(gsl_rng * r) { int s = 0; const size_t N_max = 20; const size_t M_max = 2*N_max; gsl_matrix * U1 = gsl_matrix_alloc(N_max, N_max); gsl_matrix * U2 = gsl_matrix_alloc(N_max, N_max); gsl_matrix * A = gsl_matrix_alloc(M_max, N_max); size_t M, N; for (N = 1; N <= N_max; ++N) { gsl_matrix_view S = gsl_matrix_submatrix(U1, 0, 0, N, N); gsl_matrix_view T = gsl_matrix_submatrix(U2, 0, 0, N, N); for (M = N; M <= 2*N_max; ++M) { gsl_matrix_view B = gsl_matrix_submatrix(A, 0, 0, M, N); gsl_matrix_view Bu = gsl_matrix_submatrix(&B.matrix, M - N, 0, N, N); gsl_matrix_set_zero(&B.matrix); if (M > N) { gsl_matrix_view Bd = gsl_matrix_submatrix(&B.matrix, 0, 0, M - N, N); create_random_matrix(&Bd.matrix, r); } create_random_matrix(&S.matrix, r); create_random_matrix(&T.matrix, r); gsl_matrix_tricpy(CblasUpper, CblasNonUnit, &Bu.matrix, &T.matrix); s += test_QR_UZ_decomp_eps(&S.matrix, &B.matrix, 1.0e6 * M * GSL_DBL_EPSILON, "QR_UZ_decomp random"); } } gsl_matrix_free(U1); gsl_matrix_free(U2); gsl_matrix_free(A); return s; } static int test_QR_UU_decomp_eps(const gsl_matrix * U, const gsl_matrix * S, const double eps, const char * desc) { int s = 0; const size_t N = U->size2; size_t i, j; gsl_matrix * R = gsl_matrix_calloc(N, N); gsl_matrix * V = gsl_matrix_calloc(N, N); gsl_matrix * T = gsl_matrix_alloc(N, N); gsl_matrix * B1 = gsl_matrix_calloc(N, N); gsl_matrix * B2 = gsl_matrix_calloc(N, N); gsl_matrix_tricpy(CblasUpper, CblasNonUnit, R, U); gsl_matrix_tricpy(CblasUpper, CblasNonUnit, V, S); s += gsl_linalg_QR_UU_decomp(R, V, T); /* * compute B = Q R = [ R - T R ] * [ -V~ T R ] */ gsl_matrix_tricpy(CblasUpper, CblasNonUnit, B1, T); gsl_blas_dtrmm (CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, 1.0, R, B1); /* B1 = T R */ gsl_matrix_tricpy(CblasUpper, CblasNonUnit, B2, B1); /* B2 := T R */ gsl_blas_dtrmm (CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, -1.0, V, B2); /* B2 = -V~ T R */ gsl_matrix_sub (B1, R); /* B1 = T R - R */ gsl_matrix_scale (B1, -1.0); /* B1 = R - T R */ /* test U = B1 */ for (i = 0; i < N; i++) { for (j = i; j < N; j++) { double aij = gsl_matrix_get(B1, i, j); double mij = gsl_matrix_get(U, i, j); gsl_test_rel(aij, mij, eps, "%s B1 (%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, i, j, aij, mij); } } /* test S = B2 */ for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { double aij = gsl_matrix_get(B2, i, j); double mij = gsl_matrix_get(S, i, j); gsl_test_rel(aij, mij, eps, "%s B2 (%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, i,j, aij, mij); } } gsl_matrix_free(R); gsl_matrix_free(V); gsl_matrix_free(T); gsl_matrix_free(B1); gsl_matrix_free(B2); return s; } static int test_QR_UU_decomp(gsl_rng * r) { int s = 0; const size_t N_max = 50; gsl_matrix * U = gsl_matrix_alloc(N_max, N_max); gsl_matrix * S = gsl_matrix_alloc(N_max, N_max); gsl_matrix * T = gsl_matrix_alloc(N_max, N_max); size_t N; for (N = 1; N <= N_max; ++N) { gsl_matrix_view a = gsl_matrix_submatrix(U, 0, 0, N, N); gsl_matrix_view b = gsl_matrix_submatrix(S, 0, 0, N, N); gsl_matrix_view c = gsl_matrix_submatrix(T, 0, 0, N, N); create_random_matrix(&c.matrix, r); gsl_matrix_set_zero(&a.matrix); gsl_matrix_tricpy(CblasUpper, CblasNonUnit, &a.matrix, &c.matrix); create_random_matrix(&c.matrix, r); gsl_matrix_set_zero(&b.matrix); gsl_matrix_tricpy(CblasUpper, CblasNonUnit, &b.matrix, &c.matrix); s += test_QR_UU_decomp_eps(&a.matrix, &b.matrix, 1.0e6 * N * GSL_DBL_EPSILON, "QR_UU_decomp random"); } gsl_matrix_free(U); gsl_matrix_free(S); gsl_matrix_free(T); return s; } static int test_QR_UU_lssolve_eps(const gsl_matrix * U, const gsl_matrix * S, const gsl_vector * b, const double eps, const char * desc) { int s = 0; const size_t N = U->size1; const size_t M = 2 * N; size_t i; gsl_matrix * R = gsl_matrix_calloc(N, N); gsl_matrix * Y = gsl_matrix_calloc(N, N); gsl_matrix * T = gsl_matrix_alloc(N, N); gsl_vector * x = gsl_vector_alloc(M); gsl_vector * work = gsl_vector_alloc(N); gsl_matrix * A = gsl_matrix_calloc(M, N); gsl_matrix * U_svd = gsl_matrix_alloc(M, N); gsl_matrix * V_svd = gsl_matrix_alloc(N, N); gsl_vector * S_svd = gsl_vector_alloc(N); gsl_vector * x_svd = gsl_vector_alloc(N); gsl_vector * residual = gsl_vector_alloc(M); gsl_matrix_view tmp; gsl_matrix_tricpy(CblasUpper, CblasNonUnit, R, U); gsl_matrix_tricpy(CblasUpper, CblasNonUnit, Y, S); s += gsl_linalg_QR_UU_decomp(R, Y, T); s += gsl_linalg_QR_UU_lssolve(R, Y, T, b, x, work); tmp = gsl_matrix_submatrix(A, 0, 0, N, N); gsl_matrix_tricpy(CblasUpper, CblasNonUnit, &tmp.matrix, U); tmp = gsl_matrix_submatrix(A, N, 0, N, N); gsl_matrix_tricpy(CblasUpper, CblasNonUnit, &tmp.matrix, S); gsl_matrix_memcpy(U_svd, A); gsl_linalg_SV_decomp(U_svd, V_svd, S_svd, work); gsl_linalg_SV_solve(U_svd, V_svd, S_svd, b, x_svd); /* compare QR with SVD solution */ for (i = 0; i < N; i++) { double xi = gsl_vector_get(x, i); double yi = gsl_vector_get(x_svd, i); gsl_test_rel(xi, yi, eps, "%s (%3lu,%3lu)[%lu]: %22.18g %22.18g\n", desc, M, N, i, xi, yi); } if (M > N) { gsl_vector_view x1 = gsl_vector_subvector(x, 0, N); gsl_vector_view x2 = gsl_vector_subvector(x, N, M - N); double norm = gsl_blas_dnrm2(&x2.vector); double norm_expected; /* compute residual and check || x(N+1:end) || = || b - A x || */ gsl_vector_memcpy(residual, b); gsl_blas_dgemv(CblasNoTrans, -1.0, A, &x1.vector, 1.0, residual); norm_expected = gsl_blas_dnrm2(residual); gsl_test_rel(norm, norm_expected, eps, "%s rnorm (%3lu,%3lu): %22.18g %22.18g\n", desc, M, N, norm, norm_expected); } gsl_matrix_free(A); gsl_matrix_free(R); gsl_matrix_free(Y); gsl_matrix_free(T); gsl_vector_free(x); gsl_matrix_free(U_svd); gsl_matrix_free(V_svd); gsl_vector_free(x_svd); gsl_vector_free(work); gsl_vector_free(S_svd); gsl_vector_free(residual); return s; } static int test_QR_UU_lssolve(gsl_rng * r) { int s = 0; const size_t N_max = 30; gsl_matrix * U = gsl_matrix_alloc(N_max, N_max); gsl_matrix * S = gsl_matrix_alloc(N_max, N_max); gsl_matrix * T = gsl_matrix_alloc(N_max, N_max); gsl_vector * rhs = gsl_vector_alloc(2*N_max); size_t N; for (N = 1; N <= N_max; ++N) { gsl_matrix_view a = gsl_matrix_submatrix(U, 0, 0, N, N); gsl_matrix_view b = gsl_matrix_submatrix(S, 0, 0, N, N); gsl_matrix_view c = gsl_matrix_submatrix(T, 0, 0, N, N); gsl_vector_view rhsv = gsl_vector_subvector(rhs, 0, 2*N); create_random_vector(&rhsv.vector, r); create_random_matrix(&c.matrix, r); gsl_matrix_set_zero(&a.matrix); gsl_matrix_tricpy(CblasUpper, CblasNonUnit, &a.matrix, &c.matrix); create_random_matrix(&c.matrix, r); gsl_matrix_set_zero(&b.matrix); gsl_matrix_tricpy(CblasUpper, CblasNonUnit, &b.matrix, &c.matrix); s += test_QR_UU_lssolve_eps(&a.matrix, &b.matrix, &rhsv.vector, 1.0e4 * N * GSL_DBL_EPSILON, "QR_UU_lssolve random"); } gsl_matrix_free(U); gsl_matrix_free(S); gsl_matrix_free(T); gsl_vector_free(rhs); return s; } static int test_QR_UD_decomp_eps(const gsl_matrix * U, const gsl_vector * D, const double eps, const char * desc) { int s = 0; const size_t N = U->size2; size_t i, j; gsl_matrix * R = gsl_matrix_calloc(N, N); gsl_matrix * V = gsl_matrix_calloc(N, N); gsl_matrix * T = gsl_matrix_alloc(N, N); gsl_matrix * B1 = gsl_matrix_calloc(N, N); gsl_matrix * B2 = gsl_matrix_calloc(N, N); gsl_matrix_tricpy(CblasUpper, CblasNonUnit, R, U); s += gsl_linalg_QR_UD_decomp(R, D, V, T); /* * compute B = Q R = [ R - T R ] * [ -V~ T R ] */ gsl_matrix_tricpy(CblasUpper, CblasNonUnit, B1, T); gsl_blas_dtrmm (CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, 1.0, R, B1); /* B1 = T R */ gsl_matrix_tricpy(CblasUpper, CblasNonUnit, B2, B1); /* B2 := T R */ gsl_blas_dtrmm (CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, -1.0, V, B2); /* B2 = -V~ T R */ gsl_matrix_sub (B1, R); /* B1 = T R - R */ gsl_matrix_scale (B1, -1.0); /* B1 = R - T R */ /* test U = B1 */ for (i = 0; i < N; i++) { for (j = i; j < N; j++) { double aij = gsl_matrix_get(B1, i, j); double mij = gsl_matrix_get(U, i, j); gsl_test_rel(aij, mij, eps, "%s B1 (%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, i, j, aij, mij); } } /* test S = B2 */ for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { double aij = gsl_matrix_get(B2, i, j); double mij = (i == j) ? gsl_vector_get(D, i) : 0.0; gsl_test_rel(aij, mij, eps, "%s B2 (%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, i,j, aij, mij); } } gsl_matrix_free(R); gsl_matrix_free(V); gsl_matrix_free(T); gsl_matrix_free(B1); gsl_matrix_free(B2); return s; } static int test_QR_UD_decomp(gsl_rng * r) { int s = 0; const size_t N_max = 30; gsl_matrix * U = gsl_matrix_alloc(N_max, N_max); gsl_matrix * S = gsl_matrix_alloc(N_max, N_max); gsl_vector * D = gsl_vector_alloc(N_max); size_t N; for (N = 1; N <= N_max; ++N) { gsl_matrix_view a = gsl_matrix_submatrix(U, 0, 0, N, N); gsl_matrix_view b = gsl_matrix_submatrix(S, 0, 0, N, N); gsl_vector_view diag = gsl_vector_subvector(D, 0, N); create_random_matrix(&b.matrix, r); gsl_matrix_set_zero(&a.matrix); gsl_matrix_tricpy(CblasUpper, CblasNonUnit, &a.matrix, &b.matrix); create_random_vector(&diag.vector, r); s += test_QR_UD_decomp_eps(&a.matrix, &diag.vector, 1.0e4 * N * GSL_DBL_EPSILON, "QR_UD_decomp random"); } gsl_matrix_free(U); gsl_matrix_free(S); gsl_vector_free(D); return s; } static int test_QR_UD_lssolve_eps(const gsl_matrix * U, const gsl_vector * D, const gsl_vector * b, const double eps, const char * desc) { int s = 0; const size_t N = U->size1; const size_t M = 2 * N; size_t i; gsl_matrix * R = gsl_matrix_calloc(N, N); gsl_matrix * Y = gsl_matrix_calloc(N, N); gsl_matrix * T = gsl_matrix_alloc(N, N); gsl_vector * x = gsl_vector_alloc(M); gsl_vector * work = gsl_vector_alloc(N); gsl_matrix * A = gsl_matrix_calloc(M, N); gsl_matrix * U_svd = gsl_matrix_alloc(M, N); gsl_matrix * V_svd = gsl_matrix_alloc(N, N); gsl_vector * S_svd = gsl_vector_alloc(N); gsl_vector * x_svd = gsl_vector_alloc(N); gsl_vector * residual = gsl_vector_alloc(M); gsl_matrix_view tmp; gsl_vector_view diag; gsl_matrix_tricpy(CblasUpper, CblasNonUnit, R, U); s += gsl_linalg_QR_UD_decomp(R, D, Y, T); s += gsl_linalg_QR_UD_lssolve(R, Y, T, b, x, work); tmp = gsl_matrix_submatrix(A, 0, 0, N, N); gsl_matrix_tricpy(CblasUpper, CblasNonUnit, &tmp.matrix, U); tmp = gsl_matrix_submatrix(A, N, 0, N, N); diag = gsl_matrix_diagonal(&tmp.matrix); gsl_vector_memcpy(&diag.vector, D); gsl_matrix_memcpy(U_svd, A); gsl_linalg_SV_decomp(U_svd, V_svd, S_svd, work); gsl_linalg_SV_solve(U_svd, V_svd, S_svd, b, x_svd); /* compare QR with SVD solution */ for (i = 0; i < N; i++) { double xi = gsl_vector_get(x, i); double yi = gsl_vector_get(x_svd, i); gsl_test_rel(xi, yi, eps, "%s (%3lu,%3lu)[%lu]: %22.18g %22.18g\n", desc, M, N, i, xi, yi); } if (M > N) { gsl_vector_view x1 = gsl_vector_subvector(x, 0, N); gsl_vector_view x2 = gsl_vector_subvector(x, N, M - N); double norm = gsl_blas_dnrm2(&x2.vector); double norm_expected; /* compute residual and check || x(N+1:end) || = || b - A x || */ gsl_vector_memcpy(residual, b); gsl_blas_dgemv(CblasNoTrans, -1.0, A, &x1.vector, 1.0, residual); norm_expected = gsl_blas_dnrm2(residual); gsl_test_rel(norm, norm_expected, eps, "%s rnorm (%3lu,%3lu): %22.18g %22.18g\n", desc, M, N, norm, norm_expected); } gsl_matrix_free(A); gsl_matrix_free(R); gsl_matrix_free(Y); gsl_matrix_free(T); gsl_vector_free(x); gsl_matrix_free(U_svd); gsl_matrix_free(V_svd); gsl_vector_free(x_svd); gsl_vector_free(work); gsl_vector_free(S_svd); gsl_vector_free(residual); return s; } static int test_QR_UD_lssolve(gsl_rng * r) { int s = 0; const size_t N_max = 30; gsl_matrix * U = gsl_matrix_alloc(N_max, N_max); gsl_matrix * S = gsl_matrix_alloc(N_max, N_max); gsl_vector * D = gsl_vector_alloc(N_max); gsl_vector * rhs = gsl_vector_alloc(2*N_max); size_t N; for (N = 1; N <= N_max; ++N) { gsl_matrix_view a = gsl_matrix_submatrix(U, 0, 0, N, N); gsl_matrix_view b = gsl_matrix_submatrix(S, 0, 0, N, N); gsl_vector_view rhsv = gsl_vector_subvector(rhs, 0, 2*N); gsl_vector_view diag = gsl_vector_subvector(D, 0, N); create_random_vector(&rhsv.vector, r); create_random_vector(&diag.vector, r); create_random_matrix(&b.matrix, r); gsl_matrix_set_zero(&a.matrix); gsl_matrix_tricpy(CblasUpper, CblasNonUnit, &a.matrix, &b.matrix); s += test_QR_UD_lssolve_eps(&a.matrix, &diag.vector, &rhsv.vector, 1.0e4 * N * GSL_DBL_EPSILON, "QR_UD_lssolve random"); } gsl_matrix_free(U); gsl_matrix_free(S); gsl_vector_free(D); gsl_vector_free(rhs); return s; } gsl-2.7.1/linalg/test_qr_band.c0000644016036000116100000001040313677773730013327 00000000000000/* linalg/test_qr_band.c * * Copyright (C) 2020 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 test_QR_band_decomp_eps(const size_t p, const size_t q, const gsl_matrix * A, const double eps, const char * desc) { int s = 0; const size_t M = A->size1; const size_t N = A->size2; size_t i, j; gsl_matrix * AB = gsl_matrix_alloc(N, 2*p + q + 1); gsl_vector * tau = gsl_vector_alloc(N); gsl_matrix * Q = gsl_matrix_alloc(M, M); gsl_matrix * R = gsl_matrix_alloc(M, N); gsl_matrix * B = gsl_matrix_alloc(M, N); /* convert A to packed banded format */ gen2band_matrix(p, q, A, AB); #if 0 print_octave(A, "A"); printqrb_octave(M, p, q, AB, "AB"); #endif s += gsl_linalg_QR_band_decomp_L2(M, p, q, AB, tau); s += gsl_linalg_QR_band_unpack_L2(p, q, AB, tau, Q, R); #if 0 printqrb_octave(M, p, q, AB, "QR"); printv_octave(tau, "tau"); print_octave(Q, "Q"); print_octave(R, "R"); #endif /* compute B = Q R */ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, Q, R, 0.0, B); for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { double aij = gsl_matrix_get(A, i, j); double bij = gsl_matrix_get(B, i, j); gsl_test_rel(bij, aij, eps, "%s (M=%3lu,N=%3lu)(p=%3lu,q=%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, M, N, p, q, i, j, aij, bij); } } gsl_matrix_free(AB); gsl_vector_free(tau); gsl_matrix_free(Q); gsl_matrix_free(R); gsl_matrix_free(B); return s; } static int test_QR_band_decomp(gsl_rng * r) { int s = 0; const size_t N_max = 20; size_t M, N, p, q; /*M = 7; N = 6; p = 2; q = 1;*/ for (M = 1; M <= N_max; ++M) { for (N = 1; N <= N_max; ++N) { gsl_matrix * A = gsl_matrix_alloc(M, N); for (p = 0; p < GSL_MIN(M, 10); ++p) { for (q = 0; q < GSL_MIN(N, 10); ++q) { create_band_matrix(p, q, A, r); s += test_QR_band_decomp_eps(p, q, A, 1.0e5 * GSL_MAX(M,N) * GSL_DBL_EPSILON, "QR_band_decomp random"); } } gsl_matrix_free(A); } } return s; } #if 0 static int test_QR_band_decomp(void) { int f; int s = 0; f = test_QR_decomp_dim(m35, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QR_decomp m(3,5)"); s += f; f = test_QR_decomp_dim(m53, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " QR_decomp m(5,3)"); s += f; f = test_QR_decomp_dim(hilb2, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QR_decomp hilbert(2)"); s += f; f = test_QR_decomp_dim(hilb3, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " QR_decomp hilbert(3)"); s += f; f = test_QR_decomp_dim(hilb4, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " QR_decomp hilbert(4)"); s += f; f = test_QR_decomp_dim(hilb12, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " QR_decomp hilbert(12)"); s += f; f = test_QR_decomp_dim(vander2, 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QR_decomp vander(2)"); s += f; f = test_QR_decomp_dim(vander3, 64.0 * GSL_DBL_EPSILON); gsl_test(f, " QR_decomp vander(3)"); s += f; f = test_QR_decomp_dim(vander4, 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " QR_decomp vander(4)"); s += f; f = test_QR_decomp_dim(vander12, 0.0005); /* FIXME: bad accuracy */ gsl_test(f, " QR_decomp vander(12)"); s += f; return s; } #endif gsl-2.7.1/linalg/test_qrc.c0000644016036000116100000004271714151556700012503 00000000000000/* linalg/test_qrc.c * * Copyright (C) 2020 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 test_QRc_decomp_eps(const gsl_matrix_complex * m, const double eps, const char * desc) { int s = 0; const size_t M = m->size1; const size_t N = m->size2; size_t i, j; gsl_matrix_complex * qr = gsl_matrix_complex_alloc(M, N); gsl_matrix_complex * a = gsl_matrix_complex_alloc(M, N); gsl_matrix_complex * q = gsl_matrix_complex_alloc(M, M); gsl_matrix_complex * r = gsl_matrix_complex_alloc(M, N); gsl_vector_complex * d = gsl_vector_complex_alloc(N); gsl_matrix_complex_memcpy(qr, m); s += gsl_linalg_complex_QR_decomp(qr, d); s += gsl_linalg_complex_QR_unpack(qr, d, q, r); /* compute a = q r */ gsl_blas_zgemm (CblasNoTrans, CblasNoTrans, GSL_COMPLEX_ONE, q, r, GSL_COMPLEX_ZERO, a); for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { gsl_complex aij = gsl_matrix_complex_get(a, i, j); gsl_complex mij = gsl_matrix_complex_get(m, i, j); int foo_r = check(GSL_REAL(aij), GSL_REAL(mij), eps); int foo_i = check(GSL_IMAG(aij), GSL_IMAG(mij), eps); if (foo_r || foo_i) { printf("%s (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, M, N, i, j, GSL_REAL(aij), GSL_REAL(mij)); printf("%s (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, M, N, i, j, GSL_IMAG(aij), GSL_IMAG(mij)); } s += foo_r + foo_i; } } gsl_vector_complex_free(d); gsl_matrix_complex_free(qr); gsl_matrix_complex_free(a); gsl_matrix_complex_free(q); gsl_matrix_complex_free(r); return s; } static int test_QRc_decomp(gsl_rng * r) { int s = 0; size_t N, M; /* test random matrices */ for (N = 1; N <= 20; ++N) { for (M = 1; M <= 20; ++M) { gsl_matrix_complex * A = gsl_matrix_complex_alloc(N, M); create_random_complex_matrix(A, r); test_QRc_decomp_eps(A, 1.0e6 * GSL_MAX(N, M) * GSL_DBL_EPSILON, "complex_QR_decomp random"); gsl_matrix_complex_free(A); } } return s; } static int test_QRc_solve_eps(const gsl_matrix_complex * A, const gsl_vector_complex * rhs, const gsl_vector_complex * sol, const double eps, const char * desc) { int s = 0; const size_t M = A->size1; const size_t N = A->size2; size_t i; gsl_matrix_complex * QR = gsl_matrix_complex_alloc(M, N); gsl_vector_complex * tau = gsl_vector_complex_alloc(N); gsl_vector_complex * x = gsl_vector_complex_alloc(N); gsl_matrix_complex_memcpy(QR, A); s += gsl_linalg_complex_QR_decomp(QR, tau); s += gsl_linalg_complex_QR_solve(QR, tau, rhs, x); for (i = 0; i < M; i++) { gsl_complex xi = gsl_vector_complex_get(x, i); gsl_complex yi = gsl_vector_complex_get(sol, i); gsl_test_rel(GSL_REAL(xi), GSL_REAL(yi), eps, "%s real (%3lu)[%lu]: %22.18g %22.18g\n", desc, N, i, xi, yi); gsl_test_rel(GSL_IMAG(xi), GSL_IMAG(yi), eps, "%s imag (%3lu)[%lu]: %22.18g %22.18g\n", desc, N, i, xi, yi); } gsl_matrix_complex_free(QR); gsl_vector_complex_free(tau); gsl_vector_complex_free(x); return s; } static int test_QRc_solve(gsl_rng * r) { int s = 0; size_t N; for (N = 1; N <= 50; ++N) { gsl_matrix_complex * A = gsl_matrix_complex_alloc(N, N); gsl_vector_complex * sol = gsl_vector_complex_alloc(N); gsl_vector_complex * rhs = gsl_vector_complex_alloc(N); create_random_complex_matrix(A, r); create_random_complex_vector(sol, r); gsl_blas_zgemv(CblasNoTrans, GSL_COMPLEX_ONE, A, sol, GSL_COMPLEX_ZERO, rhs); s += test_QRc_solve_eps(A, rhs, sol, 1.0e5 * N * GSL_DBL_EPSILON, "complex QR_solve_r random"); gsl_matrix_complex_free(A); gsl_vector_complex_free(sol); gsl_vector_complex_free(rhs); } return s; } static int test_QRc_lssolve_eps(const gsl_matrix_complex * A, const gsl_vector_complex * rhs, const gsl_vector_complex * sol, const double eps, const char * desc) { int s = 0; const size_t M = A->size1; const size_t N = A->size2; size_t i; gsl_matrix_complex * QR = gsl_matrix_complex_alloc(M, N); gsl_vector_complex * tau = gsl_vector_complex_alloc(N); gsl_vector_complex * x = gsl_vector_complex_alloc(N); gsl_vector_complex * r = gsl_vector_complex_alloc(M); gsl_vector_complex * r2 = gsl_vector_complex_alloc(M); gsl_matrix_complex_memcpy(QR, A); s += gsl_linalg_complex_QR_decomp(QR, tau); s += gsl_linalg_complex_QR_lssolve(QR, tau, rhs, x, r); for (i = 0; i < N; i++) { gsl_complex xi = gsl_vector_complex_get(x, i); gsl_complex yi = gsl_vector_complex_get(sol, i); gsl_test_rel(GSL_REAL(xi), GSL_REAL(yi), eps, "%s sol real (%3lu)[%lu]: %22.18g %22.18g\n", desc, N, i, GSL_REAL(xi), GSL_REAL(yi)); gsl_test_rel(GSL_IMAG(xi), GSL_IMAG(yi), eps, "%s sol imag (%3lu)[%lu]: %22.18g %22.18g\n", desc, N, i, GSL_IMAG(xi), GSL_IMAG(yi)); } /* compute residual and check */ gsl_vector_complex_memcpy(r2, rhs); gsl_blas_zgemv(CblasNoTrans, GSL_COMPLEX_NEGONE, A, sol, GSL_COMPLEX_ONE, r2); for (i = 0; i < M; i++) { gsl_complex xi = gsl_vector_complex_get(r, i); gsl_complex yi = gsl_vector_complex_get(r2, i); gsl_test_rel(GSL_REAL(xi), GSL_REAL(yi), eps, "%s res real (%3lu)[%lu]: %22.18g %22.18g\n", desc, N, i, GSL_REAL(xi), GSL_REAL(yi)); gsl_test_rel(GSL_IMAG(xi), GSL_IMAG(yi), eps, "%s res imag (%3lu)[%lu]: %22.18g %22.18g\n", desc, N, i, GSL_IMAG(xi), GSL_IMAG(yi)); } gsl_matrix_complex_free(QR); gsl_vector_complex_free(tau); gsl_vector_complex_free(x); gsl_vector_complex_free(r); gsl_vector_complex_free(r2); return s; } static int test_QRc_lssolve() { int s = 0; const double tol = 1.0e-10; { const double A_data[] = { 6.70178096995592e-01, 2.51765675689489e-01, 7.18387884271362e-01, 3.61106008613644e-01, 3.36342428526987e-02, 5.25755806084206e-01, 5.87596968507183e-01, 5.27700895952418e-01, 6.85871226549483e-01, 3.71216051930735e-01, 4.40045953339814e-01, 2.08875308141557e-01, 8.62676230425306e-01, 5.79995188556082e-01, 4.86983443637474e-02, 2.82915411954634e-01, 2.92843706013013e-01, 5.61536446182319e-01, 6.85137614758495e-02, 8.90853425372411e-01, 4.38527971314087e-01, 4.78136089625096e-01, 1.57942824868494e-01, 8.38451530279972e-01, 6.36273325487226e-01, 7.74039464290391e-02, 5.45646256301364e-01, 7.80075219450629e-01, 9.27400956530167e-01, 7.01700239834713e-02, 1.09682812589509e-01, 5.64047584357803e-01, 4.46922541620762e-02, 3.03438549353353e-01, 8.09200219159660e-01, 1.44245237525133e-01 }; const double rhs_data[] = { 5.82246876454474e-01, 1.42259458199622e-02, 6.25588177982770e-01, 3.79195077388159e-01, 8.45448918385455e-02, 3.20808711881935e-01, 8.02701461544476e-01, 5.65141425118050e-01, 8.34227120735637e-01, 4.69005326248388e-01, 9.73712086117648e-01, 3.47197650692321e-01 }; const double sol_data[] = { -2.07103028285037e-01, -3.77392587461962e-01, 7.46590544020302e-01, -1.10976592416587e-01, 6.07653916072011e-01, 2.05471935567110e-01 }; gsl_matrix_complex_const_view A = gsl_matrix_complex_const_view_array(A_data, 6, 3); gsl_vector_complex_const_view rhs = gsl_vector_complex_const_view_array(rhs_data, 6); gsl_vector_complex_const_view sol = gsl_vector_complex_const_view_array(sol_data, 3); test_QRc_lssolve_eps(&A.matrix, &rhs.vector, &sol.vector, tol, "complex QR_lssolve test1"); } return s; } static int test_QRc_decomp_r_eps(const gsl_matrix_complex * m, const double eps, const char * desc) { int s = 0; const size_t M = m->size1; const size_t N = m->size2; size_t i, j; gsl_matrix_complex * QR = gsl_matrix_complex_alloc(M, N); gsl_matrix_complex * T = gsl_matrix_complex_alloc(N, N); gsl_matrix_complex * A = gsl_matrix_complex_alloc(M, N); gsl_matrix_complex * R = gsl_matrix_complex_alloc(N, N); gsl_matrix_complex * Q = gsl_matrix_complex_alloc(M, M); gsl_matrix_complex_view Q1 = gsl_matrix_complex_submatrix(Q, 0, 0, M, N); gsl_vector_complex_const_view tau = gsl_matrix_complex_const_diagonal(T); gsl_matrix_complex_memcpy(QR, m); s += gsl_linalg_complex_QR_decomp_r(QR, T); s += gsl_linalg_complex_QR_unpack_r(QR, T, Q, R); /* compute A = Q R */ gsl_matrix_complex_memcpy(A, &Q1.matrix); gsl_blas_ztrmm (CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, GSL_COMPLEX_ONE, R, A); for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { gsl_complex aij = gsl_matrix_complex_get(A, i, j); gsl_complex mij = gsl_matrix_complex_get(m, i, j); gsl_test_rel(GSL_REAL(aij), GSL_REAL(mij), eps, "%s real (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, M, N, i,j, GSL_REAL(aij), GSL_REAL(mij)); gsl_test_rel(GSL_IMAG(aij), GSL_IMAG(mij), eps, "%s imag (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, M, N, i,j, GSL_IMAG(aij), GSL_IMAG(mij)); } } if (M > N) { gsl_matrix_complex * R_alt = gsl_matrix_complex_alloc(M, N); gsl_matrix_complex * Q_alt = gsl_matrix_complex_alloc(M, M); /* test that Q2 was computed correctly by comparing with Level 2 algorithm */ gsl_linalg_complex_QR_unpack(QR, &tau.vector, Q_alt, R_alt); for (i = 0; i < M; i++) { for (j = 0; j < M; j++) { gsl_complex aij = gsl_matrix_complex_get(Q, i, j); gsl_complex bij = gsl_matrix_complex_get(Q_alt, i, j); gsl_test_rel(GSL_REAL(aij), GSL_REAL(bij), eps, "%s real Q (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, M, N, i, j, GSL_REAL(aij), GSL_REAL(bij)); gsl_test_rel(GSL_IMAG(aij), GSL_IMAG(bij), eps, "%s imag Q (%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, M, N, i, j, GSL_IMAG(aij), GSL_IMAG(bij)); } } gsl_matrix_complex_free(R_alt); gsl_matrix_complex_free(Q_alt); } gsl_matrix_complex_free(QR); gsl_matrix_complex_free(T); gsl_matrix_complex_free(A); gsl_matrix_complex_free(Q); gsl_matrix_complex_free(R); return s; } static int test_QRc_decomp_r(gsl_rng * r) { int s = 0; size_t M, N; for (M = 1; M <= 50; ++M) { for (N = 1; N <= M; ++N) { gsl_matrix_complex * A = gsl_matrix_complex_alloc(M, N); create_random_complex_matrix(A, r); s += test_QRc_decomp_r_eps(A, 1.0e6 * M * GSL_DBL_EPSILON, "complex_QR_decomp_r random"); gsl_matrix_complex_free(A); } } return s; } static int test_QRc_solve_r_eps(const gsl_matrix_complex * A, const gsl_vector_complex * rhs, const gsl_vector_complex * sol, const double eps, const char * desc) { int s = 0; const size_t M = A->size1; const size_t N = A->size2; size_t i; gsl_matrix_complex * QR = gsl_matrix_complex_alloc(M, N); gsl_matrix_complex * T = gsl_matrix_complex_alloc(N, N); gsl_vector_complex * x = gsl_vector_complex_alloc(N); gsl_matrix_complex_memcpy(QR, A); s += gsl_linalg_complex_QR_decomp_r(QR, T); s += gsl_linalg_complex_QR_solve_r(QR, T, rhs, x); for (i = 0; i < M; i++) { gsl_complex xi = gsl_vector_complex_get(x, i); gsl_complex yi = gsl_vector_complex_get(sol, i); gsl_test_rel(GSL_REAL(xi), GSL_REAL(yi), eps, "%s real (%3lu)[%lu]: %22.18g %22.18g\n", desc, N, i, GSL_REAL(xi), GSL_REAL(yi)); gsl_test_rel(GSL_IMAG(xi), GSL_IMAG(yi), eps, "%s imag (%3lu)[%lu]: %22.18g %22.18g\n", desc, N, i, GSL_IMAG(xi), GSL_IMAG(yi)); } gsl_matrix_complex_free(QR); gsl_matrix_complex_free(T); gsl_vector_complex_free(x); return s; } static int test_QRc_solve_r(gsl_rng * r) { int s = 0; size_t N; for (N = 1; N <= 50; ++N) { gsl_matrix_complex * A = gsl_matrix_complex_alloc(N, N); gsl_vector_complex * sol = gsl_vector_complex_alloc(N); gsl_vector_complex * rhs = gsl_vector_complex_alloc(N); create_random_complex_matrix(A, r); create_random_complex_vector(sol, r); gsl_blas_zgemv(CblasNoTrans, GSL_COMPLEX_ONE, A, sol, GSL_COMPLEX_ZERO, rhs); s += test_QRc_solve_r_eps(A, rhs, sol, 1.0e6 * N * GSL_DBL_EPSILON, "complex_QR_solve_r random"); gsl_matrix_complex_free(A); gsl_vector_complex_free(sol); gsl_vector_complex_free(rhs); } return s; } static int test_QRc_lssolve_r_eps(const gsl_matrix_complex * A, const gsl_vector_complex * rhs, const gsl_vector_complex * sol, const double eps, const char * desc) { int s = 0; const size_t M = A->size1; const size_t N = A->size2; size_t i; gsl_matrix_complex * QR = gsl_matrix_complex_alloc(M, N); gsl_matrix_complex * T = gsl_matrix_complex_alloc(N, N); gsl_vector_complex * x = gsl_vector_complex_alloc(M); gsl_vector_complex * r = gsl_vector_complex_alloc(M); gsl_vector_complex * work = gsl_vector_complex_alloc(N); gsl_vector_complex_const_view x1 = gsl_vector_complex_const_subvector(x, N, M - N); double rnorm_expected, rnorm; gsl_matrix_complex_memcpy(QR, A); s += gsl_linalg_complex_QR_decomp_r(QR, T); s += gsl_linalg_complex_QR_lssolve_r(QR, T, rhs, x, work); for (i = 0; i < N; i++) { gsl_complex xi = gsl_vector_complex_get(x, i); gsl_complex yi = gsl_vector_complex_get(sol, i); gsl_test_rel(GSL_REAL(xi), GSL_REAL(yi), eps, "%s sol real (%3lu)[%lu]: %22.18g %22.18g\n", desc, N, i, GSL_REAL(xi), GSL_REAL(yi)); gsl_test_rel(GSL_IMAG(xi), GSL_IMAG(yi), eps, "%s sol imag (%3lu)[%lu]: %22.18g %22.18g\n", desc, N, i, GSL_IMAG(xi), GSL_IMAG(yi)); } /* compute residual and check */ gsl_vector_complex_memcpy(r, rhs); gsl_blas_zgemv(CblasNoTrans, GSL_COMPLEX_NEGONE, A, sol, GSL_COMPLEX_ONE, r); rnorm_expected = gsl_blas_dznrm2(r); rnorm = gsl_blas_dznrm2(&x1.vector); gsl_test_rel(rnorm, rnorm_expected, eps, "%s rnorm (%3lu): %22.18g %22.18g\n", desc, N, rnorm, rnorm_expected); gsl_matrix_complex_free(QR); gsl_matrix_complex_free(T); gsl_vector_complex_free(x); gsl_vector_complex_free(r); gsl_vector_complex_free(work); return s; } static int test_QRc_lssolve_r() { int s = 0; const double tol = 1.0e-10; { const double A_data[] = { 6.70178096995592e-01, 2.51765675689489e-01, 7.18387884271362e-01, 3.61106008613644e-01, 3.36342428526987e-02, 5.25755806084206e-01, 5.87596968507183e-01, 5.27700895952418e-01, 6.85871226549483e-01, 3.71216051930735e-01, 4.40045953339814e-01, 2.08875308141557e-01, 8.62676230425306e-01, 5.79995188556082e-01, 4.86983443637474e-02, 2.82915411954634e-01, 2.92843706013013e-01, 5.61536446182319e-01, 6.85137614758495e-02, 8.90853425372411e-01, 4.38527971314087e-01, 4.78136089625096e-01, 1.57942824868494e-01, 8.38451530279972e-01, 6.36273325487226e-01, 7.74039464290391e-02, 5.45646256301364e-01, 7.80075219450629e-01, 9.27400956530167e-01, 7.01700239834713e-02, 1.09682812589509e-01, 5.64047584357803e-01, 4.46922541620762e-02, 3.03438549353353e-01, 8.09200219159660e-01, 1.44245237525133e-01 }; const double rhs_data[] = { 5.82246876454474e-01, 1.42259458199622e-02, 6.25588177982770e-01, 3.79195077388159e-01, 8.45448918385455e-02, 3.20808711881935e-01, 8.02701461544476e-01, 5.65141425118050e-01, 8.34227120735637e-01, 4.69005326248388e-01, 9.73712086117648e-01, 3.47197650692321e-01 }; const double sol_data[] = { -2.07103028285037e-01, -3.77392587461962e-01, 7.46590544020302e-01, -1.10976592416587e-01, 6.07653916072011e-01, 2.05471935567110e-01 }; gsl_matrix_complex_const_view A = gsl_matrix_complex_const_view_array(A_data, 6, 3); gsl_vector_complex_const_view rhs = gsl_vector_complex_const_view_array(rhs_data, 6); gsl_vector_complex_const_view sol = gsl_vector_complex_const_view_array(sol_data, 3); test_QRc_lssolve_r_eps(&A.matrix, &rhs.vector, &sol.vector, tol, "complex_QR_lssolve_r test1"); } return s; } gsl-2.7.1/linalg/test_tri.c0000644016036000116100000001161013517357142012504 00000000000000/* linalg/test_tri.c * * Copyright (C) 2019 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 test_symmtd_decomp_eps(const gsl_matrix * m, const double eps, const char * desc) { int s = 0; const size_t N = m->size1; size_t i, j; gsl_matrix * Q = gsl_matrix_alloc(N, N); gsl_matrix * T = gsl_matrix_calloc(N, N); gsl_matrix * A = gsl_matrix_alloc(N, N); gsl_matrix * B = gsl_matrix_alloc(N, N); gsl_vector * tau = gsl_vector_alloc(N - 1); gsl_vector_view diag = gsl_matrix_diagonal(T); gsl_vector_view subdiag = gsl_matrix_subdiagonal(T, 1); gsl_vector_view superdiag = gsl_matrix_superdiagonal(T, 1); gsl_matrix_memcpy(A, m); s += gsl_linalg_symmtd_decomp(A, tau); s += gsl_linalg_symmtd_unpack(A, tau, Q, &diag.vector, &subdiag.vector); gsl_vector_memcpy(&superdiag.vector, &subdiag.vector); gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, Q, T, 0.0, A); /* A := Q T */ gsl_blas_dgemm(CblasNoTrans, CblasTrans, 1.0, A, Q, 0.0, B); /* B := Q T Q^T */ for (i = 0; i < N; i++) { for (j = 0; j <= i; j++) { double bij = gsl_matrix_get(B, i, j); double mij = gsl_matrix_get(m, i, j); gsl_test_rel(bij, mij, eps, "%s (%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, i, j, bij, mij); } } gsl_matrix_free(T); gsl_matrix_free(A); gsl_matrix_free(Q); gsl_matrix_free(B); gsl_vector_free(tau); return s; } static int test_symmtd_decomp(gsl_rng * r) { int s = 0; size_t N; for (N = 2; N <= 50; ++N) { gsl_matrix * A = gsl_matrix_alloc(N, N); create_symm_matrix(A, r); s += test_symmtd_decomp_eps(A, 1.0e5 * N * GSL_DBL_EPSILON, "symmtd_decomp random"); gsl_matrix_free(A); } return s; } static int test_hermtd_decomp_eps(const gsl_matrix_complex * m, const double eps, const char * desc) { int s = 0; const size_t N = m->size1; size_t i, j; gsl_matrix_complex * Q = gsl_matrix_complex_alloc(N, N); gsl_matrix_complex * T = gsl_matrix_complex_calloc(N, N); gsl_matrix_complex * A = gsl_matrix_complex_alloc(N, N); gsl_matrix_complex * B = gsl_matrix_complex_alloc(N, N); gsl_vector_complex * tau = gsl_vector_complex_alloc(N - 1); gsl_vector_view diag, subdiag, superdiag; gsl_vector_complex_view v; v = gsl_matrix_complex_diagonal(T); diag = gsl_vector_complex_real(&v.vector); v = gsl_matrix_complex_subdiagonal(T, 1); subdiag = gsl_vector_complex_real(&v.vector); v = gsl_matrix_complex_superdiagonal(T, 1); superdiag = gsl_vector_complex_real(&v.vector); gsl_matrix_complex_memcpy(A, m); s += gsl_linalg_hermtd_decomp(A, tau); s += gsl_linalg_hermtd_unpack(A, tau, Q, &diag.vector, &subdiag.vector); gsl_vector_memcpy(&superdiag.vector, &subdiag.vector); gsl_blas_zgemm(CblasNoTrans, CblasNoTrans, GSL_COMPLEX_ONE, Q, T, GSL_COMPLEX_ZERO, A); /* A := Q T */ gsl_blas_zgemm(CblasNoTrans, CblasConjTrans, GSL_COMPLEX_ONE, A, Q, GSL_COMPLEX_ZERO, B); /* B := Q T Q^T */ for (i = 0; i < N; i++) { for (j = 0; j <= i; j++) { gsl_complex bij = gsl_matrix_complex_get(B, i, j); gsl_complex mij = gsl_matrix_complex_get(m, i, j); gsl_test_rel(GSL_REAL(bij), GSL_REAL(mij), eps, "%s real (%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, i, j, GSL_REAL(bij), GSL_REAL(mij)); gsl_test_rel(GSL_IMAG(bij), GSL_IMAG(mij), eps, "%s imag (%3lu)[%lu,%lu]: %22.18g %22.18g\n", desc, N, i, j, GSL_IMAG(bij), GSL_IMAG(mij)); } } gsl_matrix_complex_free(T); gsl_matrix_complex_free(A); gsl_matrix_complex_free(Q); gsl_matrix_complex_free(B); gsl_vector_complex_free(tau); return s; } static int test_hermtd_decomp(gsl_rng * r) { int s = 0; size_t N; for (N = 2; N <= 50; ++N) { gsl_matrix_complex * A = gsl_matrix_complex_alloc(N, N); create_herm_matrix(A, r); s += test_hermtd_decomp_eps(A, 1.0e5 * N * GSL_DBL_EPSILON, "hermtd_decomp random"); gsl_matrix_complex_free(A); } return s; } gsl-2.7.1/linalg/gsl_linalg.h0000644016036000116100000010645614151556700013000 00000000000000/* linalg/gsl_linalg.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2006, 2007, 2019 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); double gsl_linalg_householder_transform2 (double * alpha, 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_left(const double tau, const gsl_vector * v, gsl_matrix * A, gsl_vector * work); int gsl_linalg_householder_right(const double tau, const gsl_vector * v, gsl_matrix * A, gsl_vector * work); 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); int gsl_linalg_complex_householder_left (const gsl_complex tau, const gsl_vector_complex * v, gsl_matrix_complex * A, gsl_vector_complex * work); /* 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); /* 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); int gsl_linalg_LU_invx (gsl_matrix * LU, const gsl_permutation * p); 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); /* Banded LU decomposition */ int gsl_linalg_LU_band_decomp (const size_t M, const size_t lb, const size_t ub, gsl_matrix * AB, gsl_vector_uint * piv); int gsl_linalg_LU_band_solve (const size_t lb, const size_t ub, const gsl_matrix * LUB, const gsl_vector_uint * piv, const gsl_vector * b, gsl_vector * x); int gsl_linalg_LU_band_svx (const size_t lb, const size_t ub, const gsl_matrix * LUB, const gsl_vector_uint * piv, gsl_vector * x); int gsl_linalg_LU_band_unpack (const size_t M, const size_t lb, const size_t ub, const gsl_matrix * LUB, const gsl_vector_uint * piv, gsl_matrix * L, gsl_matrix * U); /* 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); int gsl_linalg_complex_LU_invx (gsl_matrix_complex * LU, const gsl_permutation * p); 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_decomp_old (gsl_matrix * A, gsl_vector * tau); int gsl_linalg_QR_decomp_r (gsl_matrix * A, gsl_matrix * T); int gsl_linalg_QR_solve (const gsl_matrix * QR, const gsl_vector * tau, const gsl_vector * b, gsl_vector * x); int gsl_linalg_QR_solve_r (const gsl_matrix * QR, const gsl_matrix * T, 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_lssolve_r (const gsl_matrix * QR, const gsl_matrix * T, const gsl_vector * b, gsl_vector * x, gsl_vector * work); 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_QTvec_r(const gsl_matrix * QR, const gsl_matrix * T, gsl_vector * b, gsl_vector * work); 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_QTmat_r(const gsl_matrix * QR, const gsl_matrix * T, gsl_matrix * B, gsl_matrix * work); 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_QR_unpack_r(const gsl_matrix * QR, const gsl_matrix * T, 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); int gsl_linalg_QR_rcond(const gsl_matrix * QR, double * rcond, gsl_vector * work); /* complex QR decomposition */ int gsl_linalg_complex_QR_decomp (gsl_matrix_complex * A, gsl_vector_complex * tau); int gsl_linalg_complex_QR_decomp_r (gsl_matrix_complex * A, gsl_matrix_complex * T); int gsl_linalg_complex_QR_solve (const gsl_matrix_complex * QR, const gsl_vector_complex * tau, const gsl_vector_complex * b, gsl_vector_complex * x); int gsl_linalg_complex_QR_solve_r (const gsl_matrix_complex * QR, const gsl_matrix_complex * T, const gsl_vector_complex * b, gsl_vector_complex * x); int gsl_linalg_complex_QR_svx (const gsl_matrix_complex * QR, const gsl_vector_complex * tau, gsl_vector_complex * x); int gsl_linalg_complex_QR_lssolve (const gsl_matrix_complex * QR, const gsl_vector_complex * tau, const gsl_vector_complex * b, gsl_vector_complex * x, gsl_vector_complex * residual); int gsl_linalg_complex_QR_lssolve_r (const gsl_matrix_complex * QR, const gsl_matrix_complex * T, const gsl_vector_complex * b, gsl_vector_complex * x, gsl_vector_complex * work); int gsl_linalg_complex_QR_QHvec (const gsl_matrix_complex * QR, const gsl_vector_complex * tau, gsl_vector_complex * v); int gsl_linalg_complex_QR_QHvec_r(const gsl_matrix_complex * QR, const gsl_matrix_complex * T, gsl_vector_complex * b, gsl_vector_complex * work); int gsl_linalg_complex_QR_Qvec (const gsl_matrix_complex * QR, const gsl_vector_complex * tau, gsl_vector_complex * v); int gsl_linalg_complex_QR_unpack (const gsl_matrix_complex * QR, const gsl_vector_complex * tau, gsl_matrix_complex * Q, gsl_matrix_complex * R); int gsl_linalg_complex_QR_unpack_r(const gsl_matrix_complex * QR, const gsl_matrix_complex * T, gsl_matrix_complex * Q, gsl_matrix_complex * R); /* banded QR decomposition */ int gsl_linalg_QR_band_decomp_L2 (const size_t M, const size_t p, const size_t q, gsl_matrix * AB, gsl_vector * tau); int gsl_linalg_QR_band_unpack_L2 (const size_t p, const size_t q, const gsl_matrix * QRB, const gsl_vector * tau, gsl_matrix * Q, gsl_matrix * R); /* 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); /* triangle on top of diagonal QR decomposition */ int gsl_linalg_QR_UD_decomp (gsl_matrix * U, const gsl_vector * D, gsl_matrix * Y, gsl_matrix * T); int gsl_linalg_QR_UD_lssolve (const gsl_matrix * R, const gsl_matrix * Y, const gsl_matrix * T, const gsl_vector * b, gsl_vector * x, gsl_vector * work); /* triangle on top of rectangle QR decomposition */ int gsl_linalg_QR_UR_decomp (gsl_matrix * S, gsl_matrix * A, gsl_matrix * T); /* triangle on top of triangle QR decomposition */ int gsl_linalg_QR_UU_decomp (gsl_matrix * U, gsl_matrix * S, gsl_matrix * T); int gsl_linalg_QR_UU_lssolve (const gsl_matrix * R, const gsl_matrix * Y, const gsl_matrix * T, const gsl_vector * b, gsl_vector * x, gsl_vector * work); int gsl_linalg_QR_UU_QTvec(const gsl_matrix * Y, const gsl_matrix * T, gsl_vector * b, gsl_vector * work); /* triangle on top of trapezoidal QR decomposition */ int gsl_linalg_QR_UZ_decomp (gsl_matrix * S, gsl_matrix * A, gsl_matrix * T); /* QL decomposition */ int gsl_linalg_QL_decomp (gsl_matrix * A, gsl_vector * tau); int gsl_linalg_QL_unpack (const gsl_matrix * QL, const gsl_vector * tau, gsl_matrix * Q, gsl_matrix * L); /* 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 * QRZT, 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_lssolve2 (const double lambda, const gsl_matrix * QRZT, 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, gsl_matrix * S, gsl_vector * work); int gsl_linalg_COD_unpack(const gsl_matrix * QRZT, 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 * QRZT, 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_lssolve(const gsl_matrix * LQ, const gsl_vector * tau, const gsl_vector * b, gsl_vector * x, gsl_vector * residual); int gsl_linalg_LQ_QTvec(const gsl_matrix * LQ, const gsl_vector * tau, gsl_vector * v); 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_solve_mat (const gsl_matrix * cholesky, const gsl_matrix * B, gsl_matrix * X); int gsl_linalg_cholesky_svx (const gsl_matrix * cholesky, gsl_vector * x); int gsl_linalg_cholesky_svx_mat (const gsl_matrix * cholesky, gsl_matrix * 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); /* Banded Cholesky decomposition */ int gsl_linalg_cholesky_band_decomp(gsl_matrix * A); int gsl_linalg_cholesky_band_solve (const gsl_matrix * LLT, const gsl_vector * b, gsl_vector * x); int gsl_linalg_cholesky_band_svx (const gsl_matrix * LLT, gsl_vector * x); int gsl_linalg_cholesky_band_solvem (const gsl_matrix * LLT, const gsl_matrix * B, gsl_matrix * X); int gsl_linalg_cholesky_band_svxm (const gsl_matrix * LLT, gsl_matrix * X); int gsl_linalg_cholesky_band_invert (const gsl_matrix * LLT, gsl_matrix * Ainv); int gsl_linalg_cholesky_band_unpack (const gsl_matrix * LLT, gsl_matrix * L); int gsl_linalg_cholesky_band_scale(const gsl_matrix * A, gsl_vector * S); int gsl_linalg_cholesky_band_scale_apply(gsl_matrix * A, const gsl_vector * S); int gsl_linalg_cholesky_band_rcond (const gsl_matrix * LLT, double * rcond, gsl_vector * work); /* L D L^T decomposition */ int gsl_linalg_ldlt_decomp (gsl_matrix * A); int gsl_linalg_ldlt_solve (const gsl_matrix * LDLT, const gsl_vector * b, gsl_vector * x); int gsl_linalg_ldlt_svx (const gsl_matrix * LDLT, gsl_vector * x); int gsl_linalg_ldlt_rcond (const gsl_matrix * LDLT, double * rcond, gsl_vector * work); /* Banded L D L^T decomposition */ int gsl_linalg_ldlt_band_decomp (gsl_matrix * A); int gsl_linalg_ldlt_band_solve (const gsl_matrix * LDLT, const gsl_vector * b, gsl_vector * x); int gsl_linalg_ldlt_band_svx (const gsl_matrix * LDLT, gsl_vector * x); int gsl_linalg_ldlt_band_unpack (const gsl_matrix * LDLT, gsl_matrix * L, gsl_vector * D); int gsl_linalg_ldlt_band_rcond (const gsl_matrix * LDLT, double * rcond, gsl_vector * work); /* 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_rcond(CBLAS_UPLO_t Uplo, const gsl_matrix * A, double * rcond, gsl_vector * work); 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); int gsl_linalg_tri_invert(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t Diag, gsl_matrix * T); int gsl_linalg_complex_tri_invert(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t Diag, gsl_matrix_complex * T); int gsl_linalg_tri_LTL(gsl_matrix * L); int gsl_linalg_tri_UL(gsl_matrix * LU); int gsl_linalg_complex_tri_LHL(gsl_matrix_complex * L); int gsl_linalg_complex_tri_UL(gsl_matrix_complex * LU); 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-2.7.1/linalg/Makefile.in0000644016036000116100000012732614151557214012561 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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 \ invtri_complex.lo multiply.lo exponential.lo tridiag.lo lu.lo \ lu_band.lo luc.lo hh.lo ql.lo qr.lo qr_band.lo qrc.lo qrpt.lo \ qr_ud.lo qr_ur.lo qr_uu.lo qr_uz.lo rqr.lo rqrc.lo lq.lo \ ptlq.lo svd.lo householder.lo householdercomplex.lo \ hessenberg.lo hesstri.lo cholesky.lo choleskyc.lo mcholesky.lo \ pcholesky.lo cholesky_band.lo ldlt.lo ldlt_band.lo symmtd.lo \ hermtd.lo bidiag.lo balance.lo balancemat.lo inline.lo \ trimult.lo trimult_complex.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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/balance.Plo \ ./$(DEPDIR)/balancemat.Plo ./$(DEPDIR)/bidiag.Plo \ ./$(DEPDIR)/cholesky.Plo ./$(DEPDIR)/cholesky_band.Plo \ ./$(DEPDIR)/choleskyc.Plo ./$(DEPDIR)/cod.Plo \ ./$(DEPDIR)/condest.Plo ./$(DEPDIR)/exponential.Plo \ ./$(DEPDIR)/hermtd.Plo ./$(DEPDIR)/hessenberg.Plo \ ./$(DEPDIR)/hesstri.Plo ./$(DEPDIR)/hh.Plo \ ./$(DEPDIR)/householder.Plo ./$(DEPDIR)/householdercomplex.Plo \ ./$(DEPDIR)/inline.Plo ./$(DEPDIR)/invtri.Plo \ ./$(DEPDIR)/invtri_complex.Plo ./$(DEPDIR)/ldlt.Plo \ ./$(DEPDIR)/ldlt_band.Plo ./$(DEPDIR)/lq.Plo \ ./$(DEPDIR)/lu.Plo ./$(DEPDIR)/lu_band.Plo ./$(DEPDIR)/luc.Plo \ ./$(DEPDIR)/mcholesky.Plo ./$(DEPDIR)/multiply.Plo \ ./$(DEPDIR)/pcholesky.Plo ./$(DEPDIR)/ptlq.Plo \ ./$(DEPDIR)/ql.Plo ./$(DEPDIR)/qr.Plo ./$(DEPDIR)/qr_band.Plo \ ./$(DEPDIR)/qr_ud.Plo ./$(DEPDIR)/qr_ur.Plo \ ./$(DEPDIR)/qr_uu.Plo ./$(DEPDIR)/qr_uz.Plo \ ./$(DEPDIR)/qrc.Plo ./$(DEPDIR)/qrpt.Plo ./$(DEPDIR)/rqr.Plo \ ./$(DEPDIR)/rqrc.Plo ./$(DEPDIR)/svd.Plo \ ./$(DEPDIR)/symmtd.Plo ./$(DEPDIR)/test.Po \ ./$(DEPDIR)/tridiag.Plo ./$(DEPDIR)/trimult.Plo \ ./$(DEPDIR)/trimult_complex.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 invtri_complex.c multiply.c exponential.c tridiag.c tridiag.h lu.c lu_band.c luc.c hh.c ql.c qr.c qr_band.c qrc.c qrpt.c qr_ud.c qr_ur.c qr_uu.c qr_uz.c rqr.c rqrc.c lq.c ptlq.c svd.c householder.c householdercomplex.c hessenberg.c hesstri.c cholesky.c choleskyc.c mcholesky.c pcholesky.c cholesky_band.c ldlt.c ldlt_band.c symmtd.c hermtd.c bidiag.c balance.c balancemat.c inline.c trimult.c trimult_complex.c noinst_HEADERS = apply_givens.c cholesky_common.c recurse.h svdstep.c tridiag.h test_cholesky.c test_choleskyc.c test_cod.c test_common.c test_ldlt.c test_lu.c test_lu_band.c test_luc.c test_lq.c test_ql.c test_qr.c test_qr_band.c test_qrc.c test_tri.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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/balancemat.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bidiag.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_band.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/choleskyc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cod.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/condest.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exponential.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hermtd.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hessenberg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hesstri.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hh.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/householder.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/householdercomplex.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invtri.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invtri_complex.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ldlt.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ldlt_band.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lq.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lu.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lu_band.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/luc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mcholesky.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiply.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcholesky.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptlq.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ql.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qr_band.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qr_ud.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qr_ur.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qr_uu.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qr_uz.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qrc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qrpt.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rqr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rqrc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/svd.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symmtd.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tridiag.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trimult.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trimult_complex.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/balance.Plo -rm -f ./$(DEPDIR)/balancemat.Plo -rm -f ./$(DEPDIR)/bidiag.Plo -rm -f ./$(DEPDIR)/cholesky.Plo -rm -f ./$(DEPDIR)/cholesky_band.Plo -rm -f ./$(DEPDIR)/choleskyc.Plo -rm -f ./$(DEPDIR)/cod.Plo -rm -f ./$(DEPDIR)/condest.Plo -rm -f ./$(DEPDIR)/exponential.Plo -rm -f ./$(DEPDIR)/hermtd.Plo -rm -f ./$(DEPDIR)/hessenberg.Plo -rm -f ./$(DEPDIR)/hesstri.Plo -rm -f ./$(DEPDIR)/hh.Plo -rm -f ./$(DEPDIR)/householder.Plo -rm -f ./$(DEPDIR)/householdercomplex.Plo -rm -f ./$(DEPDIR)/inline.Plo -rm -f ./$(DEPDIR)/invtri.Plo -rm -f ./$(DEPDIR)/invtri_complex.Plo -rm -f ./$(DEPDIR)/ldlt.Plo -rm -f ./$(DEPDIR)/ldlt_band.Plo -rm -f ./$(DEPDIR)/lq.Plo -rm -f ./$(DEPDIR)/lu.Plo -rm -f ./$(DEPDIR)/lu_band.Plo -rm -f ./$(DEPDIR)/luc.Plo -rm -f ./$(DEPDIR)/mcholesky.Plo -rm -f ./$(DEPDIR)/multiply.Plo -rm -f ./$(DEPDIR)/pcholesky.Plo -rm -f ./$(DEPDIR)/ptlq.Plo -rm -f ./$(DEPDIR)/ql.Plo -rm -f ./$(DEPDIR)/qr.Plo -rm -f ./$(DEPDIR)/qr_band.Plo -rm -f ./$(DEPDIR)/qr_ud.Plo -rm -f ./$(DEPDIR)/qr_ur.Plo -rm -f ./$(DEPDIR)/qr_uu.Plo -rm -f ./$(DEPDIR)/qr_uz.Plo -rm -f ./$(DEPDIR)/qrc.Plo -rm -f ./$(DEPDIR)/qrpt.Plo -rm -f ./$(DEPDIR)/rqr.Plo -rm -f ./$(DEPDIR)/rqrc.Plo -rm -f ./$(DEPDIR)/svd.Plo -rm -f ./$(DEPDIR)/symmtd.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/tridiag.Plo -rm -f ./$(DEPDIR)/trimult.Plo -rm -f ./$(DEPDIR)/trimult_complex.Plo -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 -f ./$(DEPDIR)/balance.Plo -rm -f ./$(DEPDIR)/balancemat.Plo -rm -f ./$(DEPDIR)/bidiag.Plo -rm -f ./$(DEPDIR)/cholesky.Plo -rm -f ./$(DEPDIR)/cholesky_band.Plo -rm -f ./$(DEPDIR)/choleskyc.Plo -rm -f ./$(DEPDIR)/cod.Plo -rm -f ./$(DEPDIR)/condest.Plo -rm -f ./$(DEPDIR)/exponential.Plo -rm -f ./$(DEPDIR)/hermtd.Plo -rm -f ./$(DEPDIR)/hessenberg.Plo -rm -f ./$(DEPDIR)/hesstri.Plo -rm -f ./$(DEPDIR)/hh.Plo -rm -f ./$(DEPDIR)/householder.Plo -rm -f ./$(DEPDIR)/householdercomplex.Plo -rm -f ./$(DEPDIR)/inline.Plo -rm -f ./$(DEPDIR)/invtri.Plo -rm -f ./$(DEPDIR)/invtri_complex.Plo -rm -f ./$(DEPDIR)/ldlt.Plo -rm -f ./$(DEPDIR)/ldlt_band.Plo -rm -f ./$(DEPDIR)/lq.Plo -rm -f ./$(DEPDIR)/lu.Plo -rm -f ./$(DEPDIR)/lu_band.Plo -rm -f ./$(DEPDIR)/luc.Plo -rm -f ./$(DEPDIR)/mcholesky.Plo -rm -f ./$(DEPDIR)/multiply.Plo -rm -f ./$(DEPDIR)/pcholesky.Plo -rm -f ./$(DEPDIR)/ptlq.Plo -rm -f ./$(DEPDIR)/ql.Plo -rm -f ./$(DEPDIR)/qr.Plo -rm -f ./$(DEPDIR)/qr_band.Plo -rm -f ./$(DEPDIR)/qr_ud.Plo -rm -f ./$(DEPDIR)/qr_ur.Plo -rm -f ./$(DEPDIR)/qr_uu.Plo -rm -f ./$(DEPDIR)/qr_uz.Plo -rm -f ./$(DEPDIR)/qrc.Plo -rm -f ./$(DEPDIR)/qrpt.Plo -rm -f ./$(DEPDIR)/rqr.Plo -rm -f ./$(DEPDIR)/rqrc.Plo -rm -f ./$(DEPDIR)/svd.Plo -rm -f ./$(DEPDIR)/symmtd.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/tridiag.Plo -rm -f ./$(DEPDIR)/trimult.Plo -rm -f ./$(DEPDIR)/trimult_complex.Plo -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/linalg/ChangeLog0000644016036000116100000003434213373111455012257 000000000000002011-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-2.7.1/linalg/TODO0000644016036000116100000000040613373111455011167 00000000000000# -*- org -*- #+CATEGORY: linalg * Support M #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^T * * 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_Zvec(const gsl_matrix * QRZT, const gsl_vector * tau_Z, const size_t rank, gsl_vector * v); static int cod_trireg_solve(const gsl_matrix * R, const double lambda, const gsl_vector * b, gsl_matrix * S, gsl_vector * x, 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) { 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 min ||b - A x||^2 for M >= N using the COD factorization A P = Q R Z Inputs: QRZT - 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 * QRZT, 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 = QRZT->size1; const size_t N = QRZT->size2; if (M < N) { GSL_ERROR ("QRZT 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 (QRZT, 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 = [ c1 ; c2 ] */ gsl_vector_memcpy(residual, b); gsl_linalg_QR_QTvec (QRZT, 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 ( R11^{-1} x1; 0 ) */ cod_householder_Zvec(QRZT, 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 ]) = Q [ 0 ; c2 ] */ gsl_vector_set_zero(&(QTb1.vector)); gsl_linalg_QR_Qvec(QRZT, tau_Q, residual); return GSL_SUCCESS; } } /* gsl_linalg_COD_lssolve2() Find the least squares solution to the Tikhonov regularized system in standard form: min ||b - A x||^2 + lambda^2 ||x||^2 for M >= N using the COD factorization A P = Q R Z Inputs: lambda - parameter QRZT - 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 S - workspace, rank-by-rank work - workspace, length rank */ int gsl_linalg_COD_lssolve2 (const double lambda, const gsl_matrix * QRZT, 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, gsl_matrix * S, gsl_vector * work) { const size_t M = QRZT->size1; const size_t N = QRZT->size2; if (M < N) { GSL_ERROR ("QRZT 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 if (S->size1 != rank || S->size2 != rank) { GSL_ERROR ("S must be rank-by-rank", GSL_EBADLEN); } else if (work->size != rank) { GSL_ERROR ("work must be length rank", GSL_EBADLEN); } else { gsl_matrix_const_view R11 = gsl_matrix_const_submatrix (QRZT, 0, 0, rank, rank); gsl_vector_view c1 = gsl_vector_subvector(residual, 0, rank); gsl_vector_view y1 = gsl_vector_subvector(x, 0, rank); gsl_vector_set_zero(x); /* compute residual = Q^T b = [ c1 ; c2 ]*/ gsl_vector_memcpy(residual, b); gsl_linalg_QR_QTvec (QRZT, tau_Q, residual); /* solve [ R11 ; lambda*I ] y1 = [ (Q^T b)(1:r) ; 0 ] */ cod_trireg_solve(&(R11.matrix), lambda, &(c1.vector), S, &(y1.vector), work); /* save y1 for later residual calculation */ gsl_vector_memcpy(work, &(y1.vector)); /* compute Z [ y1; 0 ] */ cod_householder_Zvec(QRZT, tau_Z, rank, x); /* compute x = P Z^T ( y1; 0 ) */ gsl_permute_vector_inverse(perm, x); /* compute residual = b - A x = Q (Q^T b - [ R11 y1; 0 ]) = Q [ c1 - R11*y1 ; c2 ] */ /* work = R11*y1 */ gsl_blas_dtrmv(CblasUpper, CblasNoTrans, CblasNonUnit, &(R11.matrix), work); gsl_vector_sub(&(c1.vector), work); gsl_linalg_QR_Qvec(QRZT, tau_Q, residual); return GSL_SUCCESS; } } /* gsl_linalg_COD_unpack() Unpack encoded COD decomposition into the matrices Q,R,Z,P Inputs: QRZT - 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 * QRZT, 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 = QRZT->size1; const size_t N = QRZT->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 QRZT11 = gsl_matrix_const_submatrix(QRZT, 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 (QRZT, i, i, M - i); gsl_matrix_view m = gsl_matrix_submatrix (Q, i, i, M - i, M - i); gsl_vector_view work = gsl_matrix_subcolumn (R, 0, 0, M - i); double ti = gsl_vector_get (tau_Q, i); double * ptr = gsl_vector_ptr((gsl_vector *) &h.vector, 0); double tmp = *ptr; *ptr = 1.0; gsl_linalg_householder_left (ti, &h.vector, &m.matrix, &work.vector); *ptr = tmp; } /* 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(QRZT, tau_Z, rank, Z, &work.vector); } /* copy rank-by-rank upper triangle of QRZT into R and zero the rest */ gsl_matrix_set_zero(R); gsl_matrix_tricpy(CblasUpper, CblasNonUnit, &R11.matrix, &QRZT11.matrix); return GSL_SUCCESS; } } /* gsl_linalg_COD_matZ Multiply an M-by-N matrix A on the right by Z (N-by-N) Inputs: QRZT - 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 * QRZT, 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 (QRZT->size1, QRZT->size2)) { GSL_ERROR("tau_Z must be GSL_MIN(M,N)", GSL_EBADLEN); } else if (QRZT->size2 != N) { GSL_ERROR("QRZT 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 = rank; i > 0 && i--; ) { gsl_vector_const_view h = gsl_matrix_const_subrow (QRZT, 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_Zvec Multiply a vector by Z Inputs: QRZT - encoded COD matrix tau_Z - Householder scalars for Z rank - matrix rank v - on input, vector of length N on output, Z * v */ static int cod_householder_Zvec(const gsl_matrix * QRZT, const gsl_vector * tau_Z, const size_t rank, gsl_vector * v) { const size_t M = QRZT->size1; const size_t N = QRZT->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 (QRZT, 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; } } /* cod_trireg_solve() This function computes the solution to the least squares system [ R ] x = [ b ] [ lambda*I ] [ 0 ] where R is an N-by-N upper triangular matrix, lambda is a scalar parameter, and b is a vector of length N. This is done by computing the QR factorization [ R ] = W S^T [ lambda*I ] where S^T is upper triangular, and solving S^T x = W^T [ b ] [ 0 ] Inputs: R - full rank upper triangular matrix; the diagonal elements are modified but restored on output lambda - scalar parameter lambda b - right hand side vector b S - workspace, N-by-N x - (output) least squares solution of the system work - workspace of length N */ static int cod_trireg_solve (const gsl_matrix * R, const double lambda, const gsl_vector * b, gsl_matrix * S, gsl_vector * x, gsl_vector * work) { const size_t N = R->size2; gsl_vector_const_view diag = gsl_matrix_const_diagonal(R); size_t i, j, k; if (lambda <= 0.0) { GSL_ERROR("lambda must be positive", GSL_EINVAL); } /* copy R and b to preserve input and initialise S; store diag(R) in work */ gsl_matrix_transpose_tricpy(CblasUpper, CblasUnit, S, R); gsl_vector_memcpy(work, &diag.vector); gsl_vector_memcpy(x, b); /* eliminate the diagonal matrix lambda*I using Givens rotations */ for (j = 0; j < N; j++) { double bj = 0.0; gsl_matrix_set (S, j, j, lambda); for (k = j + 1; k < N; k++) { gsl_matrix_set (S, k, k, 0.0); } /* the transformations to eliminate the row of lambda*I modify only a single element of b beyond the first n, which is initially zero */ for (k = j; k < N; k++) { /* determine a Givens rotation which eliminates the appropriate element in the current row of lambda*I */ double sine, cosine; double xk = gsl_vector_get (x, k); double rkk = gsl_vector_get (work, 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 [b,0] */ { double new_rkk = cosine * rkk + sine * skk; double new_xk = cosine * xk + sine * bj; bj = -sine * xk + cosine * bj; gsl_vector_set(work, k, new_rkk); gsl_matrix_set(S, k, k, new_rkk); gsl_vector_set(x, k, new_xk); } /* 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); } } } /* solve: S^T x = rhs in place */ gsl_blas_dtrsv(CblasLower, CblasTrans, CblasNonUnit, S, x); return GSL_SUCCESS; } gsl-2.7.1/linalg/condest.c0000644016036000116100000001743713510024414012305 00000000000000/* 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); int gsl_linalg_tri_rcond(CBLAS_UPLO_t Uplo, const gsl_matrix * A, double * rcond, gsl_vector * work) { return condest_tri_rcond(Uplo, A, rcond, work); } /* 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); } #ifndef GSL_DISABLE_DEPRECATED 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; } 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; } #endif gsl-2.7.1/linalg/invtri.c0000644016036000116100000001571213474323774012177 00000000000000/* linalg/invtri.c * * Copyright (C) 2016, 2017, 2018, 2019 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 #include "recurse.h" static int triangular_inverse_L2(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t Diag, gsl_matrix * T); static int triangular_inverse_L3(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t Diag, gsl_matrix * T); static int triangular_singular(const gsl_matrix * T); int gsl_linalg_tri_invert(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 { int status; status = triangular_singular(T); if (status) return status; return triangular_inverse_L3(Uplo, Diag, T); } } /* triangular_inverse_L2() 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 Notes: 1) Based on LAPACK routine DTRTI2 using Level 2 BLAS */ static int triangular_inverse_L2(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; } } /* triangular_inverse_L3() 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 Notes: 1) Based on ReLAPACK routine DTRTRI using Level 3 BLAS */ static int triangular_inverse_L3(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 if (N <= CROSSOVER_INVTRI) { /* use Level 2 BLAS code */ return triangular_inverse_L2(Uplo, Diag, T); } else { /* * partition matrix: * * T11 T12 * T21 T22 * * where T11 is N1-by-N1 */ int status; const size_t N1 = GSL_LINALG_SPLIT(N); const size_t N2 = N - N1; gsl_matrix_view T11 = gsl_matrix_submatrix(T, 0, 0, N1, N1); gsl_matrix_view T12 = gsl_matrix_submatrix(T, 0, N1, N1, N2); gsl_matrix_view T21 = gsl_matrix_submatrix(T, N1, 0, N2, N1); gsl_matrix_view T22 = gsl_matrix_submatrix(T, N1, N1, N2, N2); /* recursion on T11 */ status = triangular_inverse_L3(Uplo, Diag, &T11.matrix); if (status) return status; if (Uplo == CblasLower) { /* T21 = - T21 * T11 */ gsl_blas_dtrmm(CblasRight, Uplo, CblasNoTrans, Diag, -1.0, &T11.matrix, &T21.matrix); /* T21 = T22 * T21^{-1} */ gsl_blas_dtrsm(CblasLeft, Uplo, CblasNoTrans, Diag, 1.0, &T22.matrix, &T21.matrix); } else { /* T12 = - T11 * T12 */ gsl_blas_dtrmm(CblasLeft, Uplo, CblasNoTrans, Diag, -1.0, &T11.matrix, &T12.matrix); /* T12 = T12 * T22^{-1} */ gsl_blas_dtrsm(CblasRight, Uplo, CblasNoTrans, Diag, 1.0, &T22.matrix, &T12.matrix); } /* recursion on T22 */ status = triangular_inverse_L3(Uplo, Diag, &T22.matrix); if (status) return status; return GSL_SUCCESS; } } static int triangular_singular(const gsl_matrix * T) { size_t i; for (i = 0; i < T->size1; ++i) { double Tii = gsl_matrix_get(T, i, i); if (Tii == 0.0) return GSL_ESING; } return GSL_SUCCESS; } #ifndef GSL_DISABLE_DEPRECATED int gsl_linalg_tri_upper_invert(gsl_matrix * T) { int status = triangular_singular(T); if (status) return status; return triangular_inverse_L3(CblasUpper, CblasNonUnit, T); } int gsl_linalg_tri_lower_invert(gsl_matrix * T) { int status = triangular_singular(T); if (status) return status; return triangular_inverse_L3(CblasLower, CblasNonUnit, T); } int gsl_linalg_tri_upper_unit_invert(gsl_matrix * T) { int status = triangular_singular(T); if (status) return status; return triangular_inverse_L3(CblasUpper, CblasUnit, T); } int gsl_linalg_tri_lower_unit_invert(gsl_matrix * T) { int status = triangular_singular(T); if (status) return status; return triangular_inverse_L3(CblasLower, CblasUnit, T); } #endif gsl-2.7.1/linalg/invtri_complex.c0000644016036000116100000001545113477623322013721 00000000000000/* linalg/invtri_complex.c * * Copyright (C) 2019 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 complex triangular matrices */ #include #include #include #include #include #include #include #include #include #include "recurse.h" static int complex_tri_invert_L2(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t Diag, gsl_matrix_complex * T); static int complex_tri_invert_L3(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t Diag, gsl_matrix_complex * T); static int triangular_singular(const gsl_matrix_complex * T); /* gsl_linalg_complex_tri_invert() Invert a complex triangular matrix T using Level 3 BLAS 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 */ int gsl_linalg_complex_tri_invert(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t Diag, gsl_matrix_complex * T) { const size_t N = T->size1; if (N != T->size2) { GSL_ERROR ("matrix must be square", GSL_ENOTSQR); } else { int status; status = triangular_singular(T); if (status) return status; return complex_tri_invert_L3(Uplo, Diag, T); } } /* complex_tri_invert_L2() Invert a complex 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 Notes: 1) Based on LAPACK routine ZTRTI2 using Level 2 BLAS */ static int complex_tri_invert_L2(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t Diag, gsl_matrix_complex * T) { const size_t N = T->size1; if (N != T->size2) { GSL_ERROR ("matrix must be square", GSL_ENOTSQR); } else { size_t i; if (Uplo == CblasUpper) { for (i = 0; i < N; ++i) { gsl_complex * Tii = gsl_matrix_complex_ptr(T, i, i); gsl_complex aii; if (Diag == CblasNonUnit) { *Tii = gsl_complex_inverse(*Tii); GSL_REAL(aii) = -GSL_REAL(*Tii); GSL_IMAG(aii) = -GSL_IMAG(*Tii); } else aii = GSL_COMPLEX_NEGONE; if (i > 0) { gsl_matrix_complex_view m = gsl_matrix_complex_submatrix(T, 0, 0, i, i); gsl_vector_complex_view v = gsl_matrix_complex_subcolumn(T, i, 0, i); gsl_blas_ztrmv(CblasUpper, CblasNoTrans, Diag, &m.matrix, &v.vector); gsl_blas_zscal(aii, &v.vector); } } } else { for (i = 0; i < N; ++i) { size_t j = N - i - 1; gsl_complex * Tjj = gsl_matrix_complex_ptr(T, j, j); gsl_complex ajj; if (Diag == CblasNonUnit) { *Tjj = gsl_complex_inverse(*Tjj); GSL_REAL(ajj) = -GSL_REAL(*Tjj); GSL_IMAG(ajj) = -GSL_IMAG(*Tjj); } else ajj = GSL_COMPLEX_NEGONE; if (j < N - 1) { gsl_matrix_complex_view m = gsl_matrix_complex_submatrix(T, j + 1, j + 1, N - j - 1, N - j - 1); gsl_vector_complex_view v = gsl_matrix_complex_subcolumn(T, j, j + 1, N - j - 1); gsl_blas_ztrmv(CblasLower, CblasNoTrans, Diag, &m.matrix, &v.vector); gsl_blas_zscal(ajj, &v.vector); } } } return GSL_SUCCESS; } } /* complex_tri_invert_L3() Invert a complex 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 Notes: 1) Based on ReLAPACK using Level 3 BLAS */ static int complex_tri_invert_L3(CBLAS_UPLO_t Uplo, CBLAS_DIAG_t Diag, gsl_matrix_complex * T) { const size_t N = T->size1; if (N != T->size2) { GSL_ERROR ("matrix must be square", GSL_ENOTSQR); } else if (N <= CROSSOVER_INVTRI) { /* use Level 2 algorithm */ return complex_tri_invert_L2(Uplo, Diag, T); } else { /* * partition matrix: * * T11 T12 * T21 T22 * * where T11 is N1-by-N1 */ int status; const size_t N1 = GSL_LINALG_SPLIT_COMPLEX(N); const size_t N2 = N - N1; gsl_matrix_complex_view T11 = gsl_matrix_complex_submatrix(T, 0, 0, N1, N1); gsl_matrix_complex_view T12 = gsl_matrix_complex_submatrix(T, 0, N1, N1, N2); gsl_matrix_complex_view T21 = gsl_matrix_complex_submatrix(T, N1, 0, N2, N1); gsl_matrix_complex_view T22 = gsl_matrix_complex_submatrix(T, N1, N1, N2, N2); /* recursion on T11 */ status = complex_tri_invert_L3(Uplo, Diag, &T11.matrix); if (status) return status; if (Uplo == CblasLower) { /* T21 = - T21 * T11 */ gsl_blas_ztrmm(CblasRight, Uplo, CblasNoTrans, Diag, GSL_COMPLEX_NEGONE, &T11.matrix, &T21.matrix); /* T21 = T22 * T21^{-1} */ gsl_blas_ztrsm(CblasLeft, Uplo, CblasNoTrans, Diag, GSL_COMPLEX_ONE, &T22.matrix, &T21.matrix); } else { /* T12 = - T11 * T12 */ gsl_blas_ztrmm(CblasLeft, Uplo, CblasNoTrans, Diag, GSL_COMPLEX_NEGONE, &T11.matrix, &T12.matrix); /* T12 = T12 * T22^{-1} */ gsl_blas_ztrsm(CblasRight, Uplo, CblasNoTrans, Diag, GSL_COMPLEX_ONE, &T22.matrix, &T12.matrix); } /* recursion on T22 */ status = complex_tri_invert_L3(Uplo, Diag, &T22.matrix); if (status) return status; return GSL_SUCCESS; } } static int triangular_singular(const gsl_matrix_complex * T) { size_t i; for (i = 0; i < T->size1; ++i) { gsl_complex z = gsl_matrix_complex_get(T, i, i); if (GSL_REAL(z) == 0.0 && GSL_IMAG(z) == 0.0) return GSL_ESING; } return GSL_SUCCESS; } gsl-2.7.1/linalg/multiply.c0000644016036000116100000001000413135126237012515 00000000000000/* 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-2.7.1/linalg/exponential.c0000644016036000116100000001164013135126237013173 00000000000000/* linalg/exponential.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 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 */ /* Calculate the matrix exponential, following * Moler + Van Loan, SIAM Rev. 20, 801 (1978). */ #include #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-2.7.1/linalg/tridiag.c0000644016036000116100000003707513373111455012302 00000000000000/* 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-2.7.1/linalg/lu.c0000644016036000116100000003427414151556700011276 00000000000000/* linalg/lu.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2009 Gerard Jungman, Brian Gough * Copyright (C) 2019 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 "recurse.h" static int LU_decomp_L2 (gsl_matrix * A, gsl_vector_uint * ipiv); static int LU_decomp_L3 (gsl_matrix * A, gsl_vector_uint * ipiv); static int singular (const gsl_matrix * LU); static int apply_pivots(gsl_matrix * A, const gsl_vector_uint * ipiv); /* 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) { const size_t M = A->size1; if (p->size != M) { GSL_ERROR ("permutation length must match matrix size1", GSL_EBADLEN); } else { int status; const size_t N = A->size2; const size_t minMN = GSL_MIN(M, N); gsl_vector_uint * ipiv = gsl_vector_uint_alloc(minMN); gsl_matrix_view AL = gsl_matrix_submatrix(A, 0, 0, M, minMN); size_t i; status = LU_decomp_L3 (&AL.matrix, ipiv); /* process remaining right matrix */ if (M < N) { gsl_matrix_view AR = gsl_matrix_submatrix(A, 0, M, M, N - M); /* apply pivots to AR */ apply_pivots(&AR.matrix, ipiv); /* AR = AL^{-1} AR */ gsl_blas_dtrsm(CblasLeft, CblasLower, CblasNoTrans, CblasUnit, 1.0, &AL.matrix, &AR.matrix); } /* convert ipiv array to permutation */ gsl_permutation_init(p); *signum = 1; for (i = 0; i < minMN; ++i) { unsigned int pivi = gsl_vector_uint_get(ipiv, i); if (p->data[pivi] != p->data[i]) { size_t tmp = p->data[pivi]; p->data[pivi] = p->data[i]; p->data[i] = tmp; *signum = -(*signum); } } gsl_vector_uint_free(ipiv); return status; } } /* LU_decomp_L2 LU decomposition with partial pivoting using Level 2 BLAS Inputs: A - on input, matrix to be factored; on output, L and U factors ipiv - (output) array containing row swaps Notes: 1) Based on LAPACK DGETF2 */ static int LU_decomp_L2 (gsl_matrix * A, gsl_vector_uint * ipiv) { const size_t M = A->size1; const size_t N = A->size2; const size_t minMN = GSL_MIN(M, N); if (ipiv->size != minMN) { GSL_ERROR ("ipiv length must equal MIN(M,N)", GSL_EBADLEN); } else { size_t i, j; for (j = 0; j < minMN; ++j) { /* find maximum in the j-th column */ gsl_vector_view v = gsl_matrix_subcolumn(A, j, j, M - j); size_t j_pivot = j + gsl_blas_idamax(&v.vector); gsl_vector_view v1, v2; gsl_vector_uint_set(ipiv, j, j_pivot); if (j_pivot != j) { /* swap rows j and j_pivot */ v1 = gsl_matrix_row(A, j); v2 = gsl_matrix_row(A, j_pivot); gsl_blas_dswap(&v1.vector, &v2.vector); } if (j < M - 1) { double Ajj = gsl_matrix_get(A, j, j); if (fabs(Ajj) >= GSL_DBL_MIN) { v1 = gsl_matrix_subcolumn(A, j, j + 1, M - j - 1); gsl_blas_dscal(1.0 / Ajj, &v1.vector); } else { for (i = 1; i < M - j; ++i) { double * ptr = gsl_matrix_ptr(A, j + i, j); *ptr /= Ajj; } } } if (j < minMN - 1) { gsl_matrix_view A22 = gsl_matrix_submatrix(A, j + 1, j + 1, M - j - 1, N - j - 1); v1 = gsl_matrix_subcolumn(A, j, j + 1, M - j - 1); v2 = gsl_matrix_subrow(A, j, j + 1, N - j - 1); gsl_blas_dger(-1.0, &v1.vector, &v2.vector, &A22.matrix); } } return GSL_SUCCESS; } } /* LU_decomp_L3 LU decomposition with partial pivoting using Level 3 BLAS Inputs: A - on input, matrix to be factored; on output, L and U factors ipiv - (output) array containing row swaps Notes: 1) Based on ReLAPACK DGETRF */ static int LU_decomp_L3 (gsl_matrix * A, gsl_vector_uint * ipiv) { const size_t M = A->size1; const size_t N = A->size2; if (M < N) { GSL_ERROR ("matrix must have M >= N", GSL_EBADLEN); } else if (ipiv->size != GSL_MIN(M, N)) { GSL_ERROR ("ipiv length must equal MIN(M,N)", GSL_EBADLEN); } else if (N <= CROSSOVER_LU) { /* use Level 2 algorithm */ return LU_decomp_L2(A, ipiv); } else { /* * partition matrix: * * N1 N2 * N1 [ A11 A12 ] * M2 [ A21 A22 ] * * and * N1 N2 * M [ AL AR ] */ int status; const size_t N1 = GSL_LINALG_SPLIT(N); const size_t N2 = N - N1; const size_t M2 = M - N1; gsl_matrix_view A11 = gsl_matrix_submatrix(A, 0, 0, N1, N1); gsl_matrix_view A12 = gsl_matrix_submatrix(A, 0, N1, N1, N2); gsl_matrix_view A21 = gsl_matrix_submatrix(A, N1, 0, M2, N1); gsl_matrix_view A22 = gsl_matrix_submatrix(A, N1, N1, M2, N2); gsl_matrix_view AL = gsl_matrix_submatrix(A, 0, 0, M, N1); gsl_matrix_view AR = gsl_matrix_submatrix(A, 0, N1, M, N2); /* * partition ipiv = [ ipiv1 ] N1 * [ ipiv2 ] N2 */ gsl_vector_uint_view ipiv1 = gsl_vector_uint_subvector(ipiv, 0, N1); gsl_vector_uint_view ipiv2 = gsl_vector_uint_subvector(ipiv, N1, N2); size_t i; /* recursion on (AL, ipiv1) */ status = LU_decomp_L3(&AL.matrix, &ipiv1.vector); if (status) return status; /* apply ipiv1 to AR */ apply_pivots(&AR.matrix, &ipiv1.vector); /* A12 = A11^{-1} A12 */ gsl_blas_dtrsm(CblasLeft, CblasLower, CblasNoTrans, CblasUnit, 1.0, &A11.matrix, &A12.matrix); /* A22 = A22 - A21 * A12 */ gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, -1.0, &A21.matrix, &A12.matrix, 1.0, &A22.matrix); /* recursion on (A22, ipiv2) */ status = LU_decomp_L3(&A22.matrix, &ipiv2.vector); if (status) return status; /* apply pivots to A21 */ apply_pivots(&A21.matrix, &ipiv2.vector); /* shift pivots */ for (i = 0; i < N2; ++i) { unsigned int * ptr = gsl_vector_uint_ptr(&ipiv2.vector, i); *ptr += N1; } 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); } else 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) { 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 (inverse->size1 != LU->size1 || inverse->size2 != LU->size2) { GSL_ERROR ("inverse matrix must match LU matrix dimensions", GSL_EBADLEN); } else { gsl_matrix_memcpy(inverse, LU); return gsl_linalg_LU_invx (inverse, p); } } int gsl_linalg_LU_invx (gsl_matrix * LU, const gsl_permutation * p) { 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 (singular (LU)) { GSL_ERROR ("matrix is singular", GSL_EDOM); } else { int status; const size_t N = LU->size1; size_t i; /* compute U^{-1} */ status = gsl_linalg_tri_invert(CblasUpper, CblasNonUnit, LU); if (status) return status; /* compute L^{-1} */ status = gsl_linalg_tri_invert(CblasLower, CblasUnit, LU); if (status) return status; /* compute U^{-1} L^{-1} */ status = gsl_linalg_tri_UL(LU); if (status) return status; /* apply permutation to columns of A^{-1} */ for (i = 0; i < N; ++i) { gsl_vector_view v = gsl_matrix_row(LU, i); gsl_permute_vector_inverse(p, &v.vector); } return GSL_SUCCESS; } } 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; } static int apply_pivots(gsl_matrix * A, const gsl_vector_uint * ipiv) { if (A->size1 < ipiv->size) { GSL_ERROR("matrix does not match pivot vector", GSL_EBADLEN); } else { size_t i; for (i = 0; i < ipiv->size; ++i) { size_t pi = gsl_vector_uint_get(ipiv, i); if (i != pi) { /* swap rows i and pi */ gsl_vector_view v1 = gsl_matrix_row(A, i); gsl_vector_view v2 = gsl_matrix_row(A, pi); gsl_blas_dswap(&v1.vector, &v2.vector); } } return GSL_SUCCESS; } } gsl-2.7.1/linalg/lu_band.c0000644016036000116100000002457513703250152012257 00000000000000/* linalg/lu.c * * Copyright (C) 2020 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 static int LU_band_decomp_L2 (const size_t M, const size_t lb, const size_t ub, gsl_matrix * AB, gsl_vector_uint * ipiv); /* Factorise a (p,q) banded M 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] * * Inputs: M - number of rows in matrix * lb - lower bandwidth * ub - upper bandwidth * AB - matrix in band storage format, N-by-(2*p + q + 1) * piv - pivot vector, size MIN(M, N) */ int gsl_linalg_LU_band_decomp (const size_t M, const size_t lb, const size_t ub, gsl_matrix * AB, gsl_vector_uint * piv) { const size_t N = AB->size1; const size_t minMN = GSL_MIN(M, N); if (lb >= M) { GSL_ERROR ("lower bandwidth must be less than M", GSL_EDOM); } else if (ub >= N) { GSL_ERROR ("upper bandwidth must be less than N", GSL_EDOM); } else if (AB->size2 != 2*lb + ub + 1) { GSL_ERROR ("matrix size inconsistent with bandwidths", GSL_EBADLEN); } else if (piv->size != minMN) { GSL_ERROR ("pivot vector must have length MIN(M,N)", GSL_EBADLEN); } else { int status; status = LU_band_decomp_L2 (M, lb, ub, AB, piv); return status; } } int gsl_linalg_LU_band_solve (const size_t lb, const size_t ub, const gsl_matrix * LUB, const gsl_vector_uint * piv, const gsl_vector * b, gsl_vector * x) { const size_t N = LUB->size1; if (N != x->size) { GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN); } else if (N != b->size) { GSL_ERROR ("matrix size must match rhs size", GSL_EBADLEN); } else if (lb >= N) { GSL_ERROR ("lower bandwidth must be less than N", GSL_EDOM); } else if (ub >= N) { GSL_ERROR ("upper bandwidth must be less than N", GSL_EDOM); } else if (LUB->size2 != 2*lb + ub + 1) { GSL_ERROR ("matrix size inconsistent with bandwidths", GSL_EBADLEN); } else if (piv->size != N) { GSL_ERROR ("pivot vector must have length N", GSL_EBADLEN); } else { int status; gsl_vector_memcpy(x, b); status = gsl_linalg_LU_band_svx(lb, ub, LUB, piv, x); return status; } } int gsl_linalg_LU_band_svx (const size_t lb, const size_t ub, const gsl_matrix * LUB, const gsl_vector_uint * piv, gsl_vector * x) { const size_t N = LUB->size1; if (N != x->size) { GSL_ERROR ("matrix size must match solution/rhs size", GSL_EBADLEN); } else if (lb >= N) { GSL_ERROR ("lower bandwidth must be less than N", GSL_EDOM); } else if (ub >= N) { GSL_ERROR ("upper bandwidth must be less than N", GSL_EDOM); } else if (LUB->size2 != 2*lb + ub + 1) { GSL_ERROR ("matrix size inconsistent with bandwidths", GSL_EBADLEN); } else if (piv->size != N) { GSL_ERROR ("pivot vector must have length N", GSL_EBADLEN); } else { if (lb > 0) { size_t j; for (j = 0; j < N - 1; ++j) { size_t pj = gsl_vector_uint_get(piv, j); double * xj = gsl_vector_ptr(x, j); size_t lm = GSL_MIN(lb, N - j - 1); gsl_vector_view xv = gsl_vector_subvector(x, j + 1, lm); gsl_vector_const_view yv = gsl_matrix_const_subrow(LUB, j, lb + ub + 1, lm); if (j != pj) { double xl = gsl_vector_get(x, pj); gsl_vector_set(x, pj, *xj); *xj = xl; } gsl_blas_daxpy(-(*xj), &yv.vector, &xv.vector); } } /* solve U x = b */ cblas_dtbsv(CblasColMajor, CblasUpper, CblasNoTrans, CblasNonUnit, (int) N, (int) (lb + ub), LUB->data, LUB->tda, x->data, x->stride); return GSL_SUCCESS; } } int gsl_linalg_LU_band_unpack (const size_t M, const size_t lb, const size_t ub, const gsl_matrix * LUB, const gsl_vector_uint * piv, gsl_matrix * L, gsl_matrix * U) { const size_t N = LUB->size1; const size_t minMN = GSL_MIN(M, N); if (ub >= N) { GSL_ERROR ("upper bandwidth must be < N", GSL_EDOM); } else if (lb >= M) { GSL_ERROR ("lower bandwidth must be < M", GSL_EDOM); } else if (LUB->size2 != 2*lb + ub + 1) { GSL_ERROR ("matrix size inconsistent with bandwidths", GSL_EBADLEN); } else if (piv->size != minMN) { GSL_ERROR ("pivot vector must have length MIN(M,N)", GSL_EBADLEN); } else if (L->size1 != M || L->size2 != minMN) { GSL_ERROR ("L matrix has wrong dimensions", GSL_EBADLEN); } else if (U->size1 != minMN || U->size2 != N) { GSL_ERROR ("U matrix has wrong dimensions", GSL_EBADLEN); } else { const size_t ub_U = lb + ub; size_t j; gsl_matrix_set_identity(L); gsl_matrix_set_zero(U); /* compute L */ if (lb > 0) { const size_t jstart = (M > N) ? minMN : minMN - 1; size_t j; for (j = jstart; j > 0 && j--; ) { size_t pj = gsl_vector_uint_get(piv, j); size_t lm = GSL_MIN(lb, M - j - 1); gsl_vector_const_view xv = gsl_matrix_const_subrow(LUB, j, lb + ub + 1, lm); gsl_vector_const_view yv = gsl_matrix_const_subrow(L, j, 0, minMN); gsl_matrix_view m = gsl_matrix_submatrix(L, j + 1, 0, lm, minMN); gsl_blas_dger(1.0, &xv.vector, &yv.vector, &m.matrix); if (j != pj) { gsl_vector_view Lj = gsl_matrix_row(L, j); gsl_vector_view Lpj = gsl_matrix_row(L, pj); gsl_blas_dswap(&Lj.vector, &Lpj.vector); } } } /* fill in U */ for (j = 0; j <= GSL_MIN(ub_U, N - 1); ++j) { gsl_vector_const_view src = gsl_matrix_const_subcolumn(LUB, ub_U - j, j, GSL_MIN(M, N - j)); gsl_vector_view dest = gsl_matrix_superdiagonal(U, j); gsl_vector_memcpy(&dest.vector, &src.vector); } return GSL_SUCCESS; } } /* LU_band_decomp_L2 LU decomposition with partial pivoting using Level 2 BLAS Inputs: M - number of rows in matrix lb - lower bandwidth ub - upper bandwidth AB - on input, matrix to be factored; on output, L and U factors N-by-(2*p + q + 1) ipiv - (output) array containing row swaps Notes: 1) Based on LAPACK DGBTF2 */ static int LU_band_decomp_L2 (const size_t M, const size_t lb, const size_t ub, gsl_matrix * AB, gsl_vector_uint * ipiv) { const size_t N = AB->size1; const size_t minMN = GSL_MIN(M, N); if (ipiv->size != minMN) { GSL_ERROR ("ipiv length must equal MIN(M,N)", GSL_EBADLEN); } else if (lb >= M) { GSL_ERROR ("lower bandwidth must be less than M", GSL_EDOM); } else if (ub >= N) { GSL_ERROR ("upper bandwidth must be less than N", GSL_EDOM); } else if (AB->size2 != 2*lb + ub + 1) { GSL_ERROR ("matrix size inconsistent with bandwidths", GSL_EBADLEN); } else { const size_t ub_U = lb + ub; /* upper bandwidth of U factor */ const size_t ldab = AB->size2; size_t ju = 0; size_t j; if (lb > 0) { /* initialize fill-in elements to zero */ gsl_matrix_view m = gsl_matrix_submatrix(AB, 0, 0, N, lb); gsl_matrix_set_zero(&m.matrix); } for (j = 0; j < minMN; ++j) { size_t lbj = GSL_MIN(lb, M - j - 1); /* subdiagonal elements in column j */ gsl_vector_view x = gsl_matrix_subrow(AB, j, ub_U, lbj + 1); gsl_vector_view y; CBLAS_INDEX_t j_pivot = gsl_blas_idamax(&x.vector); double * ptr; gsl_vector_uint_set(ipiv, j, j + j_pivot); ptr = gsl_matrix_ptr(AB, j, ub_U + j_pivot); if (*ptr != 0.0) ju = GSL_MAX(ju, GSL_MIN(j + ub + j_pivot, N - 1)); if (j_pivot != 0) { double *ptr2; /* swap columns */ x = gsl_vector_view_array_with_stride(ptr, ldab - 1, ju - j + 1); ptr2 = gsl_matrix_ptr(AB, j, ub_U); y = gsl_vector_view_array_with_stride(ptr2, ldab - 1, ju - j + 1); gsl_blas_dswap(&x.vector, &y.vector); } if (lbj > 0) { double tmp = gsl_matrix_get(AB, j, ub_U); x = gsl_matrix_subrow(AB, j, ub_U + 1, lbj); gsl_blas_dscal(1.0 / tmp, &x.vector); if (ju > j) { gsl_matrix_view m = gsl_matrix_submatrix(AB, j + 1, ub_U, ju - j, lbj); ptr = gsl_matrix_ptr(AB, j + 1, ub_U - 1); y = gsl_vector_view_array_with_stride(ptr, ldab - 1, ju - j); m.matrix.tda = ldab - 1; /* unskew matrix */ gsl_blas_dger(-1.0, &y.vector, &x.vector, &m.matrix); } } } return GSL_SUCCESS; } } gsl-2.7.1/linalg/luc.c0000644016036000116100000003712114151556700011433 00000000000000/* linalg/luc.c * * Copyright (C) 2001, 2007, 2009 Brian Gough * Copyright (C) 2019 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 "recurse.h" static int LU_decomp_L2 (gsl_matrix_complex * A, gsl_vector_uint * ipiv); static int LU_decomp_L3 (gsl_matrix_complex * A, gsl_vector_uint * ipiv); static int singular (const gsl_matrix_complex * LU); static int apply_pivots(gsl_matrix_complex * A, const gsl_vector_uint * ipiv); /* 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) { const size_t M = A->size1; if (p->size != M) { GSL_ERROR ("permutation length must match matrix size1", GSL_EBADLEN); } else { int status; const size_t N = A->size2; const size_t minMN = GSL_MIN(M, N); gsl_vector_uint * ipiv = gsl_vector_uint_alloc(minMN); gsl_matrix_complex_view AL = gsl_matrix_complex_submatrix(A, 0, 0, M, minMN); size_t i; status = LU_decomp_L3 (&AL.matrix, ipiv); /* process remaining right matrix */ if (M < N) { gsl_matrix_complex_view AR = gsl_matrix_complex_submatrix(A, 0, M, M, N - M); /* apply pivots to AR */ apply_pivots(&AR.matrix, ipiv); /* AR = AL^{-1} AR */ gsl_blas_ztrsm(CblasLeft, CblasLower, CblasNoTrans, CblasUnit, GSL_COMPLEX_ONE, &AL.matrix, &AR.matrix); } /* convert ipiv array to permutation */ gsl_permutation_init(p); *signum = 1; for (i = 0; i < minMN; ++i) { unsigned int pivi = gsl_vector_uint_get(ipiv, i); if (p->data[pivi] != p->data[i]) { size_t tmp = p->data[pivi]; p->data[pivi] = p->data[i]; p->data[i] = tmp; *signum = -(*signum); } } gsl_vector_uint_free(ipiv); return status; } } /* LU_decomp_L2 LU decomposition with partial pivoting using Level 2 BLAS Inputs: A - on input, matrix to be factored; on output, L and U factors ipiv - (output) array containing row swaps Notes: 1) Based on LAPACK ZGETF2 */ static int LU_decomp_L2 (gsl_matrix_complex * A, gsl_vector_uint * ipiv) { const size_t M = A->size1; const size_t N = A->size2; const size_t minMN = GSL_MIN(M, N); if (ipiv->size != minMN) { GSL_ERROR ("ipiv length must equal MIN(M,N)", GSL_EBADLEN); } else { size_t i, j; for (j = 0; j < minMN; ++j) { /* find maximum in the j-th column */ gsl_vector_complex_view v = gsl_matrix_complex_subcolumn(A, j, j, M - j); size_t j_pivot = j + gsl_blas_izamax(&v.vector); gsl_vector_complex_view v1, v2; gsl_vector_uint_set(ipiv, j, j_pivot); if (j_pivot != j) { /* swap rows j and j_pivot */ v1 = gsl_matrix_complex_row(A, j); v2 = gsl_matrix_complex_row(A, j_pivot); gsl_blas_zswap(&v1.vector, &v2.vector); } if (j < M - 1) { gsl_complex Ajj = gsl_matrix_complex_get(A, j, j); gsl_complex Ajjinv = gsl_complex_inverse(Ajj); if (gsl_complex_abs(Ajj) >= GSL_DBL_MIN) { v1 = gsl_matrix_complex_subcolumn(A, j, j + 1, M - j - 1); gsl_blas_zscal(Ajjinv, &v1.vector); } else { for (i = 1; i < M - j; ++i) { gsl_complex * ptr = gsl_matrix_complex_ptr(A, j + i, j); *ptr = gsl_complex_mul(*ptr, Ajjinv); } } } if (j < minMN - 1) { gsl_matrix_complex_view A22 = gsl_matrix_complex_submatrix(A, j + 1, j + 1, M - j - 1, N - j - 1); v1 = gsl_matrix_complex_subcolumn(A, j, j + 1, M - j - 1); v2 = gsl_matrix_complex_subrow(A, j, j + 1, N - j - 1); gsl_blas_zgeru(GSL_COMPLEX_NEGONE, &v1.vector, &v2.vector, &A22.matrix); } } return GSL_SUCCESS; } } /* LU_decomp_L3 LU decomposition with partial pivoting using Level 3 BLAS Inputs: A - on input, matrix to be factored; on output, L and U factors ipiv - (output) array containing row swaps Notes: 1) Based on ReLAPACK DGETRF */ static int LU_decomp_L3 (gsl_matrix_complex * A, gsl_vector_uint * ipiv) { const size_t M = A->size1; const size_t N = A->size2; if (M < N) { GSL_ERROR ("matrix must have M >= N", GSL_EBADLEN); } else if (ipiv->size != GSL_MIN(M, N)) { GSL_ERROR ("ipiv length must equal MIN(M,N)", GSL_EBADLEN); } else if (N <= CROSSOVER_LU) { /* use Level 2 algorithm */ return LU_decomp_L2(A, ipiv); } else { /* * partition matrix: * * N1 N2 * N1 [ A11 A12 ] * M2 [ A21 A22 ] * * and * N1 N2 * M [ AL AR ] */ int status; const size_t N1 = GSL_LINALG_SPLIT_COMPLEX(N); const size_t N2 = N - N1; const size_t M2 = M - N1; gsl_matrix_complex_view A11 = gsl_matrix_complex_submatrix(A, 0, 0, N1, N1); gsl_matrix_complex_view A12 = gsl_matrix_complex_submatrix(A, 0, N1, N1, N2); gsl_matrix_complex_view A21 = gsl_matrix_complex_submatrix(A, N1, 0, M2, N1); gsl_matrix_complex_view A22 = gsl_matrix_complex_submatrix(A, N1, N1, M2, N2); gsl_matrix_complex_view AL = gsl_matrix_complex_submatrix(A, 0, 0, M, N1); gsl_matrix_complex_view AR = gsl_matrix_complex_submatrix(A, 0, N1, M, N2); /* * partition ipiv = [ ipiv1 ] N1 * [ ipiv2 ] N2 */ gsl_vector_uint_view ipiv1 = gsl_vector_uint_subvector(ipiv, 0, N1); gsl_vector_uint_view ipiv2 = gsl_vector_uint_subvector(ipiv, N1, N2); size_t i; /* recursion on (AL, ipiv1) */ status = LU_decomp_L3(&AL.matrix, &ipiv1.vector); if (status) return status; /* apply ipiv1 to AR */ apply_pivots(&AR.matrix, &ipiv1.vector); /* A12 = A11^{-1} A12 */ gsl_blas_ztrsm(CblasLeft, CblasLower, CblasNoTrans, CblasUnit, GSL_COMPLEX_ONE, &A11.matrix, &A12.matrix); /* A22 = A22 - A21 * A12 */ gsl_blas_zgemm(CblasNoTrans, CblasNoTrans, GSL_COMPLEX_NEGONE, &A21.matrix, &A12.matrix, GSL_COMPLEX_ONE, &A22.matrix); /* recursion on (A22, ipiv2) */ status = LU_decomp_L3(&A22.matrix, &ipiv2.vector); if (status) return status; /* apply pivots to A21 */ apply_pivots(&A21.matrix, &ipiv2.vector); /* shift pivots */ for (i = 0; i < N2; ++i) { unsigned int * ptr = gsl_vector_uint_ptr(&ipiv2.vector, i); *ptr += N1; } 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) { 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 (inverse->size1 != LU->size1 || inverse->size2 != LU->size2) { GSL_ERROR ("inverse matrix must match LU matrix dimensions", GSL_EBADLEN); } else { gsl_matrix_complex_memcpy(inverse, LU); return gsl_linalg_complex_LU_invx(inverse, p); } } int gsl_linalg_complex_LU_invx (gsl_matrix_complex * LU, const gsl_permutation * p) { 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 (singular (LU)) { GSL_ERROR ("matrix is singular", GSL_EDOM); } else { int status; const size_t N = LU->size1; size_t i; /* compute U^{-1} */ status = gsl_linalg_complex_tri_invert(CblasUpper, CblasNonUnit, LU); if (status) return status; /* compute L^{-1} */ status = gsl_linalg_complex_tri_invert(CblasLower, CblasUnit, LU); if (status) return status; /* compute U^{-1} L^{-1} */ status = gsl_linalg_complex_tri_UL(LU); if (status) return status; /* apply permutation to columns of A^{-1} */ for (i = 0; i < N; ++i) { gsl_vector_complex_view v = gsl_matrix_complex_row(LU, i); gsl_permute_vector_complex_inverse(p, &v.vector); } return GSL_SUCCESS; } } 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; } static int apply_pivots(gsl_matrix_complex * A, const gsl_vector_uint * ipiv) { if (A->size1 < ipiv->size) { GSL_ERROR("matrix does not match pivot vector", GSL_EBADLEN); } else { size_t i; for (i = 0; i < ipiv->size; ++i) { size_t pi = gsl_vector_uint_get(ipiv, i); if (i != pi) { /* swap rows i and pi */ gsl_vector_complex_view v1 = gsl_matrix_complex_row(A, i); gsl_vector_complex_view v2 = gsl_matrix_complex_row(A, pi); gsl_blas_zswap(&v1.vector, &v2.vector); } } return GSL_SUCCESS; } } gsl-2.7.1/linalg/hh.c0000644016036000116100000001105413373111455011243 00000000000000/* 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-2.7.1/linalg/ql.c0000644016036000116100000001242313570652352011266 00000000000000/* linalg/ql.c * * Copyright (C) 2019 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 /* Factorise a general M x N matrix A into * * A = Q L * * where Q is orthogonal (M x M) and L is lower triangular (M x N). * * 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. * * 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 = [A(1,N-k+i), A(2,N-k+i), ... , A(M-k+i,N-k+i), 1, 0, ..., 0] * * This storage scheme is the same as in LAPACK. */ /* gsl_linalg_QL_decomp() Perform QL decomposition of a matrix A Inputs: A - M-by-N matrix tau - (output) Householder coefficients, length N Notes: 1) The K = MIN(M, N) Householder scalars are stored in tau(N-K+1:N) on output; the rest of tau is used as temporary workspace */ int gsl_linalg_QL_decomp (gsl_matrix * A, gsl_vector * tau) { const size_t M = A->size1; const size_t N = A->size2; if (tau->size != N) { GSL_ERROR ("size of tau must be N", GSL_EBADLEN); } else { const size_t K = GSL_MIN(M, N); size_t i; for (i = 0; i < K; i++) { /* compute the Householder transformation to annihilate the (N-K+i)-th column of the matrix */ gsl_vector_view c = gsl_matrix_subcolumn (A, N - i - 1, 0, M - i); double * alpha = gsl_matrix_ptr(A, M - i - 1, N - i - 1); double tau_j = gsl_linalg_householder_transform2 (alpha, &(c.vector)); /* apply the transformation to A(1:M-i,1:N-i-2) from the left */ if (i + 1 < N) { gsl_vector_view work = gsl_vector_subvector(tau, 0, N - i - 1); gsl_matrix_view m = gsl_matrix_submatrix (A, 0, 0, M - i, N - i - 1); double tmp = *alpha; *alpha = 1.0; gsl_linalg_householder_left (tau_j, &(c.vector), &(m.matrix), &work.vector); *alpha = tmp; } gsl_vector_set (tau, N - i - 1, tau_j); } return GSL_SUCCESS; } } /* form the orthogonal matrix Q from the packed QL matrix */ int gsl_linalg_QL_unpack (const gsl_matrix * QL, const gsl_vector * tau, gsl_matrix * Q, gsl_matrix * L) { const size_t M = QL->size1; const size_t N = QL->size2; if (Q->size1 != M || Q->size2 != M) { GSL_ERROR ("Q matrix must be M x M", GSL_ENOTSQR); } else if (L->size1 != M || L->size2 != N) { GSL_ERROR ("L matrix must be M x N", GSL_ENOTSQR); } else if (tau->size != N) { GSL_ERROR ("size of tau must be N", GSL_EBADLEN); } else { const size_t K = GSL_MIN(M, N); size_t i; /* initialize Q to the identity */ gsl_matrix_set_identity (Q); for (i = 0; i < K; ++i) { gsl_vector_const_view h = gsl_matrix_const_subcolumn (QL, N - K + i, 0, M - K + i + 1); gsl_matrix_view m = gsl_matrix_submatrix (Q, 0, 0, M - K + i + 1, M - K + i + 1); gsl_vector_view work = gsl_matrix_subcolumn(L, 0, 0, M - K + i + 1); double ti = gsl_vector_get (tau, N - K + i); double * ptr = gsl_matrix_ptr((gsl_matrix *) QL, M - K + i, N - K + i); double tmp = *ptr; *ptr = 1.0; gsl_linalg_householder_left (ti, &h.vector, &m.matrix, &work.vector); *ptr = tmp; } /* form the left triangular matrix L from a packed QL matrix */ gsl_matrix_set_zero(L); if (M >= N) { gsl_matrix_const_view src = gsl_matrix_const_submatrix(QL, M - N, 0, N, N); gsl_matrix_view dest = gsl_matrix_submatrix(L, M - N, 0, N, N); gsl_matrix_tricpy(CblasLower, CblasNonUnit, &dest.matrix, &src.matrix); } else { gsl_matrix_const_view src1 = gsl_matrix_const_submatrix(QL, 0, 0, M, N - M); gsl_matrix_view dest1 = gsl_matrix_submatrix(L, 0, 0, M, N - M); gsl_matrix_const_view src2 = gsl_matrix_const_submatrix(QL, 0, N - M, M, M); gsl_matrix_view dest2 = gsl_matrix_submatrix(L, 0, N - M, M, M); gsl_matrix_memcpy(&dest1.matrix, &src1.matrix); gsl_matrix_tricpy(CblasLower, CblasNonUnit, &dest2.matrix, &src2.matrix); } return GSL_SUCCESS; } } gsl-2.7.1/linalg/qr.c0000644016036000116100000004144413666045422011301 00000000000000/* linalg/qr.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough * Copyright (C) 2019 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 #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 N = A->size2; if (tau->size != N) { return gsl_linalg_QR_decomp_old (A, tau); } else { const size_t M = A->size1; 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 = gsl_matrix_subcolumn (A, i, i, M - i); double tau_i = gsl_linalg_householder_transform (&(c.vector)); double * ptr = gsl_vector_ptr(&(c.vector), 0); 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_vector_view work = gsl_vector_subvector(tau, i + 1, N - i - 1); double tmp = *ptr; *ptr = 1.0; gsl_linalg_householder_left(tau_i, &(c.vector), &(m.matrix), &(work.vector)); *ptr = tmp; } } return GSL_SUCCESS; } } int gsl_linalg_QR_decomp_old (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 = gsl_matrix_subcolumn (A, i, 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 h = gsl_matrix_const_subcolumn (QR, i, 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 at least 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 h = gsl_matrix_const_subcolumn (QR, i, 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; } } int gsl_linalg_QR_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_rcond(CblasUpper, &R.matrix, rcond, work); return status; } } gsl-2.7.1/linalg/qr_band.c0000644016036000116100000001401113706330177012252 00000000000000/* linalg/qr_band.c * * Copyright (C) 2020 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 /* Factorise a (p,q) banded M x N matrix A into * * A = Q R * * where Q is orthogonal (M x M) and R is upper triangular (M x N). * * Example with M = 7, N = 6, (p,q) = (2,1) * * A = [ A11 A12 0 0 0 0 ] * [ A21 A22 A23 0 0 0 ] * [ A31 A32 A33 A34 0 0 ] * [ 0 A42 A43 A44 A45 0 ] * [ 0 0 A53 A54 A55 A56 ] * [ 0 0 0 A64 A65 A66 ] * [ 0 0 0 0 A75 A76 ] * * AB has dimensions N-by-(2p + q + 1) * * INPUT: OUTPUT: * * AB = [ * * * A11 A21 A31 ] AB = [ * * * R11 V21 V31 ] * [ * * A12 A22 A32 A42 ] [ * * R12 R22 V32 V42 ] * [ * 0 A23 A33 A43 A53 ] [ * R13 R23 R33 V43 V53 ] * [ 0 0 A34 A44 A54 A64 ] [ R14 R24 R34 R44 V54 V64 ] * [ 0 0 A45 A55 A65 A75 ] [ R25 R35 R45 R55 V65 V75 ] * [ 0 0 A56 A66 A76 * ] [ R36 R46 R56 R66 V76 * ] * -p-- -q- -1- ---p--- ---p--- -q- -1- ---p--- * * 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 */ int gsl_linalg_QR_band_decomp_L2 (const size_t M, const size_t p, const size_t q, gsl_matrix * AB, gsl_vector * tau) { const size_t N = AB->size1; if (tau->size != N) { GSL_ERROR ("tau must have length N", GSL_EBADLEN); } else if (AB->size2 != 2*p + q + 1) { GSL_ERROR ("dimensions of AB are inconsistent with (p,q)", GSL_EBADLEN); } else { const size_t minMN = GSL_MIN(M, N); size_t j; /* set AB(:,1:p) to zero */ if (p > 0) { gsl_matrix_view m = gsl_matrix_submatrix(AB, 0, 0, N, p); gsl_matrix_set_zero(&m.matrix); } for (j = 0; j < minMN; ++j) { /* Compute the Householder transformation to reduce the j-th column of the matrix to a multiple of the j-th unit vector */ size_t k1 = GSL_MIN(p + 1, M - j); /* number of non-zero elements of this column, including diagonal element */ size_t k2 = GSL_MIN(p + q, N - j - 1); /* number of columns to update */ gsl_vector_view c = gsl_matrix_subrow(AB, j, p + q, k1); double tau_j = gsl_linalg_householder_transform (&(c.vector)); double * ptr = gsl_vector_ptr(&(c.vector), 0); gsl_vector_set (tau, j, tau_j); /* apply the transformation to the remaining columns */ if (k2 > 0) { gsl_matrix_view m = gsl_matrix_submatrix (AB, j + 1, p + q - 1, k2, k1); gsl_vector_view work = gsl_vector_subvector(tau, j + 1, k2); double tmp = *ptr; m.matrix.tda -= 1; /* unskew matrix */ /* we want to compute H*A(j:j+k1-1,j+1:j+k2), but due to our using row-major order, the * matrix m contains A(j:j+k1-1,j+1:j+k2)^T. So therefore we apply H from the right, * * [H*A]^T = A^T H^T = A^T H */ *ptr = 1.0; gsl_linalg_householder_right(tau_j, &(c.vector), &(m.matrix), &(work.vector)); *ptr = tmp; } } return GSL_SUCCESS; } } int gsl_linalg_QR_band_unpack_L2 (const size_t p, const size_t q, const gsl_matrix * QRB, const gsl_vector * tau, gsl_matrix * Q, gsl_matrix * R) { const size_t M = Q->size1; const size_t N = QRB->size1; if (Q->size2 != M) { GSL_ERROR ("Q matrix must be square", 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 at least MIN(M,N)", GSL_EBADLEN); } else if (QRB->size2 != 2*p + q + 1) { GSL_ERROR ("dimensions of QRB are inconsistent with (p,q)", GSL_EBADLEN); } else { size_t i; /* form matrix Q */ gsl_matrix_set_identity (Q); for (i = GSL_MIN (M, N); i-- > 0;) { size_t k1 = GSL_MIN(p + 1, M - i); /* number of non-zero elements of this column, including diagonal element */ gsl_vector_const_view h = gsl_matrix_const_subrow(QRB, i, p + q, k1); gsl_matrix_view m = gsl_matrix_submatrix (Q, i, i, k1, M - i); double ti = gsl_vector_get (tau, i); gsl_vector_view work = gsl_matrix_subcolumn(R, 0, 0, M - i); double * ptr = gsl_vector_ptr((gsl_vector *) &h.vector, 0); double tmp = *ptr; *ptr = 1.0; gsl_linalg_householder_left (ti, &h.vector, &m.matrix, &work.vector); *ptr = tmp; } /* form matrix R */ gsl_matrix_set_zero(R); for (i = 0; i <= GSL_MIN(p + q, N - 1); ++i) { gsl_vector_const_view src = gsl_matrix_const_subcolumn(QRB, p + q - i, i, GSL_MIN(M, N - i)); gsl_vector_view dest = gsl_matrix_superdiagonal(R, i); gsl_vector_memcpy(&dest.vector, &src.vector); } return GSL_SUCCESS; } } gsl-2.7.1/linalg/qrc.c0000644016036000116100000002325113667475542011453 00000000000000/* linalg/qrc.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough * Copyright (C) 2017 Christian Krueger * Copyright (C) 2020 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 by C. Krueger */ #include #include #include #include #include #include #include #include #include #include /* Factorise a general complex-valued M x N matrix A into * * A = Q R * * where Q is unitary (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_complex_QR_decomp (gsl_matrix_complex * A, gsl_vector_complex * tau) { const size_t M = A->size1; const size_t N = A->size2; if (tau->size != N) { GSL_ERROR ("size of tau must be 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_complex_view c = gsl_matrix_complex_subcolumn (A, i, i, M - i); gsl_complex tau_i = gsl_linalg_complex_householder_transform (&(c.vector)); gsl_vector_complex_set (tau, i, tau_i); /* apply the transformation to the remaining columns and update the norms */ if (i + 1 < N) { gsl_matrix_complex_view m = gsl_matrix_complex_submatrix (A, i, i + 1, M - i, N - i - 1); gsl_complex tau_i_conj = gsl_complex_conjugate(tau_i); gsl_vector_complex_view work = gsl_vector_complex_subvector(tau, i + 1, N - i - 1); gsl_linalg_complex_householder_left(tau_i_conj, &(c.vector), &(m.matrix), &(work.vector)); } } return GSL_SUCCESS; } } /* Solves the system A x = b using the QR factorisation, * R x = Q^H b * * to obtain x. */ int gsl_linalg_complex_QR_solve (const gsl_matrix_complex * QR, const gsl_vector_complex * tau, const gsl_vector_complex * b, gsl_vector_complex * 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_complex_memcpy (x, b); /* solve for x */ gsl_linalg_complex_QR_svx (QR, tau, x); return GSL_SUCCESS; } } /* Solves the system A x = b in place using the QR factorisation, * R x = Q^H b * * to obtain x. */ int gsl_linalg_complex_QR_svx (const gsl_matrix_complex * QR, const gsl_vector_complex * tau, gsl_vector_complex * 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^H b */ gsl_linalg_complex_QR_QHvec (QR, tau, x); /* solve R x = rhs, storing x in-place */ gsl_blas_ztrsv (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_complex_QR_lssolve (const gsl_matrix_complex * QR, const gsl_vector_complex * tau, const gsl_vector_complex * b, gsl_vector_complex * x, gsl_vector_complex * 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_complex_const_view R = gsl_matrix_complex_const_submatrix (QR, 0, 0, N, N); gsl_vector_complex_view c = gsl_vector_complex_subvector(residual, 0, N); gsl_vector_complex_memcpy(residual, b); /* compute rhs = Q^H b */ gsl_linalg_complex_QR_QHvec (QR, tau, residual); /* solve R x = rhs */ gsl_vector_complex_memcpy(x, &(c.vector)); gsl_blas_ztrsv (CblasUpper, CblasNoTrans, CblasNonUnit, &(R.matrix), x); /* compute residual = b - A x = Q (Q^H b - R x) */ gsl_vector_complex_set_zero(&(c.vector)); gsl_linalg_complex_QR_Qvec(QR, tau, residual); return GSL_SUCCESS; } } /* form the product v := Q^H v from a QR factorized matrix */ int gsl_linalg_complex_QR_QHvec (const gsl_matrix_complex * QR, const gsl_vector_complex * tau, gsl_vector_complex * v) { const size_t M = QR->size1; const size_t N = QR->size2; if (tau->size != N) { GSL_ERROR ("size of tau must be N", GSL_EBADLEN); } else if (v->size != M) { GSL_ERROR ("vector size must be M", GSL_EBADLEN); } else { size_t i; /* compute Q^H v */ for (i = 0; i < GSL_MIN (M, N); i++) { gsl_vector_complex_const_view h = gsl_matrix_complex_const_subcolumn (QR, i, i, M - i); gsl_vector_complex_view w = gsl_vector_complex_subvector (v, i, M - i); gsl_complex ti = gsl_vector_complex_get (tau, i); gsl_complex ti_conj = gsl_complex_conjugate(ti); gsl_linalg_complex_householder_hv (ti_conj, &(h.vector), &(w.vector)); } return GSL_SUCCESS; } } int gsl_linalg_complex_QR_Qvec (const gsl_matrix_complex * QR, const gsl_vector_complex * tau, gsl_vector_complex * 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_complex_const_view c = gsl_matrix_complex_const_column (QR, i); gsl_vector_complex_const_view h = gsl_vector_complex_const_subvector (&(c.vector), i, M - i); gsl_vector_complex_view w = gsl_vector_complex_subvector (v, i, M - i); gsl_complex ti = gsl_vector_complex_get (tau, i); /* we do not need the conjugate of ti here */ gsl_linalg_complex_householder_hv (ti, &h.vector, &w.vector); } return GSL_SUCCESS; } } /* form the unitary matrix Q from the packed QR matrix */ int gsl_linalg_complex_QR_unpack (const gsl_matrix_complex * QR, const gsl_vector_complex * tau, gsl_matrix_complex * Q, gsl_matrix_complex * 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 != N) { GSL_ERROR ("size of tau must be N", GSL_EBADLEN); } else { size_t i, j; /* initialize Q to the identity */ gsl_matrix_complex_set_identity (Q); for (i = GSL_MIN (M, N); i-- > 0;) { gsl_vector_complex_const_view c = gsl_matrix_complex_const_column (QR, i); gsl_vector_complex_const_view h = gsl_vector_complex_const_subvector (&c.vector, i, M - i); gsl_matrix_complex_view m = gsl_matrix_complex_submatrix (Q, i, i, M - i, M - i); gsl_complex ti = gsl_vector_complex_get (tau, i); gsl_vector_complex_view work = gsl_matrix_complex_subcolumn(R, 0, 0, M - i); /* we do not need the conjugate of ti here */ gsl_linalg_complex_householder_left (ti, &h.vector, &m.matrix, &work.vector); } /* 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_complex_set (R, i, j, GSL_COMPLEX_ZERO); for (j = i; j < N; j++) gsl_matrix_complex_set (R, i, j, gsl_matrix_complex_get (QR, i, j)); } return GSL_SUCCESS; } } gsl-2.7.1/linalg/qrpt.c0000644016036000116100000004123013517376172011642 00000000000000/* 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) (log(absmax) / M_LN2); /* can't use log2 since its not ANSI */ 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_rcond(CblasUpper, &R.matrix, rcond, work); return status; } } gsl-2.7.1/linalg/qr_ud.c0000644016036000116100000004413514151556700011765 00000000000000/* linalg/qr_ud.c * * Copyright (C) 2020 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 the QR factorization of a matrix * using the recursive Level 3 BLAS algorithm of Elmroth and Gustavson with * additional modifications courtesy of Julien Langou. */ static int aux_QR_TRD_decomp (gsl_matrix * U, gsl_matrix * A, const gsl_vector * D, gsl_matrix * T); static double qrtd_householder_transform (double *v0, double *v1); static double qrtrd_householder_transform (double *v0, gsl_vector * v, double *d); /* gsl_linalg_QR_UD_decomp() Compute the QR decomposition of the "triangle on top of diagonal" matrix [ U ] = Q [ R ] [ D ] [ 0 ] where U is N-by-N upper triangular, D is N-by-N diagonal Inputs: U - on input, upper triangular N-by-N matrix on output, R factor in upper triangle D - diagonal N-by-N matrix Y - (output) upper triangular N-by-N matrix (lower part of V) T - (output) block reflector matrix, N-by-N Notes: 1) Based on the Elmroth/Gustavson algorithm, taking into account the sparse structure of the U,S matrices 2) The Householder matrix V has the special form: N V = [ I ] N [ Y ] N with Y upper triangular 3) The orthogonal matrix is Q = I - V T V^T */ int gsl_linalg_QR_UD_decomp (gsl_matrix * U, const gsl_vector * D, gsl_matrix * Y, gsl_matrix * T) { const size_t N = U->size1; if (N != U->size2) { GSL_ERROR ("U matrix must be square", GSL_ENOTSQR); } else if (D->size != N) { GSL_ERROR ("D matrix does not match dimensions of U", GSL_EBADLEN); } else if (Y->size1 != Y->size2) { GSL_ERROR ("Y matrix must be square", GSL_ENOTSQR); } else if (Y->size1 != N) { GSL_ERROR ("Y matrix does not match dimensions of U", GSL_EBADLEN); } else if (T->size1 != N || T->size2 != N) { GSL_ERROR ("T matrix has wrong dimensions", GSL_EBADLEN); } else if (N == 1) { /* base case, compute Householder transform for single column matrix */ double * T00 = gsl_matrix_ptr(T, 0, 0); double * U00 = gsl_matrix_ptr(U, 0, 0); double * Y00 = gsl_matrix_ptr(Y, 0, 0); *Y00 = gsl_vector_get(D, 0); *T00 = qrtd_householder_transform(U00, Y00); return GSL_SUCCESS; } else { /* * partition matrices: * * N1 N2 N1 N2 * N1 [ U11 U12 ] and N1 [ T11 T12 ] * N2 [ 0 U22 ] N2 [ 0 T22 ] * N1 [ D11 D12 ] * N2 [ 0 D22 ] */ int status; const size_t N1 = N / 2; const size_t N2 = N - N1; gsl_matrix_view U11 = gsl_matrix_submatrix(U, 0, 0, N1, N1); gsl_matrix_view U12 = gsl_matrix_submatrix(U, 0, N1, N1, N2); gsl_matrix_view U22 = gsl_matrix_submatrix(U, N1, N1, N2, N2); gsl_vector_const_view D1 = gsl_vector_const_subvector(D, 0, N1); gsl_vector_const_view D2 = gsl_vector_const_subvector(D, N1, N2); gsl_matrix_view Y11 = gsl_matrix_submatrix(Y, 0, 0, N1, N1); gsl_matrix_view Y12 = gsl_matrix_submatrix(Y, 0, N1, N1, N2); gsl_matrix_view T11 = gsl_matrix_submatrix(T, 0, 0, N1, N1); gsl_matrix_view T12 = gsl_matrix_submatrix(T, 0, N1, N1, N2); gsl_matrix_view T22 = gsl_matrix_submatrix(T, N1, N1, N2, N2); gsl_matrix_view m; /* * Eq. 2: recursively factor * * N1 N1 * N1 [ U11 ] = Q1 [ R11 ] N1 * N2 [ 0 ] [ 0 ] N2 * N1 [ D11 ] [ 0 ] N1 * N2 [ 0 ] [ 0 ] N2 */ status = gsl_linalg_QR_UD_decomp(&U11.matrix, &D1.vector, &Y11.matrix, &T11.matrix); if (status) return status; /* * Eq. 3: * * N2 N2 N2 * N1 [ R12 ] = Q1^T [ U12 ] = [ U12 - W ] N1 * N2 [ U22~ ] [ U22 ] [ U22 ] N2 * N1 [ D12~ ] [ 0 ] [ - V31 W ] N1 * N2 [ D22~ ] [ D22 ] [ D22 ] N2 * * where W = T11^T U12, using T12 as temporary storage, and * * N1 * V1 = [ I ] N1 * [ 0 ] N2 * [ V31 ] N1 * [ 0 ] N2 */ gsl_matrix_memcpy(&T12.matrix, &U12.matrix); /* W := U12 */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasTrans, CblasNonUnit, 1.0, &T11.matrix, &T12.matrix); /* W := T11^T W */ gsl_matrix_sub(&U12.matrix, &T12.matrix); /* R12 := U12 - W */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, -1.0, &Y11.matrix, &T12.matrix); /* W := -V31 W */ gsl_matrix_memcpy(&Y12.matrix, &T12.matrix); /* Y12 := -V31 W */ /* * Eq. 4: factor the "triangle on top of rectangle on top of diagonal" matrix * * N2 [ U22 ] = Q2~ [ R22 ] N2 * N1 [ Y12 ] [ 0 ] N1 * N2 [ D22 ] [ 0 ] N2 */ m = gsl_matrix_submatrix(Y, 0, N1, N, N2); status = aux_QR_TRD_decomp(&U22.matrix, &m.matrix, &D2.vector, &T22.matrix); if (status) return status; /* * Eq. 13: update T12 := -T11 * V1^T * V2 * T22 * * where: * * N1 N2 * V1 = [ I ] N1 V2 = [ 0 ] N1 * [ 0 ] N2 [ I ] N2 * [ V31~ ] N1 [ V32~ ] N1 * [ 0 ] N2 [ V42~ ] N2 * * Note: V1^T V2 = V31~^T V32~ */ gsl_matrix_memcpy(&T12.matrix, &Y12.matrix); /* T12 := V32~ */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasTrans, CblasNonUnit, 1.0, &Y11.matrix, &T12.matrix); /* T12 := V31~^T V32~ */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, -1.0, &T11.matrix, &T12.matrix); /* T12 := -T11 * T12 */ gsl_blas_dtrmm(CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, 1.0, &T22.matrix, &T12.matrix); /* T12 := T12 * T22 */ return GSL_SUCCESS; } } /* Find the least squares solution to the overdetermined system * * [ U ] x = b * [ D ] * * using the QR factorization [ U; D ] = Q R. * * Inputs: R - upper triangular R matrix, N-by-N * Y - upper triangular Y matrix, N-by-N * T - upper triangular block reflector, N-by-N * b - right hand side, size 2*N * x - (output) solution, size 2*N * x(1:N) = least squares solution vector * x(N+1:2*N) = vector whose norm equals ||b - Ax|| * work - workspace, size N */ int gsl_linalg_QR_UD_lssolve (const gsl_matrix * R, const gsl_matrix * Y, const gsl_matrix * T, const gsl_vector * b, gsl_vector * x, gsl_vector * work) { const size_t N = R->size1; const size_t M = 2 * N; if (R->size2 != N) { GSL_ERROR ("R matrix must be square", GSL_ENOTSQR); } else if (Y->size1 != Y->size2) { GSL_ERROR ("Y matrix must be square", GSL_ENOTSQR); } else if (Y->size1 != N) { GSL_ERROR ("Y and R must have same dimensions", GSL_EBADLEN); } else if (T->size1 != N || T->size2 != N) { GSL_ERROR ("T matrix must be N-by-N", GSL_EBADLEN); } else if (M != b->size) { GSL_ERROR ("matrix size must match b size", GSL_EBADLEN); } else if (M != x->size) { GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN); } else if (N != work->size) { GSL_ERROR ("workspace must be length N", GSL_EBADLEN); } else { return gsl_linalg_QR_UU_lssolve(R, Y, T, b, x, work); } } /* aux_QR_TRD_decomp() Compute the QR decomposition of the "triangle on top of rectangle on top of diagonal" matrix [ U ] = Q [ R ] [ A ] [ 0 ] [ D ] [ 0 ] where U is N-by-N upper triangular, A is M-by-N dense, D is N-by-N diagonal Inputs: U - on input, upper triangular N-by-N matrix on output, R factor in upper triangle A - on input, A is stored in A(1:M,1:N) on output, Y is stored in A(1:M+N,1:N) size (M+N)-by-N D - diagonal N-by-N matrix T - (output) block reflector matrix, N-by-N Notes: 1) Based on the Elmroth/Gustavson algorithm, taking into account the sparse structure of the U,S matrices 2) The Householder matrix V has the special form: N V = [ I ] N [ Y ] M+N with Y upper trapezoidal 3) The orthogonal matrix is Q = I - V T V^T */ static int aux_QR_TRD_decomp (gsl_matrix * U, gsl_matrix * A, const gsl_vector * D, gsl_matrix * T) { const size_t N = U->size1; if (N != U->size2) { GSL_ERROR ("U matrix must be square", GSL_ENOTSQR); } else if (A->size1 <= N) { GSL_ERROR ("A matrix must have > N rows", GSL_EBADLEN); } else if (D->size != N) { GSL_ERROR ("D matrix does not match dimensions of U", GSL_EBADLEN); } else if (T->size1 != N || T->size2 != N) { GSL_ERROR ("T matrix has wrong dimensions", GSL_EBADLEN); } else if (N == 1) { /* base case, compute Householder transform for single column matrix */ const size_t M = A->size1 - N; double * T00 = gsl_matrix_ptr(T, 0, 0); double * U00 = gsl_matrix_ptr(U, 0, 0); gsl_vector_view v = gsl_matrix_subcolumn(A, 0, 0, M); double * D00 = gsl_matrix_ptr(A, M, 0); *D00 = gsl_vector_get(D, 0); *T00 = qrtrd_householder_transform(U00, &v.vector, D00); return GSL_SUCCESS; } else { /* * partition matrices: * * N1 N2 N1 N2 * N1 [ U11 U12 ] and N1 [ T11 T12 ] * N2 [ 0 U22 ] N2 [ 0 T22 ] * N1 [ D11 D12 ] * N2 [ 0 D22 ] */ int status; const size_t M = A->size1 - N; const size_t N1 = N / 2; const size_t N2 = N - N1; gsl_matrix_view U11 = gsl_matrix_submatrix(U, 0, 0, N1, N1); gsl_matrix_view U12 = gsl_matrix_submatrix(U, 0, N1, N1, N2); gsl_matrix_view U22 = gsl_matrix_submatrix(U, N1, N1, N2, N2); gsl_matrix_view A1 = gsl_matrix_submatrix(A, 0, 0, M, N1); gsl_matrix_view A2 = gsl_matrix_submatrix(A, 0, N1, M, N2); gsl_vector_const_view D1 = gsl_vector_const_subvector(D, 0, N1); gsl_vector_const_view D2 = gsl_vector_const_subvector(D, N1, N2); gsl_matrix_view T11 = gsl_matrix_submatrix(T, 0, 0, N1, N1); gsl_matrix_view T12 = gsl_matrix_submatrix(T, 0, N1, N1, N2); gsl_matrix_view T22 = gsl_matrix_submatrix(T, N1, N1, N2, N2); gsl_matrix_view Y41 = gsl_matrix_submatrix(A, M, 0, N1, N1); gsl_matrix_view Y42 = gsl_matrix_submatrix(A, M, N1, N1, N2); gsl_matrix_view m; /* * Eq. 2: recursively factor * * N1 N1 * N1 [ U11 ] = Q1 [ R11 ] N1 * N2 [ 0 ] [ 0 ] N2 * M [ A1 ] [ 0 ] M * N1 [ D11 ] [ 0 ] N1 * N2 [ 0 ] [ 0 ] N2 */ m = gsl_matrix_submatrix(A, 0, 0, M + N1, N1); status = aux_QR_TRD_decomp(&U11.matrix, &m.matrix, &D1.vector, &T11.matrix); if (status) return status; /* * Eq. 3: * * N2 N2 N2 * N1 [ R12 ] = Q1^T [ U12 ] = [ U12 - W ] N1 * N2 [ U22~ ] [ U22 ] [ U22 ] N2 * M [ A2~ ] [ A2 ] [ A2 - V31 W ] M * N1 [ D12~ ] [ 0 ] [ - V41 W ] N1 * N2 [ D22~ ] [ D22 ] [ D22 ] N2 * * where W = T11^T ( U12 + V31^T A2 ), using T12 as temporary storage, and * * N1 * V1 = [ I ] N1 * [ 0 ] N2 * [ V31 ] M * [ V41 ] N1 * [ 0 ] N2 */ gsl_matrix_memcpy(&T12.matrix, &U12.matrix); /* W := U12 */ gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, &A1.matrix, &A2.matrix, 1.0, &T12.matrix); /* W := U12 + V31^T A2 */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasTrans, CblasNonUnit, 1.0, &T11.matrix, &T12.matrix); /* W := T11^T W */ gsl_matrix_sub(&U12.matrix, &T12.matrix); /* R12 := U12 - W */ gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, -1.0, &A1.matrix, &T12.matrix, 1.0, &A2.matrix); /* A2 := A2 - V31 W */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, -1.0, &Y41.matrix, &T12.matrix); /* W := -V41 W */ gsl_matrix_memcpy(&Y42.matrix, &T12.matrix); /* V42 := -431 W */ /* * Eq. 4: factor the "triangle on top of rectangle on top of diagonal" matrix * * N2 [ U22 ] = Q2~ [ R22 ] N2 * N1 [ Y12 ] [ 0 ] N1 * N2 [ D22 ] [ 0 ] N2 */ m = gsl_matrix_submatrix(A, 0, N1, M + N, N2); status = aux_QR_TRD_decomp(&U22.matrix, &m.matrix, &D2.vector, &T22.matrix); if (status) return status; /* * Eq. 13: update T12 := -T11 * V1^T * V2 * T22 * * where: * * N1 N2 * V1 = [ I ] N1 V2 = [ 0 ] N1 * [ 0 ] N2 [ I ] N2 * [ V31~ ] M [ V32~ ] M * [ V41~ ] N1 [ V42~ ] N1 * [ 0 ] N2 [ V52~ ] N2 * * Note: V1^T V2 = V31~^T V32~ + V41~^T V42~ */ gsl_matrix_memcpy(&T12.matrix, &Y42.matrix); /* T12 := V42~ */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasTrans, CblasNonUnit, 1.0, &Y41.matrix, &T12.matrix); /* T12 := V41~^T V42~ */ gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, &A1.matrix, &A2.matrix, 1.0, &T12.matrix); /* T12 := V31~^T V32~^T + V41~^T V42~ */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, -1.0, &T11.matrix, &T12.matrix); /* T12 := -T11 * T12 */ gsl_blas_dtrmm(CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, 1.0, &T22.matrix, &T12.matrix); /* T12 := T12 * T22 */ return GSL_SUCCESS; } } /* qrtd_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: B = [ U ] [ S ] where U,S are N-by-N upper triangular. 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 B, and so its structure will be: x = [ x0 ] <- 1 nonzero value for the diagonal element of U [ y0 ] <- 1 nonzero value for the diagonal element of S Inputs: v0 - pointer to diagonal element of U on input, v0 = x0; v1 - on input, pointer to diagonal element of S on output, householder vector v */ static double qrtd_householder_transform (double *v0, double *v1) { /* 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 = fabs(*v1); if (xnorm == 0) { return 0.0; /* tau = 0 */ } alpha = *v0; beta = - GSL_SIGN(alpha) * hypot(alpha, xnorm) ; tau = (beta - alpha) / beta ; { double s = (alpha - beta); if (fabs(s) > GSL_DBL_MIN) { *v1 /= s; *v0 = beta; } else { *v1 *= GSL_DBL_EPSILON / s; *v1 /= GSL_DBL_EPSILON; *v0 = beta; } } return tau; } /* qrtrd_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: B = [ U ] [ A ] [ D ] where U is N-by-N upper triangular A is M-by-N dense and D is N-by-N diagonal. 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 B, and so its structure will be: x = [ x0 ] <- 1 nonzero value for the diagonal element of S [ 0 ] <- N - j - 1 zeros, where j is column of matrix in [0,N-1] [ x ] <- M nonzero values for the dense part A Inputs: v0 - pointer to diagonal element of S on input, v0 = x0; v - on input, x vector on output, householder vector v d - on input, diagonal element of D on output, householder element */ static double qrtrd_householder_transform (double *v0, gsl_vector * v, double *d) { /* 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 ; 0 ; d] ||, ignoring zero part of vector */ double xnorm; xnorm = gsl_blas_dnrm2(v); xnorm = gsl_hypot(xnorm, *d); if (xnorm == 0) { return 0.0; /* tau = 0 */ } alpha = *v0; beta = - GSL_SIGN(alpha) * hypot(alpha, xnorm) ; tau = (beta - alpha) / beta ; { double s = (alpha - beta); if (fabs(s) > GSL_DBL_MIN) { gsl_blas_dscal (1.0 / s, v); *d /= s; *v0 = beta; } else { gsl_blas_dscal (GSL_DBL_EPSILON / s, v); gsl_blas_dscal (1.0 / GSL_DBL_EPSILON, v); *d *= GSL_DBL_EPSILON / s; *d /= GSL_DBL_EPSILON; *v0 = beta; } } return tau; } gsl-2.7.1/linalg/qr_ur.c0000644016036000116100000001673714151556700012012 00000000000000/* linalg/qr_ur.c * * Copyright (C) 2019, 2020 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 the QR factorization of a matrix * using the recursive Level 3 BLAS algorithm of Elmroth and Gustavson with * additional modifications courtesy of Julien Langou. */ static double qrtr_householder_transform (double *v0, gsl_vector * v); /* gsl_linalg_QR_UR_decomp() Compute the QR decomposition of the "triangle on top of rectangle" matrix [ S ] = Q [ R ] [ A ] [ 0 ] where S is N-by-N upper triangular and A is M-by-N dense. Inputs: S - on input, upper triangular N-by-N matrix on output, R factor in upper triangle A - on input, dense M-by-N matrix on output, Householder matrix V T - (output) block reflector matrix, N-by-N Notes: 1) Based on the Elmroth/Gustavson algorithm, taking into account the sparse structure of the S matrix 2) The Householder matrix V has the special form: N V = [ I ] N [ V~ ] M The matrix V~ is stored in A on output; the identity is not stored 3) The orthogonal matrix is Q = I - V T V^T */ int gsl_linalg_QR_UR_decomp (gsl_matrix * S, gsl_matrix * A, gsl_matrix * T) { const size_t M = A->size1; const size_t N = S->size1; if (N != S->size2) { GSL_ERROR ("S matrix must be square", GSL_ENOTSQR); } else if (N != A->size2) { GSL_ERROR ("S and A have different number of columns", GSL_EBADLEN); } else if (T->size1 != N || T->size2 != N) { GSL_ERROR ("T matrix has wrong dimensions", GSL_EBADLEN); } else if (N == 1) { /* base case, compute Householder transform for single column matrix */ double * T00 = gsl_matrix_ptr(T, 0, 0); double * S00 = gsl_matrix_ptr(S, 0, 0); gsl_vector_view v = gsl_matrix_column(A, 0); *T00 = qrtr_householder_transform(S00, &v.vector); return GSL_SUCCESS; } else { /* * partition matrices: * * N1 N2 N1 N2 * N1 [ S11 S12 ] and N1 [ T11 T12 ] * N2 [ 0 S22 ] N2 [ 0 T22 ] * M [ A1 A2 ] */ int status; const size_t N1 = N / 2; const size_t N2 = N - N1; gsl_matrix_view S11 = gsl_matrix_submatrix(S, 0, 0, N1, N1); gsl_matrix_view S12 = gsl_matrix_submatrix(S, 0, N1, N1, N2); gsl_matrix_view S22 = gsl_matrix_submatrix(S, N1, N1, N2, N2); gsl_matrix_view A1 = gsl_matrix_submatrix(A, 0, 0, M, N1); gsl_matrix_view A2 = gsl_matrix_submatrix(A, 0, N1, M, N2); gsl_matrix_view T11 = gsl_matrix_submatrix(T, 0, 0, N1, N1); gsl_matrix_view T12 = gsl_matrix_submatrix(T, 0, N1, N1, N2); gsl_matrix_view T22 = gsl_matrix_submatrix(T, N1, N1, N2, N2); /* * Eq. 2: recursively factor * * N1 N1 * N1 [ S11 ] = Q1 [ R11 ] N1 * N2 [ 0 ] [ 0 ] N2 * M [ A1 ] [ 0 ] M */ status = gsl_linalg_QR_UR_decomp(&S11.matrix, &A1.matrix, &T11.matrix); if (status) return status; /* * Eq. 3: * * N2 N2 N2 * N1 [ R12 ] = Q1^T [ S12 ] = [ S12 - W ] N1 * N2 [ S22~ ] [ S22 ] [ S22 ] N2 * M [ A2~ ] [ A2 ] [ A2 - V1~ W ] M * * where W = T11^T ( S12 + V1~^T A2 ), using T12 as temporary storage, and * * N1 * V1 = [ I ] N1 * [ 0 ] N2 * [ V1~ ] M */ gsl_matrix_memcpy(&T12.matrix, &S12.matrix); /* W := S12 */ gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, &A1.matrix, &A2.matrix, 1.0, &T12.matrix); /* W := S12 + V1~^T A2 */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasTrans, CblasNonUnit, 1.0, &T11.matrix, &T12.matrix); /* W := T11^T W */ gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, -1.0, &A1.matrix, &T12.matrix, 1.0, &A2.matrix); /* A2 := A2 - V1~ W */ gsl_matrix_sub(&S12.matrix, &T12.matrix); /* R12 := S12 - W */ /* * Eq. 4: recursively factor * * [ S22~ ] = Q2~ [ R22 ] * [ A2~ ] [ 0 ] */ status = gsl_linalg_QR_UR_decomp(&S22.matrix, &A2.matrix, &T22.matrix); if (status) return status; /* * Eq. 13: update T12 := -T11 * V1^T * V2 * T22 * * where: * * N1 N2 * V1 = [ I ] N1 V2 = [ 0 ] N1 * [ 0 ] N2 [ I ] N2 * [ V1~ ] M [ V2~ ] M * * Note: V1^T V2 = V1~^T V2~ */ gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, &A1.matrix, &A2.matrix, 0.0, &T12.matrix); /* T12 := V1~^T * V2~ */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, -1.0, &T11.matrix, &T12.matrix); /* T12 := -T11 * T12 */ gsl_blas_dtrmm(CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, 1.0, &T22.matrix, &T12.matrix); /* T12 := T12 * T22 */ return GSL_SUCCESS; } } /* qrtr_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: B = [ S ] [ A ] where S is N-by-N upper triangular, and A is M-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 B, and so its structure will be: x = [ x0 ] <- 1 nonzero value for the diagonal element of S [ 0 ] <- N - j - 1 zeros, where j is column of matrix in [0,N-1] [ x ] <- M nonzero values for the dense part A Inputs: v0 - pointer to diagonal element of S on input, v0 = x0; v - on input, x vector on output, householder vector v */ static double qrtr_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 = - GSL_SIGN(alpha) * 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; } gsl-2.7.1/linalg/qr_uu.c0000644016036000116100000002731714151556700012011 00000000000000/* linalg/qr_uu.c * * Copyright (C) 2020 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 the QR factorization of a matrix * using the recursive Level 3 BLAS algorithm of Elmroth and Gustavson with * additional modifications courtesy of Julien Langou. */ static double qrtt_householder_transform (double *v0, double *v1); /* gsl_linalg_QR_UU_decomp() Compute the QR decomposition of the "triangle on top of triangle" matrix [ U ] = Q [ R ] [ S ] [ 0 ] where U,S are N-by-N upper triangular Inputs: U - on input, upper triangular N-by-N matrix on output, R factor in upper triangle S - on input, upper triangular N-by-N matrix on output, upper triangular Householder matrix V T - (output) block reflector matrix, N-by-N Notes: 1) Based on the Elmroth/Gustavson algorithm, taking into account the sparse structure of the U,S matrices 2) The Householder matrix V has the special form: N V = [ I ] N [ V~ ] M with V~ upper triangular: The matrix V~ is stored in S on output; the identity is not stored 3) The orthogonal matrix is Q = I - V T V^T */ int gsl_linalg_QR_UU_decomp (gsl_matrix * U, gsl_matrix * S, gsl_matrix * T) { const size_t N = U->size1; if (N != U->size2) { GSL_ERROR ("U matrix must be square", GSL_ENOTSQR); } else if (S->size1 != S->size2) { GSL_ERROR ("S matrix must be square", GSL_ENOTSQR); } else if (N != S->size1) { GSL_ERROR ("S and U must have same dimensions", GSL_EBADLEN); } else if (T->size1 != N || T->size2 != N) { GSL_ERROR ("T matrix has wrong dimensions", GSL_EBADLEN); } else if (N == 1) { /* base case, compute Householder transform for single column matrix */ double * T00 = gsl_matrix_ptr(T, 0, 0); double * U00 = gsl_matrix_ptr(U, 0, 0); double * S00 = gsl_matrix_ptr(S, 0, 0); *T00 = qrtt_householder_transform(U00, S00); return GSL_SUCCESS; } else { /* * partition matrices: * * N1 N2 N1 N2 * N1 [ U11 U12 ] and N1 [ T11 T12 ] * N2 [ 0 U22 ] N2 [ 0 T22 ] * N1 [ S11 S12 ] * N2 [ 0 S22 ] */ int status; const size_t N1 = N / 2; const size_t N2 = N - N1; gsl_matrix_view U11 = gsl_matrix_submatrix(U, 0, 0, N1, N1); gsl_matrix_view U12 = gsl_matrix_submatrix(U, 0, N1, N1, N2); gsl_matrix_view U22 = gsl_matrix_submatrix(U, N1, N1, N2, N2); gsl_matrix_view S11 = gsl_matrix_submatrix(S, 0, 0, N1, N1); gsl_matrix_view S12 = gsl_matrix_submatrix(S, 0, N1, N1, N2); gsl_matrix_view T11 = gsl_matrix_submatrix(T, 0, 0, N1, N1); gsl_matrix_view T12 = gsl_matrix_submatrix(T, 0, N1, N1, N2); gsl_matrix_view T22 = gsl_matrix_submatrix(T, N1, N1, N2, N2); gsl_matrix_view m; /* * Eq. 2: recursively factor * * N1 N1 * N1 [ U11 ] = Q1 [ R11 ] N1 * N2 [ 0 ] [ 0 ] N2 * N1 [ S11 ] [ 0 ] N1 * N2 [ 0 ] [ 0 ] N2 */ status = gsl_linalg_QR_UU_decomp(&U11.matrix, &S11.matrix, &T11.matrix); if (status) return status; /* * Eq. 3: * * N2 N2 N2 * N1 [ R12 ] = Q1^T [ U12 ] = [ U12 - W ] N1 * N2 [ U22~ ] [ U22 ] [ U22 ] N2 * N1 [ S12~ ] [ S12 ] [ S12 - V31 W ] N1 * N2 [ S22~ ] [ S22 ] [ S22 ] N2 * * where W = T11^T ( U12 + V31^T S12 ), using T12 as temporary storage, and * * N1 * V1 = [ I ] N1 * [ 0 ] N2 * [ V31 ] N1 * [ 0 ] N2 */ gsl_matrix_memcpy(&T12.matrix, &S12.matrix); /* W := S12 */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasTrans, CblasNonUnit, 1.0, &S11.matrix, &T12.matrix); /* W := V31^T S12 */ gsl_matrix_add(&T12.matrix, &U12.matrix); /* W := U12 + V31^T S12 */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasTrans, CblasNonUnit, 1.0, &T11.matrix, &T12.matrix); /* W := T11^T W */ gsl_matrix_sub(&U12.matrix, &T12.matrix); /* R12 := U12 - W */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, 1.0, &S11.matrix, &T12.matrix); /* W := V31 W */ gsl_matrix_sub(&S12.matrix, &T12.matrix); /* S12 := S12 - V31 W */ /* * Eq. 4: factor the "triangle on top of trapezoidal" matrix * * N2 [ U22 ] = Q2~ [ R22 ] N2 * N1 [ S12~ ] [ 0 ] N1 * N2 [ S22 ] [ 0 ] N2 */ m = gsl_matrix_submatrix(S, 0, N1, N, N2); status = gsl_linalg_QR_UZ_decomp(&U22.matrix, &m.matrix, &T22.matrix); if (status) return status; /* * Eq. 13: update T12 := -T11 * V1^T * V2 * T22 * * where: * * N1 N2 * V1 = [ I ] N1 V2 = [ 0 ] N1 * [ 0 ] N2 [ I ] N2 * [ V31~ ] N1 [ V32~ ] N1 * [ 0 ] N2 [ V42~ ] N2 * * Note: V1^T V2 = V31~^T V32~ */ gsl_matrix_memcpy(&T12.matrix, &S12.matrix); /* T12 := V32~ */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasTrans, CblasNonUnit, 1.0, &S11.matrix, &T12.matrix); /* T12 := V31~^T V32~ */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, -1.0, &T11.matrix, &T12.matrix); /* T12 := -T11 * T12 */ gsl_blas_dtrmm(CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, 1.0, &T22.matrix, &T12.matrix); /* T12 := T12 * T22 */ return GSL_SUCCESS; } } /* Find the least squares solution to the overdetermined system * * [ U ] x = b * [ S ] * * using the QR factorization [ U; S ] = Q R. * * Inputs: R - upper triangular R matrix, N-by-N * Y - upper triangular Y matrix, N-by-N * T - upper triangular block reflector, N-by-N * b - right hand side, size 2*N * x - (output) solution, size 2*N * x(1:N) = least squares solution vector * x(N+1:2*N) = vector whose norm equals ||b - Ax|| * work - workspace, size N */ int gsl_linalg_QR_UU_lssolve (const gsl_matrix * R, const gsl_matrix * Y, const gsl_matrix * T, const gsl_vector * b, gsl_vector * x, gsl_vector * work) { const size_t N = R->size1; const size_t M = 2 * N; if (R->size2 != N) { GSL_ERROR ("R matrix must be square", GSL_ENOTSQR); } else if (Y->size1 != Y->size2) { GSL_ERROR ("Y matrix must be square", GSL_ENOTSQR); } else if (Y->size1 != N) { GSL_ERROR ("Y and R must have same dimensions", GSL_EBADLEN); } else if (T->size1 != N || T->size2 != N) { GSL_ERROR ("T matrix must be N-by-N", GSL_EBADLEN); } else if (M != b->size) { GSL_ERROR ("matrix size must match b size", GSL_EBADLEN); } else if (M != x->size) { GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN); } else if (N != work->size) { GSL_ERROR ("workspace must be length N", GSL_EBADLEN); } else { gsl_vector_view x1 = gsl_vector_subvector(x, 0, N); /* compute x = Q^T b */ gsl_vector_memcpy(x, b); gsl_linalg_QR_UU_QTvec (Y, T, x, work); /* Solve R x = Q^T b */ gsl_blas_dtrsv (CblasUpper, CblasNoTrans, CblasNonUnit, R, &x1.vector); return GSL_SUCCESS; } } /* gsl_linalg_QR_UU_QTvec() Apply 2N-by-2N Q^T to the 2N-by-1 vector b Inputs: Y - upper triangular Y matrix encoded by gsl_linalg_QR_UU_decomp, N-by-N T - block reflector matrix, N-by-N b - 2N-by-1 vector replaced by Q^T b on output work - workspace, length N Notes: 1) Q^T b = (I - V T^T V^T) b = b - V T^T [ I Y^T ] [ b1 ] [ b2 ] = b - V T^T [ b1 + Y^T b2 ] = [ b1 ] - [ w ] [ b2 ] [ Y w ] where w = T^T ( b1 + Y^T b2 ) */ int gsl_linalg_QR_UU_QTvec(const gsl_matrix * Y, const gsl_matrix * T, gsl_vector * b, gsl_vector * work) { const size_t N = Y->size1; const size_t M = 2 * N; if (Y->size2 != N) { GSL_ERROR ("Y matrix must be square", GSL_ENOTSQR); } else if (T->size1 != N || T->size2 != N) { GSL_ERROR ("T matrix must be N-by-N", GSL_EBADLEN); } else if (b->size != M) { GSL_ERROR ("b vector must have length M", GSL_EBADLEN); } else if (work->size != N) { GSL_ERROR ("workspace must be length N", GSL_EBADLEN); } else { gsl_vector_view b1 = gsl_vector_subvector(b, 0, N); gsl_vector_view b2 = gsl_vector_subvector(b, N, N); /* work := YT b2 */ gsl_vector_memcpy(work, &b2.vector); gsl_blas_dtrmv(CblasUpper, CblasTrans, CblasNonUnit, Y, work); /* work = b1 + YT b2 */ gsl_vector_add(work, &b1.vector); /* work = T^T * work */ gsl_blas_dtrmv(CblasUpper, CblasTrans, CblasNonUnit, T, work); /* b1 := b1 - work */ gsl_vector_sub(&b1.vector, work); /* b2 := b2 - Y w */ gsl_blas_dtrmv(CblasUpper, CblasNoTrans, CblasNonUnit, Y, work); gsl_vector_sub(&b2.vector, work); return GSL_SUCCESS; } } /* qrtt_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: B = [ U ] [ S ] where U,S are N-by-N upper triangular. 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 B, and so its structure will be: x = [ x0 ] <- 1 nonzero value for the diagonal element of U [ y0 ] <- 1 nonzero value for the diagonal element of S Inputs: v0 - pointer to diagonal element of U on input, v0 = x0; v1 - on input, pointer to diagonal element of S on output, householder vector v */ static double qrtt_householder_transform (double *v0, double *v1) { /* 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 = fabs(*v1); if (xnorm == 0) { return 0.0; /* tau = 0 */ } alpha = *v0; beta = - GSL_SIGN(alpha) * hypot(alpha, xnorm) ; tau = (beta - alpha) / beta ; { double s = (alpha - beta); if (fabs(s) > GSL_DBL_MIN) { *v1 /= s; *v0 = beta; } else { *v1 *= GSL_DBL_EPSILON / s; *v1 /= GSL_DBL_EPSILON; *v0 = beta; } } return tau; } gsl-2.7.1/linalg/qr_uz.c0000644016036000116100000002177513754520141012016 00000000000000/* linalg/qr_uz.c * * Copyright (C) 2020 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 the QR factorization of a matrix * using the recursive Level 3 BLAS algorithm of Elmroth and Gustavson with * additional modifications courtesy of Julien Langou. */ static double qrtz_householder_transform (double *v0, gsl_vector * v); /* gsl_linalg_QR_UZ_decomp() Compute the QR decomposition of the "triangle on top of trapezoidal" matrix [ S ] = Q [ R ] [ A ] [ 0 ] where S is N-by-N upper triangular and A is M-by-N upper trapezoidal Inputs: S - on input, upper triangular N-by-N matrix on output, R factor in upper triangle A - on input, M-by-N upper trapezoidal matrix on output, upper trapezoidal of Householder matrix V T - (output) block reflector matrix, N-by-N Notes: 1) Based on the Elmroth/Gustavson algorithm, taking into account the sparse structure of the S,A matrices 2) The Householder matrix V has the special form: N V = [ I ] N [ V~ ] M with V~ upper trapezoidal: The matrix V~ is stored in A on output; the identity is not stored 3) The orthogonal matrix is Q = I - V T V^T */ int gsl_linalg_QR_UZ_decomp (gsl_matrix * S, gsl_matrix * A, gsl_matrix * T) { const size_t M = A->size1; const size_t N = S->size1; if (M < N) { GSL_ERROR ("M must be >= N", GSL_EBADLEN); } else if (N != S->size2) { GSL_ERROR ("S matrix must be square", GSL_ENOTSQR); } else if (N != A->size2) { GSL_ERROR ("S and A must have same number of columns", GSL_EBADLEN); } else if (T->size1 != N || T->size2 != N) { GSL_ERROR ("T matrix has wrong dimensions", GSL_EBADLEN); } else if (M == N) { /* triangle on top of triangle */ return gsl_linalg_QR_UU_decomp(S, A, T); } else if (N == 1) { /* base case, compute Householder transform for single column matrix */ double * T00 = gsl_matrix_ptr(T, 0, 0); double * S00 = gsl_matrix_ptr(S, 0, 0); gsl_vector_view v = gsl_matrix_column(A, 0); *T00 = qrtz_householder_transform(S00, &v.vector); return GSL_SUCCESS; } else { /* * partition matrices: * * N1 N2 N1 N2 * N1 [ S11 S12 ] and N1 [ T11 T12 ] * N2 [ 0 S22 ] N2 [ 0 T22 ] * M [ A1 A2 ] * N1 [ U11 U12 ] * N2 [ 0 U22 ] */ int status; const size_t N1 = N / 2; const size_t N2 = N - N1; gsl_matrix_view S11 = gsl_matrix_submatrix(S, 0, 0, N1, N1); gsl_matrix_view S12 = gsl_matrix_submatrix(S, 0, N1, N1, N2); gsl_matrix_view S22 = gsl_matrix_submatrix(S, N1, N1, N2, N2); gsl_matrix_view A1 = gsl_matrix_submatrix(A, 0, 0, M - N, N1); gsl_matrix_view A2 = gsl_matrix_submatrix(A, 0, N1, M - N, N2); gsl_matrix_view U11 = gsl_matrix_submatrix(A, M - N, 0, N1, N1); gsl_matrix_view U12 = gsl_matrix_submatrix(A, M - N, N1, N1, N2); gsl_matrix_view T11 = gsl_matrix_submatrix(T, 0, 0, N1, N1); gsl_matrix_view T12 = gsl_matrix_submatrix(T, 0, N1, N1, N2); gsl_matrix_view T22 = gsl_matrix_submatrix(T, N1, N1, N2, N2); gsl_matrix_view m; /* * Eq. 2: recursively factor * * N1 N1 * N1 [ S11 ] = Q1 [ R11 ] N1 * N2 [ 0 ] [ 0 ] N2 * M-N [ A1 ] [ 0 ] M-N * N1 [ U11 ] [ 0 ] N1 * N2 [ 0 ] [ 0 ] N2 */ m = gsl_matrix_submatrix(A, 0, 0, M - N2, N1); status = gsl_linalg_QR_UZ_decomp(&S11.matrix, &m.matrix, &T11.matrix); if (status) return status; /* * Eq. 3: * * N2 N2 N2 * N1 [ R12 ] = Q1^T [ S12 ] = [ S12 - W ] N1 * N2 [ S22~ ] [ S22 ] [ S22 ] N2 * M-N [ A2~ ] [ A2 ] [ A2 - V11 W ] M-N * N1 [ U12~ ] [ U12 ] [ U12 - V21 W ] N1 * N2 [ U22~ ] [ U22 ] [ U22 ] N2 * * where W = T11^T ( S12 + V11^T A2 + V21^T U12 ), using T12 as temporary storage, and * * N1 * V1 = [ I ] N1 * [ 0 ] N2 * [ V11 ] M-N * [ V21 ] N1 * [ 0 ] N2 */ gsl_matrix_memcpy(&T12.matrix, &U12.matrix); /* W := U12 */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasTrans, CblasNonUnit, 1.0, &U11.matrix, &T12.matrix); /* W := V21^T U12 */ gsl_matrix_add(&T12.matrix, &S12.matrix); /* W := S12 + V21^T U12 */ gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, &A1.matrix, &A2.matrix, 1.0, &T12.matrix); /* W := S12 + V21^T U12 + V11^T A2 */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasTrans, CblasNonUnit, 1.0, &T11.matrix, &T12.matrix); /* W := T11^T W */ gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, -1.0, &A1.matrix, &T12.matrix, 1.0, &A2.matrix); /* A2 := A2 - V11 W */ gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, -1.0, &U11.matrix, &T12.matrix, 1.0, &U12.matrix); /* U12 := U12 - V21 W */ gsl_matrix_sub(&S12.matrix, &T12.matrix); /* R12 := S12 - W */ /* * Eq. 4: recursively factor * * [ S22~ ] = Q2~ [ R22 ] * [ A2~ ] [ 0 ] * [ U12~ ] [ 0 ] * [ U22~ ] [ 0 ] */ m = gsl_matrix_submatrix(A, 0, N1, M, N2); status = gsl_linalg_QR_UZ_decomp(&S22.matrix, &m.matrix, &T22.matrix); if (status) return status; /* * Eq. 13: update T12 := -T11 * V1^T * V2 * T22 * * where: * * N1 N2 * V1 = [ I ] N1 V2 = [ 0 ] N1 * [ 0 ] N2 [ I ] N2 * [ V11 ] M-N [ V12 ] M-N * [ V21 ] N1 [ V22 ] N1 * [ 0 ] N2 [ V32 ] N2 * * Note: V1^T V2 = V11^T V12 + V21^T V22 */ gsl_matrix_memcpy(&T12.matrix, &U12.matrix); /* T12 := V22 */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasTrans, CblasNonUnit, 1.0, &U11.matrix, &T12.matrix); /* T12 := V21^T V22 */ gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, &A1.matrix, &A2.matrix, 1.0, &T12.matrix); /* T12 := T12 + V11^T * V12 */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, -1.0, &T11.matrix, &T12.matrix); /* T12 := -T11 * T12 */ gsl_blas_dtrmm(CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, 1.0, &T22.matrix, &T12.matrix); /* T12 := T12 * T22 */ return GSL_SUCCESS; } } /* qrtz_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: B = [ S ] [ A ] where S is N-by-N upper triangular, and A is M-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 B, and so its structure will be: x = [ x0 ] <- 1 nonzero value for the diagonal element of S [ 0 ] <- N - j - 1 zeros, where j is column of matrix in [0,N-1] [ x ] <- M nonzero values for the dense part A Inputs: v0 - pointer to diagonal element of S on input, v0 = x0; v - on input, x vector on output, householder vector v */ static double qrtz_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 = - GSL_SIGN(alpha) * 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; } gsl-2.7.1/linalg/rqr.c0000644016036000116100000006342514151556700011462 00000000000000/* linalg/rqr.c * * Copyright (C) 2019 Patrick Alken, Julien Langou * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this 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 the QR factorization of a matrix * using the recursive Level 3 BLAS algorithm of Elmroth and Gustavson with * additional modifications courtesy of Julien Langou. */ static int unpack_Q1(gsl_matrix * Q); static int unpack_Q2(const gsl_matrix * QR, const gsl_matrix * T, gsl_matrix * Q); static int aux_ULT(const gsl_matrix * L, gsl_matrix * U); static int aux_mLU(gsl_matrix * A); static int aux_ApUBT(const gsl_matrix * U, const gsl_matrix * B, gsl_matrix * A); /* gsl_linalg_QR_decomp_r() QR decomposition using Level 3 BLAS recursive algorithm of: Elmroth, E. and Gustavson, F.G., 2000. Applying recursion to serial and parallel QR factorization leads to better performance. IBM Journal of Research and Development, 44(4), pp.605-624. Inputs: A - matrix to be factored, M-by-N with M >= N T - N-by-N upper triangular factor of block reflector Return: success/error Notes: 1) on output, upper triangle of A contains R; elements below the diagonal are columns of V. The matrix Q is Q = I - V T V^T where T is upper triangular. Note that diag(T) = tau 2) implementation provided by Julien Langou */ int gsl_linalg_QR_decomp_r (gsl_matrix * A, gsl_matrix * T) { const size_t M = A->size1; const size_t N = A->size2; if (M < N) { GSL_ERROR ("M must be >= N", GSL_EBADLEN); } else if (T->size1 != T->size2) { GSL_ERROR ("T matrix must be square", GSL_ENOTSQR); } else if (T->size1 != N) { GSL_ERROR ("T matrix does not match dimensions of A", GSL_EBADLEN); } else if (N == 1) { /* base case, compute householder transform for single column matrix */ double * T00 = gsl_matrix_ptr(T, 0, 0); gsl_vector_view v = gsl_matrix_column(A, 0); *T00 = gsl_linalg_householder_transform(&v.vector); return GSL_SUCCESS; } else { /* * partition matrices: * * N1 N2 N1 N2 * N1 [ A11 A12 ] and N1 [ T11 T12 ] * M2 [ A21 A22 ] N2 [ 0 T22 ] */ int status; const size_t N1 = N / 2; const size_t N2 = N - N1; const size_t M2 = M - N1; gsl_matrix_view A11 = gsl_matrix_submatrix(A, 0, 0, N1, N1); gsl_matrix_view A12 = gsl_matrix_submatrix(A, 0, N1, N1, N2); gsl_matrix_view A21 = gsl_matrix_submatrix(A, N1, 0, M2, N1); gsl_matrix_view A22 = gsl_matrix_submatrix(A, N1, N1, M2, N2); gsl_matrix_view T11 = gsl_matrix_submatrix(T, 0, 0, N1, N1); gsl_matrix_view T12 = gsl_matrix_submatrix(T, 0, N1, N1, N2); gsl_matrix_view T22 = gsl_matrix_submatrix(T, N1, N1, N2, N2); gsl_matrix_view m; /* * Eq. 2: recursively factor * * [ A11 ] = Q1 [ R11 ] * [ A21 ] [ 0 ] * N1 * Note: Q1 = I - V1 T11 V1^T, where V1 = [ V11 ] N1 * [ V21 ] M2 */ m = gsl_matrix_submatrix(A, 0, 0, M, N1); status = gsl_linalg_QR_decomp_r(&m.matrix, &T11.matrix); if (status) return status; /* * Eq. 3: * * [ R12 ] := Q1^T [ A12 ] = [ A12 ] - [ V11 W ] * [ A22 ] [ A22 ] [ A22 ] [ V21 W ] * * where W = T11^T (V11^T A12 + V21^T A22), and using T12 as temporary storage */ gsl_matrix_memcpy(&T12.matrix, &A12.matrix); /* W := A12 */ gsl_blas_dtrmm(CblasLeft, CblasLower, CblasTrans, CblasUnit, 1.0, &A11.matrix, &T12.matrix); /* W := V11^T * A12 */ gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, &A21.matrix, &A22.matrix, 1.0, &T12.matrix); /* W := W + V21^T * A22 */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasTrans, CblasNonUnit, 1.0, &T11.matrix, &T12.matrix); /* W := T11^T * W */ gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, -1.0, &A21.matrix, &T12.matrix, 1.0, &A22.matrix); /* A22 = A22 - V21 * W */ gsl_blas_dtrmm(CblasLeft, CblasLower, CblasNoTrans, CblasUnit, 1.0, &A11.matrix, &T12.matrix); /* tmp = V11 * W */ gsl_matrix_sub(&A12.matrix, &T12.matrix); /* R12 := A12 - V11 * W */ /* * Eq. 4: recursively factor * * A22 = Q2~ R22 * * N1 M2 * Note: Q2 = [ I 0 ] N1 * [ 0 Q2~ ] M2 */ status = gsl_linalg_QR_decomp_r(&A22.matrix, &T22.matrix); if (status) return status; /* * Eq. 13: update T12 := -T11 * V1^T * V2 * T22 * * where: * * N1 N2 * V1 = [ V11 ] N1 V2 = [ 0 ] N1 * [ V21 ] N2 [ V22 ] N2 * [ V31 ] M-N [ V32 ] M-N * * Note: V1^T V2 = V21^T V22 + V31^T V32 * Also, V11, V22 are unit lower triangular */ m = gsl_matrix_submatrix(&A21.matrix, 0, 0, N2, N1); /* V21 */ gsl_matrix_transpose_memcpy(&T12.matrix, &m.matrix); /* T12 := V21^T */ m = gsl_matrix_submatrix(A, N1, N1, N2, N2); /* V22 */ gsl_blas_dtrmm(CblasRight, CblasLower, CblasNoTrans, CblasUnit, 1.0, &m.matrix, &T12.matrix); /* T12 := V21^T * V22 */ if (M > N) { gsl_matrix_view V31 = gsl_matrix_submatrix(A, N, 0, M - N, N1); gsl_matrix_view V32 = gsl_matrix_submatrix(A, N, N1, M - N, N2); gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, &V31.matrix, &V32.matrix, 1.0, &T12.matrix); /* T12 := T12 + V31^T * V32 */ } gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, -1.0, &T11.matrix, &T12.matrix); /* T12 := -T11 * T12 */ gsl_blas_dtrmm(CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, 1.0, &T22.matrix, &T12.matrix); /* T12 := T12 * T22 */ return GSL_SUCCESS; } } /* Solves the square system A x = b for x using the QR factorisation, * * R x = Q^T b * * where Q = I - V T V^T */ int gsl_linalg_QR_solve_r (const gsl_matrix * QR, const gsl_matrix * T, const gsl_vector * b, gsl_vector * x) { const size_t N = QR->size2; if (QR->size1 != N) { GSL_ERROR ("QR matrix must be square", GSL_ENOTSQR); } else if (T->size1 != QR->size1 || T->size2 != QR->size2) { GSL_ERROR ("T matrix must be N-by-N", GSL_EBADLEN); } else if (N != 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 { size_t i; /* compute Q^T b = [I - V T^T V^T] b */ /* x := V^T b */ gsl_vector_memcpy(x, b); gsl_blas_dtrmv(CblasLower, CblasTrans, CblasUnit, QR, x); /* x = T^T * x */ gsl_blas_dtrmv(CblasUpper, CblasTrans, CblasNonUnit, T, x); /* x = V * x */ gsl_blas_dtrmv(CblasLower, CblasNoTrans, CblasUnit, QR, x); /* x = b - V * x */ for (i = 0; i < N; ++i) { double * xi = gsl_vector_ptr(x, i); double bi = gsl_vector_get(b, i); *xi = bi - (*xi); } /* Solve R x = Q^T b, 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. * * Inputs: QR - [R; V] matrix, M-by-N * T - upper triangular block reflector, N-by-N * b - right hand side, size M * x - (output) solution, size M * x(1:N) = least squares solution vector * x(N+1:M) = vector whose norm equals ||b - Ax|| * work - workspace, size N */ int gsl_linalg_QR_lssolve_r (const gsl_matrix * QR, const gsl_matrix * T, const gsl_vector * b, gsl_vector * x, gsl_vector * work) { 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 (T->size1 != N || T->size2 != N) { GSL_ERROR ("T matrix must be N-by-N", GSL_EBADLEN); } else if (M != b->size) { GSL_ERROR ("matrix size must match b size", GSL_EBADLEN); } else if (M != x->size) { GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN); } else if (N != work->size) { GSL_ERROR ("matrix size must match work size", GSL_EBADLEN); } else { gsl_matrix_const_view R = gsl_matrix_const_submatrix (QR, 0, 0, N, N); gsl_vector_view x1 = gsl_vector_subvector(x, 0, N); /* compute x = Q^T b */ gsl_vector_memcpy(x, b); gsl_linalg_QR_QTvec_r (QR, T, x, work); /* Solve R x = Q^T b */ gsl_blas_dtrsv (CblasUpper, CblasNoTrans, CblasNonUnit, &R.matrix, &x1.vector); return GSL_SUCCESS; } } /* gsl_linalg_QR_unpack_r() Unpack matrices Q and R Inputs: QR - packed QR format, M-by-N T - block reflector matrix, N-by-N Q - (output) Q matrix, M-by-M R - (output) R matrix, N-by-N Return: success/error Notes: 1) Implementation provided by Julien Langou */ int gsl_linalg_QR_unpack_r(const gsl_matrix * QR, const gsl_matrix * T, gsl_matrix * Q, gsl_matrix * R) { 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 (Q->size1 != M || Q->size2 != M) { GSL_ERROR ("Q matrix must be M-by-M", GSL_EBADLEN); } else if (R->size1 != N || R->size2 != N) { GSL_ERROR ("R matrix must be N-by-N", GSL_EBADLEN); } else if (T->size1 != N || T->size2 != N) { GSL_ERROR ("T matrix must be N-by-N", GSL_EBADLEN); } else { gsl_matrix_const_view RV = gsl_matrix_const_submatrix(QR, 0, 0, N, N); gsl_matrix_view Q1 = gsl_matrix_submatrix(Q, 0, 0, M, N); gsl_matrix_view m; /* * set Q1 = [ T ] * [ V ] */ m = gsl_matrix_submatrix(Q, 0, 0, N, N); gsl_matrix_tricpy(CblasUpper, CblasNonUnit, &m.matrix, T); gsl_matrix_tricpy(CblasLower, CblasUnit, &m.matrix, &RV.matrix); if (M > N) { gsl_matrix_const_view tmp = gsl_matrix_const_submatrix(QR, N, 0, M - N, N); m = gsl_matrix_submatrix(Q, N, 0, M - N, N); gsl_matrix_memcpy(&m.matrix, &tmp.matrix); } unpack_Q1(&Q1.matrix); if (M > N) { gsl_matrix_view Q2 = gsl_matrix_submatrix(Q, 0, N, M, M - N); unpack_Q2(QR, T, &Q2.matrix); } /* copy R */ gsl_matrix_tricpy(CblasUpper, CblasNonUnit, R, &RV.matrix); return GSL_SUCCESS; } } /* gsl_linalg_QR_QTvec_r() Apply M-by-M Q^T to the M-by-1 vector b Inputs: QR - [R; V] matrix encoded by gsl_linalg_QR_decomp_r T - block reflector matrix b - M-by-1 vector replaced by Q^T b on output work - workspace, length N Notes: 1) Q^T b = (I - V T^T V^T) b = b - V T^T [ V1^T V2^T ] [ b1 ] [ b2 ] = b - V T^T [ V1^T b1 + V2^T b2 ] = [ b1 ] - [ V1 w ] [ b2 ] [ V2 w ] where w = T^T ( V1^T b1 + V2^T b2 ) */ int gsl_linalg_QR_QTvec_r(const gsl_matrix * QR, const gsl_matrix * T, gsl_vector * b, 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 (T->size1 != N || T->size2 != N) { GSL_ERROR ("T matrix must be N-by-N", GSL_EBADLEN); } else if (b->size != M) { GSL_ERROR ("b vector must have length M", GSL_EBADLEN); } else if (work->size != N) { GSL_ERROR ("workspace must be length N", GSL_EBADLEN); } else { gsl_matrix_const_view V1 = gsl_matrix_const_submatrix(QR, 0, 0, N, N); gsl_vector_view b1 = gsl_vector_subvector(b, 0, N); gsl_vector_view b2; /* work := V1^T b1 */ gsl_vector_memcpy(work, &b1.vector); gsl_blas_dtrmv(CblasLower, CblasTrans, CblasUnit, &V1.matrix, work); if (M > N) { gsl_matrix_const_view V2 = gsl_matrix_const_submatrix(QR, N, 0, M - N, N); /* work = work + V2^T b2 */ b2 = gsl_vector_subvector(b, N, M - N); gsl_blas_dgemv(CblasTrans, 1.0, &V2.matrix, &b2.vector, 1.0, work); } /* work = T^T * work */ gsl_blas_dtrmv(CblasUpper, CblasTrans, CblasNonUnit, T, work); if (M > N) { /* b2 = b2 - V2 * work */ gsl_matrix_const_view V2 = gsl_matrix_const_submatrix(QR, N, 0, M - N, N); gsl_blas_dgemv(CblasNoTrans, -1.0, &V2.matrix, work, 1.0, &b2.vector); } /* b1 = b1 - V1 * work */ gsl_blas_dtrmv(CblasLower, CblasNoTrans, CblasUnit, &V1.matrix, work); gsl_vector_sub(&b1.vector, work); return GSL_SUCCESS; } } /* gsl_linalg_QR_QTmat_r() Apply M-by-M Q^T to the M-by-K matrix B Inputs: QR - [R; V] matrix encoded by gsl_linalg_QR_decomp_r T - block reflector matrix B - M-by-K matrix replaced by Q^T B on output work - N-by-K workspace Notes: 1) Provided by Julien Langou */ int gsl_linalg_QR_QTmat_r(const gsl_matrix * QR, const gsl_matrix * T, gsl_matrix * B, gsl_matrix * work) { const size_t M = QR->size1; const size_t N = QR->size2; const size_t K = B->size2; if (M < N) { GSL_ERROR ("M must be >= N", GSL_EBADLEN); } else if (T->size1 != N || T->size2 != N) { GSL_ERROR ("T matrix must be N-by-N", GSL_EBADLEN); } else if (B->size1 != M) { GSL_ERROR ("B matrix must have M rows", GSL_EBADLEN); } else if (work->size1 != N || work->size2 != K) { GSL_ERROR ("workspace must be N-by-K", GSL_EBADLEN); } else { gsl_matrix_const_view V1 = gsl_matrix_const_submatrix(QR, 0, 0, N, N); gsl_matrix_view B1 = gsl_matrix_submatrix(B, 0, 0, N, K); gsl_matrix_view B2; /* work := V1^T B1 */ gsl_matrix_memcpy(work, &B1.matrix); gsl_blas_dtrmm(CblasLeft, CblasLower, CblasTrans, CblasUnit, 1.0, &V1.matrix, work); if (M > N) { gsl_matrix_const_view V2 = gsl_matrix_const_submatrix(QR, N, 0, M - N, N); /* work = work + V2^T B2 */ B2 = gsl_matrix_submatrix(B, N, 0, M - N, K); gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, &V2.matrix, &B2.matrix, 1.0, work); } /* work = T^T * work */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasTrans, CblasNonUnit, 1.0, T, work); if (M > N) { /* B2 = B2 - V2 * work */ gsl_matrix_const_view V2 = gsl_matrix_const_submatrix(QR, N, 0, M - N, N); gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, -1.0, &V2.matrix, work, 1.0, &B2.matrix); } /* B1 = B1 - V1 * work */ gsl_blas_dtrmm(CblasLeft, CblasLower, CblasNoTrans, CblasUnit, 1.0, &V1.matrix, work); gsl_matrix_sub(&B1.matrix, work); return GSL_SUCCESS; } } /* unpack_Q1() Compute Q_1 Inputs: Q - on input, contains T in upper triangle and V in lower trapezoid on output, contains Q_1 M-by-N Return: success/error Notes: 1) N Q1 = [ Q1 Q2 ] [ I_n ] = (I - V T V^T) [ I; 0 ] = [ I - V1 T V1^T ] N [ 0 ] [ - V2 T V1^T ] M - N */ static int unpack_Q1(gsl_matrix * Q) { int status; const size_t M = Q->size1; const size_t N = Q->size2; gsl_matrix_view Q1 = gsl_matrix_submatrix(Q, 0, 0, N, N); gsl_vector_view diag = gsl_matrix_diagonal(&Q1.matrix); /* Q1 := T V1^T */ status = aux_ULT(&Q1.matrix, &Q1.matrix); if (status) return status; if (M > N) { /* compute Q2 := - V2 T V1^T */ gsl_matrix_view V2 = gsl_matrix_submatrix(Q, N, 0, M - N, N); gsl_blas_dtrmm(CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, -1.0, &Q1.matrix, &V2.matrix); } /* Q1 := - V1 T V1^T */ status = aux_mLU(&Q1.matrix); if (status) return status; /* Q1 := I - V1 T V1^T */ gsl_vector_add_constant(&diag.vector, 1.0); return GSL_SUCCESS; } /* unpack_Q2() Compute Q_2 Inputs: QR - [R; V] from QR_decomp_r, M-by-N T - upper triangular T factor, N-by-N Q - (output) Q_2 factor, M-by-(M-N) Return: success/error Notes: N M-N 1) Since Q = I - V T V^T = M [ Q1 Q2 ], we have M-N Q2 = Q [ 0 ] N [ I_{M-N} ] M-N So, Q2 = Q [ 0; I ] = (I - V T V^T) [ 0; I ] = [ - V1 T V2^T ] [ I - V2 T V2^T ] */ static int unpack_Q2(const gsl_matrix * QR, const gsl_matrix * T, gsl_matrix * Q) { 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 (T->size1 != N || T->size2 != N) { GSL_ERROR ("T matrix must be N-by-N", GSL_EBADLEN); } else if (Q->size1 != M || Q->size2 != (M - N)) { GSL_ERROR ("Q matrix must be M-by-(M-N)", GSL_EBADLEN); } else { gsl_matrix_const_view V1 = gsl_matrix_const_submatrix(QR, 0, 0, N, N); gsl_matrix_const_view V2 = gsl_matrix_const_submatrix(QR, N, 0, M - N, N); gsl_matrix_view Q1 = gsl_matrix_submatrix(Q, 0, 0, N, M - N); gsl_matrix_view Q2 = gsl_matrix_submatrix(Q, N, 0, M - N, M - N); gsl_vector_view diag = gsl_matrix_diagonal(&Q2.matrix); /* Q1 := V2^T */ gsl_matrix_transpose_memcpy(&Q1.matrix, &V2.matrix); /* Q1 := - T V2^T */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, -1.0, T, &Q1.matrix); /* Q2 := - V2 T V2^T */ gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, &V2.matrix, &Q1.matrix, 0.0, &Q2.matrix); /* Q2 := I - V2 T V2^T */ gsl_vector_add_constant(&diag.vector, 1.0); /* Q1 := - V1 T V2^T */ gsl_blas_dtrmm(CblasLeft, CblasLower, CblasNoTrans, CblasUnit, 1.0, &V1.matrix, &Q1.matrix); return GSL_SUCCESS; } } /* U := U L^T for triangular matrices L and U; L is unit lower triangular */ static int aux_ULT(const gsl_matrix * L, gsl_matrix * U) { const size_t N = L->size1; if (N != L->size2) { GSL_ERROR ("L matrix must be square", GSL_ENOTSQR); } else if (U->size1 != N || U->size2 != N) { GSL_ERROR ("U matrix must be same size as L", GSL_EBADLEN); } else if (N == 1) { /* nothing to do */ return GSL_SUCCESS; } else { int status; const size_t N1 = N / 2; const size_t N2 = N - N1; gsl_matrix_const_view L11 = gsl_matrix_const_submatrix(L, 0, 0, N1, N1); gsl_matrix_const_view L21 = gsl_matrix_const_submatrix(L, N1, 0, N2, N1); gsl_matrix_const_view L22 = gsl_matrix_const_submatrix(L, N1, N1, N2, N2); gsl_matrix_view U11 = gsl_matrix_submatrix(U, 0, 0, N1, N1); gsl_matrix_view U12 = gsl_matrix_submatrix(U, 0, N1, N1, N2); gsl_matrix_view U22 = gsl_matrix_submatrix(U, N1, N1, N2, N2); /* U12 = U12 * L22^T */ gsl_blas_dtrmm(CblasRight, CblasLower, CblasTrans, CblasUnit, 1.0, &L22.matrix, &U12.matrix); /* U12 = U12 + U11 * L21^T */ status = aux_ApUBT(&U11.matrix, &L21.matrix, &U12.matrix); if (status) return status; status = aux_ULT(&L11.matrix, &U11.matrix); if (status) return status; status = aux_ULT(&L22.matrix, &U22.matrix); if (status) return status; return GSL_SUCCESS; } } /* store -L*U in A */ static int aux_mLU(gsl_matrix * A) { const size_t N = A->size1; if (N != A->size2) { GSL_ERROR ("matrix must be square", GSL_ENOTSQR); } else if (N == 1) { double *A00 = gsl_matrix_ptr(A, 0, 0); *A00 = -(*A00); return GSL_SUCCESS; } else { int status; const size_t N1 = N / 2; const size_t N2 = N - N1; gsl_matrix_view A11 = gsl_matrix_submatrix(A, 0, 0, N1, N1); gsl_matrix_view A12 = gsl_matrix_submatrix(A, 0, N1, N1, N2); gsl_matrix_view A21 = gsl_matrix_submatrix(A, N1, 0, N2, N1); gsl_matrix_view A22 = gsl_matrix_submatrix(A, N1, N1, N2, N2); /* A22 = - L22 U22 */ status = aux_mLU(&A22.matrix); if (status) return status; /* A22 = A22 - L21 U12 */ gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, -1.0, &A21.matrix, &A12.matrix, 1.0, &A22.matrix); /* A12 - -L11 U12 */ gsl_blas_dtrmm(CblasLeft, CblasLower, CblasNoTrans, CblasUnit, -1.0, &A11.matrix, &A12.matrix); /* A21 = -L21 U11 */ gsl_blas_dtrmm(CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, -1.0, &A11.matrix, &A21.matrix); /* A11 = - L11 U11 */ status = aux_mLU(&A11.matrix); if (status) return status; return GSL_SUCCESS; } } /* A := A + U B^T where U is upper triangular */ static int aux_ApUBT(const gsl_matrix * U, const gsl_matrix * B, gsl_matrix * A) { const size_t M = A->size1; const size_t N = A->size2; if (U->size1 != M || U->size2 != M) { GSL_ERROR ("U matrix has wrong dimensions", GSL_EBADLEN); } else if (B->size1 != N || B->size2 != M) { GSL_ERROR ("B matrix has wrong dimensions", GSL_EBADLEN); } else if (M == 1 && N == 1) { double *aptr = gsl_matrix_ptr(A, 0, 0); const double *uptr = gsl_matrix_const_ptr(U, 0, 0); const double *bptr = gsl_matrix_const_ptr(B, 0, 0); *aptr += (*uptr) * (*bptr); return GSL_SUCCESS; } else if (M == 1) { double U00 = gsl_matrix_get(U, 0, 0); gsl_vector_view v = gsl_matrix_row(A, 0); gsl_vector_const_view w = gsl_matrix_const_column(B, 0); gsl_blas_daxpy(U00, &w.vector, &v.vector); return GSL_SUCCESS; } else if (N == 1) { /* * partition: * * M1 M2 * B = 1 [ B11 B12 ] * * 1 M1 M2 1 * M1 [ A11 ] + [ U11 U12 ] [ B11^T ] M1 * M2 [ A21 ] [ 0 U22 ] [ B12^T ] M2 */ int status; const size_t M1 = M / 2; const size_t M2 = M - M1; gsl_matrix_view A11 = gsl_matrix_submatrix(A, 0, 0, M1, 1); gsl_matrix_view A21 = gsl_matrix_submatrix(A, M1, 0, M2, 1); gsl_vector_view a1 = gsl_matrix_subcolumn(A, 0, 0, M1); gsl_matrix_const_view U11 = gsl_matrix_const_submatrix(U, 0, 0, M1, M1); gsl_matrix_const_view U12 = gsl_matrix_const_submatrix(U, 0, M1, M1, M2); gsl_matrix_const_view U22 = gsl_matrix_const_submatrix(U, M1, M1, M2, M2); gsl_matrix_const_view B11 = gsl_matrix_const_submatrix(B, 0, 0, 1, M1); gsl_matrix_const_view B12 = gsl_matrix_const_submatrix(B, 0, M1, 1, M2); gsl_vector_const_view b2 = gsl_matrix_const_subrow(B, 0, M1, M2); /* A(1:M1,1) += U12 * B12^T */ gsl_blas_dgemv(CblasNoTrans, 1.0, &U12.matrix, &b2.vector, 1.0, &a1.vector); /* A11 := A11 + U11 B11^T */ status = aux_ApUBT(&U11.matrix, &B11.matrix, &A11.matrix); if (status) return status; /* A21 := A21 + U22 B12^T */ status = aux_ApUBT(&U22.matrix, &B12.matrix, &A21.matrix); if (status) return status; return GSL_SUCCESS; } else { int status; const size_t M1 = M / 2; const size_t M2 = M - M1; const size_t N1 = N / 2; const size_t N2 = N - N1; gsl_matrix_view A11 = gsl_matrix_submatrix(A, 0, 0, M1, N1); gsl_matrix_view A12 = gsl_matrix_submatrix(A, 0, N1, M1, N2); gsl_matrix_view A21 = gsl_matrix_submatrix(A, M1, 0, M2, N1); gsl_matrix_view A22 = gsl_matrix_submatrix(A, M1, N1, M2, N2); gsl_matrix_const_view U11 = gsl_matrix_const_submatrix(U, 0, 0, M1, M1); gsl_matrix_const_view U12 = gsl_matrix_const_submatrix(U, 0, M1, M1, M2); gsl_matrix_const_view U22 = gsl_matrix_const_submatrix(U, M1, M1, M2, M2); gsl_matrix_const_view B11 = gsl_matrix_const_submatrix(B, 0, 0, N1, M1); gsl_matrix_const_view B12 = gsl_matrix_const_submatrix(B, 0, M1, N1, M2); gsl_matrix_const_view B21 = gsl_matrix_const_submatrix(B, N1, 0, N2, M1); gsl_matrix_const_view B22 = gsl_matrix_const_submatrix(B, N1, M1, N2, M2); /* A11 := A11 + U11 B11^T */ status = aux_ApUBT(&U11.matrix, &B11.matrix, &A11.matrix); if (status) return status; /* A11 := A11 + U12 B12^T */ gsl_blas_dgemm(CblasNoTrans, CblasTrans, 1.0, &U12.matrix, &B12.matrix, 1.0, &A11.matrix); /* A12 := A12 + U11 B21^T */ status = aux_ApUBT(&U11.matrix, &B21.matrix, &A12.matrix); if (status) return status; /* A12 := A12 + U12 B22^T */ gsl_blas_dgemm(CblasNoTrans, CblasTrans, 1.0, &U12.matrix, &B22.matrix, 1.0, &A12.matrix); /* A21 := A21 + U22 B12^T */ status = aux_ApUBT(&U22.matrix, &B12.matrix, &A21.matrix); if (status) return status; /* A22 := A22 + U22 B22^T */ status = aux_ApUBT(&U22.matrix, &B22.matrix, &A22.matrix); if (status) return status; return GSL_SUCCESS; } } gsl-2.7.1/linalg/rqrc.c0000644016036000116100000006533614151556700011630 00000000000000/* linalg/rqrc.c * * Copyright (C) 2020 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 contains routines for the QR factorization of a matrix * using the recursive Level 3 BLAS algorithm of Elmroth and Gustavson with * additional modifications courtesy of Julien Langou. */ static int unpack_Q1(gsl_matrix_complex * Q); static int unpack_Q2(const gsl_matrix_complex * QR, const gsl_matrix_complex * T, gsl_matrix_complex * Q); static int aux_ULH(const gsl_matrix_complex * L, gsl_matrix_complex * U); static int aux_mLU(gsl_matrix_complex * A); static int aux_ApUBH(const gsl_matrix_complex * U, const gsl_matrix_complex * B, gsl_matrix_complex * A); /* gsl_linalg_complex_QR_decomp_r() QR decomposition using Level 3 BLAS recursive algorithm of: Elmroth, E. and Gustavson, F.G., 2000. Applying recursion to serial and parallel QR factorization leads to better performance. IBM Journal of Research and Development, 44(4), pp.605-624. Inputs: A - matrix to be factored, M-by-N with M >= N T - N-by-N upper triangular factor of block reflector Return: success/error Notes: 1) on output, upper triangle of A contains R; elements below the diagonal are columns of V. The matrix Q is Q = I - V T V^H where T is upper triangular. Note that diag(T) = tau */ int gsl_linalg_complex_QR_decomp_r (gsl_matrix_complex * A, gsl_matrix_complex * T) { const size_t M = A->size1; const size_t N = A->size2; if (M < N) { GSL_ERROR ("M must be >= N", GSL_EBADLEN); } else if (T->size1 != T->size2) { GSL_ERROR ("T matrix must be square", GSL_ENOTSQR); } else if (T->size1 != N) { GSL_ERROR ("T matrix does not match dimensions of A", GSL_EBADLEN); } else if (N == 1) { /* base case, compute householder transform for single column matrix */ gsl_complex * T00 = gsl_matrix_complex_ptr(T, 0, 0); gsl_vector_complex_view v = gsl_matrix_complex_column(A, 0); *T00 = gsl_linalg_complex_householder_transform(&v.vector); return GSL_SUCCESS; } else { /* * partition matrices: * * N1 N2 N1 N2 * N1 [ A11 A12 ] and N1 [ T11 T12 ] * M2 [ A21 A22 ] N2 [ 0 T22 ] */ int status; const size_t N1 = N / 2; const size_t N2 = N - N1; const size_t M2 = M - N1; gsl_matrix_complex_view A11 = gsl_matrix_complex_submatrix(A, 0, 0, N1, N1); gsl_matrix_complex_view A12 = gsl_matrix_complex_submatrix(A, 0, N1, N1, N2); gsl_matrix_complex_view A21 = gsl_matrix_complex_submatrix(A, N1, 0, M2, N1); gsl_matrix_complex_view A22 = gsl_matrix_complex_submatrix(A, N1, N1, M2, N2); gsl_matrix_complex_view T11 = gsl_matrix_complex_submatrix(T, 0, 0, N1, N1); gsl_matrix_complex_view T12 = gsl_matrix_complex_submatrix(T, 0, N1, N1, N2); gsl_matrix_complex_view T22 = gsl_matrix_complex_submatrix(T, N1, N1, N2, N2); gsl_matrix_complex_view m; /* * Eq. 2: recursively factor * * [ A11 ] = Q1 [ R11 ] * [ A21 ] [ 0 ] * N1 * Note: Q1 = I - V1 T11 V1^H, where V1 = [ V11 ] N1 * [ V21 ] M2 */ m = gsl_matrix_complex_submatrix(A, 0, 0, M, N1); status = gsl_linalg_complex_QR_decomp_r(&m.matrix, &T11.matrix); if (status) return status; /* * Eq. 3: * * [ R12 ] := Q1^H [ A12 ] = [ A12 ] - [ V11 W ] * [ A22 ] [ A22 ] [ A22 ] [ V21 W ] * * where W = T11^H (V11^H A12 + V21^H A22), and using T12 as temporary storage */ gsl_matrix_complex_memcpy(&T12.matrix, &A12.matrix); /* W := A12 */ gsl_blas_ztrmm(CblasLeft, CblasLower, CblasConjTrans, CblasUnit, GSL_COMPLEX_ONE, &A11.matrix, &T12.matrix); /* W := V11^H * A12 */ gsl_blas_zgemm(CblasConjTrans, CblasNoTrans, GSL_COMPLEX_ONE, &A21.matrix, &A22.matrix, GSL_COMPLEX_ONE, &T12.matrix); /* W := W + V21^H * A22 */ gsl_blas_ztrmm(CblasLeft, CblasUpper, CblasConjTrans, CblasNonUnit, GSL_COMPLEX_ONE, &T11.matrix, &T12.matrix); /* W := T11^H * W */ gsl_blas_zgemm(CblasNoTrans, CblasNoTrans, GSL_COMPLEX_NEGONE, &A21.matrix, &T12.matrix, GSL_COMPLEX_ONE, &A22.matrix); /* A22 = A22 - V21 * W */ gsl_blas_ztrmm(CblasLeft, CblasLower, CblasNoTrans, CblasUnit, GSL_COMPLEX_ONE, &A11.matrix, &T12.matrix); /* tmp = V11 * W */ gsl_matrix_complex_sub(&A12.matrix, &T12.matrix); /* R12 := A12 - V11 * W */ /* * Eq. 4: recursively factor * * A22 = Q2~ R22 * * N1 M2 * Note: Q2 = [ I 0 ] N1 * [ 0 Q2~ ] M2 */ status = gsl_linalg_complex_QR_decomp_r(&A22.matrix, &T22.matrix); if (status) return status; /* * Eq. 13: update T12 := -T11 * V1^H * V2 * T22 * * where: * * N1 N2 * V1 = [ V11 ] N1 V2 = [ 0 ] N1 * [ V21 ] N2 [ V22 ] N2 * [ V31 ] M-N [ V32 ] M-N * * Note: V1^H V2 = V21^H V22 + V31^H V32 * Also, V11, V22 are unit lower triangular */ m = gsl_matrix_complex_submatrix(&A21.matrix, 0, 0, N2, N1); /* V21 */ gsl_matrix_complex_conjtrans_memcpy(&T12.matrix, &m.matrix); /* T12 := V21^H */ m = gsl_matrix_complex_submatrix(A, N1, N1, N2, N2); /* V22 */ gsl_blas_ztrmm(CblasRight, CblasLower, CblasNoTrans, CblasUnit, GSL_COMPLEX_ONE, &m.matrix, &T12.matrix); /* T12 := V21^H * V22 */ if (M > N) { gsl_matrix_complex_view V31 = gsl_matrix_complex_submatrix(A, N, 0, M - N, N1); gsl_matrix_complex_view V32 = gsl_matrix_complex_submatrix(A, N, N1, M - N, N2); gsl_blas_zgemm(CblasConjTrans, CblasNoTrans, GSL_COMPLEX_ONE, &V31.matrix, &V32.matrix, GSL_COMPLEX_ONE, &T12.matrix); /* T12 := T12 + V31^T * V32 */ } gsl_blas_ztrmm(CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, GSL_COMPLEX_NEGONE, &T11.matrix, &T12.matrix); /* T12 := -T11 * T12 */ gsl_blas_ztrmm(CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, GSL_COMPLEX_ONE, &T22.matrix, &T12.matrix); /* T12 := T12 * T22 */ return GSL_SUCCESS; } } /* Solves the square system A x = b for x using the QR factorisation, * * R x = Q^H b * * where Q = I - V T V^H */ int gsl_linalg_complex_QR_solve_r (const gsl_matrix_complex * QR, const gsl_matrix_complex * T, const gsl_vector_complex * b, gsl_vector_complex * x) { const size_t N = QR->size2; if (QR->size1 != N) { GSL_ERROR ("QR matrix must be square", GSL_ENOTSQR); } else if (T->size1 != QR->size1 || T->size2 != QR->size2) { GSL_ERROR ("T matrix must be N-by-N", GSL_EBADLEN); } else if (N != 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 { size_t i; /* compute Q^H b = [I - V T^H V^H] b */ /* x := V^H b */ gsl_vector_complex_memcpy(x, b); gsl_blas_ztrmv(CblasLower, CblasConjTrans, CblasUnit, QR, x); /* x = T^H * x */ gsl_blas_ztrmv(CblasUpper, CblasConjTrans, CblasNonUnit, T, x); /* x = V * x */ gsl_blas_ztrmv(CblasLower, CblasNoTrans, CblasUnit, QR, x); /* x = b - V * x */ for (i = 0; i < N; ++i) { gsl_complex * xi = gsl_vector_complex_ptr(x, i); gsl_complex bi = gsl_vector_complex_get(b, i); GSL_REAL(*xi) = GSL_REAL(bi) - GSL_REAL(*xi); GSL_IMAG(*xi) = GSL_IMAG(bi) - GSL_IMAG(*xi); } /* Solve R x = Q^H b, storing x in-place */ gsl_blas_ztrsv (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. * * Inputs: QR - [R; V] matrix, M-by-N * T - upper triangular block reflector, N-by-N * b - right hand side, size M * x - (output) solution, size M * x(1:N) = least squares solution vector * x(N+1:M) = vector whose norm equals ||b - Ax|| * work - workspace, size N */ int gsl_linalg_complex_QR_lssolve_r (const gsl_matrix_complex * QR, const gsl_matrix_complex * T, const gsl_vector_complex * b, gsl_vector_complex * x, gsl_vector_complex * work) { 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 (T->size1 != N || T->size2 != N) { GSL_ERROR ("T matrix must be N-by-N", GSL_EBADLEN); } else if (M != b->size) { GSL_ERROR ("matrix size must match b size", GSL_EBADLEN); } else if (M != x->size) { GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN); } else if (N != work->size) { GSL_ERROR ("matrix size must match work size", GSL_EBADLEN); } else { gsl_matrix_complex_const_view R = gsl_matrix_complex_const_submatrix (QR, 0, 0, N, N); gsl_vector_complex_view x1 = gsl_vector_complex_subvector(x, 0, N); /* compute x = Q^H b */ gsl_vector_complex_memcpy(x, b); gsl_linalg_complex_QR_QHvec_r (QR, T, x, work); /* Solve R x = Q^H b */ gsl_blas_ztrsv (CblasUpper, CblasNoTrans, CblasNonUnit, &R.matrix, &x1.vector); return GSL_SUCCESS; } } /* gsl_linalg_complex_QR_unpack_r() Unpack matrices Q and R Inputs: QR - packed QR format, M-by-N T - block reflector matrix, N-by-N Q - (output) Q matrix, M-by-M R - (output) R matrix, N-by-N Return: success/error Notes: 1) Implementation provided by Julien Langou */ int gsl_linalg_complex_QR_unpack_r(const gsl_matrix_complex * QR, const gsl_matrix_complex * T, gsl_matrix_complex * Q, gsl_matrix_complex * R) { 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 (Q->size1 != M || Q->size2 != M) { GSL_ERROR ("Q matrix must be M-by-M", GSL_EBADLEN); } else if (R->size1 != N || R->size2 != N) { GSL_ERROR ("R matrix must be N-by-N", GSL_EBADLEN); } else if (T->size1 != N || T->size2 != N) { GSL_ERROR ("T matrix must be N-by-N", GSL_EBADLEN); } else { gsl_matrix_complex_const_view RV = gsl_matrix_complex_const_submatrix(QR, 0, 0, N, N); gsl_matrix_complex_view Q1 = gsl_matrix_complex_submatrix(Q, 0, 0, M, N); gsl_matrix_complex_view m; /* * set Q1 = [ T ] * [ V ] */ m = gsl_matrix_complex_submatrix(Q, 0, 0, N, N); gsl_matrix_complex_tricpy(CblasUpper, CblasNonUnit, &m.matrix, T); gsl_matrix_complex_tricpy(CblasLower, CblasUnit, &m.matrix, &RV.matrix); if (M > N) { gsl_matrix_complex_const_view tmp = gsl_matrix_complex_const_submatrix(QR, N, 0, M - N, N); m = gsl_matrix_complex_submatrix(Q, N, 0, M - N, N); gsl_matrix_complex_memcpy(&m.matrix, &tmp.matrix); } unpack_Q1(&Q1.matrix); if (M > N) { gsl_matrix_complex_view Q2 = gsl_matrix_complex_submatrix(Q, 0, N, M, M - N); unpack_Q2(QR, T, &Q2.matrix); } /* copy R */ gsl_matrix_complex_tricpy(CblasUpper, CblasNonUnit, R, &RV.matrix); return GSL_SUCCESS; } } /* gsl_linalg_QR_QHvec_r() Apply M-by-M Q^H to the M-by-1 vector b Inputs: QR - [R; V] matrix encoded by gsl_linalg_complex_QR_decomp_r T - block reflector matrix b - M-by-1 vector replaced by Q^H b on output work - workspace, length N Notes: 1) Q^H b = (I - V T^H V^H) b = b - V T^H [ V1^H V2^H ] [ b1 ] [ b2 ] = b - V T^H [ V1^H b1 + V2^H b2 ] = [ b1 ] - [ V1 w ] [ b2 ] [ V2 w ] where w = T^H ( V1^H b1 + V2^H b2 ) */ int gsl_linalg_complex_QR_QHvec_r(const gsl_matrix_complex * QR, const gsl_matrix_complex * T, gsl_vector_complex * b, gsl_vector_complex * 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 (T->size1 != N || T->size2 != N) { GSL_ERROR ("T matrix must be N-by-N", GSL_EBADLEN); } else if (b->size != M) { GSL_ERROR ("b vector must have length M", GSL_EBADLEN); } else if (work->size != N) { GSL_ERROR ("workspace must be length N", GSL_EBADLEN); } else { gsl_matrix_complex_const_view V1 = gsl_matrix_complex_const_submatrix(QR, 0, 0, N, N); gsl_vector_complex_view b1 = gsl_vector_complex_subvector(b, 0, N); gsl_vector_complex_view b2; /* work := V1^H b1 */ gsl_vector_complex_memcpy(work, &b1.vector); gsl_blas_ztrmv(CblasLower, CblasConjTrans, CblasUnit, &V1.matrix, work); if (M > N) { gsl_matrix_complex_const_view V2 = gsl_matrix_complex_const_submatrix(QR, N, 0, M - N, N); /* work = work + V2^H b2 */ b2 = gsl_vector_complex_subvector(b, N, M - N); gsl_blas_zgemv(CblasConjTrans, GSL_COMPLEX_ONE, &V2.matrix, &b2.vector, GSL_COMPLEX_ONE, work); } /* work = T^H * work */ gsl_blas_ztrmv(CblasUpper, CblasConjTrans, CblasNonUnit, T, work); if (M > N) { /* b2 = b2 - V2 * work */ gsl_matrix_complex_const_view V2 = gsl_matrix_complex_const_submatrix(QR, N, 0, M - N, N); gsl_blas_zgemv(CblasNoTrans, GSL_COMPLEX_NEGONE, &V2.matrix, work, GSL_COMPLEX_ONE, &b2.vector); } /* b1 = b1 - V1 * work */ gsl_blas_ztrmv(CblasLower, CblasNoTrans, CblasUnit, &V1.matrix, work); gsl_vector_complex_sub(&b1.vector, work); return GSL_SUCCESS; } } /* unpack_Q1() Compute Q_1 Inputs: Q - on input, contains T in upper triangle and V in lower trapezoid on output, contains Q_1 M-by-N Return: success/error Notes: 1) N Q1 = [ Q1 Q2 ] [ I_n ] = (I - V T V^H) [ I; 0 ] = [ I - V1 T V1^H ] N [ 0 ] [ - V2 T V1^H ] M - N */ static int unpack_Q1(gsl_matrix_complex * Q) { int status; const size_t M = Q->size1; const size_t N = Q->size2; gsl_matrix_complex_view Q1 = gsl_matrix_complex_submatrix(Q, 0, 0, N, N); gsl_vector_complex_view diag = gsl_matrix_complex_diagonal(&Q1.matrix); /* Q1 := T V1^H */ status = aux_ULH(&Q1.matrix, &Q1.matrix); if (status) return status; if (M > N) { /* compute Q2 := - V2 T V1^H */ gsl_matrix_complex_view V2 = gsl_matrix_complex_submatrix(Q, N, 0, M - N, N); gsl_blas_ztrmm(CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, GSL_COMPLEX_NEGONE, &Q1.matrix, &V2.matrix); } /* Q1 := - V1 T V1^H */ status = aux_mLU(&Q1.matrix); if (status) return status; /* Q1 := I - V1 T V1^H */ gsl_vector_complex_add_constant(&diag.vector, GSL_COMPLEX_ONE); return GSL_SUCCESS; } /* unpack_Q2() Compute Q_2 Inputs: QR - [R; V] from QR_decomp_r, M-by-N T - upper triangular T factor, N-by-N Q - (output) Q_2 factor, M-by-(M-N) Return: success/error Notes: N M-N 1) Since Q = I - V T V^H = M [ Q1 Q2 ], we have M-N Q2 = Q [ 0 ] N [ I_{M-N} ] M-N So, Q2 = Q [ 0; I ] = (I - V T V^H) [ 0; I ] = [ - V1 T V2^H ] [ I - V2 T V2^H ] */ static int unpack_Q2(const gsl_matrix_complex * QR, const gsl_matrix_complex * T, gsl_matrix_complex * Q) { 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 (T->size1 != N || T->size2 != N) { GSL_ERROR ("T matrix must be N-by-N", GSL_EBADLEN); } else if (Q->size1 != M || Q->size2 != (M - N)) { GSL_ERROR ("Q matrix must be M-by-(M-N)", GSL_EBADLEN); } else { gsl_matrix_complex_const_view V1 = gsl_matrix_complex_const_submatrix(QR, 0, 0, N, N); gsl_matrix_complex_const_view V2 = gsl_matrix_complex_const_submatrix(QR, N, 0, M - N, N); gsl_matrix_complex_view Q1 = gsl_matrix_complex_submatrix(Q, 0, 0, N, M - N); gsl_matrix_complex_view Q2 = gsl_matrix_complex_submatrix(Q, N, 0, M - N, M - N); gsl_vector_complex_view diag = gsl_matrix_complex_diagonal(&Q2.matrix); /* Q1 := V2^H */ gsl_matrix_complex_conjtrans_memcpy(&Q1.matrix, &V2.matrix); /* Q1 := - T V2^H */ gsl_blas_ztrmm(CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, GSL_COMPLEX_NEGONE, T, &Q1.matrix); /* Q2 := - V2 T V2^H */ gsl_blas_zgemm(CblasNoTrans, CblasNoTrans, GSL_COMPLEX_ONE, &V2.matrix, &Q1.matrix, GSL_COMPLEX_ZERO, &Q2.matrix); /* Q2 := I - V2 T V2^H */ gsl_vector_complex_add_constant(&diag.vector, GSL_COMPLEX_ONE); /* Q1 := - V1 T V2^H */ gsl_blas_ztrmm(CblasLeft, CblasLower, CblasNoTrans, CblasUnit, GSL_COMPLEX_ONE, &V1.matrix, &Q1.matrix); return GSL_SUCCESS; } } /* U := U L^H for triangular matrices L and U; L is unit lower triangular */ static int aux_ULH(const gsl_matrix_complex * L, gsl_matrix_complex * U) { const size_t N = L->size1; if (N != L->size2) { GSL_ERROR ("L matrix must be square", GSL_ENOTSQR); } else if (U->size1 != N || U->size2 != N) { GSL_ERROR ("U matrix must be same size as L", GSL_EBADLEN); } else if (N == 1) { /* nothing to do */ return GSL_SUCCESS; } else { int status; const size_t N1 = N / 2; const size_t N2 = N - N1; gsl_matrix_complex_const_view L11 = gsl_matrix_complex_const_submatrix(L, 0, 0, N1, N1); gsl_matrix_complex_const_view L21 = gsl_matrix_complex_const_submatrix(L, N1, 0, N2, N1); gsl_matrix_complex_const_view L22 = gsl_matrix_complex_const_submatrix(L, N1, N1, N2, N2); gsl_matrix_complex_view U11 = gsl_matrix_complex_submatrix(U, 0, 0, N1, N1); gsl_matrix_complex_view U12 = gsl_matrix_complex_submatrix(U, 0, N1, N1, N2); gsl_matrix_complex_view U22 = gsl_matrix_complex_submatrix(U, N1, N1, N2, N2); /* U12 = U12 * L22^H */ gsl_blas_ztrmm(CblasRight, CblasLower, CblasConjTrans, CblasUnit, GSL_COMPLEX_ONE, &L22.matrix, &U12.matrix); /* U12 = U12 + U11 * L21^H */ status = aux_ApUBH(&U11.matrix, &L21.matrix, &U12.matrix); if (status) return status; status = aux_ULH(&L11.matrix, &U11.matrix); if (status) return status; status = aux_ULH(&L22.matrix, &U22.matrix); if (status) return status; return GSL_SUCCESS; } } /* store -L*U in A */ static int aux_mLU(gsl_matrix_complex * A) { const size_t N = A->size1; if (N != A->size2) { GSL_ERROR ("matrix must be square", GSL_ENOTSQR); } else if (N == 1) { gsl_complex *A00 = gsl_matrix_complex_ptr(A, 0, 0); GSL_REAL(*A00) = -GSL_REAL(*A00); GSL_IMAG(*A00) = -GSL_IMAG(*A00); return GSL_SUCCESS; } else { int status; const size_t N1 = N / 2; const size_t N2 = N - N1; gsl_matrix_complex_view A11 = gsl_matrix_complex_submatrix(A, 0, 0, N1, N1); gsl_matrix_complex_view A12 = gsl_matrix_complex_submatrix(A, 0, N1, N1, N2); gsl_matrix_complex_view A21 = gsl_matrix_complex_submatrix(A, N1, 0, N2, N1); gsl_matrix_complex_view A22 = gsl_matrix_complex_submatrix(A, N1, N1, N2, N2); /* A22 = - L22 U22 */ status = aux_mLU(&A22.matrix); if (status) return status; /* A22 = A22 - L21 U12 */ gsl_blas_zgemm(CblasNoTrans, CblasNoTrans, GSL_COMPLEX_NEGONE, &A21.matrix, &A12.matrix, GSL_COMPLEX_ONE, &A22.matrix); /* A12 - -L11 U12 */ gsl_blas_ztrmm(CblasLeft, CblasLower, CblasNoTrans, CblasUnit, GSL_COMPLEX_NEGONE, &A11.matrix, &A12.matrix); /* A21 = -L21 U11 */ gsl_blas_ztrmm(CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, GSL_COMPLEX_NEGONE, &A11.matrix, &A21.matrix); /* A11 = - L11 U11 */ status = aux_mLU(&A11.matrix); if (status) return status; return GSL_SUCCESS; } } /* A := A + U B^H where U is upper triangular */ static int aux_ApUBH(const gsl_matrix_complex * U, const gsl_matrix_complex * B, gsl_matrix_complex * A) { const size_t M = A->size1; const size_t N = A->size2; if (U->size1 != M || U->size2 != M) { GSL_ERROR ("U matrix has wrong dimensions", GSL_EBADLEN); } else if (B->size1 != N || B->size2 != M) { GSL_ERROR ("B matrix has wrong dimensions", GSL_EBADLEN); } else if (M == 1 && N == 1) { gsl_complex *aptr = gsl_matrix_complex_ptr(A, 0, 0); const gsl_complex U00 = gsl_matrix_complex_get(U, 0, 0); const gsl_complex B00_conj = gsl_complex_conjugate(gsl_matrix_complex_get(B, 0, 0)); const gsl_complex prod = gsl_complex_mul(U00, B00_conj); GSL_REAL(*aptr) += GSL_REAL(prod); GSL_IMAG(*aptr) += GSL_IMAG(prod); return GSL_SUCCESS; } else if (M == 1) { gsl_complex U00 = gsl_matrix_complex_get(U, 0, 0); size_t i; for (i = 0; i < N; ++i) { gsl_complex * ai = gsl_matrix_complex_ptr(A, 0, i); gsl_complex bi = gsl_matrix_complex_get(B, i, 0); gsl_complex prod = gsl_complex_mul(U00, gsl_complex_conjugate(bi)); GSL_REAL(*ai) += GSL_REAL(prod); GSL_IMAG(*ai) += GSL_IMAG(prod); } return GSL_SUCCESS; } else if (N == 1) { /* * partition: * * M1 M2 * B = 1 [ B11 B12 ] * * 1 M1 M2 1 * M1 [ A11 ] + [ U11 U12 ] [ B11^H ] M1 * M2 [ A21 ] [ 0 U22 ] [ B12^H ] M2 */ int status; const size_t M1 = M / 2; const size_t M2 = M - M1; gsl_matrix_complex_view A11 = gsl_matrix_complex_submatrix(A, 0, 0, M1, 1); gsl_matrix_complex_view A21 = gsl_matrix_complex_submatrix(A, M1, 0, M2, 1); gsl_matrix_complex_const_view U11 = gsl_matrix_complex_const_submatrix(U, 0, 0, M1, M1); gsl_matrix_complex_const_view U12 = gsl_matrix_complex_const_submatrix(U, 0, M1, M1, M2); gsl_matrix_complex_const_view U22 = gsl_matrix_complex_const_submatrix(U, M1, M1, M2, M2); gsl_matrix_complex_const_view B11 = gsl_matrix_complex_const_submatrix(B, 0, 0, 1, M1); gsl_matrix_complex_const_view B12 = gsl_matrix_complex_const_submatrix(B, 0, M1, 1, M2); /* A11 += U12 * B12^H */ gsl_blas_zgemm(CblasNoTrans, CblasConjTrans, GSL_COMPLEX_ONE, &U12.matrix, &B12.matrix, GSL_COMPLEX_ONE, &A11.matrix); /* A11 := A11 + U11 B11^H */ status = aux_ApUBH(&U11.matrix, &B11.matrix, &A11.matrix); if (status) return status; /* A21 := A21 + U22 B12^H */ status = aux_ApUBH(&U22.matrix, &B12.matrix, &A21.matrix); if (status) return status; return GSL_SUCCESS; } else { int status; const size_t M1 = M / 2; const size_t M2 = M - M1; const size_t N1 = N / 2; const size_t N2 = N - N1; gsl_matrix_complex_view A11 = gsl_matrix_complex_submatrix(A, 0, 0, M1, N1); gsl_matrix_complex_view A12 = gsl_matrix_complex_submatrix(A, 0, N1, M1, N2); gsl_matrix_complex_view A21 = gsl_matrix_complex_submatrix(A, M1, 0, M2, N1); gsl_matrix_complex_view A22 = gsl_matrix_complex_submatrix(A, M1, N1, M2, N2); gsl_matrix_complex_const_view U11 = gsl_matrix_complex_const_submatrix(U, 0, 0, M1, M1); gsl_matrix_complex_const_view U12 = gsl_matrix_complex_const_submatrix(U, 0, M1, M1, M2); gsl_matrix_complex_const_view U22 = gsl_matrix_complex_const_submatrix(U, M1, M1, M2, M2); gsl_matrix_complex_const_view B11 = gsl_matrix_complex_const_submatrix(B, 0, 0, N1, M1); gsl_matrix_complex_const_view B12 = gsl_matrix_complex_const_submatrix(B, 0, M1, N1, M2); gsl_matrix_complex_const_view B21 = gsl_matrix_complex_const_submatrix(B, N1, 0, N2, M1); gsl_matrix_complex_const_view B22 = gsl_matrix_complex_const_submatrix(B, N1, M1, N2, M2); /* A11 := A11 + U11 B11^H */ status = aux_ApUBH(&U11.matrix, &B11.matrix, &A11.matrix); if (status) return status; /* A11 := A11 + U12 B12^H */ gsl_blas_zgemm(CblasNoTrans, CblasConjTrans, GSL_COMPLEX_ONE, &U12.matrix, &B12.matrix, GSL_COMPLEX_ONE, &A11.matrix); /* A12 := A12 + U11 B21^H */ status = aux_ApUBH(&U11.matrix, &B21.matrix, &A12.matrix); if (status) return status; /* A12 := A12 + U12 B22^H */ gsl_blas_zgemm(CblasNoTrans, CblasConjTrans, GSL_COMPLEX_ONE, &U12.matrix, &B22.matrix, GSL_COMPLEX_ONE, &A12.matrix); /* A21 := A21 + U22 B12^H */ status = aux_ApUBH(&U22.matrix, &B12.matrix, &A21.matrix); if (status) return status; /* A22 := A22 + U22 B22^H */ status = aux_ApUBH(&U22.matrix, &B22.matrix, &A22.matrix); if (status) return status; return GSL_SUCCESS; } } gsl-2.7.1/linalg/lq.c0000644016036000116100000004116713373111455011270 00000000000000/* 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 = gsl_matrix_subrow (A, i, 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 = b Q^T */ gsl_linalg_LQ_vecQT (LQ, tau, x); /* Solve L^T 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 M = LQ->size1; const size_t N = LQ->size2; if (Q->size1 != N || Q->size2 != N) { GSL_ERROR ("Q matrix must be N x N", GSL_ENOTSQR); } else if (L->size1 != M || L->size2 != N) { GSL_ERROR ("L matrix 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 { 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 h = gsl_matrix_const_subrow (LQ, i, i, N - i); gsl_matrix_view m = gsl_matrix_submatrix (Q, i, i, N - i, N - 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 < M; i++) { l_border = GSL_MIN(i, N - 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 < N; 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_linalg_LQ_lssolve() Find the minimum norm least squares solution to the underdetermined system A x = b for M <= N using the LQ factorization A = L Q. */ int gsl_linalg_LQ_lssolve(const gsl_matrix * LQ, const gsl_vector * tau, const gsl_vector * b, gsl_vector * x, gsl_vector * residual) { const size_t M = LQ->size1; const size_t N = 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 L1 = gsl_matrix_const_submatrix (LQ, 0, 0, M, M); /* L_1 */ gsl_vector_view x1 = gsl_vector_subvector(x, 0, M); size_t i; gsl_vector_memcpy(&x1.vector, b); /* zero x(M+1:N) */ for (i = M; i < N; ++i) gsl_vector_set(x, i, 0.0); /* compute z = L_1^{-1} b */ gsl_blas_dtrsv(CblasLower, CblasNoTrans, CblasNonUnit, &L1.matrix, &x1.vector); /* residual = b - L_1 z */ gsl_vector_memcpy(residual, &x1.vector); gsl_blas_dtrmv(CblasLower, CblasNoTrans, CblasNonUnit, &L1.matrix, residual); gsl_vector_sub(residual, b); gsl_vector_scale(residual, -1.0); /* compute x = Q_1^T L_1^{-1} b = Q^T [ L_1^{-1} b ; 0 ] */ gsl_linalg_LQ_QTvec(LQ, tau, x); return GSL_SUCCESS; } } /* gsl_linalg_LQ_QTvec() Compute y = Q^T x Inputs: LQ - LQ matrix in packed format tau - tau vector v - on input, x; on output, y = Q^T x */ int gsl_linalg_LQ_QTvec(const gsl_matrix * LQ, const gsl_vector * tau, gsl_vector * v) { const size_t M = LQ->size1; const size_t N = LQ->size2; const size_t v_size = v->size; if (tau->size != GSL_MIN (M, N)) { GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN); } else if (v_size < GSL_MIN(M, N)) { GSL_ERROR ("vector size must be at least MIN(M,N)", GSL_EBADLEN); } else { size_t i; /* compute Q^T v */ for (i = GSL_MIN (M, N); i-- > 0;) { gsl_vector_const_view h = gsl_matrix_const_subrow (LQ, i, i, v_size - i); gsl_vector_view w = gsl_vector_subvector (v, i, v_size - i); double ti = gsl_vector_get (tau, i); gsl_linalg_householder_hv (ti, &(h.vector), &(w.vector)); } return GSL_SUCCESS; } } gsl-2.7.1/linalg/ptlq.c0000644016036000116100000003143613373111455011632 00000000000000/* 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 = gsl_matrix_subrow (A, i, 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 = gsl_matrix_subrow (A, j, 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-2.7.1/linalg/svd.c0000644016036000116100000004614713373111455011453 00000000000000/* 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-2.7.1/linalg/householder.c0000644016036000116100000003017513570652170013175 00000000000000/* 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 = - GSL_SIGN(alpha) * 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; } } /* gsl_linalg_householder_transform2() Compute a householder transformation P so that P [ alpha ] = [ beta ] [ x(1:n-1) ] [ 0 ] where P = I - tau [ 1 ] [ 1 v' ] [ v ] Inputs: alpha - on input, alpha scalar on output, beta scalar v - length n vector on input, v(1:n-1) contains x vector on output, v(1:n-1) householder vector v v(n) is not modified */ double gsl_linalg_householder_transform2 (double * alpha, gsl_vector * v) { const size_t n = v->size; if (n == 1) { return 0.0; /* tau = 0 */ } else { double beta, tau; gsl_vector_view x = gsl_vector_subvector (v, 0, n - 1); double xnorm = gsl_blas_dnrm2 (&x.vector); if (xnorm == 0) { return 0.0; /* tau = 0 */ } beta = - GSL_SIGN(*alpha) * 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); *alpha = beta; } else { gsl_blas_dscal (GSL_DBL_EPSILON / s, &x.vector); gsl_blas_dscal (1.0 / GSL_DBL_EPSILON, &x.vector); *alpha = 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; } /* gsl_linalg_householder_left() Apply a Householder reflector H = I - tau v v^T to a M-by-N matrix A from the left Inputs: tau - Householder coefficient v - Householder vector, length M A - (input/output) M-by-N matrix on input; on output, H*A work - workspace, length N Notes: 1) This routine replaces gsl_linalg_householder_hm */ int gsl_linalg_householder_left(const double tau, const gsl_vector * v, gsl_matrix * A, gsl_vector * work) { const size_t M = A->size1; const size_t N = A->size2; if (v->size != M) { GSL_ERROR ("matrix must match Householder vector dimensions", GSL_EBADLEN); } else if (work->size != N) { GSL_ERROR ("workspace must match matrix", GSL_EBADLEN); } else { /* quick return */ if (tau == 0.0) return GSL_SUCCESS; /* work := A^T v */ gsl_blas_dgemv(CblasTrans, 1.0, A, v, 0.0, work); /* A := A - tau v work^T */ gsl_blas_dger(-tau, v, work, A); return GSL_SUCCESS; } } /* gsl_linalg_householder_right() Apply a Householder reflector H = I - tau v v^T to a M-by-N matrix A from the right Inputs: tau - Householder coefficient v - Householder vector, length N A - (input/output) M-by-N matrix on input; on output, A*H work - workspace, length M Notes: 1) v(1) is modified but is restored on output 2) This routine replaces gsl_linalg_householder_mh */ int gsl_linalg_householder_right(const double tau, const gsl_vector * v, gsl_matrix * A, gsl_vector * work) { const size_t M = A->size1; const size_t N = A->size2; if (v->size != N) { GSL_ERROR ("matrix must match Householder vector dimensions", GSL_EBADLEN); } else if (work->size != M) { GSL_ERROR ("workspace must match matrix", GSL_EBADLEN); } else { double v0; /* quick return */ if (tau == 0.0) return GSL_SUCCESS; v0 = gsl_vector_get(v, 0); v->data[0] = 1.0; /* work := A v */ gsl_blas_dgemv(CblasNoTrans, 1.0, A, v, 0.0, work); /* A := A - tau work v^T */ gsl_blas_dger(-tau, work, v, A); v->data[0] = v0; 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-2.7.1/linalg/householdercomplex.c0000644016036000116100000002223713667475306014600 00000000000000/* 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_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; if (N == 1) { gsl_complex w0 = gsl_vector_complex_get(w, 0); gsl_complex a, b; GSL_SET_COMPLEX(&a, 1.0 - GSL_REAL(tau), -GSL_IMAG(tau)); /* a = 1 - tau */ b = gsl_complex_mul(a, w0); /* b = (1 - tau) w0 */ gsl_vector_complex_set(w, 0, b); } else { /* 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_linalg_complex_householder_left() Apply a Householder reflector H = I - tau v v^H to a M-by-N matrix A from the left Inputs: tau - Householder coefficient v - Householder vector, length M A - (input/output) M-by-N matrix on input; on output, H*A work - workspace, length N Notes: 1) v(1) is modified but is restored on output 2) This routine replaces gsl_linalg_complex_householder_hm */ int gsl_linalg_complex_householder_left(const gsl_complex tau, const gsl_vector_complex * v, gsl_matrix_complex * A, gsl_vector_complex * work) { const size_t M = A->size1; const size_t N = A->size2; if (v->size != M) { GSL_ERROR ("matrix must match Householder vector dimensions", GSL_EBADLEN); } else if (work->size != N) { GSL_ERROR ("workspace must match matrix", GSL_EBADLEN); } else { gsl_complex v0, mtau; /* quick return */ if (GSL_REAL(tau) == 0.0 && GSL_IMAG(tau) == 0.0) return GSL_SUCCESS; v0 = gsl_vector_complex_get(v, 0); v->data[0] = 1.0; v->data[1] = 0.0; /* work := A^H v */ gsl_blas_zgemv(CblasConjTrans, GSL_COMPLEX_ONE, A, v, GSL_COMPLEX_ZERO, work); /* A := A - tau v work^H */ GSL_REAL(mtau) = -GSL_REAL(tau); GSL_IMAG(mtau) = -GSL_IMAG(tau); gsl_blas_zgerc(mtau, v, work, A); v->data[0] = GSL_REAL(v0); v->data[1] = GSL_IMAG(v0); return GSL_SUCCESS; } } #ifndef GSL_DISABLE_DEPRECATED 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; } #endif gsl-2.7.1/linalg/hessenberg.c0000644016036000116100000003101013472607151012766 00000000000000/* 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() */ gsl-2.7.1/linalg/hesstri.c0000644016036000116100000001264513373111455012334 00000000000000/* 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-2.7.1/linalg/cholesky.c0000644016036000116100000004302713521372357012477 00000000000000/* Cholesky Decomposition * * Copyright (C) 2000 Thomas Walter * Copyright (C) 2000, 2001, 2002, 2003, 2005, 2007 Brian Gough, Gerard Jungman * Copyright (C) 2016, 2019 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 * 26 May 2019: implement recursive Cholesky with Level 3 BLAS by Patrick Alken */ /* * Cholesky decomposition of a symmetric positive definite matrix. * * 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 #include "recurse.h" static double cholesky_norm1(const gsl_matrix * LLT, gsl_vector * work); static int cholesky_Ainv(CBLAS_TRANSPOSE_t TransA, gsl_vector * x, void * params); static int cholesky_decomp_L2 (gsl_matrix * A); static int cholesky_decomp_L3 (gsl_matrix * A); /* 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(CblasLower, CblasUnit, A, A); } return status; } /* gsl_linalg_cholesky_decomp1() Perform Cholesky decomposition of a symmetric positive definite matrix using lower triangle using Level 3 BLAS algorithm. Inputs: A - (input) symmetric, positive definite matrix (output) lower triangle contains Cholesky factor Return: success/error Notes: 1) original matrix is saved in upper triangle on output */ int gsl_linalg_cholesky_decomp1 (gsl_matrix * A) { const size_t N = A->size1; if (N != A->size2) { GSL_ERROR("Cholesky decomposition requires square matrix", GSL_ENOTSQR); } else { /* save original matrix in upper triangle for later rcond calculation */ gsl_matrix_transpose_tricpy(CblasLower, CblasUnit, A, A); return cholesky_decomp_L3(A); } } 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; } } int gsl_linalg_cholesky_solve_mat (const gsl_matrix * LLT, const gsl_matrix * B, gsl_matrix * X) { if (LLT->size1 != LLT->size2) { GSL_ERROR ("cholesky matrix must be square", GSL_ENOTSQR); } else if (LLT->size1 != B->size1) { GSL_ERROR ("matrix size must match B size", GSL_EBADLEN); } else if (LLT->size2 != X->size1) { GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN); } else { int status; /* copy X <- B */ gsl_matrix_memcpy (X, B); status = gsl_linalg_cholesky_svx_mat(LLT, X); return status; } } int gsl_linalg_cholesky_svx_mat (const gsl_matrix * LLT, gsl_matrix * X) { if (LLT->size1 != LLT->size2) { GSL_ERROR ("cholesky matrix must be square", GSL_ENOTSQR); } else if (LLT->size2 != X->size1) { GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN); } else { /* solve for C using forward-substitution, L C = B */ gsl_blas_dtrsm (CblasLeft, CblasLower, CblasNoTrans, CblasNonUnit, 1.0, LLT, X); /* perform back-substitution, L^T X = C */ gsl_blas_dtrsm (CblasLeft, CblasLower, CblasTrans, CblasNonUnit, 1.0, 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 { int status; /* invert the lower triangle of LLT */ status = gsl_linalg_tri_invert(CblasLower, CblasNonUnit, LLT); if (status) return status; /* compute A^{-1} = L^{-T} L^{-1} */ status = gsl_linalg_tri_LTL(LLT); if (status) return status; /* copy lower triangle to upper */ gsl_matrix_transpose_tricpy(CblasLower, CblasUnit, LLT, LLT); return GSL_SUCCESS; } } int gsl_linalg_cholesky_decomp_unit(gsl_matrix * A, gsl_vector * D) { const size_t N = A->size1; size_t i, j; /* initial Cholesky */ int stat_chol = gsl_linalg_cholesky_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; } /* cholesky_decomp_L2() Perform Cholesky decomposition of a symmetric positive definite matrix using lower triangle 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), using Level 2 BLAS. */ static int cholesky_decomp_L2 (gsl_matrix * A) { const size_t N = A->size1; if (N != A->size2) { 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; } } /* cholesky_decomp_L3() Perform Cholesky decomposition of a symmetric positive definite matrix using Level 3 BLAS. Inputs: A - (input) symmetric, positive definite matrix in lower triangle (output) lower triangle contains Cholesky factor Return: success/error Notes: 1) Based on ReLAPACK recursive block Cholesky algorithm using Level 3 BLAS 2) 28 May 2019: performed several benchmark tests of this recursive variant against the right-looking block variant from LAPACK. This recursive variant performed faster in all cases, so it is now the default algorithm. */ static int cholesky_decomp_L3 (gsl_matrix * A) { const size_t N = A->size1; if (N != A->size2) { GSL_ERROR("Cholesky decomposition requires square matrix", GSL_ENOTSQR); } else if (N <= CROSSOVER_CHOLESKY) { /* use unblocked Level 2 algorithm */ return cholesky_decomp_L2(A); } else { /* * partition matrix: * * A11 A12 * A21 A22 * * where A11 is N1-by-N1 */ int status; const size_t N1 = GSL_LINALG_SPLIT(N); const size_t N2 = N - N1; gsl_matrix_view A11 = gsl_matrix_submatrix(A, 0, 0, N1, N1); gsl_matrix_view A21 = gsl_matrix_submatrix(A, N1, 0, N2, N1); gsl_matrix_view A22 = gsl_matrix_submatrix(A, N1, N1, N2, N2); /* recursion on A11 */ status = cholesky_decomp_L3(&A11.matrix); if (status) return status; /* A21 = A21 * L11^{-T} */ gsl_blas_dtrsm(CblasRight, CblasLower, CblasTrans, CblasNonUnit, 1.0, &A11.matrix, &A21.matrix); /* A22 -= L21 L21^T */ gsl_blas_dsyrk(CblasLower, CblasNoTrans, -1.0, &A21.matrix, 1.0, &A22.matrix); /* recursion on A22 */ status = cholesky_decomp_L3(&A22.matrix); if (status) return status; return GSL_SUCCESS; } } gsl-2.7.1/linalg/choleskyc.c0000644016036000116100000002177014151556700012637 00000000000000/* linalg/choleskyc.c * * Copyright (C) 2007, 2019 Patrick Alken * Copyright (C) 2010 Huan Wu * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this 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 "recurse.h" /* * 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); static int complex_cholesky_decomp_L2(gsl_matrix_complex * A); static int complex_cholesky_decomp_L3(gsl_matrix_complex * A); /* gsl_linalg_complex_cholesky_decomp() Perform the Cholesky decomposition on a Hermitian positive definite matrix using Level 3 BLAS. Inputs: A - (input/output) complex positive definite matrix Return: success or error Notes: 1) 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 { return complex_cholesky_decomp_L3(A); } } /* 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); return gsl_linalg_complex_cholesky_svx(cholesky, x); } } /* 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_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 { int status; size_t N = LLT->size1; size_t i, j; /* invert the lower triangle of LLT */ status = gsl_linalg_complex_tri_invert(CblasLower, CblasNonUnit, LLT); if (status) return status; /* compute A^{-1} = L^{-H} L^{-1} */ status = gsl_linalg_complex_tri_LHL(LLT); if (status) return status; /* copy the Hermitian lower triangle to the upper triangle */ for (i = 1; i < N; ++i) { for (j = 0; j < i; ++j) { gsl_complex z = gsl_matrix_complex_get(LLT, i, j); gsl_matrix_complex_set(LLT, j, i, gsl_complex_conjugate(z)); } } return GSL_SUCCESS; } } /******************************************** * INTERNAL ROUTINES * ********************************************/ static void cholesky_complex_conj_vector(gsl_vector_complex *v) { size_t i; for (i = 0; i < v->size; ++i) { gsl_complex * vi = gsl_vector_complex_ptr(v, i); GSL_IMAG(*vi) = -GSL_IMAG(*vi); } } /* complex_cholesky_decomp_L2() Perform the Cholesky decomposition on a Hermitian positive definite matrix using Level 2 BLAS. See Golub & Van Loan, "Matrix Computations" (3rd ed), algorithm 4.2.2. Inputs: A - (input/output) complex postive definite matrix Return: success or error Notes: 1) The lower triangle of A is overwritten with the Cholesky decomposition */ static int complex_cholesky_decomp_L2(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 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); } } return GSL_SUCCESS; } } /* complex_cholesky_decomp_L3() Perform the Cholesky decomposition on a Hermitian positive definite matrix using Level 3 BLAS. Inputs: A - (input/output) complex postive definite matrix Return: success or error Notes: 1) The lower triangle of A is overwritten with the Cholesky decomposition 2) Based on ReLAPACK recursive variant with Level 3 BLAS */ static int complex_cholesky_decomp_L3(gsl_matrix_complex * A) { const size_t N = A->size1; if (N != A->size2) { GSL_ERROR("Cholesky decomposition requires square matrix", GSL_ENOTSQR); } else if (N <= CROSSOVER_CHOLESKY) { /* use unblocked Level 2 algorithm */ return complex_cholesky_decomp_L2(A); } else { /* * partition matrix: * * A11 A12 * A21 A22 * * where A11 is N1-by-N1 */ int status; const size_t N1 = GSL_LINALG_SPLIT_COMPLEX(N); const size_t N2 = N - N1; gsl_matrix_complex_view A11 = gsl_matrix_complex_submatrix(A, 0, 0, N1, N1); gsl_matrix_complex_view A21 = gsl_matrix_complex_submatrix(A, N1, 0, N2, N1); gsl_matrix_complex_view A22 = gsl_matrix_complex_submatrix(A, N1, N1, N2, N2); /* recursion on A11 */ status = complex_cholesky_decomp_L3(&A11.matrix); if (status) return status; /* A21 = A21 * A11^{-1} */ gsl_blas_ztrsm(CblasRight, CblasLower, CblasConjTrans, CblasNonUnit, GSL_COMPLEX_ONE, &A11.matrix, &A21.matrix); /* A22 -= A21 A21^H */ gsl_blas_zherk(CblasLower, CblasNoTrans, -1.0, &A21.matrix, 1.0, &A22.matrix); /* recursion on A22 */ status = complex_cholesky_decomp_L3(&A22.matrix); if (status) return status; return GSL_SUCCESS; } } gsl-2.7.1/linalg/mcholesky.c0000644016036000116100000001550313521372452012646 00000000000000/* 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(CblasLower, CblasUnit, 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-2.7.1/linalg/pcholesky.c0000644016036000116100000003410113521372505012643 00000000000000/* 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 symmetric 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(CblasLower, CblasUnit, 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(CblasLower, CblasUnit, 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; /* invert the lower triangle of LDLT */ gsl_matrix_memcpy(Ainv, LDLT); gsl_linalg_tri_invert(CblasLower, CblasUnit, 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 invsqrt_di = 1.0 / sqrt(di); if (i > 0) { gsl_vector_view v = gsl_matrix_subrow(Ainv, i, 0, i); gsl_blas_dscal(invsqrt_di, &v.vector); } gsl_matrix_set(Ainv, i, i, invsqrt_di); } /* compute A^{-1} = L^{-T} D^{-1} L^{-1} */ gsl_linalg_tri_LTL(Ainv); /* copy lower triangle to upper */ gsl_matrix_transpose_tricpy(CblasLower, CblasUnit, Ainv, Ainv); /* now apply permutation p to the matrix */ /* compute L^{-T} D^{-1} L^{-1} P^T */ for (i = 0; i < N; ++i) { gsl_vector_view v = gsl_matrix_row(Ainv, i); gsl_permute_vector_inverse(p, &v.vector); } /* compute P L^{-T} D^{-1} L^{-1} P^T */ for (i = 0; i < N; ++i) { gsl_vector_view v = gsl_matrix_column(Ainv, i); gsl_permute_vector_inverse(p, &v.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-2.7.1/linalg/cholesky_band.c0000644016036000116100000003232713743433264013465 00000000000000/* linalg/cholesky_band.c * * Copyright (C) 2018, 2019, 2020 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 double cholesky_band_norm1(const gsl_matrix * A); static int cholesky_band_Ainv(CBLAS_TRANSPOSE_t TransA, gsl_vector * x, void * params); /* gsl_linalg_cholesky_band_decomp() Cholesky decomposition of a square symmetric positive definite banded matrix Inputs: A - matrix in banded format, N-by-ndiag where N is the size of the matrix and ndiag is the number of nonzero diagonals. Notes: 1) The main diagonal of the Cholesky factor is stored in the first column of A; the first subdiagonal in the second column and so on. 2) If ndiag > 1, the 1-norm of A is stored in A(N,ndiag) on output 3) At each diagonal element, the matrix is factored as A(j:end,j:end) = [ A11 A21^T ] = [ alpha 0 ] [ alpha v^T ] [ A21 A22 ] [ v L ] [ 0 L^T ] where: alpha = sqrt(A(j,j)) v = A(j+1:end, j) / alpha A22 = L L^T + v v^T So we start at A(1,1) and work right. Pseudo-code is: loop j = 1, ..., N alpha = sqrt(A(j,j)) A(j+1:end, j) := A(j+1:end, j) / alpha (DSCAL) A(j+1:end, j+1:end) -= v v^T (DSYR) Due to the banded structure, v has at most p non-zero elements, where p is the lower bandwidth */ int gsl_linalg_cholesky_band_decomp(gsl_matrix * A) { const size_t N = A->size1; /* size of matrix */ const size_t ndiag = A->size2; /* number of diagonals in band, including main diagonal */ if (ndiag > N) { GSL_ERROR ("invalid matrix dimensions", GSL_EBADLEN); } else { const size_t p = ndiag - 1; /* lower bandwidth */ const int kld = (int) GSL_MAX(1, p); size_t j; if (ndiag > 1) { /* * calculate 1-norm of A and store in lower right of matrix, which is not accessed * by rest of routine. gsl_linalg_cholesky_band_rcond() will use this later. If * A is diagonal, there is no empty slot to store the 1-norm, so the rcond routine * will have to reconstruct it from the Cholesky factor. */ double Anorm = cholesky_band_norm1(A); gsl_matrix_set(A, N - 1, p, Anorm); } for (j = 0; j < N; ++j) { double ajj = gsl_matrix_get(A, j, 0); size_t lenv; if (ajj <= 0.0) { GSL_ERROR("matrix is not positive definite", GSL_EDOM); } ajj = sqrt(ajj); gsl_matrix_set(A, j, 0, ajj); /* number of elements in v, which will normally be p, unless we * are in lower right corner of matrix */ lenv = GSL_MIN(p, N - j - 1); if (lenv > 0) { gsl_vector_view v = gsl_matrix_subrow(A, j, 1, lenv); gsl_matrix_view m = gsl_matrix_submatrix(A, j + 1, 0, lenv, lenv); gsl_blas_dscal(1.0 / ajj, &v.vector); m.matrix.tda = kld; gsl_blas_dsyr(CblasUpper, -1.0, &v.vector, &m.matrix); } } return GSL_SUCCESS; } } int gsl_linalg_cholesky_band_solve (const gsl_matrix * LLT, const gsl_vector * b, gsl_vector * x) { if (LLT->size1 != b->size) { GSL_ERROR ("matrix size must match b size", GSL_EBADLEN); } else if (LLT->size1 != 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_band_svx(LLT, x); return status; } } int gsl_linalg_cholesky_band_svx (const gsl_matrix * LLT, gsl_vector * x) { if (LLT->size1 != x->size) { GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN); } else { /* solve for c using forward-substitution, L c = b */ cblas_dtbsv(CblasColMajor, CblasLower, CblasNoTrans, CblasNonUnit, (int) LLT->size1, (int) (LLT->size2 - 1), LLT->data, LLT->tda, x->data, x->stride); /* perform back-substitution, L^T x = c */ cblas_dtbsv(CblasColMajor, CblasLower, CblasTrans, CblasNonUnit, (int) LLT->size1, (int) (LLT->size2 - 1), LLT->data, LLT->tda, x->data, x->stride); return GSL_SUCCESS; } } int gsl_linalg_cholesky_band_solvem (const gsl_matrix * LLT, const gsl_matrix * B, gsl_matrix * X) { if (LLT->size1 != B->size1) { GSL_ERROR ("LLT size1 must match B size1", GSL_EBADLEN); } else if (LLT->size1 != X->size1) { GSL_ERROR ("LLT size1 must match solution size1", GSL_EBADLEN); } else if (B->size2 != X->size2) { GSL_ERROR ("B size2 must match X size2", GSL_EBADLEN); } else { int status; /* copy X <- B */ gsl_matrix_memcpy (X, B); status = gsl_linalg_cholesky_band_svxm(LLT, X); return status; } } int gsl_linalg_cholesky_band_svxm (const gsl_matrix * LLT, gsl_matrix * X) { if (LLT->size1 != X->size1) { GSL_ERROR ("LLT size1 must match solution size1", GSL_EBADLEN); } else { int status; const size_t nrhs = X->size2; size_t j; for (j = 0; j < nrhs; ++j) { gsl_vector_view xj = gsl_matrix_column(X, j); status = gsl_linalg_cholesky_band_svx (LLT, &xj.vector); if (status) return status; } return GSL_SUCCESS; } } int gsl_linalg_cholesky_band_invert (const gsl_matrix * LLT, gsl_matrix * Ainv) { if (Ainv->size1 != Ainv->size2) { GSL_ERROR("Ainv must be square", GSL_ENOTSQR); } else if (LLT->size1 != Ainv->size1) { GSL_ERROR("cholesky matrix has different dimensions from Ainv", GSL_EBADLEN); } else { int status; /* unpack Cholesky factor into lower triangle of Ainv */ status = gsl_linalg_cholesky_band_unpack(LLT, Ainv); if (status) return status; /* call the standard Cholesky inversion routine */ status = gsl_linalg_cholesky_invert(Ainv); if (status) return status; return GSL_SUCCESS; } } int gsl_linalg_cholesky_band_unpack (const gsl_matrix * LLT, gsl_matrix * L) { const size_t N = LLT->size1; if (N != L->size1) { GSL_ERROR("L matrix does not match LLT dimensions", GSL_EBADLEN); } else if (L->size1 != L->size2) { GSL_ERROR("L matrix is not square", GSL_ENOTSQR); } else { const size_t p = LLT->size2 - 1; /* lower bandwidth */ size_t i; for (i = 0; i < p + 1; ++i) { gsl_vector_const_view v = gsl_matrix_const_subcolumn(LLT, i, 0, N - i); gsl_vector_view w = gsl_matrix_subdiagonal(L, i); gsl_vector_memcpy(&w.vector, &v.vector); } /* zero out remaining subdiagonals */ for (i = p + 1; i < N; ++i) { gsl_vector_view w = gsl_matrix_subdiagonal(L, i); gsl_vector_set_zero(&w.vector); } return GSL_SUCCESS; } } int gsl_linalg_cholesky_band_rcond (const gsl_matrix * LLT, double * rcond, gsl_vector * work) { const size_t N = LLT->size1; if (work->size != 3 * N) { GSL_ERROR ("work vector must have length 3*N", GSL_EBADLEN); } else { int status; const size_t ndiag = LLT->size2; double Anorm; /* ||A||_1 */ double Ainvnorm; /* ||A^{-1}||_1 */ if (ndiag == 1) { /* diagonal matrix, compute 1-norm since it has not been stored */ gsl_vector_const_view v = gsl_matrix_const_column(LLT, 0); Anorm = gsl_vector_max(&v.vector); Anorm = Anorm * Anorm; } else { /* 1-norm is stored in A(N, ndiag) by gsl_linalg_cholesky_band_decomp() */ Anorm = gsl_matrix_get(LLT, N - 1, ndiag - 1); } *rcond = 0.0; /* return if matrix is singular */ if (Anorm == 0.0) return GSL_SUCCESS; status = gsl_linalg_invnorm1(N, cholesky_band_Ainv, (void *) LLT, &Ainvnorm, work); if (status) return status; if (Ainvnorm != 0.0) *rcond = (1.0 / Anorm) / Ainvnorm; return GSL_SUCCESS; } } /* gsl_linalg_cholesky_band_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_band_scale(const gsl_matrix * A, gsl_vector * S) { const size_t N = A->size1; /* size of matrix */ const size_t ndiag = A->size2; /* number of diagonals in band, including main diagonal */ if (ndiag > N) { GSL_ERROR ("invalid matrix dimensions", GSL_EBADLEN); } 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, 0); 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_band_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 in banded format on output, diag(S) * A * diag(S) in banded format S - (input) scale factors */ int gsl_linalg_cholesky_band_scale_apply(gsl_matrix * A, const gsl_vector * S) { const size_t N = A->size1; /* size of matrix */ const size_t ndiag = A->size2; /* number of diagonals in band, including main diagonal */ if (ndiag > N) { GSL_ERROR ("invalid matrix dimensions", GSL_EBADLEN); } else if (N != S->size) { GSL_ERROR("S must have length N", GSL_EBADLEN); } else { size_t i, j; for (j = 0; j < N; ++j) { double sj = gsl_vector_get(S, j); for (i = j; i < GSL_MIN(N, j + ndiag); ++i) { double si = gsl_vector_get(S, i); double * ptr = gsl_matrix_ptr(A, j, i - j); *ptr *= sj * si; } } return GSL_SUCCESS; } } /* compute 1-norm of symmetric banded matrix */ static double cholesky_band_norm1(const gsl_matrix * A) { const size_t N = A->size1; const size_t ndiag = A->size2; /* number of diagonals in band, including main diagonal */ double value; if (ndiag == 1) { /* diagonal matrix */ gsl_vector_const_view v = gsl_matrix_const_column(A, 0); CBLAS_INDEX_t idx = gsl_blas_idamax(&v.vector); value = gsl_vector_get(&v.vector, idx); } else { size_t j; value = 0.0; for (j = 0; j < N; ++j) { size_t ncol = GSL_MIN(ndiag, N - j); /* number of elements in column j below and including main diagonal */ gsl_vector_const_view v = gsl_matrix_const_subrow(A, j, 0, ncol); double sum = gsl_blas_dasum(&v.vector); size_t k, l; /* sum now contains the absolute sum of elements below and including main diagonal for column j; we * have to add the symmetric elements above the diagonal */ k = j; l = 1; while (k > 0 && l < ndiag) { double Akl = gsl_matrix_get(A, --k, l++); sum += fabs(Akl); } value = GSL_MAX(value, sum); } } return value; } /* x := A^{-1} x = A^{-t} x, A = L L^T */ static int cholesky_band_Ainv(CBLAS_TRANSPOSE_t TransA, gsl_vector * x, void * params) { gsl_matrix * LLT = (gsl_matrix * ) params; (void) TransA; /* unused parameter warning */ /* compute x := L^{-1} x */ cblas_dtbsv(CblasColMajor, CblasLower, CblasNoTrans, CblasNonUnit, (int) LLT->size1, (int) (LLT->size2 - 1), LLT->data, LLT->tda, x->data, x->stride); /* compute x := L^{-T} x */ cblas_dtbsv(CblasColMajor, CblasLower, CblasTrans, CblasNonUnit, (int) LLT->size1, (int) (LLT->size2 - 1), LLT->data, LLT->tda, x->data, x->stride); return GSL_SUCCESS; } gsl-2.7.1/linalg/ldlt.c0000644016036000116100000001632713414702623011612 00000000000000/* linalg/ldlt.c * * Copyright (C) 2018 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. */ /* L D L^T decomposition of a symmetric positive semi-definite matrix */ #include #include #include #include #include #include #include static double ldlt_norm1(const gsl_matrix * A); static int ldlt_Ainv(CBLAS_TRANSPOSE_t TransA, gsl_vector * x, void * params); /* gsl_linalg_ldlt_decomp() Perform L D L^T decomposition of a symmetric positive semi-definite matrix using lower triangle Inputs: A - (input) symmetric, positive semi-definite matrix (output) lower triangle contains L factor; diagonal contains D Return: success/error Notes: 1) Based on algorithm 4.1.1 of Golub and Van Loan, Matrix Computations (4th ed). 2) The first subrow A(1, 2:end) is used as temporary workspace 3) The 1-norm ||A||_1 of the original matrix is stored in the upper right corner on output */ int gsl_linalg_ldlt_decomp (gsl_matrix * A) { const size_t M = A->size1; const size_t N = A->size2; if (M != N) { GSL_ERROR ("LDLT decomposition requires square matrix", GSL_ENOTSQR); } else { size_t i, j; double a00, anorm; gsl_vector_view work, v; /* check for quick return */ if (N == 1) return GSL_SUCCESS; /* compute ||A||_1 */ anorm = ldlt_norm1(A); /* special case first column */ a00 = gsl_matrix_get(A, 0, 0); if (a00 == 0.0) { GSL_ERROR ("matrix is singular", GSL_EDOM); } v = gsl_matrix_subcolumn(A, 0, 1, N - 1); gsl_vector_scale(&v.vector, 1.0 / a00); /* use first subrow A(1, 2:end) as temporary workspace */ work = gsl_matrix_subrow(A, 0, 1, N - 1); for (j = 1; j < N; ++j) { gsl_vector_view w = gsl_vector_subvector(&work.vector, 0, j); double ajj = gsl_matrix_get(A, j, j); double dval; for (i = 0; i < j; ++i) { double aii = gsl_matrix_get(A, i, i); double aji = gsl_matrix_get(A, j, i); gsl_vector_set(&w.vector, i, aji * aii); } v = gsl_matrix_subrow(A, j, 0, j); /* A(j,1:j-1) */ gsl_blas_ddot(&v.vector, &w.vector, &dval); ajj -= dval; if (ajj == 0.0) { GSL_ERROR ("matrix is singular", GSL_EDOM); } gsl_matrix_set(A, j, j, ajj); if (j < N - 1) { double ajjinv = 1.0 / ajj; gsl_matrix_view m = gsl_matrix_submatrix(A, j + 1, 0, N - j - 1, j); /* A(j+1:n, 1:j-1) */ v = gsl_matrix_subcolumn(A, j, j + 1, N - j - 1); /* A(j+1:n, j) */ gsl_blas_dgemv(CblasNoTrans, -ajjinv, &m.matrix, &w.vector, ajjinv, &v.vector); } } /* save ||A||_1 in upper right corner */ gsl_matrix_set(A, 0, N - 1, anorm); return GSL_SUCCESS; } } int gsl_linalg_ldlt_solve (const gsl_matrix * LDLT, 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 != 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; /* copy x <- b */ gsl_vector_memcpy (x, b); status = gsl_linalg_ldlt_svx(LDLT, x); return status; } } int gsl_linalg_ldlt_svx (const gsl_matrix * LDLT, gsl_vector * x) { if (LDLT->size1 != LDLT->size2) { GSL_ERROR ("LDLT matrix must be square", GSL_ENOTSQR); } else if (LDLT->size2 != x->size) { GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN); } else { gsl_vector_const_view diag = gsl_matrix_const_diagonal(LDLT); /* solve for z using forward-substitution, L z = b */ gsl_blas_dtrsv (CblasLower, CblasNoTrans, CblasUnit, LDLT, x); /* solve for y, D y = z */ gsl_vector_div(x, &diag.vector); /* perform back-substitution, L^T x = y */ gsl_blas_dtrsv (CblasLower, CblasTrans, CblasUnit, LDLT, x); return GSL_SUCCESS; } } int gsl_linalg_ldlt_rcond (const gsl_matrix * LDLT, double * rcond, gsl_vector * work) { 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 (work->size != 3 * N) { GSL_ERROR ("work vector must have length 3*N", GSL_EBADLEN); } else { int status; double Anorm; /* ||A||_1 */ double Ainvnorm; /* ||A^{-1}||_1 */ if (N == 1) Anorm = fabs(gsl_matrix_get(LDLT, 0, 0)); else Anorm = gsl_matrix_get(LDLT, 0, N - 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, ldlt_Ainv, (void *) LDLT, &Ainvnorm, work); if (status) return status; if (Ainvnorm != 0.0) *rcond = (1.0 / Anorm) / Ainvnorm; return GSL_SUCCESS; } } /* compute 1-norm of symmetric matrix stored in lower triangle */ static double ldlt_norm1(const gsl_matrix * A) { const size_t N = A->size1; double max = 0.0; size_t i, j; for (j = 0; j < N; ++j) { gsl_vector_const_view v = gsl_matrix_const_subcolumn(A, j, j, N - j); double sum = gsl_blas_dasum(&v.vector); /* now add symmetric elements from above diagonal */ for (i = 0; i < j; ++i) { double Aij = gsl_matrix_get(A, i, j); sum += fabs(Aij); } if (sum > max) max = sum; } return max; } /* x := A^{-1} x = A^{-t} x, A = L D L^T */ static int ldlt_Ainv(CBLAS_TRANSPOSE_t TransA, gsl_vector * x, void * params) { int status; gsl_matrix * A = (gsl_matrix * ) params; gsl_vector_const_view diag = gsl_matrix_const_diagonal(A); (void) TransA; /* unused parameter warning */ /* compute L^{-1} x */ status = gsl_blas_dtrsv(CblasLower, CblasNoTrans, CblasUnit, A, x); if (status) return status; /* compute D^{-1} x */ gsl_vector_div(x, &diag.vector); /* compute L^{-t} x */ status = gsl_blas_dtrsv(CblasLower, CblasTrans, CblasUnit, A, x); if (status) return status; return GSL_SUCCESS; } gsl-2.7.1/linalg/ldlt_band.c0000644016036000116100000002330013415161021012553 00000000000000/* linalg/ldlt_band.c * * Copyright (C) 2018 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. */ /* L D L^T decomposition of a symmetric banded positive semi-definite matrix */ #include #include #include #include #include #include #include static double symband_norm1(const gsl_matrix * A); static int ldlt_band_Ainv(CBLAS_TRANSPOSE_t TransA, gsl_vector * x, void * params); /* gsl_linalg_ldlt_band_decomp() L D L^T decomposition of a square symmetric positive semi-definite banded matrix Inputs: A - matrix in symmetric banded format, N-by-ndiag where N is the size of the matrix and ndiag is the number of nonzero diagonals. Notes: 1) The matrix D is stored in the first column of A; the first subdiagonal of L in the second column and so on. 2) If ndiag > 1, the 1-norm of A is stored in A(N,ndiag) on output 3) At each diagonal element, the matrix is factored as A(j:end,j:end) = [ A11 A21^T ] = [ 1 0 ] [ alpha 0 ] [ 1 v^T ] [ A21 A22 ] [ v L ] [ 0 D ] [ 0 L^T ] where: alpha = A(j,j) v = A(j+1:end, j) / alpha A22 = L D L^T + alpha v v^T So we start at A(1,1) and work right. Pseudo-code is: loop j = 1, ..., N alpha = A(j,j) A(j+1:end, j) := A(j+1:end, j) / alpha (DSCAL) A(j+1:end, j+1:end) -= alpha v v^T (DSYR) Due to the banded structure, v has at most p non-zero elements, where p is the lower bandwidth */ int gsl_linalg_ldlt_band_decomp(gsl_matrix * A) { const size_t N = A->size1; /* size of matrix */ const size_t ndiag = A->size2; /* number of diagonals in band, including main diagonal */ if (ndiag > N) { GSL_ERROR ("invalid matrix dimensions", GSL_EBADLEN); } else { const size_t p = ndiag - 1; /* lower bandwidth */ const int kld = (int) GSL_MAX(1, p); double Anorm; size_t j; /* check for quick return */ if (ndiag == 1) return GSL_SUCCESS; /* * calculate 1-norm of A and store in lower right of matrix, which is not accessed * by rest of routine. gsl_linalg_ldlt_band_rcond() will use this later. If * A is diagonal, there is no empty slot to store the 1-norm, so the rcond routine * will have to compute it. */ Anorm = symband_norm1(A); gsl_matrix_set(A, N - 1, p, Anorm); for (j = 0; j < N - 1; ++j) { double ajj = gsl_matrix_get(A, j, 0); size_t lenv; if (ajj == 0.0) { GSL_ERROR("matrix is singular", GSL_EDOM); } /* number of elements in v, which will normally be p, unless we * are in lower right corner of matrix */ lenv = GSL_MIN(p, N - j - 1); if (lenv > 0) { gsl_vector_view v = gsl_matrix_subrow(A, j, 1, lenv); gsl_matrix_view m = gsl_matrix_submatrix(A, j + 1, 0, lenv, lenv); gsl_blas_dscal(1.0 / ajj, &v.vector); m.matrix.tda = kld; gsl_blas_dsyr(CblasUpper, -ajj, &v.vector, &m.matrix); } } return GSL_SUCCESS; } } int gsl_linalg_ldlt_band_solve (const gsl_matrix * LDLT, const gsl_vector * b, gsl_vector * x) { if (LDLT->size1 != b->size) { GSL_ERROR ("matrix size must match b size", GSL_EBADLEN); } else if (LDLT->size1 != 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_ldlt_band_svx(LDLT, x); return status; } } int gsl_linalg_ldlt_band_svx (const gsl_matrix * LDLT, gsl_vector * x) { if (LDLT->size1 != x->size) { GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN); } else { gsl_vector_const_view diag = gsl_matrix_const_column(LDLT, 0); /* solve for z using forward-substitution, L z = b */ cblas_dtbsv(CblasColMajor, CblasLower, CblasNoTrans, CblasUnit, (int) LDLT->size1, (int) (LDLT->size2 - 1), LDLT->data, LDLT->tda, x->data, x->stride); /* solve for y, D y = z */ gsl_vector_div(x, &diag.vector); /* perform back-substitution, L^T x = y */ cblas_dtbsv(CblasColMajor, CblasLower, CblasTrans, CblasUnit, (int) LDLT->size1, (int) (LDLT->size2 - 1), LDLT->data, LDLT->tda, x->data, x->stride); return GSL_SUCCESS; } } /* gsl_linalg_ldlt_band_unpack() Unpack symmetric banded format matrix LDLT into larger matrix L and diagonal vector D */ int gsl_linalg_ldlt_band_unpack (const gsl_matrix * LDLT, gsl_matrix * L, gsl_vector * D) { const size_t N = LDLT->size1; if (N != L->size1) { GSL_ERROR("L matrix does not match LDLT dimensions", GSL_EBADLEN); } else if (L->size1 != L->size2) { GSL_ERROR("L matrix is not square", GSL_ENOTSQR); } else if (N != D->size) { GSL_ERROR("D vector does not match LDLT dimensions", GSL_EBADLEN); } else { const size_t p = LDLT->size2 - 1; /* lower bandwidth */ gsl_vector_const_view diag = gsl_matrix_const_column(LDLT, 0); gsl_vector_view diagL = gsl_matrix_diagonal(L); size_t i; /* copy diagonal entries */ gsl_vector_memcpy(D, &diag.vector); /* copy subdiagonals into L */ for (i = 1; i <= p; ++i) { gsl_vector_const_view v = gsl_matrix_const_subcolumn(LDLT, i, 0, N - i); gsl_vector_view w = gsl_matrix_subdiagonal(L, i); gsl_vector_memcpy(&w.vector, &v.vector); } /* set main diagonal of L */ gsl_vector_set_all(&diagL.vector, 1.0); /* zero out remaining subdiagonals */ for (i = p + 1; i < N; ++i) { gsl_vector_view w = gsl_matrix_subdiagonal(L, i); gsl_vector_set_zero(&w.vector); } return GSL_SUCCESS; } } int gsl_linalg_ldlt_band_rcond (const gsl_matrix * LDLT, double * rcond, gsl_vector * work) { const size_t N = LDLT->size1; if (work->size != 3 * N) { GSL_ERROR ("work vector must have length 3*N", GSL_EBADLEN); } else { int status; const size_t ndiag = LDLT->size2; double Anorm; /* ||A||_1 */ double Ainvnorm; /* ||A^{-1}||_1 */ if (ndiag == 1) { /* diagonal matrix, compute 1-norm since it has not been stored */ Anorm = symband_norm1(LDLT); } else { /* 1-norm is stored in A(N, ndiag) by gsl_linalg_ldlt_band_decomp() */ Anorm = gsl_matrix_get(LDLT, N - 1, ndiag - 1); } *rcond = 0.0; /* return if matrix is singular */ if (Anorm == 0.0) return GSL_SUCCESS; status = gsl_linalg_invnorm1(N, ldlt_band_Ainv, (void *) LDLT, &Ainvnorm, work); if (status) return status; if (Ainvnorm != 0.0) *rcond = (1.0 / Anorm) / Ainvnorm; return GSL_SUCCESS; } } /* compute 1-norm of symmetric banded matrix */ static double symband_norm1(const gsl_matrix * A) { const size_t N = A->size1; const size_t ndiag = A->size2; /* number of diagonals in band, including main diagonal */ double value; if (ndiag == 1) { /* diagonal matrix */ gsl_vector_const_view v = gsl_matrix_const_column(A, 0); CBLAS_INDEX_t idx = gsl_blas_idamax(&v.vector); value = gsl_vector_get(&v.vector, idx); } else { size_t j; value = 0.0; for (j = 0; j < N; ++j) { size_t ncol = GSL_MIN(ndiag, N - j); /* number of elements in column j below and including main diagonal */ gsl_vector_const_view v = gsl_matrix_const_subrow(A, j, 0, ncol); double sum = gsl_blas_dasum(&v.vector); size_t k, l; /* sum now contains the absolute sum of elements below and including main diagonal for column j; we * have to add the symmetric elements above the diagonal */ k = j; l = 1; while (k > 0 && l < ndiag) { double Akl = gsl_matrix_get(A, --k, l++); sum += fabs(Akl); } value = GSL_MAX(value, sum); } } return value; } /* x := A^{-1} x = A^{-t} x, A = L D L^T */ static int ldlt_band_Ainv(CBLAS_TRANSPOSE_t TransA, gsl_vector * x, void * params) { gsl_matrix * LDLT = (gsl_matrix * ) params; gsl_vector_const_view diag = gsl_matrix_const_column(LDLT, 0); (void) TransA; /* unused parameter warning */ /* compute x := L^{-1} x */ cblas_dtbsv(CblasColMajor, CblasLower, CblasNoTrans, CblasUnit, (int) LDLT->size1, (int) (LDLT->size2 - 1), LDLT->data, LDLT->tda, x->data, x->stride); /* compute x := D^{-1} x */ gsl_vector_div(x, &diag.vector); /* compute x := L^{-T} x */ cblas_dtbsv(CblasColMajor, CblasLower, CblasTrans, CblasUnit, (int) LDLT->size1, (int) (LDLT->size2 - 1), LDLT->data, LDLT->tda, x->data, x->stride); return GSL_SUCCESS; } gsl-2.7.1/linalg/symmtd.c0000644016036000116100000001462713570652103012171 00000000000000/* linalg/sytd.c * * Copyright (C) 2001, 2007 Brian Gough * Copyright (C) 2019 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. */ /* 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 N-1", GSL_EBADLEN); } else { const size_t N = A->size1; size_t i; for (i = 0 ; i < N - 2; i++) { gsl_vector_view v = gsl_matrix_subcolumn (A, i, 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 = -0.5 * tau_i * 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; gsl_vector_const_view d = gsl_matrix_const_diagonal(A);; gsl_vector_const_view sd = gsl_matrix_const_subdiagonal(A, 1);; size_t i; /* Initialize Q to the identity */ gsl_matrix_set_identity (Q); for (i = N - 2; i-- > 0;) { gsl_vector_const_view h = gsl_matrix_const_subcolumn (A, i, 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_vector_view work = gsl_vector_subvector(diag, 0, N - i - 1); double * ptr = gsl_vector_ptr((gsl_vector *) &h.vector, 0); double tmp = *ptr; *ptr = 1.0; gsl_linalg_householder_left (ti, &h.vector, &m.matrix, &work.vector); *ptr = tmp; } /* copy diagonal into diag */ gsl_vector_memcpy(diag, &d.vector); /* copy subdiagonal into sd */ gsl_vector_memcpy(sdiag, &sd.vector); 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 { gsl_vector_const_view d = gsl_matrix_const_diagonal(A);; gsl_vector_const_view sd = gsl_matrix_const_subdiagonal(A, 1);; /* copy diagonal into diag */ gsl_vector_memcpy(diag, &d.vector); /* copy subdiagonal into sd */ gsl_vector_memcpy(sdiag, &sd.vector); return GSL_SUCCESS; } } gsl-2.7.1/linalg/hermtd.c0000644016036000116100000001654713570651610012144 00000000000000/* linalg/hermtd.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. */ /* Factorise a hermitian matrix A into * * A = U T U' * * where U is unitary and T is real symmetric tridiagonal. Only the * diagonal and lower triangular part of A is referenced and modified. * * On exit, T is stored in the diagonal and first subdiagonal of * A. Since T is symmetric the upper diagonal is not stored. * * U is stored as a packed set of Householder transformations in the * lower triangular part of the input matrix below the first subdiagonal. * * The full matrix for U can be obtained as the product * * U = U_N ... U_2 U_1 * * where * * U_i = (I - tau_i * v_i * v_i') * * and where v_i is a Householder vector * * v_i = [0, ..., 0, 1, A(i+2,i), A(i+3,i), ... , A(N,i)] * * This storage scheme is the same as in LAPACK. See LAPACK's * chetd2.f for details. * * See Golub & Van Loan, "Matrix Computations" (3rd ed), Section 8.3 */ #include #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; gsl_vector_complex_const_view zd = gsl_matrix_complex_const_diagonal(A); gsl_vector_complex_const_view zsd = gsl_matrix_complex_const_subdiagonal(A, 1); gsl_vector_const_view d = gsl_vector_complex_const_real(&zd.vector); gsl_vector_const_view sd = gsl_vector_complex_const_real(&zsd.vector); gsl_vector_complex * work = gsl_vector_complex_alloc(N); 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 h = gsl_matrix_complex_const_subcolumn (A, i, 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_vector_complex_view w = gsl_vector_complex_subvector(work, 0, N - i - 1); gsl_linalg_complex_householder_left (ti, &h.vector, &m.matrix, &w.vector); } /* copy diagonal into diag */ gsl_vector_memcpy(diag, &d.vector); /* copy subdiagonal into sdiag */ gsl_vector_memcpy(sdiag, &sd.vector); gsl_vector_complex_free(work); 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 { gsl_vector_complex_const_view zd = gsl_matrix_complex_const_diagonal(A); gsl_vector_complex_const_view zsd = gsl_matrix_complex_const_subdiagonal(A, 1); gsl_vector_const_view d = gsl_vector_complex_const_real(&zd.vector); gsl_vector_const_view sd = gsl_vector_complex_const_real(&zsd.vector); /* copy diagonal into diag */ gsl_vector_memcpy(diag, &d.vector); /* copy subdiagonal into sdiag */ gsl_vector_memcpy(sdiag, &sd.vector); return GSL_SUCCESS; } } gsl-2.7.1/linalg/bidiag.c0000644016036000116100000002400613570652060012065 00000000000000/* 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; gsl_vector * tmp = gsl_vector_alloc(M); size_t j; for (j = 0 ; j < N; j++) { /* apply Householder transformation to current column */ gsl_vector_view v = gsl_matrix_subcolumn(A, j, j, M - j); double tau_j = gsl_linalg_householder_transform (&v.vector); /* apply the transformation to the remaining columns */ if (j + 1 < N) { gsl_matrix_view m = gsl_matrix_submatrix (A, j, j + 1, M - j, N - j - 1); gsl_vector_view work = gsl_vector_subvector(tau_U, j, N - j - 1); double * ptr = gsl_vector_ptr(&v.vector, 0); double tmp = *ptr; *ptr = 1.0; gsl_linalg_householder_left (tau_j, &v.vector, &m.matrix, &work.vector); *ptr = tmp; } gsl_vector_set (tau_U, j, tau_j); /* apply Householder transformation to current row */ if (j + 1 < N) { v = gsl_matrix_subrow (A, j, j + 1, N - j - 1); tau_j = gsl_linalg_householder_transform (&v.vector); /* apply the transformation to the remaining rows */ if (j + 1 < M) { gsl_matrix_view m = gsl_matrix_submatrix (A, j + 1, j + 1, M - j - 1, N - j - 1); gsl_vector_view work = gsl_vector_subvector(tmp, 0, M - j - 1); gsl_linalg_householder_right (tau_j, &v.vector, &m.matrix, &work.vector); } gsl_vector_set (tau_V, j, tau_j); } } gsl_vector_free(tmp); 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 h = gsl_matrix_const_subrow (A, i, 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_vector_view work = gsl_matrix_subrow(U, 0, 0, N - i - 1); double * ptr = gsl_vector_ptr((gsl_vector *) &h.vector, 0); double tmp = *ptr; *ptr = 1.0; gsl_linalg_householder_left (ti, &h.vector, &m.matrix, &work.vector); *ptr = tmp; } /* 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 h = gsl_matrix_const_subcolumn (A, j, 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-2.7.1/linalg/balance.c0000644016036000116100000000373613373111455012241 00000000000000/* 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-2.7.1/linalg/balancemat.c0000644016036000116100000001157213135126237012740 00000000000000/* 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-2.7.1/linalg/inline.c0000644016036000116100000000205413373111455012122 00000000000000/* 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-2.7.1/linalg/trimult.c0000644016036000116100000002122213477611572012354 00000000000000/* linalg/trimult.c * * Copyright (C) 2019 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 compute L^T L where L is a lower triangular matrix */ #include #include #include #include #include #include #include #include "recurse.h" static int triangular_multsymm_L2(CBLAS_UPLO_t Uplo, gsl_matrix * T); static int triangular_multsymm_L3(CBLAS_UPLO_t Uplo, gsl_matrix * T); static int triangular_mult_L2(CBLAS_UPLO_t Uplo, gsl_matrix * A); static int triangular_mult_L3(CBLAS_UPLO_t Uplo, gsl_matrix * A); int gsl_linalg_tri_LTL(gsl_matrix * L) { return triangular_multsymm_L3(CblasLower, L); } int gsl_linalg_tri_UL(gsl_matrix * LU) { return triangular_mult_L3(CblasUpper, LU); } /* triangular_multsymm_L2() Compute L^T L or U U^T Inputs: Uplo - CblasUpper or CblasLower T - on output the upper (or lower) part of T is replaced by L^T L or U U^T Return: success/error Notes: 1) Based on LAPACK routine DLAUU2 using Level 2 BLAS */ static int triangular_multsymm_L2(CBLAS_UPLO_t Uplo, gsl_matrix * T) { const size_t N = T->size1; if (N != T->size2) { GSL_ERROR ("matrix must be square", GSL_ENOTSQR); } else { gsl_vector_view v1, v2; size_t i; if (Uplo == CblasUpper) { } else { for (i = 0; i < N; ++i) { double Tii = gsl_matrix_get(T, i, i); if (i < N - 1) { double tmp; v1 = gsl_matrix_subcolumn(T, i, i, N - i); gsl_blas_ddot(&v1.vector, &v1.vector, &tmp); gsl_matrix_set(T, i, i, tmp); if (i > 0) { gsl_matrix_view m = gsl_matrix_submatrix(T, i + 1, 0, N - i - 1, i); v1 = gsl_matrix_subcolumn(T, i, i + 1, N - i - 1); v2 = gsl_matrix_subrow(T, i, 0, i); gsl_blas_dgemv(CblasTrans, 1.0, &m.matrix, &v1.vector, Tii, &v2.vector); } } else { v1 = gsl_matrix_row(T, N - 1); gsl_blas_dscal(Tii, &v1.vector); } } } return GSL_SUCCESS; } } /* triangular_multsymm_L3() Compute L^T L or U U^T Inputs: Uplo - CblasUpper or CblasLower T - on output the upper (or lower) part of T is replaced by L^T L or U U^T Return: success/error Notes: 1) Based on ReLAPACK routine DLAUUM using Level 3 BLAS */ static int triangular_multsymm_L3(CBLAS_UPLO_t Uplo, gsl_matrix * T) { const size_t N = T->size1; if (N != T->size2) { GSL_ERROR ("matrix must be square", GSL_ENOTSQR); } else if (N <= CROSSOVER_TRIMULT) { return triangular_multsymm_L2(Uplo, T); } else { /* partition matrix: * * T11 T12 * T21 T22 * * where T11 is N1-by-N1 */ int status; const size_t N1 = GSL_LINALG_SPLIT(N); const size_t N2 = N - N1; gsl_matrix_view T11 = gsl_matrix_submatrix(T, 0, 0, N1, N1); gsl_matrix_view T12 = gsl_matrix_submatrix(T, 0, N1, N1, N2); gsl_matrix_view T21 = gsl_matrix_submatrix(T, N1, 0, N2, N1); gsl_matrix_view T22 = gsl_matrix_submatrix(T, N1, N1, N2, N2); /* recursion on T11 */ status = triangular_multsymm_L3(Uplo, &T11.matrix); if (status) return status; if (Uplo == CblasLower) { /* T11 += T21^T T21 */ gsl_blas_dsyrk(Uplo, CblasTrans, 1.0, &T21.matrix, 1.0, &T11.matrix); /* T21 = T22^T * T21 */ gsl_blas_dtrmm(CblasLeft, Uplo, CblasTrans, CblasNonUnit, 1.0, &T22.matrix, &T21.matrix); } else { /* T11 += T12 T12^T */ gsl_blas_dsyrk(Uplo, CblasNoTrans, 1.0, &T12.matrix, 1.0, &T11.matrix); /* T12 = T12 * T22^T */ gsl_blas_dtrmm(CblasRight, Uplo, CblasTrans, CblasNonUnit, 1.0, &T22.matrix, &T12.matrix); } /* recursion on T22 */ status = triangular_multsymm_L3(Uplo, &T22.matrix); if (status) return status; return GSL_SUCCESS; } } /* triangular_mult_L2() Compute U L or L U Inputs: Uplo - CblasUpper or CblasLower (for the first triangular factor) A - on input, matrix in LU format; on output, U L or L U Return: success/error */ static int triangular_mult_L2(CBLAS_UPLO_t Uplo, gsl_matrix * A) { const size_t N = A->size1; if (N != A->size2) { GSL_ERROR ("matrix must be square", GSL_ENOTSQR); } else { size_t i; /* quick return */ if (N == 1) return GSL_SUCCESS; if (Uplo == CblasUpper) { /* compute U * L and store in A */ for (i = 0; i < N; ++i) { double * Aii = gsl_matrix_ptr(A, i, i); double Uii = *Aii; if (i < N - 1) { gsl_vector_view lb = gsl_matrix_subcolumn(A, i, i + 1, N - i - 1); gsl_vector_view ur = gsl_matrix_subrow(A, i, i + 1, N - i - 1); double tmp; gsl_blas_ddot(&lb.vector, &ur.vector, &tmp); *Aii += tmp; if (i > 0) { gsl_matrix_view U_TR = gsl_matrix_submatrix(A, 0, i + 1, i, N - i - 1); gsl_matrix_view L_BL = gsl_matrix_submatrix(A, i + 1, 0, N - i - 1, i); gsl_vector_view ut = gsl_matrix_subcolumn(A, i, 0, i); gsl_vector_view ll = gsl_matrix_subrow(A, i, 0, i); gsl_blas_dgemv(CblasTrans, 1.0, &L_BL.matrix, &ur.vector, Uii, &ll.vector); gsl_blas_dgemv(CblasNoTrans, 1.0, &U_TR.matrix, &lb.vector, 1.0, &ut.vector); } } else { gsl_vector_view v = gsl_matrix_subrow(A, N - 1, 0, N - 1); gsl_blas_dscal(Uii, &v.vector); } } } else { } return GSL_SUCCESS; } } /* triangular_mult_L3() Compute U L or L U Inputs: Uplo - CblasUpper or CblasLower (for the first triangular factor) A - on input, matrix in LU format; on output, U L or L U Return: success/error */ static int triangular_mult_L3(CBLAS_UPLO_t Uplo, gsl_matrix * A) { const size_t N = A->size1; if (N != A->size2) { GSL_ERROR ("matrix must be square", GSL_ENOTSQR); } else if (N <= CROSSOVER_TRIMULT) { return triangular_mult_L2(Uplo, A); } else { /* partition matrix: * * A11 A12 * A21 A22 * * where A11 is N1-by-N1 */ int status; const size_t N1 = GSL_LINALG_SPLIT(N); const size_t N2 = N - N1; gsl_matrix_view A11 = gsl_matrix_submatrix(A, 0, 0, N1, N1); gsl_matrix_view A12 = gsl_matrix_submatrix(A, 0, N1, N1, N2); gsl_matrix_view A21 = gsl_matrix_submatrix(A, N1, 0, N2, N1); gsl_matrix_view A22 = gsl_matrix_submatrix(A, N1, N1, N2, N2); /* recursion on A11 */ status = triangular_mult_L3(Uplo, &A11.matrix); if (status) return status; if (Uplo == CblasLower) { } else { /* form U * L */ /* A11 += A12 A21 */ gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, &A12.matrix, &A21.matrix, 1.0, &A11.matrix); /* A12 = A12 * L22 */ gsl_blas_dtrmm(CblasRight, CblasLower, CblasNoTrans, CblasUnit, 1.0, &A22.matrix, &A12.matrix); /* A21 = U22 * A21 */ gsl_blas_dtrmm(CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, 1.0, &A22.matrix, &A21.matrix); } /* recursion on A22 */ status = triangular_mult_L3(Uplo, &A22.matrix); if (status) return status; return GSL_SUCCESS; } } gsl-2.7.1/linalg/trimult_complex.c0000644016036000116100000002352213477624437014114 00000000000000/* linalg/trimult_complex.c * * Copyright (C) 2019 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 compute L^T L where L is a lower triangular matrix */ #include #include #include #include #include #include #include #include #include #include "recurse.h" static int triangular_multherm_L2(CBLAS_UPLO_t Uplo, gsl_matrix_complex * T); static int triangular_multherm_L3(CBLAS_UPLO_t Uplo, gsl_matrix_complex * T); static int triangular_mult_L2(CBLAS_UPLO_t Uplo, gsl_matrix_complex * LU); static int triangular_mult_L3(CBLAS_UPLO_t Uplo, gsl_matrix_complex * A); static void complex_conj_vector(gsl_vector_complex * v); int gsl_linalg_complex_tri_LHL(gsl_matrix_complex * L) { return triangular_multherm_L3(CblasLower, L); } int gsl_linalg_complex_tri_UL(gsl_matrix_complex * LU) { return triangular_mult_L3(CblasUpper, LU); } /* triangular_multherm_L2() Compute L^H L or U U^H Inputs: Uplo - CblasUpper or CblasLower T - on output the upper (or lower) part of T is replaced by L^H L or U U^H Return: success/error Notes: 1) Based on LAPACK routine ZLAUU2 using Level 2 BLAS */ static int triangular_multherm_L2(CBLAS_UPLO_t Uplo, gsl_matrix_complex * T) { const size_t N = T->size1; if (N != T->size2) { GSL_ERROR ("matrix must be square", GSL_ENOTSQR); } else { size_t i; if (Uplo == CblasUpper) { } else { for (i = 0; i < N; ++i) { gsl_complex * Tii = gsl_matrix_complex_ptr(T, i, i); gsl_complex z0 = *Tii; if (i < N - 1) { gsl_vector_complex_view v = gsl_matrix_complex_subcolumn(T, i, i + 1, N - i - 1); double norm = gsl_blas_dznrm2(&v.vector); GSL_REAL(*Tii) = gsl_complex_abs2(*Tii) + norm * norm; if (i > 0) { gsl_vector_complex_view w = gsl_matrix_complex_subrow(T, i, 0, i); gsl_matrix_complex_view m = gsl_matrix_complex_submatrix(T, i + 1, 0, N - i - 1, i); complex_conj_vector(&w.vector); gsl_blas_zgemv(CblasConjTrans, GSL_COMPLEX_ONE, &m.matrix, &v.vector, z0, &w.vector); complex_conj_vector(&w.vector); } } else { gsl_vector_complex_view w = gsl_matrix_complex_row(T, i); gsl_blas_zdscal(GSL_REAL(z0), &w.vector); } GSL_IMAG(*Tii) = 0.0; } } return GSL_SUCCESS; } } /* triangular_multherm_L3() Compute L^H L or U U^H Inputs: Uplo - CblasUpper or CblasLower T - on output the upper (or lower) part of T is replaced by L^H L or U U^H Return: success/error Notes: 1) Based on ReLAPACK using Level 3 BLAS */ static int triangular_multherm_L3(CBLAS_UPLO_t Uplo, gsl_matrix_complex * T) { const size_t N = T->size1; if (N != T->size2) { GSL_ERROR ("matrix must be square", GSL_ENOTSQR); } else if (N <= CROSSOVER_TRIMULT) { /* use Level 2 algorithm */ return triangular_multherm_L2(Uplo, T); } else { /* * partition matrix: * * T11 T12 * T21 T22 * * where T11 is N1-by-N1 */ int status; const size_t N1 = GSL_LINALG_SPLIT_COMPLEX(N); const size_t N2 = N - N1; gsl_matrix_complex_view T11 = gsl_matrix_complex_submatrix(T, 0, 0, N1, N1); gsl_matrix_complex_view T12 = gsl_matrix_complex_submatrix(T, 0, N1, N1, N2); gsl_matrix_complex_view T21 = gsl_matrix_complex_submatrix(T, N1, 0, N2, N1); gsl_matrix_complex_view T22 = gsl_matrix_complex_submatrix(T, N1, N1, N2, N2); /* recursion on T11 */ status = triangular_multherm_L3(Uplo, &T11.matrix); if (status) return status; if (Uplo == CblasLower) { /* T11 += T21^T T21 */ gsl_blas_zherk(Uplo, CblasConjTrans, 1.0, &T21.matrix, 1.0, &T11.matrix); /* T21 = T22^T * T21 */ gsl_blas_ztrmm(CblasLeft, Uplo, CblasConjTrans, CblasNonUnit, GSL_COMPLEX_ONE, &T22.matrix, &T21.matrix); } else { /* T11 += T12 T12^T */ gsl_blas_zherk(Uplo, CblasNoTrans, 1.0, &T12.matrix, 1.0, &T11.matrix); /* T12 = T12 * T22^T */ gsl_blas_ztrmm(CblasRight, Uplo, CblasConjTrans, CblasNonUnit, GSL_COMPLEX_ONE, &T22.matrix, &T12.matrix); } /* recursion on T22 */ status = triangular_multherm_L3(Uplo, &T22.matrix); if (status) return status; return GSL_SUCCESS; } } /******************************************** * INTERNAL ROUTINES * ********************************************/ /* triangular_mult_L2() Compute U L or L U Inputs: Uplo - CblasUpper or CblasLower (first triangular factor) LU - on input, matrix in LU form; on output U*L or L*U Return: success/error */ static int triangular_mult_L2(CBLAS_UPLO_t Uplo, gsl_matrix_complex * LU) { const size_t N = LU->size1; if (N != LU->size2) { GSL_ERROR ("matrix must be square", GSL_ENOTSQR); } else { size_t i; /* quick return */ if (N == 1) return GSL_SUCCESS; if (Uplo == CblasUpper) { /* compute U*L and store in LU */ for (i = 0; i < N; ++i) { gsl_complex * Aii = gsl_matrix_complex_ptr(LU, i, i); gsl_complex Uii = *Aii; if (i < N - 1) { gsl_vector_complex_view lb = gsl_matrix_complex_subcolumn(LU, i, i + 1, N - i - 1); gsl_vector_complex_view ur = gsl_matrix_complex_subrow(LU, i, i + 1, N - i - 1); gsl_complex dot; gsl_blas_zdotu(&lb.vector, &ur.vector, &dot); *Aii = gsl_complex_add(*Aii, dot); if (i > 0) { gsl_matrix_complex_view U_TR = gsl_matrix_complex_submatrix(LU, 0, i + 1, i, N - i - 1); gsl_matrix_complex_view L_BL = gsl_matrix_complex_submatrix(LU, i + 1, 0, N - i - 1, i); gsl_vector_complex_view ut = gsl_matrix_complex_subcolumn(LU, i, 0, i); gsl_vector_complex_view ll = gsl_matrix_complex_subrow(LU, i, 0, i); gsl_blas_zgemv(CblasTrans, GSL_COMPLEX_ONE, &L_BL.matrix, &ur.vector, Uii, &ll.vector); gsl_blas_zgemv(CblasNoTrans, GSL_COMPLEX_ONE, &U_TR.matrix, &lb.vector, GSL_COMPLEX_ONE, &ut.vector); } } else { gsl_vector_complex_view v = gsl_matrix_complex_subrow(LU, i, 0, i); gsl_blas_zscal(Uii, &v.vector); } } } else { } return GSL_SUCCESS; } } /* triangular_mult_L3() Compute U L or L U Inputs: Uplo - CblasUpper or CblasLower (for the first triangular factor) A - on input, matrix in LU format; on output, U L or L U Return: success/error */ static int triangular_mult_L3(CBLAS_UPLO_t Uplo, gsl_matrix_complex * A) { const size_t N = A->size1; if (N != A->size2) { GSL_ERROR ("matrix must be square", GSL_ENOTSQR); } else if (N <= CROSSOVER_TRIMULT) { return triangular_mult_L2(Uplo, A); } else { /* partition matrix: * * A11 A12 * A21 A22 * * where A11 is N1-by-N1 */ int status; const size_t N1 = GSL_LINALG_SPLIT_COMPLEX(N); const size_t N2 = N - N1; gsl_matrix_complex_view A11 = gsl_matrix_complex_submatrix(A, 0, 0, N1, N1); gsl_matrix_complex_view A12 = gsl_matrix_complex_submatrix(A, 0, N1, N1, N2); gsl_matrix_complex_view A21 = gsl_matrix_complex_submatrix(A, N1, 0, N2, N1); gsl_matrix_complex_view A22 = gsl_matrix_complex_submatrix(A, N1, N1, N2, N2); /* recursion on A11 */ status = triangular_mult_L3(Uplo, &A11.matrix); if (status) return status; if (Uplo == CblasLower) { } else { /* form U * L */ /* A11 += A12 A21 */ gsl_blas_zgemm(CblasNoTrans, CblasNoTrans, GSL_COMPLEX_ONE, &A12.matrix, &A21.matrix, GSL_COMPLEX_ONE, &A11.matrix); /* A12 = A12 * L22 */ gsl_blas_ztrmm(CblasRight, CblasLower, CblasNoTrans, CblasUnit, GSL_COMPLEX_ONE, &A22.matrix, &A12.matrix); /* A21 = U22 * A21 */ gsl_blas_ztrmm(CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, GSL_COMPLEX_ONE, &A22.matrix, &A21.matrix); } /* recursion on A22 */ status = triangular_mult_L3(Uplo, &A22.matrix); if (status) return status; return GSL_SUCCESS; } } static void complex_conj_vector(gsl_vector_complex * v) { size_t i; for (i = 0; i < v->size; ++i) { gsl_complex * vi = gsl_vector_complex_ptr(v, i); GSL_IMAG(*vi) = -GSL_IMAG(*vi); } } gsl-2.7.1/linalg/test.c0000644016036000116100000026201314151556700011627 00000000000000/* 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 #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_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_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_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); /* ensure diagonally dominant matrix */ if (i == j) { if (Diag == CblasUnit) mij = 1.0; else mij += 10.0; } else if (Diag == CblasUnit) mij *= 0.01; if (Uplo == CblasLower) gsl_matrix_set(m, i, j, mij); else gsl_matrix_set(m, j, i, mij); } } 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; #include "test_common.c" #include "test_cholesky.c" #include "test_choleskyc.c" #include "test_cod.c" #include "test_ldlt.c" #include "test_lu.c" #include "test_luc.c" #include "test_lu_band.c" #include "test_lq.c" #include "test_tri.c" #include "test_ql.c" #include "test_qr.c" #include "test_qrc.c" #include "test_qr_band.c" int test_QR_solve_dim(const gsl_matrix * m, const double * actual, double eps) { int s = 0; unsigned long i, dim = m->size1; gsl_vector * rhs = gsl_vector_alloc(dim); gsl_matrix * qr = gsl_matrix_alloc(dim,dim); gsl_vector * d = gsl_vector_alloc(dim); gsl_vector * x = gsl_vector_alloc(dim); gsl_matrix_memcpy(qr,m); for(i=0; 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_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(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; 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; 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= 16) ? ((n + 8) / 16) * 8 : n / 2) #define GSL_EIGEN_SPLIT_COMPLEX(n) ((n >= 8) ? ((n + 4) / 8) * 4 : n / 2) /* matrix size for crossover to Level 2 algorithms */ #define CROSSOVER 24 #define CROSSOVER_GENSYMM CROSSOVER #define CROSSOVER_GENHERM CROSSOVER gsl-2.7.1/eigen/qrstep.c0000644016036000116100000001045513373111455012007 00000000000000/* 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-2.7.1/eigen/gsl_eigen.h0000644016036000116100000003173213373111455012433 00000000000000/* 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-2.7.1/eigen/Makefile.in0000644016036000116100000011371414151557214012376 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/francis.Plo ./$(DEPDIR)/gen.Plo \ ./$(DEPDIR)/genherm.Plo ./$(DEPDIR)/genhermv.Plo \ ./$(DEPDIR)/gensymm.Plo ./$(DEPDIR)/gensymmv.Plo \ ./$(DEPDIR)/genv.Plo ./$(DEPDIR)/herm.Plo \ ./$(DEPDIR)/hermv.Plo ./$(DEPDIR)/jacobi.Plo \ ./$(DEPDIR)/nonsymm.Plo ./$(DEPDIR)/nonsymmv.Plo \ ./$(DEPDIR)/schur.Plo ./$(DEPDIR)/sort.Plo \ ./$(DEPDIR)/symm.Plo ./$(DEPDIR)/symmv.Plo ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 = recurse.h 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genherm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genhermv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gensymm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gensymmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/herm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hermv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jacobi.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonsymm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonsymmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/schur.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sort.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symmv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/francis.Plo -rm -f ./$(DEPDIR)/gen.Plo -rm -f ./$(DEPDIR)/genherm.Plo -rm -f ./$(DEPDIR)/genhermv.Plo -rm -f ./$(DEPDIR)/gensymm.Plo -rm -f ./$(DEPDIR)/gensymmv.Plo -rm -f ./$(DEPDIR)/genv.Plo -rm -f ./$(DEPDIR)/herm.Plo -rm -f ./$(DEPDIR)/hermv.Plo -rm -f ./$(DEPDIR)/jacobi.Plo -rm -f ./$(DEPDIR)/nonsymm.Plo -rm -f ./$(DEPDIR)/nonsymmv.Plo -rm -f ./$(DEPDIR)/schur.Plo -rm -f ./$(DEPDIR)/sort.Plo -rm -f ./$(DEPDIR)/symm.Plo -rm -f ./$(DEPDIR)/symmv.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/francis.Plo -rm -f ./$(DEPDIR)/gen.Plo -rm -f ./$(DEPDIR)/genherm.Plo -rm -f ./$(DEPDIR)/genhermv.Plo -rm -f ./$(DEPDIR)/gensymm.Plo -rm -f ./$(DEPDIR)/gensymmv.Plo -rm -f ./$(DEPDIR)/genv.Plo -rm -f ./$(DEPDIR)/herm.Plo -rm -f ./$(DEPDIR)/hermv.Plo -rm -f ./$(DEPDIR)/jacobi.Plo -rm -f ./$(DEPDIR)/nonsymm.Plo -rm -f ./$(DEPDIR)/nonsymmv.Plo -rm -f ./$(DEPDIR)/schur.Plo -rm -f ./$(DEPDIR)/sort.Plo -rm -f ./$(DEPDIR)/symm.Plo -rm -f ./$(DEPDIR)/symmv.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/eigen/ChangeLog0000644016036000116100000001055413373111455012077 000000000000002011-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-2.7.1/eigen/TODO0000644016036000116100000000115113373111455011006 00000000000000# -*- 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-2.7.1/eigen/jacobi.c0000644016036000116100000001412413373111455011715 00000000000000/* 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 /* 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-2.7.1/eigen/symmv.c0000644016036000116100000001345113373111455011643 00000000000000/* 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-2.7.1/eigen/nonsymm.c0000644016036000116100000001574113373111455012174 00000000000000/* 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-2.7.1/eigen/nonsymmv.c0000644016036000116100000007612413373111455012364 00000000000000/* 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-2.7.1/eigen/herm.c0000644016036000116100000001124013373111455011415 00000000000000/* 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-2.7.1/eigen/hermv.c0000644016036000116100000001571213373111455011613 00000000000000/* 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-2.7.1/eigen/gensymm.c0000644016036000116100000002052313474326732012155 00000000000000/* 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 #include "recurse.h" /* * 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. */ static int gensymm_standardize_L2(gsl_matrix *A, const gsl_matrix *B); static int gensymm_standardize_L3(gsl_matrix *A, const gsl_matrix *B); /* 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) { return gensymm_standardize_L3(A, B); } /* gensymm_standardize_L2() 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: 1) A is overwritten by L^{-1} A L^{-t} 2) Based on LAPACK DSYGS2 using Level 2 BLAS */ static int gensymm_standardize_L2(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; } /* gensymm_standardize_L3() 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: 1) A is overwritten by L^{-1} A L^{-t} 2) Based on ReLAPACK recursive algorithm using Level 3 BLAS */ static int gensymm_standardize_L3(gsl_matrix *A, const gsl_matrix *B) { const size_t N = A->size1; if (N <= CROSSOVER_GENSYMM) { /* use Level 2 algorithm */ return gensymm_standardize_L2(A, B); } else { /* * partition matrices: * * A11 A12 and B11 B12 * A21 A22 B21 B22 * * where A11 and B11 are N1-by-N1 */ int status; const size_t N1 = GSL_EIGEN_SPLIT(N); const size_t N2 = N - N1; gsl_matrix_view A11 = gsl_matrix_submatrix(A, 0, 0, N1, N1); gsl_matrix_view A21 = gsl_matrix_submatrix(A, N1, 0, N2, N1); gsl_matrix_view A22 = gsl_matrix_submatrix(A, N1, N1, N2, N2); gsl_matrix_const_view B11 = gsl_matrix_const_submatrix(B, 0, 0, N1, N1); gsl_matrix_const_view B21 = gsl_matrix_const_submatrix(B, N1, 0, N2, N1); gsl_matrix_const_view B22 = gsl_matrix_const_submatrix(B, N1, N1, N2, N2); /* recursion on (A11, B11) */ status = gensymm_standardize_L3(&A11.matrix, &B11.matrix); if (status) return status; /* A21 = A21 * B11^{-1} */ gsl_blas_dtrsm(CblasRight, CblasLower, CblasTrans, CblasNonUnit, 1.0, &B11.matrix, &A21.matrix); /* A21 = A21 - 1/2 B21 A11 */ gsl_blas_dsymm(CblasRight, CblasLower, -0.5, &A11.matrix, &B21.matrix, 1.0, &A21.matrix); /* A22 = A22 - A21 * B21' - B21 * A21' */ gsl_blas_dsyr2k(CblasLower, CblasNoTrans, -1.0, &A21.matrix, &B21.matrix, 1.0, &A22.matrix); /* A21 = A21 - 1/2 B21 A11 */ gsl_blas_dsymm(CblasRight, CblasLower, -0.5, &A11.matrix, &B21.matrix, 1.0, &A21.matrix); /* A21 = B22 * A21^{-1} */ gsl_blas_dtrsm(CblasLeft, CblasLower, CblasNoTrans, CblasNonUnit, 1.0, &B22.matrix, &A21.matrix); /* recursion on (A22, B22) */ status = gensymm_standardize_L3(&A22.matrix, &B22.matrix); if (status) return status; return GSL_SUCCESS; } } gsl-2.7.1/eigen/gensymmv.c0000644016036000116100000001225113373111455012332 00000000000000/* 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-2.7.1/eigen/genherm.c0000644016036000116100000002211113521376015012106 00000000000000/* eigen/genherm.c * * Copyright (C) 2007, 2019 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 "recurse.h" /* * 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. */ static int genherm_standardize_L2(gsl_matrix_complex *A, const gsl_matrix_complex *B); static int genherm_standardize_L3(gsl_matrix_complex *A, const gsl_matrix_complex *B); /* 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) { return genherm_standardize_L3(A, B); } /* genherm_standardize_L2() 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: 1) A is overwritten by L^{-1} A L^{-H} 2) Based on LAPACK ZHEGS2 using Level 2 BLAS */ static int genherm_standardize_L2(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; } /* genherm_standardize_L3() 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: 1) A is overwritten by L^{-1} A L^{-H} 2) Based on ReLAPACK using Level 3 BLAS */ static int genherm_standardize_L3(gsl_matrix_complex *A, const gsl_matrix_complex *B) { const size_t N = A->size1; if (N <= CROSSOVER_GENHERM) { /* use Level 2 algorithm */ return genherm_standardize_L2(A, B); } else { /* * partition matrices: * * A11 A12 and B11 B12 * A21 A22 B21 B22 * * where A11 and B11 are N1-by-N1 */ int status; const size_t N1 = GSL_EIGEN_SPLIT_COMPLEX(N); const size_t N2 = N - N1; gsl_matrix_complex_view A11 = gsl_matrix_complex_submatrix(A, 0, 0, N1, N1); gsl_matrix_complex_view A21 = gsl_matrix_complex_submatrix(A, N1, 0, N2, N1); gsl_matrix_complex_view A22 = gsl_matrix_complex_submatrix(A, N1, N1, N2, N2); gsl_matrix_complex_const_view B11 = gsl_matrix_complex_const_submatrix(B, 0, 0, N1, N1); gsl_matrix_complex_const_view B21 = gsl_matrix_complex_const_submatrix(B, N1, 0, N2, N1); gsl_matrix_complex_const_view B22 = gsl_matrix_complex_const_submatrix(B, N1, N1, N2, N2); const gsl_complex MHALF = gsl_complex_rect(-0.5, 0.0); /* recursion on (A11, B11) */ status = genherm_standardize_L3(&A11.matrix, &B11.matrix); if (status) return status; /* A21 = A21 * B11^{-1} */ gsl_blas_ztrsm(CblasRight, CblasLower, CblasConjTrans, CblasNonUnit, GSL_COMPLEX_ONE, &B11.matrix, &A21.matrix); /* A21 = A21 - 1/2 B21 A11 */ gsl_blas_zhemm(CblasRight, CblasLower, MHALF, &A11.matrix, &B21.matrix, GSL_COMPLEX_ONE, &A21.matrix); /* A22 = A22 - A21 * B21' - B21 * A21' */ gsl_blas_zher2k(CblasLower, CblasNoTrans, GSL_COMPLEX_NEGONE, &A21.matrix, &B21.matrix, 1.0, &A22.matrix); /* A21 = A21 - 1/2 B21 A11 */ gsl_blas_zhemm(CblasRight, CblasLower, MHALF, &A11.matrix, &B21.matrix, GSL_COMPLEX_ONE, &A21.matrix); /* A21 = B22 * A21^{-1} */ gsl_blas_ztrsm(CblasLeft, CblasLower, CblasNoTrans, CblasNonUnit, GSL_COMPLEX_ONE, &B22.matrix, &A21.matrix); /* recursion on (A22, B22) */ status = genherm_standardize_L3(&A22.matrix, &B22.matrix); if (status) return status; return GSL_SUCCESS; } } gsl-2.7.1/eigen/genhermv.c0000644016036000116100000001252613373111455012305 00000000000000/* 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-2.7.1/eigen/gen.c0000644016036000116100000016526413373111455011253 00000000000000/* 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-2.7.1/eigen/genv.c0000644016036000116100000007013713373111455011433 00000000000000/* 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-2.7.1/eigen/sort.c0000644016036000116100000002357013373111455011462 00000000000000/* 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-2.7.1/eigen/francis.c0000644016036000116100000007166013373111455012123 00000000000000/* eigen/francis.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 #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-2.7.1/eigen/schur.c0000644016036000116100000005300413135126237011612 00000000000000/* 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-2.7.1/eigen/test.c0000644016036000116100000011742713474333126011462 00000000000000/* 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() */ static int create_random_complex_posdef_matrix(gsl_matrix_complex *m, gsl_rng *r) { const size_t N = m->size1; const double alpha = 10.0 * N; size_t i; create_random_herm_matrix(m, r, 0, 1); for (i = 0; i < N; ++i) { gsl_complex * mii = gsl_matrix_complex_ptr(m, i, i); GSL_REAL(*mii) += alpha; } return GSL_SUCCESS; } 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 = 50; 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 = 50; 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_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); 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_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-2.7.1/specfunc/0000755016036000116100000000000014151602575011122 500000000000000gsl-2.7.1/specfunc/Makefile.am0000644016036000116100000000464313532126606013103 00000000000000noinst_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_hermite.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_sincos_pi.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 hermite.c hyperg_0F1.c hyperg_2F0.c hyperg_1F1.c hyperg_2F1.c hyperg_U.c hyperg.c inline.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 sincos_pi.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_hermite.c test_hyperg.c test_legendre.c test_mathieu.c test_sincos_pi.c gsl-2.7.1/specfunc/bessel_amp_phase.h0000644016036000116100000000276713135126237014516 00000000000000/* 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-2.7.1/specfunc/bessel_olver.h0000644016036000116100000000223613135126237013677 00000000000000/* 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-2.7.1/specfunc/bessel_temme.h0000644016036000116100000000235113135126237013655 00000000000000/* 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-2.7.1/specfunc/bessel.h0000644016036000116100000000631713373111456012475 00000000000000/* 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_Jnupos_e(const double nu, const double x, gsl_sf_result * result); int gsl_sf_bessel_Ynupos_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-2.7.1/specfunc/hyperg.h0000644016036000116100000000433613135126237012514 00000000000000/* 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-2.7.1/specfunc/legendre.h0000644016036000116100000000447713135126237013011 00000000000000/* 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-2.7.1/specfunc/eval.h0000644016036000116100000000064013135126237012137 00000000000000/* 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-2.7.1/specfunc/chebyshev.h0000644016036000116100000000227213135126237013173 00000000000000/* 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-2.7.1/specfunc/cheb_eval.c0000644016036000116100000000122013441251001013072 00000000000000 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-2.7.1/specfunc/cheb_eval_mode.c0000644016036000116100000000125013441251001014101 00000000000000static 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-2.7.1/specfunc/check.h0000644016036000116100000000017613135126237012271 00000000000000/* check for underflow */ #define CHECK_UNDERFLOW(r) if (fabs((r)->val) < GSL_DBL_MIN) GSL_ERROR("underflow", GSL_EUNDRFLW); gsl-2.7.1/specfunc/error.h0000644016036000116100000000366113373111456012350 00000000000000#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-2.7.1/specfunc/legendre_source.c0000644016036000116100000004300414151556700014352 00000000000000/* specfunc/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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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-2.7.1/specfunc/gsl_sf.h0000644016036000116100000000212213373111456012463 00000000000000/* 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 #include #include #endif /* __GSL_SF_H__ */ gsl-2.7.1/specfunc/gsl_sf_airy.h0000644016036000116100000000717513135126237013523 00000000000000/* 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-2.7.1/specfunc/gsl_sf_bessel.h0000644016036000116100000003352513373111456014033 00000000000000/* 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-2.7.1/specfunc/gsl_sf_clausen.h0000644016036000116100000000267313135126237014207 00000000000000/* 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-2.7.1/specfunc/gsl_sf_coulomb.h0000644016036000116100000001046213135126237014210 00000000000000/* 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-2.7.1/specfunc/gsl_sf_coupling.h0000644016036000116100000001010513135126237014362 00000000000000/* 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-2.7.1/specfunc/gsl_sf_dawson.h0000644016036000116100000000257213135126237014046 00000000000000/* specfunc/gsl_sf_dawson.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Author: G. Jungman */ #ifndef __GSL_SF_DAWSON_H__ #define __GSL_SF_DAWSON_H__ #include #undef __BEGIN_DECLS #undef __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-2.7.1/specfunc/gsl_sf_debye.h0000644016036000116100000000437713135126237013650 00000000000000/* 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-2.7.1/specfunc/gsl_sf_dilog.h0000644016036000116100000001011313135126237013637 00000000000000/* 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-2.7.1/specfunc/gsl_sf_elementary.h0000644016036000116100000000317113135126237014714 00000000000000/* 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-2.7.1/specfunc/gsl_sf_ellint.h0000644016036000116100000001007713373111456014042 00000000000000/* 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-2.7.1/specfunc/gsl_sf_elljac.h0000644016036000116100000000252413135126237014002 00000000000000/* 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-2.7.1/specfunc/gsl_sf_erf.h0000644016036000116100000000436713135126237013333 00000000000000/* 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-2.7.1/specfunc/gsl_sf_exp.h0000644016036000116100000000740713373111456013352 00000000000000/* 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-2.7.1/specfunc/gsl_sf_expint.h0000644016036000116100000001045513135126237014061 00000000000000/* 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-2.7.1/specfunc/gsl_sf_fermi_dirac.h0000644016036000116100000000652513135126237015021 00000000000000/* 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-2.7.1/specfunc/gsl_sf_gamma.h0000644016036000116100000001710613373111456013635 00000000000000/* 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-2.7.1/specfunc/gsl_sf_gegenbauer.h0000644016036000116100000000415213135126237014653 00000000000000/* 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-2.7.1/specfunc/gsl_sf_hermite.h0000644016036000116100000001264213441244424014206 00000000000000/* gsl_sf_hermite.h * * Copyright (C) 2011-2014 Konrad Griessinger * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /*----------------------------------------------------------------------* * (konradg(at)gmx.net) * *----------------------------------------------------------------------*/ #ifndef __GSL_SF_HERMITE_H__ #define __GSL_SF_HERMITE_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_sf_hermite_prob_e(const int n, const double x, gsl_sf_result * result); double gsl_sf_hermite_prob(const int n, const double x); int gsl_sf_hermite_prob_deriv_e(const int m, const int n, const double x, gsl_sf_result * result); double gsl_sf_hermite_prob_deriv(const int m, const int n, const double x); int gsl_sf_hermite_e(const int n, const double x, gsl_sf_result * result); double gsl_sf_hermite(const int n, const double x); int gsl_sf_hermite_deriv_e(const int m, const int n, const double x, gsl_sf_result * result); double gsl_sf_hermite_deriv(const int m, const int n, const double x); int gsl_sf_hermite_func_e(const int n, const double x, gsl_sf_result * result); double gsl_sf_hermite_func(const int n, const double x); int gsl_sf_hermite_func_fast_e(const int n, const double x, gsl_sf_result * result); double gsl_sf_hermite_func_fast(const int n, const double x); int gsl_sf_hermite_prob_array(const int nmax, const double x, double * result_array); int gsl_sf_hermite_prob_array_deriv(const int m, const int nmax, const double x, double * result_array); int gsl_sf_hermite_prob_deriv_array(const int mmax, const int n, const double x, double * result_array); int gsl_sf_hermite_prob_series_e(const int n, const double x, const double * a, gsl_sf_result * result); double gsl_sf_hermite_prob_series(const int n, const double x, const double * a); int gsl_sf_hermite_array(const int nmax, const double x, double * result_array); int gsl_sf_hermite_array_deriv(const int m, const int nmax, const double x, double * result_array); int gsl_sf_hermite_deriv_array(const int mmax, const int n, const double x, double * result_array); int gsl_sf_hermite_series_e(const int n, const double x, const double * a, gsl_sf_result * result); double gsl_sf_hermite_series(const int n, const double x, const double * a); int gsl_sf_hermite_func_array(const int nmax, const double x, double * result_array); int gsl_sf_hermite_func_series_e(const int n, const double x, const double * a, gsl_sf_result * result); double gsl_sf_hermite_func_series(const int n, const double x, const double * a); int gsl_sf_hermite_func_der_e(const int m, const int n, const double x, gsl_sf_result * result); double gsl_sf_hermite_func_der(const int m, const int n, const double x); int gsl_sf_hermite_prob_zero_e(const int n, const int s, gsl_sf_result * result); double gsl_sf_hermite_prob_zero(const int n, const int s); int gsl_sf_hermite_zero_e(const int n, const int s, gsl_sf_result * result); double gsl_sf_hermite_zero(const int n, const int s); int gsl_sf_hermite_func_zero_e(const int n, const int s, gsl_sf_result * result); double gsl_sf_hermite_func_zero(const int n, const int s); #ifndef GSL_DISABLE_DEPRECATED int gsl_sf_hermite_phys_e(const int n, const double x, gsl_sf_result * result); double gsl_sf_hermite_phys(const int n, const double x); int gsl_sf_hermite_phys_der_e(const int m, const int n, const double x, gsl_sf_result * result); double gsl_sf_hermite_phys_der(const int m, const int n, const double x); int gsl_sf_hermite_phys_array(const int nmax, const double x, double * result_array); int gsl_sf_hermite_phys_series_e(const int n, const double x, const double * a, gsl_sf_result * result); double gsl_sf_hermite_phys_series(const int n, const double x, const double * a); int gsl_sf_hermite_phys_array_der(const int m, const int nmax, const double x, double * result_array); int gsl_sf_hermite_phys_der_array(const int mmax, const int n, const double x, double * result_array); int gsl_sf_hermite_phys_zero_e(const int n, const int s, gsl_sf_result * result); double gsl_sf_hermite_phys_zero(const int n, const int s); int gsl_sf_hermite_prob_array_der(const int m, const int nmax, const double x, double * result_array); int gsl_sf_hermite_prob_der_array(const int mmax, const int n, const double x, double * result_array); int gsl_sf_hermite_prob_der_e(const int m, const int n, const double x, gsl_sf_result * result); double gsl_sf_hermite_prob_der(const int m, const int n, const double x); #endif /* !GSL_DISABLE_DEPRECATED */ __END_DECLS #endif /* __GSL_SF_HERMITE_H__ */ gsl-2.7.1/specfunc/gsl_sf_hyperg.h0000644016036000116100000001064513135126237014051 00000000000000/* 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-2.7.1/specfunc/gsl_sf_laguerre.h0000644016036000116100000000372013135126237014355 00000000000000/* 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-2.7.1/specfunc/gsl_sf_lambert.h0000644016036000116100000000342513135126237014177 00000000000000/* 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-2.7.1/specfunc/gsl_sf_legendre.h0000644016036000116100000002776314151556700014352 00000000000000/* specfunc/gsl_sf_legendre.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004 Gerard Jungman * Copyright (C) 2019 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 */ #ifndef __GSL_SF_LEGENDRE_H__ #define __GSL_SF_LEGENDRE_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 /* 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_nlm(const size_t lmax); INLINE_DECL size_t gsl_sf_legendre_array_index(const size_t l, const size_t m); #ifdef HAVE_INLINE /* gsl_sf_legendre_array_index() This routine computes the index into a result_array[] corresponding to a given (l,m) */ INLINE_FUN size_t gsl_sf_legendre_array_index(const size_t l, const size_t m) { return (((l * (l + 1)) >> 1) + m); } #endif /* HAVE_INLINE */ __END_DECLS #endif /* __GSL_SF_LEGENDRE_H__ */ gsl-2.7.1/specfunc/gsl_sf_log.h0000644016036000116100000000401613135126237013327 00000000000000/* 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-2.7.1/specfunc/gsl_sf_mathieu.h0000644016036000116100000001032313373111456014201 00000000000000/* 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-2.7.1/specfunc/gsl_sf_pow_int.h0000644016036000116100000000255613135126237014234 00000000000000/* specfunc/gsl_sf_pow_int.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Author: G. Jungman */ #ifndef __GSL_SF_POW_INT_H__ #define __GSL_SF_POW_INT_H__ #include #undef __BEGIN_DECLS #undef __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-2.7.1/specfunc/gsl_sf_psi.h0000644016036000116100000000517313135126237013346 00000000000000/* 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-2.7.1/specfunc/gsl_sf_result.h0000644016036000116100000000305113135126237014062 00000000000000/* 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-2.7.1/specfunc/gsl_sf_sincos_pi.h0000644016036000116100000000321013373111456014530 00000000000000/* specfunc/gsl_sf_sincos_pi.h * * Copyright (C) 2017 Konrad Griessinger * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Author: G. Jungman, K. Griessinger */ #ifndef __GSL_SF_SINCOS_PI_H__ #define __GSL_SF_SINCOS_PI_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_pi(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_pi_e(double x, gsl_sf_result * result); double gsl_sf_sin_pi(const double x); /* cos_pi(x) with GSL semantics. */ int gsl_sf_cos_pi_e(double x, gsl_sf_result * result); double gsl_sf_cos_pi(const double x); __END_DECLS #endif /* __GSL_SF_SINCOS_PI_H__ */ gsl-2.7.1/specfunc/gsl_sf_synchrotron.h0000644016036000116100000000327313135126237015142 00000000000000/* 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-2.7.1/specfunc/gsl_sf_transport.h0000644016036000116100000000367213135126237014611 00000000000000/* 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-2.7.1/specfunc/gsl_sf_trig.h0000644016036000116100000000756513135126237013527 00000000000000/* 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-2.7.1/specfunc/gsl_sf_zeta.h0000644016036000116100000000551613135126237013517 00000000000000/* 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-2.7.1/specfunc/gsl_specfunc.h0000644016036000116100000000025513135126237013665 00000000000000/* Author: G. Jungman */ /* Convenience header */ #ifndef __GSL_SPECFUNC_H__ #define __GSL_SPECFUNC_H__ #include #endif /* __GSL_SPECFUNC_H__ */ gsl-2.7.1/specfunc/Makefile.in0000644016036000116100000015606114151557215013120 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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 hermite.lo hyperg_0F1.lo hyperg_2F0.lo \ hyperg_1F1.lo hyperg_2F1.lo hyperg_U.lo hyperg.lo inline.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 sincos_pi.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_hermite.$(OBJEXT) test_hyperg.$(OBJEXT) \ test_legendre.$(OBJEXT) test_mathieu.$(OBJEXT) \ test_sincos_pi.$(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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/airy.Plo ./$(DEPDIR)/airy_der.Plo \ ./$(DEPDIR)/airy_zero.Plo ./$(DEPDIR)/atanint.Plo \ ./$(DEPDIR)/bessel.Plo ./$(DEPDIR)/bessel_I0.Plo \ ./$(DEPDIR)/bessel_I1.Plo ./$(DEPDIR)/bessel_In.Plo \ ./$(DEPDIR)/bessel_Inu.Plo ./$(DEPDIR)/bessel_J0.Plo \ ./$(DEPDIR)/bessel_J1.Plo ./$(DEPDIR)/bessel_Jn.Plo \ ./$(DEPDIR)/bessel_Jnu.Plo ./$(DEPDIR)/bessel_K0.Plo \ ./$(DEPDIR)/bessel_K1.Plo ./$(DEPDIR)/bessel_Kn.Plo \ ./$(DEPDIR)/bessel_Knu.Plo ./$(DEPDIR)/bessel_Y0.Plo \ ./$(DEPDIR)/bessel_Y1.Plo ./$(DEPDIR)/bessel_Yn.Plo \ ./$(DEPDIR)/bessel_Ynu.Plo ./$(DEPDIR)/bessel_amp_phase.Plo \ ./$(DEPDIR)/bessel_i.Plo ./$(DEPDIR)/bessel_j.Plo \ ./$(DEPDIR)/bessel_k.Plo ./$(DEPDIR)/bessel_olver.Plo \ ./$(DEPDIR)/bessel_sequence.Plo ./$(DEPDIR)/bessel_temme.Plo \ ./$(DEPDIR)/bessel_y.Plo ./$(DEPDIR)/bessel_zero.Plo \ ./$(DEPDIR)/beta.Plo ./$(DEPDIR)/beta_inc.Plo \ ./$(DEPDIR)/clausen.Plo ./$(DEPDIR)/coulomb.Plo \ ./$(DEPDIR)/coulomb_bound.Plo ./$(DEPDIR)/coupling.Plo \ ./$(DEPDIR)/dawson.Plo ./$(DEPDIR)/debye.Plo \ ./$(DEPDIR)/dilog.Plo ./$(DEPDIR)/elementary.Plo \ ./$(DEPDIR)/ellint.Plo ./$(DEPDIR)/elljac.Plo \ ./$(DEPDIR)/erfc.Plo ./$(DEPDIR)/exp.Plo \ ./$(DEPDIR)/expint.Plo ./$(DEPDIR)/expint3.Plo \ ./$(DEPDIR)/fermi_dirac.Plo ./$(DEPDIR)/gamma.Plo \ ./$(DEPDIR)/gamma_inc.Plo ./$(DEPDIR)/gegenbauer.Plo \ ./$(DEPDIR)/hermite.Plo ./$(DEPDIR)/hyperg.Plo \ ./$(DEPDIR)/hyperg_0F1.Plo ./$(DEPDIR)/hyperg_1F1.Plo \ ./$(DEPDIR)/hyperg_2F0.Plo ./$(DEPDIR)/hyperg_2F1.Plo \ ./$(DEPDIR)/hyperg_U.Plo ./$(DEPDIR)/inline.Plo \ ./$(DEPDIR)/laguerre.Plo ./$(DEPDIR)/lambert.Plo \ ./$(DEPDIR)/legendre_H3d.Plo ./$(DEPDIR)/legendre_P.Plo \ ./$(DEPDIR)/legendre_Qn.Plo ./$(DEPDIR)/legendre_con.Plo \ ./$(DEPDIR)/legendre_poly.Plo ./$(DEPDIR)/log.Plo \ ./$(DEPDIR)/mathieu_angfunc.Plo ./$(DEPDIR)/mathieu_charv.Plo \ ./$(DEPDIR)/mathieu_coeff.Plo ./$(DEPDIR)/mathieu_radfunc.Plo \ ./$(DEPDIR)/mathieu_workspace.Plo ./$(DEPDIR)/poch.Plo \ ./$(DEPDIR)/pow_int.Plo ./$(DEPDIR)/psi.Plo \ ./$(DEPDIR)/result.Plo ./$(DEPDIR)/shint.Plo \ ./$(DEPDIR)/sincos_pi.Plo ./$(DEPDIR)/sinint.Plo \ ./$(DEPDIR)/synchrotron.Plo ./$(DEPDIR)/test_airy.Po \ ./$(DEPDIR)/test_bessel.Po ./$(DEPDIR)/test_coulomb.Po \ ./$(DEPDIR)/test_dilog.Po ./$(DEPDIR)/test_gamma.Po \ ./$(DEPDIR)/test_hermite.Po ./$(DEPDIR)/test_hyperg.Po \ ./$(DEPDIR)/test_legendre.Po ./$(DEPDIR)/test_mathieu.Po \ ./$(DEPDIR)/test_sf.Po ./$(DEPDIR)/test_sincos_pi.Po \ ./$(DEPDIR)/transport.Plo ./$(DEPDIR)/trig.Plo \ ./$(DEPDIR)/zeta.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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_hermite.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_sincos_pi.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 hermite.c hyperg_0F1.c hyperg_2F0.c hyperg_1F1.c hyperg_2F1.c hyperg_U.c hyperg.c inline.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 sincos_pi.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_hermite.c test_hyperg.c test_legendre.c test_mathieu.c test_sincos_pi.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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/airy_der.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/airy_zero.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atanint.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_I0.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_I1.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_In.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Inu.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_J0.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_J1.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Jn.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Jnu.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_K0.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_K1.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Kn.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Knu.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Y0.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Y1.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Yn.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Ynu.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_amp_phase.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_i.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_j.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_k.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_olver.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_sequence.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_temme.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_y.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_zero.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/beta.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/beta_inc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clausen.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coulomb.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coulomb_bound.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coupling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dawson.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debye.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dilog.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elementary.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ellint.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elljac.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/erfc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expint.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expint3.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fermi_dirac.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gamma.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gamma_inc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gegenbauer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hermite.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg_0F1.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg_1F1.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg_2F0.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg_2F1.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg_U.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/laguerre.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lambert.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legendre_H3d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legendre_P.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legendre_Qn.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legendre_con.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legendre_poly.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mathieu_angfunc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mathieu_charv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mathieu_coeff.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mathieu_radfunc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mathieu_workspace.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poch.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pow_int.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psi.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/result.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shint.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sincos_pi.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sinint.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/synchrotron.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_airy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_bessel.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_coulomb.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_dilog.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_gamma.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hermite.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hyperg.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_legendre.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_mathieu.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_sf.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_sincos_pi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transport.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trig.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zeta.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/airy.Plo -rm -f ./$(DEPDIR)/airy_der.Plo -rm -f ./$(DEPDIR)/airy_zero.Plo -rm -f ./$(DEPDIR)/atanint.Plo -rm -f ./$(DEPDIR)/bessel.Plo -rm -f ./$(DEPDIR)/bessel_I0.Plo -rm -f ./$(DEPDIR)/bessel_I1.Plo -rm -f ./$(DEPDIR)/bessel_In.Plo -rm -f ./$(DEPDIR)/bessel_Inu.Plo -rm -f ./$(DEPDIR)/bessel_J0.Plo -rm -f ./$(DEPDIR)/bessel_J1.Plo -rm -f ./$(DEPDIR)/bessel_Jn.Plo -rm -f ./$(DEPDIR)/bessel_Jnu.Plo -rm -f ./$(DEPDIR)/bessel_K0.Plo -rm -f ./$(DEPDIR)/bessel_K1.Plo -rm -f ./$(DEPDIR)/bessel_Kn.Plo -rm -f ./$(DEPDIR)/bessel_Knu.Plo -rm -f ./$(DEPDIR)/bessel_Y0.Plo -rm -f ./$(DEPDIR)/bessel_Y1.Plo -rm -f ./$(DEPDIR)/bessel_Yn.Plo -rm -f ./$(DEPDIR)/bessel_Ynu.Plo -rm -f ./$(DEPDIR)/bessel_amp_phase.Plo -rm -f ./$(DEPDIR)/bessel_i.Plo -rm -f ./$(DEPDIR)/bessel_j.Plo -rm -f ./$(DEPDIR)/bessel_k.Plo -rm -f ./$(DEPDIR)/bessel_olver.Plo -rm -f ./$(DEPDIR)/bessel_sequence.Plo -rm -f ./$(DEPDIR)/bessel_temme.Plo -rm -f ./$(DEPDIR)/bessel_y.Plo -rm -f ./$(DEPDIR)/bessel_zero.Plo -rm -f ./$(DEPDIR)/beta.Plo -rm -f ./$(DEPDIR)/beta_inc.Plo -rm -f ./$(DEPDIR)/clausen.Plo -rm -f ./$(DEPDIR)/coulomb.Plo -rm -f ./$(DEPDIR)/coulomb_bound.Plo -rm -f ./$(DEPDIR)/coupling.Plo -rm -f ./$(DEPDIR)/dawson.Plo -rm -f ./$(DEPDIR)/debye.Plo -rm -f ./$(DEPDIR)/dilog.Plo -rm -f ./$(DEPDIR)/elementary.Plo -rm -f ./$(DEPDIR)/ellint.Plo -rm -f ./$(DEPDIR)/elljac.Plo -rm -f ./$(DEPDIR)/erfc.Plo -rm -f ./$(DEPDIR)/exp.Plo -rm -f ./$(DEPDIR)/expint.Plo -rm -f ./$(DEPDIR)/expint3.Plo -rm -f ./$(DEPDIR)/fermi_dirac.Plo -rm -f ./$(DEPDIR)/gamma.Plo -rm -f ./$(DEPDIR)/gamma_inc.Plo -rm -f ./$(DEPDIR)/gegenbauer.Plo -rm -f ./$(DEPDIR)/hermite.Plo -rm -f ./$(DEPDIR)/hyperg.Plo -rm -f ./$(DEPDIR)/hyperg_0F1.Plo -rm -f ./$(DEPDIR)/hyperg_1F1.Plo -rm -f ./$(DEPDIR)/hyperg_2F0.Plo -rm -f ./$(DEPDIR)/hyperg_2F1.Plo -rm -f ./$(DEPDIR)/hyperg_U.Plo -rm -f ./$(DEPDIR)/inline.Plo -rm -f ./$(DEPDIR)/laguerre.Plo -rm -f ./$(DEPDIR)/lambert.Plo -rm -f ./$(DEPDIR)/legendre_H3d.Plo -rm -f ./$(DEPDIR)/legendre_P.Plo -rm -f ./$(DEPDIR)/legendre_Qn.Plo -rm -f ./$(DEPDIR)/legendre_con.Plo -rm -f ./$(DEPDIR)/legendre_poly.Plo -rm -f ./$(DEPDIR)/log.Plo -rm -f ./$(DEPDIR)/mathieu_angfunc.Plo -rm -f ./$(DEPDIR)/mathieu_charv.Plo -rm -f ./$(DEPDIR)/mathieu_coeff.Plo -rm -f ./$(DEPDIR)/mathieu_radfunc.Plo -rm -f ./$(DEPDIR)/mathieu_workspace.Plo -rm -f ./$(DEPDIR)/poch.Plo -rm -f ./$(DEPDIR)/pow_int.Plo -rm -f ./$(DEPDIR)/psi.Plo -rm -f ./$(DEPDIR)/result.Plo -rm -f ./$(DEPDIR)/shint.Plo -rm -f ./$(DEPDIR)/sincos_pi.Plo -rm -f ./$(DEPDIR)/sinint.Plo -rm -f ./$(DEPDIR)/synchrotron.Plo -rm -f ./$(DEPDIR)/test_airy.Po -rm -f ./$(DEPDIR)/test_bessel.Po -rm -f ./$(DEPDIR)/test_coulomb.Po -rm -f ./$(DEPDIR)/test_dilog.Po -rm -f ./$(DEPDIR)/test_gamma.Po -rm -f ./$(DEPDIR)/test_hermite.Po -rm -f ./$(DEPDIR)/test_hyperg.Po -rm -f ./$(DEPDIR)/test_legendre.Po -rm -f ./$(DEPDIR)/test_mathieu.Po -rm -f ./$(DEPDIR)/test_sf.Po -rm -f ./$(DEPDIR)/test_sincos_pi.Po -rm -f ./$(DEPDIR)/transport.Plo -rm -f ./$(DEPDIR)/trig.Plo -rm -f ./$(DEPDIR)/zeta.Plo -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 -f ./$(DEPDIR)/airy.Plo -rm -f ./$(DEPDIR)/airy_der.Plo -rm -f ./$(DEPDIR)/airy_zero.Plo -rm -f ./$(DEPDIR)/atanint.Plo -rm -f ./$(DEPDIR)/bessel.Plo -rm -f ./$(DEPDIR)/bessel_I0.Plo -rm -f ./$(DEPDIR)/bessel_I1.Plo -rm -f ./$(DEPDIR)/bessel_In.Plo -rm -f ./$(DEPDIR)/bessel_Inu.Plo -rm -f ./$(DEPDIR)/bessel_J0.Plo -rm -f ./$(DEPDIR)/bessel_J1.Plo -rm -f ./$(DEPDIR)/bessel_Jn.Plo -rm -f ./$(DEPDIR)/bessel_Jnu.Plo -rm -f ./$(DEPDIR)/bessel_K0.Plo -rm -f ./$(DEPDIR)/bessel_K1.Plo -rm -f ./$(DEPDIR)/bessel_Kn.Plo -rm -f ./$(DEPDIR)/bessel_Knu.Plo -rm -f ./$(DEPDIR)/bessel_Y0.Plo -rm -f ./$(DEPDIR)/bessel_Y1.Plo -rm -f ./$(DEPDIR)/bessel_Yn.Plo -rm -f ./$(DEPDIR)/bessel_Ynu.Plo -rm -f ./$(DEPDIR)/bessel_amp_phase.Plo -rm -f ./$(DEPDIR)/bessel_i.Plo -rm -f ./$(DEPDIR)/bessel_j.Plo -rm -f ./$(DEPDIR)/bessel_k.Plo -rm -f ./$(DEPDIR)/bessel_olver.Plo -rm -f ./$(DEPDIR)/bessel_sequence.Plo -rm -f ./$(DEPDIR)/bessel_temme.Plo -rm -f ./$(DEPDIR)/bessel_y.Plo -rm -f ./$(DEPDIR)/bessel_zero.Plo -rm -f ./$(DEPDIR)/beta.Plo -rm -f ./$(DEPDIR)/beta_inc.Plo -rm -f ./$(DEPDIR)/clausen.Plo -rm -f ./$(DEPDIR)/coulomb.Plo -rm -f ./$(DEPDIR)/coulomb_bound.Plo -rm -f ./$(DEPDIR)/coupling.Plo -rm -f ./$(DEPDIR)/dawson.Plo -rm -f ./$(DEPDIR)/debye.Plo -rm -f ./$(DEPDIR)/dilog.Plo -rm -f ./$(DEPDIR)/elementary.Plo -rm -f ./$(DEPDIR)/ellint.Plo -rm -f ./$(DEPDIR)/elljac.Plo -rm -f ./$(DEPDIR)/erfc.Plo -rm -f ./$(DEPDIR)/exp.Plo -rm -f ./$(DEPDIR)/expint.Plo -rm -f ./$(DEPDIR)/expint3.Plo -rm -f ./$(DEPDIR)/fermi_dirac.Plo -rm -f ./$(DEPDIR)/gamma.Plo -rm -f ./$(DEPDIR)/gamma_inc.Plo -rm -f ./$(DEPDIR)/gegenbauer.Plo -rm -f ./$(DEPDIR)/hermite.Plo -rm -f ./$(DEPDIR)/hyperg.Plo -rm -f ./$(DEPDIR)/hyperg_0F1.Plo -rm -f ./$(DEPDIR)/hyperg_1F1.Plo -rm -f ./$(DEPDIR)/hyperg_2F0.Plo -rm -f ./$(DEPDIR)/hyperg_2F1.Plo -rm -f ./$(DEPDIR)/hyperg_U.Plo -rm -f ./$(DEPDIR)/inline.Plo -rm -f ./$(DEPDIR)/laguerre.Plo -rm -f ./$(DEPDIR)/lambert.Plo -rm -f ./$(DEPDIR)/legendre_H3d.Plo -rm -f ./$(DEPDIR)/legendre_P.Plo -rm -f ./$(DEPDIR)/legendre_Qn.Plo -rm -f ./$(DEPDIR)/legendre_con.Plo -rm -f ./$(DEPDIR)/legendre_poly.Plo -rm -f ./$(DEPDIR)/log.Plo -rm -f ./$(DEPDIR)/mathieu_angfunc.Plo -rm -f ./$(DEPDIR)/mathieu_charv.Plo -rm -f ./$(DEPDIR)/mathieu_coeff.Plo -rm -f ./$(DEPDIR)/mathieu_radfunc.Plo -rm -f ./$(DEPDIR)/mathieu_workspace.Plo -rm -f ./$(DEPDIR)/poch.Plo -rm -f ./$(DEPDIR)/pow_int.Plo -rm -f ./$(DEPDIR)/psi.Plo -rm -f ./$(DEPDIR)/result.Plo -rm -f ./$(DEPDIR)/shint.Plo -rm -f ./$(DEPDIR)/sincos_pi.Plo -rm -f ./$(DEPDIR)/sinint.Plo -rm -f ./$(DEPDIR)/synchrotron.Plo -rm -f ./$(DEPDIR)/test_airy.Po -rm -f ./$(DEPDIR)/test_bessel.Po -rm -f ./$(DEPDIR)/test_coulomb.Po -rm -f ./$(DEPDIR)/test_dilog.Po -rm -f ./$(DEPDIR)/test_gamma.Po -rm -f ./$(DEPDIR)/test_hermite.Po -rm -f ./$(DEPDIR)/test_hyperg.Po -rm -f ./$(DEPDIR)/test_legendre.Po -rm -f ./$(DEPDIR)/test_mathieu.Po -rm -f ./$(DEPDIR)/test_sf.Po -rm -f ./$(DEPDIR)/test_sincos_pi.Po -rm -f ./$(DEPDIR)/transport.Plo -rm -f ./$(DEPDIR)/trig.Plo -rm -f ./$(DEPDIR)/zeta.Plo -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/specfunc/ChangeLog0000644016036000116100000006521713373111456012625 000000000000002011-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-2.7.1/specfunc/TODO0000644016036000116100000003316013441251103011521 00000000000000# -*- 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 Marsaglia gsl-2.7.1/specfunc/airy.c0000644016036000116100000005577213441251001012153 00000000000000/* 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-2.7.1/specfunc/airy_der.c0000644016036000116100000006177613441251001013006 00000000000000/* 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-2.7.1/specfunc/airy_zero.c0000644016036000116100000003250613441251001013200 00000000000000/* 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-2.7.1/specfunc/atanint.c0000644016036000116100000000571513441251001012635 00000000000000/* specfunc/atanint.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with 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 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-2.7.1/specfunc/bessel.c0000644016036000116100000006643613441251001012463 00000000000000/* 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-2.7.1/specfunc/bessel_I0.c0000644016036000116100000001416413441251001013002 00000000000000/* 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-2.7.1/specfunc/bessel_I1.c0000644016036000116100000001523413441251001013002 00000000000000/* 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-2.7.1/specfunc/bessel_In.c0000644016036000116100000001443013441251001013074 00000000000000/* 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-2.7.1/specfunc/bessel_Inu.c0000644016036000116100000000653013441251001013263 00000000000000/* 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-2.7.1/specfunc/bessel_J0.c0000644016036000116100000000627613441251001013010 00000000000000/* 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-2.7.1/specfunc/bessel_J1.c0000644016036000116100000000713713441251001013006 00000000000000/* 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-2.7.1/specfunc/bessel_Jn.c0000644016036000116100000001171213441251001013075 00000000000000/* 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-2.7.1/specfunc/bessel_Jnu.c0000644016036000116100000001401113441251001013255 00000000000000/* specfunc/bessel_Jnu.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, 2017 Konrad Griessinger * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with 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_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_Jnupos_e(const double nu, const double x, gsl_sf_result * result) { /* CHECK_POINTER(result) */ 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); } } } int gsl_sf_bessel_Jnu_e(const double nu, const double x, gsl_sf_result * result) { /* CHECK_POINTER(result) */ if(x <= 0.0) { DOMAIN_ERROR(result); } else if (nu < 0.0) { int Jstatus = gsl_sf_bessel_Jnupos_e(-nu, x, result); double Jval = result->val; double Jerr = result->err; int Ystatus = gsl_sf_bessel_Ynupos_e(-nu, x, result); double Yval = result->val; double Yerr = result->err; /* double s = sin(M_PI*nu), c = cos(M_PI*nu); */ int sinstatus = gsl_sf_sin_pi_e(nu, result); double s = result->val; double serr = result->err; int cosstatus = gsl_sf_cos_pi_e(nu, result); double c = result->val; double cerr = result->err; result->val = s*Yval + c*Jval; result->err = fabs(c*Yerr) + fabs(s*Jerr) + fabs(cerr*Yval) + fabs(serr*Jval); return GSL_ERROR_SELECT_4(Jstatus, Ystatus, sinstatus, cosstatus); } else return gsl_sf_bessel_Jnupos_e(nu, x, result); } /*-*-*-*-*-*-*-*-*-* 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-2.7.1/specfunc/bessel_K0.c0000644016036000116100000001313713441251001013003 00000000000000/* 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-2.7.1/specfunc/bessel_K1.c0000644016036000116100000001373513441251001013010 00000000000000/* 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-2.7.1/specfunc/bessel_Kn.c0000644016036000116100000001467613441251001013112 00000000000000/* 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-2.7.1/specfunc/bessel_Knu.c0000644016036000116100000001247513441251001013272 00000000000000/* 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-2.7.1/specfunc/bessel_Y0.c0000644016036000116100000000704213441251001013017 00000000000000/* 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-2.7.1/specfunc/bessel_Y1.c0000644016036000116100000001012113441251001013010 00000000000000/* 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-2.7.1/specfunc/bessel_Yn.c0000644016036000116100000001257413441251001013123 00000000000000/* 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-2.7.1/specfunc/bessel_Ynu.c0000644016036000116100000001034313441251001013300 00000000000000/* specfunc/bessel_Ynu.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, 2017 Konrad Griessinger * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with 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_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_Ynupos_e(double nu, double x, gsl_sf_result * result) { /* CHECK_POINTER(result) */ 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; } } int gsl_sf_bessel_Ynu_e(double nu, double x, gsl_sf_result * result) { /* CHECK_POINTER(result) */ if(x <= 0.0) { DOMAIN_ERROR(result); } else if (nu < 0.0) { int Jstatus = gsl_sf_bessel_Jnupos_e(-nu, x, result); double Jval = result->val; double Jerr = result->err; int Ystatus = gsl_sf_bessel_Ynupos_e(-nu, x, result); double Yval = result->val; double Yerr = result->err; /* double s = sin(M_PI*nu), c = cos(M_PI*nu); */ int sinstatus = gsl_sf_sin_pi_e(nu, result); double s = result->val; double serr = result->err; int cosstatus = gsl_sf_cos_pi_e(nu, result); double c = result->val; double cerr = result->err; result->val = c*Yval - s*Jval; result->err = fabs(c*Yerr) + fabs(s*Jerr) + fabs(cerr*Yval) + fabs(serr*Jval); return GSL_ERROR_SELECT_4(Jstatus, Ystatus, sinstatus, cosstatus); } else return gsl_sf_bessel_Ynupos_e(nu, x, result); } /*-*-*-*-*-*-*-*-*-* 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-2.7.1/specfunc/bessel_amp_phase.c0000644016036000116100000001105313441251001014461 00000000000000/* 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-2.7.1/specfunc/bessel_i.c0000644016036000116100000002147713441251001012767 00000000000000/* 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-2.7.1/specfunc/bessel_j.c0000644016036000116100000002563013441251001012763 00000000000000/* 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 { /* bug #45730: switch from gsl_sf_{cos,sin} to cos/sin to fix large inputs */ #if 0 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); #else const double cos_x = cos(x); const double sin_x = sin(x); const double f = (3.0/(x*x) - 1.0); result->val = (f * sin_x - 3.0*cos_x/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);*/ return GSL_SUCCESS; #endif } } 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-2.7.1/specfunc/bessel_k.c0000644016036000116100000001445313441251001012765 00000000000000/* 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-2.7.1/specfunc/bessel_olver.c0000644016036000116100000007575013441251001013671 00000000000000/* 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) { 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) { 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) { 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) { 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); double A4 = olver_A4(z); *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); double B3 = olver_B3(z); 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-2.7.1/specfunc/bessel_temme.c0000644016036000116100000001425113441251001013636 00000000000000/* 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-2.7.1/specfunc/bessel_y.c0000644016036000116100000001720513441251001013001 00000000000000/* 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-2.7.1/specfunc/bessel_zero.c0000644016036000116100000007020613441251001013510 00000000000000/* 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-2.7.1/specfunc/bessel_sequence.c0000644016036000116100000001026313441251001014336 00000000000000/* 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 "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-2.7.1/specfunc/beta_inc.c0000644016036000116100000001363013441251001012736 00000000000000/* 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-2.7.1/specfunc/clausen.c0000644016036000116100000000526213441251001012626 00000000000000/* 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-2.7.1/specfunc/coulomb.c0000644016036000116100000011503313524156231012645 00000000000000/* 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 = 0.0, Gp_lam_G = 0.0; 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-2.7.1/specfunc/coupling.c0000644016036000116100000003411113441251001013007 00000000000000/* 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; } } #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) { return gsl_sf_coupling_6j_e(two_ja, two_jb, two_je, two_jd, two_jc, two_jf, result); } #endif 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)); } #ifndef GSL_DISABLE_DEPRECATED 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)); } #endif 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-2.7.1/specfunc/coulomb_bound.c0000644016036000116100000000725313441251001014025 00000000000000/* 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-2.7.1/specfunc/dawson.c0000644016036000116100000002343413441251001012470 00000000000000/* 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-2.7.1/specfunc/debye.c0000644016036000116100000003340013441251001012257 00000000000000/* 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-2.7.1/specfunc/dilog.c0000644016036000116100000004320413441251001012270 00000000000000/* 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-2.7.1/specfunc/elementary.c0000644016036000116100000000463513441251001013344 00000000000000/* 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-2.7.1/specfunc/ellint.c0000644016036000116100000004666413441251001012476 00000000000000/* 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-2.7.1/specfunc/elljac.c0000644016036000116100000000656013441251001012430 00000000000000/* 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-2.7.1/specfunc/erfc.c0000644016036000116100000002770413441251001012120 00000000000000/* 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-2.7.1/specfunc/exp.c0000644016036000116100000003723613441251001011776 00000000000000/* 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-2.7.1/specfunc/expint.c0000644016036000116100000003661313441251001012507 00000000000000/* 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-2.7.1/specfunc/expint3.c0000644016036000116100000000661513441251001012571 00000000000000/* 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-2.7.1/specfunc/fermi_dirac.c0000644016036000116100000010316013441251001013434 00000000000000/* 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-2.7.1/specfunc/gegenbauer.c0000644016036000116100000001160013441251001013271 00000000000000/* 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-2.7.1/specfunc/gamma.c0000644016036000116100000016652513441251001012270 00000000000000/* 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-2.7.1/specfunc/gamma_inc.c0000644016036000116100000005043613441251001013112 00000000000000/* 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-2.7.1/specfunc/hermite.c0000644016036000116100000014051313522604465012650 00000000000000/* specfunc/hermite.c * * Copyright (C) 2011, 2012, 2013, 2014, 2019 Konrad Griessinger (konradg(at)gmx.net) * Copyright (C) 2019 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. */ /*----------------------------------------------------------------------* * "The purpose of computing is insight, not numbers." - R.W. Hamming * * Hermite polynomials, Hermite functions * * and their respective arbitrary derivatives * *----------------------------------------------------------------------*/ /* TODO: * - array functions for derivatives of Hermite functions * - asymptotic approximation for derivatives of Hermite functions * - refine existing asymptotic approximations, especially around x=sqrt(2*n+1) or x=sqrt(2*n+1)*sqrt(2), respectively */ #include #include #include #include #include #include #include #include "error.h" #include "eval.h" #define pow2(n) (gsl_sf_pow_int(2,n)) #define RND(x) ((double) ((x >= 0) ? (int) (x + 0.5) : (int) (x - 0.5))) /* evaluates the probabilists' Hermite polynomial of order n at position x */ int gsl_sf_hermite_prob_e(const int n, const double x, gsl_sf_result * result) { if (n < 0) { DOMAIN_ERROR(result); } else if (n == 0) { result->val = 1.; result->err = 0.; return GSL_SUCCESS; } else if (n == 1) { result->val = x; result->err = 0.; return GSL_SUCCESS; } else if (x == 0.0) { if (GSL_IS_ODD(n)) { result->val = 0.0; result->err = 0.0; return GSL_SUCCESS; } else { /* for n even, He_n(0) = (-1)^{n/2} (n - 1)!! */ int status = GSL_SUCCESS; if (n - 1 > GSL_SF_DOUBLEFACT_NMAX) /* test if (n - 1)!! will overflow */ { status = GSL_EOVRFLW; result->val = GSL_IS_ODD(n / 2) ? GSL_NEGINF : GSL_POSINF; result->err = GSL_POSINF; } else { gsl_sf_doublefact_e(n - 1, result); if (GSL_IS_ODD(n / 2)) result->val = -result->val; } return status; } } else { /* upward recurrence: He_{n+1} = x He_n - n He_{n-1} */ int status = GSL_SUCCESS; const double abs_x = fabs(x); const double thresh1 = abs_x > 1.0 ? 0.9 * GSL_DBL_MAX / abs_x : GSL_DBL_MAX; const double thresh2 = 0.9 * GSL_DBL_MAX; double p_n0 = 1.0; /* He_0(x) */ double p_n1 = x; /* He_1(x) */ double p_n = p_n1; double e_n0 = GSL_DBL_EPSILON; double e_n1 = fabs(x)*GSL_DBL_EPSILON; double e_n = e_n1; int j; for (j = 1; j < n; j++) { if (fabs(p_n1) > thresh1 || /* test if x*p_n1 will overflow */ fabs(p_n0) > thresh2 / j) /* test if j*p_n0 will overflow */ { status = GSL_EOVRFLW; break; } p_n = x*p_n1 - j*p_n0; p_n0 = p_n1; p_n1 = p_n; e_n = fabs(x)*e_n1+j*e_n0; e_n0 = e_n1; e_n1 = e_n; } result->val = p_n; result->err = e_n + fabs(result->val)*GSL_DBL_EPSILON; return status; } } double gsl_sf_hermite_prob(const int n, const double x) { EVAL_RESULT(gsl_sf_hermite_prob_e(n, x, &result)); } /* Evaluates the m-th derivative of the probabilists' Hermite polynomial of order n at position x. * The direct formula He^{(m)}_n = n!/(n-m)!*He_{n-m}(x) (where He_j(x) is the j-th probabilists' Hermite polynomial and He^{(m)}_j(x) its m-th derivative) is employed. */ int gsl_sf_hermite_prob_deriv_e(const int m, const int n, const double x, gsl_sf_result * result) { if (n < 0 || m < 0) { DOMAIN_ERROR(result); } else if (n < m) { result->val = 0.; result->err = 0.; return GSL_SUCCESS; } else { int status; double f = gsl_sf_choose(n,m)*gsl_sf_fact(m); gsl_sf_result He; status = gsl_sf_hermite_prob_e(n - m, x, &He); if (status == GSL_SUCCESS) { result->val = He.val*f; result->err = He.err*f + GSL_DBL_EPSILON*fabs(result->val); } else { result->val = He.val; result->err = GSL_POSINF; } return status; } } double gsl_sf_hermite_prob_deriv(const int m, const int n, const double x) { EVAL_RESULT(gsl_sf_hermite_prob_deriv_e(m, n, x, &result)); } /* evaluates the physicists' Hermite polynomial of order n at position x */ int gsl_sf_hermite_e(const int n, const double x, gsl_sf_result * result) { if (n < 0) { DOMAIN_ERROR(result); } else if (n == 0) { result->val = 1.; result->err = 0.; return GSL_SUCCESS; } else if (n == 1) { result->val = 2.0*x; result->err = 0.; return GSL_SUCCESS; } else if (x == 0.0) { if (GSL_IS_ODD(n)) { result->val = 0.0; result->err = 0.0; return GSL_SUCCESS; } else { /* for n even, H_n(0) = (-2)^{n/2} (n - 1)!! */ int status = GSL_SUCCESS; int m = n >> 1; if (n - 1 > GSL_SF_DOUBLEFACT_NMAX) /* test if (n - 1)!! will overflow */ { status = GSL_EOVRFLW; result->val = GSL_IS_ODD(m) ? GSL_NEGINF : GSL_POSINF; result->err = GSL_POSINF; } else { double f = gsl_pow_int(2.0, m); gsl_sf_doublefact_e(n - 1, result); if (result->val > 0.9 * GSL_DBL_MAX / f) /* test if 2^{n/2} * (n-1)!! will overflow */ { status = GSL_EOVRFLW; result->val = GSL_IS_ODD(m) ? GSL_NEGINF : GSL_POSINF; result->err = GSL_POSINF; } else { result->val *= f; result->err *= f; if (GSL_IS_ODD(m)) result->val = -result->val; } } return status; } } else { /* upward recurrence: H_{n+1} = 2x H_n - 2n H_{n-1} */ int status = GSL_SUCCESS; const double two_x = 2.0 * x; const double abs_two_x = fabs(two_x); const double thresh1 = abs_two_x > 1.0 ? 0.9 * GSL_DBL_MAX / abs_two_x : GSL_DBL_MAX; const double thresh2 = 0.9 * GSL_DBL_MAX / 2.0; double p_n0 = 1.0; /* H_0(x) */ double p_n1 = two_x; /* H_1(x) */ double p_n = p_n1; double e_n0 = GSL_DBL_EPSILON; double e_n1 = 2.*fabs(x)*GSL_DBL_EPSILON; double e_n = e_n1; int j; for (j = 1; j <= n - 1; j++) { if (fabs(p_n1) > thresh1 || /* test if 2*x*p_n1 will overflow */ fabs(p_n0) > thresh2 / j) /* test if 2*j*p_n0 will overflow */ { status = GSL_EOVRFLW; break; } p_n = two_x*p_n1 - 2.0*j*p_n0; p_n0 = p_n1; p_n1 = p_n; e_n = 2.*(fabs(x)*e_n1+j*e_n0); e_n0 = e_n1; e_n1 = e_n; } result->val = p_n; result->err = e_n + fabs(result->val)*GSL_DBL_EPSILON; return status; } } double gsl_sf_hermite(const int n, const double x) { EVAL_RESULT(gsl_sf_hermite_e(n, x, &result)); } /* Evaluates the m-th derivative of the physicists' Hermite polynomial of order n at position x. * The direct formula H^{(m)}_n = 2**m*n!/(n-m)!*H_{n-m}(x) (where H_j(x) is the j-th physicists' Hermite polynomial and H^{(m)}_j(x) its m-th derivative) is employed. */ int gsl_sf_hermite_deriv_e(const int m, const int n, const double x, gsl_sf_result * result) { if (n < 0 || m < 0) { DOMAIN_ERROR(result); } else if (n < m) { result->val = 0.; result->err = 0.; return GSL_SUCCESS; } else { int status; double f = gsl_sf_choose(n,m)*gsl_sf_fact(m)*pow2(m); gsl_sf_result H; status = gsl_sf_hermite_e(n - m, x, &H); if (status == GSL_SUCCESS) { result->val = H.val*f; result->err = H.err*f + GSL_DBL_EPSILON*fabs(result->val); } else { result->val = H.val; result->err = GSL_POSINF; } return status; } } double gsl_sf_hermite_deriv(const int m, const int n, const double x) { EVAL_RESULT(gsl_sf_hermite_deriv_e(m, n, x, &result)); } /* evaluates the Hermite function of order n at position x */ int gsl_sf_hermite_func_e(const int n, const double x, gsl_sf_result * result) { if (n < 0) { DOMAIN_ERROR(result); } else if (x == 0.0) { if (GSL_IS_ODD(n)) { result->val = 0.; result->err = 0.; return GSL_SUCCESS; } else { double f = (GSL_IS_ODD(n / 2) ? -1.0 : 1.0); int j; for(j = 1; j < n; j += 2) f *= sqrt(j / (j + 1.0)); result->val = f / sqrt(M_SQRTPI); result->err = GSL_DBL_EPSILON * fabs(result->val); return GSL_SUCCESS; } } else if (n == 0) { result->val = exp(-0.5 * x * x) / sqrt(M_SQRTPI); result->err = GSL_DBL_EPSILON * fabs(result->val); return GSL_SUCCESS; } else if (n == 1) { result->val = M_SQRT2 * x * exp(-0.5 * x * x) / sqrt(M_SQRTPI); result->err = GSL_DBL_EPSILON * fabs(result->val); return GSL_SUCCESS; } else { /* * This algorithm is based on the modified recurrence algorithm * found in the appendix of: * * B. Bunck, BIT Numerical Mathematics, 49, 281 (2009) * * Numerical tests showed that this algorithm is more stable for * large x (x > 40) than the standard recurrence relation. * Accuracy is comparable to the recurrence relation method * for small x and all n. * * See: * * https://scicomp.stackexchange.com/questions/30896/generate-high-n-quantum-harmonic-oscillator-states-numerically * * for further discussion. */ double hi2 = 1.0 / sqrt(M_SQRTPI); /* \hat{h}_0 */ double hi1 = M_SQRT2 * x * hi2; /* \hat{h}_1 */ double hi = 0.0; double sum_log_scale = 0.0; double abshi; int i; for (i = 2; i <= n; ++i) { hi = sqrt(2.0 / i) * x * hi1 - sqrt((i - 1.0) / i) * hi2; hi2 = hi1; hi1 = hi; abshi = fabs(hi); if (abshi > 1.0) { double log_scale = RND(log(abshi)); double scale = exp(-log_scale); hi *= scale; hi1 *= scale; hi2 *= scale; sum_log_scale += log_scale; } } result->val = hi * exp(-0.5 * x * x + sum_log_scale); result->err = n * GSL_DBL_EPSILON * fabs(result->val); return GSL_SUCCESS; } } double gsl_sf_hermite_func(const int n, const double x) { EVAL_RESULT(gsl_sf_hermite_func_e(n, x, &result)); } /* * This algorithm is based on the contour integral algorithm of: * * B. Bunck, BIT Numerical Mathematics, 49, 281 (2009) * * It has O(sqrt(n)) complexity */ int gsl_sf_hermite_func_fast_e(const int n, const double x, gsl_sf_result * result) { if (n < 1000 || x == 0.0) { /* for small n, the recurrence method is faster and more accurate */ return gsl_sf_hermite_func_e(n, x, result); } else { size_t j; const double k = sqrt(0.5*n); const size_t steps = (size_t) ceil(6.211 * sqrt(n)); const double dt = M_PI/steps; const double invn2 = 1.0/(n*n); double ex, ex_e, cs, cs_e, sn, sn2, t; gsl_sf_result lngamma; if (n < 36) { gsl_sf_lnfact_e(n, &lngamma); lngamma.val *= 0.5; lngamma.err *= 0.5; t = 0.5*n*log(n) + 0.25*M_LNPI; cs = 0.5*n; lngamma.val += cs - t; lngamma.err += (cs + t)*GSL_DBL_EPSILON; } else { /* approximate ln(gamma_{n,k}) using Stirling's formula */ lngamma.val = 0.25*log(2*n); lngamma.err = (lngamma.val + ((((invn2/3360 + 1.0/2520)*invn2 + 1.0/720)*invn2) + 1.0/24)/n)*GSL_DBL_EPSILON; lngamma.val -= ((((invn2/3360 - 1.0/2520)*invn2 + 1.0/720)*invn2) - 1.0/24)/n; } ex = exp(lngamma.val - n - 0.5*x*x - 2*x*k); cs = (GSL_IS_ODD(n) ? -1 : 1); result->val = 0.5*ex*cs; result->err = 0.5*ex*(lngamma.err + (n + 0.5*x*x + fabs(2*x*k) + 1)*GSL_DBL_EPSILON); ex = exp(lngamma.val - n - 0.5*x*x + 2*x*k); result->val += 0.5*ex; result->err += 0.5*ex*(lngamma.err + (n + 0.5*x*x + fabs(2*x*k) + 1)*GSL_DBL_EPSILON); for (j = 1; j < steps; j++) { t = j*dt; cs = cos(t); ex = exp(lngamma.val - 0.5*x*x + (2*x*k - n*cs)*cs); ex_e = ex*(lngamma.err + GSL_DBL_EPSILON*(1 + 0.5*x*x + (fabs(2*x*k) + fabs(n*cs))*fabs(cs))); sn = sin(t); sn2 = sin(2*t); cs = cos(2*x*k*sn - 0.5*n*sn2 - n*t); cs_e = GSL_MIN(1.0+fabs(cs), GSL_DBL_EPSILON*(fabs(cs) + (fabs(2*x*k*sn) + fabs(0.5*n*sn2) + n*t)*fabs(sin(2*x*k*sn - 0.5*n*sn2 - n*t)))); result->val += ex*cs; result->err += ex*cs_e + ex_e*fabs(cs) + GSL_DBL_EPSILON*fabs(ex*cs); } result->val *= M_1_PI*dt; result->err = M_1_PI*dt*result->err + GSL_DBL_EPSILON*fabs(result->val); return GSL_SUCCESS; } } double gsl_sf_hermite_func_fast(const int n, const double x) { EVAL_RESULT(gsl_sf_hermite_func_fast_e(n, x, &result)); } /* Evaluates all probabilists' Hermite polynomials up to order nmax at position x. The results are stored in result_array. * Since all polynomial orders are needed, upward recurrence is employed. */ int gsl_sf_hermite_prob_array(const int nmax, const double x, double * result_array) { if (nmax < 0) { GSL_ERROR ("domain error", GSL_EDOM); } else if (nmax == 0) { result_array[0] = 1.0; return GSL_SUCCESS; } else if (nmax == 1) { result_array[0] = 1.0; result_array[1] = x; return GSL_SUCCESS; } else { /* upward recurrence: He_{n+1} = x He_n - n He_{n-1} */ int status = GSL_SUCCESS; const double abs_x = fabs(x); const double thresh1 = abs_x > 1.0 ? 0.9 * GSL_DBL_MAX / abs_x : GSL_DBL_MAX; const double thresh2 = 0.9 * GSL_DBL_MAX; double p_n0 = 1.0; /* He_0(x) */ double p_n1 = x; /* He_1(x) */ double p_n = p_n1; int j; result_array[0] = 1.0; result_array[1] = x; for (j = 1; j < nmax; j++) { if (fabs(p_n1) > thresh1 || /* test if x*p_n1 will overflow */ fabs(p_n0) > thresh2 / j) /* test if j*p_n0 will overflow */ { status = GSL_EOVRFLW; break; } p_n = x*p_n1 - j*p_n0; p_n0 = p_n1; p_n1 = p_n; result_array[j + 1] = p_n; } return status; } } /* Evaluates the m-th derivative of all probabilists' Hermite polynomials up to order nmax at position x. The results are stored in result_array. * Since all polynomial orders are needed, upward recurrence is employed. */ int gsl_sf_hermite_prob_array_deriv(const int m, const int nmax, const double x, double * result_array) { if (nmax < 0 || m < 0) { GSL_ERROR ("domain error", GSL_EDOM); } else if (m == 0) { gsl_sf_hermite_prob_array(nmax, x, result_array); return GSL_SUCCESS; } else if (nmax < m) { int j; for (j = 0; j <= nmax; j++) result_array[j] = 0.0; return GSL_SUCCESS; } else if (nmax == m) { int j; for (j = 0; j < m; j++) result_array[j] = 0.0; result_array[nmax] = gsl_sf_fact(m); return GSL_SUCCESS; } else if (nmax == m + 1) { int j; for (j = 0; j < m; j++) result_array[j] = 0.0; result_array[nmax-1] = gsl_sf_fact(m); result_array[nmax] = result_array[nmax-1]*(m+1)*x; return GSL_SUCCESS; } else { /* upward recurrence: He^{(m)}_{n+1} = (n+1)/(n-m+1)*(x He^{(m)}_n - n He^{(m)}_{n-1}) */ double p_n0 = gsl_sf_fact(m); /* He^{(m)}_{m}(x) */ double p_n1 = p_n0*(m+1)*x; /* He^{(m)}_{m+1}(x) */ double p_n = p_n1; int j; for (j = 0; j < m; j++) result_array[j] = 0.0; result_array[m] = p_n0; result_array[m + 1] = p_n1; for (j = m + 1; j <= nmax - 1; j++) { p_n = (x*p_n1 - j*p_n0) * (j + 1.0) / (j - m + 1.0); p_n0 = p_n1; p_n1 = p_n; result_array[j + 1] = p_n; } return GSL_SUCCESS; } } /* Evaluates all derivatives (starting from 0) up to the mmax-th derivative of the probabilists' Hermite polynomial of order n at position x. The results are stored in result_array. * Since all polynomial orders are needed, upward recurrence is employed. */ int gsl_sf_hermite_prob_deriv_array(const int mmax, const int n, const double x, double * result_array) { if (n < 0 || mmax < 0) { GSL_ERROR ("domain error", GSL_EDOM); } else if (n == 0) { int j; result_array[0] = 1.0; for (j = 1; j <= mmax; j++) result_array[j] = 0.0; return GSL_SUCCESS; } else if (n == 1 && mmax > 0) { int j; result_array[0] = x; result_array[1] = 1.0; for(j=2; j <= mmax; j++) result_array[j] = 0.0; return GSL_SUCCESS; } else if (mmax == 0) { result_array[0] = gsl_sf_hermite_prob(n,x); return GSL_SUCCESS; } else if (mmax == 1) { result_array[0] = gsl_sf_hermite_prob(n,x); result_array[1] = n*gsl_sf_hermite_prob(n-1,x); return GSL_SUCCESS; } else { /* upward recurrence */ int k = GSL_MAX_INT(0, n - mmax); double p_n0 = gsl_sf_hermite_prob(k,x); /* He_k(x) */ double p_n1 = gsl_sf_hermite_prob(k+1,x); /* He_{k+1}(x) */ double p_n = p_n1; int j; for(j=n+1; j <= mmax; j++) result_array[j] = 0.0; result_array[GSL_MIN_INT(n,mmax)] = p_n0; result_array[GSL_MIN_INT(n,mmax)-1] = p_n1; for (j = GSL_MIN_INT(mmax,n)-1; j > 0; j--) { k++; p_n = x*p_n1-k*p_n0; p_n0 = p_n1; p_n1 = p_n; result_array[j - 1] = p_n; } p_n = 1.0; for (j = 1; j <= GSL_MIN_INT(n, mmax); j++) { p_n = p_n*(n-j+1); result_array[j] = p_n*result_array[j]; } return GSL_SUCCESS; } } /* Evaluates the series sum_{j=0}^n a_j*He_j(x) with He_j being the j-th probabilists' Hermite polynomial. * For improved numerical stability the Clenshaw algorithm (Clenshaw, C. W. (July 1955). "A note on the summation of Chebyshev series". Mathematical Tables and other Aids to Computation 9 (51): 118–110.) adapted to probabilists' Hermite polynomials is used. */ int gsl_sf_hermite_prob_series_e(const int n, const double x, const double * a, gsl_sf_result * result) { if(n < 0) { DOMAIN_ERROR(result); } else if(n == 0) { result->val = a[0]; result->err = 0.; return GSL_SUCCESS; } else if(n == 1) { result->val = a[0]+a[1]*x; result->err = 2.*GSL_DBL_EPSILON * (fabs(a[0]) + fabs(a[1]*x)) ; return GSL_SUCCESS; } else { /* downward recurrence: b_n = a_n + x b_{n+1} - (n+1) b_{n+2} */ double b0 = 0.; double b1 = 0.; double btmp = 0.; double e0 = 0.; double e1 = 0.; double etmp = e1; int j; for(j=n; j >= 0; j--){ btmp = b0; b0 = a[j]+x*b0-(j+1)*b1; b1 = btmp; etmp = e0; e0 = (GSL_DBL_EPSILON*fabs(a[j])+fabs(x)*e0+(j+1)*e1); e1 = etmp; } result->val = b0; result->err = e0 + fabs(b0)*GSL_DBL_EPSILON; return GSL_SUCCESS; } } double gsl_sf_hermite_prob_series(const int n, const double x, const double * a) { EVAL_RESULT(gsl_sf_hermite_prob_series_e(n, x, a, &result)); } /* Evaluates all physicists' Hermite polynomials up to order nmax at position x. The results are stored in result_array. * Since all polynomial orders are needed, upward recurrence is employed. */ int gsl_sf_hermite_array(const int nmax, const double x, double * result_array) { if(nmax < 0) { GSL_ERROR ("domain error", GSL_EDOM); } else if (nmax == 0) { result_array[0] = 1.0; return GSL_SUCCESS; } else if (nmax == 1) { result_array[0] = 1.0; result_array[1] = 2.0*x; return GSL_SUCCESS; } else { /* upward recurrence: H_{n+1} = 2x H_n - 2n H_{n-1} */ int status = GSL_SUCCESS; const double two_x = 2.0 * x; const double abs_two_x = fabs(two_x); const double thresh1 = abs_two_x > 1.0 ? 0.9 * GSL_DBL_MAX / abs_two_x : GSL_DBL_MAX; const double thresh2 = 0.9 * GSL_DBL_MAX / 2.0; double p_n0 = 1.0; /* H_0(x) */ double p_n1 = two_x; /* H_1(x) */ double p_n = p_n1; int j; result_array[0] = 1.0; result_array[1] = 2.0*x; for (j = 1; j < nmax; j++) { if (fabs(p_n1) > thresh1 || /* test if 2*x*p_n1 will overflow */ fabs(p_n0) > thresh2 / j) /* test if 2*j*p_n0 will overflow */ { status = GSL_EOVRFLW; } p_n = two_x*p_n1 - 2.0*j*p_n0; p_n0 = p_n1; p_n1 = p_n; result_array[j + 1] = p_n; } return status; } } /* Evaluates the m-th derivative of all physicists' Hermite polynomials up to order nmax at position x. The results are stored in result_array. * Since all polynomial orders are needed, upward recurrence is employed. */ int gsl_sf_hermite_array_deriv(const int m, const int nmax, const double x, double * result_array) { if (nmax < 0 || m < 0) { GSL_ERROR ("domain error", GSL_EDOM); } else if (m == 0) { gsl_sf_hermite_array(nmax, x, result_array); return GSL_SUCCESS; } else if (nmax < m) { int j; for(j = 0; j <= nmax; j++) result_array[j] = 0.0; return GSL_SUCCESS; } else if (nmax == m) { int j; for(j = 0; j < m; j++) result_array[j] = 0.0; result_array[nmax] = pow2(m)*gsl_sf_fact(m); return GSL_SUCCESS; } else if (nmax == m + 1) { int j; for(j = 0; j < m; j++) result_array[j] = 0.0; result_array[nmax-1] = pow2(m)*gsl_sf_fact(m); result_array[nmax] = result_array[nmax-1]*2*(m+1)*x; return GSL_SUCCESS; } else { /* upward recurrence: H^{(m)}_{n+1} = 2(n+1)/(n-m+1)*(x H^{(m)}_n - n H^{(m)}_{n-1}) */ double p_n0 = pow2(m)*gsl_sf_fact(m); /* H^{(m)}_{m}(x) */ double p_n1 = p_n0*2*(m+1)*x; /* H^{(m)}_{m+1}(x) */ double p_n; int j; for(j = 0; j < m; j++) result_array[j] = 0.0; result_array[m] = p_n0; result_array[m+1] = p_n1; for (j = m + 1; j < nmax; ++j) { p_n = (x*p_n1 - j*p_n0) * 2 * (j + 1.0) / (j - m + 1.0); p_n0 = p_n1; p_n1 = p_n; result_array[j + 1] = p_n; } return GSL_SUCCESS; } } /* Evaluates all derivatives (starting from 0) up to the mmax-th derivative of the physicists' Hermite polynomial of order n at position x. The results are stored in result_array. * Since all polynomial orders are needed, upward recurrence is employed. */ int gsl_sf_hermite_deriv_array(const int mmax, const int n, const double x, double * result_array) { if (n < 0 || mmax < 0) { GSL_ERROR ("domain error", GSL_EDOM); } else if (n == 0) { int j; result_array[0] = 1.0; for(j = 1; j <= mmax; j++) result_array[j] = 0.0; return GSL_SUCCESS; } else if (n == 1 && mmax > 0) { int j; result_array[0] = 2*x; result_array[1] = 1.0; for (j = 2; j <= mmax; j++) result_array[j] = 0.0; return GSL_SUCCESS; } else if (mmax == 0) { result_array[0] = gsl_sf_hermite(n,x); return GSL_SUCCESS; } else if (mmax == 1) { result_array[0] = gsl_sf_hermite(n,x); result_array[1] = 2*n*gsl_sf_hermite(n - 1, x); return GSL_SUCCESS; } else { /* upward recurrence */ int k = GSL_MAX_INT(0, n - mmax); double p_n0 = gsl_sf_hermite(k, x); /* H_k(x) */ double p_n1 = gsl_sf_hermite(k + 1, x); /* H_{k+1}(x) */ double p_n = p_n1; int j; for (j = n + 1; j <= mmax; j++) result_array[j] = 0.0; result_array[GSL_MIN_INT(n,mmax)] = p_n0; result_array[GSL_MIN_INT(n,mmax)-1] = p_n1; for (j = GSL_MIN_INT(mmax, n) - 1; j > 0; j--) { k++; p_n = 2*x*p_n1 - 2*k*p_n0; p_n0 = p_n1; p_n1 = p_n; result_array[j - 1] = p_n; } p_n = 1.0; for (j = 1; j <= GSL_MIN_INT(n,mmax); j++) { p_n *= 2.0 * (n - j + 1.0); result_array[j] *= p_n; } return GSL_SUCCESS; } } /* Evaluates the series sum_{j=0}^n a_j*H_j(x) with H_j being the j-th physicists' Hermite polynomial. * For improved numerical stability the Clenshaw algorithm (Clenshaw, C. W. (July 1955). "A note on the summation of Chebyshev series". Mathematical Tables and other Aids to Computation 9 (51): 118–110.) adapted to physicists' Hermite polynomials is used. */ int gsl_sf_hermite_series_e(const int n, const double x, const double * a, gsl_sf_result * result) { if(n < 0) { DOMAIN_ERROR(result); } else if(n == 0) { result->val = a[0]; result->err = 0.; return GSL_SUCCESS; } else if(n == 1) { result->val = a[0]+a[1]*2.*x; result->err = 2.*GSL_DBL_EPSILON * (fabs(a[0]) + fabs(a[1]*2.*x)) ; return GSL_SUCCESS; } else { /* downward recurrence: b_n = a_n + 2x b_{n+1} - 2(n+1) b_{n+2} */ double b0 = 0.; double b1 = 0.; double btmp = 0.; double e0 = 0.; double e1 = 0.; double etmp = e1; int j; for(j=n; j >= 0; j--){ btmp = b0; b0 = a[j]+2.*x*b0-2.*(j+1)*b1; b1 = btmp; etmp = e0; e0 = (GSL_DBL_EPSILON*fabs(a[j])+fabs(2.*x)*e0+2.*(j+1)*e1); e1 = etmp; } result->val = b0; result->err = e0 + fabs(b0)*GSL_DBL_EPSILON; return GSL_SUCCESS; } } double gsl_sf_hermite_series(const int n, const double x, const double * a) { EVAL_RESULT(gsl_sf_hermite_series_e(n, x, a, &result)); } /* Evaluates all Hermite functions up to order nmax at position x. The results are stored in result_array. * Since all polynomial orders are needed, upward recurrence is employed. */ int gsl_sf_hermite_func_array(const int nmax, const double x, double * result_array) { if (nmax < 0) { GSL_ERROR ("domain error", GSL_EDOM); } else if (nmax == 0) { result_array[0] = exp(-0.5*x*x)/sqrt(M_SQRTPI); return GSL_SUCCESS; } else if (nmax == 1) { result_array[0] = exp(-0.5*x*x)/sqrt(M_SQRTPI); result_array[1] = result_array[0]*M_SQRT2*x; return GSL_SUCCESS; } else { /* upward recurrence: Psi_{n+1} = sqrt(2/(n+1))*x Psi_n - sqrt(n/(n+1)) Psi_{n-1} */ const double arg = -0.5 * x * x; double hi2 = 1.0 / sqrt(M_SQRTPI); double hi1 = M_SQRT2 * x * hi2; double hi = 0.0; double sum_log_scale = 0.0; double abshi; int i; result_array[0] = exp(arg) * hi2; result_array[1] = result_array[0] * M_SQRT2 * x; for (i = 2; i <= nmax; ++i) { hi = sqrt(2.0 / i) * x * hi1 - sqrt((i - 1.0) / i) * hi2; hi2 = hi1; hi1 = hi; abshi = fabs(hi); if (abshi > 1.0) { double log_scale = RND(log(abshi)); double scale = exp(-log_scale); hi *= scale; hi1 *= scale; hi2 *= scale; sum_log_scale += log_scale; } result_array[i] = hi * exp(arg + sum_log_scale); } return GSL_SUCCESS; } } /* Evaluates the series sum_{j=0}^n a_j*Psi_j(x) with Psi_j being the j-th Hermite function. * For improved numerical stability the Clenshaw algorithm (Clenshaw, C. W. (July 1955). "A note on the summation of Chebyshev series". Mathematical Tables and other Aids to Computation 9 (51): 118–110.) adapted to Hermite functions is used. */ int gsl_sf_hermite_func_series_e(const int n, const double x, const double * a, gsl_sf_result * result) { if (n < 0) { DOMAIN_ERROR(result); } else if (n == 0) { result->val = a[0]*exp(-0.5*x*x)/sqrt(M_SQRTPI); result->err = GSL_DBL_EPSILON*fabs(result->val); return GSL_SUCCESS; } else if (n == 1) { result->val = (a[0]+a[1]*M_SQRT2*x)*exp(-0.5*x*x)/sqrt(M_SQRTPI); result->err = 2.*GSL_DBL_EPSILON*(fabs(a[0])+fabs(a[1]*M_SQRT2*x))*exp(-0.5*x*x)/sqrt(M_SQRTPI); return GSL_SUCCESS; } else { /* downward recurrence: b_n = a_n + sqrt(2/(n+1))*x b_{n+1} - sqrt((n+1)/(n+2)) b_{n+2} */ double b0 = 0.; double b1 = 0.; double btmp = 0.; double e0 = 0.; double e1 = 0.; double etmp = e1; int j; for (j = n; j >= 0; j--) { btmp = b0; b0 = a[j]+sqrt(2./(j+1))*x*b0-sqrt((j+1.)/(j+2.))*b1; b1 = btmp; etmp = e0; e0 = (GSL_DBL_EPSILON*fabs(a[j])+sqrt(2./(j+1))*fabs(x)*e0+sqrt((j+1.)/(j+2.))*e1); e1 = etmp; } result->val = b0*exp(-0.5*x*x)/sqrt(M_SQRTPI); result->err = e0 + fabs(result->val)*GSL_DBL_EPSILON; return GSL_SUCCESS; } } double gsl_sf_hermite_func_series(const int n, const double x, const double * a) { EVAL_RESULT(gsl_sf_hermite_func_series_e(n, x, a, &result)); } /* Evaluates the m-th derivative of the Hermite function of order n at position x. * A summation including upward recurrences is used. */ int gsl_sf_hermite_func_der_e(const int m, const int n, const double x, gsl_sf_result * result) { if(m < 0 || n < 0) { DOMAIN_ERROR(result); } else if (m == 0) { return gsl_sf_hermite_func_e(n, x, result); } else if (m == 1) { double hi2 = 1.0 / sqrt(M_SQRTPI); double hi1 = M_SQRT2 * x * hi2; double hi = 0.0; double sum_log_scale = 0.0; double abshi; int i; for (i = 2; i <= n; ++i) { hi = sqrt(2.0 / i) * x * hi1 - sqrt((i - 1.0) / i) * hi2; hi2 = hi1; hi1 = hi; abshi = fabs(hi); if (abshi > 1.0) { double log_scale = RND(log(abshi)); double scale = exp(-log_scale); hi *= scale; hi1 *= scale; hi2 *= scale; sum_log_scale += log_scale; } } /* psi'_n(x) = sqrt(2 n) psi_{n-1} - x psi_n */ result->val = (sqrt(2.0*n) * hi2 - x * hi) * exp(-0.5 * x * x + sum_log_scale); result->err = n * GSL_DBL_EPSILON * fabs(result->val); return GSL_SUCCESS; } else { int j; double r,er,b; double h0 = 1.; double h1 = x; double eh0 = GSL_DBL_EPSILON; double eh1 = GSL_DBL_EPSILON; double p0 = 1.; double p1 = M_SQRT2*x; double ep0 = GSL_DBL_EPSILON; double ep1 = M_SQRT2*GSL_DBL_EPSILON; double f = 1.; for (j=GSL_MAX_INT(1,n-m+1);j<=n;j++) f *= sqrt(2.*j); if (m > n) { f = (GSL_IS_ODD(m-n)?-f:f); for (j=0;jval = r*exp(-0.5*x*x)/sqrt(M_SQRTPI); result->err = er*fabs(exp(-0.5*x*x)/sqrt(M_SQRTPI)) + GSL_DBL_EPSILON*fabs(result->val); return GSL_SUCCESS; } } double gsl_sf_hermite_func_der(const int m, const int n, const double x) { EVAL_RESULT(gsl_sf_hermite_func_der_e(m, n, x, &result)); } static double H_zero_init(const int n, const int k) { double p = 1., x = 1., y = 1.; if (k == 1 && n > 50) { x = (GSL_IS_ODD(n)?1./sqrt((n-1)/6.):1./sqrt(0.5*n)); } else { p = -0.7937005259840997373758528196*gsl_sf_airy_zero_Ai(n/2-k+1); x = sqrt(2*n+1.); y = pow(2*n+1.,1/6.); x = x - p/y - 0.1*p*p/(x*y*y) + (9/280. - p*p*p*11/350.)/(x*x*x) + (p*277/12600. - gsl_sf_pow_int(p,4)*823/63000.)/gsl_sf_pow_int(x,4)/y; } p = acos(x/sqrt(2*n+1.)); y = M_PI*(-2*(n/2-k)-1.5)/(n+0.5); if(gsl_fcmp(y,sin(2.*p)-2*p,GSL_SQRT_DBL_EPSILON)==0) return x; /* initial approx sufficiently accurate */ if (y > -GSL_DBL_EPSILON) return sqrt(2*n+1.); if (p < GSL_DBL_EPSILON) p = GSL_DBL_EPSILON; if (p > M_PI_2) p = M_PI_2; if (sin(2.*p)-2*p > y){ x = GSL_MAX((sin(2.*p)-2*p-y)/4.,GSL_SQRT_DBL_EPSILON); do{ x *= 2.; p += x; } while (sin(2.*p)-2*p > y); } do { x = p; p -= (sin(2.*p)-2.*p-y)/(2.*cos(2.*p)-2.); if (p<0.||p>M_PI_2) p = M_PI_2; } while (gsl_fcmp(x,p,100*GSL_DBL_EPSILON)!=0); return sqrt(2*n+1.)*cos(p); } /* lookup table for the positive zeros of the probabilists' Hermite polynomials of order 3 through 20 */ static double He_zero_tab[99] = { 1.73205080756887729352744634151, 0.741963784302725857648513596726, 2.33441421833897723931751226721, 1.35562617997426586583052129087, 2.85697001387280565416230426401, 0.616706590192594152193686099399, 1.88917587775371067550566789858, 3.32425743355211895236183546247, 1.154405394739968127239597758838, 2.36675941073454128861885646856, 3.75043971772574225630392202571, 0.539079811351375108072461918694, 1.63651904243510799922544657297, 2.80248586128754169911301080618, 4.14454718612589433206019783917, 1.023255663789132524828148225810, 2.07684797867783010652215614374, 3.20542900285646994336567590292, 4.51274586339978266756667884317, 0.484935707515497653046233483105, 1.46598909439115818325066466416, 2.48432584163895458087625118368, 3.58182348355192692277623675546, 4.85946282833231215015516494660, 0.928868997381063940144111999584, 1.87603502015484584534137013967, 2.86512316064364499771968407254, 3.93616660712997692868589612142, 5.18800122437487094818666404539, 0.444403001944138945299732445510, 1.34037519715161672153112945211, 2.25946445100079912386492979448, 3.22370982877009747166319001956, 4.27182584793228172295999293076, 5.50090170446774760081221630899, 0.856679493519450033897376121795, 1.72541837958823916151095838741, 2.62068997343221478063807762201, 3.56344438028163409162493844661, 4.59139844893652062705231872720, 5.80016725238650030586450565322, 0.412590457954601838167454145167, 1.24268895548546417895063983219, 2.08834474570194417097139675101, 2.96303657983866750254927123447, 3.88692457505976938384755016476, 4.89693639734556468372449782879, 6.08740954690129132226890147034, 0.799129068324547999424888414207, 1.60671006902872973652322479373, 2.43243682700975804116311571682, 3.28908242439876638890856229770, 4.19620771126901565957404160583, 5.19009359130478119946445431715, 6.36394788882983831771116094427, 0.386760604500557347721047189801, 1.16382910055496477419336819907, 1.95198034571633346449212362880, 2.76024504763070161684598142269, 3.60087362417154828824902745506, 4.49295530252001124266582263095, 5.47222570594934308841242925805, 6.63087819839312848022981922233, 0.751842600703896170737870774614, 1.50988330779674075905491513417, 2.28101944025298889535537879396, 3.07379717532819355851658337833, 3.90006571719800990903311840097, 4.77853158962998382710540812497, 5.74446007865940618125547815768, 6.88912243989533223256205432938, 0.365245755507697595916901619097, 1.09839551809150122773848360538, 1.83977992150864548966395498992, 2.59583368891124032910545091458, 3.37473653577809099529779309480, 4.18802023162940370448450911428, 5.05407268544273984538327527397, 6.00774591135959752029303858752, 7.13946484914647887560975631213, 0.712085044042379940413609979021, 1.42887667607837287134157901452, 2.15550276131693514033871248449, 2.89805127651575312007902775275, 3.66441654745063847665304033851, 4.46587262683103133615452574019, 5.32053637733603803162823765939, 6.26289115651325170419416064557, 7.38257902403043186766326977122, 0.346964157081355927973322447164, 1.04294534880275103146136681143, 1.74524732081412671493067861704, 2.45866361117236775131735057433, 3.18901481655338941485371744116, 3.94396735065731626033176813604, 4.73458133404605534390170946748, 5.57873880589320115268040332802, 6.51059015701365448636289263918, 7.61904854167975829138128156060 }; /* * Computes the s-th zero the probabilists' Hermite polynomial of order n. * A Newton iteration using a continued fraction representation adapted from: * * [E.T. Whittaker (1914), On the continued fractions which represent the * functions of Hermite and other functions defined by differential equations, * Proceedings of the Edinburgh Mathematical Society, 32, 65-74] * * is performed with the initial approximation from * * [Arpad Elbert and Martin E. Muldoon, Approximations for zeros of Hermite * functions, pp. 117-126 in D. Dominici and R. S. Maier, eds, "Special Functions * and Orthogonal Polynomials", Contemporary Mathematics, vol 471 (2008)] * * refined via the bisection method. */ int gsl_sf_hermite_prob_zero_e(const int n, const int s, gsl_sf_result * result) { if (n <= 0 || s < 0 || s > n/2) { DOMAIN_ERROR(result); } else if (s == 0) { if (GSL_IS_ODD(n) == 1) { result->val = 0.; result->err = 0.; return GSL_SUCCESS; } else { DOMAIN_ERROR(result); } } else if (n == 2) { result->val = 1.; result->err = 0.; return GSL_SUCCESS; } else if (n < 21) { result->val = He_zero_tab[(GSL_IS_ODD(n)?n/2:0)+((n/2)*(n/2-1))+s-2]; result->err = GSL_DBL_EPSILON*(result->val); return GSL_SUCCESS; } else { double d = 1., x = 1., x0 = 1.; int j; x = H_zero_init(n,s) * M_SQRT2; do { x0 = x; d = 0.; for (j=1; jval = x; result->err = 2*GSL_DBL_EPSILON*x + fabs(x-x0); return GSL_SUCCESS; } } double gsl_sf_hermite_prob_zero(const int n, const int s) { EVAL_RESULT(gsl_sf_hermite_prob_zero_e(n, s, &result)); } /* lookup table for the positive zeros of the physicists' Hermite polynomials of order 3 through 20 */ static double H_zero_tab[99] = { 1.22474487139158904909864203735, 0.524647623275290317884060253835, 1.65068012388578455588334111112, 0.958572464613818507112770593893, 2.02018287045608563292872408814, 0.436077411927616508679215948251, 1.335849074013696949714895282970, 2.35060497367449222283392198706, 0.816287882858964663038710959027, 1.67355162876747144503180139830, 2.65196135683523349244708200652, 0.381186990207322116854718885584, 1.157193712446780194720765779063, 1.98165675669584292585463063977, 2.93063742025724401922350270524, 0.723551018752837573322639864579, 1.46855328921666793166701573925, 2.26658058453184311180209693284, 3.19099320178152760723004779538, 0.342901327223704608789165025557, 1.03661082978951365417749191676, 1.75668364929988177345140122011, 2.53273167423278979640896079775, 3.43615911883773760332672549432, 0.656809566882099765024611575383, 1.32655708449493285594973473558, 2.02594801582575533516591283121, 2.78329009978165177083671870152, 3.66847084655958251845837146485, 0.314240376254359111276611634095, 0.947788391240163743704578131060, 1.59768263515260479670966277090, 2.27950708050105990018772856942, 3.02063702512088977171067937518, 3.88972489786978191927164274724, 0.605763879171060113080537108602, 1.22005503659074842622205526637, 1.85310765160151214200350644316, 2.51973568567823788343040913628, 3.24660897837240998812205115236, 4.10133759617863964117891508007, 0.291745510672562078446113075799, 0.878713787329399416114679311861, 1.47668273114114087058350654421, 2.09518325850771681573497272630, 2.74847072498540256862499852415, 3.46265693360227055020891736115, 4.30444857047363181262129810037, 0.565069583255575748526020337198, 1.13611558521092066631913490556, 1.71999257518648893241583152515, 2.32573248617385774545404479449, 2.96716692790560324848896036355, 3.66995037340445253472922383312, 4.49999070730939155366438053053, 0.273481046138152452158280401965, 0.822951449144655892582454496734, 1.38025853919888079637208966969, 1.95178799091625397743465541496, 2.54620215784748136215932870545, 3.17699916197995602681399455926, 3.86944790486012269871942409801, 4.68873893930581836468849864875, 0.531633001342654731349086553718, 1.06764872574345055363045773799, 1.61292431422123133311288254454, 2.17350282666662081927537907149, 2.75776291570388873092640349574, 3.37893209114149408338327069289, 4.06194667587547430689245559698, 4.87134519367440308834927655662, 0.258267750519096759258116098711, 0.776682919267411661316659462284, 1.30092085838961736566626555439, 1.83553160426162889225383944409, 2.38629908916668600026459301424, 2.96137750553160684477863254906, 3.57376906848626607950067599377, 4.24811787356812646302342016090, 5.04836400887446676837203757885, 0.503520163423888209373811765050, 1.01036838713431135136859873726, 1.52417061939353303183354859367, 2.04923170985061937575050838669, 2.59113378979454256492128084112, 3.15784881834760228184318034120, 3.76218735196402009751489394104, 4.42853280660377943723498532226, 5.22027169053748216460967142500, 0.245340708300901249903836530634, 0.737473728545394358705605144252, 1.23407621539532300788581834696, 1.73853771211658620678086566214, 2.25497400208927552308233334473, 2.78880605842813048052503375640, 3.34785456738321632691492452300, 3.94476404011562521037562880052, 4.60368244955074427307767524898, 5.38748089001123286201690041068 }; /* * Computes the s-th zero the physicists' Hermite polynomial of order n, thus also * the s-th zero of the Hermite function of order n. A Newton iteration using a continued * fraction representation adapted from: * * [E.T. Whittaker (1914), On the continued fractions which represent the functions of Hermite * and other functions defined by differential equations, Proceedings of the Edinburgh Mathematical * Society, 32, 65-74] * * An initial approximation is used from: * * [Arpad Elbert and Martin E. Muldoon, Approximations for zeros of Hermite functions, * pp. 117-126 in D. Dominici and R. S. Maier, eds, "Special Functions and Orthogonal Polynomials", * Contemporary Mathematics, vol 471 (2008)] * * which is refined via the bisection method. */ int gsl_sf_hermite_zero_e(const int n, const int s, gsl_sf_result * result) { if (n <= 0 || s < 0 || s > n/2) { DOMAIN_ERROR(result); } else if (s == 0) { if (GSL_IS_ODD(n) == 1) { result->val = 0.; result->err = 0.; return GSL_SUCCESS; } else { DOMAIN_ERROR(result); } } else if (n == 2) { result->val = M_SQRT1_2; result->err = 0.; return GSL_SUCCESS; } else if (n < 21) { result->val = H_zero_tab[(GSL_IS_ODD(n)?n/2:0)+((n/2)*(n/2-1))+s-2]; result->err = GSL_DBL_EPSILON*(result->val); return GSL_SUCCESS; } else { double d = 1., x = 1., x0 = 1.; int j; x = H_zero_init(n,s); do { x0 = x; d = 0.; for (j=1; jval = x; result->err = 2*GSL_DBL_EPSILON*x + fabs(x-x0); return GSL_SUCCESS; } } double gsl_sf_hermite_zero(const int n, const int s) { EVAL_RESULT(gsl_sf_hermite_zero_e(n, s, &result)); } int gsl_sf_hermite_func_zero_e(const int n, const int s, gsl_sf_result * result) { return gsl_sf_hermite_zero_e(n, s, result); } double gsl_sf_hermite_func_zero(const int n, const int s) { EVAL_RESULT(gsl_sf_hermite_func_zero_e(n, s, &result)); } #ifndef GSL_DISABLE_DEPRECATED int gsl_sf_hermite_phys_e(const int n, const double x, gsl_sf_result * result) { return gsl_sf_hermite_e(n, x, result); } double gsl_sf_hermite_phys(const int n, const double x) { EVAL_RESULT(gsl_sf_hermite_phys_e(n, x, &result)); } int gsl_sf_hermite_phys_der_e(const int m, const int n, const double x, gsl_sf_result * result) { return gsl_sf_hermite_deriv_e(m, n, x, result); } double gsl_sf_hermite_phys_der(const int m, const int n, const double x) { EVAL_RESULT(gsl_sf_hermite_phys_der_e(m, n, x, &result)); } int gsl_sf_hermite_phys_array(const int nmax, const double x, double * result_array) { return gsl_sf_hermite_array(nmax, x, result_array); } int gsl_sf_hermite_phys_series_e(const int n, const double x, const double * a, gsl_sf_result * result) { return gsl_sf_hermite_series_e(n, x, a, result); } double gsl_sf_hermite_phys_series(const int n, const double x, const double * a) { EVAL_RESULT(gsl_sf_hermite_phys_series_e(n, x, a, &result)); } int gsl_sf_hermite_phys_array_der(const int m, const int nmax, const double x, double * result_array) { return gsl_sf_hermite_array_deriv(m, nmax, x, result_array); } int gsl_sf_hermite_phys_der_array(const int mmax, const int n, const double x, double * result_array) { return gsl_sf_hermite_deriv_array(mmax, n, x, result_array); } int gsl_sf_hermite_phys_zero_e(const int n, const int s, gsl_sf_result * result) { return gsl_sf_hermite_zero_e(n, s, result); } double gsl_sf_hermite_phys_zero(const int n, const int s) { EVAL_RESULT(gsl_sf_hermite_zero_e(n, s, &result)); } int gsl_sf_hermite_prob_array_der(const int m, const int nmax, const double x, double * result_array) { return gsl_sf_hermite_prob_array_deriv(m, nmax, x, result_array); } int gsl_sf_hermite_prob_der_array(const int mmax, const int n, const double x, double * result_array) { return gsl_sf_hermite_prob_deriv_array(mmax, n, x, result_array); } int gsl_sf_hermite_prob_der_e(const int m, const int n, const double x, gsl_sf_result * result) { return gsl_sf_hermite_prob_deriv_e(m, n, x, result); } double gsl_sf_hermite_prob_der(const int m, const int n, const double x) { EVAL_RESULT(gsl_sf_hermite_prob_deriv_e(m, n, x, &result)); } #endif /* !GSL_DISABLE_DEPRECATED */ gsl-2.7.1/specfunc/hyperg_0F1.c0000644016036000116100000001200113441251001013065 00000000000000/* 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-2.7.1/specfunc/hyperg_2F0.c0000644016036000116100000000353313441251001013100 00000000000000/* 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-2.7.1/specfunc/hyperg_1F1.c0000644016036000116100000017043713441251001013110 00000000000000/* 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-2.7.1/specfunc/hyperg_2F1.c0000644016036000116100000007117513441251001013110 00000000000000/* 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-2.7.1/specfunc/hyperg_U.c0000644016036000116100000016146113441251001012762 00000000000000/* 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-2.7.1/specfunc/hyperg.c0000644016036000116100000002107513441251001012472 00000000000000/* 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-2.7.1/specfunc/inline.c0000644016036000116100000000170113532126312012453 00000000000000/* specfunc/inline.c * * Copyright (C) 2019 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 /* Compile all the inline functions */ #define COMPILE_INLINE_STATIC #include "build.h" #include gsl-2.7.1/specfunc/laguerre.c0000644016036000116100000002331513441251001013001 00000000000000/* 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-2.7.1/specfunc/lambert.c0000644016036000116100000001404013441251001012614 00000000000000/* 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-2.7.1/specfunc/legendre_H3d.c0000644016036000116100000004205513441251001013460 00000000000000/* 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-2.7.1/specfunc/legendre_P.c0000644016036000116100000000540214151556700013251 00000000000000/* specfunc/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 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this 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); } /********************************************************* * 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-2.7.1/specfunc/legendre_Qn.c0000644016036000116100000002276513441251001013426 00000000000000/* specfunc/legendre_Qn.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with 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" /* 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-2.7.1/specfunc/legendre_con.c0000644016036000116100000012450113441251001013616 00000000000000/* 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-2.7.1/specfunc/legendre_poly.c0000644016036000116100000005123613441251001014026 00000000000000/* 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-2.7.1/specfunc/log.c0000644016036000116100000001535013441251001011754 00000000000000/* 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-2.7.1/specfunc/mathieu_angfunc.c0000644016036000116100000002053413441251001014330 00000000000000/* 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 #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 #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 #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, 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); } 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, 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; } 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, 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); } 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); } 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 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-2.7.1/specfunc/poch.c0000644016036000116100000003400013441251001012115 00000000000000/* 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-2.7.1/specfunc/pow_int.c0000644016036000116100000000357213441251001012655 00000000000000/* 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-2.7.1/specfunc/psi.c0000644016036000116100000006036413441251001011773 00000000000000/* 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-2.7.1/specfunc/recurse.h0000644016036000116100000001724613135126237012672 00000000000000/* 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-2.7.1/specfunc/result.c0000644016036000116100000000454113441251001012511 00000000000000/* 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-2.7.1/specfunc/shint.c0000644016036000116100000000761013441251001012320 00000000000000/* 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-2.7.1/specfunc/sincos_pi.c0000644016036000116100000001701213441251001013156 00000000000000/* specfunc/sincos_pi.c * * Copyright (C) 2017 Gerard Jungman, Konrad Griessinger (konradg@gmx.net) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* routines for computing sin(pi*x) and cos(pi*x), respectively, with argument reduction */ #include #include #include #include #include /* Any double precision number bigger than this is automatically an even integer. */ #define TWOBIG (2.0 / GSL_DBL_EPSILON) /* routine computing sin(pi*x) valid for |x| <= 0.25 using a Taylor expansion around the origin and otherwise a rational approximation from the reference below. Spot-checked to give around 2e-16 relative accuracy. */ /* I. Koren and O. Zinaty. Evaluating elementary functions in a numerical coprocessor based on rational approximations. IEEE Transactions on Computers, Vol.39, No.8, August 1990, pp 1030-1037. */ /* static int sin_pi_koren(const double x, gsl_sf_result *result) { result->val = 0.0; result->err = 0.0; if (16.0*fabs(x) < 1.0) { const double y = M_PI * x; const double a = y*y; result->val = y*(1.0 - a*(1.0 - a*(1.0 - a*(1.0 - a*(1.0 - a/110.0)/72.0)/42.0)/20.0)/6.0); } else { const double a0 = 1805490264.690988571178600370234394843221; const double a1 = -164384678.227499837726129612587952660511; const double a2 = 3664210.647581261810227924465160827365; const double a3 = -28904.140246461781357223741935980097; const double a4 = 76.568981088717405810132543523682; const double b0 = 2298821602.638922662086487520330827251172; const double b1 = 27037050.118894436776624866648235591988; const double b2 = 155791.388546947693206469423979505671; const double b3 = 540.567501261284024767779280700089; const double t = 16.0*x*x; result->val = 4.0*x*(((( a4*t + a3 )*t + a2 )*t + a1 )*t + a0)/(((( t + b3 )*t + b2 )*t + b1 )*t + b0); } result->err = GSL_DBL_EPSILON*fabs(result->val); return GSL_SUCCESS; } */ /* routine computing cos(pi*x) valid for |x| <= 0.25 using a Taylor expansion around the origin and otherwise a rational approximation from the reference below. Spot-checked to give around 2e-16 relative accuracy. */ /* I. Koren and O. Zinaty. Evaluating elementary functions in a numerical coprocessor based on rational approximations. IEEE Transactions on Computers, Vol.39, No.8, August 1990, pp 1030-1037. */ /* static int cos_pi_koren(const double x, gsl_sf_result *result) { result->val = 0.0; result->err = 0.0; if (20.0*fabs(x) < 1.0) { const double y = M_PI * x; const double a = y*y; result->val = 1.0 - 0.5*a*(1.0 - a*(1.0 - a*(1.0 - a*(1.0 - a/90.0)/56.0)/30.0)/12.0); } else { const double a0 = 1090157078.174871420428849017262549038606; const double a1 = -321324810.993150712401352959397648541681; const double a2 = 12787876.849523878944051885325593878177; const double a3 = -150026.206045948110568310887166405972; const double a4 = 538.333564203182661664319151379451; const double b0 = 1090157078.174871420428867295670039506886; const double b1 = 14907035.776643879767410969509628406502; const double b2 = 101855.811943661368302608146695082218; const double b3 = 429.772865107391823245671264489311; const double t = 16.0*x*x; result->val = (((( a4*t + a3 )*t + a2 )*t + a1 )*t + a0)/(((( t + b3 )*t + b2 )*t + b1 )*t + b0); } result->err = GSL_DBL_EPSILON*fabs(result->val); return GSL_SUCCESS; } */ /* routine computing sin(pi*x) using a Taylor expansion around the origin and otherwise the library function. */ static int sin_pi_taylor(const double x, gsl_sf_result *result) { result->val = 0.0; result->err = 0.0; if (16.0*fabs(x) < 1.0) { const double y = M_PI * x; const double a = y*y; result->val = y*(1.0 - a*(1.0 - a*(1.0 - a*(1.0 - a*(1.0 - a/110.0)/72.0)/42.0)/20.0)/6.0); } else { result->val = sin(M_PI*x); } result->err = GSL_DBL_EPSILON*fabs(result->val); return GSL_SUCCESS; } /* routine computing sin(pi*x) using a Taylor expansion around the origin and otherwise the library function. */ static int cos_pi_taylor(const double x, gsl_sf_result *result) { result->val = 0.0; result->err = 0.0; if (20.0*fabs(x) < 1.0) { const double y = M_PI * x; const double a = y*y; result->val = 1.0 - 0.5*a*(1.0 - a*(1.0 - a*(1.0 - a*(1.0 - a/90.0)/56.0)/30.0)/12.0); } else { result->val = cos(M_PI*x); } result->err = GSL_DBL_EPSILON*fabs(result->val); return GSL_SUCCESS; } int gsl_sf_sin_pi_e(const double x, gsl_sf_result *result) { double intx = 0.0, fracx = 0.0; long q; int sign = 1, status; result->val = 0.0; result->err = 0.0; fracx = modf(x,&intx); if (fracx == 0.0) return GSL_SUCCESS; if(fabs(intx) >= TWOBIG) return GSL_SUCCESS; /* to be sure. Actually should be covered by the line above */ q = ( ( (intx >= LONG_MIN) && (intx <= LONG_MAX) ) ? intx : fmod(intx, 2.0) ); sign = ( q % 2 ? -1 : 1 ); /* int sign = 1 - 2*((int)round(fmod(fabs(intx),2.0))); */ if (fabs(fracx) == 0.5) { /* probably unnecessary */ if (fracx < 0.0) sign = -sign; result->val = ( sign != 1 ? -1.0 : 1.0 ); return GSL_SUCCESS; } if (fabs(fracx) > 0.5) { sign = -sign; fracx = ( fracx > 0.0 ? fracx-1.0 : fracx+1.0 ); } status = 0; if (fracx > 0.25) { status = cos_pi_taylor((fracx-0.5), result); } else if (fracx < -0.25) { status = cos_pi_taylor((fracx+0.5), result); sign = -sign; } else { status = sin_pi_taylor(fracx, result); } if (sign != 1) result->val = -result->val; return status; } int gsl_sf_cos_pi_e(const double x, gsl_sf_result *result) { double intx = 0.0, fracx = 0.0; long q; int sign = 1, status; result->val = 0.0; result->err = 0.0; fracx = modf(x,&intx); if (fabs(fracx) == 0.5) return GSL_SUCCESS; if(fabs(intx) >= TWOBIG) { result->val = 1.0; return GSL_SUCCESS; } q = ( ( (intx >= LONG_MIN) && (intx <= LONG_MAX) ) ? intx : fmod(intx, 2.0) ); sign = ( q % 2 ? -1 : 1 ); /* int sign = 1 - 2*((int)round(fmod(fabs(intx),2.0))); */ if (fracx == 0.0) { /* probably unnecessary */ result->val = ( sign != 1 ? -1.0 : 1.0 ); return GSL_SUCCESS; } if (fabs(fracx) > 0.5) { sign = -sign; fracx = ( fracx > 0.0 ? fracx-1.0 : fracx+1.0 ); } status = 0; if (fracx > 0.25) { status = sin_pi_taylor((fracx-0.5), result); sign = -sign; } else if (fracx < -0.25) { status = sin_pi_taylor((fracx+0.5), result); } else { status = cos_pi_taylor(fracx, result); } if (sign != 1) result->val = -result->val; return status; } /*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/ #include "eval.h" double gsl_sf_sin_pi(const double x) { EVAL_RESULT(gsl_sf_sin_pi_e(x, &result)); } double gsl_sf_cos_pi(const double x) { EVAL_RESULT(gsl_sf_cos_pi_e(x, &result)); } gsl-2.7.1/specfunc/sinint.c0000644016036000116100000002560713441251001012505 00000000000000/* 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-2.7.1/specfunc/synchrotron.c0000644016036000116100000001626413441251001013570 00000000000000/* 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-2.7.1/specfunc/transport.c0000644016036000116100000003104213441251001013223 00000000000000/* specfunc/transport.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with 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" #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-2.7.1/specfunc/trig.c0000644016036000116100000004643113441251001012144 00000000000000/* 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-2.7.1/specfunc/zeta.c0000644016036000116100000010076013441251001012136 00000000000000/* 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-2.7.1/specfunc/test_sf.c0000644016036000116100000046645014143275241012671 00000000000000/* 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_sf_return (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_return(message_buff, status, expect_return); gsl_test(local_s, desc); if(local_s != 0) { printf("%s", message_buff); } 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_hermite(), "Hermite Functions"); 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_sincos_pi(), "sin_pi and cos_pi"); 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-2.7.1/specfunc/test_sf.h0000644016036000116100000001125313425475415012670 00000000000000/* 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); int test_sf_return (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); } #define TEST_SF_RETURN(stat, func, args, expect_return) { int status = func args; stat += test_sf_return(status, expect_return, #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_hermite(void); int test_hyperg(void); int test_legendre(void); int test_sincos_pi(void); #endif /* !TEST_SF_H */ gsl-2.7.1/specfunc/test_airy.c0000644016036000116100000002220413441251001013172 00000000000000/* 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-2.7.1/specfunc/test_bessel.c0000644016036000116100000033714513441251001013520 00000000000000/* 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); #if 0 /* bug #45730; the bug should be fixed, but these tests are disabled since error computation is not correct for these inputs */ TEST_SF(s, gsl_sf_bessel_j2_e, (1048576.0, &r), -3.1518539455252413111e-07, TEST_TOL3, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_j2_e, (-1.0e22, &r), 5.23214785395139e-23, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_j2_e, (-1.0e21, &r), 7.449501119831337e-22, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_j2_e, (-1.0e20, &r), 7.639704044417282e-21, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_j2_e, (-1.0e19, &r), -3.749051695507179e-20, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_j2_e, (1.0e19, &r), -3.749051695507179e-20, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_j2_e, (1.0e20, &r), 7.639704044417282e-21, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_j2_e, (1.0e21, &r), 7.449501119831337e-22, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_j2_e, (1.0e22, &r), 5.23214785395139e-23, TEST_TOL2, GSL_SUCCESS); #endif 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); /* Jnu for negative integer nu */ TEST_SF(s, gsl_sf_bessel_Jnu_e, (-13, 4.3966088395743909188e-1, &r), -4.4808688873945295916e-19, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-43, 3.2953184511924683369e-1, &r), -3.4985116870357066158e-87, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-8, 3.5081119129046332101e-1, &r), 2.2148387185334257376e-11, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-17, 1.6717234250796879247e-1, &r), -1.3336696368048418208e-33, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-20, 1.0085435516296562067e-1, &r), 4.6463938513369299663e-45, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-29, 1.0423882905853389231e-1, &r), -7.0211488877617616588e-69, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-10, 2.014635069337132169e-1, &r), 2.9614218635575180136e-17, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-23, 3.3470953660313309239e-1, &r), -5.3786691977970313226e-41, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-13, 1.796487688043502395e-2, &r), -3.9796275104402232636e-37, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-30, 4.3851505455005663023e-1, &r), 6.3723816221242007043e-53, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-31, 2.9134673992671269075e-1, &r), -1.4108323502121482121e-60, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-28, 7.6696967407852829575e-1, &r), 7.2211466723046636958e-42, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-6, 1.9829576302527197691e-2, &r), 1.3193561299244410609e-15, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-26, 4.1513019703157674847e-1, &r), 4.362149422492811209e-45, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-19, 1.3033500482689031834e-2, &r), -2.4071043287214877014e-59, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4, 7.2050154387915780891e-1, &r), 6.8377203227324865568e-4, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-36, 9.058436592111083308e-1, &r), 1.1063535538518134862e-54, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-37, 4.4893454860671838425e-2, &r), -7.1436404620419702996e-105, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-25, 1.4253284590439372148e-1, &r), -1.3532982149810467304e-54, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-35, 6.8075538970323047806e-1, &r), -4.0087398199591044218e-57, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-9, 6.9978823056579836732e-2, &r), -2.1657760307485265867e-19, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-30, 8.3903642499214990225e-1, &r), 1.8046736761082165751e-44, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-43, 6.543891152683782553e-1, &r), -2.2618181452671187564e-74, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1, 2.557673774862201033e-1, &r), -1.2684081505646766845e-1, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-21, 2.3961944728579204361e-1, &r), -8.7037441094405713341e-40, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-13, 3.7732868931080794955e-1, &r), -6.1458679923678486123e-20, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-33, 3.8478064679256785588e-1, &r), -2.7471851206170506902e-61, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-50, 8.3045728127372512419e-1, &r), 2.6904315506244885678e-84, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-33, 3.4391840270211572065e-1, &r), -6.7604474418522862789e-63, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-23, 4.4699489157302132678e-1, &r), -4.1674520864249550489e-38, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-23, 8.6894302936681315656e-1, &r), -1.8080036072447165775e-31, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-24, 2.3997647040322801696e-1, &r), 1.2775332144705955465e-46, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4, 9.7688590680055575385e-1, &r), 2.260676935437026869e-3, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-20, 8.9090003293395823104e-1, &r), 3.8525697232471553813e-26, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-37, 9.4057990133775869779e-1, &r), -5.4483632006108552908e-56, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1, 2.6641070579761597867e-1, &r), -1.3202706692617745567e-1, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-7, 9.8878610880180753494e-1, &r), -1.3892626129288932172e-6, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-42, 3.1042396387236895292e-1, &r), 7.4291433893935351027e-86, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-18, 6.8722270094498481586e-1, &r), 6.9210950943508574463e-25, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-16, 1.6113707818439830316e-2, &r), 1.5066992425677873707e-47, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-31, 3.0720392023079679622e-1, &r), -7.2938615192106070364e-60, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-8, 3.4957196590626821859e-1, &r), 2.153068469114375124e-11, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4, 9.9805150837159144851e-1, &r), 2.4578749047519916152e-3, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-8, 8.4538260733781281419e-1, &r), 2.4776262290872395403e-8, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-21, 7.8935512795174026579e-1, &r), -6.4516652247824702208e-29, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-32, 3.4859401756229795902e-1, &r), 1.9985100102959434086e-60, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-28, 9.2530929240293814377e-1, &r), 1.3798987861611642315e-39, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-32, 5.7276907866586953775e-1, &r), 1.5890407703711501803e-53, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-16, 8.6364032267280037696e-1, &r), 6.9097436254460436398e-20, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-24, 8.1065458967451038451e-2, &r), 6.2316950805227520253e-58, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-17, 6.946415511078842723e-1, &r), -4.3495405983099048944e-23, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-14, 2.7619565270505476723e-1, &r), 1.0511271746088180311e-23, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-7, 8.579791601466317093e-2, &r), -5.3039175204559594309e-14, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-50, 7.4681490716561041968e-1, &r), 1.3331741219055661824e-86, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-30, 9.6631424224612452556e-1, &r), 1.2465815577059566852e-42, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-14, 2.6745819874317492788e-1, &r), 6.7024985048974981757e-24, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-22, 3.6947309321414497419e-1, &r), 6.4975710352073715961e-38, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-49, 2.3389602803779083655e-2, &r), -3.5281224467005794333e-158, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-48, 7.7482504299905127354e-1, &r), 1.3711857024107478291e-81, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-30, 6.5337950709230049969e-1, &r), 9.9749347191786840601e-48, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-29, 5.4117488569210959438e-1, &r), -3.8843890347204927665e-48, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-50, 9.4038774092645791075e-1, &r), 1.3455212768163778034e-81, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1, 5.627399919447310892e-1, &r), -2.703780920058947009e-1, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-35, 7.9925999507829895011e-2, &r), -1.1060656306690664139e-89, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-10, 2.8875439067692705135e-3, &r), 1.0844833648855202142e-35, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-31, 2.7645446745852278572e-1, &r), -2.7740931384652548129e-61, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-12, 8.5374968606378578252e-1, &r), 7.5366644001760905687e-14, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-11, 2.2997159465452075155e-1, &r), -1.1626579415654480052e-18, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-47, 5.8616043503503357359e-1, &r), -3.4270544836018351049e-85, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-24, 8.4884849730214263521e-1, &r), 1.8679667366331791405e-33, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-24, 5.3943176031162412158e-1, &r), 3.5300994115064965228e-38, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-3, 9.3387179309343112648e-1, &r), -1.6062668879215016378e-2, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-20, 5.5061917642540109891e-1, &r), 2.5629166990385734238e-30, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-26, 2.9315675715515822781e-1, &r), 5.1505442739915338391e-49, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-6, 8.9079715253593128884e-1, &r), 1.0539758479683914316e-5, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-30, 9.1220250697048036241e-2, &r), 2.2291985671052015068e-73, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-49, 3.2934552845357396486e-1, &r), -6.7628009346158039786e-102, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-20, 6.2008856084878849548e-3, &r), 2.7691703032688977815e-69, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-23, 7.1620177578706903472e-1, &r), -2.124755495743639839e-33, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-29, 5.1124413385957329246e-1, &r), -7.462204354283390559e-49, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-23, 6.7405321505832900803e-1, &r), -5.2689769204867120958e-34, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-31, 7.6828173704641609615e-2, &r), -1.600162678935095954e-78, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4, 7.8546641070654814244e-1, &r), 9.610534504452577567e-4, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-39, 7.8708523270381710591e-1, &r), -7.8237015591341025437e-63, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-8, 1.1973778137874968338e-1, &r), 4.0918170073170305674e-15, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-22, 7.9699790929323855652e-1, &r), 1.4309765990568672215e-30, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-11, 4.4800161319259052168e-1, &r), -1.7773520138988139169e-15, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-39, 9.2637892745877041811e-1, &r), -4.4944192865215894733e-60, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-29, 4.6475617572623309956e-1, &r), -4.7026155154566357963e-50, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-25, 4.6435749048262147537e-1, &r), -8.9952935327704632698e-42, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-28, 9.6511079209639008185e-1, &r), 4.4842768640542298547e-39, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-36, 3.8411791760130458261e-2, &r), 4.296403338839098526e-104, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-6, 2.891145018145052606e-1, &r), 1.2636012998902815302e-8, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-43, 3.0866754076112185885e-1, &r), -2.1010663709383681337e-88, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-44, 8.3972445789951961023e-1, &r), 9.7813493638738341846e-72, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-22, 8.2307293342676789357e-1, &r), 2.9041436661554638719e-30, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-12, 9.8857250941935924585e-1, &r), 4.357505306871049656e-13, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-47, 9.9901153675544108048e-1, &r), -2.6090278787375958472e-74, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-44, 2.8286777063559952163e-1, &r), 1.5832896249242322418e-92, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-10, 9.7638349947419439863e-1, &r), 2.0735913941162063742e-10, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-36, 4.6452631984005212745e-1, &r), 4.0190510760125038996e-65, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-25, 8.2954737598010312336e-1, &r), -1.7855017422981225812e-35, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-29, 4.2326977999795604681e-1, &r), -3.1249531389372439734e-51, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-9, 6.339167576518494852e-1, &r), -8.8082994072251150317e-11, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-27, 7.4535258299077637954e-1, &r), -2.4368032520208918805e-40, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-45, 8.0998976704970278418e-1, &r), -1.8024726219976677441e-74, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-24, 5.3437414610693284794e-1, &r), 2.8159486268019058346e-38, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-19, 3.6987646459831328184e-1, &r), -9.7200835901252686409e-32, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-49, 4.7308684164506190021e-1, &r), -3.4438316393709775799e-94, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-42, 8.4616849424460901479e-1, &r), 1.4469107537397962381e-67, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-39, 8.6819804427642418616e-1, &r), -3.5837055310896411954e-61, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-28, 4.1490163307722590922e-1, &r), 2.448154551562710141e-49, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-25, 6.312651668273163642e-1, &r), -1.9374739456138691106e-38, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-32, 5.3525470388026220677e-1, &r), 1.8191207037881755277e-54, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-13, 9.2605599515408535679e-3, &r), -7.2212651931099339154e-41, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-37, 4.8798589647640992562e-1, &r), -1.5614996577959031121e-66, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-37, 2.2096551301466541766e-2, &r), -2.9050812034192451665e-116, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-42, 1.8092873560926168207e-1, &r), 1.0575388628113044972e-95, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-22, 4.2954143428969324083e-1, &r), 1.7857221060719548205e-36, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-41, 1.7704659657689619579e-1, &r), -2.017674513721498041e-93, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-3, 8.8755155653793053987e-1, &r), -1.3862799262620708632e-2, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1, 6.7617657704638521874e-1, &r), -3.1913053561511127823e-1, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-34, 6.4464304038438048178e-1, &r), 6.4622314654558520448e-56, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-41, 7.2625991432244163042e-1, &r), -2.7337118024791538344e-68, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-3, 6.357184822423154937e-1, &r), -5.2186206749718741014e-3, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-6, 8.4999778579632777264e-1, &r), 7.9757193518631922586e-6, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-47, 4.9270801771231759268e-1, &r), -9.7743102162756354643e-89, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-44, 3.0382431918975667824e-1, &r), 3.6749344196700669304e-91, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-21, 8.3709075395163832807e-1, &r), -2.2120291813240017972e-28, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-13, 2.2926361048823468174e-1, &r), -9.4684470339645238166e-23, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-2, 7.7595731076113971064e-1, &r), 7.1557648504788709828e-2, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-13, 8.3155666144468474085e-1, &r), -1.760187305034807398e-15, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-26, 8.9229820511590331545e-1, &r), 1.8952192929209682492e-36, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-9, 4.3091918823985208523e-1, &r), -2.7448142505229531657e-12, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-45, 7.6232573842954975111e-1, &r), -1.177044451508791199e-75, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-47, 8.5370192783467777094e-1, &r), -1.6168449888151601463e-77, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-17, 7.0917926374340919579e-1, &r), -6.1835780259077271289e-23, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-48, 5.3177634068823620691e-1, &r), 1.9544175507861216812e-89, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-20, 8.6236563774769292261e-1, &r), 2.0102896278761019978e-26, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-47, 1.9398034049650767996e-1, &r), -9.1928516850183758066e-108, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-22, 1.9059407555598432968e-1, &r), 3.0818305203000064476e-44, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-28, 1.177497340192600765e-1, &r), 1.1853471604859571152e-64, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-44, 5.4411719229619710879e-1, &r), 5.0099597095462268336e-80, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-22, 8.4096736569723091858e-1, &r), 4.6598891827094030103e-30, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-14, 5.7336031747513286455e-1, &r), 2.8892068362904543886e-19, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-24, 4.3701161637218456507e-1, &r), 2.2572337854881401663e-40, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-16, 5.5950502438849852065e-1, &r), 6.6952184074205206877e-23, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-15, 7.2135709344094709909e-1, &r), -1.724936657760223936e-19, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-42, 8.9503358993826252397e-1, &r), 1.5285906153951174029e-66, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-34, 8.8842662562391397862e-1, &r), 3.5115599466639988263e-51, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-24, 7.1820429322328243568e-1, &r), 3.3906734873299682373e-35, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-42, 6.9983283703407621113e-1, &r), 4.9840979255532732037e-71, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-29, 3.4956023377394930027e-1, &r), -1.2169918834421082937e-53, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-24, 3.1780802172157483391e-1, &r), 1.0816638066322224274e-43, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-42, 6.6747313617191922586e-1, &r), 6.8258422034194326368e-72, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-29, 9.8281798409069473598e-1, &r), -1.2641970706335426485e-40, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-48, 9.3933236478420901552e-1, &r), 1.4126090419557425431e-77, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-33, 7.9969562813573452357e-1, &r), -8.3521436185818779821e-51, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4, 1.749832037277650746e-1, &r), 2.4377505307831309992e-6, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-12, 7.4928517324325015606e-1, &r), 1.578984980873870348e-14, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-50, 6.8668643284952988717e-1, &r), 2.0060641365741957198e-88, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-26, 4.628453813124784986e-1, &r), 7.3802979097358757591e-44, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-17, 1.3398796901656815413e-1, &r), -3.1005014564142463477e-35, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-21, 4.3589737907768555406e-1, &r), -2.4897620016130572781e-34, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-49, 9.3471214811043877923e-1, &r), -1.0635172631183545319e-79, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-12, 6.2842914244476056474e-1, &r), 1.919020727030761691e-15, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-44, 3.9902397275715061045e-1, &r), 5.9381636725852262522e-86, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-38, 7.4844742354073981342e-1, &r), 1.1452741249870059158e-61, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-22, 1.7024143837455386901e-1, &r), 2.5696433432212310518e-45, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-35, 2.4663778723047911984e-1, &r), -1.4846380265631517846e-72, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-42, 3.4675532474808813305e-1, &r), 7.7576502065450687145e-84, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-42, 9.7015007293565236242e-1, &r), 4.5073367850753509233e-65, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-18, 5.8064934044500015204e-1, &r), 3.3392049842730194442e-26, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4, 8.9712869996285071984e-1, &r), 1.6201373653351794808e-3, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-14, 4.7509593095794841351e-1, &r), 2.0819777331649343154e-20, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-24, 1.9971440277743206076e-1, &r), 1.5567772398263651029e-48, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-2, 3.1326041354180815314e-1, &r), 1.2166506426643152762e-2, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-21, 7.1780328035546876532e-1, &r), -8.7820775346034440302e-30, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-40, 3.4783624449708255548e-1, &r), 5.0330128895858604038e-79, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-24, 4.6025606383259078342e-1, &r), 7.8278566159609528116e-40, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-37, 6.8329209514074967672e-1, &r), -4.0018049034521909865e-61, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-26, 3.1644447969459523952e-1, &r), 3.757803139189680586e-48, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-49, 3.8814659649103508174e-1, &r), -2.1178321069354253493e-98, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-33, 2.2586340634075651258e-1, &r), -6.3690605699693325702e-69, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-31, 1.1833425544176035201e-1, &r), -1.0457450400633015896e-72, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-7, 4.716233225505345007e-1, &r), -7.9892591292002198427e-9, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-28, 4.0216249780484400656e-1, &r), 1.0224868057823447281e-49, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-39, 2.1728515555094074309e-1, &r), -1.2424793343150735922e-84, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-10, 1.5286805658821812372e-1, &r), 1.8744497113230339685e-18, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-2, 4.2012489177724585853e-1, &r), 2.1740379601921820516e-2, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-3, 5.4168160735476556955e-1, &r), -3.2509626190739798323e-3, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-26, 6.0999547254418081401e-1, &r), 9.6515399655293906821e-41, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-31, 9.3599472437451867441e-1, &r), -7.236873645285246215e-45, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-2, 8.9238535456317991508e-2, &r), 9.9477909077321557346e-4, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-41, 3.3286697432119768766e-1, &r), -3.5168501713472066379e-82, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-26, 1.3103200887095798302e-2, &r), 4.1630610278945554747e-84, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-7, 6.8545576155223653312e-1, &r), -1.0860095433456484207e-7, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-33, 7.4597656684747976078e-1, &r), -8.4232256181114982289e-52, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-35, 9.5265851504353628581e-1, &r), -5.1260638475279101845e-52, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-5, 1.9993324513780069188e-2, &r), -8.319296787329444617e-13, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-15, 7.291071285552115835e-2, &r), -2.0411952376466778385e-34, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-5, 4.307852573603263607e-1, &r), -3.8336545021181925733e-6, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-8, 3.0719264454074178501e-1, &r), 7.6627991262305533713e-12, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-7, 2.9261260328577001029e-1, &r), -2.8395431884068098274e-10, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-36, 3.4285828911893011822e-1, &r), 7.1807133181285014617e-70, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-22, 2.1687887653368606307e-1, &r), 5.2860475778514174667e-43, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-24, 7.2816755037040510323e-1, &r), 4.7187086299885949165e-35, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-18, 2.0826276232560462604e-2, &r), 3.2368741843295077202e-52, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-9, 6.8082174052201672454e-1, &r), -1.6719854980400483279e-10, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-26, 1.1998114825675920571e-1, &r), 4.2119340347581322841e-59, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-9, 5.9197600088654039875e-1, &r), -4.7631865156190005935e-11, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-30, 1.2367288101522705215e-1, &r), 2.0588316029270585207e-69, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-7, 8.3266930505292536647e-1, &r), -4.2096524602233328394e-7, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-18, 4.360196631312459384e-1, &r), 1.9281550661128359168e-28, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-13, 9.8501660515145040901e-1, &r), -1.5833136710018445626e-14, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-29, 9.3281324180154613247e-1, &r), -2.7828395455119501545e-41, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-50, 8.9831019278310796215e-1, &r), 1.3646576617083900982e-82, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-34, 8.1153956230382506493e-1, &r), 1.6192058088789772833e-52, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-15, 9.5908894233909785027e-1, &r), -1.2293883538807523551e-17, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-28, 4.7478353398916835208e-1, &r), 1.0667274838088242221e-47, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-26, 3.1425431663890729964e-1, &r), 3.137014371489532261e-48, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-29, 6.8861856868877100233e-1, &r), -4.2000859317520628674e-45, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-16, 6.9807655407582355921e-1, &r), 2.3026948238804970982e-21, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-15, 1.9223628937777433793e-1, &r), -4.2201734817670464106e-28, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-24, 7.91209811831343471e-1, &r), 3.458241440092889033e-34, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-12, 2.8881796002183274727e-1, &r), 1.7143390913163291276e-19, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-34, 3.6891378721647167497e-1, &r), 3.7139793083014182422e-64, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-20, 8.4841223828616526898e-1, &r), 1.4510812436551651903e-26, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-23, 2.2490195812594682131e-1, &r), -5.7468688920782767025e-45, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-18, 2.2504144134842978217e-1, &r), 1.3048322081397375779e-33, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-41, 8.9085721717774902491e-1, &r), -1.1841910084346823163e-64, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-14, 3.5776817082613807574e-1, &r), 3.9325021938284721675e-22, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-17, 4.6898364389788035003e-1, &r), -5.492570150236103145e-26, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-6, 7.4085998179632632531e-1, &r), 3.5186865149767756957e-6, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-29, 8.1247678941673114604e-1, &r), -5.0783189409391835819e-43, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-6, 1.7590874156867732351e-2, &r), 6.4299450335557031571e-16, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-6, 4.1122931368227349961e-2, &r), 1.0494595145859932593e-13, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-18, 3.4357780610013843947e-2, &r), 2.6519427947417673311e-48, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-8, 7.2901630769663700817e-1, &r), 7.6159005881302088369e-9, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-40, 6.2434787548617066655e-1, &r), 7.297739135890827566e-69, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-37, 2.5717302633809380684e-1, &r), -7.9671811532819427071e-77, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-12, 4.4871088635019795091e-1, &r), 3.3823657137507787902e-17, TEST_TOL2, GSL_SUCCESS); /* Jnu for negative nu */ TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1.7408502287167772557e+1, 4.3891036254061936271e-2, &r), -1.5118966152679114528e+42, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4.0369289750688261206e+1, 8.617077861907621132e-1, &r), 1.3458137581188368176e+61, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-3.6398263821779503158, 5.7108775125890870648e-1, &r), -1.1073338178875224514e+2, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-2.0743837616631487936e+1, 2.2372123946196517647e-1, &r), 1.3987244312547157439e+37, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1.7297952956642177128e+1, 2.8440280848533973972e-1, &r), -5.5832331287880973953e+27, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1.3507072230824139103e+1, 9.7008738913549467403e-1, &r), -9.9108981827284991851e+12, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4.4663106025697138284e+1, 9.6739483983540323655e-1, &r), 2.5305841722999151766e+67, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4.7450767905208691173e+1, 5.2288309478685515663e-3, &r), -3.4541920228396234708e+180, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1.8736914274754280581e+1, 4.4318942692773250336e-1, &r), 1.2783291424623089209e+27, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-3.4560791710276042462e+1, 5.6595841783863809163e-1, &r), 1.7364781221343685309e+56, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-2.8723165418996042381e+1, 2.4003201116391659975e-1, &r), 8.229650479070536446e+54, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-3.1780816480084454714e+1, 3.5000033756039229564e-1, &r), -8.9158096963672457852e+56, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-8.3572537806135923827, 8.994859317735841446e-1, &r), 2.4471474432717596765e+6, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4.9179499652113791027e+1, 7.3466044408596358731e-1, &r), -1.0446080588162613503e+82, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4.0204535104461498585e+1, 1.3316368076269799096e-1, &r), 1.6723180404777533538e+93, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4.9597169419874779916e+1, 8.3895848736941180651e-1, &r), -1.9885394381212418599e+80, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1.2228113163441444643e+1, 7.2360070820350912315e-1, &r), 3.7033741801434815187e+12, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4.3252347726870680973e+1, 4.7042383176138740544e-2, &r), -2.2524439080867705956e+121, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4.8363275112470146292e+1, 3.5406545166014987925e-1, &r), 7.0915928368505654149e+95, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-2.4031313414732363799e+1, 1.7077658851102128503e-1, &r), 4.2707681524978432343e+46, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-3.4994220322161396103e+1, 7.6004498361697560048e-2, &r), 8.3491267575601512811e+85, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1.5842451866339926986e+1, 7.1655842470093644641e-1, &r), -1.4956016465164596038e+18, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4.3303969013414183336e+1, 3.4261981308825774017e-1, &r), -1.7313464383524562686e+84, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-2.9620214546900609668e+1, 8.9559048893071335969e-2, &r), -6.5439278427877993956e+69, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-3.9267775155252921091e+1, 4.9173394917277714574e-1, &r), -2.7879726255003962141e+68, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1.085805422677201981e+1, 7.1844728658692273953e-2, &r), 1.7330833141098585591e+21, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4.3205222720657600449e+1, 2.0938011160695718605e-1, &r), -1.2855953290893319419e+93, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1.1761832688338363731e-1, 4.0692821730479031008e-1, &r), 1.0616114810207300625, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-3.4176152886105712673e+1, 7.3083748089885469319e-1, &r), 2.3708170326600879156e+51, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1.7495316392965243753e+1, 3.6374757654471397858e-1, &r), -2.4050181588419272908e+26, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1.4363999308889822481e+1, 2.2964635433363436307e-1, &r), 1.4858445128296594446e+23, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1.5945782535187393546e+1, 5.5004988492253222851e-1, &r), -5.3196903529172738965e+19, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-2.6539439893219625339e+1, 5.4022213494661757887e-1, &r), 3.4606719889912371036e+40, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-3.9104819423206076833e+1, 8.7581079115207012305e-1, &r), -8.3806822204633705862e+57, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1.1344422530419629852e+1, 1.8412292138063948156e-1, &r), -1.3032526695489281999e+18, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4.2479004807998664153e+1, 7.628052499161305046e-1, &r), 3.8593605090529013702e+67, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-2.7234292208462683278e+1, 5.6929354834881763134e-1, &r), -1.3560087920173394791e+41, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-2.9852923491811760298e+1, 2.1764339448558498796e-2, &r), -3.1065720979758225192e+88, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-2.9470737712526065987e+1, 9.1397839227827761003e-1, &r), -4.9854244578384505794e+39, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-2.4879459756439547254e+1, 8.7694253508024822462e-1, &r), 4.0540656704233640216e+31, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-8.6562240771489400173e-1, 6.4882619355798588927e-1, &r), 9.5827819637209987022e-2, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1.4096305256724256786e+1, 1.1837901256079790395e-1, &r), 1.5389662008468777023e+26, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1.3739240782592000796e+1, 1.1830951764837136725e-1, &r), -5.4851415830067607572e+25, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-7.7683272384817803185e-1, 2.0897180603218726575e-1, &r), 1.3452855819917342033, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4.9007825894244022613e+1, 8.0804305816981973945e-1, &r), -1.9558153171413640836e+78, TEST_TOL3, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1.224872379992519031, 9.4716012050013901355e-1, &r), -8.7507643021583199242e-1, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-5.0807600398060325807e+1, 6.1902119795226148946e-1, &r), 1.9558680407989173708e+89, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4.2130610423140110162e+1, 7.2184881647444607846e-1, &r), 3.0709609117301881893e+67, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4.1186300874143057513e+1, 1.3944550368322800884e-1, &r), -1.2405415201132534983e+95, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-2.1777582295815773824e+1, 7.6178874271077561762e-1, &r), -7.1748063501973138583e+27, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-3.2185912810368133222e+1, 3.959510541558671016e-1, &r), 1.196451653185591802e+56, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4.2976006083946226988e+1, 4.5739390828369379657e-1, &r), 1.0599129365585919882e+77, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-3.0412232215064606945e+1, 6.7510758855896918145e-1, &r), 2.4302601636670462267e+45, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1.8388188389747281955e+1, 8.9233979909724013718e-1, &r), 9.1410432331502484426e+20, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-2.4298840569257253701e+1, 6.8042862360863559591e-1, &r), 4.0995648850574613979e+33, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-3.8834735272673504063e+1, 4.2324469410479691518e-1, &r), 7.0355133597135130631e+69, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4.6091840934431606344e+1, 1.7508918790902548661e-1, &r), 8.7456315137421979067e+103, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1.9754264394942756728, 1.558717798933954111e-2, &r), -3.551027943747170162e+2, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-3.7168594342366560374e+1, 6.976373865080374073e-1, &r), -1.1036447967023475572e+58, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4.5379944292029245754e+1, 5.3150471205968938472e-2, &r), -1.0469743921754287032e+126, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-1.153181439556533474e+1, 1.8204366094125528818e-1, &r), -4.0986515168430307785e+18, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-4.9939680334734766385e+1, 8.132277926604580844e-1, &r), -9.5179038651143567503e+80, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-3.5986707652967270442e+1, 5.5665988728905782182e-1, &r), -1.27797927382078249e+58, TEST_TOL3, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Jnu_e, (-6.7046620273111013832, 1.059530133767196237e-1, &r), 3.8106055649273069958e+10, TEST_TOL2, GSL_SUCCESS); /* Ynu */ 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); /* Ynu for negative integer nu */ TEST_SF(s, gsl_sf_bessel_Ynu_e, (-13, 4.3966088395743909188e-1, &r), 5.4675723318993574107e+16, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-43, 3.2953184511924683369e-1, &r), 2.115977780575035527e+84, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-8, 3.5081119129046332101e-1, &r), -1.7982193624366780622e+9, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-17, 1.6717234250796879247e-1, &r), 1.4040223280006382933e+31, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-20, 1.0085435516296562067e-1, &r), -3.4253870177732383503e+42, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-29, 1.0423882905853389231e-1, &r), 1.5633159385709367033e+66, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-10, 2.014635069337132169e-1, &r), -1.0750753223600878559e+15, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-23, 3.3470953660313309239e-1, &r), 2.5733184597190491073e+38, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-13, 1.796487688043502395e-2, &r), 6.1526862287828618145e+34, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-30, 4.3851505455005663023e-1, &r), -1.6652274019860697168e+50, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-31, 2.9134673992671269075e-1, &r), 7.2783380837435004727e+57, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-28, 7.6696967407852829575e-1, &r), -1.5748860170624112485e+39, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-6, 1.9829576302527197691e-2, &r), -4.0210481843848071758e+13, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-26, 4.1513019703157674847e-1, &r), -2.806930683617814941e+42, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-19, 1.3033500482689031834e-2, &r), 6.9598794107689745713e+56, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4, 7.2050154387915780891e-1, &r), -1.1846384548732517149e+2, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-36, 9.058436592111083308e-1, &r), -7.994500359474016123e+51, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-37, 4.4893454860671838425e-2, &r), 1.2042846052782773184e+102, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-25, 1.4253284590439372148e-1, &r), 9.4085712788480443733e+51, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-35, 6.8075538970323047806e-1, &r), 2.2691146737122039815e+54, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-9, 6.9978823056579836732e-2, &r), 1.6330796519846810927e+17, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-30, 8.3903642499214990225e-1, &r), -5.8816651774415705482e+41, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-43, 6.543891152683782553e-1, &r), 3.2732133353307485906e+71, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1, 2.557673774862201033e-1, &r), 2.648397359834244179, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-21, 2.3961944728579204361e-1, &r), 1.7416186098234671613e+37, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-13, 3.7732868931080794955e-1, &r), 3.9857279826655584502e+17, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-33, 3.8478064679256785588e-1, &r), 3.5113798569950397588e+58, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-50, 8.3045728127372512419e-1, &r), -2.3665632218557611716e+81, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-33, 3.4391840270211572065e-1, &r), 1.4268698281593046704e+60, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-23, 4.4699489157302132678e-1, &r), 3.3214969951131331346e+35, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-23, 8.6894302936681315656e-1, &r), 7.6600878858980858273e+28, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-24, 2.3997647040322801696e-1, &r), -1.0382177146462655416e+44, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4, 9.7688590680055575385e-1, &r), -3.6396008802115138586e+1, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-20, 8.9090003293395823104e-1, &r), -4.1352523331280200421e+23, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-37, 9.4057990133775869779e-1, &r), 1.5795116292393394486e+53, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1, 2.6641070579761597867e-1, &r), 2.5520015187867893496, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-7, 9.8878610880180753494e-1, &r), 3.3070534106551277147e+4, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-42, 3.1042396387236895292e-1, &r), -1.0201733293438510046e+83, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-18, 6.8722270094498481586e-1, &r), -2.556940038138305942e+22, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-16, 1.6113707818439830316e-2, &r), -1.3203947711040991975e+45, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-31, 3.0720392023079679622e-1, &r), 1.4078366532641984096e+57, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-8, 3.4957196590626821859e-1, &r), -1.8497964339362348508e+9, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4, 9.9805150837159144851e-1, &r), -3.35276446088454154e+1, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-8, 8.4538260733781281419e-1, &r), -1.6151126896511724021e+6, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-21, 7.8935512795174026579e-1, &r), 2.3510763338498465525e+26, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-32, 3.4859401756229795902e-1, &r), -4.9775956770188671631e+57, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-28, 9.2530929240293814377e-1, &r), -8.2429457360543127639e+36, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-32, 5.7276907866586953775e-1, &r), -6.2608710158624288778e+50, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-16, 8.6364032267280037696e-1, &r), -2.8833961453891338766e+17, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-24, 8.1065458967451038451e-2, &r), -2.1283114054434655701e+55, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-17, 6.946415511078842723e-1, &r), 4.3084587997971578431e+20, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-14, 2.7619565270505476723e-1, &r), -2.1634745597658813187e+21, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-7, 8.579791601466317093e-2, &r), 8.5741016888820088808e+11, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-50, 7.4681490716561041968e-1, &r), -4.7757514561562387813e+83, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-30, 9.6631424224612452556e-1, &r), -8.5159643935229761718e+39, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-14, 2.6745819874317492788e-1, &r), -3.3928529652241947717e+21, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-22, 3.6947309321414497419e-1, &r), -2.2270901208692386374e+35, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-49, 2.3389602803779083655e-2, &r), 1.8412401963717225375e+155, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-48, 7.7482504299905127354e-1, &r), -4.8369236019321535917e+78, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-30, 6.5337950709230049969e-1, &r), -1.0639517934361092802e+45, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-29, 5.4117488569210959438e-1, &r), 2.8262145810872807871e+45, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-50, 9.4038774092645791075e-1, &r), -4.7322361571978865664e+78, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1, 5.627399919447310892e-1, &r), 1.3310580822914015523, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-35, 7.9925999507829895011e-2, &r), 8.2224704007424584626e+86, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-10, 2.8875439067692705135e-3, &r), -2.9351293887447581255e+33, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-31, 2.7645446745852278572e-1, &r), 3.7015590625912763344e+58, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-12, 8.5374968606378578252e-1, &r), -3.528575811542778544e+11, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-11, 2.2997159465452075155e-1, &r), 2.4894373648370412225e+16, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-47, 5.8616043503503357359e-1, &r), 1.9763554381308657733e+82, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-24, 8.4884849730214263521e-1, &r), -7.1046392480541118407e+30, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-24, 5.3943176031162412158e-1, &r), -3.7580440656007599181e+35, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3, 9.3387179309343112648e-1, &r), 7.0202042170209205589, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-20, 5.5061917642540109891e-1, &r), -6.2122754555889405012e+27, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-26, 2.9315675715515822781e-1, &r), -2.3771210812024680281e+46, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-6, 8.9079715253593128884e-1, &r), -5.091626137833991034e+3, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-30, 9.1220250697048036241e-2, &r), -4.7597279133940392868e+70, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-20, 6.2008856084878849548e-3, &r), -5.7473876046110789338e+66, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-23, 7.1620177578706903472e-1, &r), 6.5166498927440582853e+30, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-29, 5.1124413385957329246e-1, &r), 1.4711351369242792138e+46, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-23, 6.7405321505832900803e-1, &r), 2.627743272609579819e+31, TEST_TOL2, GSL_SUCCESS); /* Ynu for negative nu */ TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.7408502287167772557e+1, 4.3891036254061936271e-2, &r), 4.469714143570654497e+41, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.0369289750688261206e+1, 8.617077861907621132e-1, &r), -5.8595434076664310948e+60, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.6398263821779503158, 5.7108775125890870648e-1, &r), -5.2034221685931678753e+1, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.0743837616631487936e+1, 2.2372123946196517647e-1, &r), 1.345588718040376054e+37, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.7297952956642177128e+1, 2.8440280848533973972e-1, &r), 4.1115735370678699359e+27, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.3507072230824139103e+1, 9.7008738913549467403e-1, &r), -2.202372544321863968e+11, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.4663106025697138284e+1, 9.6739483983540323655e-1, &r), 1.4235309894056948387e+67, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.7450767905208691173e+1, 5.2288309478685515663e-3, &r), 5.3855142705411361919e+179, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.8736914274754280581e+1, 4.4318942692773250336e-1, &r), 1.1773204343097478161e+27, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.4560791710276042462e+1, 5.6595841783863809163e-1, &r), 3.3572924118396673305e+55, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.8723165418996042381e+1, 2.4003201116391659975e-1, &r), 6.9471556080056038434e+54, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.1780816480084454714e+1, 3.5000033756039229564e-1, &r), -1.0833823624917670056e+57, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-8.3572537806135923827, 8.994859317735841446e-1, &r), -1.1774337302489088463e+6, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.9179499652113791027e+1, 7.3466044408596358731e-1, &r), 1.6517722024836217581e+82, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.0204535104461498585e+1, 1.3316368076269799096e-1, &r), -2.2341067840937606376e+93, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.9597169419874779916e+1, 8.3895848736941180651e-1, &r), -6.2662143656762004053e+79, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.2228113163441444643e+1, 7.2360070820350912315e-1, &r), -4.2511898289085272856e+12, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.3252347726870680973e+1, 4.7042383176138740544e-2, &r), 2.2194603264543665848e+121, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.8363275112470146292e+1, 3.5406545166014987925e-1, &r), -3.248353813678515594e+95, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.4031313414732363799e+1, 1.7077658851102128503e-1, &r), -4.3273454620971397041e+47, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.4994220322161396103e+1, 7.6004498361697560048e-2, &r), 4.5976914154279708742e+87, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.5842451866339926986e+1, 7.1655842470093644641e-1, &r), -2.7708334780004236249e+18, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.3303969013414183336e+1, 3.4261981308825774017e-1, &r), 1.2252074327758681488e+84, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.9620214546900609668e+1, 8.9559048893071335969e-2, &r), -2.5960278365111086141e+69, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.9267775155252921091e+1, 4.9173394917277714574e-1, &r), 2.4927765540337657002e+68, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.085805422677201981e+1, 7.1844728658692273953e-2, &r), 3.6253005874483288876e+21, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.3205222720657600449e+1, 2.0938011160695718605e-1, &r), 1.7097593469426311991e+93, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.1761832688338363731e-1, 4.0692821730479031008e-1, &r), -3.9929527887838440231e-1, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.4176152886105712673e+1, 7.3083748089885469319e-1, &r), -3.8375532995220739134e+51, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.4363999308889822481e+1, 2.2964635433363436307e-1, &r), -6.7651597483976020212e+22, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.5945782535187393546e+1, 5.5004988492253222851e-1, &r), -3.0929200048995927397e+20, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.6539439893219625339e+1, 5.4022213494661757887e-1, &r), 4.3099923396955639095e+39, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.9104819423206076833e+1, 8.7581079115207012305e-1, &r), 2.4523357879118971691e+58, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.1344422530419629852e+1, 1.8412292138063948156e-1, &r), 6.9306682864864401354e+17, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.2479004807998664153e+1, 7.628052499161305046e-1, &r), -2.5492681017463054894e+66, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.7234292208462683278e+1, 5.6929354834881763134e-1, &r), 1.4969074140226347429e+41, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.9852923491811760298e+1, 2.1764339448558498796e-2, &r), -6.237969203121440244e+88, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.9470737712526065987e+1, 9.1397839227827761003e-1, &r), 4.5960647034986138864e+38, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.4879459756439547254e+1, 8.7694253508024822462e-1, &r), 1.0188843810269963844e+32, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-8.6562240771489400173e-1, 6.4882619355798588927e-1, &r), 1.1287689391130420057, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.4096305256724256786e+1, 1.1837901256079790395e-1, &r), -4.9304578916106509819e+26, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.3739240782592000796e+1, 1.1830951764837136725e-1, &r), -5.1263258788046229045e+25, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-7.7683272384817803185e-1, 2.0897180603218726575e-1, &r), 1.881590189544752977, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.9007825894244022613e+1, 8.0804305816981973945e-1, &r), 7.9534669124448258162e+79, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.224872379992519031, 9.4716012050013901355e-1, &r), 5.2709059549031973037e-1, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-5.0807600398060325807e+1, 6.1902119795226148946e-1, &r), 2.8318147090250448397e+89, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.2130610423140110162e+1, 7.2184881647444607846e-1, &r), -7.0593986791573883029e+67, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.1186300874143057513e+1, 1.3944550368322800884e-1, &r), 1.8718282789345414439e+95, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.1777582295815773824e+1, 7.6178874271077561762e-1, &r), -8.5399447567722731535e+27, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.2185912810368133222e+1, 3.959510541558671016e-1, &r), -1.8100903248905368685e+56, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.2976006083946226988e+1, 4.5739390828369379657e-1, &r), 1.4034454523109119588e+78, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.0412232215064606945e+1, 6.7510758855896918145e-1, &r), -6.8761190595978173779e+44, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.8388188389747281955e+1, 8.9233979909724013718e-1, &r), -3.3498674090203423756e+20, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.4298840569257253701e+1, 6.8042862360863559591e-1, &r), -3.0013837000776612869e+33, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.8834735272673504063e+1, 4.2324469410479691518e-1, &r), 1.2310766881467564871e+70, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.6091840934431606344e+1, 1.7508918790902548661e-1, &r), -2.946550933505149671e+104, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.9754264394942756728, 1.558717798933954111e-2, &r), -4.5906289772187980725e+3, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.7168594342366560374e+1, 6.976373865080374073e-1, &r), 1.8851114888349680045e+58, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.5379944292029245754e+1, 5.3150471205968938472e-2, &r), 4.1473845726043547937e+125, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.153181439556533474e+1, 1.8204366094125528818e-1, &r), -4.1102104914739582156e+17, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.9939680334734766385e+1, 8.132277926604580844e-1, &r), -4.9623796120191838477e+81, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.5986707652967270442e+1, 5.5665988728905782182e-1, &r), -3.058579118813851873e+59, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-6.7046620273111013832, 1.059530133767196237e-1, &r), 2.8547617693483259231e+10, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.154578607200052944e+1, 4.5282605452993561522e-1, &r), -4.6204765000245865931e+31, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.3955292370868357326e+1, 5.3774303067450442349e-1, &r), -3.285152670384139907e+35, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.2209824848466094111e+1, 5.9504757613868441576e-1, &r), -3.8856592501211432238e+50, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.0825185544715207495e+1, 7.5398610386439322567e-1, &r), 2.3035172984979776888e+64, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.1910588368134692781e+1, 5.1283495159288225414e-1, &r), -1.3438429765742294157e+52, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-6.7113819006700078322, 4.0393307486388760775e-1, &r), 3.8345193040174093796e+6, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.8693610985720627242e+1, 3.4777341593350738095e-1, &r), 1.2557150749869300709e+50, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.3640245743314574591e+1, 9.6025287507519664839e-1, &r), -3.8943763839931542689e+28, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.8083409800395899615e+1, 1.4391402197265332926e-1, &r), -9.9126133627220300984e+113, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.8105478052324389543e+1, 4.891514010318381566e-1, &r), -1.2271238830087142465e+66, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.5311996069559305006e+1, 9.5766172213158543809e-1, &r), 3.7577671642248517421e+31, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.0646798215967974621e+1, 9.3310976056897272996e-1, &r), 1.5913395046591416208e+41, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.9802221662384415773e+1, 8.0558698100484531078e-1, &r), -1.3410097300803423969e+61, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.6307175589532141033e+1, 8.5581965580057553716e-1, &r), -8.2913043528862589862e+72, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.0008133602203088381e+1, 8.8260963451522902618e-1, &r), -4.3184875964228242059e+8, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.2307910802466458785e+1, 6.782808128445430142e-1, &r), -1.4119756731193528077e+69, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.0130438814666196845e+1, 2.1277791687648788154e-1, &r), -1.02690311217639001e+15, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.9533803019889111726e+1, 3.9334897500975715385e-1, &r), -6.4704382293897894852e+28, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.3895956090712434265e+1, 8.0661260505451797979e-1, &r), -4.3815146159956971318e+14, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.4635165127833994625e+1, 3.7945739040607276532e-1, &r), 1.5929485514781295968e+20, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.8560967136543055351e+1, 7.9600892022399284277e-1, &r), 1.1465774145795382248e+39, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-6.2108119261932190115, 8.7806601388332832487e-1, &r), -7.4701969028629161594e+3, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-6.9950977953230716109, 5.8978625225697869088e-1, &r), 1.1808677382965817331e+6, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.2481246429363894157e+1, 7.2704916561624886813e-1, &r), -7.5667536238826222942e+11, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-5.020982518214251176e+1, 7.5109544046044664159e-1, &r), -7.9040859853121739692e+83, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-8.9473034048334154025, 6.4213370686611774774e-2, &r), 2.6029884691597775763e+17, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.834075672586642874e+1, 6.4258947909888861139e-1, &r), -5.8405580195454874797e+61, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.4411381704857813062e+1, 1.2743783697917866926e-1, &r), -3.1773798568513309515e+105, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-6.1687391291035845538, 7.8786722297686215495e-1, &r), -1.4219092995559599082e+4, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.0704293950958482287e+1, 3.8531626603275482749e-1, &r), 1.5743246247238302576e+13, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.0571445654620545043e+1, 3.4876986634505808892e-1, &r), 7.0385234557024272162e+76, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.3563863522003561189, 9.7999452783586835833e-1, &r), -3.1893996030425450694e+1, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.8492269674910402783e+1, 1.7152753186318347442e-1, &r), -6.0249928142043118768e+32, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.5363228484567149913e+1, 3.0542644930515794217e-1, &r), 1.3211507552477009856e+44, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.3771144161000489935e+1, 7.3346736008344405886e-1, &r), -8.3124988094143057824e+14, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.3761246233591030521e+1, 5.4968519162734822572e-1, &r), -6.0578774841300955332e+34, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.2634961325802757898e+1, 6.6471162507224558099e-1, &r), 3.2082973398317013106e+30, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.6563404270777516422e+1, 7.5273096421024420905e-1, &r), 3.7592589106971418602e+75, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.0848764148512049678e+1, 9.2286052929496267966e-1, &r), 3.2439553455961291223e+9, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.5455854142576014389e+1, 7.8971992208889605774e-1, &r), 1.3378630820768277448e+52, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.2013968530863113871e+1, 1.9744029176545173315e-1, &r), -1.584787479000820067e+19, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-5.6750075448691398076, 8.0444727938729491316e-1, &r), -2.10533382223663811e+3, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.8429830608986305295e+1, 8.2140563165026789468e-1, &r), -1.1405415108194473062e+21, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.346426407446347328e+1, 8.5111501099434108204e-1, &r), 8.7606083372225198285e+28, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.9593848458448579212e+1, 1.2641237816367966816e-1, &r), -6.4135079973931874203e+64, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.7086231381348987822e+1, 3.9893860083544831831e-1, &r), 7.515835122388342095e+24, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.8484417257406457732, 6.0748406712157845873e-1, &r), -2.7380610022426281822, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.1822890333552359573e+1, 5.0020129878524173631e-1, &r), -1.7231227888225767619e+52, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-6.2862753931112845805, 7.9353453932163968388e-1, &r), -1.342401423092805412e+4, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.5508352825172743548, 7.3200379508076835206e-1, &r), -4.0497851981930665643e-1, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-7.6325669923999446014, 6.3959118408264715884e-2, &r), -8.0591625416199259092e+13, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.7217355888852626548e+1, 8.2439297912634420605e-1, &r), 4.2640264465349061973e+55, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.9216632463077931365e+1, 2.1243165065073566651e-2, &r), 7.2753341407348563956e+121, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.0310494244455808579e+1, 5.6409661087945220564e-1, &r), -8.0236717760932647636e+27, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.2561355227860967802e+1, 6.1429304168687688441e-1, &r), 1.095939957156354534e+71, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.348280958534689123e+1, 1.3878791555680588964e-1, &r), 1.4127166630922246712e+47, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.266908051943509346, 9.1043177038683039605e-1, &r), 7.9342040586370876107, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.6453677594081999426e+1, 7.3766130024218803361e-1, &r), -2.8496103761067379068e+18, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.0292370302033138277e+1, 2.7545919896373212095e-1, &r), -9.9081192322574702806e+13, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.788826873303230097e+1, 2.2855276522975392381e-1, &r), -4.2068889321668479948e+53, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.1401875376696767087e+1, 6.6522142928175599046e-2, &r), 5.4702914219176701268e+108, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.9306765177660380865e+1, 2.0291343278160599375e-1, &r), 4.3752403877947450222e+34, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.9778989699515361126e+1, 5.0069816606055756877e-2, &r), -5.0144871285761887467e+77, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.3484350943085112332e+1, 2.5580340114657331489e-2, &r), 8.660979419407748338e+32, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.8885950309653823971e+1, 2.705230773944354062e-1, &r), 7.0729128795400209404e+102, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.6140505254948262834e+1, 5.635769797194365065e-1, &r), -1.691181704671511378e+39, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.36353791993838395e+1, 7.8601342847547894355e-1, &r), -4.184570564713370597e+30, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.8043892058273381078e+1, 9.6661631483018731188e-1, &r), -5.2799069238255343804e+54, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.0627792568626186656e+1, 2.7801894968851888201e-1, &r), 4.6951098613000862734e+34, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.7821819326414013127e+1, 7.0072053744106375522e-1, &r), -3.2969189837617817178e+59, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.1895350862490616295e+1, 6.3819566879323744549e-1, &r), -7.4877627933750167273e+12, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.1564822793166119652e+1, 8.7089052441788146841e-1, &r), -4.362095115786654673e+62, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-5.6988133455245986782, 1.0513161628614675752e-1, &r), -2.6315584241050780179e+8, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-5.04236829179067909, 2.1606414592833118122e-2, &r), 6.6460848251254935943e+10, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-8.5815569416794001464e-1, 3.2800854133020344342e-1, &r), 1.7278337309129555492, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-7.4540158508402344121, 3.3591301584669540366e-1, &r), 4.6958147873473343296e+7, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.1342269410012557907e+1, 7.2248859912133702972e-1, &r), 8.4210802265866850829e+65, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-4.0890888214378787004e+1, 4.6015468690527406659e-2, &r), 1.5760625185685568109e+114, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.4949019201278440062e+1, 5.5379096162817544569e-1, &r), 2.4017690399425079403e+57, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.5581474535040863099, 8.6545078146345742122e-1, &r), -4.2518863856194071801e-1, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-1.6450819423469368818e+1, 4.0968007844676920681e-1, &r), -4.7316334255824816328e+22, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-2.4534051152698170766e+1, 9.2462004307970597256e-1, &r), 8.0009048223739294629e+29, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-9.5846016059057764355, 1.4980322293854772757e-1, &r), -7.3726783694247075753e+14, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_bessel_Ynu_e, (-3.1840530425923939329e+1, 9.3847997261021697482e-1, &r), -3.8745468671462878671e+43, TEST_TOL2, GSL_SUCCESS); /* Inu */ 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-2.7.1/specfunc/test_coulomb.c0000644016036000116100000004243413441251001013675 00000000000000/* 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-2.7.1/specfunc/test_dilog.c0000644016036000116100000002727513441251001013341 00000000000000/* 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-2.7.1/specfunc/test_gamma.c0000644016036000116100000006774313441251001013331 00000000000000/* 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-2.7.1/specfunc/test_hermite.c0000644016036000116100000005615113472614725013717 00000000000000/* specfunc/test_hermite.c * * Copyright (C) 2011, 2012, 2013, 2014 Konrad Griessinger * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this 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_sf.h" #define WKB_TOL (1.0e+04 * TEST_SQRT_TOL0) /* * Test the identities: * * Sum_{k=0}^n (n choose k) (2 y)^{n - k} H_k(x) = H_n(x + y) * * and * * Sum_{k=0}^n (n choose k) y^{n-k} He_k(x) = He_n(x + y) * * see: http://mathworld.wolfram.com/HermitePolynomial.html (Eq. 55) */ void test_hermite_id1(const int n, const double x, const double y) { double *a = malloc((n + 1) * sizeof(double)); double *b = malloc((n + 1) * sizeof(double)); double lhs, rhs; int k; a[0] = gsl_pow_int(2.0 * y, n); b[0] = gsl_pow_int(y, n); for (k = 1; k <= n; ++k) { double fac = (n - k + 1.0) / (k * y); a[k] = 0.5 * fac * a[k - 1]; b[k] = fac * b[k - 1]; } lhs = gsl_sf_hermite_series(n, x, a); rhs = gsl_sf_hermite(n, x + y); gsl_test_rel(lhs, rhs, TEST_TOL4, "identity1 phys n=%d x=%g y=%g", n, x, y); lhs = gsl_sf_hermite_prob_series(n, x, b); rhs = gsl_sf_hermite_prob(n, x + y); gsl_test_rel(lhs, rhs, TEST_TOL3, "identity1 prob n=%d x=%g y=%g", n, x, y); free(a); free(b); } int test_hermite(void) { gsl_sf_result r; int s = 0; int m, n, sa; double res[256]; double x; const double aizero1 = -2.3381074104597670384891972524467; /* first zero of the Airy function Ai */ /* test some known identities */ test_hermite_id1(10, 0.75, 0.33); test_hermite_id1(8, -0.75, 1.20); test_hermite_id1(7, 2.88, -3.2); TEST_SF(s, gsl_sf_hermite_prob_e, (0, 0.75, &r), 1., TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_prob_e, (1, 0.75, &r), 0.75, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_prob_e, (25, 0., &r), 0., TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_prob_e, (28, 0., &r), 2.13458046676875e14, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_prob_e, (30, 0., &r), -6.190283353629375e15, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_prob_e, (25, 0.75, &r), -1.08128685847680748265939328423e12, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_prob_e, (28, 0.75, &r), -1.60620252094658918105511125135e14, TEST_TOL0, GSL_SUCCESS); TEST_SF_RETURN(s, gsl_sf_hermite_prob_e, (2800, 0.75, &r), GSL_EOVRFLW); TEST_SF_RETURN(s, gsl_sf_hermite_prob_e, (2800, 1.75, &r), GSL_EOVRFLW); TEST_SF(s, gsl_sf_hermite_prob_deriv_e, (225, 128, 0.75, &r), 0., TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_prob_deriv_e, (5, 128, 0.75, &r), -3.0288278964712702882066404e112, TEST_TOL1, GSL_SUCCESS); x = 0.75; sa = 0; gsl_sf_hermite_prob_array(0, x, res); TEST_SF_VAL(sa, res[0], +0.0, 1.0, TEST_TOL0); gsl_test(sa, "gsl_sf_hermite_prob_array(0, 0.75)"); s += sa; sa = 0; gsl_sf_hermite_prob_array(1, x, res); TEST_SF_VAL(sa, res[0], +0.0, 1.0, TEST_TOL0); TEST_SF_VAL(sa, res[1], +0.0, x, TEST_TOL0); gsl_test(sa, "gsl_sf_hermite_prob_array(1, 0.75)"); s += sa; sa = 0; gsl_sf_hermite_prob_array(100, x, res); TEST_SF_VAL(sa, res[0], +0.0, 1.0, TEST_TOL0); TEST_SF_VAL(sa, res[1], +0.0, x, TEST_TOL0); TEST_SF_VAL(sa, res[10], +0.0, 823.810509681701660156250, TEST_TOL0); TEST_SF_VAL(sa, res[100], +0.0, 1.03749254986255755872498e78, TEST_TOL1); gsl_test(sa, "gsl_sf_hermite_prob_array(100, 0.75)"); s += sa; sa = 0; gsl_sf_hermite_prob_array_deriv(0, 100, 0.75, res); TEST_SF_VAL(sa, res[0], +0.0, 1.0, TEST_TOL0); TEST_SF_VAL(sa, res[10], +0.0, 823.810509681701660156250, TEST_TOL0); TEST_SF_VAL(sa, res[100], +0.0, 1.03749254986255755872498e78, TEST_TOL1); gsl_test(sa, "gsl_sf_hermite_prob_array_deriv(0, 100, 0.75)"); s += sa; sa = 0; gsl_sf_hermite_prob_array_deriv(1000, 100, 0.75, res); TEST_SF_VAL(sa, res[0], +0.0, 0.0, TEST_TOL0); TEST_SF_VAL(sa, res[10], +0.0, 0.0, TEST_TOL0); TEST_SF_VAL(sa, res[100], +0.0, 0.0, TEST_TOL0); gsl_test(sa, "gsl_sf_hermite_prob_array_deriv(1000, 100, 0.75)"); s += sa; sa = 0; gsl_sf_hermite_prob_array_deriv(99, 100, 0.75, res); TEST_SF_VAL(sa, res[0], +0.0, 0.0, TEST_TOL0); TEST_SF_VAL(sa, res[10], +0.0, 0.0, TEST_TOL0); TEST_SF_VAL(sa, res[99], +0.0, 9.332621544394415268169923886e155, TEST_TOL0); TEST_SF_VAL(sa, res[100], +0.0, 6.999466158295811451127442914e157, TEST_TOL0); gsl_test(sa, "gsl_sf_hermite_prob_array_deriv(99, 100, 0.75)"); s += sa; sa = 0; gsl_sf_hermite_prob_array_deriv(100, 100, 0.75, res); TEST_SF_VAL(sa, res[0], +0.0, 0.0, TEST_TOL0); TEST_SF_VAL(sa, res[10], +0.0, 0.0, TEST_TOL0); TEST_SF_VAL(sa, res[100], +0.0, 9.332621544394415268169923886e157, TEST_TOL0); gsl_test(sa, "gsl_sf_hermite_prob_array_deriv(100, 100, 0.75)"); s += sa; sa = 0; gsl_sf_hermite_prob_array_deriv(23, 100, 0.75, res); TEST_SF_VAL(sa, res[10], +0.0, 0.0, TEST_TOL0); TEST_SF_VAL(sa, res[23], +0.0, 2.5852016738884976640000000000e22, TEST_TOL0); TEST_SF_VAL(sa, res[24], +0.0, 4.6533630129992957952000000000e23, TEST_TOL0); TEST_SF_VAL(sa, res[37], +0.0, 2.3592417210568968566591219172e37, TEST_TOL0); TEST_SF_VAL(sa, res[60], +0.0, -9.2573208827175536243052086845e59, TEST_TOL0); TEST_SF_VAL(sa, res[61], +0.0, 5.6259625429686219137261735305e59, TEST_TOL1); TEST_SF_VAL(sa, res[100], +0.0, 2.6503570965896336273549197e100, TEST_TOL0); gsl_test(sa, "gsl_sf_hermite_prob_array_deriv(23, 37, 0.75)"); s += sa; sa = 0; gsl_sf_hermite_prob_deriv_array(100, 50, x, res); TEST_SF_VAL(sa, res[0], +0.0, -3.88338863813139372375411561e31, TEST_TOL0); TEST_SF_VAL(sa, res[1], +0.0, -4.04757862431646677625108652e32, TEST_TOL1); TEST_SF_VAL(sa, res[10], +0.0, 7.9614368698398116765703194e38, TEST_TOL0); TEST_SF_VAL(sa, res[30], +0.0, -9.1416928183915197188795338e54, TEST_TOL0); TEST_SF_VAL(sa, res[100], +0.0, 0.0, TEST_TOL0); gsl_test(sa, "gsl_sf_hermite_prob_deriv_array(100, 50, 0.75)"); s += sa; n = 128; res[0] = 1.; for(m=1; m<=n; m++){ res[m] = res[m-1]/2.; } TEST_SF(s, gsl_sf_hermite_prob_series_e, (n, x, res, &r), -4.0451066556993485405907339548e68, TEST_TOL0, GSL_SUCCESS); /* phys */ x = 0.75; TEST_SF(s, gsl_sf_hermite_e, (0, 0.75, &r), 1.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_e, (1, 0.75, &r), 1.5, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_e, (25, 0., &r), 0., TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_e, (28, 0., &r), 3.497296636753920000e18, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_e, (30, 0., &r), -2.028432049317273600e20, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_e, (25, 0.75, &r), -9.7029819451106077507781088352e15, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_e, (28, 0.75, &r), 3.7538457078067672096408339776e18, TEST_TOL0, GSL_SUCCESS); TEST_SF_RETURN(s, gsl_sf_hermite_e, (2800, 0.75, &r), GSL_EOVRFLW); TEST_SF_RETURN(s, gsl_sf_hermite_e, (2800, 10.1, &r), GSL_EOVRFLW); TEST_SF(s, gsl_sf_hermite_deriv_e, (225, 128, 0.75, &r), 0., TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_deriv_e, (5, 128, 0.75, &r), 2.89461215568095657569833e132, TEST_TOL0, GSL_SUCCESS); x = 0.75; sa = 0; gsl_sf_hermite_array(0, x, res); TEST_SF_VAL(sa, res[0], +0.0, 1.0, TEST_TOL0); gsl_test(sa, "gsl_sf_hermite_array(0, 0.75)"); s += sa; sa = 0; gsl_sf_hermite_array(1, x, res); TEST_SF_VAL(sa, res[0], +0.0, 1.0, TEST_TOL0); TEST_SF_VAL(sa, res[1], +0.0, 2.*x, TEST_TOL0); gsl_test(sa, "gsl_sf_hermite_array(1, 0.75)"); s += sa; sa = 0; gsl_sf_hermite_array(100, x, res); TEST_SF_VAL(sa, res[0], +0.0, 1.0, TEST_TOL0); TEST_SF_VAL(sa, res[1], +0.0, 2.0*x, TEST_TOL0); TEST_SF_VAL(sa, res[10], +0.0, 38740.4384765625, TEST_TOL0); TEST_SF_VAL(sa, res[100], +0.0, -1.4611185395125104593177790757e93, TEST_TOL0); gsl_test(sa, "gsl_sf_hermite_array(100, 0.75)"); s += sa; sa = 0; gsl_sf_hermite_array_deriv(0, 100, 0.75, res); TEST_SF_VAL(sa, res[0], +0.0, 1.0, TEST_TOL0); TEST_SF_VAL(sa, res[10], +0.0, 38740.4384765625, TEST_TOL0); TEST_SF_VAL(sa, res[100], +0.0, -1.4611185395125104593177790757e93, TEST_TOL0); gsl_test(sa, "gsl_sf_hermite_array_deriv(0, 100, 0.75)"); s += sa; sa = 0; gsl_sf_hermite_array_deriv(1000, 100, 0.75, res); TEST_SF_VAL(sa, res[0], +0.0, 0.0, TEST_TOL0); TEST_SF_VAL(sa, res[10], +0.0, 0.0, TEST_TOL0); TEST_SF_VAL(sa, res[100], +0.0, 0.0, TEST_TOL0); gsl_test(sa, "gsl_sf_hermite_array_deriv(1000, 100, 0.75)"); s += sa; sa = 0; gsl_sf_hermite_array_deriv(99, 100, 0.75, res); TEST_SF_VAL(sa, res[0], +0.0, 0.0, TEST_TOL0); TEST_SF_VAL(sa, res[10], +0.0, 0.0, TEST_TOL0); TEST_SF_VAL(sa, res[99], +0.0, 5.915251651227242890408570128e185, TEST_TOL0); TEST_SF_VAL(sa, res[100], +0.0, 8.872877476840864335612855192e187, TEST_TOL0); gsl_test(sa, "gsl_sf_hermite_array_deriv(99, 100, 0.75)"); s += sa; sa = 0; gsl_sf_hermite_array_deriv(100, 100, 0.75, res); TEST_SF_VAL(sa, res[0], +0.0, 0.0, TEST_TOL0); TEST_SF_VAL(sa, res[10], +0.0, 0.0, TEST_TOL0); TEST_SF_VAL(sa, res[100], +0.0, 1.183050330245448578081714026e188, TEST_TOL0); gsl_test(sa, "gsl_sf_hermite_array_deriv(100, 100, 0.75)"); s += sa; sa = 0; gsl_sf_hermite_array_deriv(23, 100, 0.75, res); TEST_SF_VAL(sa, res[10], +0.0, 0.0, TEST_TOL0); TEST_SF_VAL(sa, res[23], +0.0, 2.168624344319444261221171200e29, TEST_TOL0); TEST_SF_VAL(sa, res[24], +0.0, 7.807047639549999340396216320e30, TEST_TOL0); TEST_SF_VAL(sa, res[37], +0.0, 1.930387357696033719818118732e46, TEST_TOL0); TEST_SF_VAL(sa, res[60], +0.0, 6.775378005383186748501182409e71, TEST_TOL0); TEST_SF_VAL(sa, res[61], +0.0, -4.451215867508936256056845902e73, TEST_TOL0); TEST_SF_VAL(sa, res[100], +0.0, 2.957966000491202678467161e118, TEST_TOL0); gsl_test(sa, "gsl_sf_hermite_array_deriv(23, 100, 0.75)"); s += sa; sa = 0; gsl_sf_hermite_deriv_array(100, 50, x, res); TEST_SF_VAL(sa, res[0], +0.0, -8.26632218305863100726861832e38, TEST_TOL0); TEST_SF_VAL(sa, res[1], +0.0, 2.40954750392844799126151557e40, TEST_TOL0); TEST_SF_VAL(sa, res[10], +0.0, 1.52281030265187793605875604e49, TEST_TOL0); TEST_SF_VAL(sa, res[30], +0.0, 9.52199419132990437892101915e65, TEST_TOL0); TEST_SF_VAL(sa, res[100], +0.0, 0.0, TEST_TOL0); gsl_test(sa, "gsl_sf_hermite_deriv_array(100, 50, 0.75)"); s += sa; n = 128; /* arbitrary weights */ res[0] = 1.; for(m=1; m<=n; m++){ res[m] = res[m-1]/2.; } TEST_SF(s, gsl_sf_hermite_series_e, (n, x, res, &r), 1.07772223811696567390619566842e88, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_e, (0, 1.3, &r), 0.322651504564963746879400858624, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_fast_e, (0, 1.3, &r), 0.322651504564963746879400858624, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_e, (1, 1.3, &r), 0.593187573778613235895531272243, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_fast_e, (1, 1.3, &r), 0.593187573778613235895531272243, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_e, (1, -1.3, &r), -0.593187573778613235895531272243, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_fast_e, (1, -1.3, &r), -0.593187573778613235895531272243, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_e, (27, 0, &r), 0.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_fast_e, (27, 0, &r), 0.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_e, (28, 0, &r), 0.290371943657199641200016132937, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_fast_e, (28, 0, &r), 0.290371943657199641200016132937, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_e, (28, 0.75, &r), 0.23526280808621240649319140441, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_fast_e, (28, 0.75, &r), 0.23526280808621240649319140441, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_e, (200, 0.75, &r), -0.13725356483699291817038427801, TEST_TOL3, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_fast_e, (200, 0.75, &r), -0.13725356483699291817038427801, TEST_TOL3, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_e, (100028, 0.75, &r), -0.02903467369856961147236598086, TEST_TOL4, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_fast_e, (100028, 0.75, &r), -0.02903467369856961147236598086, TEST_TOL5, GSL_SUCCESS); n = 10025; x = ((sqrt(2*n+1.)+aizero1/pow(8.*n,1/6.))/2.5); TEST_SF(s, gsl_sf_hermite_func_e, (n, x, &r), -0.05301278920004176459797680403, TEST_TOL4, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_fast_e, (n, x, &r), -0.05301278920004176459797680403, TEST_TOL4, GSL_SUCCESS); n = 10028; x = ((sqrt(2*n+1.)+aizero1/pow(8.*n,1/6.))/2.5); TEST_SF(s, gsl_sf_hermite_func_e, (n, x, &r), 0.06992968509693993526829596970, TEST_TOL3, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_fast_e, (n, x, &r), 0.06992968509693993526829596970, TEST_TOL3, GSL_SUCCESS); n = 10025; x = (sqrt(2*n+1.)-(aizero1/pow(8.*n,1/6.))/2.5); TEST_SF(s, gsl_sf_hermite_func_e, (n, x, &r), 0.08049000991742150521366671021, TEST_TOL4, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_fast_e, (n, x, &r), 0.08049000991742150521366671021, TEST_TOL4, GSL_SUCCESS); n = 10028; x = (sqrt(2*n+1.)-(aizero1/pow(8.*n,1/6.))/2.5); TEST_SF(s, gsl_sf_hermite_func_e, (n, x, &r), 0.08048800667512084252723933250, TEST_TOL4, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_fast_e, (n, x, &r), 0.08048800667512084252723933250, TEST_TOL4, GSL_SUCCESS); n = 10025; x = (sqrt(2*n+1.)-2.5*(aizero1/pow(8.*n,1/6.))); TEST_SF(s, gsl_sf_hermite_func_e, (n, x, &r), 7.97206830806663013555068100e-6, TEST_TOL4, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_fast_e, (n, x, &r), 7.97206830806663013555068100e-6, 1.0e-9, GSL_SUCCESS); n = 10028; x = (sqrt(2*n+1.)-2.5*(aizero1/pow(8.*n,1/6.))); TEST_SF(s, gsl_sf_hermite_func_e, (n, x, &r), 7.97188517397786729928465829e-6, TEST_TOL4, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_fast_e, (n, x, &r), 7.97188517397786729928465829e-6, 1.0e-8, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_e, (10000, 60.0, &r), 0.03162606955427450540143292572, TEST_TOL3, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_fast_e, (10000, 60.0, &r), 0.03162606955427450540143292572, TEST_TOL4, GSL_SUCCESS); x = 0.75; sa = 0; gsl_sf_hermite_func_array(100, x, res); TEST_SF_VAL(sa, res[0], +0.0, 0.566979307027693616978839335983, TEST_TOL0); TEST_SF_VAL(sa, res[1], +0.0, 0.601372369187597546203014795470, TEST_TOL0); TEST_SF_VAL(sa, res[10], +0.0, 0.360329854170806945032958735574, TEST_TOL0); TEST_SF_VAL(sa, res[100], +0.0, -0.07616422890563462489003733382, TEST_TOL1); gsl_test(sa, "gsl_sf_hermite_func_array(100, 0.75)"); s += sa; sa = 0; gsl_sf_hermite_func_array(250, 20.0, res); TEST_SF_VAL(sa, res[199], +0.0, 0.254621970261340422399150964119, TEST_TOL2); TEST_SF_VAL(sa, res[200], +0.0, 0.288364948026205642290411878357, TEST_TOL2); TEST_SF_VAL(sa, res[210], +0.0, 0.266625427572822255774117774166, TEST_TOL2); TEST_SF_VAL(sa, res[220], +0.0, -0.296028413764592652216845612832, TEST_TOL2); TEST_SF_VAL(sa, res[230], +0.0, 0.229657495510699141971182819560, TEST_TOL2); TEST_SF_VAL(sa, res[240], +0.0, -0.024027870622288819185159269632, TEST_TOL2); TEST_SF_VAL(sa, res[250], +0.0, -0.236101289420398152417654177998, TEST_TOL2); gsl_test(sa, "gsl_sf_hermite_func_array(250, 20.0)"); s += sa; n = 128; /* arbitrary weights */ res[0] = 1.; for(m=1; m<=n; m++){ res[m] = res[m-1]/2.; } TEST_SF(s, gsl_sf_hermite_func_series_e, (n, x, res, &r), 0.81717103529960997134154552556, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_der_e, (0, 28, 0.75, &r), 0.235262808086212406493191404, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_der_e, (1, 28, 0.75, &r), 1.289485094958329643927802330, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_der_e, (2, 28, 0.75, &r), -13.27764473136561269145948989, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_der_e, (3, 28, 0.75, &r), -72.42242083458141066943555691, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_der_e, (4, 28, 0.75, &r), 753.6960554274941800190147503, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_der_e, (5, 28, 0.75, &r), 4035.32788513029308540826835, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_der_e, (0, 380, 0.75, &r), -0.0400554661321992411631174, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_der_e, (1, 380, 0.75, &r), -4.0417244263030600591206553, TEST_TOL1, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_der_e, (2, 380, 0.75, &r), 30.4596785269042604519780923, TEST_TOL2, GSL_SUCCESS); TEST_SF(s, gsl_sf_hermite_func_der_e, (3, 380, 0.75, &r), 3073.4187352276349348458186556, TEST_TOL2, GSL_SUCCESS); { /* positive zeros of the probabilists' Hermite polynomial of order 17 */ double He17z[8] = { 0.751842600703896170737870774614, 1.50988330779674075905491513417, 2.28101944025298889535537879396, 3.07379717532819355851658337833, 3.90006571719800990903311840097, 4.77853158962998382710540812497, 5.74446007865940618125547815768,6.88912243989533223256205432938 }; n = 17; for (m=1; m<=n/2; m++) { TEST_SF(s, gsl_sf_hermite_prob_zero_e, (n, m, &r), He17z[m-1], TEST_TOL0, GSL_SUCCESS); } } { /* positive zeros of the probabilists' Hermite polynomial of order 18 */ double He18z[9] = { 0.365245755507697595916901619097, 1.09839551809150122773848360538, 1.83977992150864548966395498992, 2.59583368891124032910545091458, 3.37473653577809099529779309480, 4.18802023162940370448450911428, 5.05407268544273984538327527397, 6.00774591135959752029303858752, 7.13946484914647887560975631213 }; n = 18; for (m=1; m<=n/2; m++) { TEST_SF(s, gsl_sf_hermite_prob_zero_e, (n, m, &r), He18z[m-1], TEST_TOL0, GSL_SUCCESS); } } { /* positive zeros of the probabilists' Hermite polynomial of order 23 */ double He23z[11] = { 0.648471153534495816722576841197, 1.29987646830397886997876116860, 1.95732755293342410739100839243, 2.62432363405918177067330340783, 3.30504002175296456723204112903, 4.00477532173330406712238633738, 4.73072419745147329426707133987, 5.49347398647179412855289367747, 6.31034985444839982842886078177, 7.21465943505186138595859194492, 8.29338602741735258945596770157 }; n = 23; for (m=1; m<=n/2; m++) { TEST_SF(s, gsl_sf_hermite_prob_zero_e, (n, m, &r), He23z[m-1], TEST_TOL0, GSL_SUCCESS); } } { /* positive zeros of the probabilists' Hermite polynomial of order 24 */ double He24z[12] = { 0.317370096629452319318170455994, 0.953421922932109084904629632351, 1.59348042981642010695074168129, 2.24046785169175236246653790858, 2.89772864322331368932008199475, 3.56930676407356024709649151613, 4.26038360501990548884317727406, 4.97804137463912033462166468006, 5.73274717525120114834341822330, 6.54167500509863444148277523364, 7.43789066602166310850331715501, 8.50780351919525720508386233432 }; n = 24; for (m=1; m<=n/2; m++) { TEST_SF(s, gsl_sf_hermite_prob_zero_e, (n, m, &r), He24z[m-1], TEST_TOL0, GSL_SUCCESS); } } { /* positive zeros of the physicists' Hermite polynomial of order 17 */ double H17z[8] = { 0.531633001342654731349086553718, 1.06764872574345055363045773799, 1.61292431422123133311288254454, 2.17350282666662081927537907149, 2.75776291570388873092640349574, 3.37893209114149408338327069289, 4.06194667587547430689245559698, 4.87134519367440308834927655662 }; n = 17; for (m=1; m<=n/2; m++) { TEST_SF(s, gsl_sf_hermite_zero_e, (n, m, &r), H17z[m-1], TEST_TOL0, GSL_SUCCESS); } } { /* positive zeros of the physicists' Hermite polynomial of order 18 */ double H18z[9] = { 0.258267750519096759258116098711, 0.776682919267411661316659462284, 1.30092085838961736566626555439, 1.83553160426162889225383944409, 2.38629908916668600026459301424, 2.96137750553160684477863254906, 3.57376906848626607950067599377, 4.24811787356812646302342016090, 5.04836400887446676837203757885 }; n = 18; for (m=1; m<=n/2; m++) { TEST_SF(s, gsl_sf_hermite_zero_e, (n, m, &r), H18z[m-1], TEST_TOL0, GSL_SUCCESS); } } { /* positive zeros of the physicists' Hermite polynomial of order 23 */ double H23z[11] = { 0.458538350068104797757887329284, 0.919151465442563765431719239593, 1.38403958568249523732634717118, 1.85567703767137106251504753718, 2.33701621147445578644623502174, 2.83180378712615690144806140734, 3.34512715994122457247439814585, 3.88447270810610186607248760288, 4.46209117374000667673186157071, 5.10153461047667712968749766165, 5.86430949898457256538748413474 }; n = 23; for (m=1; m<=n/2; m++) { TEST_SF(s, gsl_sf_hermite_zero_e, (n, m, &r), H23z[m-1], TEST_TOL0, GSL_SUCCESS); } } { /* positive zeros of the physicists' Hermite polynomial of order 24 */ double H24z[12] = { 0.224414547472515585151136715527, 0.674171107037212236000245923730, 1.12676081761124507213306126773, 1.58425001096169414850563336202, 2.04900357366169891178708399532, 2.52388101701142697419907602333, 3.01254613756556482565453858421, 3.52000681303452471128987227609, 4.05366440244814950394766297923, 4.62566275642378726504864923776, 5.25938292766804436743072304398, 6.01592556142573971734857350899 }; n = 24; for (m=1; m<=n/2; m++) { TEST_SF(s, gsl_sf_hermite_zero_e, (n, m, &r), H24z[m-1], TEST_TOL0, GSL_SUCCESS); } } n = 2121; x = -1.*n; res[0] = (double) n; sa = 0; for (m=1; m<=n/2; m++) { gsl_sf_hermite_prob_zero_e(n, m, &r); if (x>=r.val) { sa += TEST_SF_INCONS; printf("sanity check failed! (gsl_sf_hermite_prob_zero)\n"); } res[0] = GSL_MIN(res[0],fabs(x-r.val)); x = r.val; } gsl_test(sa, "gsl_sf_hermite_prob_zero(n, m, r)"); n = 2121; x = -1.*n; res[0] = (double) n; sa = 0; for (m=1; m<=n/2; m++) { gsl_sf_hermite_zero_e(n, m, &r); if (x>=r.val) { sa += TEST_SF_INCONS; printf("sanity check failed! (gsl_sf_hermite_zero)\n"); } res[0] = GSL_MIN(res[0],fabs(x-r.val)); x = r.val; } gsl_test(sa, "gsl_sf_hermite_zero(n, m, r)"); return s; } gsl-2.7.1/specfunc/test_hyperg.c0000644016036000116100000015065113441251001013534 00000000000000/* 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-2.7.1/specfunc/test_legendre.c0000644016036000116100000014435014151556700014037 00000000000000/* 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]) < 1.0e3 * GSL_DBL_EPSILON) gsl_test_abs(p[i], p2[i], 1.0e-10, "%s deriv2 i=%zu", desc, i); else 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 <= (size_t) 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, "legendre unnorm l=%zu, m=0, x=%f", l, x); gsl_test_rel(dp[idx], dp_schmidt[idx], 1.0e-10, "legendre unnorm deriv l=%zu, m=0, x=%f", l, x); if (l > 1) { gsl_test_rel(d2p[idx], d2p_schmidt[idx], 1.0e-10, "legendre unnorm deriv2 l=%zu, m=0, x=%f", l, x); } else { gsl_test_abs(d2p[idx], d2p_schmidt[idx], 1.0e-10, "legendre 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, "legendre unnorm l=%zu, m=%zu, x=%f", l, m, x); gsl_test_abs(a_lm * dp[idx], dp_schmidt[idx], 1.0e-10, "legendre unnorm deriv l=%zu, m=%zu, x=%f", l, m, x); gsl_test_abs(a_lm * d2p[idx], d2p_schmidt[idx], 1.0e-10, "legendre 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 <= (size_t) 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-2.7.1/specfunc/test_mathieu.c0000644016036000116100000002362213441251001013667 00000000000000/* 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-2.7.1/specfunc/test_sincos_pi.c0000644016036000116100000002277513441251001014231 00000000000000/* specfunc/test_sincos_pi.c * * Copyright (C) 2017 Konrad Griessinger * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Author: Konrad Griessinger */ #include #include #include #include #include #include #include #include #include #include "test_sf.h" /* Any double precision number bigger than this is automatically an even integer. */ #define BIGDBL (2.0 / GSL_DBL_EPSILON) int test_sincos_pi(void) { gsl_sf_result r; int s = 0; int k = 0, kmax = 12; double x = 0.0, ix = 0.0, fx = 0.0, exact = 0.0; /* sin_pi tests */ fx = 0.5; exact = 1.0; TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); fx = -0.5; exact = -1.0; TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); fx = 1.5; exact = -1.0; TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); fx = -1.5; exact = 1.0; TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); fx = 2.5; exact = 1.0; TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); fx = -2.5; exact = -1.0; TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); fx = 3.5; exact = -1.0; TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); fx = -3.5; exact = 1.0; TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); fx = 0.375; exact = 0.923879532511286756128183189397; TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); fx = -0.375; exact = -0.923879532511286756128183189397; TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); fx = 0.0; exact = 0.0; ix = 0.0; for (k=0; k= BIGDBL ) ) break; printf("ix+fx= %.18e\n", ix+fx); TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); ix += 101.0; exact = -exact; } fx = -0.0625; exact = -0.195090322016128267848284868477; ix = LONG_MIN - 1.0; ix -= fabs(fmod(ix,2.0)); /* make sure of even number */ for (k=0; k= BIGDBL ) ) break; printf("ix+fx= %.18e\n", ix+fx); TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); ix -= 101.0; exact = -exact; } /* cos_pi tests */ ix = 0.0; fx = 0.0; exact = 1.0; TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); fx = 1.0; exact = -1.0; TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); fx = -1.0; exact = -1.0; TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); fx = 2.0; exact = 1.0; TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); fx = -2.0; exact = 1.0; TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); fx = 3.0; exact = -1.0; TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); fx = -3.0; exact = -1.0; TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); fx = 0.375; exact = 0.382683432365089771728459984030; TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); fx = -0.375; exact = 0.382683432365089771728459984030; TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); fx = 0.0; exact = 1.0; ix = 0.0; for (k=0; k= BIGDBL ) ) break; TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); ix += 101.0; exact = -exact; } fx = -0.0625; exact = 0.980785280403230449126182236134; ix = LONG_MIN - 1.0; ix -= fabs(fmod(ix,2.0)); /* make sure of even number */ for (k=0; k= BIGDBL ) ) break; TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS); ix -= 101.0; exact = -exact; } return s; } gsl-2.7.1/dht/0000755016036000116100000000000014151602575010073 500000000000000gsl-2.7.1/dht/Makefile.am0000644016036000116100000000062213373111454012043 00000000000000noinst_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-2.7.1/dht/gsl_dht.h0000644016036000116100000000513213626554242011614 00000000000000/* 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__ #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_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-2.7.1/dht/Makefile.in0000644016036000116100000010506014151557214012061 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/dht.Plo ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/dht.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/dht.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/dht/ChangeLog0000644016036000116100000000070513373111454011563 000000000000002009-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-2.7.1/dht/dht.c0000644016036000116100000001136013373111454010733 00000000000000/* 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-2.7.1/dht/test.c0000644016036000116100000001204113135126237011131 00000000000000/* 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-2.7.1/qrng/0000755016036000116100000000000014151602575010263 500000000000000gsl-2.7.1/qrng/Makefile.am0000644016036000116100000000064213373111456012237 00000000000000noinst_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-2.7.1/qrng/gsl_qrng.h0000644016036000116100000000446313373111456012175 00000000000000/* 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-2.7.1/qrng/Makefile.in0000644016036000116100000010702714151557215012257 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/halton.Plo ./$(DEPDIR)/inline.Plo \ ./$(DEPDIR)/niederreiter-2.Plo ./$(DEPDIR)/qrng.Plo \ ./$(DEPDIR)/reversehalton.Plo ./$(DEPDIR)/sobol.Plo \ ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/niederreiter-2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qrng.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reversehalton.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sobol.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/halton.Plo -rm -f ./$(DEPDIR)/inline.Plo -rm -f ./$(DEPDIR)/niederreiter-2.Plo -rm -f ./$(DEPDIR)/qrng.Plo -rm -f ./$(DEPDIR)/reversehalton.Plo -rm -f ./$(DEPDIR)/sobol.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/halton.Plo -rm -f ./$(DEPDIR)/inline.Plo -rm -f ./$(DEPDIR)/niederreiter-2.Plo -rm -f ./$(DEPDIR)/qrng.Plo -rm -f ./$(DEPDIR)/reversehalton.Plo -rm -f ./$(DEPDIR)/sobol.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/qrng/ChangeLog0000644016036000116100000000227713373111456011763 000000000000002009-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-2.7.1/qrng/TODO0000644016036000116100000000113213373111456010666 00000000000000# -*- 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-2.7.1/qrng/qrng.c0000644016036000116100000000401513373111456011314 00000000000000/* 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-2.7.1/qrng/niederreiter-2.c0000644016036000116100000002161413135126237013170 00000000000000/* 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-2.7.1/qrng/sobol.c0000644016036000116100000001442213135126237011465 00000000000000/* 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-2.7.1/qrng/halton.c0000644016036000116100000002415213373111456011636 00000000000000/* 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-2.7.1/qrng/reversehalton.c0000644016036000116100000002463013373111456013233 00000000000000/* 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-2.7.1/qrng/inline.c0000644016036000116100000000034613373111456011626 00000000000000/* Author: G. Jungman */ #include #include #include #include /* Compile all the inline functions */ #define COMPILE_INLINE_STATIC #include "build.h" #include gsl-2.7.1/qrng/test.c0000644016036000116100000001505113373111456011326 00000000000000/* 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-2.7.1/rng/0000755016036000116100000000000014151602576010103 500000000000000gsl-2.7.1/rng/Makefile.am0000644016036000116100000000172313373111456012057 00000000000000noinst_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-2.7.1/rng/schrage.c0000644016036000116100000000352213135126237011601 00000000000000/* 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-2.7.1/rng/gsl_rng.h0000644016036000116100000001545513373111456011636 00000000000000/* 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-2.7.1/rng/Makefile.in0000644016036000116100000012554214151557215012100 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/borosh13.Plo ./$(DEPDIR)/cmrg.Plo \ ./$(DEPDIR)/coveyou.Plo ./$(DEPDIR)/default.Plo \ ./$(DEPDIR)/file.Plo ./$(DEPDIR)/fishman18.Plo \ ./$(DEPDIR)/fishman20.Plo ./$(DEPDIR)/fishman2x.Plo \ ./$(DEPDIR)/gfsr4.Plo ./$(DEPDIR)/inline.Plo \ ./$(DEPDIR)/knuthran.Plo ./$(DEPDIR)/knuthran2.Plo \ ./$(DEPDIR)/knuthran2002.Plo ./$(DEPDIR)/lecuyer21.Plo \ ./$(DEPDIR)/minstd.Plo ./$(DEPDIR)/mrg.Plo ./$(DEPDIR)/mt.Plo \ ./$(DEPDIR)/r250.Plo ./$(DEPDIR)/ran0.Plo ./$(DEPDIR)/ran1.Plo \ ./$(DEPDIR)/ran2.Plo ./$(DEPDIR)/ran3.Plo ./$(DEPDIR)/rand.Plo \ ./$(DEPDIR)/rand48.Plo ./$(DEPDIR)/random.Plo \ ./$(DEPDIR)/randu.Plo ./$(DEPDIR)/ranf.Plo \ ./$(DEPDIR)/ranlux.Plo ./$(DEPDIR)/ranlxd.Plo \ ./$(DEPDIR)/ranlxs.Plo ./$(DEPDIR)/ranmar.Plo \ ./$(DEPDIR)/rng.Plo ./$(DEPDIR)/slatec.Plo \ ./$(DEPDIR)/taus.Plo ./$(DEPDIR)/taus113.Plo \ ./$(DEPDIR)/test.Po ./$(DEPDIR)/transputer.Plo \ ./$(DEPDIR)/tt.Plo ./$(DEPDIR)/types.Plo ./$(DEPDIR)/uni.Plo \ ./$(DEPDIR)/uni32.Plo ./$(DEPDIR)/vax.Plo \ ./$(DEPDIR)/waterman14.Plo ./$(DEPDIR)/zuf.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmrg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coveyou.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/default.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fishman18.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fishman20.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fishman2x.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfsr4.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/knuthran.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/knuthran2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/knuthran2002.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lecuyer21.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minstd.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mrg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mt.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r250.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ran0.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ran1.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ran2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ran3.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rand.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rand48.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/random.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/randu.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ranf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ranlux.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ranlxd.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ranlxs.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ranmar.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rng.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slatec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/taus.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/taus113.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transputer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tt.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/types.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uni.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uni32.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vax.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/waterman14.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zuf.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/borosh13.Plo -rm -f ./$(DEPDIR)/cmrg.Plo -rm -f ./$(DEPDIR)/coveyou.Plo -rm -f ./$(DEPDIR)/default.Plo -rm -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/fishman18.Plo -rm -f ./$(DEPDIR)/fishman20.Plo -rm -f ./$(DEPDIR)/fishman2x.Plo -rm -f ./$(DEPDIR)/gfsr4.Plo -rm -f ./$(DEPDIR)/inline.Plo -rm -f ./$(DEPDIR)/knuthran.Plo -rm -f ./$(DEPDIR)/knuthran2.Plo -rm -f ./$(DEPDIR)/knuthran2002.Plo -rm -f ./$(DEPDIR)/lecuyer21.Plo -rm -f ./$(DEPDIR)/minstd.Plo -rm -f ./$(DEPDIR)/mrg.Plo -rm -f ./$(DEPDIR)/mt.Plo -rm -f ./$(DEPDIR)/r250.Plo -rm -f ./$(DEPDIR)/ran0.Plo -rm -f ./$(DEPDIR)/ran1.Plo -rm -f ./$(DEPDIR)/ran2.Plo -rm -f ./$(DEPDIR)/ran3.Plo -rm -f ./$(DEPDIR)/rand.Plo -rm -f ./$(DEPDIR)/rand48.Plo -rm -f ./$(DEPDIR)/random.Plo -rm -f ./$(DEPDIR)/randu.Plo -rm -f ./$(DEPDIR)/ranf.Plo -rm -f ./$(DEPDIR)/ranlux.Plo -rm -f ./$(DEPDIR)/ranlxd.Plo -rm -f ./$(DEPDIR)/ranlxs.Plo -rm -f ./$(DEPDIR)/ranmar.Plo -rm -f ./$(DEPDIR)/rng.Plo -rm -f ./$(DEPDIR)/slatec.Plo -rm -f ./$(DEPDIR)/taus.Plo -rm -f ./$(DEPDIR)/taus113.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/transputer.Plo -rm -f ./$(DEPDIR)/tt.Plo -rm -f ./$(DEPDIR)/types.Plo -rm -f ./$(DEPDIR)/uni.Plo -rm -f ./$(DEPDIR)/uni32.Plo -rm -f ./$(DEPDIR)/vax.Plo -rm -f ./$(DEPDIR)/waterman14.Plo -rm -f ./$(DEPDIR)/zuf.Plo -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 -f ./$(DEPDIR)/borosh13.Plo -rm -f ./$(DEPDIR)/cmrg.Plo -rm -f ./$(DEPDIR)/coveyou.Plo -rm -f ./$(DEPDIR)/default.Plo -rm -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/fishman18.Plo -rm -f ./$(DEPDIR)/fishman20.Plo -rm -f ./$(DEPDIR)/fishman2x.Plo -rm -f ./$(DEPDIR)/gfsr4.Plo -rm -f ./$(DEPDIR)/inline.Plo -rm -f ./$(DEPDIR)/knuthran.Plo -rm -f ./$(DEPDIR)/knuthran2.Plo -rm -f ./$(DEPDIR)/knuthran2002.Plo -rm -f ./$(DEPDIR)/lecuyer21.Plo -rm -f ./$(DEPDIR)/minstd.Plo -rm -f ./$(DEPDIR)/mrg.Plo -rm -f ./$(DEPDIR)/mt.Plo -rm -f ./$(DEPDIR)/r250.Plo -rm -f ./$(DEPDIR)/ran0.Plo -rm -f ./$(DEPDIR)/ran1.Plo -rm -f ./$(DEPDIR)/ran2.Plo -rm -f ./$(DEPDIR)/ran3.Plo -rm -f ./$(DEPDIR)/rand.Plo -rm -f ./$(DEPDIR)/rand48.Plo -rm -f ./$(DEPDIR)/random.Plo -rm -f ./$(DEPDIR)/randu.Plo -rm -f ./$(DEPDIR)/ranf.Plo -rm -f ./$(DEPDIR)/ranlux.Plo -rm -f ./$(DEPDIR)/ranlxd.Plo -rm -f ./$(DEPDIR)/ranlxs.Plo -rm -f ./$(DEPDIR)/ranmar.Plo -rm -f ./$(DEPDIR)/rng.Plo -rm -f ./$(DEPDIR)/slatec.Plo -rm -f ./$(DEPDIR)/taus.Plo -rm -f ./$(DEPDIR)/taus113.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/transputer.Plo -rm -f ./$(DEPDIR)/tt.Plo -rm -f ./$(DEPDIR)/types.Plo -rm -f ./$(DEPDIR)/uni.Plo -rm -f ./$(DEPDIR)/uni32.Plo -rm -f ./$(DEPDIR)/vax.Plo -rm -f ./$(DEPDIR)/waterman14.Plo -rm -f ./$(DEPDIR)/zuf.Plo -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 am--depfiles 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 .PRECIOUS: Makefile # 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-2.7.1/rng/ChangeLog0000644016036000116100000003075713373111456011606 000000000000002012-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-2.7.1/rng/TODO0000644016036000116100000000750413373111456010516 00000000000000# -*- 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-2.7.1/rng/borosh13.c0000644016036000116100000000423113135126237011623 00000000000000/* 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-2.7.1/rng/cmrg.c0000644016036000116100000001231013135126237011110 00000000000000/* 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-2.7.1/rng/coveyou.c0000644016036000116100000000431213135126237011654 00000000000000/* 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-2.7.1/rng/default.c0000644016036000116100000000460013135126237011607 00000000000000/* 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-2.7.1/rng/file.c0000644016036000116100000000261513373111456011107 00000000000000/* 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-2.7.1/rng/fishman18.c0000644016036000116100000000443513135126237011767 00000000000000/* 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-2.7.1/rng/fishman20.c0000644016036000116100000000446213135126237011760 00000000000000/* 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-2.7.1/rng/fishman2x.c0000644016036000116100000000551513135126237012070 00000000000000/* 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-2.7.1/rng/gfsr4.c0000644016036000116100000001263113373111456011214 00000000000000/* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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-2.7.1/rng/knuthran2.c0000644016036000116100000000477213135126237012111 00000000000000/* 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-2.7.1/rng/knuthran.c0000644016036000116100000001134713135126237012023 00000000000000/* 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-2.7.1/rng/knuthran2002.c0000644016036000116100000001143013135126237012320 00000000000000/* 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-2.7.1/rng/lecuyer21.c0000644016036000116100000000434313135126237012002 00000000000000/* 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-2.7.1/rng/minstd.c0000644016036000116100000000546713135126237011475 00000000000000/* 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-2.7.1/rng/mrg.c0000644016036000116100000000760013135126237010753 00000000000000/* 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-2.7.1/rng/mt.c0000644016036000116100000001465613373111456010620 00000000000000/* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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-2.7.1/rng/r250.c0000644016036000116100000001132413135126237010654 00000000000000/* 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-2.7.1/rng/ran0.c0000644016036000116100000000505013135126237011023 00000000000000/* 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-2.7.1/rng/ran1.c0000644016036000116100000000570213135126237011030 00000000000000/* 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-2.7.1/rng/ran2.c0000644016036000116100000000676413135126237011042 00000000000000/* 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-2.7.1/rng/ran3.c0000644016036000116100000000603613373111456011034 00000000000000/* 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-2.7.1/rng/rand48.c0000644016036000116100000000742713135126237011275 00000000000000/* 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-2.7.1/rng/rand.c0000644016036000116100000000436613135126237011120 00000000000000/* 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-2.7.1/rng/random.c0000644016036000116100000004003313135126237011443 00000000000000/* 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-2.7.1/rng/randu.c0000644016036000116100000000502213135126237011273 00000000000000/* 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-2.7.1/rng/ranf.c0000644016036000116100000001023113373111456011107 00000000000000/* 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-2.7.1/rng/ranlux.c0000644016036000116100000001242413135126237011477 00000000000000/* 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-2.7.1/rng/ranlxd.c0000644016036000116100000001321413135126237011454 00000000000000/* 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-2.7.1/rng/ranlxs.c0000644016036000116100000001577113373111456011506 00000000000000/* 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-2.7.1/rng/ranmar.c0000644016036000116100000000757013135126237011454 00000000000000/* 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-2.7.1/rng/rng.c0000644016036000116100000000617713373111456010765 00000000000000/* 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-2.7.1/rng/slatec.c0000644016036000116100000001661713135126237011451 00000000000000/* 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-2.7.1/rng/taus.c0000644016036000116100000001266413135126237011150 00000000000000/* 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-2.7.1/rng/taus113.c0000644016036000116100000001256713433322215011372 00000000000000/* 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 z{i+1} = (69069 * zi) 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-2.7.1/rng/transputer.c0000644016036000116100000000435413135126237012400 00000000000000/* 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-2.7.1/rng/tt.c0000644016036000116100000000741513135126237010621 00000000000000/* 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-2.7.1/rng/types.c0000644016036000116100000000520413135126237011330 00000000000000/* 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-2.7.1/rng/uni32.c0000644016036000116100000001406313135126237011127 00000000000000/* 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-2.7.1/rng/uni.c0000644016036000116100000001367213135126237010767 00000000000000/* 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-2.7.1/rng/vax.c0000644016036000116100000000421213135126237010760 00000000000000/* 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-2.7.1/rng/waterman14.c0000644016036000116100000000422113135126237012145 00000000000000/* 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-2.7.1/rng/zuf.c0000644016036000116100000000671113135126237010774 00000000000000/* 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-2.7.1/rng/inline.c0000644016036000116100000000203113373111456011436 00000000000000/* 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-2.7.1/rng/test.c0000644016036000116100000004255413373111456011155 00000000000000/* 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-2.7.1/randist/0000755016036000116100000000000014151602576010761 500000000000000gsl-2.7.1/randist/Makefile.am0000644016036000116100000000207713373111456012740 00000000000000noinst_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 wishart.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-2.7.1/randist/gsl_randist.h0000644016036000116100000002415313373111456013365 00000000000000/* 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); int gsl_ran_wishart (const gsl_rng * r, const double df, const gsl_matrix * L, gsl_matrix * result, gsl_matrix * work); int gsl_ran_wishart_log_pdf (const gsl_matrix * X, const gsl_matrix * L_X, const double df, const gsl_matrix * L, double * result, gsl_matrix * work); int gsl_ran_wishart_pdf (const gsl_matrix * X, const gsl_matrix * L_X, const double df, const gsl_matrix * L, double * result, gsl_matrix * work); 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-2.7.1/randist/Makefile.in0000644016036000116100000012551414151557215012755 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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 wishart.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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/bernoulli.Plo ./$(DEPDIR)/beta.Plo \ ./$(DEPDIR)/bigauss.Plo ./$(DEPDIR)/binomial.Plo \ ./$(DEPDIR)/binomial_tpe.Plo ./$(DEPDIR)/cauchy.Plo \ ./$(DEPDIR)/chisq.Plo ./$(DEPDIR)/dirichlet.Plo \ ./$(DEPDIR)/discrete.Plo ./$(DEPDIR)/erlang.Plo \ ./$(DEPDIR)/exponential.Plo ./$(DEPDIR)/exppow.Plo \ ./$(DEPDIR)/fdist.Plo ./$(DEPDIR)/flat.Plo \ ./$(DEPDIR)/gamma.Plo ./$(DEPDIR)/gauss.Plo \ ./$(DEPDIR)/gausstail.Plo ./$(DEPDIR)/gausszig.Plo \ ./$(DEPDIR)/geometric.Plo ./$(DEPDIR)/gumbel.Plo \ ./$(DEPDIR)/hyperg.Plo ./$(DEPDIR)/landau.Plo \ ./$(DEPDIR)/laplace.Plo ./$(DEPDIR)/levy.Plo \ ./$(DEPDIR)/logarithmic.Plo ./$(DEPDIR)/logistic.Plo \ ./$(DEPDIR)/lognormal.Plo ./$(DEPDIR)/multinomial.Plo \ ./$(DEPDIR)/mvgauss.Plo ./$(DEPDIR)/nbinomial.Plo \ ./$(DEPDIR)/pareto.Plo ./$(DEPDIR)/pascal.Plo \ ./$(DEPDIR)/poisson.Plo ./$(DEPDIR)/rayleigh.Plo \ ./$(DEPDIR)/shuffle.Plo ./$(DEPDIR)/sphere.Plo \ ./$(DEPDIR)/tdist.Plo ./$(DEPDIR)/test.Po \ ./$(DEPDIR)/weibull.Plo ./$(DEPDIR)/wishart.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 wishart.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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/beta.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bigauss.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binomial.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binomial_tpe.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cauchy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chisq.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirichlet.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/discrete.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/erlang.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exponential.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exppow.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdist.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flat.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gamma.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gauss.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gausstail.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gausszig.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geometric.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gumbel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/landau.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/laplace.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/levy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logarithmic.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logistic.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lognormal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multinomial.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mvgauss.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nbinomial.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pareto.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pascal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poisson.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rayleigh.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shuffle.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sphere.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tdist.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/weibull.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wishart.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/bernoulli.Plo -rm -f ./$(DEPDIR)/beta.Plo -rm -f ./$(DEPDIR)/bigauss.Plo -rm -f ./$(DEPDIR)/binomial.Plo -rm -f ./$(DEPDIR)/binomial_tpe.Plo -rm -f ./$(DEPDIR)/cauchy.Plo -rm -f ./$(DEPDIR)/chisq.Plo -rm -f ./$(DEPDIR)/dirichlet.Plo -rm -f ./$(DEPDIR)/discrete.Plo -rm -f ./$(DEPDIR)/erlang.Plo -rm -f ./$(DEPDIR)/exponential.Plo -rm -f ./$(DEPDIR)/exppow.Plo -rm -f ./$(DEPDIR)/fdist.Plo -rm -f ./$(DEPDIR)/flat.Plo -rm -f ./$(DEPDIR)/gamma.Plo -rm -f ./$(DEPDIR)/gauss.Plo -rm -f ./$(DEPDIR)/gausstail.Plo -rm -f ./$(DEPDIR)/gausszig.Plo -rm -f ./$(DEPDIR)/geometric.Plo -rm -f ./$(DEPDIR)/gumbel.Plo -rm -f ./$(DEPDIR)/hyperg.Plo -rm -f ./$(DEPDIR)/landau.Plo -rm -f ./$(DEPDIR)/laplace.Plo -rm -f ./$(DEPDIR)/levy.Plo -rm -f ./$(DEPDIR)/logarithmic.Plo -rm -f ./$(DEPDIR)/logistic.Plo -rm -f ./$(DEPDIR)/lognormal.Plo -rm -f ./$(DEPDIR)/multinomial.Plo -rm -f ./$(DEPDIR)/mvgauss.Plo -rm -f ./$(DEPDIR)/nbinomial.Plo -rm -f ./$(DEPDIR)/pareto.Plo -rm -f ./$(DEPDIR)/pascal.Plo -rm -f ./$(DEPDIR)/poisson.Plo -rm -f ./$(DEPDIR)/rayleigh.Plo -rm -f ./$(DEPDIR)/shuffle.Plo -rm -f ./$(DEPDIR)/sphere.Plo -rm -f ./$(DEPDIR)/tdist.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/weibull.Plo -rm -f ./$(DEPDIR)/wishart.Plo -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 -f ./$(DEPDIR)/bernoulli.Plo -rm -f ./$(DEPDIR)/beta.Plo -rm -f ./$(DEPDIR)/bigauss.Plo -rm -f ./$(DEPDIR)/binomial.Plo -rm -f ./$(DEPDIR)/binomial_tpe.Plo -rm -f ./$(DEPDIR)/cauchy.Plo -rm -f ./$(DEPDIR)/chisq.Plo -rm -f ./$(DEPDIR)/dirichlet.Plo -rm -f ./$(DEPDIR)/discrete.Plo -rm -f ./$(DEPDIR)/erlang.Plo -rm -f ./$(DEPDIR)/exponential.Plo -rm -f ./$(DEPDIR)/exppow.Plo -rm -f ./$(DEPDIR)/fdist.Plo -rm -f ./$(DEPDIR)/flat.Plo -rm -f ./$(DEPDIR)/gamma.Plo -rm -f ./$(DEPDIR)/gauss.Plo -rm -f ./$(DEPDIR)/gausstail.Plo -rm -f ./$(DEPDIR)/gausszig.Plo -rm -f ./$(DEPDIR)/geometric.Plo -rm -f ./$(DEPDIR)/gumbel.Plo -rm -f ./$(DEPDIR)/hyperg.Plo -rm -f ./$(DEPDIR)/landau.Plo -rm -f ./$(DEPDIR)/laplace.Plo -rm -f ./$(DEPDIR)/levy.Plo -rm -f ./$(DEPDIR)/logarithmic.Plo -rm -f ./$(DEPDIR)/logistic.Plo -rm -f ./$(DEPDIR)/lognormal.Plo -rm -f ./$(DEPDIR)/multinomial.Plo -rm -f ./$(DEPDIR)/mvgauss.Plo -rm -f ./$(DEPDIR)/nbinomial.Plo -rm -f ./$(DEPDIR)/pareto.Plo -rm -f ./$(DEPDIR)/pascal.Plo -rm -f ./$(DEPDIR)/poisson.Plo -rm -f ./$(DEPDIR)/rayleigh.Plo -rm -f ./$(DEPDIR)/shuffle.Plo -rm -f ./$(DEPDIR)/sphere.Plo -rm -f ./$(DEPDIR)/tdist.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/weibull.Plo -rm -f ./$(DEPDIR)/wishart.Plo -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/randist/ChangeLog0000644016036000116100000004105213373111456012452 000000000000002012-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-2.7.1/randist/TODO0000644016036000116100000000600413373111456011366 00000000000000# -*- 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-2.7.1/randist/bernoulli.c0000644016036000116100000000255413135126237013042 00000000000000/* 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-2.7.1/randist/beta.c0000644016036000116100000000522513373111456011761 00000000000000/* 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-2.7.1/randist/bigauss.c0000644016036000116100000000417713135126237012507 00000000000000/* 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-2.7.1/randist/binomial.c0000644016036000116100000000441113135126237012633 00000000000000/* 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-2.7.1/randist/cauchy.c0000644016036000116100000000261613135126237012322 00000000000000/* 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-2.7.1/randist/chisq.c0000644016036000116100000000311013373111456012144 00000000000000/* 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-2.7.1/randist/dirichlet.c0000644016036000116100000000775513135126237013026 00000000000000/* 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-2.7.1/randist/discrete.c0000644016036000116100000003217413373111456012653 00000000000000/* 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-2.7.1/randist/erlang.c0000644016036000116100000000274713135126237012323 00000000000000/* 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-2.7.1/randist/exponential.c0000644016036000116100000000255013373111456013372 00000000000000/* 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-2.7.1/randist/exppow.c0000644016036000116100000000637213135126237012373 00000000000000/* 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-2.7.1/randist/fdist.c0000644016036000116100000000362113373111456012155 00000000000000/* 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-2.7.1/randist/flat.c0000644016036000116100000000261013373111456011767 00000000000000/* 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-2.7.1/randist/gamma.c0000644016036000116100000001223513373111456012127 00000000000000/* 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-2.7.1/randist/gauss.c0000644016036000116100000001063713135126237012172 00000000000000/* 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-2.7.1/randist/gausszig.c0000644016036000116100000002272313373111456012704 00000000000000/* 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-2.7.1/randist/gausstail.c0000644016036000116100000000514313135126237013040 00000000000000/* 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-2.7.1/randist/geometric.c0000644016036000116100000000313013135126237013014 00000000000000/* 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-2.7.1/randist/gumbel.c0000644016036000116100000000346013135126237012317 00000000000000/* 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-2.7.1/randist/hyperg.c0000644016036000116100000000542513135126237012345 00000000000000/* 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-2.7.1/randist/laplace.c0000644016036000116100000000270713135126237012450 00000000000000/* 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-2.7.1/randist/levy.c0000644016036000116100000000723713135126237012031 00000000000000/* 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-2.7.1/randist/logarithmic.c0000644016036000116100000000351713135126237013351 00000000000000/* 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-2.7.1/randist/logistic.c0000644016036000116100000000257413135126237012666 00000000000000/* 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-2.7.1/randist/lognormal.c0000644016036000116100000000361313135126237013036 00000000000000/* 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-2.7.1/randist/multinomial.c0000644016036000116100000000572613373111456013406 00000000000000/* 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-2.7.1/randist/mvgauss.c0000644016036000116100000001653313373111456012537 00000000000000/* 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-2.7.1/randist/nbinomial.c0000644016036000116100000000325513373111456013017 00000000000000/* 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-2.7.1/randist/pareto.c0000644016036000116100000000254713135126237012343 00000000000000/* 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-2.7.1/randist/pascal.c0000644016036000116100000000322513135126237012306 00000000000000/* 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-2.7.1/randist/poisson.c0000644016036000116100000000404113135126237012532 00000000000000/* 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-2.7.1/randist/rayleigh.c0000644016036000116100000000377613135126237012662 00000000000000/* 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-2.7.1/randist/shuffle.c0000644016036000116100000000672313135126237012505 00000000000000/* 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-2.7.1/randist/sphere.c0000644016036000116100000000663713135126237012343 00000000000000/* 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-2.7.1/randist/tdist.c0000644016036000116100000000420013135126237012164 00000000000000/* 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-2.7.1/randist/weibull.c0000644016036000116100000000305213135126237012504 00000000000000/* 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-2.7.1/randist/landau.c0000644016036000116100000005112013135126237012304 00000000000000/* 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-2.7.1/randist/binomial_tpe.c0000644016036000116100000003120213373111456013502 00000000000000/* 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-2.7.1/randist/wishart.c0000644016036000116100000001520113373111456012522 00000000000000/* randist/wishart.c * * Copyright (C) 2017 Timothée Flutre * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this 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 /* Generate a random matrix from a Wishart distribution using the Bartlett * decomposition, following Smith and Hocking, Journal of the Royal Statistical * Society. Series C (Applied Statistics), Vol. 21, No. 3 (1972), pp. 341-345. * * df degrees of freedom * L matrix resulting from the Cholesky decomposition of * the scale matrix V = L L^T (dimension d x d) * result output matrix (dimension d x d) * work matrix used for intermediate computations (dimension d x d) */ int gsl_ran_wishart (const gsl_rng * r, const double df, const gsl_matrix * L, gsl_matrix * result, gsl_matrix * work) { if (L->size1 != L->size2) { GSL_ERROR("L should be a square matrix", GSL_ENOTSQR); } else if (result->size1 != result->size2) { GSL_ERROR("result should be a square matrix", GSL_ENOTSQR); } else if (work->size1 != work->size2) { GSL_ERROR("work should be a square matrix", GSL_ENOTSQR); } else if (result->size1 != L->size1) { GSL_ERROR("incompatible dimensions of result matrix", GSL_EBADLEN); } else if (work->size1 != L->size1) { GSL_ERROR("incompatible dimensions of work matrix", GSL_EBADLEN); } else if (df <= L->size1 - 1) { GSL_ERROR("incompatible degrees of freedom", GSL_EDOM); } else { /* result: X = L A A^T L^T */ size_t d = L->size1, i, j; /* insure the upper part of A is zero before filling its lower part */ gsl_matrix_set_zero(work); for (i = 0; i < d; ++i) { gsl_matrix_set(work, i, i, sqrt(gsl_ran_chisq(r, df - i))); for (j = 0; j < i; ++j) { gsl_matrix_set(work, i, j, gsl_ran_ugaussian(r)); } } /* compute L * A */ gsl_blas_dtrmm(CblasLeft, CblasLower, CblasNoTrans, CblasNonUnit, 1.0, L, work); /* compute (L * A) * (L * A)^T */ gsl_blas_dsyrk(CblasUpper, CblasNoTrans, 1.0, work, 0.0, result); for (i = 0; i < d; ++i) { for (j = 0; j < i; ++j) { gsl_matrix_set(result, i, j, gsl_matrix_get(result, j, i)); } } return GSL_SUCCESS; } } /* Compute the log of the probability density function at a given quantile * matrix for a Wishart distribution using the Cholesky decomposition of the * scale matrix. * * X quantile matrix at which to evaluate the PDF (dimension d x d) * L_X matrix resulting from the Cholesky decomposition of * of the quantile matrix at which to evaluate the PDF * X = L_X L_X^T (dimension d x d) * df degrees of freedom * L matrix resulting from the Cholesky decomposition of * the scale matrix V = L L^T (dimension d x d) * result output of the density (dimension 1) * work matrix used for intermediate computations (dimension d x d) */ int gsl_ran_wishart_log_pdf (const gsl_matrix * X, const gsl_matrix * L_X, const double df, const gsl_matrix * L, double * result, gsl_matrix * work) { if (L->size1 != L->size2) { GSL_ERROR("L should be a square matrix", GSL_ENOTSQR); } else if (X->size1 != X->size2) { GSL_ERROR("X should be a square matrix", GSL_ENOTSQR); } else if (L_X->size1 != L_X->size2) { GSL_ERROR("L_X should be a square matrix", GSL_ENOTSQR); } else if (X->size1 != L->size1) { GSL_ERROR("incompatible dimensions of X matrix", GSL_EBADLEN); } else if (L_X->size1 != L->size1) { GSL_ERROR("incompatible dimensions of L_X matrix", GSL_EBADLEN); } else if (df <= L->size1 - 1) { GSL_ERROR("incompatible degrees of freedom", GSL_EDOM); } else { size_t d = L->size1, i; int status; double log_mv_Ga, log_det_V, log_det_X, tr_Vinv_X; /* compute the log of the multivariate Gamma */ log_mv_Ga = d * (d-1) * 0.25 * log(M_PI); for (i = 0; i < d; ++i) { log_mv_Ga += gsl_sf_lngamma((df - i + 1) * 0.5); } /* compute the log of the determinant of the scale matrix */ log_det_V = log(gsl_matrix_get(L, 0, 0)); for (i = 1; i < d; ++i) { log_det_V += log(gsl_matrix_get(L, i, i)); } log_det_V = 2 * log_det_V; /* compute the log of the determinant of the quantile matrix */ log_det_X = log(gsl_matrix_get(L_X, 0, 0)); for (i = 1; i < d; ++i) { log_det_X += log(gsl_matrix_get(L_X, i, i)); } log_det_X = 2 * log_det_X; /* compute the trace of V^(-1) X */ status = gsl_linalg_cholesky_solve_mat(L, X, work); if (status) return status; tr_Vinv_X = gsl_matrix_get(work, 0, 0); for (i = 1; i < d; ++i) { tr_Vinv_X += gsl_matrix_get(work, i, i); } /* add all to get the log of the PDF */ *result = - (0.5 * df * d) * log(2.0) - (0.5 * df) * log_det_V - log_mv_Ga + 0.5 * (df - d - 1) * log_det_X - 0.5 * tr_Vinv_X; return GSL_SUCCESS; } } int gsl_ran_wishart_pdf (const gsl_matrix * X, const gsl_matrix * L_X, const double df, const gsl_matrix * L, double * result, gsl_matrix * work) { double logpdf; int status = gsl_ran_wishart_log_pdf(X, L_X, df, L, &logpdf, work); if (status == GSL_SUCCESS) *result = exp(logpdf); return status; } gsl-2.7.1/randist/test.c0000644016036000116100000014770513373111456012037 00000000000000/* 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 #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); void test_wishart_log_pdf (void); void test_wishart_pdf (void); void test_wishart (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 (); test_wishart_log_pdf (); test_wishart_pdf (); test_wishart (); 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); } /* Examples from R (GPL): http://www.r-project.org/ * R> version$version.string # R version 3.4.1 (2017-06-30) * R> library(MCMCpack); packageVersion("MCMCpack") # 1.3.9 * R> df <- 3 * R> V <- matrix(data=c(1, 0.3, 0.3, 1), nrow=2, ncol=2) * R> X <- matrix(data=c(2.213322, 1.453357, 1.453357, 3.285779), nrow=2, ncol=2) * R> sprintf("%.15f", log(dwish(W=X, v=df, S=V))) # -4.931913612377813 */ void test_wishart_log_pdf (void) { size_t d = 2; const double df = 3, exp_res = -4.931913612377813; double obs_res; gsl_matrix * V = gsl_matrix_calloc(d, d); gsl_matrix * L = gsl_matrix_calloc(d, d); gsl_matrix * X = gsl_matrix_calloc(d, d); gsl_matrix * L_X = gsl_matrix_calloc(d, d); gsl_matrix * work = gsl_matrix_calloc(d, d); gsl_matrix_set(V, 0, 0, 1); gsl_matrix_set(V, 1, 1, 1); gsl_matrix_set(V, 0, 1, 0.3); gsl_matrix_set(V, 1, 0, 0.3); gsl_matrix_memcpy(L, V); gsl_linalg_cholesky_decomp1(L); gsl_matrix_set(X, 0, 0, 2.213322); gsl_matrix_set(X, 1, 1, 3.285779); gsl_matrix_set(X, 0, 1, 1.453357); gsl_matrix_set(X, 1, 0, 1.453357); gsl_matrix_memcpy(L_X, X); gsl_linalg_cholesky_decomp1(L_X); gsl_ran_wishart_log_pdf(X, L_X, df, L, &obs_res, work); gsl_test_rel(obs_res, exp_res, 1.0e-10, "gsl_ran_wishart_log_pdf"); gsl_matrix_free(V); gsl_matrix_free(L); gsl_matrix_free(X); gsl_matrix_free(L_X); gsl_matrix_free(work); } /* Examples from R (GPL): http://www.r-project.org/ * R> version$version.string # R version 3.4.1 (2017-06-30) * R> library(MCMCpack); packageVersion("MCMCpack") # 1.3.9 * R> df <- 3 * R> V <- matrix(data=c(1, 0.3, 0.3, 1), nrow=2, ncol=2) * R> X <- matrix(data=c(2.213322, 1.453357, 1.453357, 3.285779), nrow=2, ncol=2) * R> sprintf("%.15f", dwish(W=X, v=df, S=V)) # 0.007212687778224 */ void test_wishart_pdf (void) { size_t d = 2; const double df = 3, exp_res = 0.007212687778224; double obs_res; gsl_matrix * V = gsl_matrix_calloc(d, d); gsl_matrix * L = gsl_matrix_calloc(d, d); gsl_matrix * X = gsl_matrix_calloc(d, d); gsl_matrix * L_X = gsl_matrix_calloc(d, d); gsl_matrix * work = gsl_matrix_calloc(d, d); gsl_matrix_set(V, 0, 0, 1); gsl_matrix_set(V, 1, 1, 1); gsl_matrix_set(V, 0, 1, 0.3); gsl_matrix_set(V, 1, 0, 0.3); gsl_matrix_memcpy(L, V); gsl_linalg_cholesky_decomp1(L); gsl_matrix_set(X, 0, 0, 2.213322); gsl_matrix_set(X, 1, 1, 3.285779); gsl_matrix_set(X, 0, 1, 1.453357); gsl_matrix_set(X, 1, 0, 1.453357); gsl_matrix_memcpy(L_X, X); gsl_linalg_cholesky_decomp1(L_X); gsl_ran_wishart_pdf(X, L_X, df, L, &obs_res, work); gsl_test_rel(obs_res, exp_res, 1.0e-10, "gsl_ran_wishart_pdf"); gsl_matrix_free(V); gsl_matrix_free(L); gsl_matrix_free(X); gsl_matrix_free(L_X); gsl_matrix_free(work); } /* Draw N random "matrices" according to a W_d(df,V) with d=1 and V=1, * and check that their mean and variance are close enough to those of * a Chi-squared(df), respectively df and 2df. */ void test_wishart (void) { size_t d = 1, i, j; double df[5] = {1, 3, 5, 7, 9}, mean_wishart, var_wishart; int status; gsl_matrix * V = gsl_matrix_calloc(d, d); gsl_matrix * L = gsl_matrix_calloc(d, d); gsl_matrix * sample_wishart = gsl_matrix_calloc(d, d); gsl_matrix * work = gsl_matrix_calloc(d, d); gsl_vector * samples_wishart = gsl_vector_calloc(N); gsl_matrix_set(V, 0, 0, 1.0); gsl_matrix_memcpy(L, V); gsl_linalg_cholesky_decomp1(L); for (j = 0; j < 5; ++j) { /* for loop over df */ /* draw N random variables from W(df,V) */ for (i = 0; i < N; ++i) { status = gsl_ran_wishart(r_global, df[j], L, sample_wishart, work); gsl_vector_set(samples_wishart, i, gsl_matrix_get(sample_wishart, 0, 0)); } /* compute their mean and variance */ mean_wishart = gsl_stats_mean(samples_wishart->data, samples_wishart->stride, N); var_wishart = gsl_stats_variance_m(samples_wishart->data, samples_wishart->stride, N, mean_wishart); /* check */ gsl_test_rel(mean_wishart, df[j], 1.0e-1, "gsl_ran_wishart, mean"); gsl_test_rel(var_wishart, 2*df[j], 1.0e-1, "gsl_ran_wishart, var"); } /* end of for loop over df */ gsl_matrix_free(V); gsl_matrix_free(L); gsl_matrix_free(sample_wishart); gsl_matrix_free(work); gsl_vector_free(samples_wishart); } 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-2.7.1/fft/0000755016036000116100000000000014151602576010074 500000000000000gsl-2.7.1/fft/Makefile.am0000644016036000116100000000242513373111455012047 00000000000000noinst_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-2.7.1/fft/c_pass.h0000644016036000116100000001137113135126237011434 00000000000000/* 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-2.7.1/fft/hc_pass.h0000644016036000116100000000636513135126237011613 00000000000000/* 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-2.7.1/fft/real_pass.h0000644016036000116100000000655313135126237012143 00000000000000/* 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-2.7.1/fft/signals.h0000644016036000116100000000565013135126237011627 00000000000000/* 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-2.7.1/fft/signals_source.c0000644016036000116100000001613713135126237013204 00000000000000/* fft/signals_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 "signals.h" int FUNCTION(fft_signal,complex_pulse) (const size_t k, const size_t n, const size_t stride, const BASE z_real, const BASE z_imag, BASE data[], BASE fft[]) { size_t j; if (n == 0) { GSL_ERROR ("length n must be positive integer", GSL_EDOM); } /* gsl_complex pulse at position k, data[j] = z * delta_{jk} */ for (j = 0; j < n; j++) { REAL(data,stride,j) = 0.0; IMAG(data,stride,j) = 0.0; } REAL(data,stride,k % n) = z_real; IMAG(data,stride,k % n) = z_imag; /* fourier transform, fft[j] = z * exp(-2 pi i j k / n) */ for (j = 0; j < n; j++) { const double arg = -2 * M_PI * ((double) ((j * k) % n)) / ((double) n); const BASE w_real = (BASE)cos (arg); const BASE w_imag = (BASE)sin (arg); REAL(fft,stride,j) = w_real * z_real - w_imag * z_imag; IMAG(fft,stride,j) = w_real * z_imag + w_imag * z_real; } return 0; } int FUNCTION(fft_signal,complex_constant) (const size_t n, const size_t stride, const BASE z_real, const BASE z_imag, BASE data[], BASE fft[]) { size_t j; if (n == 0) { GSL_ERROR ("length n must be positive integer", GSL_EDOM); } /* constant, data[j] = z */ for (j = 0; j < n; j++) { REAL(data,stride,j) = z_real; IMAG(data,stride,j) = z_imag; } /* fourier transform, fft[j] = n z delta_{j0} */ for (j = 0; j < n; j++) { REAL(fft,stride,j) = 0.0; IMAG(fft,stride,j) = 0.0; } REAL(fft,stride,0) = ((BASE) n) * z_real; IMAG(fft,stride,0) = ((BASE) n) * z_imag; return 0; } int FUNCTION(fft_signal,complex_exp) (const int k, const size_t n, const size_t stride, const BASE z_real, const BASE z_imag, BASE data[], BASE fft[]) { size_t j; if (n == 0) { GSL_ERROR ("length n must be positive integer", GSL_EDOM); } /* exponential, data[j] = z * exp(2 pi i j k) */ for (j = 0; j < n; j++) { const double arg = 2 * M_PI * ((double) ((j * k) % n)) / ((double) n); const BASE w_real = (BASE)cos (arg); const BASE w_imag = (BASE)sin (arg); REAL(data,stride,j) = w_real * z_real - w_imag * z_imag; IMAG(data,stride,j) = w_real * z_imag + w_imag * z_real; } /* fourier transform, fft[j] = z * delta{(j - k),0} */ for (j = 0; j < n; j++) { REAL(fft,stride,j) = 0.0; IMAG(fft,stride,j) = 0.0; } { int freq; if (k <= 0) { freq = (n-k) % n ; } else { freq = (k % n); }; REAL(fft,stride,freq) = ((BASE) n) * z_real; IMAG(fft,stride,freq) = ((BASE) n) * z_imag; } return 0; } int FUNCTION(fft_signal,complex_exppair) (const int k1, const int k2, const size_t n, const size_t stride, const BASE z1_real, const BASE z1_imag, const BASE z2_real, const BASE z2_imag, BASE data[], BASE fft[]) { size_t j; if (n == 0) { GSL_ERROR ("length n must be positive integer", GSL_EDOM); } /* exponential, data[j] = z1 * exp(2 pi i j k1) + z2 * exp(2 pi i j k2) */ for (j = 0; j < n; j++) { const double arg1 = 2 * M_PI * ((double) ((j * k1) % n)) / ((double) n); const BASE w1_real = (BASE)cos (arg1); const BASE w1_imag = (BASE)sin (arg1); const double arg2 = 2 * M_PI * ((double) ((j * k2) % n)) / ((double) n); const BASE w2_real = (BASE)cos (arg2); const BASE w2_imag = (BASE)sin (arg2); REAL(data,stride,j) = w1_real * z1_real - w1_imag * z1_imag; IMAG(data,stride,j) = w1_real * z1_imag + w1_imag * z1_real; REAL(data,stride,j) += w2_real * z2_real - w2_imag * z2_imag; IMAG(data,stride,j) += w2_real * z2_imag + w2_imag * z2_real; } /* fourier transform, fft[j] = z1 * delta{(j - k1),0} + z2 * delta{(j - k2,0)} */ for (j = 0; j < n; j++) { REAL(fft,stride,j) = 0.0; IMAG(fft,stride,j) = 0.0; } { int freq1, freq2; if (k1 <= 0) { freq1 = (n - k1) % n; } else { freq1 = (k1 % n); }; if (k2 <= 0) { freq2 = (n - k2) % n; } else { freq2 = (k2 % n); }; REAL(fft,stride,freq1) += ((BASE) n) * z1_real; IMAG(fft,stride,freq1) += ((BASE) n) * z1_imag; REAL(fft,stride,freq2) += ((BASE) n) * z2_real; IMAG(fft,stride,freq2) += ((BASE) n) * z2_imag; } return 0; } int FUNCTION(fft_signal,complex_noise) (const size_t n, const size_t stride, BASE data[], BASE fft[]) { size_t i; int status; if (n == 0) { GSL_ERROR ("length n must be positive integer", GSL_EDOM); } for (i = 0; i < n; i++) { REAL(data,stride,i) = (BASE)urand(); IMAG(data,stride,i) = (BASE)urand(); } /* compute the dft */ status = FUNCTION(gsl_dft_complex,forward) (data, stride, n, fft); return status; } int FUNCTION(fft_signal,real_noise) (const size_t n, const size_t stride, BASE data[], BASE fft[]) { size_t i; int status; if (n == 0) { GSL_ERROR ("length n must be positive integer", GSL_EDOM); } for (i = 0; i < n; i++) { REAL(data,stride,i) = (BASE)urand(); IMAG(data,stride,i) = 0.0; } /* compute the dft */ status = FUNCTION(gsl_dft_complex,forward) (data, stride, n, fft); return status; } gsl-2.7.1/fft/c_main.c0000644016036000116100000001573113135126237011411 00000000000000/* 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-2.7.1/fft/c_init.c0000644016036000116100000001131013373111455011415 00000000000000/* 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-2.7.1/fft/c_pass_2.c0000644016036000116100000000577613135126237011664 00000000000000/* 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-2.7.1/fft/c_pass_3.c0000644016036000116100000001050713135126237011651 00000000000000/* 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-2.7.1/fft/c_pass_4.c0000644016036000116100000001221513135126237011650 00000000000000/* 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-2.7.1/fft/c_pass_5.c0000644016036000116100000001703513135126237011656 00000000000000/* 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-2.7.1/fft/c_pass_6.c0000644016036000116100000002023113135126237011647 00000000000000/* 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-2.7.1/fft/c_pass_7.c0000644016036000116100000003075313135126237011662 00000000000000/* 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-2.7.1/fft/c_pass_n.c0000644016036000116100000001374013135126237011746 00000000000000/* 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 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-2.7.1/fft/bitreverse.c0000644016036000116100000000473513135126237012337 00000000000000/* 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-2.7.1/fft/bitreverse.h0000644016036000116100000000250713135126237012337 00000000000000/* 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-2.7.1/fft/factorize.c0000644016036000116100000000721713135126237012151 00000000000000/* fft/factorize.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 "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-2.7.1/fft/factorize.h0000644016036000116100000000232113135126237012145 00000000000000/* 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-2.7.1/fft/hc_init.c0000644016036000116100000000640613373111455011577 00000000000000/* 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-2.7.1/fft/hc_pass_2.c0000644016036000116100000000637113135126237012024 00000000000000/* 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-2.7.1/fft/hc_pass_3.c0000644016036000116100000001235713135126237012026 00000000000000/* 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-2.7.1/fft/hc_pass_4.c0000644016036000116100000001466213135126237012030 00000000000000/* 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-2.7.1/fft/hc_pass_5.c0000644016036000116100000002275513135126237012033 00000000000000/* 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-2.7.1/fft/hc_pass_n.c0000644016036000116100000002006513135126237012114 00000000000000/* 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-2.7.1/fft/hc_radix2.c0000644016036000116100000001133513135126237012022 00000000000000/* 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-2.7.1/fft/hc_unpack.c0000644016036000116100000000547613135126237012123 00000000000000/* 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-2.7.1/fft/real_init.c0000644016036000116100000001047413373111455012130 00000000000000/* 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-2.7.1/fft/real_pass_2.c0000644016036000116100000000720613135126237012353 00000000000000/* 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-2.7.1/fft/real_pass_3.c0000644016036000116100000001332313135126237012351 00000000000000/* 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-2.7.1/fft/real_pass_4.c0000644016036000116100000001604513135126237012356 00000000000000/* 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-2.7.1/fft/real_pass_5.c0000644016036000116100000002437213135126237012361 00000000000000/* 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-2.7.1/fft/real_pass_n.c0000644016036000116100000002052213135126237012443 00000000000000/* 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-2.7.1/fft/real_radix2.c0000644016036000116100000000753713135126237012364 00000000000000/* 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-2.7.1/fft/real_unpack.c0000644016036000116100000000245413135126237012445 00000000000000/* 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-2.7.1/fft/compare.h0000644016036000116100000000251213135126237011607 00000000000000/* 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-2.7.1/fft/compare_source.c0000644016036000116100000000626313135126237013171 00000000000000/* 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-2.7.1/fft/dft_source.c0000644016036000116100000000616413135126237012320 00000000000000/* 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-2.7.1/fft/hc_main.c0000644016036000116100000001222013135126237011547 00000000000000/* 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-2.7.1/fft/real_main.c0000644016036000116100000000765213135126237012115 00000000000000/* 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-2.7.1/fft/test_complex_source.c0000644016036000116100000003560713135126237014255 00000000000000/* 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-2.7.1/fft/test_real_source.c0000644016036000116100000001660213135126237013523 00000000000000/* 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-2.7.1/fft/test_trap_source.c0000644016036000116100000001226013135126237013542 00000000000000/* 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-2.7.1/fft/urand.c0000644016036000116100000000171213135126237011266 00000000000000/* 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-2.7.1/fft/complex_internal.h0000644016036000116100000000055613135126237013532 00000000000000/* 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-2.7.1/fft/gsl_fft.h0000644016036000116100000000257213373111455011613 00000000000000/* 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-2.7.1/fft/gsl_fft_complex.h0000644016036000116100000001133613135126237013340 00000000000000/* 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-2.7.1/fft/gsl_fft_halfcomplex.h0000644016036000116100000000572413135126237014177 00000000000000/* 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-2.7.1/fft/gsl_fft_real.h0000644016036000116100000000427013135126237012613 00000000000000/* 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-2.7.1/fft/gsl_dft_complex.h0000644016036000116100000000342613135126237013337 00000000000000/* 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-2.7.1/fft/gsl_dft_complex_float.h0000644016036000116100000000347613135126237014531 00000000000000/* 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-2.7.1/fft/gsl_fft_complex_float.h0000644016036000116100000001234513135126237014526 00000000000000/* 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-2.7.1/fft/gsl_fft_halfcomplex_float.h0000644016036000116100000000624213135126237015360 00000000000000/* 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-2.7.1/fft/gsl_fft_real_float.h0000644016036000116100000000451613135126237014003 00000000000000/* 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-2.7.1/fft/Makefile.in0000644016036000116100000010741614151557214012070 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/dft.Plo ./$(DEPDIR)/fft.Plo \ ./$(DEPDIR)/signals.Po ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fft.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signals.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/dft.Plo -rm -f ./$(DEPDIR)/fft.Plo -rm -f ./$(DEPDIR)/signals.Po -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/dft.Plo -rm -f ./$(DEPDIR)/fft.Plo -rm -f ./$(DEPDIR)/signals.Po -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile #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-2.7.1/fft/ChangeLog0000644016036000116100000001027013373111455011562 000000000000002009-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-2.7.1/fft/TODO0000644016036000116100000000126313373111455010502 00000000000000# -*- 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-2.7.1/fft/dft.c0000644016036000116100000000073213135126237010733 00000000000000#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-2.7.1/fft/fft.c0000644016036000116100000000465013135126237010740 00000000000000#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-2.7.1/fft/test.c0000644016036000116100000000630613135126237011140 00000000000000/* 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-2.7.1/fft/signals.c0000644016036000116100000000077313135126237011623 00000000000000#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-2.7.1/poly/0000755016036000116100000000000014151602576010300 500000000000000gsl-2.7.1/poly/Makefile.am0000644016036000116100000000100613373111456012246 00000000000000noinst_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-2.7.1/poly/balance.c0000644016036000116100000000615113135126237011750 00000000000000/* 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-2.7.1/poly/companion.c0000644016036000116100000000226413135126237012347 00000000000000/* 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-2.7.1/poly/qr.c0000644016036000116100000001253613373111456011012 00000000000000/* 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-2.7.1/poly/gsl_poly.h0000644016036000116100000001244013373111456012217 00000000000000/* 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-2.7.1/poly/Makefile.in0000644016036000116100000011047214151557215012271 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/dd.Plo ./$(DEPDIR)/deriv.Plo \ ./$(DEPDIR)/eval.Plo ./$(DEPDIR)/solve_cubic.Plo \ ./$(DEPDIR)/solve_quadratic.Plo ./$(DEPDIR)/test.Po \ ./$(DEPDIR)/zsolve.Plo ./$(DEPDIR)/zsolve_cubic.Plo \ ./$(DEPDIR)/zsolve_init.Plo ./$(DEPDIR)/zsolve_quadratic.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deriv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eval.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/solve_cubic.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/solve_quadratic.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsolve.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsolve_cubic.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsolve_init.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsolve_quadratic.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/dd.Plo -rm -f ./$(DEPDIR)/deriv.Plo -rm -f ./$(DEPDIR)/eval.Plo -rm -f ./$(DEPDIR)/solve_cubic.Plo -rm -f ./$(DEPDIR)/solve_quadratic.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/zsolve.Plo -rm -f ./$(DEPDIR)/zsolve_cubic.Plo -rm -f ./$(DEPDIR)/zsolve_init.Plo -rm -f ./$(DEPDIR)/zsolve_quadratic.Plo -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 -f ./$(DEPDIR)/dd.Plo -rm -f ./$(DEPDIR)/deriv.Plo -rm -f ./$(DEPDIR)/eval.Plo -rm -f ./$(DEPDIR)/solve_cubic.Plo -rm -f ./$(DEPDIR)/solve_quadratic.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/zsolve.Plo -rm -f ./$(DEPDIR)/zsolve_cubic.Plo -rm -f ./$(DEPDIR)/zsolve_init.Plo -rm -f ./$(DEPDIR)/zsolve_quadratic.Plo -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/poly/ChangeLog0000644016036000116100000000720613373111456011774 000000000000002013-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-2.7.1/poly/TODO0000644016036000116100000001333213373111456010707 00000000000000# -*- 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-2.7.1/poly/dd.c0000644016036000116100000000636613373111456010763 00000000000000/* 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-2.7.1/poly/eval.c0000644016036000116100000000175313373111456011316 00000000000000/* 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-2.7.1/poly/solve_quadratic.c0000644016036000116100000000405613373111456013553 00000000000000/* 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-2.7.1/poly/solve_cubic.c0000644016036000116100000000565513373111456012671 00000000000000/* 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-2.7.1/poly/zsolve_quadratic.c0000644016036000116100000000505713135126237013746 00000000000000/* 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-2.7.1/poly/zsolve_cubic.c0000644016036000116100000001017413373111456013053 00000000000000/* 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-2.7.1/poly/zsolve.c0000644016036000116100000000412213135126237011701 00000000000000/* 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-2.7.1/poly/zsolve_init.c0000644016036000116100000000346713373111456012740 00000000000000/* 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-2.7.1/poly/deriv.c0000644016036000116100000000304313373111456011472 00000000000000/* 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-2.7.1/poly/test.c0000644016036000116100000005543113373111456011350 00000000000000/* 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-2.7.1/fit/0000755016036000116100000000000014151602576010077 500000000000000gsl-2.7.1/fit/Makefile.am0000644016036000116100000000101013373111455012037 00000000000000noinst_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-2.7.1/fit/gsl_fit.h0000644016036000116100000000531413135126237011616 00000000000000/* 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-2.7.1/fit/Makefile.in0000644016036000116100000010516214151557214012067 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/linear.Plo ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/linear.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/linear.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile #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-2.7.1/fit/ChangeLog0000644016036000116100000000104513373111455011565 000000000000002008-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-2.7.1/fit/linear.c0000644016036000116100000002034113135126237011431 00000000000000/* 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-2.7.1/fit/test.c0000644016036000116100000001405013135126237011136 00000000000000/* 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-2.7.1/multifit/0000755016036000116100000000000014151602576011152 500000000000000gsl-2.7.1/multifit/Makefile.am0000644016036000116100000000527013373111456013127 00000000000000noinst_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-2.7.1/multifit/linear_common.c0000644016036000116100000001362013373111456014057 00000000000000#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-2.7.1/multifit/lmutil.c0000644016036000116100000000504013373111456012540 00000000000000static 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-2.7.1/multifit/lmpar.c0000644016036000116100000002612013373111456012347 00000000000000/* 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-2.7.1/multifit/lmset.c0000644016036000116100000000373413373111456012366 00000000000000static 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-2.7.1/multifit/lmiterate.c0000644016036000116100000001257613373111456013234 00000000000000static 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-2.7.1/multifit/lmmisc.c0000644016036000116100000000553013373111456012522 00000000000000/* 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-2.7.1/multifit/qrsolv.c0000644016036000116100000001324713135126237012567 00000000000000/* 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-2.7.1/multifit/test_bard.c0000644016036000116100000000515613373111456013211 00000000000000#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-2.7.1/multifit/test_beale.c0000644016036000116100000000326213373111456013345 00000000000000#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-2.7.1/multifit/test_biggs.c0000644016036000116100000000463113373111456013371 00000000000000#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-2.7.1/multifit/test_box.c0000644016036000116100000000342013373111456013061 00000000000000#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-2.7.1/multifit/test_boxbod.c0000644016036000116100000000412513373111456013551 00000000000000#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-2.7.1/multifit/test_brown1.c0000644016036000116100000000415713373111456013511 00000000000000#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-2.7.1/multifit/test_brown2.c0000644016036000116100000000466013373111456013511 00000000000000#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-2.7.1/multifit/test_brown3.c0000644016036000116100000000304313373111456013504 00000000000000#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-2.7.1/multifit/test_eckerle.c0000644016036000116100000000624313373111456013711 00000000000000#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-2.7.1/multifit/test_enso.c0000644016036000116100000001253313373111456013242 00000000000000#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-2.7.1/multifit/test_estimator.c0000644016036000116100000000206413135126237014302 00000000000000void 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-2.7.1/multifit/test_exp1.c0000644016036000116100000000461213373111456013152 00000000000000#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-2.7.1/multifit/test_filip.c0000644016036000116100000002603713373111456013405 00000000000000size_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-2.7.1/multifit/test_gaussian.c0000644016036000116100000000436013373111456014107 00000000000000#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-2.7.1/multifit/test_hahn1.c0000644016036000116100000002236013373111456013274 00000000000000#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-2.7.1/multifit/test_helical.c0000644016036000116100000000374213373111456013701 00000000000000#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-2.7.1/multifit/test_jennrich.c0000644016036000116100000000342113373111456014072 00000000000000#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-2.7.1/multifit/test_kirby2.c0000644016036000116100000001520513373111456013477 00000000000000#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-2.7.1/multifit/test_kowalik.c0000644016036000116100000000630013373111456013732 00000000000000#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-2.7.1/multifit/test_lin1.c0000644016036000116100000000321613373111456013137 00000000000000#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-2.7.1/multifit/test_lin2.c0000644016036000116100000000323313373111456013137 00000000000000#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-2.7.1/multifit/test_lin3.c0000644016036000116100000000345713373111456013150 00000000000000#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-2.7.1/multifit/test_linear.c0000644016036000116100000000373313373111456013552 00000000000000/* 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-2.7.1/multifit/test_longley.c0000644016036000116100000001453113373111456013747 00000000000000size_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-2.7.1/multifit/test_meyer.c0000644016036000116100000000417513373111456013422 00000000000000#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-2.7.1/multifit/test_meyerscal.c0000644016036000116100000000446113373111456014263 00000000000000#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-2.7.1/multifit/test_nelson.c0000644016036000116100000001364613373111456013602 00000000000000const 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-2.7.1/multifit/test_nonlinear.c0000644016036000116100000004441413373111456014266 00000000000000/* 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-2.7.1/multifit/test_osborne.c0000644016036000116100000000460313373111456013744 00000000000000#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-2.7.1/multifit/test_penalty1.c0000644016036000116100000000347713373111456014042 00000000000000#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-2.7.1/multifit/test_penalty2.c0000644016036000116100000000557613373111456014045 00000000000000#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-2.7.1/multifit/test_pontius.c0000644016036000116100000001157413373111456014003 00000000000000size_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-2.7.1/multifit/test_powell1.c0000644016036000116100000000430713373111456013661 00000000000000#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-2.7.1/multifit/test_powell2.c0000644016036000116100000000276113373111456013664 00000000000000#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-2.7.1/multifit/test_powell3.c0000644016036000116100000000316613373111456013665 00000000000000#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-2.7.1/multifit/test_rat42.c0000644016036000116100000000454313373111456013234 00000000000000#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-2.7.1/multifit/test_rat43.c0000644016036000116100000000501713373111456013232 00000000000000#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-2.7.1/multifit/test_reg.c0000644016036000116100000004320413373111456013052 00000000000000/* 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-2.7.1/multifit/test_rosenbrock.c0000644016036000116100000000274413373111456014450 00000000000000#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-2.7.1/multifit/test_rosenbrocke.c0000644016036000116100000000374513373111456014617 00000000000000#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-2.7.1/multifit/test_roth.c0000644016036000116100000000347713373111456013261 00000000000000#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-2.7.1/multifit/test_shaw.c0000644016036000116100000002302614115037467013243 00000000000000/* * 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(CblasLower, CblasUnit, 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-9; 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.4e-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-2.7.1/multifit/test_thurber.c0000644016036000116100000000646713373111456013762 00000000000000#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-2.7.1/multifit/test_vardim.c0000644016036000116100000000342213373111456013555 00000000000000#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-2.7.1/multifit/test_watson.c0000644016036000116100000000525313373111456013612 00000000000000#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-2.7.1/multifit/test_wnlin.c0000644016036000116100000000744413373111456013432 00000000000000#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-2.7.1/multifit/test_wood.c0000644016036000116100000000374313373111456013251 00000000000000#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-2.7.1/multifit/gsl_multifit.h0000644016036000116100000003507114151556700013750 00000000000000/* 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_lcurvature (const gsl_vector * y, const gsl_vector * reg_param, const gsl_vector * rho, const gsl_vector * eta, gsl_vector * kappa, 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-2.7.1/multifit/gsl_multifit_nlin.h0000644016036000116100000002613513373111456014771 00000000000000/* 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-2.7.1/multifit/Makefile.in0000644016036000116100000012023214151557214013135 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/convergence.Plo \ ./$(DEPDIR)/covar.Plo ./$(DEPDIR)/fdfridge.Plo \ ./$(DEPDIR)/fdfsolver.Plo ./$(DEPDIR)/fdjac.Plo \ ./$(DEPDIR)/fsolver.Plo ./$(DEPDIR)/gcv.Plo \ ./$(DEPDIR)/gradient.Plo ./$(DEPDIR)/lmder.Plo \ ./$(DEPDIR)/lmniel.Plo ./$(DEPDIR)/multilinear.Plo \ ./$(DEPDIR)/multireg.Plo ./$(DEPDIR)/multirobust.Plo \ ./$(DEPDIR)/multiwlinear.Plo ./$(DEPDIR)/robust_wfun.Plo \ ./$(DEPDIR)/test.Po ./$(DEPDIR)/work.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/covar.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdfridge.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdfsolver.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdjac.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsolver.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gcv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gradient.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lmder.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lmniel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multilinear.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multireg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multirobust.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiwlinear.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/robust_wfun.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/work.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/convergence.Plo -rm -f ./$(DEPDIR)/covar.Plo -rm -f ./$(DEPDIR)/fdfridge.Plo -rm -f ./$(DEPDIR)/fdfsolver.Plo -rm -f ./$(DEPDIR)/fdjac.Plo -rm -f ./$(DEPDIR)/fsolver.Plo -rm -f ./$(DEPDIR)/gcv.Plo -rm -f ./$(DEPDIR)/gradient.Plo -rm -f ./$(DEPDIR)/lmder.Plo -rm -f ./$(DEPDIR)/lmniel.Plo -rm -f ./$(DEPDIR)/multilinear.Plo -rm -f ./$(DEPDIR)/multireg.Plo -rm -f ./$(DEPDIR)/multirobust.Plo -rm -f ./$(DEPDIR)/multiwlinear.Plo -rm -f ./$(DEPDIR)/robust_wfun.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/work.Plo -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 -f ./$(DEPDIR)/convergence.Plo -rm -f ./$(DEPDIR)/covar.Plo -rm -f ./$(DEPDIR)/fdfridge.Plo -rm -f ./$(DEPDIR)/fdfsolver.Plo -rm -f ./$(DEPDIR)/fdjac.Plo -rm -f ./$(DEPDIR)/fsolver.Plo -rm -f ./$(DEPDIR)/gcv.Plo -rm -f ./$(DEPDIR)/gradient.Plo -rm -f ./$(DEPDIR)/lmder.Plo -rm -f ./$(DEPDIR)/lmniel.Plo -rm -f ./$(DEPDIR)/multilinear.Plo -rm -f ./$(DEPDIR)/multireg.Plo -rm -f ./$(DEPDIR)/multirobust.Plo -rm -f ./$(DEPDIR)/multiwlinear.Plo -rm -f ./$(DEPDIR)/robust_wfun.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/work.Plo -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 am--depfiles 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 .PRECIOUS: Makefile #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-2.7.1/multifit/ChangeLog0000644016036000116100000001301313373111456012637 000000000000002013-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-2.7.1/multifit/TODO0000644016036000116100000000116213373111456011557 00000000000000# -*- 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-2.7.1/multifit/gcv.c0000644016036000116100000002516214151556700012020 00000000000000/* 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-2.7.1/multifit/multilinear.c0000644016036000116100000002326713373111456013572 00000000000000/* 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-2.7.1/multifit/multiwlinear.c0000644016036000116100000001177613373111456013763 00000000000000/* 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" 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 = gsl_multifit_wlinear_tsvd(X, w, y, tol, c, cov, chisq, rank, 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) { /* FIXME: this call does actually perform balancing, but this function is deprecated anyway */ int status = gsl_multifit_wlinear_tsvd(X, w, y, tol, c, cov, chisq, rank, work); return status; } gsl-2.7.1/multifit/work.c0000644016036000116100000000573213373111456012224 00000000000000/* 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-2.7.1/multifit/lmniel.c0000644016036000116100000002505413521373150012515 00000000000000/* 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(CblasLower, CblasUnit, 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-2.7.1/multifit/lmder.c0000644016036000116100000002545613373111456012352 00000000000000/* 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-2.7.1/multifit/fsolver.c0000644016036000116100000001046513373111456012721 00000000000000/* 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-2.7.1/multifit/fdfsolver.c0000644016036000116100000002235413373111456013233 00000000000000/* 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-2.7.1/multifit/fdfridge.c0000644016036000116100000003116713373111456013015 00000000000000/* 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-2.7.1/multifit/fdjac.c0000644016036000116100000000761613373111456012314 00000000000000/* 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-2.7.1/multifit/convergence.c0000644016036000116100000000756513373111456013546 00000000000000/* 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-2.7.1/multifit/gradient.c0000644016036000116100000000220013373111456013022 00000000000000/* 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-2.7.1/multifit/covar.c0000644016036000116100000001140713373111456012350 00000000000000/* 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-2.7.1/multifit/multirobust.c0000644016036000116100000004776213373111456013644 00000000000000/* 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); if (sigma > 0.0) 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-2.7.1/multifit/robust_wfun.c0000644016036000116100000001321113373111456013606 00000000000000/* 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-2.7.1/multifit/multireg.c0000644016036000116100000011706414151556700013074 00000000000000/* 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_lcurvature() Calculate curvature of previously computed L-curve as a function of regularization parameter Inputs: y - right hand side vector reg_param - vector of regularization parameters, length N rho - vector of residual norms ||y - X c||, length N eta - vector of solution norms ||c||, length N kappa - (output) vector of curvature values, length N 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 2) Vectors reg_param, rho, eta must be computed by calling gsl_multifit_linear_lcurve() */ int gsl_multifit_linear_lcurvature (const gsl_vector * y, const gsl_vector * reg_param, const gsl_vector * rho, const gsl_vector * eta, gsl_vector * kappa, 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 != eta->size) { GSL_ERROR ("size of rho and eta vectors do not match", GSL_EBADLEN); } else if (reg_param->size != N) { GSL_ERROR ("size of reg_param and rho vectors do not match", GSL_EBADLEN); } else if (kappa->size != N) { GSL_ERROR ("size of reg_param and rho vectors do not match", GSL_EBADLEN); } else { int status = GSL_SUCCESS; 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); gsl_vector_view beta = gsl_vector_subvector(work->xt, 0, p); size_t i; /* compute projection beta = U^T y */ gsl_blas_dgemv (CblasTrans, 1.0, &U.matrix, y, 0.0, &beta.vector); for (i = 0; i < N; ++i) { double lambda = gsl_vector_get(reg_param, i); double lambda_sq = lambda * lambda; double eta_i = gsl_vector_get(eta, i); double rho_i = gsl_vector_get(rho, i); double phi_i = 0.0, dphi_i = 0.0; double psi_i = 0.0, dpsi_i = 0.0; double deta_i, ddeta_i, drho_i, ddrho_i; double dlogeta_i, ddlogeta_i, dlogrho_i, ddlogrho_i; double kappa_i; size_t j; for (j = 0; j < p; ++j) { double beta_j = gsl_vector_get(&beta.vector, j); double s_j = gsl_vector_get(&S.vector, j); double sj_sq = s_j * s_j; double f_j = sj_sq / (sj_sq + lambda_sq); /* filter factor */ double onemf_j = 1.0 - f_j; double f1_j = -2.0 * f_j * onemf_j / lambda; double f2_j = -f1_j * (3.0 - 4.0 * f_j) / lambda; double xi_j = beta_j / s_j; phi_i += f_j * f1_j * xi_j * xi_j; psi_i += onemf_j * f1_j * beta_j * beta_j; dphi_i += (f1_j * f1_j + f_j * f2_j) * xi_j * xi_j; dpsi_i += (-f1_j * f1_j + onemf_j * f2_j) * beta_j * beta_j; } deta_i = phi_i / eta_i; drho_i = -psi_i / rho_i; ddeta_i = dphi_i / eta_i - deta_i * (deta_i / eta_i); ddrho_i = -dpsi_i / rho_i - drho_i * (drho_i / rho_i); dlogeta_i = deta_i / eta_i; dlogrho_i = drho_i / rho_i; ddlogeta_i = ddeta_i / eta_i - dlogeta_i * dlogeta_i; ddlogrho_i = ddrho_i / rho_i - dlogrho_i * dlogrho_i; kappa_i = (dlogrho_i * ddlogeta_i - ddlogrho_i * dlogeta_i) / pow(dlogrho_i * dlogrho_i + dlogeta_i * dlogeta_i, 1.5); gsl_vector_set(kappa, i, kappa_i); } return status; } } /* 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(CblasLower, CblasUnit, 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-2.7.1/multifit/test.c0000644016036000116100000000301413373111456012210 00000000000000/* 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-2.7.1/multifit_nlinear/0000755016036000116100000000000014151602576012662 500000000000000gsl-2.7.1/multifit_nlinear/Makefile.am0000644016036000116100000000367613473544531014654 00000000000000noinst_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 mcholesky.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-2.7.1/multifit_nlinear/common.c0000644016036000116100000000621213373111456014234 00000000000000/* 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-2.7.1/multifit_nlinear/nielsen.c0000644016036000116100000000532213373111456014402 00000000000000/* 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-2.7.1/multifit_nlinear/qrsolv.c0000644016036000116100000001302613373111456014273 00000000000000/* 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-2.7.1/multifit_nlinear/test_bard.c0000644016036000116100000000652713373111456014724 00000000000000#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-2.7.1/multifit_nlinear/test_beale.c0000644016036000116100000000445313373111456015060 00000000000000#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-2.7.1/multifit_nlinear/test_biggs.c0000644016036000116100000000704113373111456015077 00000000000000#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-2.7.1/multifit_nlinear/test_box.c0000644016036000116100000000647513373111456014606 00000000000000#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-2.7.1/multifit_nlinear/test_boxbod.c0000644016036000116100000000561213373111456015263 00000000000000#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-2.7.1/multifit_nlinear/test_brown1.c0000644016036000116100000000554113373111456015217 00000000000000#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-2.7.1/multifit_nlinear/test_brown2.c0000644016036000116100000000651113373111456015216 00000000000000#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-2.7.1/multifit_nlinear/test_brown3.c0000644016036000116100000000403013373111456015211 00000000000000#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-2.7.1/multifit_nlinear/test_eckerle.c0000644016036000116100000000741613373111456015424 00000000000000#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-2.7.1/multifit_nlinear/test_enso.c0000644016036000116100000001204113373111456014744 00000000000000#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-2.7.1/multifit_nlinear/test_exp1.c0000644016036000116100000000634613373111456014670 00000000000000#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-2.7.1/multifit_nlinear/test_fdf.c0000644016036000116100000002470713373111456014553 00000000000000/* 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 0 /*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-2.7.1/multifit_nlinear/test_gaussian.c0000644016036000116100000000677513373111456015633 00000000000000#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-2.7.1/multifit_nlinear/test_hahn1.c0000644016036000116100000001741113373111456015005 00000000000000#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-2.7.1/multifit_nlinear/test_helical.c0000644016036000116100000000522313373111456015405 00000000000000#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-2.7.1/multifit_nlinear/test_jennrich.c0000644016036000116100000000462413373111456015610 00000000000000#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-2.7.1/multifit_nlinear/test_kirby2.c0000644016036000116100000001562113373111456015211 00000000000000#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-2.7.1/multifit_nlinear/test_kowalik.c0000644016036000116100000001021213373111456015437 00000000000000#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-2.7.1/multifit_nlinear/test_lin1.c0000644016036000116100000000400413373111456014643 00000000000000#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-2.7.1/multifit_nlinear/test_lin2.c0000644016036000116100000000402013373111456014642 00000000000000#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-2.7.1/multifit_nlinear/test_lin3.c0000644016036000116100000000432513373111456014653 00000000000000#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-2.7.1/multifit_nlinear/test_meyer.c0000644016036000116100000000601713373111456015127 00000000000000#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-2.7.1/multifit_nlinear/test_meyerscal.c0000644016036000116100000000635013373111456015772 00000000000000#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-2.7.1/multifit_nlinear/test_osborne.c0000644016036000116100000000652113373111456015455 00000000000000#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-2.7.1/multifit_nlinear/test_penalty1.c0000644016036000116100000000446513373111456015550 00000000000000#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-2.7.1/multifit_nlinear/test_penalty2.c0000644016036000116100000001026313373111456015542 00000000000000#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-2.7.1/multifit_nlinear/test_powell1.c0000644016036000116100000000552413373111456015373 00000000000000#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-2.7.1/multifit_nlinear/test_powell2.c0000644016036000116100000000375213373111456015375 00000000000000#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-2.7.1/multifit_nlinear/test_powell3.c0000644016036000116100000000417613373111456015377 00000000000000#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-2.7.1/multifit_nlinear/test_rat42.c0000644016036000116100000000657613373111456014754 00000000000000#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-2.7.1/multifit_nlinear/test_rat43.c0000644016036000116100000000553213373111456014744 00000000000000#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-2.7.1/multifit_nlinear/test_rosenbrock.c0000644016036000116100000000363413373111456016157 00000000000000#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-2.7.1/multifit_nlinear/test_rosenbrocke.c0000644016036000116100000000477713373111456016335 00000000000000#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-2.7.1/multifit_nlinear/test_roth.c0000644016036000116100000000437713373111456014771 00000000000000#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-2.7.1/multifit_nlinear/test_thurber.c0000644016036000116100000000731713373111456015465 00000000000000#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-2.7.1/multifit_nlinear/test_vardim.c0000644016036000116100000000447513373111456015276 00000000000000#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-2.7.1/multifit_nlinear/test_watson.c0000644016036000116100000000671213373111456015323 00000000000000#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-2.7.1/multifit_nlinear/test_wnlin.c0000644016036000116100000001077413373111456015142 00000000000000#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-2.7.1/multifit_nlinear/test_wood.c0000644016036000116100000000514713373111456014761 00000000000000#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-2.7.1/multifit_nlinear/gsl_multifit_nlinear.h0000644016036000116100000002756313473544542017206 00000000000000/* 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_mcholesky; 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-2.7.1/multifit_nlinear/Makefile.in0000644016036000116100000011604114151557215014651 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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 mcholesky.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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/cholesky.Plo \ ./$(DEPDIR)/convergence.Plo ./$(DEPDIR)/covar.Plo \ ./$(DEPDIR)/dogleg.Plo ./$(DEPDIR)/fdf.Plo \ ./$(DEPDIR)/fdfvv.Plo ./$(DEPDIR)/fdjac.Plo ./$(DEPDIR)/lm.Plo \ ./$(DEPDIR)/mcholesky.Plo ./$(DEPDIR)/qr.Plo \ ./$(DEPDIR)/scaling.Plo ./$(DEPDIR)/subspace2D.Plo \ ./$(DEPDIR)/svd.Plo ./$(DEPDIR)/test.Po ./$(DEPDIR)/trust.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 mcholesky.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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/covar.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dogleg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdfvv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdjac.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mcholesky.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scaling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subspace2D.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/svd.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trust.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/cholesky.Plo -rm -f ./$(DEPDIR)/convergence.Plo -rm -f ./$(DEPDIR)/covar.Plo -rm -f ./$(DEPDIR)/dogleg.Plo -rm -f ./$(DEPDIR)/fdf.Plo -rm -f ./$(DEPDIR)/fdfvv.Plo -rm -f ./$(DEPDIR)/fdjac.Plo -rm -f ./$(DEPDIR)/lm.Plo -rm -f ./$(DEPDIR)/mcholesky.Plo -rm -f ./$(DEPDIR)/qr.Plo -rm -f ./$(DEPDIR)/scaling.Plo -rm -f ./$(DEPDIR)/subspace2D.Plo -rm -f ./$(DEPDIR)/svd.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/trust.Plo -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 -f ./$(DEPDIR)/cholesky.Plo -rm -f ./$(DEPDIR)/convergence.Plo -rm -f ./$(DEPDIR)/covar.Plo -rm -f ./$(DEPDIR)/dogleg.Plo -rm -f ./$(DEPDIR)/fdf.Plo -rm -f ./$(DEPDIR)/fdfvv.Plo -rm -f ./$(DEPDIR)/fdjac.Plo -rm -f ./$(DEPDIR)/lm.Plo -rm -f ./$(DEPDIR)/mcholesky.Plo -rm -f ./$(DEPDIR)/qr.Plo -rm -f ./$(DEPDIR)/scaling.Plo -rm -f ./$(DEPDIR)/subspace2D.Plo -rm -f ./$(DEPDIR)/svd.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/trust.Plo -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/multifit_nlinear/TODO0000644016036000116100000000044113373111456013266 000000000000001. 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-2.7.1/multifit_nlinear/cholesky.c0000644016036000116100000001721613521373361014573 00000000000000/* 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 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 "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_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->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->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(CblasLower, CblasNonUnit, JTJ, state->JTJ); /* augment normal equations: A -> A + mu D^T D */ status = cholesky_regularize(mu, diag, JTJ, state); if (status) return status; /* compute Cholesky decomposition */ status = gsl_linalg_cholesky_decomp1(JTJ); 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.0) { /* iteration has not started yet */ *rcond = 0.0; return GSL_EFAILED; } 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(CblasLower, CblasNonUnit, state->work_JTJ, state->JTJ); /* compute Cholesky decomposition */ status = gsl_linalg_cholesky_decomp1(state->work_JTJ); if (status) return status; } status = gsl_linalg_cholesky_rcond(state->work_JTJ, &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_cholesky_solve(JTJ, 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-2.7.1/multifit_nlinear/convergence.c0000644016036000116100000000676213373111456015254 00000000000000/* 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-2.7.1/multifit_nlinear/covar.c0000644016036000116100000001156713373111456014067 00000000000000/* 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-2.7.1/multifit_nlinear/dogleg.c0000644016036000116100000003340313373111456014207 00000000000000/* 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-2.7.1/multifit_nlinear/fdf.c0000644016036000116100000003320013373111456013500 00000000000000/* 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-2.7.1/multifit_nlinear/fdfvv.c0000644016036000116100000000720113373111456014056 00000000000000/* 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-2.7.1/multifit_nlinear/fdjac.c0000644016036000116100000001274513373111456014023 00000000000000/* 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-2.7.1/multifit_nlinear/lm.c0000644016036000116100000002235013373111456013355 00000000000000/* 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-2.7.1/multifit_nlinear/mcholesky.c0000644016036000116100000001774413521373403014753 00000000000000/* multifit_nlinear/mcholesky.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 */ } mcholesky_state_t; static void *mcholesky_alloc (const size_t n, const size_t p); static int mcholesky_init(const void * vtrust_state, void * vstate); static int mcholesky_presolve(const double mu, const void * vtrust_state, void * vstate); static int mcholesky_solve(const gsl_vector * f, gsl_vector *x, const void * vtrust_state, void *vstate); static int mcholesky_solve_rhs(const gsl_vector * b, gsl_vector *x, mcholesky_state_t *state); static int mcholesky_regularize(const double mu, const gsl_vector * diag, gsl_matrix * A, mcholesky_state_t * state); static void * mcholesky_alloc (const size_t n, const size_t p) { mcholesky_state_t *state; (void)n; state = calloc(1, sizeof(mcholesky_state_t)); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate mcholesky 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 mcholesky_free(void *vstate) { mcholesky_state_t *state = (mcholesky_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 mcholesky_init(const void * vtrust_state, void * vstate) { const gsl_multifit_nlinear_trust_state *trust_state = (const gsl_multifit_nlinear_trust_state *) vtrust_state; mcholesky_state_t *state = (mcholesky_state_t *) vstate; /* compute J^T J */ gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, trust_state->J, 0.0, state->JTJ); return GSL_SUCCESS; } /* mcholesky_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 mcholesky_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; mcholesky_state_t *state = (mcholesky_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(CblasLower, CblasNonUnit, JTJ, state->JTJ); /* augment normal equations: A -> A + mu D^T D */ status = mcholesky_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; } /* mcholesky_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 - mcholesky workspace */ static int mcholesky_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; mcholesky_state_t *state = (mcholesky_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 = mcholesky_solve_rhs(state->rhs, x, state); if (status) return status; return GSL_SUCCESS; } static int mcholesky_rcond(double * rcond, void * vstate) { int status; mcholesky_state_t *state = (mcholesky_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(CblasLower, CblasNonUnit, 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 mcholesky_solve_rhs(const gsl_vector * b, gsl_vector *x, mcholesky_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 mcholesky_regularize(const double mu, const gsl_vector * diag, gsl_matrix * A, mcholesky_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 mcholesky_type = { "mcholesky", mcholesky_alloc, mcholesky_init, mcholesky_presolve, mcholesky_solve, mcholesky_rcond, mcholesky_free }; const gsl_multifit_nlinear_solver *gsl_multifit_nlinear_solver_mcholesky = &mcholesky_type; gsl-2.7.1/multifit_nlinear/qr.c0000644016036000116100000001617513373111456013377 00000000000000/* 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-2.7.1/multifit_nlinear/scaling.c0000644016036000116100000001031713373111456014365 00000000000000/* 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-2.7.1/multifit_nlinear/subspace2D.c0000644016036000116100000005313513373111456014745 00000000000000/* 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-2.7.1/multifit_nlinear/svd.c0000644016036000116100000001457013373111456013546 00000000000000/* 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-2.7.1/multifit_nlinear/trust.c0000644016036000116100000004204313373111456014127 00000000000000/* 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 */ { gsl_multifit_nlinear_trust_state trust_state; trust_state.x = x; trust_state.f = f; trust_state.g = g; trust_state.J = J; trust_state.diag = state->diag; trust_state.sqrt_wts = swts; trust_state.mu = &(state->mu); trust_state.params = params; trust_state.solver_state = state->solver_state; trust_state.fdf = fdf; trust_state.avratio = &(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; gsl_multifit_nlinear_trust_state trust_state; 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 */ /* store all state parameters needed by low level methods */ trust_state.x = x; trust_state.f = f; trust_state.g = g; trust_state.J = J; trust_state.diag = state->diag; trust_state.sqrt_wts = swts; trust_state.mu = &(state->mu); trust_state.params = params; trust_state.solver_state = state->solver_state; trust_state.fdf = fdf; trust_state.avratio = &(state->avratio); /* 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 double normf = gsl_blas_dnrm2(f); const double normf_trial = gsl_blas_dnrm2(f_trial); gsl_multifit_nlinear_trust_state trust_state; 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; trust_state.x = NULL; trust_state.f = f; trust_state.g = g; trust_state.J = J; trust_state.diag = state->diag; trust_state.sqrt_wts = NULL; trust_state.mu = &(state->mu); trust_state.params = params; trust_state.solver_state = state->solver_state; trust_state.fdf = NULL; trust_state.avratio = &(state->avratio); /* 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-2.7.1/multifit_nlinear/test.c0000644016036000116100000000707213473545125013735 00000000000000/* 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[5]; 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_mcholesky; nlinear_solvers[2] = &gsl_multifit_nlinear_solver_qr; nlinear_solvers[3] = &gsl_multifit_nlinear_solver_svd; nlinear_solvers[4] = 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; /* don't use Cholesky solver with dogleg methods */ if (i > 1 && *solver == gsl_multifit_nlinear_solver_cholesky) continue; 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-2.7.1/multilarge/0000755016036000116100000000000014151602576011462 500000000000000gsl-2.7.1/multilarge/Makefile.am0000644016036000116100000000127513510453604013435 00000000000000noinst_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-2.7.1/multilarge/gsl_multilarge.h0000644016036000116100000001311513662626642014574 00000000000000/* 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 *); const gsl_matrix * (*matrix_ptr) (const void *); const gsl_vector * (*rhs_ptr) (const 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); const gsl_matrix * gsl_multilarge_linear_matrix_ptr (const gsl_multilarge_linear_workspace * work); const gsl_vector * gsl_multilarge_linear_rhs_ptr (const gsl_multilarge_linear_workspace * work); __END_DECLS #endif /* __GSL_MULTILARGE_H__ */ gsl-2.7.1/multilarge/Makefile.in0000644016036000116100000010713314151557215013453 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/multilarge.Plo \ ./$(DEPDIR)/normal.Plo ./$(DEPDIR)/test.Po \ ./$(DEPDIR)/tsqr.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/normal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tsqr.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/multilarge.Plo -rm -f ./$(DEPDIR)/normal.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/tsqr.Plo -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 -f ./$(DEPDIR)/multilarge.Plo -rm -f ./$(DEPDIR)/normal.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/tsqr.Plo -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/multilarge/multilarge.c0000644016036000116100000002536213662626610013724 00000000000000/* 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; (void) work; 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; (void) Ltau; 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; (void) Ltau; (void) work; 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; } } const gsl_matrix * gsl_multilarge_linear_matrix_ptr (const gsl_multilarge_linear_workspace * work) { return work->type->matrix_ptr(work->state); } const gsl_vector * gsl_multilarge_linear_rhs_ptr (const gsl_multilarge_linear_workspace * work) { return work->type->rhs_ptr(work->state); } gsl-2.7.1/multilarge/normal.c0000644016036000116100000003115713662626251013047 00000000000000/* 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 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_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 const gsl_matrix * normal_ATA(const void * vstate); static const gsl_vector * normal_ATb(const 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->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->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_cholesky_rcond(state->work_ATA, &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; } static const gsl_matrix * normal_ATA(const void * vstate) { const normal_state_t *state = (const normal_state_t *) vstate; return state->ATA; } static const gsl_vector * normal_ATb(const void * vstate) { const normal_state_t *state = (const normal_state_t *) vstate; return state->ATb; } /* 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(CblasLower, CblasNonUnit, state->work_ATA, state->ATA); gsl_vector_add_constant(&d.vector, lambda_sq); /* solve with Cholesky 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_cholesky_decomp2(ATA, state->D); if (status) return status; status = gsl_linalg_cholesky_solve2(ATA, 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(CblasLower, CblasNonUnit, 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_ATA, normal_ATb, normal_free }; const gsl_multilarge_linear_type * gsl_multilarge_linear_normal = &normal_type; gsl-2.7.1/multilarge/tsqr.c0000644016036000116100000003004313754521021012530 00000000000000/* tsqr.c * * Copyright (C) 2015, 2019 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 nblocks; /* number of blocks processed */ double rnorm; /* || b - A x || residual norm */ int svd; /* SVD of R factor has been computed */ gsl_matrix *T; /* block reflector matrix, p-by-p */ gsl_matrix *R; /* R factor, p-by-p */ gsl_vector *QTb; /* [ Q^T b ; b_i ], size p-by-1 */ gsl_vector *work; /* workspace, size p */ gsl_vector *work3; /* workspace, size 3*p */ 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 const gsl_matrix * tsqr_R(const void * vstate); static const gsl_vector * tsqr_QTb(const void * vstate); static int tsqr_svd(tsqr_state_t * state); /* 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->nblocks = 0; state->rnorm = 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->T = gsl_matrix_alloc(p, p); if (state->T == NULL) { tsqr_free(state); GSL_ERROR_NULL("failed to allocate T matrix", GSL_ENOMEM); } state->work = gsl_vector_alloc(p); if (state->work == NULL) { tsqr_free(state); GSL_ERROR_NULL("failed to allocate workspace vector", GSL_ENOMEM); } state->work3 = gsl_vector_alloc(3 * p); if (state->work3 == NULL) { tsqr_free(state); GSL_ERROR_NULL("failed to allocate work3 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->T) gsl_matrix_free(state->T); if (state->work) gsl_vector_free(state->work); if (state->work3) gsl_vector_free(state->work3); 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->nblocks = 0; state->rnorm = 0.0; state->svd = 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->nblocks == 0 && n < p) { GSL_ERROR ("n must be >= p", GSL_EBADLEN); } else if (state->nblocks == 0) { int status; gsl_matrix_view R = gsl_matrix_submatrix(A, 0, 0, p, p); gsl_vector_view QTb = gsl_vector_subvector(state->QTb, 0, p); gsl_vector_view b1 = gsl_vector_subvector(b, 0, p); /* this is the first matrix block A_1, compute its (dense) QR decomposition */ /* compute QR decomposition of A */ status = gsl_linalg_QR_decomp_r(A, state->T); if (status) return status; /* store upper triangular R factor in state->R */ gsl_matrix_tricpy(CblasUpper, CblasNonUnit, state->R, &R.matrix); /* compute Q^T b and keep the first p elements */ gsl_linalg_QR_QTvec_r(A, state->T, b, state->work); gsl_vector_memcpy(&QTb.vector, &b1.vector); if (n > p) { gsl_vector_view b2 = gsl_vector_subvector(b, p, n - p); state->rnorm = gsl_blas_dnrm2(&b2.vector); } else state->rnorm = 0.0; state->nblocks = 1; return GSL_SUCCESS; } else { int status; /* compute QR decomposition of [ R_{i-1} ; A_i ], accounting for * sparse structure */ status = gsl_linalg_QR_UR_decomp(state->R, A, state->T); if (status) return status; /* * Compute: * * Q^T [ QTb_{i-1} ] = [ QTb_{i-1} - w ] * [ b_i ] [ b_i - V~ w ] * * where: * * w = T^T (QTb_{i-1} + V~^T b_i) * * p * V = [ I ] p * [ V~ ] n */ gsl_vector_memcpy(state->work, state->QTb); gsl_blas_dgemv(CblasTrans, 1.0, A, b, 1.0, state->work); /* w := w + V~^T b */ gsl_blas_dtrmv(CblasUpper, CblasTrans, CblasNonUnit, state->T, state->work); /* w := T^T w */ gsl_vector_sub(state->QTb, state->work); /* QTb := QTb - w */ /* update residual norm */ gsl_blas_dgemv(CblasNoTrans, -1.0, A, state->work, 1.0, b); /* b := b - V~ w */ state->rnorm = gsl_hypot(state->rnorm, gsl_blas_dnrm2(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; if (x->size != state->p) { GSL_ERROR ("solution vector does not match workspace", GSL_EBADLEN); } else if (lambda < 0.0) { GSL_ERROR ("regularization parameter should be non-negative", GSL_EINVAL); } else { if (lambda == 0.0) { /* solve: R x = Q^T b */ gsl_vector_memcpy(x, state->QTb); gsl_blas_dtrsv(CblasUpper, CblasNoTrans, CblasNonUnit, state->R, x); *rnorm = state->rnorm; *snorm = gsl_blas_dnrm2(x); } 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; *rnorm = gsl_hypot(*rnorm, state->rnorm); } 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; size_t i; /* 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 */ for (i = 0; i < rho->size; ++i) { double *rhoi = gsl_vector_ptr(rho, i); *rhoi = gsl_hypot(*rhoi, state->rnorm); } return status; } static const gsl_matrix * tsqr_R(const void * vstate) { const tsqr_state_t *state = (const tsqr_state_t *) vstate; return state->R; } static const gsl_vector * tsqr_QTb(const void * vstate) { const tsqr_state_t *state = (const tsqr_state_t *) vstate; return state->QTb; } static int tsqr_rcond(double * rcond, void * vstate) { tsqr_state_t *state = (tsqr_state_t *) vstate; return gsl_linalg_tri_rcond(CblasUpper, state->R, rcond, state->work3); } /* 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; } static const gsl_multilarge_linear_type tsqr_type = { "tsqr", tsqr_alloc, tsqr_reset, tsqr_accumulate, tsqr_solve, tsqr_rcond, tsqr_lcurve, tsqr_R, tsqr_QTb, tsqr_free }; const gsl_multilarge_linear_type * gsl_multilarge_linear_tsqr = &tsqr_type; gsl-2.7.1/multilarge/test.c0000644016036000116100000003524113510453660012526 00000000000000/* 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); } } } 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 */ /*XXXtest_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 < 5; ++i) { double lambda = i == 0 ? 0.0 : 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[] = { 200, 356, 501 }; const size_t p_vals[] = { 10, 21, 34 }; size_t i; for (i = 0; i < 1; ++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-2.7.1/multilarge_nlinear/0000755016036000116100000000000014151602576013172 500000000000000gsl-2.7.1/multilarge_nlinear/Makefile.am0000644016036000116100000000341013473542210015136 00000000000000noinst_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 mcholesky.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-2.7.1/multilarge_nlinear/common.c0000644016036000116100000001011413473543237014547 00000000000000/* 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 || params->solver == gsl_multilarge_nlinear_solver_mcholesky) { 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-2.7.1/multilarge_nlinear/nielsen.c0000644016036000116100000000537313473557151014727 00000000000000/* 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-2.7.1/multilarge_nlinear/test_fdf.c0000644016036000116100000002631713373111456015062 00000000000000/* 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); /*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-2.7.1/multilarge_nlinear/test_bard.c0000644016036000116100000000733313373111456015230 00000000000000#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; double bard_x2[bard_P] = { 8.406666666666666e-01, 0.0, /* -inf */ 0.0 }; /* -inf */ const 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 (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-2.7.1/multilarge_nlinear/test_beale.c0000644016036000116100000000522713373111456015370 00000000000000#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-2.7.1/multilarge_nlinear/test_biggs.c0000644016036000116100000001054613373111456015413 00000000000000#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-2.7.1/multilarge_nlinear/test_box.c0000644016036000116100000000724113373111456015106 00000000000000#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-2.7.1/multilarge_nlinear/test_boxbod.c0000644016036000116100000000636313373111456015577 00000000000000#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-2.7.1/multilarge_nlinear/test_brown1.c0000644016036000116100000000634013373111456015525 00000000000000#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-2.7.1/multilarge_nlinear/test_brown2.c0000644016036000116100000000727513373111456015536 00000000000000#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-2.7.1/multilarge_nlinear/test_brown3.c0000644016036000116100000000464413373111456015534 00000000000000#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-2.7.1/multilarge_nlinear/test_eckerle.c0000644016036000116100000001020513373111456015722 00000000000000#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-2.7.1/multilarge_nlinear/test_enso.c0000644016036000116100000001265213373111456015264 00000000000000#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-2.7.1/multilarge_nlinear/test_exp1.c0000644016036000116100000000713213373111456015172 00000000000000#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-2.7.1/multilarge_nlinear/test_hahn1.c0000644016036000116100000002021413373111456015310 00000000000000#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-2.7.1/multilarge_nlinear/test_helical.c0000644016036000116100000000610613373111456015716 00000000000000#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-2.7.1/multilarge_nlinear/test_gaussian.c0000644016036000116100000000761113373111456016131 00000000000000#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-2.7.1/multilarge_nlinear/test_jennrich.c0000644016036000116100000000543013373111456016114 00000000000000#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-2.7.1/multilarge_nlinear/test_kirby2.c0000644016036000116100000001641613373111456015524 00000000000000#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-2.7.1/multilarge_nlinear/test_kowalik.c0000644016036000116100000001105613373111456015756 00000000000000#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_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; 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 (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-2.7.1/multilarge_nlinear/test_lin1.c0000644016036000116100000000454013373111456015160 00000000000000#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-2.7.1/multilarge_nlinear/test_lin2.c0000644016036000116100000000455413373111456015166 00000000000000#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-2.7.1/multilarge_nlinear/test_lin3.c0000644016036000116100000000507113373111456015162 00000000000000#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-2.7.1/multilarge_nlinear/test_meyer.c0000644016036000116100000000660313373111456015440 00000000000000#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-2.7.1/multilarge_nlinear/test_meyerscal.c0000644016036000116100000000717413373111456016307 00000000000000#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-2.7.1/multilarge_nlinear/test_osborne.c0000644016036000116100000000734313373111456015770 00000000000000#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; 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 (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-2.7.1/multilarge_nlinear/test_penalty1.c0000644016036000116100000000527113373111456016054 00000000000000#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-2.7.1/multilarge_nlinear/test_penalty2.c0000644016036000116100000001111713373111456016051 00000000000000#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-2.7.1/multilarge_nlinear/test_powell1.c0000644016036000116100000000650013373111456015676 00000000000000#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-2.7.1/multilarge_nlinear/test_powell2.c0000644016036000116100000000456113373111456015704 00000000000000#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-2.7.1/multilarge_nlinear/test_powell3.c0000644016036000116100000000501113373111456015674 00000000000000#define powell3_N 2 #define powell3_P 2 static double powell3_x0[powell3_P] = { 0.0, 1.0 }; static double powell3_epsrel = 1.0e-6; 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-2.7.1/multilarge_nlinear/test_rat42.c0000644016036000116100000000734613373111456015260 00000000000000#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-2.7.1/multilarge_nlinear/test_rat43.c0000644016036000116100000000631113373111456015250 00000000000000#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-2.7.1/multilarge_nlinear/test_rosenbrock.c0000644016036000116100000000450013373111456016460 00000000000000#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-2.7.1/multilarge_nlinear/test_rosenbrocke.c0000644016036000116100000000565313373111456016637 00000000000000#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-2.7.1/multilarge_nlinear/test_roth.c0000644016036000116100000000516313373111456015273 00000000000000#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-2.7.1/multilarge_nlinear/test_thurber.c0000644016036000116100000001014313373111456015764 00000000000000#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-2.7.1/multilarge_nlinear/test_vardim.c0000644016036000116100000000527113373111456015601 00000000000000#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-2.7.1/multilarge_nlinear/test_watson.c0000644016036000116100000000752613373111456015637 00000000000000#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-2.7.1/multilarge_nlinear/test_wood.c0000644016036000116100000000602313373111456015263 00000000000000#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-2.7.1/multilarge_nlinear/test_wnlin.c0000644016036000116100000001006213373111456015440 00000000000000#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-2.7.1/multilarge_nlinear/gsl_multilarge_nlinear.h0000644016036000116100000003142513473542235020013 00000000000000/* 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_mcholesky; GSL_VAR const gsl_multilarge_nlinear_solver * gsl_multilarge_nlinear_solver_none; __END_DECLS #endif /* __GSL_MULTILARGE_NLINEAR_H__ */ gsl-2.7.1/multilarge_nlinear/Makefile.in0000644016036000116100000011454714151557215015172 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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 mcholesky.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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/cgst.Plo ./$(DEPDIR)/cholesky.Plo \ ./$(DEPDIR)/convergence.Plo ./$(DEPDIR)/dogleg.Plo \ ./$(DEPDIR)/dummy.Plo ./$(DEPDIR)/fdf.Plo ./$(DEPDIR)/lm.Plo \ ./$(DEPDIR)/mcholesky.Plo ./$(DEPDIR)/scaling.Plo \ ./$(DEPDIR)/subspace2D.Plo ./$(DEPDIR)/test.Po \ ./$(DEPDIR)/trust.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 mcholesky.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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dogleg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mcholesky.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scaling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subspace2D.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trust.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/cgst.Plo -rm -f ./$(DEPDIR)/cholesky.Plo -rm -f ./$(DEPDIR)/convergence.Plo -rm -f ./$(DEPDIR)/dogleg.Plo -rm -f ./$(DEPDIR)/dummy.Plo -rm -f ./$(DEPDIR)/fdf.Plo -rm -f ./$(DEPDIR)/lm.Plo -rm -f ./$(DEPDIR)/mcholesky.Plo -rm -f ./$(DEPDIR)/scaling.Plo -rm -f ./$(DEPDIR)/subspace2D.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/trust.Plo -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 -f ./$(DEPDIR)/cgst.Plo -rm -f ./$(DEPDIR)/cholesky.Plo -rm -f ./$(DEPDIR)/convergence.Plo -rm -f ./$(DEPDIR)/dogleg.Plo -rm -f ./$(DEPDIR)/dummy.Plo -rm -f ./$(DEPDIR)/fdf.Plo -rm -f ./$(DEPDIR)/lm.Plo -rm -f ./$(DEPDIR)/mcholesky.Plo -rm -f ./$(DEPDIR)/scaling.Plo -rm -f ./$(DEPDIR)/subspace2D.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/trust.Plo -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/multilarge_nlinear/TODO0000644016036000116100000000015713373111456013602 000000000000001. finite difference J and fvv for cholesky solver 2. Fix biggs test x0 and dogleg / ddogleg convergence issue gsl-2.7.1/multilarge_nlinear/cgst.c0000644016036000116100000002411213373111456014213 00000000000000/* 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-2.7.1/multilarge_nlinear/cholesky.c0000644016036000116100000002075613521373532015106 00000000000000/* 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 Cholesky decomposition. */ #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_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->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->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(CblasLower, CblasNonUnit, 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(CblasLower, CblasNonUnit, JTJ, state->JTJ); /* augment normal equations: A -> A + mu D^T D */ status = cholesky_regularize(mu, diag, JTJ, state); if (status) return status; /* compute Cholesky decomposition */ status = gsl_linalg_cholesky_decomp1(JTJ); 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; gsl_error_handler_t * err_handler; 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(CblasLower, CblasNonUnit, state->work_JTJ, JTJ); /* compute Cholesky decomposition, turning off error handler */ err_handler = gsl_set_error_handler_off(); status = gsl_linalg_cholesky_decomp1(state->work_JTJ); gsl_set_error_handler(err_handler); if (status) { /* matrix is singular */ *rcond = 0.0; return GSL_SUCCESS; } status = gsl_linalg_cholesky_rcond(state->work_JTJ, &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; gsl_error_handler_t * err_handler; (void) 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(CblasLower, CblasNonUnit, covar, JTJ); /* compute Cholesky decomposition, turning off error handler */ err_handler = gsl_set_error_handler_off(); status = gsl_linalg_cholesky_decomp1(covar); gsl_set_error_handler(err_handler); if (status) return status; status = gsl_linalg_cholesky_invert(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_cholesky_solve(JTJ, 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-2.7.1/multilarge_nlinear/convergence.c0000644016036000116100000000557013373111456015560 00000000000000/* 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-2.7.1/multilarge_nlinear/dogleg.c0000644016036000116100000003415213373111456014521 00000000000000/* 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-2.7.1/multilarge_nlinear/dummy.c0000644016036000116100000000543713373111456014417 00000000000000/* 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-2.7.1/multilarge_nlinear/fdf.c0000644016036000116100000003626513473543610014030 00000000000000/* 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->params.solver == gsl_multilarge_nlinear_solver_mcholesky) { 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 = GSL_SUCCESS; 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 = GSL_SUCCESS; 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-2.7.1/multilarge_nlinear/lm.c0000644016036000116100000002434313373111456013671 00000000000000/* 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-2.7.1/multilarge_nlinear/mcholesky.c0000644016036000116100000002133613521373566015265 00000000000000/* multilarge_nlinear/mcholesky.c * * Copyright (C) 2016, 2017, 2018, 2019 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 */ } mcholesky_state_t; static void *mcholesky_alloc (const size_t n, const size_t p); static int mcholesky_init(const void * vtrust_state, void * vstate); static int mcholesky_presolve(const double mu, const void * vtrust_state, void * vstate); static int mcholesky_solve(const gsl_vector * g, gsl_vector *x, const void * vtrust_state, void *vstate); static int mcholesky_rcond(double * rcond, const gsl_matrix * JTJ, void * vstate); static int mcholesky_covar(const gsl_matrix * JTJ, gsl_matrix * covar, void * vstate); static int mcholesky_solve_rhs(const gsl_vector * b, gsl_vector *x, mcholesky_state_t *state); static int mcholesky_regularize(const double mu, const gsl_vector * diag, gsl_matrix * A, mcholesky_state_t * state); static void * mcholesky_alloc (const size_t n, const size_t p) { mcholesky_state_t *state; state = calloc(1, sizeof(mcholesky_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 mcholesky_free(void *vstate) { mcholesky_state_t *state = (mcholesky_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 mcholesky_init(const void * vtrust_state, void * vstate) { const gsl_multilarge_nlinear_trust_state *trust_state = (const gsl_multilarge_nlinear_trust_state *) vtrust_state; mcholesky_state_t *state = (mcholesky_state_t *) vstate; /* store J^T J normal equations matrix */ gsl_matrix_tricpy(CblasLower, CblasNonUnit, state->JTJ, trust_state->JTJ); return GSL_SUCCESS; } /* mcholesky_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 mcholesky_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; mcholesky_state_t *state = (mcholesky_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(CblasLower, CblasNonUnit, JTJ, state->JTJ); /* augment normal equations: A -> A + mu D^T D */ status = mcholesky_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; } /* mcholesky_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 mcholesky_solve(const gsl_vector * g, gsl_vector *x, const void * vtrust_state, void *vstate) { mcholesky_state_t *state = (mcholesky_state_t *) vstate; int status; status = mcholesky_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 mcholesky_rcond(double * rcond, const gsl_matrix * JTJ, void * vstate) { int status; mcholesky_state_t *state = (mcholesky_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(CblasLower, CblasNonUnit, 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 mcholesky_covar(const gsl_matrix * JTJ, gsl_matrix * covar, void * vstate) { int status; mcholesky_state_t *state = (mcholesky_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(CblasLower, CblasNonUnit, 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 mcholesky_solve_rhs(const gsl_vector * b, gsl_vector *x, mcholesky_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 mcholesky_regularize(const double mu, const gsl_vector * diag, gsl_matrix * A, mcholesky_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 mcholesky_type = { "mcholesky", mcholesky_alloc, mcholesky_init, mcholesky_presolve, mcholesky_solve, mcholesky_rcond, mcholesky_covar, mcholesky_free }; const gsl_multilarge_nlinear_solver *gsl_multilarge_nlinear_solver_mcholesky = &mcholesky_type; gsl-2.7.1/multilarge_nlinear/scaling.c0000644016036000116100000001026213373111456014674 00000000000000/* 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-2.7.1/multilarge_nlinear/subspace2D.c0000644016036000116100000005466513521373604015266 00000000000000/* 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(CblasLower, CblasUnit, 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-2.7.1/multilarge_nlinear/trust.c0000644016036000116100000004242213373111456014440 00000000000000/* 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 */ { gsl_multilarge_nlinear_trust_state trust_state; trust_state.x = x; trust_state.f = f; trust_state.g = g; trust_state.JTJ = JTJ; trust_state.diag = state->diag; trust_state.sqrt_wts = swts; trust_state.mu = &(state->mu); trust_state.params = params; trust_state.solver_state = state->solver_state; trust_state.fdf = fdf; trust_state.avratio = &(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; gsl_multilarge_nlinear_trust_state trust_state; 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 */ /* store all state parameters needed by low level methods */ trust_state.x = x; trust_state.f = f; trust_state.g = g; trust_state.JTJ = JTJ; trust_state.diag = state->diag; trust_state.sqrt_wts = swts; trust_state.mu = &(state->mu); trust_state.params = params; trust_state.solver_state = state->solver_state; trust_state.fdf = fdf; trust_state.avratio = &(state->avratio); /* 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-2.7.1/multilarge_nlinear/test.c0000644016036000116100000000606413473543345014247 00000000000000/* 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; if (trs == gsl_multilarge_nlinear_trs_lm || trs == gsl_multilarge_nlinear_trs_lmaccel) fdf_params.solver = gsl_multilarge_nlinear_solver_cholesky; else fdf_params.solver = gsl_multilarge_nlinear_solver_mcholesky; 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-2.7.1/filter/0000755016036000116100000000000014151602576010602 500000000000000gsl-2.7.1/filter/Makefile.am0000644016036000116100000000141713517226277012566 00000000000000noinst_LTLIBRARIES = libgslfilter.la pkginclude_HEADERS = gsl_filter.h AM_CPPFLAGS = -I$(top_srcdir) libgslfilter_la_SOURCES = gaussian.c impulse.c median.c rmedian.c noinst_HEADERS = ringbuf.c test_impulse.c test_gaussian.c test_median.c test_rmedian.c check_PROGRAMS = test TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslfilter.la ../movstat/libgslmovstat.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 ../vector/libgslvector.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../block/libgslblock.la ../poly/libgslpoly.la ../sys/libgslsys.la ../utils/libutils.la gsl-2.7.1/filter/ringbuf.c0000644016036000116100000001121413373111455012315 00000000000000/* movstat/ringbuf.c * * Ring buffer module * * Copyright (C) 2018 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_RINGBUF_C__ #define __GSL_RINGBUF_C__ /*typedef int ringbuf_type;*/ typedef struct { ringbuf_type_t *array; int head; int tail; int size; /* total elements allocated */ } ringbuf; static size_t ringbuf_size(const size_t n); static int ringbuf_empty(ringbuf * d); static int ringbuf_is_empty(const ringbuf * d); static int ringbuf_is_full(const ringbuf * d); static int ringbuf_insert(const ringbuf_type_t x, ringbuf * d); static int ringbuf_pop_back(ringbuf * b); static ringbuf_type_t ringbuf_peek(const int i, const ringbuf * b); static ringbuf_type_t ringbuf_peek_front(const ringbuf * d); static ringbuf_type_t ringbuf_peek_back(const ringbuf * d); static size_t ringbuf_copy(double * dest, const ringbuf * b); static size_t ringbuf_size(const size_t n) { size_t size = 0; size += sizeof(ringbuf); size += n * sizeof(ringbuf_type_t); /* b->array */ return size; } static int ringbuf_init(const size_t n, ringbuf * b) { b->array = (ringbuf_type_t *) ((char *) b + sizeof(ringbuf)); b->head = -1; b->tail = 0; b->size = (int) n; return GSL_SUCCESS; } /* empty the buffer */ static int ringbuf_empty(ringbuf * b) { b->head = -1; b->tail = 0; return GSL_SUCCESS; } /* check if buffer is empty */ static int ringbuf_is_empty(const ringbuf * b) { return (b->head == -1); } /* check if buffer is full */ static int ringbuf_is_full(const ringbuf * b) { return ((b->head == 0 && b->tail == b->size - 1) || (b->head == b->tail + 1)); } /* insert element into buffer, overwriting oldest element if necessary */ static int ringbuf_insert(const ringbuf_type_t x, ringbuf * b) { if (b->head == -1) /* buffer is empty */ { b->head = 0; b->tail = 0; } else if (b->head == 0) /* head is in first position, wrap to end */ { b->head = b->size - 1; if (b->tail == b->head && b->size > 1) --(b->tail); /* buffer is full so decrease tail */ } else /* decrement head */ { --(b->head); if (b->tail == b->head) { /* buffer is full so update tail */ if (b->tail == 0) b->tail = b->size - 1; else --(b->tail); } } /* insert element */ b->array[b->head] = x; return GSL_SUCCESS; } static int ringbuf_pop_back(ringbuf * b) { if (ringbuf_is_empty(b) || b->tail < 0) { GSL_ERROR("buffer is empty", GSL_EBADLEN); } else { if (b->head == b->tail) /* buffer has only one element */ { b->head = -1; b->tail = -1; } else if (b->tail == 0) /* tail is in first position, wrap to end */ { b->tail = b->size - 1; } else /* decrement tail */ { --(b->tail); } return GSL_SUCCESS; } } static ringbuf_type_t ringbuf_peek(const int i, const ringbuf * b) { if (ringbuf_is_empty(b)) { GSL_ERROR("buffer is empty", GSL_EBADLEN); } else { return b->array[(b->head + i) % b->size]; } } static ringbuf_type_t ringbuf_peek_front(const ringbuf * b) { if (ringbuf_is_empty(b)) { GSL_ERROR("buffer is empty", GSL_EBADLEN); } else { return b->array[b->head]; } } static ringbuf_type_t ringbuf_peek_back(const ringbuf * b) { if (ringbuf_is_empty(b) || b->tail < 0) { GSL_ERROR("buffer is empty", GSL_EBADLEN); } else { return b->array[b->tail]; } } static size_t ringbuf_copy(double * dest, const ringbuf * b) { if (ringbuf_is_empty(b) || b->tail < 0) { return 0; } else { const int n = (b->head > b->tail) ? (b->size - b->head + b->tail + 1) : (b->tail - b->head + 1); int i; for (i = 0; i < n; ++i) dest[n - i - 1] = b->array[(b->head + i) % b->size]; return (size_t) n; } } #endif /* __GSL_RINGBUF_C__ */ gsl-2.7.1/filter/test_impulse.c0000644016036000116100000001230613373111455013401 00000000000000/* filter/test_impulse.c * * Copyright (C) 2018 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 int vector_sum(const gsl_vector_int * v) { size_t i; int sum = 0; for (i = 0; i < v->size; ++i) { int vi = gsl_vector_int_get(v, i); sum += vi; } return sum; } static void test_impulse_proc(const double tol, const size_t n, const size_t K, const double nsigma, const gsl_filter_end_t etype, const gsl_filter_scale_t stype, const double outlier_percentage, gsl_rng * r) { gsl_vector * x = gsl_vector_alloc(n); gsl_vector * y = gsl_vector_alloc(n); gsl_vector * z = gsl_vector_alloc(n); gsl_vector * y_med = gsl_vector_alloc(n); gsl_vector * xmedian = gsl_vector_alloc(n); gsl_vector * xsigma = gsl_vector_alloc(n); size_t noutlier; gsl_vector_int * ioutlier = gsl_vector_int_alloc(n); gsl_vector_int * ioutlier_exact = gsl_vector_int_alloc(n); size_t i; gsl_filter_impulse_workspace *impulse_p = gsl_filter_impulse_alloc(K); gsl_filter_median_workspace *median_p = gsl_filter_median_alloc(K); size_t noutlier_exact = 0; char buf[1024]; gsl_vector_int_set_zero(ioutlier_exact); for (i = 0; i < n; ++i) { double xi = gsl_ran_gaussian(r, 1.0); double vi = gsl_rng_uniform(r); if (vi <= outlier_percentage) { xi += 15.0 * GSL_SIGN(xi); ++noutlier_exact; gsl_vector_int_set(ioutlier_exact, i, 1); } gsl_vector_set(x, i, xi); } /* first test that median filter is equal to impulse filter with nsigma = 0 */ gsl_filter_median(etype, x, y_med, median_p); gsl_filter_impulse(etype, stype, 0.0, x, y, xmedian, xsigma, &noutlier, ioutlier, impulse_p); sprintf(buf, "impulse nsigma=0 smf comparison, etype=%u stype=%u", etype, stype); compare_vectors(tol, y, y_med, buf); /* second test: filter y = impulse(x) with given nsigma */ gsl_filter_impulse(etype, stype, nsigma, x, y, xmedian, xsigma, &noutlier, ioutlier, impulse_p); /* test correct number of outliers detected */ gsl_test(noutlier != noutlier_exact, "impulse [n=%zu,K=%zu,nsigma=%g,outlier_percentage=%g] noutlier=%zu exact=%zu", n, K, nsigma, outlier_percentage, noutlier, noutlier_exact); #if 0 { for (i = 0; i < n; ++i) { printf("%.12e %.12e %d %.12e %.12e\n", gsl_vector_get(x, i), gsl_vector_get(y, i), gsl_vector_int_get(ioutlier, i), gsl_vector_get(xmedian, i) + nsigma * gsl_vector_get(xsigma, i), gsl_vector_get(xmedian, i) - nsigma * gsl_vector_get(xsigma, i)); } } #endif /* test outliers found in correct locations */ for (i = 0; i < n; ++i) { int val = gsl_vector_int_get(ioutlier, i); int val_exact = gsl_vector_int_get(ioutlier_exact, i); gsl_test(val != val_exact, "test_impulse: outlier mismatch [i=%zu,K=%zu,nsigma=%g,outlier_percentage=%g] ioutlier=%d ioutlier_exact=%d", i, K, nsigma, outlier_percentage, val, val_exact); } /* test noutlier = sum(ioutlier) */ { size_t iout_sum = vector_sum(ioutlier); gsl_test(noutlier != iout_sum, "impulse [K=%zu,nsigma=%g,outlier_percentage=%g] noutlier=%zu sum(ioutlier)=%zu", K, nsigma, outlier_percentage, noutlier, iout_sum); } /* third test: test in-place filter z = impulse(z) */ gsl_vector_memcpy(z, x); gsl_filter_impulse(etype, stype, nsigma, z, z, xmedian, xsigma, &noutlier, ioutlier, impulse_p); sprintf(buf, "impulse in-place nsigma=%g,n=%zu,K=%zu,etype=%u stype=%u", nsigma, n, K, etype, stype); compare_vectors(GSL_DBL_EPSILON, z, y, buf); gsl_vector_free(x); gsl_vector_free(y); gsl_vector_free(z); gsl_vector_free(y_med); gsl_vector_free(xmedian); gsl_vector_free(xsigma); gsl_vector_int_free(ioutlier); gsl_vector_int_free(ioutlier_exact); gsl_filter_impulse_free(impulse_p); gsl_filter_median_free(median_p); } static void test_impulse(gsl_rng * r) { const double tol = 1.0e-10; test_impulse_proc(tol, 1000, 21, 6.0, GSL_FILTER_END_TRUNCATE, GSL_FILTER_SCALE_QN, 0.05, r); test_impulse_proc(tol, 1000, 21, 6.0, GSL_FILTER_END_TRUNCATE, GSL_FILTER_SCALE_SN, 0.05, r); test_impulse_proc(tol, 1000, 21, 6.0, GSL_FILTER_END_TRUNCATE, GSL_FILTER_SCALE_MAD, 0.05, r); test_impulse_proc(tol, 1000, 21, 6.0, GSL_FILTER_END_TRUNCATE, GSL_FILTER_SCALE_IQR, 0.05, r); } gsl-2.7.1/filter/test_gaussian.c0000644016036000116100000001500013373111455013527 00000000000000/* filter/test_gaussian.c * * Copyright (C) 2018 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 /* compute Gaussian filter by explicitely constructing window and computing weighted sum */ int slow_gaussian(const gsl_filter_end_t etype, const double alpha, const size_t order, const gsl_vector * x, gsl_vector * y, const size_t K) { const size_t n = x->size; const size_t H = K / 2; double *window = malloc(K * sizeof(double)); double *kernel = malloc(K * sizeof(double)); gsl_vector_view k = gsl_vector_view_array(kernel, K); size_t i; gsl_filter_gaussian_kernel(alpha, order, 1, &k.vector); for (i = 0; i < n; ++i) { size_t wsize = gsl_movstat_fill(etype, x, i, H, H, window); double sum = 0.0; size_t j; for (j = 0; j < wsize; ++j) sum += window[j] * kernel[wsize - j - 1]; gsl_vector_set(y, i, sum); } free(window); free(kernel); return GSL_SUCCESS; } static void fdiff(const gsl_vector * x, gsl_vector * dx) { const size_t N = x->size; size_t i; for (i = 1; i < N - 1; ++i) { double xm1 = gsl_vector_get(x, i - 1); double xp1 = gsl_vector_get(x, i + 1); gsl_vector_set(dx, i, 0.5 * (xp1 - xm1)); } gsl_vector_set(dx, 0, gsl_vector_get(x, 1) - gsl_vector_get(x, 0)); gsl_vector_set(dx, N - 1, gsl_vector_get(x, N - 1) - gsl_vector_get(x, N - 2)); } static void test_gaussian_kernel(const double alpha, const size_t K) { const size_t max_order = 3; gsl_vector * kernel = gsl_vector_alloc(K); gsl_vector * deriv = gsl_vector_alloc(K); gsl_vector * deriv_fd = gsl_vector_alloc(K); char buf[2048]; size_t order; gsl_filter_gaussian_kernel(alpha, 0, 0, kernel); for (order = 1; order <= max_order; ++order) { gsl_filter_gaussian_kernel(alpha, order, 0, deriv); fdiff(kernel, deriv_fd); sprintf(buf, "gaussian kernel order=%zu alpha=%g K=%zu", order, alpha, K); compare_vectors(1.0e-2, deriv_fd, deriv, buf); gsl_vector_memcpy(kernel, deriv); } gsl_vector_free(kernel); gsl_vector_free(deriv); gsl_vector_free(deriv_fd); } static void test_gaussian_proc(const double tol, const double alpha, const size_t order, const size_t n, const size_t K, const gsl_filter_end_t etype, gsl_rng * rng_p) { gsl_filter_gaussian_workspace * w = gsl_filter_gaussian_alloc(K); gsl_vector * x = gsl_vector_alloc(n); gsl_vector * y = gsl_vector_alloc(n); gsl_vector * z = gsl_vector_alloc(n); char buf[2048]; random_vector(x, rng_p); /* y = filter(x) with slow brute force method */ slow_gaussian(etype, alpha, order, x, y, K); /* y = filter(x) with fast method */ gsl_filter_gaussian(etype, alpha, order, x, z, w); /* test y = z */ sprintf(buf, "n=%zu K=%zu endtype=%u alpha=%g order=%zu gaussian random", n, K, etype, alpha, order); compare_vectors(tol, z, y, buf); /* z = filter(x) in-place */ gsl_vector_memcpy(z, x); gsl_filter_gaussian(etype, alpha, order, z, z, w); sprintf(buf, "n=%zu K=%zu endtype=%u alpha=%g order=%zu gaussian random in-place", n, K, etype, alpha, order); compare_vectors(tol, z, y, buf); gsl_filter_gaussian_free(w); gsl_vector_free(x); gsl_vector_free(y); gsl_vector_free(z); } static void test_gaussian_deriv(const double alpha, const size_t n, const size_t K) { #if 0 const double f_low = 1.0; const double f_high = 50.0; const double gamma = 2.0 * M_PI / (n - 1.0); const double dt = 1.0 / (n - 1.0); gsl_vector *x = gsl_vector_alloc(n); gsl_vector *dx = gsl_vector_alloc(n); gsl_vector *y1 = gsl_vector_alloc(n); gsl_vector *y2 = gsl_vector_alloc(n); gsl_filter_gaussian_workspace *w = gsl_filter_gaussian_alloc(K); size_t i; /* make input signal composed of two sine waves at different frequencies */ for (i = 0; i < n; ++i) { double xi = sin(gamma * f_low * i) + sin(gamma * f_high * i); double dxi = gamma * f_low * cos(gamma * f_low * i) + gamma * f_high * cos(gamma * f_high * i); gsl_vector_set(x, i, xi); gsl_vector_set(dx, i, dxi); } /* compute y1 = G * dx(t)/dt */ gsl_filter_gaussian(alpha, 0, dx, y1, w); /* compute y2 = dG/dt * x(t) */ gsl_filter_gaussian(alpha, 1, x, y2, w); for (i = 0; i < n; ++i) { printf("%zu %.12e %.12e %.12e %.12e\n", i, gsl_vector_get(x, i), gsl_vector_get(dx, i), gsl_vector_get(y1, i), gsl_vector_get(y2, i)); } gsl_vector_free(x); gsl_vector_free(dx); gsl_vector_free(y1); gsl_vector_free(y2); gsl_filter_gaussian_free(w); #endif } static void test_gaussian(gsl_rng * r) { const double tol = 1.0e-10; size_t order; test_gaussian_kernel(3.0, 2001); for (order = 0; order <= 3; ++order) { test_gaussian_proc(tol, 2.5, order, 1000, 21, GSL_FILTER_END_PADZERO, r); test_gaussian_proc(tol, 3.0, order, 500, 11, GSL_FILTER_END_PADZERO, r); test_gaussian_proc(tol, 1.0, order, 50, 101, GSL_FILTER_END_PADZERO, r); test_gaussian_proc(tol, 2.0, order, 50, 11, GSL_FILTER_END_PADZERO, r); test_gaussian_proc(tol, 2.5, order, 1000, 21, GSL_FILTER_END_PADVALUE, r); test_gaussian_proc(tol, 3.0, order, 500, 11, GSL_FILTER_END_PADVALUE, r); test_gaussian_proc(tol, 1.0, order, 50, 101, GSL_FILTER_END_PADVALUE, r); test_gaussian_proc(tol, 2.0, order, 50, 11, GSL_FILTER_END_PADVALUE, r); test_gaussian_proc(tol, 2.5, order, 1000, 21, GSL_FILTER_END_TRUNCATE, r); test_gaussian_proc(tol, 3.0, order, 500, 11, GSL_FILTER_END_TRUNCATE, r); test_gaussian_proc(tol, 1.0, order, 50, 101, GSL_FILTER_END_TRUNCATE, r); test_gaussian_proc(tol, 2.0, order, 50, 11, GSL_FILTER_END_TRUNCATE, r); } } gsl-2.7.1/filter/test_median.c0000644016036000116100000001056613373111455013166 00000000000000/* filter/test_median.c * * Copyright (C) 2018 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 /* compute filtered data by explicitely constructing window, sorting it and finding median */ int slow_movmedian(const gsl_filter_end_t etype, const gsl_vector * x, gsl_vector * y, const int K) { const size_t H = K / 2; const size_t n = x->size; double *window = malloc(K * sizeof(double)); size_t i; for (i = 0; i < n; ++i) { size_t wsize = gsl_movstat_fill(etype, x, i, H, H, window); double yi = gsl_stats_median(window, 1, wsize); gsl_vector_set(y, i, yi); } free(window); return GSL_SUCCESS; } static void test_median_proc(const double tol, const size_t n, const size_t K, const gsl_filter_end_t etype, gsl_rng *rng_p) { gsl_filter_median_workspace *w = gsl_filter_median_alloc(K); gsl_vector *x = gsl_vector_alloc(n); gsl_vector *y = gsl_vector_alloc(n); gsl_vector *z = gsl_vector_alloc(n); char buf[2048]; /* test moving median with random input */ random_vector(x, rng_p); /* y = median(x) with slow brute force algorithm */ slow_movmedian(etype, x, y, K); /* z = median(x) */ gsl_filter_median(etype, x, z, w); /* test y = z */ sprintf(buf, "n=%zu K=%zu endtype=%u median random", n, K, etype); compare_vectors(tol, z, y, buf); /* z = median(x) in-place */ gsl_vector_memcpy(z, x); gsl_filter_median(etype, z, z, w); sprintf(buf, "n=%zu K=%zu endtype=%u median random in-place", n, K, etype); compare_vectors(tol, z, y, buf); gsl_vector_free(x); gsl_vector_free(y); gsl_vector_free(z); gsl_filter_median_free(w); } static void test_median(gsl_rng * rng_p) { test_median_proc(GSL_DBL_EPSILON, 1000, 1, GSL_MOVSTAT_END_PADZERO, rng_p); test_median_proc(GSL_DBL_EPSILON, 1000, 3, GSL_MOVSTAT_END_PADZERO, rng_p); test_median_proc(GSL_DBL_EPSILON, 1000, 5, GSL_MOVSTAT_END_PADZERO, rng_p); test_median_proc(GSL_DBL_EPSILON, 100, 301, GSL_MOVSTAT_END_PADZERO, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 17, GSL_MOVSTAT_END_PADZERO, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 9, GSL_MOVSTAT_END_PADZERO, rng_p); test_median_proc(GSL_DBL_EPSILON, 50, 901, GSL_MOVSTAT_END_PADZERO, rng_p); test_median_proc(GSL_DBL_EPSILON, 50, 201, GSL_MOVSTAT_END_PADZERO, rng_p); test_median_proc(GSL_DBL_EPSILON, 1000, 1, GSL_MOVSTAT_END_PADVALUE, rng_p); test_median_proc(GSL_DBL_EPSILON, 1000, 3, GSL_MOVSTAT_END_PADVALUE, rng_p); test_median_proc(GSL_DBL_EPSILON, 1000, 5, GSL_MOVSTAT_END_PADVALUE, rng_p); test_median_proc(GSL_DBL_EPSILON, 100, 301, GSL_MOVSTAT_END_PADVALUE, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 17, GSL_MOVSTAT_END_PADVALUE, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 9, GSL_MOVSTAT_END_PADVALUE, rng_p); test_median_proc(GSL_DBL_EPSILON, 50, 901, GSL_MOVSTAT_END_PADVALUE, rng_p); test_median_proc(GSL_DBL_EPSILON, 50, 201, GSL_MOVSTAT_END_PADVALUE, rng_p); test_median_proc(GSL_DBL_EPSILON, 1000, 1, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_median_proc(GSL_DBL_EPSILON, 1000, 3, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_median_proc(GSL_DBL_EPSILON, 1000, 5, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_median_proc(GSL_DBL_EPSILON, 100, 301, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 17, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 9, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_median_proc(GSL_DBL_EPSILON, 50, 901, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_median_proc(GSL_DBL_EPSILON, 50, 201, GSL_MOVSTAT_END_TRUNCATE, rng_p); } gsl-2.7.1/filter/test_rmedian.c0000644016036000116100000001127013373111455013341 00000000000000/* filter/test_rmedian.c * * Copyright (C) 2018 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 /* slow/dumb rmedian which constructs actual window for each sample, sorts * it and finds median */ static int slow_rmedian(const gsl_filter_end_t endtype, const gsl_vector * x, gsl_vector * y, const int K) { const int n = (int) x->size; const int H = K / 2; double *window = malloc(K * sizeof(double)); int i; for (i = 0; i < n; ++i) { size_t wsize = gsl_movstat_fill(endtype, x, i, H, H, window); double yi; int j; /* fill first half of window with previous filter output values */ for (j = i - H; j < i; ++j) { if (j < 0) { if (endtype == GSL_FILTER_END_PADVALUE) window[j - i + H] = gsl_vector_get(x, 0); else if (endtype == GSL_FILTER_END_PADZERO) window[j - i + H] = 0.0; } else { window[j - i + H] = gsl_vector_get(y, j); } } yi = gsl_stats_median(window, 1, wsize); gsl_vector_set(y, i, yi); } free(window); return GSL_SUCCESS; } /* test square wave input (root signal) */ static void test_rmedian_root(const gsl_filter_end_t etype, const size_t n, const size_t k) { const double tol = 1.0e-12; gsl_filter_rmedian_workspace *w = gsl_filter_rmedian_alloc(k); gsl_vector *x = gsl_vector_alloc(n); gsl_vector *y = gsl_vector_alloc(n); char buf[2048]; size_t i; /* test a root sequence (square input): x = [zero one zero] */ gsl_vector_set_all(x, 0.0); for (i = n / 3; i <= n / 2; ++i) gsl_vector_set(x, i, 1.0); /* compute y = rmedian(x) and test y = x */ gsl_filter_rmedian(etype, x, y, w); sprintf(buf, "n=%zu k=%zu RMF square wave root sequence", n, k); compare_vectors(tol, y, x, buf); gsl_vector_free(x); gsl_vector_free(y); gsl_filter_rmedian_free(w); } /* test random input and in-place */ static void test_rmedian_random(const gsl_filter_end_t etype, const size_t n, const int K, gsl_rng * r) { const double tol = 1.0e-12; gsl_filter_rmedian_workspace *w = gsl_filter_rmedian_alloc(K); gsl_vector *x = gsl_vector_alloc(n); gsl_vector *y = gsl_vector_alloc(n); gsl_vector *z = gsl_vector_alloc(n); char buf[2048]; /* test filter with random input against slow algorithm */ random_vector(x, r); /* y = rmedian(x) */ gsl_filter_rmedian(etype, x, y, w); /* y = rmedian(x) with slow algorithm */ slow_rmedian(etype, x, z, K); /* test y = z */ sprintf(buf, "n=%zu K=%d RMF symmetric random slow test", n, K); compare_vectors(tol, y, z, buf); /* test in-place filter */ /* z = rmedian(x) in-place */ gsl_vector_memcpy(z, x); gsl_filter_rmedian(etype, z, z, w); sprintf(buf, "n=%zu K=%d RMF symmetric random in-place", n, K); compare_vectors(tol, z, y, buf); gsl_vector_free(x); gsl_vector_free(y); gsl_vector_free(z); gsl_filter_rmedian_free(w); } void test_rmedian(gsl_rng * rng_p) { /* test root sequences */ test_rmedian_root(GSL_FILTER_END_PADZERO, 1000, 3); test_rmedian_root(GSL_FILTER_END_PADZERO, 2000, 101); test_rmedian_root(GSL_FILTER_END_PADVALUE, 1000, 3); test_rmedian_root(GSL_FILTER_END_PADVALUE, 2000, 101); /* test random input */ test_rmedian_random(GSL_FILTER_END_PADZERO, 10, 1, rng_p); test_rmedian_random(GSL_FILTER_END_PADZERO, 100, 3, rng_p); test_rmedian_random(GSL_FILTER_END_PADZERO, 1000, 3, rng_p); test_rmedian_random(GSL_FILTER_END_PADZERO, 100, 1001, rng_p); test_rmedian_random(GSL_FILTER_END_PADZERO, 5, 7, rng_p); test_rmedian_random(GSL_FILTER_END_PADVALUE, 10, 1, rng_p); test_rmedian_random(GSL_FILTER_END_PADVALUE, 100, 3, rng_p); test_rmedian_random(GSL_FILTER_END_PADVALUE, 1000, 3, rng_p); test_rmedian_random(GSL_FILTER_END_PADVALUE, 100, 1001, rng_p); test_rmedian_random(GSL_FILTER_END_PADVALUE, 5, 7, rng_p); } gsl-2.7.1/filter/gsl_filter.h0000644016036000116100000000772213373111455013031 00000000000000/* filter/gsl_filter.h * * Copyright (C) 2018 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_FILTER_H__ #define __GSL_FILTER_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 /* end point handling methods */ typedef enum { GSL_FILTER_END_PADZERO = GSL_MOVSTAT_END_PADZERO, GSL_FILTER_END_PADVALUE = GSL_MOVSTAT_END_PADVALUE, GSL_FILTER_END_TRUNCATE = GSL_MOVSTAT_END_TRUNCATE } gsl_filter_end_t; /* robust scale estimates */ typedef enum { GSL_FILTER_SCALE_MAD, /* median absolute deviation */ GSL_FILTER_SCALE_IQR, /* interquartile range */ GSL_FILTER_SCALE_SN, /* S_n scale statistic */ GSL_FILTER_SCALE_QN /* Q_n scale statistic */ } gsl_filter_scale_t; /* workspace for Gaussian filter */ typedef struct { size_t K; /* window size */ double *kernel; /* Gaussian kernel, size K */ gsl_movstat_workspace *movstat_workspace_p; } gsl_filter_gaussian_workspace; gsl_filter_gaussian_workspace *gsl_filter_gaussian_alloc(const size_t K); void gsl_filter_gaussian_free(gsl_filter_gaussian_workspace * w); int gsl_filter_gaussian(const gsl_filter_end_t endtype, const double alpha, const size_t order, const gsl_vector * x, gsl_vector * y, gsl_filter_gaussian_workspace * w); int gsl_filter_gaussian_kernel(const double alpha, const size_t order, const int normalize, gsl_vector * kernel); /* workspace for standard median filter */ typedef struct { gsl_movstat_workspace *movstat_workspace_p; } gsl_filter_median_workspace; gsl_filter_median_workspace *gsl_filter_median_alloc(const size_t K); void gsl_filter_median_free(gsl_filter_median_workspace * w); int gsl_filter_median(const gsl_filter_end_t endtype, const gsl_vector * x, gsl_vector * y, gsl_filter_median_workspace * w); /* workspace for recursive median filter */ typedef struct { size_t H; /* window half-length (K / 2) */ size_t K; /* window size */ void *state; /* workspace for min/max accumulator */ double *window; /* array holding first window */ const gsl_movstat_accum * minmaxacc; /* minimum/maximum accumulator */ gsl_movstat_workspace *movstat_workspace_p; } gsl_filter_rmedian_workspace; gsl_filter_rmedian_workspace *gsl_filter_rmedian_alloc(const size_t K); void gsl_filter_rmedian_free(gsl_filter_rmedian_workspace * w); int gsl_filter_rmedian(const gsl_filter_end_t, const gsl_vector * x, gsl_vector * y, gsl_filter_rmedian_workspace * w); typedef struct { gsl_movstat_workspace *movstat_workspace_p; } gsl_filter_impulse_workspace; gsl_filter_impulse_workspace *gsl_filter_impulse_alloc(const size_t K); void gsl_filter_impulse_free(gsl_filter_impulse_workspace * w); int gsl_filter_impulse(const gsl_filter_end_t endtype, const gsl_filter_scale_t scale_type, const double t, const gsl_vector * x, gsl_vector * y, gsl_vector * xmedian, gsl_vector * xsigma, size_t * noutlier, gsl_vector_int * ioutlier, gsl_filter_impulse_workspace * w); __END_DECLS #endif /* __GSL_FILTER_H__ */ gsl-2.7.1/filter/Makefile.in0000644016036000116100000010754014151557214012574 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 = filter 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslfilter_la_LIBADD = am_libgslfilter_la_OBJECTS = gaussian.lo impulse.lo median.lo \ rmedian.lo libgslfilter_la_OBJECTS = $(am_libgslfilter_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 = libgslfilter.la ../movstat/libgslmovstat.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 ../vector/libgslvector.la \ ../blas/libgslblas.la ../cblas/libgslcblas.la \ ../block/libgslblock.la ../poly/libgslpoly.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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/gaussian.Plo ./$(DEPDIR)/impulse.Plo \ ./$(DEPDIR)/median.Plo ./$(DEPDIR)/rmedian.Plo \ ./$(DEPDIR)/test.Po 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 = $(libgslfilter_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslfilter_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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 = libgslfilter.la pkginclude_HEADERS = gsl_filter.h AM_CPPFLAGS = -I$(top_srcdir) libgslfilter_la_SOURCES = gaussian.c impulse.c median.c rmedian.c noinst_HEADERS = ringbuf.c test_impulse.c test_gaussian.c test_median.c test_rmedian.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslfilter.la ../movstat/libgslmovstat.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 ../vector/libgslvector.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../block/libgslblock.la ../poly/libgslpoly.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 filter/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu filter/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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}; \ } libgslfilter.la: $(libgslfilter_la_OBJECTS) $(libgslfilter_la_DEPENDENCIES) $(EXTRA_libgslfilter_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslfilter_la_OBJECTS) $(libgslfilter_la_LIBADD) $(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)/gaussian.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/impulse.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/median.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rmedian.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/gaussian.Plo -rm -f ./$(DEPDIR)/impulse.Plo -rm -f ./$(DEPDIR)/median.Plo -rm -f ./$(DEPDIR)/rmedian.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/gaussian.Plo -rm -f ./$(DEPDIR)/impulse.Plo -rm -f ./$(DEPDIR)/median.Plo -rm -f ./$(DEPDIR)/rmedian.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/filter/TODO0000644016036000116100000000004313310514157011200 00000000000000gaussian - tests (derivative test) gsl-2.7.1/filter/gaussian.c0000644016036000116100000002154013373111455012476 00000000000000/* filter/gaussian.c * * Gaussian smoothing filters * * Copyright (C) 2018 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 /* maximum derivative order allowed for Gaussian filter */ #define GSL_FILTER_GAUSSIAN_MAX_ORDER 10 typedef double gaussian_type_t; typedef double ringbuf_type_t; #include "ringbuf.c" typedef struct { size_t n; /* window size */ double * window; /* linear array with current window */ ringbuf * rbuf; /* ring buffer storing current window */ } gaussian_state_t; static size_t gaussian_size(const size_t n); static int gaussian_init(const size_t n, void * vstate); static int gaussian_insert(const gaussian_type_t x, void * vstate); static int gaussian_delete(void * vstate); static int gaussian_get(void * params, gaussian_type_t * result, const void * vstate); static const gsl_movstat_accum gaussian_accum_type; /* gsl_filter_gaussian_alloc() Allocate a workspace for Gaussian filtering. Inputs: K - number of samples in window; if even, it is rounded up to the next odd, to have a symmetric window Return: pointer to workspace */ gsl_filter_gaussian_workspace * gsl_filter_gaussian_alloc(const size_t K) { const size_t H = K / 2; gsl_filter_gaussian_workspace *w; size_t state_size; w = calloc(1, sizeof(gsl_filter_gaussian_workspace)); if (w == 0) { GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM); } w->K = 2 * H + 1; w->kernel = malloc(w->K * sizeof(double)); if (w->kernel == 0) { gsl_filter_gaussian_free(w); GSL_ERROR_NULL ("failed to allocate space for kernel", GSL_ENOMEM); return NULL; } state_size = gaussian_size(w->K); w->movstat_workspace_p = gsl_movstat_alloc_with_size(state_size, H, H); if (!w->movstat_workspace_p) { gsl_filter_gaussian_free(w); GSL_ERROR_NULL ("failed to allocate space for movstat workspace", GSL_ENOMEM); } return w; } void gsl_filter_gaussian_free(gsl_filter_gaussian_workspace * w) { if (w->kernel) free(w->kernel); if (w->movstat_workspace_p) gsl_movstat_free(w->movstat_workspace_p); free(w); } /* gsl_filter_gaussian() Apply a Gaussian filter to an input vector: G_{sigma}(x) = exp [ -x^2 / (2 sigma^2) ] Inputs: alpha - number of standard deviations to include in Gaussian kernel order - derivative order of Gaussian x - input vector, size n y - (output) filtered vector, size n w - workspace Notes: 1) If alpha = 3, then the Gaussian kernel will be a Gaussian of +/- 3 standard deviations */ int gsl_filter_gaussian(const gsl_filter_end_t endtype, const double alpha, const size_t order, const gsl_vector * x, gsl_vector * y, gsl_filter_gaussian_workspace * w) { if (x->size != y->size) { GSL_ERROR("input and output vectors must have same length", GSL_EBADLEN); } else if (alpha <= 0.0) { GSL_ERROR("alpha must be positive", GSL_EDOM); } else { int status; gsl_vector_view kernel = gsl_vector_view_array(w->kernel, w->K); /* construct Gaussian kernel of length K */ gsl_filter_gaussian_kernel(alpha, order, 1, &kernel.vector); status = gsl_movstat_apply_accum(endtype, x, &gaussian_accum_type, (void *) w->kernel, y, NULL, w->movstat_workspace_p); return status; } } /* gsl_filter_gaussian_kernel() Construct Gaussian kernel with given sigma and order Inputs: alpha - number of standard deviations to include in window order - kernel order (0 = gaussian, 1 = first derivative, ...) normalize - normalize so sum(G) = 1 kernel - (output) Gaussian kernel Return: success/error Notes: 1) If alpha = 3, then the output kernel will contain a Gaussian with +/- 3 standard deviations */ int gsl_filter_gaussian_kernel(const double alpha, const size_t order, const int normalize, gsl_vector * kernel) { const size_t N = kernel->size; if (alpha <= 0.0) { GSL_ERROR("alpha must be positive", GSL_EDOM); } else if (order > GSL_FILTER_GAUSSIAN_MAX_ORDER) { GSL_ERROR("derivative order is too large", GSL_EDOM); } else { const double half = 0.5 * (N - 1.0); /* (N - 1) / 2 */ double sum = 0.0; size_t i; /* check for quick return */ if (N == 1) { if (order == 0) gsl_vector_set(kernel, 0, 1.0); else gsl_vector_set(kernel, 0, 0.0); return GSL_SUCCESS; } for (i = 0; i < N; ++i) { double xi = ((double)i - half) / half; double yi = alpha * xi; double gi = exp(-0.5 * yi * yi); gsl_vector_set(kernel, i, gi); sum += gi; } /* normalize so sum(kernel) = 1 */ if (normalize) gsl_vector_scale(kernel, 1.0 / sum); if (order > 0) { const double beta = -0.5 * alpha * alpha; double q[GSL_FILTER_GAUSSIAN_MAX_ORDER + 1]; size_t k; /* * Need to calculate derivatives of the Gaussian window; define * * w(n) = C * exp [ p(n) ] * * p(n) = beta * n^2 * beta = -1/2 * ( alpha / ((N-1)/2) )^2 * * Then: * * d^k/dn^k w(n) = q_k(n) * w(n) * * where q_k(n) is a degree-k polynomial in n, which satisfies: * * q_k(n) = d/dn q_{k-1}(n) + q_{k-1}(n) * dp(n)/dn * q_0(n) = 1 / half^{order} */ /* initialize q_0(n) = 1 / half^{order} */ q[0] = 1.0 / gsl_pow_uint(half, order); for (i = 1; i <= GSL_FILTER_GAUSSIAN_MAX_ORDER; ++i) q[i] = 0.0; /* loop through derivative orders and calculate q_k(n) for k = 1,...,order */ for (k = 1; k <= order; ++k) { double qm1 = q[0]; q[0] = q[1]; for (i = 1; i <= k; ++i) { double tmp = q[i]; q[i] = (i + 1.0) * q[i + 1] + /* d/dn q_{k-1} */ 2.0 * beta * qm1; /* q_{k-1}(n) p'(n) */ qm1 = tmp; } } /* now set w(n) := q(n) * w(n) */ for (i = 0; i < N; ++i) { double xi = ((double)i - half) / half; double qn = gsl_poly_eval(q, order + 1, xi); double *wn = gsl_vector_ptr(kernel, i); *wn *= qn; } } return GSL_SUCCESS; } } static size_t gaussian_size(const size_t n) { size_t size = 0; size += sizeof(gaussian_state_t); size += n * sizeof(gaussian_type_t); size += ringbuf_size(n); return size; } static int gaussian_init(const size_t n, void * vstate) { gaussian_state_t * state = (gaussian_state_t *) vstate; state->n = n; state->window = (gaussian_type_t *) ((unsigned char *) vstate + sizeof(gaussian_state_t)); state->rbuf = (ringbuf *) ((unsigned char *) state->window + n * sizeof(gaussian_type_t)); ringbuf_init(n, state->rbuf); return GSL_SUCCESS; } static int gaussian_insert(const gaussian_type_t x, void * vstate) { gaussian_state_t * state = (gaussian_state_t *) vstate; /* add new element to ring buffer */ ringbuf_insert(x, state->rbuf); return GSL_SUCCESS; } static int gaussian_delete(void * vstate) { gaussian_state_t * state = (gaussian_state_t *) vstate; if (!ringbuf_is_empty(state->rbuf)) ringbuf_pop_back(state->rbuf); return GSL_SUCCESS; } static int gaussian_get(void * params, gaussian_type_t * result, const void * vstate) { const gaussian_state_t * state = (const gaussian_state_t *) vstate; const double * kernel = (const double *) params; size_t n = ringbuf_copy(state->window, state->rbuf); double sum = 0.0; size_t i; for (i = 0; i < n; ++i) sum += state->window[i] * kernel[n - i - 1]; *result = sum; return GSL_SUCCESS; } static const gsl_movstat_accum gaussian_accum_type = { gaussian_size, gaussian_init, gaussian_insert, gaussian_delete, gaussian_get }; gsl-2.7.1/filter/impulse.c0000644016036000116100000002223213373111455012341 00000000000000/* filter/impulse.c * * Impulse detecting filters * * Copyright (C) 2018 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 static int filter_impulse(const double scale, const double epsilon, const double t, const gsl_vector * x, const gsl_vector * xmedian, gsl_vector * y, gsl_vector * xsigma, size_t * noutlier, gsl_vector_int * ioutlier); /* gsl_filter_impulse_alloc() Allocate a workspace for impulse detection filtering. Inputs: K - number of samples in window; if even, it is rounded up to the next odd, to have a symmetric window Return: pointer to workspace */ gsl_filter_impulse_workspace * gsl_filter_impulse_alloc(const size_t K) { gsl_filter_impulse_workspace *w; w = calloc(1, sizeof(gsl_filter_impulse_workspace)); if (w == 0) { GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM); } w->movstat_workspace_p = gsl_movstat_alloc(K); if (w->movstat_workspace_p == 0) { gsl_filter_impulse_free(w); return NULL; } return w; } void gsl_filter_impulse_free(gsl_filter_impulse_workspace * w) { if (w->movstat_workspace_p) gsl_movstat_free(w->movstat_workspace_p); free(w); } /* gsl_filter_impulse() Apply an impulse detection filter to an input vector. The filter output is y_i = { x_i, |x_i - m_i| <= t * S_i { m_i, |x_i - m_i| > t * S_i where m_i is the median of the window W_i^H and S_i is the scale estimate (MAD, IQR, S_n, Q_n) Inputs: endtype - how to handle signal end points scale_type - which statistic to use for scale estimate (MAD, IQR, etc) t - number of standard deviations required to identity outliers (>= 0) x - input vector, size n y - (output) filtered vector, size n xmedian - (output) vector of median values of x, size n xmedian_i = median of window centered on x_i xsigma - (output) vector of estimated local standard deviations of x, size n xsigma_i = sigma for i-th window: scale*MAD noutlier - (output) number of outliers detected ioutlier - (output) boolean array indicating outliers identified, size n; may be NULL ioutlier_i = 1 if outlier detected, 0 if not w - workspace Notes: */ int gsl_filter_impulse(const gsl_filter_end_t endtype, const gsl_filter_scale_t scale_type, const double t, const gsl_vector * x, gsl_vector * y, gsl_vector * xmedian, gsl_vector * xsigma, size_t * noutlier, gsl_vector_int * ioutlier, gsl_filter_impulse_workspace * w) { const size_t n = x->size; if (n != y->size) { GSL_ERROR("input and output vectors must have same length", GSL_EBADLEN); } else if (xmedian->size != n) { GSL_ERROR("xmedian vector must match input size", GSL_EBADLEN); } else if (xsigma->size != n) { GSL_ERROR("xsigma vector must match input size", GSL_EBADLEN); } else if ((ioutlier != NULL) && (ioutlier->size != n)) { GSL_ERROR("ioutlier vector must match input size", GSL_EBADLEN); } else if (t < 0.0) { GSL_ERROR("t must be non-negative", GSL_EDOM); } else { int status; double scale = 1.0; switch (scale_type) { case GSL_FILTER_SCALE_MAD: { /* compute window medians and MADs */ gsl_movstat_mad(endtype, x, xmedian, xsigma, w->movstat_workspace_p); break; } case GSL_FILTER_SCALE_IQR: { /* multiplication factor for IQR to estimate stddev for Gaussian signal */ scale = 0.741301109252801; /* calculate the window medians */ gsl_movstat_median(endtype, x, xmedian, w->movstat_workspace_p); /* calculate window IQRs */ gsl_movstat_qqr(endtype, x, 0.25, xsigma, w->movstat_workspace_p); break; } case GSL_FILTER_SCALE_SN: { /* calculate the window medians */ gsl_movstat_median(endtype, x, xmedian, w->movstat_workspace_p); /* calculate window S_n values */ gsl_movstat_Sn(endtype, x, xsigma, w->movstat_workspace_p); break; } case GSL_FILTER_SCALE_QN: { /* calculate the window medians */ gsl_movstat_median(endtype, x, xmedian, w->movstat_workspace_p); /* calculate window Q_n values */ gsl_movstat_Qn(endtype, x, xsigma, w->movstat_workspace_p); break; } default: GSL_ERROR("unknown scale type", GSL_EDOM); break; } /* apply impulse detecting filter using previously computed scale estimate */ status = filter_impulse(scale, 0.0, t, x, xmedian, y, xsigma, noutlier, ioutlier); return status; } } /* filter_impulse() Apply an impulse detection filter to an input vector. The filter output is y_i = { x_i, |x_i - m_i| <= t * S_i OR S_i < epsilon { m_i, |x_i - m_i| > t * S_i where m_i is the median of the window W_i^H and S_i is the scale estimate (MAD, IQR, etc) Inputs: scale - scale factor to multiply xsigma to get unbiased estimate of stddev for Gaussian data epsilon - minimum allowed scale estimate for identifying outliers t - number of standard deviations required to identity outliers (>= 0) x - input vector, size n xmedian - vector of median values of x, size n xmedian_i = median of window centered on x_i y - (output) filtered vector, size n xsigma - (output) vector of estimated local standard deviations of x, size n xsigma_i = S_n for i-th window noutlier - (output) number of outliers detected ioutlier - (output) boolean array indicating outliers identified, size n; may be NULL ioutlier_i = 1 if outlier detected, 0 if not Notes: 1) If S_i = 0 or is very small for a particular sample, then the filter may erroneously flag the sample as an outlier, since it will act as a standard median filter. To avoid this scenario, the parameter epsilon specifies the minimum value of S_i which can be used in the filter test. Any samples for which S_i < epsilon are passed through unchanged. */ static int filter_impulse(const double scale, const double epsilon, const double t, const gsl_vector * x, const gsl_vector * xmedian, gsl_vector * y, gsl_vector * xsigma, size_t * noutlier, gsl_vector_int * ioutlier) { const size_t n = x->size; if (n != y->size) { GSL_ERROR("input and output vectors must have same length", GSL_EBADLEN); } else if (xmedian->size != n) { GSL_ERROR("xmedian vector must match input size", GSL_EBADLEN); } else if (xsigma->size != n) { GSL_ERROR("xsigma vector must match input size", GSL_EBADLEN); } else if ((ioutlier != NULL) && (ioutlier->size != n)) { GSL_ERROR("ioutlier vector must match input size", GSL_EBADLEN); } else if (t < 0.0) { GSL_ERROR("t must be non-negative", GSL_EDOM); } else { size_t i; *noutlier = 0; /* build output vector */ for (i = 0; i < n; ++i) { double xi = gsl_vector_get(x, i); double xmedi = gsl_vector_get(xmedian, i); double absdevi = fabs(xi - xmedi); /* absolute deviation for this sample */ double *xsigmai = gsl_vector_ptr(xsigma, i); /* multiply by scale factor to get estimate of standard deviation */ *xsigmai *= scale; /* * If the absolute deviation for this sample is more than t stddevs * for this window (and S_i is sufficiently large to avoid scale implosion), * set the output value to the window median, otherwise use the original sample */ if ((*xsigmai >= epsilon) && (absdevi > t * (*xsigmai))) { gsl_vector_set(y, i, xmedi); ++(*noutlier); if (ioutlier) gsl_vector_int_set(ioutlier, i, 1); } else { gsl_vector_set(y, i, xi); if (ioutlier) gsl_vector_int_set(ioutlier, i, 0); } } return GSL_SUCCESS; } } gsl-2.7.1/filter/median.c0000644016036000116100000000406213373111455012121 00000000000000/* filter/median.c * * Contains routines related to the standard median filter * * Copyright (C) 2018 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_filter_median_workspace * gsl_filter_median_alloc(const size_t K) { gsl_filter_median_workspace *w; size_t H = K / 2; w = calloc(1, sizeof(gsl_filter_median_workspace)); if (w == 0) { GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM); } w->movstat_workspace_p = gsl_movstat_alloc(2*H + 1); if (w->movstat_workspace_p == NULL) { gsl_filter_median_free(w); GSL_ERROR_NULL ("failed to allocate space for movstat workspace", GSL_ENOMEM); } return w; } void gsl_filter_median_free(gsl_filter_median_workspace * w) { if (w->movstat_workspace_p) gsl_movstat_free(w->movstat_workspace_p); free(w); } /* gsl_filter_median() Standard median filter Inputs: endtype - end point handling x - input vector y - output vector w - workspace */ int gsl_filter_median(const gsl_filter_end_t endtype, const gsl_vector * x, gsl_vector * y, gsl_filter_median_workspace * w) { int status = gsl_movstat_median(endtype, x, y, w->movstat_workspace_p); return status; } gsl-2.7.1/filter/rmedian.c0000644016036000116100000001362513377336115012316 00000000000000/* filter/rmedian.c * * Copyright (C) 2018 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 the recursive median filter. The * algorithm is based on this paper, * * [1] S-J Ko, Y. H. Lee, and A. T. Fam, Efficient Implementation of One-Dimensional * Recursive Median Filters, IEEE Transactions on Circuits and Systems, Vol 37, * No 11, 1990. */ #include #include #include #include #include #include #include #include #include typedef struct { const gsl_movstat_accum * minmax_acc; /* minimum/maximum accumulator */ void *minmax_state; /* minimum/maximum accumulator workspace */ } rmedian_state_t; static size_t rmedian_size(const size_t n); static int rmedian_init(const size_t n, void * vstate); static int rmedian_insert(const double x, void * vstate); static int rmedian_delete(void * vstate); static int rmedian_get(void * params, double * result, const void * vstate); static const gsl_movstat_accum rmedian_accum_type; gsl_filter_rmedian_workspace * gsl_filter_rmedian_alloc(const size_t K) { gsl_filter_rmedian_workspace *w; size_t state_size; w = calloc(1, sizeof(gsl_filter_rmedian_workspace)); if (w == 0) { GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM); } w->H = K / 2; w->K = 2*w->H + 1; w->minmaxacc = gsl_movstat_accum_minmax; w->window = malloc(w->K * sizeof(double)); if (w->window == NULL) { gsl_filter_rmedian_free(w); GSL_ERROR_NULL ("failed to allocate space for window", GSL_ENOMEM); } state_size = rmedian_size(w->H + 1); w->state = malloc(state_size); if (w->state == NULL) { gsl_filter_rmedian_free(w); GSL_ERROR_NULL ("failed to allocate space for min/max state", GSL_ENOMEM); } w->movstat_workspace_p = gsl_movstat_alloc_with_size(state_size, 0, w->H); if (!w->movstat_workspace_p) { gsl_filter_rmedian_free(w); GSL_ERROR_NULL ("failed to allocate space for movstat workspace", GSL_ENOMEM); } return w; } void gsl_filter_rmedian_free(gsl_filter_rmedian_workspace * w) { if (w->state) free(w->state); if (w->window) free(w->window); if (w->movstat_workspace_p) gsl_movstat_free(w->movstat_workspace_p); free(w); } /* gsl_filter_rmedian() Recursive median filter Inputs: endtype - end point handling x - input vector y - output vector w - workspace */ int gsl_filter_rmedian(const gsl_filter_end_t endtype, const gsl_vector * x, gsl_vector * y, gsl_filter_rmedian_workspace * w) { if (x->size != y->size) { GSL_ERROR("input and output vectors must have same length", GSL_EBADLEN); } else { int status = GSL_SUCCESS; const size_t n = x->size; const int H = (int) w->H; double yprev; int wsize; /* find median of first window to initialize filter */ wsize = gsl_movstat_fill(endtype, x, 0, H, H, w->window); yprev = gsl_stats_median(w->window, 1, wsize); gsl_vector_set(y, 0, yprev); if (x->size > 1) { gsl_vector_const_view xv = gsl_vector_const_subvector(x, 1, n - 1); gsl_vector_view yv = gsl_vector_subvector(y, 1, n - 1); /* apply recursive median filter to x[2:end] */ status = gsl_movstat_apply_accum(endtype, &xv.vector, &rmedian_accum_type, (void *) &yprev, &yv.vector, NULL, w->movstat_workspace_p); } return status; } } static size_t rmedian_size(const size_t n) { size_t size = 0; const gsl_movstat_accum * acc = gsl_movstat_accum_minmax; size += sizeof(rmedian_state_t); size += (acc->size)(n); return size; } static int rmedian_init(const size_t n, void * vstate) { rmedian_state_t * state = (rmedian_state_t *) vstate; state->minmax_acc = gsl_movstat_accum_minmax; state->minmax_state = (void *) ((unsigned char *) vstate + sizeof(rmedian_state_t)); (state->minmax_acc->init)(n, state->minmax_state); return GSL_SUCCESS; } static int rmedian_insert(const double x, void * vstate) { rmedian_state_t * state = (rmedian_state_t *) vstate; return (state->minmax_acc->insert)(x, state->minmax_state); } static int rmedian_delete(void * vstate) { rmedian_state_t * state = (rmedian_state_t *) vstate; return (state->minmax_acc->delete_oldest)(state->minmax_state); } static int rmedian_get(void * params, double * result, const void * vstate) { const rmedian_state_t * state = (const rmedian_state_t *) vstate; double *yprev = (double *) params; /* previous filter output */ double y; /* new filter output */ double xminmax[2]; /* get minimum/maximum values of {x_i,...,x_{i+H}} */ (state->minmax_acc->get)(NULL, xminmax, state->minmax_state); /* y = median [ yprev, xmin, xmax ] */ if (*yprev <= xminmax[0]) y = xminmax[0]; else if (*yprev <= xminmax[1]) y = *yprev; else y = xminmax[1]; *result = y; *yprev = y; return GSL_SUCCESS; } static const gsl_movstat_accum rmedian_accum_type = { rmedian_size, rmedian_init, rmedian_insert, rmedian_delete, rmedian_get }; gsl-2.7.1/filter/test.c0000644016036000116100000000376213373111455011651 00000000000000/* filter/test.c * * Copyright (C) 2018 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 /* compare two vectors */ static void compare_vectors(const double tol, const gsl_vector * v, const gsl_vector * expected, const char * desc) { const size_t n = v->size; size_t i; for (i = 0; i < n; ++i) { double vi = gsl_vector_get(v, i); double ui = gsl_vector_get(expected, i); gsl_test_rel(vi, ui, tol, "%s i=%zu", desc, i); } } /* generate random vector with elements in [-1,1] */ static void random_vector(gsl_vector * v, gsl_rng * r) { size_t i; for (i = 0; i < v->size; ++i) { double vi = 2.0 * gsl_rng_uniform(r) - 1.0; /* in [-1,1] */ gsl_vector_set(v, i, vi); } } #include "test_impulse.c" #include "test_gaussian.c" #include "test_median.c" #include "test_rmedian.c" int main() { gsl_rng * r = gsl_rng_alloc(gsl_rng_default); test_gaussian(r); test_impulse(r); test_median(r); test_rmedian(r); gsl_rng_free(r); exit (gsl_test_summary()); } gsl-2.7.1/movstat/0000755016036000116100000000000014151602576011012 500000000000000gsl-2.7.1/movstat/Makefile.am0000644016036000116100000000246213517226440012767 00000000000000noinst_LTLIBRARIES = libgslmovstat.la pkginclude_HEADERS = gsl_movstat.h AM_CPPFLAGS = -I$(top_srcdir) libgslmovstat_la_SOURCES = \ alloc.c \ apply.c \ fill.c \ funcacc.c \ madacc.c \ medacc.c \ mmacc.c \ movmad.c \ movmean.c \ movmedian.c \ movminmax.c \ movsum.c \ movSn.c \ movQn.c \ movqqr.c \ movvariance.c \ mvacc.c \ qnacc.c \ qqracc.c \ snacc.c \ sumacc.c noinst_HEADERS = deque.c ringbuf.c test_mad.c test_mean.c test_median.c test_minmax.c test_Qn.c test_qqr.c test_Sn.c test_sum.c test_variance.c check_PROGRAMS = test TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslmovstat.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 ../vector/libgslvector.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../block/libgslblock.la ../sys/libgslsys.la ../utils/libutils.la gsl-2.7.1/movstat/deque.c0000644016036000116100000001154513373111455012203 00000000000000/* movstat/deque.c * * Double-ended queue based on a circular buffer * * Copyright (C) 2018 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 int deque_type_t; typedef struct { int head; int tail; int size; /* total elements allocated */ deque_type_t *array; } deque; static size_t deque_size(const size_t n); static int deque_init(const size_t n, deque * d); static int deque_empty(deque * d); static int deque_is_empty(const deque * d); static int deque_is_full(const deque * d); static int deque_push_front(const deque_type_t x, deque * d); static int deque_push_back(const deque_type_t x, deque * d); static int deque_pop_front(deque * d); static int deque_pop_back(deque * d); static deque_type_t deque_peek_front(const deque * d); static deque_type_t deque_peek_back(const deque * d); static size_t deque_size(const size_t n) { size_t size = 0; size += sizeof(deque); size += n * sizeof(deque_type_t); /* array */ return size; } static int deque_init(const size_t n, deque * d) { d->head = -1; d->tail = 0; d->size = (int) n; d->array = (deque_type_t *) ((unsigned char *) d + sizeof(deque)); return GSL_SUCCESS; } /* empty the queue */ static int deque_empty(deque * d) { d->head = -1; d->tail = 0; return GSL_SUCCESS; } /* check if queue is empty */ static int deque_is_empty(const deque * d) { return (d->head == -1); } /* check if queue is full */ static int deque_is_full(const deque * d) { return ((d->head == 0 && d->tail == d->size - 1) || (d->head == d->tail + 1)); } static int deque_push_front(const deque_type_t x, deque * d) { if (deque_is_full(d)) { GSL_ERROR("deque is full", GSL_EOVRFLW); } else { if (d->head == -1) /* queue is empty */ { d->head = 0; d->tail = 0; } else if (d->head == 0) /* head is in first position, wrap to end */ { d->head = d->size - 1; } else /* decrement head */ { --(d->head); } /* insert element */ d->array[d->head] = x; return GSL_SUCCESS; } } static int deque_push_back(const deque_type_t x, deque * d) { if (deque_is_full(d)) { GSL_ERROR("deque is full", GSL_EOVRFLW); } else { if (d->head == -1) /* queue is empty */ { d->head = 0; d->tail = 0; } else if (d->tail == d->size - 1) /* tail is in last position, wrap to 0 */ { d->tail = 0; } else /* increment tail */ { ++(d->tail); } /* insert element */ d->array[d->tail] = x; return GSL_SUCCESS; } } static int deque_pop_front(deque * d) { if (deque_is_empty(d)) { GSL_ERROR("cannot pop element from empty queue", GSL_EOVRFLW); } else { if (d->head == d->tail) /* queue has only one element */ { d->head = -1; d->tail = -1; } else if (d->head == d->size - 1) /* head is in last position, wrap to 0 */ { d->head = 0; } else /* increment head */ { ++(d->head); } return GSL_SUCCESS; } } static int deque_pop_back(deque * d) { if (deque_is_empty(d)) { GSL_ERROR("cannot pop element from empty queue", GSL_EOVRFLW); } else { if (d->head == d->tail) /* queue has only one element */ { d->head = -1; d->tail = -1; } else if (d->tail == 0) /* tail is in first position, wrap to end */ { d->tail = d->size - 1; } else /* decrement tail */ { --(d->tail); } return GSL_SUCCESS; } } static deque_type_t deque_peek_front(const deque * d) { if (deque_is_empty(d)) { GSL_ERROR("queue is empty", GSL_EBADLEN); } else { return d->array[d->head]; } } static deque_type_t deque_peek_back(const deque * d) { if (deque_is_empty(d) || d->tail < 0) { GSL_ERROR("queue is empty", GSL_EBADLEN); } else { return d->array[d->tail]; } } gsl-2.7.1/movstat/ringbuf.c0000644016036000116100000001140413373111456012527 00000000000000/* movstat/ringbuf.c * * Ring buffer module * * Copyright (C) 2018 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_RINGBUF_C__ #define __GSL_RINGBUF_C__ /*typedef int ringbuf_type;*/ typedef struct { ringbuf_type_t *array; int head; int tail; int size; /* total elements allocated */ } ringbuf; static size_t ringbuf_size(const size_t n); static int ringbuf_empty(ringbuf * d); static int ringbuf_is_empty(const ringbuf * d); static int ringbuf_is_full(const ringbuf * d); static int ringbuf_insert(const ringbuf_type_t x, ringbuf * d); static int ringbuf_pop_back(ringbuf * b); static ringbuf_type_t ringbuf_peek(const int i, const ringbuf * b); static ringbuf_type_t ringbuf_peek_front(const ringbuf * d); static ringbuf_type_t ringbuf_peek_back(const ringbuf * d); static size_t ringbuf_copy(double * dest, const ringbuf * b); static int ringbuf_n(const ringbuf * b); static size_t ringbuf_size(const size_t n) { size_t size = 0; size += sizeof(ringbuf); size += n * sizeof(ringbuf_type_t); /* b->array */ return size; } static int ringbuf_init(const size_t n, ringbuf * b) { b->array = (ringbuf_type_t *) ((char *) b + sizeof(ringbuf)); b->head = -1; b->tail = 0; b->size = (int) n; return GSL_SUCCESS; } /* empty the buffer */ static int ringbuf_empty(ringbuf * b) { b->head = -1; b->tail = 0; return GSL_SUCCESS; } /* check if buffer is empty */ static int ringbuf_is_empty(const ringbuf * b) { return (b->head == -1); } /* check if buffer is full */ static int ringbuf_is_full(const ringbuf * b) { return ((b->head == 0 && b->tail == b->size - 1) || (b->head == b->tail + 1)); } /* insert element into buffer, overwriting oldest element if necessary */ static int ringbuf_insert(const ringbuf_type_t x, ringbuf * b) { if (b->head == -1) /* buffer is empty */ { b->head = 0; b->tail = 0; } else if (b->head == 0) /* head is in first position, wrap to end */ { b->head = b->size - 1; if (b->tail == b->head && b->size > 1) --(b->tail); /* buffer is full so decrease tail */ } else /* decrement head */ { --(b->head); if (b->tail == b->head) { /* buffer is full so update tail */ if (b->tail == 0) b->tail = b->size - 1; else --(b->tail); } } /* insert element */ b->array[b->head] = x; return GSL_SUCCESS; } static int ringbuf_pop_back(ringbuf * b) { if (ringbuf_is_empty(b) || b->tail < 0) { GSL_ERROR("buffer is empty", GSL_EBADLEN); } else { if (b->head == b->tail) /* buffer has only one element */ { b->head = -1; b->tail = -1; } else if (b->tail == 0) /* tail is in first position, wrap to end */ { b->tail = b->size - 1; } else /* decrement tail */ { --(b->tail); } return GSL_SUCCESS; } } static ringbuf_type_t ringbuf_peek(const int i, const ringbuf * b) { if (ringbuf_is_empty(b)) { GSL_ERROR("buffer is empty", GSL_EBADLEN); } else { return b->array[(b->head + i) % b->size]; } } static ringbuf_type_t ringbuf_peek_front(const ringbuf * b) { if (ringbuf_is_empty(b)) { GSL_ERROR("buffer is empty", GSL_EBADLEN); } else { return b->array[b->head]; } } static ringbuf_type_t ringbuf_peek_back(const ringbuf * b) { if (ringbuf_is_empty(b) || b->tail < 0) { GSL_ERROR("buffer is empty", GSL_EBADLEN); } else { return b->array[b->tail]; } } static size_t ringbuf_copy(double * dest, const ringbuf * b) { if (ringbuf_is_empty(b) || b->tail < 0) { return 0; } else { const int n = ringbuf_n(b); int i; for (i = 0; i < n; ++i) dest[i] = b->array[(b->head + i) % b->size]; return (size_t) n; } } static int ringbuf_n(const ringbuf * b) { const int n = (b->head > b->tail) ? (b->size - b->head + b->tail + 1) : (b->tail - b->head + 1); return n; } #endif /* __GSL_RINGBUF_C__ */ gsl-2.7.1/movstat/test_mad.c0000644016036000116100000001420613373111456012676 00000000000000/* movstat/test_mad.c * * Copyright (C) 2018 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 /* compute filtered data by explicitely constructing window and finding MAD */ int slow_movmad(const gsl_movstat_end_t etype, const gsl_vector * x, gsl_vector * y, const int H, const int J) { const size_t n = x->size; const int K = H + J + 1; double *window = malloc(K * sizeof(double)); size_t i; for (i = 0; i < n; ++i) { size_t wsize = gsl_movstat_fill(etype, x, i, H, J, window); double median = gsl_stats_median(window, 1, wsize); double mad; size_t j; for (j = 0; j < wsize; ++j) window[j] = fabs(window[j] - median); mad = gsl_stats_median(window, 1, wsize); gsl_vector_set(y, i, mad); } free(window); return GSL_SUCCESS; } static double func_mad(const size_t n, double x[], void * params) { double *work = malloc(n * sizeof(double)); double mad; (void) params; mad = gsl_stats_mad0(x, 1, n, work); free(work); return mad; } static void test_mad_proc(const double tol, const size_t n, const size_t H, const size_t J, const gsl_movstat_end_t etype, gsl_rng *rng_p) { const double scale = 1.482602218505602; gsl_movstat_workspace *w; gsl_vector *x = gsl_vector_alloc(n); gsl_vector *y = gsl_vector_alloc(n); gsl_vector *z = gsl_vector_alloc(n); gsl_vector *med1 = gsl_vector_alloc(n); gsl_vector *med2 = gsl_vector_alloc(n); gsl_movstat_function F; char buf[2048]; F.function = func_mad; F.params = NULL; if (H == J) w = gsl_movstat_alloc(2*H + 1); else w = gsl_movstat_alloc2(H, J); /* test moving MAD with random input */ random_vector(x, rng_p); /* y = MAD(x) with slow brute force algorithm */ slow_movmad(etype, x, y, H, J); /* z = MAD(x) */ gsl_movstat_mad0(etype, x, med1, z, w); /* med2 = median(x) */ gsl_movstat_median(etype, x, med2, w); /* test y = z */ sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u MAD0 random", n, H, J, etype); compare_vectors(tol, z, y, buf); /* test med1 = med2 */ sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u MAD0 random median test", n, H, J, etype); compare_vectors(tol, med1, med2, buf); /* z = MAD(x) in-place */ gsl_vector_memcpy(z, x); gsl_movstat_mad0(etype, z, med1, z, w); sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u MAD0 random in-place", n, H, J, etype); compare_vectors(tol, z, y, buf); /* z = MAD(x) with user-defined function */ gsl_movstat_apply(etype, &F, x, z, w); sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u MAD0 user", n, H, J, etype); compare_vectors(tol, z, y, buf); /* test scaled MAD function */ /* z = MAD(x) */ gsl_movstat_mad(etype, x, med1, z, w); sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u MAD random", n, H, J, etype); gsl_vector_scale(y, scale); compare_vectors(tol, z, y, buf); gsl_vector_free(x); gsl_vector_free(y); gsl_vector_free(z); gsl_vector_free(med1); gsl_vector_free(med2); gsl_movstat_free(w); } static void test_mad(gsl_rng * rng_p) { test_mad_proc(GSL_DBL_EPSILON, 100, 0, 0, GSL_MOVSTAT_END_PADZERO, rng_p); test_mad_proc(GSL_DBL_EPSILON, 1000, 1, 1, GSL_MOVSTAT_END_PADZERO, rng_p); test_mad_proc(GSL_DBL_EPSILON, 5000, 8, 8, GSL_MOVSTAT_END_PADZERO, rng_p); test_mad_proc(GSL_DBL_EPSILON, 5000, 0, 5, GSL_MOVSTAT_END_PADZERO, rng_p); test_mad_proc(GSL_DBL_EPSILON, 5000, 5, 0, GSL_MOVSTAT_END_PADZERO, rng_p); test_mad_proc(GSL_DBL_EPSILON, 5000, 15, 10, GSL_MOVSTAT_END_PADZERO, rng_p); test_mad_proc(GSL_DBL_EPSILON, 5000, 10, 15, GSL_MOVSTAT_END_PADZERO, rng_p); test_mad_proc(GSL_DBL_EPSILON, 50, 100, 150, GSL_MOVSTAT_END_PADZERO, rng_p); test_mad_proc(GSL_DBL_EPSILON, 50, 150, 100, GSL_MOVSTAT_END_PADZERO, rng_p); test_mad_proc(GSL_DBL_EPSILON, 50, 100, 100, GSL_MOVSTAT_END_PADZERO, rng_p); test_mad_proc(GSL_DBL_EPSILON, 100, 0, 0, GSL_MOVSTAT_END_PADVALUE, rng_p); test_mad_proc(GSL_DBL_EPSILON, 1000, 1, 1, GSL_MOVSTAT_END_PADVALUE, rng_p); test_mad_proc(GSL_DBL_EPSILON, 5000, 8, 8, GSL_MOVSTAT_END_PADVALUE, rng_p); test_mad_proc(GSL_DBL_EPSILON, 5000, 0, 5, GSL_MOVSTAT_END_PADVALUE, rng_p); test_mad_proc(GSL_DBL_EPSILON, 5000, 5, 0, GSL_MOVSTAT_END_PADVALUE, rng_p); test_mad_proc(GSL_DBL_EPSILON, 5000, 15, 10, GSL_MOVSTAT_END_PADVALUE, rng_p); test_mad_proc(GSL_DBL_EPSILON, 5000, 10, 15, GSL_MOVSTAT_END_PADVALUE, rng_p); test_mad_proc(GSL_DBL_EPSILON, 50, 100, 150, GSL_MOVSTAT_END_PADVALUE, rng_p); test_mad_proc(GSL_DBL_EPSILON, 50, 150, 100, GSL_MOVSTAT_END_PADVALUE, rng_p); test_mad_proc(GSL_DBL_EPSILON, 50, 100, 100, GSL_MOVSTAT_END_PADVALUE, rng_p); test_mad_proc(GSL_DBL_EPSILON, 100, 0, 0, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_mad_proc(GSL_DBL_EPSILON, 1000, 1, 1, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_mad_proc(GSL_DBL_EPSILON, 5000, 8, 8, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_mad_proc(GSL_DBL_EPSILON, 5000, 0, 5, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_mad_proc(GSL_DBL_EPSILON, 5000, 5, 0, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_mad_proc(GSL_DBL_EPSILON, 5000, 15, 10, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_mad_proc(GSL_DBL_EPSILON, 5000, 10, 15, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_mad_proc(GSL_DBL_EPSILON, 50, 100, 150, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_mad_proc(GSL_DBL_EPSILON, 50, 150, 100, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_mad_proc(GSL_DBL_EPSILON, 50, 100, 100, GSL_MOVSTAT_END_TRUNCATE, rng_p); } gsl-2.7.1/movstat/test_mean.c0000644016036000116100000001123513373111456013054 00000000000000/* movstat/test_mean.c * * Copyright (C) 2018 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 /* compute moving mean by explicitely constructing window and computing mean */ int slow_movmean(const gsl_movstat_end_t etype, const gsl_vector * x, gsl_vector * y, const int H, const int J) { const size_t n = x->size; const int K = H + J + 1; double *window = malloc(K * sizeof(double)); size_t i; for (i = 0; i < n; ++i) { size_t wsize = gsl_movstat_fill(etype, x, i, H, J, window); double mean = gsl_stats_mean(window, 1, wsize); gsl_vector_set(y, i, mean); } free(window); return GSL_SUCCESS; } static double func_mean(const size_t n, double x[], void * params) { (void) params; return gsl_stats_mean(x, 1, n); } static void test_mean_proc(const double tol, const size_t n, const size_t H, const size_t J, const gsl_movstat_end_t etype, gsl_rng * rng_p) { gsl_movstat_workspace * w = gsl_movstat_alloc2(H, J); gsl_vector * x = gsl_vector_alloc(n); gsl_vector * y = gsl_vector_alloc(n); gsl_vector * z = gsl_vector_alloc(n); gsl_movstat_function F; char buf[2048]; F.function = func_mean; F.params = NULL; random_vector(x, rng_p); /* y = mean(x) with slow brute force method */ slow_movmean(etype, x, y, H, J); /* y = mean(x) with fast method */ gsl_movstat_mean(etype, x, z, w); /* test y = z */ sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u mean random", n, H, J, etype); compare_vectors(tol, z, y, buf); /* z = mean(x) in-place */ gsl_vector_memcpy(z, x); gsl_movstat_mean(etype, z, z, w); sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u mean random in-place", n, H, J, etype); compare_vectors(tol, z, y, buf); /* z = mean(x) with user-defined function */ gsl_movstat_apply(etype, &F, x, z, w); sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u mean user", n, H, J, etype); compare_vectors(tol, z, y, buf); gsl_movstat_free(w); gsl_vector_free(x); gsl_vector_free(y); gsl_vector_free(z); } static void test_mean(gsl_rng * rng_p) { const double eps = 1.0e-10; test_mean_proc(eps, 1000, 0, 0, GSL_MOVSTAT_END_PADZERO, rng_p); test_mean_proc(eps, 1000, 3, 3, GSL_MOVSTAT_END_PADZERO, rng_p); test_mean_proc(eps, 1000, 0, 5, GSL_MOVSTAT_END_PADZERO, rng_p); test_mean_proc(eps, 1000, 5, 0, GSL_MOVSTAT_END_PADZERO, rng_p); test_mean_proc(eps, 2000, 10, 5, GSL_MOVSTAT_END_PADZERO, rng_p); test_mean_proc(eps, 2000, 5, 10, GSL_MOVSTAT_END_PADZERO, rng_p); test_mean_proc(eps, 20, 50, 50, GSL_MOVSTAT_END_PADZERO, rng_p); test_mean_proc(eps, 20, 10, 50, GSL_MOVSTAT_END_PADZERO, rng_p); test_mean_proc(eps, 20, 50, 10, GSL_MOVSTAT_END_PADZERO, rng_p); test_mean_proc(eps, 1000, 0, 0, GSL_MOVSTAT_END_PADVALUE, rng_p); test_mean_proc(eps, 1000, 3, 3, GSL_MOVSTAT_END_PADVALUE, rng_p); test_mean_proc(eps, 1000, 0, 5, GSL_MOVSTAT_END_PADVALUE, rng_p); test_mean_proc(eps, 1000, 5, 0, GSL_MOVSTAT_END_PADVALUE, rng_p); test_mean_proc(eps, 2000, 10, 5, GSL_MOVSTAT_END_PADVALUE, rng_p); test_mean_proc(eps, 2000, 5, 10, GSL_MOVSTAT_END_PADVALUE, rng_p); test_mean_proc(eps, 20, 50, 50, GSL_MOVSTAT_END_PADVALUE, rng_p); test_mean_proc(eps, 20, 10, 50, GSL_MOVSTAT_END_PADVALUE, rng_p); test_mean_proc(eps, 20, 50, 10, GSL_MOVSTAT_END_PADVALUE, rng_p); test_mean_proc(eps, 1000, 0, 0, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_mean_proc(eps, 1000, 3, 3, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_mean_proc(eps, 1000, 0, 5, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_mean_proc(eps, 1000, 5, 0, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_mean_proc(eps, 2000, 10, 5, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_mean_proc(eps, 2000, 5, 10, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_mean_proc(eps, 20, 50, 50, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_mean_proc(eps, 20, 10, 50, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_mean_proc(eps, 20, 50, 10, GSL_MOVSTAT_END_TRUNCATE, rng_p); } gsl-2.7.1/movstat/test_median.c0000644016036000116100000001513213373111456013371 00000000000000/* movstat/test_median.c * * Copyright (C) 2018 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 /* compute filtered data by explicitely constructing window, sorting it and finding median */ int slow_movmedian(const gsl_movstat_end_t etype, const gsl_vector * x, gsl_vector * y, const int H, const int J) { const size_t n = x->size; const int K = H + J + 1; double *window = malloc(K * sizeof(double)); size_t i; for (i = 0; i < n; ++i) { size_t wsize = gsl_movstat_fill(etype, x, i, H, J, window); double yi = gsl_stats_median(window, 1, wsize); gsl_vector_set(y, i, yi); } free(window); return GSL_SUCCESS; } /* test root sequence */ static void test_median_root(const double tol, const size_t n, const size_t K, const gsl_movstat_end_t etype) { gsl_movstat_workspace *w = gsl_movstat_alloc(K); gsl_vector *x = gsl_vector_alloc(n); gsl_vector *y = gsl_vector_alloc(n); char buf[2048]; size_t i; /* test a root sequence (square input): x = [zero one zero] */ gsl_vector_set_all(x, 0.0); for (i = n / 3; i <= n / 2; ++i) gsl_vector_set(x, i, 1.0); /* compute y = median(x) and test y = x */ gsl_movstat_median(etype, x, y, w); sprintf(buf, "n=%zu K=%zu endtype=%u SMF root sequence", n, K, etype); compare_vectors(tol, y, x, buf); gsl_vector_free(x); gsl_vector_free(y); gsl_movstat_free(w); } static double func_median(const size_t n, double x[], void * params) { (void) params; return gsl_stats_median(x, 1, n); } static void test_median_proc(const double tol, const size_t n, const size_t H, const size_t J, const gsl_movstat_end_t etype, gsl_rng *rng_p) { gsl_movstat_workspace *w; gsl_vector *x = gsl_vector_alloc(n); gsl_vector *y = gsl_vector_alloc(n); gsl_vector *z = gsl_vector_alloc(n); gsl_movstat_function F; char buf[2048]; F.function = func_median; F.params = NULL; if (H == J) w = gsl_movstat_alloc(2*H + 1); else w = gsl_movstat_alloc2(H, J); /* test moving median with random input */ random_vector(x, rng_p); /* y = median(x) with slow brute force algorithm */ slow_movmedian(etype, x, y, H, J); /* z = median(x) */ gsl_movstat_median(etype, x, z, w); /* test y = z */ sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u median random", n, H, J, etype); compare_vectors(tol, z, y, buf); /* z = median(x) in-place */ gsl_vector_memcpy(z, x); gsl_movstat_median(etype, z, z, w); sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u median random in-place", n, H, J, etype); compare_vectors(tol, z, y, buf); /* z = median(x) with user-defined function */ gsl_movstat_apply(etype, &F, x, z, w); sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u median user", n, H, J, etype); compare_vectors(tol, z, y, buf); gsl_vector_free(x); gsl_vector_free(y); gsl_vector_free(z); gsl_movstat_free(w); } static void test_median(gsl_rng * rng_p) { test_median_root(GSL_DBL_EPSILON, 1000, 3, GSL_MOVSTAT_END_PADZERO); test_median_root(GSL_DBL_EPSILON, 200, 15, GSL_MOVSTAT_END_PADVALUE); test_median_root(GSL_DBL_EPSILON, 100, 5, GSL_MOVSTAT_END_TRUNCATE); test_median_proc(GSL_DBL_EPSILON, 1000, 0, 0, GSL_MOVSTAT_END_PADZERO, rng_p); test_median_proc(GSL_DBL_EPSILON, 1000, 1, 1, GSL_MOVSTAT_END_PADZERO, rng_p); test_median_proc(GSL_DBL_EPSILON, 100, 150, 150, GSL_MOVSTAT_END_PADZERO, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 8, 8, GSL_MOVSTAT_END_PADZERO, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 0, 5, GSL_MOVSTAT_END_PADZERO, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 5, 0, GSL_MOVSTAT_END_PADZERO, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 15, 10, GSL_MOVSTAT_END_PADZERO, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 10, 15, GSL_MOVSTAT_END_PADZERO, rng_p); test_median_proc(GSL_DBL_EPSILON, 50, 100, 150, GSL_MOVSTAT_END_PADZERO, rng_p); test_median_proc(GSL_DBL_EPSILON, 50, 150, 100, GSL_MOVSTAT_END_PADZERO, rng_p); test_median_proc(GSL_DBL_EPSILON, 50, 100, 100, GSL_MOVSTAT_END_PADZERO, rng_p); test_median_proc(GSL_DBL_EPSILON, 1000, 0, 0, GSL_MOVSTAT_END_PADVALUE, rng_p); test_median_proc(GSL_DBL_EPSILON, 1000, 1, 1, GSL_MOVSTAT_END_PADVALUE, rng_p); test_median_proc(GSL_DBL_EPSILON, 100, 150, 150, GSL_MOVSTAT_END_PADVALUE, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 8, 8, GSL_MOVSTAT_END_PADVALUE, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 0, 5, GSL_MOVSTAT_END_PADVALUE, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 5, 0, GSL_MOVSTAT_END_PADVALUE, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 15, 10, GSL_MOVSTAT_END_PADVALUE, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 10, 15, GSL_MOVSTAT_END_PADVALUE, rng_p); test_median_proc(GSL_DBL_EPSILON, 50, 100, 150, GSL_MOVSTAT_END_PADVALUE, rng_p); test_median_proc(GSL_DBL_EPSILON, 50, 150, 100, GSL_MOVSTAT_END_PADVALUE, rng_p); test_median_proc(GSL_DBL_EPSILON, 50, 100, 100, GSL_MOVSTAT_END_PADVALUE, rng_p); test_median_proc(GSL_DBL_EPSILON, 1000, 0, 0, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_median_proc(GSL_DBL_EPSILON, 1000, 1, 1, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_median_proc(GSL_DBL_EPSILON, 100, 150, 150, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 8, 8, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 0, 5, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 5, 0, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 15, 10, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_median_proc(GSL_DBL_EPSILON, 5000, 10, 15, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_median_proc(GSL_DBL_EPSILON, 50, 100, 150, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_median_proc(GSL_DBL_EPSILON, 50, 150, 100, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_median_proc(GSL_DBL_EPSILON, 50, 100, 100, GSL_MOVSTAT_END_TRUNCATE, rng_p); } gsl-2.7.1/movstat/test_minmax.c0000644016036000116100000002362713373111456013435 00000000000000/* movstat/test_minmax.c * * Copyright (C) 2018 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 /* compute filtered data by explicitely constructing window and finding min/max */ int slow_minmax(const gsl_movstat_end_t etype, const gsl_vector * x, gsl_vector * y_min, gsl_vector * y_max, const int H, const int J) { const size_t n = x->size; const int K = H + J + 1; double *window = malloc(K * sizeof(double)); size_t i; for (i = 0; i < n; ++i) { size_t wsize = gsl_movstat_fill(etype, x, i, H, J, window); gsl_vector_view v = gsl_vector_view_array(window, wsize); double min, max; gsl_vector_minmax(&v.vector, &min, &max); gsl_vector_set(y_min, i, min); gsl_vector_set(y_max, i, max); } free(window); return GSL_SUCCESS; } static double func_min(const size_t n, double x[], void * params) { gsl_vector_view v = gsl_vector_view_array(x, n); (void) params; return gsl_vector_min(&v.vector); } static double func_max(const size_t n, double x[], void * params) { gsl_vector_view v = gsl_vector_view_array(x, n); (void) params; return gsl_vector_max(&v.vector); } static void test_minmax_x(const double tol, const gsl_vector * x, const int H, const int J, const gsl_movstat_end_t endtype, const char * desc) { const size_t n = x->size; gsl_vector * u_min = gsl_vector_alloc(n); gsl_vector * y_min = gsl_vector_alloc(n); gsl_vector * z_min = gsl_vector_alloc(n); gsl_vector * u_max = gsl_vector_alloc(n); gsl_vector * y_max = gsl_vector_alloc(n); gsl_vector * z_max = gsl_vector_alloc(n); gsl_movstat_workspace * w = gsl_movstat_alloc2(H, J); gsl_movstat_function F1, F2; char buf[2048]; F1.function = func_min; F1.params = NULL; F2.function = func_max; F2.params = NULL; /* compute moving min/max */ gsl_movstat_min(endtype, x, u_min, w); gsl_movstat_max(endtype, x, u_max, w); gsl_movstat_minmax(endtype, x, y_min, y_max, w); /* compute moving min/max with slow brute force method */ slow_minmax(endtype, x, z_min, z_max, H, J); sprintf(buf, "test_minmax: %s min endtype=%d n=%zu H=%d J=%d", desc, endtype, n, H, J); compare_vectors(tol, u_min, z_min, buf); sprintf(buf, "test_minmax: %s max endtype=%d n=%zu H=%d J=%d", desc, endtype, n, H, J); compare_vectors(tol, u_max, z_max, buf); sprintf(buf, "test_minmax: %s minmax(minimum) endtype=%d n=%zu H=%d J=%d", desc, endtype, n, H, J); compare_vectors(tol, y_min, z_min, buf); sprintf(buf, "test_minmax: %s minmax(maximum) endtype=%d n=%zu H=%d J=%d", desc, endtype, n, H, J); compare_vectors(tol, y_max, z_max, buf); /* in-place tests */ gsl_vector_memcpy(u_min, x); gsl_vector_memcpy(u_max, x); gsl_movstat_min(endtype, u_min, u_min, w); gsl_movstat_max(endtype, u_max, u_max, w); sprintf(buf, "test_minmax: %s in-place min endtype=%d n=%zu H=%d J=%d", desc, endtype, n, H, J); compare_vectors(tol, u_min, z_min, buf); sprintf(buf, "test_minmax: %s in-place max endtype=%d n=%zu H=%d J=%d", desc, endtype, n, H, J); compare_vectors(tol, u_max, z_max, buf); /* user-defined function tests */ gsl_movstat_apply(endtype, &F1, x, z_min, w); sprintf(buf, "n=%zu H=%d J=%d endtype=%u min user", n, H, J, endtype); compare_vectors(tol, z_min, y_min, buf); gsl_movstat_apply(endtype, &F2, x, z_max, w); sprintf(buf, "n=%zu H=%d J=%d endtype=%u max user", n, H, J, endtype); compare_vectors(tol, z_max, y_max, buf); gsl_vector_free(u_min); gsl_vector_free(y_min); gsl_vector_free(z_min); gsl_vector_free(u_max); gsl_vector_free(y_max); gsl_vector_free(z_max); gsl_movstat_free(w); } /* test alternating sequence [a,b,a,b,...] input */ static void test_minmax_alt(const double tol, const size_t n, const int H, const int J, const gsl_movstat_end_t endtype) { const double a = 5.0; const double b = -5.0; gsl_vector * x = gsl_vector_alloc(n); size_t i; for (i = 0; i < n; ++i) { if (i % 2 == 0) gsl_vector_set(x, i, a); else gsl_vector_set(x, i, b); } test_minmax_x(tol, x, H, J, endtype, "alternating"); gsl_vector_free(x); } /* test noisy sine wave input */ static void test_minmax_sine(const double tol, const size_t n, const int H, const int J, const gsl_movstat_end_t endtype, gsl_rng * rng_p) { gsl_vector * x = gsl_vector_alloc(n); /* construct noisy sine signal */ test_noisy_sine(0.5, x, rng_p); test_minmax_x(tol, x, H, J, endtype, "noisy_sine"); gsl_vector_free(x); } /* test random input */ static void test_minmax_random(const double tol, const size_t n, const int H, const int J, const gsl_movstat_end_t endtype, gsl_rng * rng_p) { gsl_vector * x = gsl_vector_alloc(n); /* construct random input signal */ random_vector(x, rng_p); test_minmax_x(tol, x, H, J, endtype, "random"); gsl_vector_free(x); } static void test_minmax(gsl_rng * rng_p) { /* alternating input */ test_minmax_alt(GSL_DBL_EPSILON, 1000, 7, 7, GSL_MOVSTAT_END_PADZERO); test_minmax_alt(GSL_DBL_EPSILON, 1000, 5, 2, GSL_MOVSTAT_END_PADZERO); test_minmax_alt(GSL_DBL_EPSILON, 500, 1, 3, GSL_MOVSTAT_END_PADZERO); test_minmax_alt(GSL_DBL_EPSILON, 20, 50, 10, GSL_MOVSTAT_END_PADZERO); test_minmax_alt(GSL_DBL_EPSILON, 20, 10, 50, GSL_MOVSTAT_END_PADZERO); /* noisy sine wave input */ test_minmax_sine(GSL_DBL_EPSILON, 1000, 5, 7, GSL_MOVSTAT_END_PADZERO, rng_p); test_minmax_sine(GSL_DBL_EPSILON, 2000, 0, 2, GSL_MOVSTAT_END_PADZERO, rng_p); test_minmax_sine(GSL_DBL_EPSILON, 500, 3, 0, GSL_MOVSTAT_END_PADZERO, rng_p); test_minmax_sine(GSL_DBL_EPSILON, 20, 50, 50, GSL_MOVSTAT_END_PADZERO, rng_p); test_minmax_sine(GSL_DBL_EPSILON, 20, 10, 50, GSL_MOVSTAT_END_PADZERO, rng_p); test_minmax_sine(GSL_DBL_EPSILON, 20, 50, 10, GSL_MOVSTAT_END_PADZERO, rng_p); test_minmax_sine(GSL_DBL_EPSILON, 500, 5, 7, GSL_MOVSTAT_END_PADVALUE, rng_p); test_minmax_sine(GSL_DBL_EPSILON, 1000, 10, 20, GSL_MOVSTAT_END_PADVALUE, rng_p); test_minmax_sine(GSL_DBL_EPSILON, 1000, 3, 3, GSL_MOVSTAT_END_PADVALUE, rng_p); test_minmax_sine(GSL_DBL_EPSILON, 20, 50, 50, GSL_MOVSTAT_END_PADVALUE, rng_p); test_minmax_sine(GSL_DBL_EPSILON, 20, 10, 50, GSL_MOVSTAT_END_PADVALUE, rng_p); test_minmax_sine(GSL_DBL_EPSILON, 20, 50, 10, GSL_MOVSTAT_END_PADVALUE, rng_p); test_minmax_sine(GSL_DBL_EPSILON, 500, 5, 7, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_minmax_sine(GSL_DBL_EPSILON, 1000, 10, 20, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_minmax_sine(GSL_DBL_EPSILON, 1000, 3, 3, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_minmax_sine(GSL_DBL_EPSILON, 1000, 30, 5, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_minmax_sine(GSL_DBL_EPSILON, 1000, 5, 30, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_minmax_sine(GSL_DBL_EPSILON, 20, 50, 50, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_minmax_sine(GSL_DBL_EPSILON, 20, 10, 50, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_minmax_sine(GSL_DBL_EPSILON, 20, 50, 10, GSL_MOVSTAT_END_TRUNCATE, rng_p); /* random input */ test_minmax_random(GSL_DBL_EPSILON, 1000, 0, 0, GSL_MOVSTAT_END_PADZERO, rng_p); test_minmax_random(GSL_DBL_EPSILON, 1000, 5, 7, GSL_MOVSTAT_END_PADZERO, rng_p); test_minmax_random(GSL_DBL_EPSILON, 2000, 0, 2, GSL_MOVSTAT_END_PADZERO, rng_p); test_minmax_random(GSL_DBL_EPSILON, 500, 3, 0, GSL_MOVSTAT_END_PADZERO, rng_p); test_minmax_random(GSL_DBL_EPSILON, 500, 10, 5, GSL_MOVSTAT_END_PADZERO, rng_p); test_minmax_random(GSL_DBL_EPSILON, 500, 5, 10, GSL_MOVSTAT_END_PADZERO, rng_p); test_minmax_random(GSL_DBL_EPSILON, 20, 50, 50, GSL_MOVSTAT_END_PADZERO, rng_p); test_minmax_random(GSL_DBL_EPSILON, 20, 10, 50, GSL_MOVSTAT_END_PADZERO, rng_p); test_minmax_random(GSL_DBL_EPSILON, 20, 50, 10, GSL_MOVSTAT_END_PADZERO, rng_p); test_minmax_random(GSL_DBL_EPSILON, 1000, 0, 0, GSL_MOVSTAT_END_PADVALUE, rng_p); test_minmax_random(GSL_DBL_EPSILON, 1000, 5, 7, GSL_MOVSTAT_END_PADVALUE, rng_p); test_minmax_random(GSL_DBL_EPSILON, 2000, 0, 2, GSL_MOVSTAT_END_PADVALUE, rng_p); test_minmax_random(GSL_DBL_EPSILON, 500, 3, 0, GSL_MOVSTAT_END_PADVALUE, rng_p); test_minmax_random(GSL_DBL_EPSILON, 500, 10, 5, GSL_MOVSTAT_END_PADVALUE, rng_p); test_minmax_random(GSL_DBL_EPSILON, 500, 5, 10, GSL_MOVSTAT_END_PADVALUE, rng_p); test_minmax_random(GSL_DBL_EPSILON, 20, 50, 50, GSL_MOVSTAT_END_PADVALUE, rng_p); test_minmax_random(GSL_DBL_EPSILON, 20, 10, 50, GSL_MOVSTAT_END_PADVALUE, rng_p); test_minmax_random(GSL_DBL_EPSILON, 20, 50, 10, GSL_MOVSTAT_END_PADVALUE, rng_p); test_minmax_random(GSL_DBL_EPSILON, 1000, 0, 0, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_minmax_random(GSL_DBL_EPSILON, 1000, 5, 7, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_minmax_random(GSL_DBL_EPSILON, 2000, 0, 2, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_minmax_random(GSL_DBL_EPSILON, 500, 3, 0, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_minmax_random(GSL_DBL_EPSILON, 500, 10, 5, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_minmax_random(GSL_DBL_EPSILON, 500, 5, 10, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_minmax_random(GSL_DBL_EPSILON, 20, 50, 50, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_minmax_random(GSL_DBL_EPSILON, 20, 10, 50, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_minmax_random(GSL_DBL_EPSILON, 20, 50, 10, GSL_MOVSTAT_END_TRUNCATE, rng_p); } gsl-2.7.1/movstat/test_Qn.c0000644016036000116100000001257213373111456012517 00000000000000/* movstat/test_Qn.c * * Copyright (C) 2018 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 /* calculate Q_n statistic for input vector using slow/naive algorithm */ static int slow_movQn(const gsl_movstat_end_t etype, const gsl_vector * x, gsl_vector * y, const int H, const int J) { const size_t n = x->size; const int K = H + J + 1; double *window = malloc(K * sizeof(double)); double *work = malloc(3 * K * sizeof(double)); int *work_int = malloc(5 * K * sizeof(int)); size_t i; for (i = 0; i < n; ++i) { size_t wsize = gsl_movstat_fill(etype, x, i, H, J, window); double Qn; gsl_sort(window, 1, wsize); Qn = gsl_stats_Qn_from_sorted_data(window, 1, wsize, work, work_int); gsl_vector_set(y, i, Qn); } free(window); free(work); free(work_int); return GSL_SUCCESS; } static double func_Qn(const size_t n, double x[], void * params) { double *work = malloc(3 * n * sizeof(double)); int *work_int = malloc(5 * n * sizeof(int)); double Qn; (void) params; gsl_sort(x, 1, n); Qn = gsl_stats_Qn_from_sorted_data(x, 1, n, work, work_int); free(work); free(work_int); return Qn; } static void test_Qn_proc(const double tol, const size_t n, const size_t H, const size_t J, const gsl_movstat_end_t etype, gsl_rng *rng_p) { gsl_movstat_workspace *w; gsl_vector *x = gsl_vector_alloc(n); gsl_vector *y = gsl_vector_alloc(n); gsl_vector *z = gsl_vector_alloc(n); gsl_movstat_function F; char buf[2048]; F.function = func_Qn; F.params = NULL; if (H == J) w = gsl_movstat_alloc(2*H + 1); else w = gsl_movstat_alloc2(H, J); /* test moving median with random input */ random_vector(x, rng_p); /* y = Q_n(x) with slow brute force algorithm */ slow_movQn(etype, x, y, H, J); /* z = Q_n(x) */ gsl_movstat_Qn(etype, x, z, w); /* test y = z */ sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u Qn random", n, H, J, etype); compare_vectors(tol, z, y, buf); /* z = Q_n(x) in-place */ gsl_vector_memcpy(z, x); gsl_movstat_Qn(etype, z, z, w); sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u Qn random in-place", n, H, J, etype); compare_vectors(tol, z, y, buf); /* z = Q_n(x) with user-defined function */ gsl_movstat_apply(etype, &F, x, z, w); sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u Qn user", n, H, J, etype); compare_vectors(tol, z, y, buf); gsl_vector_free(x); gsl_vector_free(y); gsl_vector_free(z); gsl_movstat_free(w); } static void test_Qn(gsl_rng * rng_p) { test_Qn_proc(GSL_DBL_EPSILON, 1000, 0, 0, GSL_MOVSTAT_END_PADZERO, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 1000, 5, 5, GSL_MOVSTAT_END_PADZERO, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 1000, 5, 2, GSL_MOVSTAT_END_PADZERO, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 1000, 2, 5, GSL_MOVSTAT_END_PADZERO, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 2000, 50, 0, GSL_MOVSTAT_END_PADZERO, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 2000, 0, 50, GSL_MOVSTAT_END_PADZERO, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 20, 50, 50, GSL_MOVSTAT_END_PADZERO, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 20, 1, 50, GSL_MOVSTAT_END_PADZERO, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 20, 50, 1, GSL_MOVSTAT_END_PADZERO, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 1000, 0, 0, GSL_MOVSTAT_END_PADVALUE, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 1000, 5, 5, GSL_MOVSTAT_END_PADVALUE, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 1000, 5, 2, GSL_MOVSTAT_END_PADVALUE, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 1000, 2, 5, GSL_MOVSTAT_END_PADVALUE, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 2000, 50, 0, GSL_MOVSTAT_END_PADVALUE, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 2000, 0, 50, GSL_MOVSTAT_END_PADVALUE, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 20, 50, 50, GSL_MOVSTAT_END_PADVALUE, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 20, 1, 50, GSL_MOVSTAT_END_PADVALUE, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 20, 50, 1, GSL_MOVSTAT_END_PADVALUE, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 1000, 0, 0, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 1000, 5, 5, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 1000, 5, 2, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 1000, 2, 5, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 2000, 50, 0, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 2000, 0, 50, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 20, 50, 50, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 20, 1, 50, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_Qn_proc(GSL_DBL_EPSILON, 20, 50, 1, GSL_MOVSTAT_END_TRUNCATE, rng_p); } gsl-2.7.1/movstat/test_qqr.c0000644016036000116100000001224513373111456012741 00000000000000/* movstat/test_qqr.c * * Copyright (C) 2018 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 /* compute moving QQR by explicitely constructing window and computing QQR */ int slow_movqqr(const gsl_movstat_end_t etype, const double q, const gsl_vector * x, gsl_vector * y, const int H, const int J) { const size_t n = x->size; const int K = H + J + 1; double *window = malloc(K * sizeof(double)); size_t i; for (i = 0; i < n; ++i) { size_t wsize = gsl_movstat_fill(etype, x, i, H, J, window); double quant1, quant2; gsl_sort(window, 1, wsize); quant1 = gsl_stats_quantile_from_sorted_data(window, 1, wsize, q); quant2 = gsl_stats_quantile_from_sorted_data(window, 1, wsize, 1.0 - q); gsl_vector_set(y, i, quant2 - quant1); } free(window); return GSL_SUCCESS; } static double func_qqr(const size_t n, double x[], void * params) { double q = *(double *) params; double quant1, quant2; (void) params; gsl_sort(x, 1, n); quant1 = gsl_stats_quantile_from_sorted_data(x, 1, n, q); quant2 = gsl_stats_quantile_from_sorted_data(x, 1, n, 1.0 - q); return (quant2 - quant1); } static void test_qqr_proc(const double tol, const double q, const size_t n, const size_t H, const size_t J, const gsl_movstat_end_t etype, gsl_rng * rng_p) { gsl_movstat_workspace * w = gsl_movstat_alloc2(H, J); gsl_vector * x = gsl_vector_alloc(n); gsl_vector * y = gsl_vector_alloc(n); gsl_vector * z = gsl_vector_alloc(n); gsl_movstat_function F; char buf[2048]; F.function = func_qqr; F.params = (void *) &q; random_vector(x, rng_p); /* y = QQR(x) with slow brute force method */ slow_movqqr(etype, q, x, y, H, J); /* y = QQR(x) with fast method */ gsl_movstat_qqr(etype, x, q, z, w); /* test y = z */ sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u QQR random", n, H, J, etype); compare_vectors(tol, z, y, buf); /* z = QQR(x) in-place */ gsl_vector_memcpy(z, x); gsl_movstat_qqr(etype, z, q, z, w); sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u QQR random in-place", n, H, J, etype); compare_vectors(tol, z, y, buf); /* z = QQR(x) with user-defined function */ gsl_movstat_apply(etype, &F, x, z, w); sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u QQR user", n, H, J, etype); compare_vectors(tol, z, y, buf); gsl_movstat_free(w); gsl_vector_free(x); gsl_vector_free(y); gsl_vector_free(z); } static void test_qqr(gsl_rng * rng_p) { const double eps = 1.0e-10; test_qqr_proc(eps, 0.1, 100, 0, 0, GSL_MOVSTAT_END_PADZERO, rng_p); test_qqr_proc(eps, 0.1, 1000, 3, 3, GSL_MOVSTAT_END_PADZERO, rng_p); test_qqr_proc(eps, 0.2, 1000, 0, 5, GSL_MOVSTAT_END_PADZERO, rng_p); test_qqr_proc(eps, 0.3, 1000, 5, 0, GSL_MOVSTAT_END_PADZERO, rng_p); test_qqr_proc(eps, 0.25, 2000, 10, 5, GSL_MOVSTAT_END_PADZERO, rng_p); test_qqr_proc(eps, 0.4, 2000, 5, 10, GSL_MOVSTAT_END_PADZERO, rng_p); test_qqr_proc(eps, 0.25, 20, 50, 50, GSL_MOVSTAT_END_PADZERO, rng_p); test_qqr_proc(eps, 0.25, 20, 10, 50, GSL_MOVSTAT_END_PADZERO, rng_p); test_qqr_proc(eps, 0.25, 20, 50, 10, GSL_MOVSTAT_END_PADZERO, rng_p); test_qqr_proc(eps, 0.1, 100, 0, 0, GSL_MOVSTAT_END_PADVALUE, rng_p); test_qqr_proc(eps, 0.1, 1000, 3, 3, GSL_MOVSTAT_END_PADVALUE, rng_p); test_qqr_proc(eps, 0.2, 1000, 0, 5, GSL_MOVSTAT_END_PADVALUE, rng_p); test_qqr_proc(eps, 0.3, 1000, 5, 0, GSL_MOVSTAT_END_PADVALUE, rng_p); test_qqr_proc(eps, 0.25, 2000, 10, 5, GSL_MOVSTAT_END_PADVALUE, rng_p); test_qqr_proc(eps, 0.4, 2000, 5, 10, GSL_MOVSTAT_END_PADVALUE, rng_p); test_qqr_proc(eps, 0.25, 20, 50, 50, GSL_MOVSTAT_END_PADVALUE, rng_p); test_qqr_proc(eps, 0.25, 20, 10, 50, GSL_MOVSTAT_END_PADVALUE, rng_p); test_qqr_proc(eps, 0.25, 20, 50, 10, GSL_MOVSTAT_END_PADVALUE, rng_p); test_qqr_proc(eps, 0.1, 100, 0, 0, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_qqr_proc(eps, 0.1, 1000, 3, 3, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_qqr_proc(eps, 0.2, 1000, 0, 5, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_qqr_proc(eps, 0.3, 1000, 5, 0, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_qqr_proc(eps, 0.25, 2000, 10, 5, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_qqr_proc(eps, 0.4, 2000, 5, 10, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_qqr_proc(eps, 0.25, 20, 50, 50, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_qqr_proc(eps, 0.25, 20, 10, 50, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_qqr_proc(eps, 0.25, 20, 50, 10, GSL_MOVSTAT_END_TRUNCATE, rng_p); } gsl-2.7.1/movstat/test_Sn.c0000644016036000116100000001231013373111456012507 00000000000000/* movstat/test_Sn.c * * Copyright (C) 2018 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 /* calculate S_n statistic for input vector using slow/naive algorithm */ static int slow_movSn(const gsl_movstat_end_t etype, const gsl_vector * x, gsl_vector * y, const int H, const int J) { const size_t n = x->size; const int K = H + J + 1; double *window = malloc(K * sizeof(double)); double *work = malloc(K * sizeof(double)); size_t i; for (i = 0; i < n; ++i) { size_t wsize = gsl_movstat_fill(etype, x, i, H, J, window); double Sn; gsl_sort(window, 1, wsize); Sn = gsl_stats_Sn_from_sorted_data(window, 1, wsize, work); gsl_vector_set(y, i, Sn); } free(window); free(work); return GSL_SUCCESS; } static double func_Sn(const size_t n, double x[], void * params) { double *work = malloc(n * sizeof(double)); double Sn; (void) params; gsl_sort(x, 1, n); Sn = gsl_stats_Sn_from_sorted_data(x, 1, n, work); free(work); return Sn; } static void test_Sn_proc(const double tol, const size_t n, const size_t H, const size_t J, const gsl_movstat_end_t etype, gsl_rng *rng_p) { gsl_movstat_workspace *w; gsl_vector *x = gsl_vector_alloc(n); gsl_vector *y = gsl_vector_alloc(n); gsl_vector *z = gsl_vector_alloc(n); gsl_movstat_function F; char buf[2048]; F.function = func_Sn; F.params = NULL; if (H == J) w = gsl_movstat_alloc(2*H + 1); else w = gsl_movstat_alloc2(H, J); /* test moving median with random input */ random_vector(x, rng_p); /* y = S_n(x) with slow brute force algorithm */ slow_movSn(etype, x, y, H, J); /* z = S_n(x) */ gsl_movstat_Sn(etype, x, z, w); /* test y = z */ sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u Sn random", n, H, J, etype); compare_vectors(tol, z, y, buf); /* z = S_n(x) in-place */ gsl_vector_memcpy(z, x); gsl_movstat_Sn(etype, z, z, w); sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u Sn random in-place", n, H, J, etype); compare_vectors(tol, z, y, buf); /* z = S_n(x) with user-defined function */ gsl_movstat_apply(etype, &F, x, z, w); sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u Sn user", n, H, J, etype); compare_vectors(tol, z, y, buf); gsl_vector_free(x); gsl_vector_free(y); gsl_vector_free(z); gsl_movstat_free(w); } static void test_Sn(gsl_rng * rng_p) { test_Sn_proc(GSL_DBL_EPSILON, 1000, 0, 0, GSL_MOVSTAT_END_PADZERO, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 1000, 5, 5, GSL_MOVSTAT_END_PADZERO, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 1000, 5, 2, GSL_MOVSTAT_END_PADZERO, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 1000, 2, 5, GSL_MOVSTAT_END_PADZERO, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 2000, 50, 0, GSL_MOVSTAT_END_PADZERO, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 2000, 0, 50, GSL_MOVSTAT_END_PADZERO, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 20, 50, 50, GSL_MOVSTAT_END_PADZERO, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 20, 1, 50, GSL_MOVSTAT_END_PADZERO, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 20, 50, 1, GSL_MOVSTAT_END_PADZERO, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 1000, 0, 0, GSL_MOVSTAT_END_PADVALUE, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 1000, 5, 5, GSL_MOVSTAT_END_PADVALUE, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 1000, 5, 2, GSL_MOVSTAT_END_PADVALUE, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 1000, 2, 5, GSL_MOVSTAT_END_PADVALUE, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 2000, 50, 0, GSL_MOVSTAT_END_PADVALUE, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 2000, 0, 50, GSL_MOVSTAT_END_PADVALUE, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 20, 50, 50, GSL_MOVSTAT_END_PADVALUE, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 20, 1, 50, GSL_MOVSTAT_END_PADVALUE, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 20, 50, 1, GSL_MOVSTAT_END_PADVALUE, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 1000, 0, 0, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 1000, 5, 5, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 1000, 5, 2, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 1000, 2, 5, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 2000, 50, 0, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 2000, 0, 50, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 20, 50, 50, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 20, 1, 50, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_Sn_proc(GSL_DBL_EPSILON, 20, 50, 1, GSL_MOVSTAT_END_TRUNCATE, rng_p); } gsl-2.7.1/movstat/test_sum.c0000644016036000116100000001177613373111456012752 00000000000000/* movstat/test_sum.c * * Copyright (C) 2018 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 /* compute moving sum by explicitely constructing window and summing elements */ int slow_movsum(const gsl_movstat_end_t etype, const gsl_vector * x, gsl_vector * y, const int H, const int J) { const size_t n = x->size; const int K = H + J + 1; double *window = malloc(K * sizeof(double)); size_t i; for (i = 0; i < n; ++i) { size_t wsize = gsl_movstat_fill(etype, x, i, H, J, window); double sum = 0.0; size_t j; for (j = 0; j < wsize; ++j) sum += window[j]; gsl_vector_set(y, i, sum); } free(window); return GSL_SUCCESS; } static double func_sum(const size_t n, double x[], void * params) { double sum = 0.0; size_t i; (void) params; for (i = 0; i < n; ++i) sum += x[i]; return sum; } static void test_sum_proc(const double tol, const size_t n, const size_t H, const size_t J, const gsl_movstat_end_t etype, gsl_rng * rng_p) { gsl_movstat_workspace * w = gsl_movstat_alloc2(H, J); gsl_vector * x = gsl_vector_alloc(n); gsl_vector * y = gsl_vector_alloc(n); gsl_vector * z = gsl_vector_alloc(n); gsl_movstat_function F; char buf[2048]; F.function = func_sum; F.params = NULL; random_vector(x, rng_p); /* y = sum(x) with slow brute force method */ slow_movsum(etype, x, y, H, J); /* y = sum(x) with fast method */ gsl_movstat_sum(etype, x, z, w); /* test y = z */ sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u sum random", n, H, J, etype); compare_vectors(tol, z, y, buf); /* z = sum(x) in-place */ gsl_vector_memcpy(z, x); gsl_movstat_sum(etype, z, z, w); sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u sum random in-place", n, H, J, etype); compare_vectors(tol, z, y, buf); /* z = sum(x) with user-defined function */ gsl_movstat_apply(etype, &F, x, z, w); sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u sum user", n, H, J, etype); compare_vectors(tol, z, y, buf); gsl_movstat_free(w); gsl_vector_free(x); gsl_vector_free(y); gsl_vector_free(z); } static void test_sum(gsl_rng * rng_p) { test_sum_proc(GSL_DBL_EPSILON, 1000, 0, 0, GSL_MOVSTAT_END_PADZERO, rng_p); test_sum_proc(GSL_DBL_EPSILON, 1000, 3, 3, GSL_MOVSTAT_END_PADZERO, rng_p); test_sum_proc(GSL_DBL_EPSILON, 1000, 0, 5, GSL_MOVSTAT_END_PADZERO, rng_p); test_sum_proc(GSL_DBL_EPSILON, 1000, 5, 0, GSL_MOVSTAT_END_PADZERO, rng_p); test_sum_proc(GSL_DBL_EPSILON, 2000, 10, 5, GSL_MOVSTAT_END_PADZERO, rng_p); test_sum_proc(GSL_DBL_EPSILON, 2000, 5, 10, GSL_MOVSTAT_END_PADZERO, rng_p); test_sum_proc(GSL_DBL_EPSILON, 20, 50, 50, GSL_MOVSTAT_END_PADZERO, rng_p); test_sum_proc(GSL_DBL_EPSILON, 20, 10, 50, GSL_MOVSTAT_END_PADZERO, rng_p); test_sum_proc(GSL_DBL_EPSILON, 20, 50, 10, GSL_MOVSTAT_END_PADZERO, rng_p); test_sum_proc(GSL_DBL_EPSILON, 1000, 0, 0, GSL_MOVSTAT_END_PADVALUE, rng_p); test_sum_proc(GSL_DBL_EPSILON, 1000, 3, 3, GSL_MOVSTAT_END_PADVALUE, rng_p); test_sum_proc(GSL_DBL_EPSILON, 1000, 0, 5, GSL_MOVSTAT_END_PADVALUE, rng_p); test_sum_proc(GSL_DBL_EPSILON, 1000, 5, 0, GSL_MOVSTAT_END_PADVALUE, rng_p); test_sum_proc(GSL_DBL_EPSILON, 2000, 10, 5, GSL_MOVSTAT_END_PADVALUE, rng_p); test_sum_proc(GSL_DBL_EPSILON, 2000, 5, 10, GSL_MOVSTAT_END_PADVALUE, rng_p); test_sum_proc(GSL_DBL_EPSILON, 20, 50, 50, GSL_MOVSTAT_END_PADVALUE, rng_p); test_sum_proc(GSL_DBL_EPSILON, 20, 10, 50, GSL_MOVSTAT_END_PADVALUE, rng_p); test_sum_proc(GSL_DBL_EPSILON, 20, 50, 10, GSL_MOVSTAT_END_PADVALUE, rng_p); test_sum_proc(GSL_DBL_EPSILON, 1000, 0, 0, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_sum_proc(GSL_DBL_EPSILON, 1000, 3, 3, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_sum_proc(GSL_DBL_EPSILON, 1000, 0, 5, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_sum_proc(GSL_DBL_EPSILON, 1000, 5, 0, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_sum_proc(GSL_DBL_EPSILON, 2000, 10, 5, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_sum_proc(GSL_DBL_EPSILON, 2000, 5, 10, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_sum_proc(GSL_DBL_EPSILON, 20, 50, 50, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_sum_proc(GSL_DBL_EPSILON, 20, 10, 50, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_sum_proc(GSL_DBL_EPSILON, 20, 50, 10, GSL_MOVSTAT_END_TRUNCATE, rng_p); } gsl-2.7.1/movstat/test_variance.c0000644016036000116100000001463513373111456013733 00000000000000/* movstat/test_variance.c * * Copyright (C) 2018 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 /* compute moving variance by explicitely constructing window and computing variance */ int slow_movvar(const gsl_movstat_end_t etype, const gsl_vector * x, gsl_vector * y, const int H, const int J) { const size_t n = x->size; const int K = H + J + 1; double *window = malloc(K * sizeof(double)); size_t i; for (i = 0; i < n; ++i) { size_t wsize = gsl_movstat_fill(etype, x, i, H, J, window); double variance = (wsize > 1) ? gsl_stats_variance(window, 1, wsize) : 0.0; gsl_vector_set(y, i, variance); } free(window); return GSL_SUCCESS; } /* compute moving variance by explicitely constructing window and computing variance */ int slow_movsd(const gsl_movstat_end_t etype, const gsl_vector * x, gsl_vector * y, const int H, const int J) { const size_t n = x->size; const int K = H + J + 1; double *window = malloc(K * sizeof(double)); size_t i; for (i = 0; i < n; ++i) { size_t wsize = gsl_movstat_fill(etype, x, i, H, J, window); double sd = (wsize > 1) ? gsl_stats_sd(window, 1, wsize) : 0.0; gsl_vector_set(y, i, sd); } free(window); return GSL_SUCCESS; } static double func_var(const size_t n, double x[], void * params) { (void) params; if (n > 1) return gsl_stats_variance(x, 1, n); else return 0.0; } static double func_sd(const size_t n, double x[], void * params) { (void) params; if (n > 1) return gsl_stats_sd(x, 1, n); else return 0.0; } static void test_variance_proc(const double tol, const size_t n, const size_t H, const size_t J, const gsl_movstat_end_t etype, gsl_rng * rng_p) { gsl_movstat_workspace * w = gsl_movstat_alloc2(H, J); gsl_vector * x = gsl_vector_alloc(n); gsl_vector * y = gsl_vector_alloc(n); gsl_vector * z = gsl_vector_alloc(n); gsl_movstat_function F1, F2; char buf[2048]; F1.function = func_var; F1.params = NULL; F2.function = func_sd; F2.params = NULL; random_vector(x, rng_p); /* test variance */ /* y = variance(x) with slow brute force method */ slow_movvar(etype, x, y, H, J); /* y = variance(x) with fast method */ gsl_movstat_variance(etype, x, z, w); /* test y = z */ sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u variance random", n, H, J, etype); compare_vectors(tol, z, y, buf); /* z = variance(x) in-place */ gsl_vector_memcpy(z, x); gsl_movstat_variance(etype, z, z, w); sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u variance random in-place", n, H, J, etype); compare_vectors(tol, z, y, buf); /* z = variance(x) with user-defined function */ gsl_movstat_apply(etype, &F1, x, z, w); sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u variance user", n, H, J, etype); compare_vectors(tol, z, y, buf); /* test standard deviation */ /* y = stddev(x) with slow brute force method */ slow_movsd(etype, x, y, H, J); /* y = stddev(x) with fast method */ gsl_movstat_sd(etype, x, z, w); /* test y = z */ sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u stddev random", n, H, J, etype); compare_vectors(tol, z, y, buf); /* z = stddev(x) in-place */ gsl_vector_memcpy(z, x); gsl_movstat_sd(etype, z, z, w); sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u stddev random in-place", n, H, J, etype); compare_vectors(tol, z, y, buf); /* z = stddev(x) with user-defined function */ gsl_movstat_apply(etype, &F2, x, z, w); sprintf(buf, "n=%zu H=%zu J=%zu endtype=%u stddev user", n, H, J, etype); compare_vectors(tol, z, y, buf); gsl_movstat_free(w); gsl_vector_free(x); gsl_vector_free(y); gsl_vector_free(z); } static void test_variance(gsl_rng * rng_p) { const double eps = 1.0e-10; test_variance_proc(eps, 1000, 0, 0, GSL_MOVSTAT_END_PADZERO, rng_p); test_variance_proc(eps, 1000, 3, 3, GSL_MOVSTAT_END_PADZERO, rng_p); test_variance_proc(eps, 1000, 0, 5, GSL_MOVSTAT_END_PADZERO, rng_p); test_variance_proc(eps, 1000, 5, 0, GSL_MOVSTAT_END_PADZERO, rng_p); test_variance_proc(eps, 2000, 10, 5, GSL_MOVSTAT_END_PADZERO, rng_p); test_variance_proc(eps, 2000, 5, 10, GSL_MOVSTAT_END_PADZERO, rng_p); test_variance_proc(eps, 20, 50, 50, GSL_MOVSTAT_END_PADZERO, rng_p); test_variance_proc(eps, 20, 10, 50, GSL_MOVSTAT_END_PADZERO, rng_p); test_variance_proc(eps, 20, 50, 10, GSL_MOVSTAT_END_PADZERO, rng_p); test_variance_proc(eps, 1000, 0, 0, GSL_MOVSTAT_END_PADVALUE, rng_p); test_variance_proc(eps, 1000, 3, 3, GSL_MOVSTAT_END_PADVALUE, rng_p); test_variance_proc(eps, 1000, 1, 5, GSL_MOVSTAT_END_PADVALUE, rng_p); test_variance_proc(eps, 1000, 5, 1, GSL_MOVSTAT_END_PADVALUE, rng_p); test_variance_proc(eps, 2000, 10, 5, GSL_MOVSTAT_END_PADVALUE, rng_p); test_variance_proc(eps, 2000, 5, 10, GSL_MOVSTAT_END_PADVALUE, rng_p); test_variance_proc(eps, 20, 50, 50, GSL_MOVSTAT_END_PADVALUE, rng_p); test_variance_proc(eps, 20, 10, 50, GSL_MOVSTAT_END_PADVALUE, rng_p); test_variance_proc(eps, 20, 50, 10, GSL_MOVSTAT_END_PADVALUE, rng_p); test_variance_proc(eps, 1000, 0, 0, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_variance_proc(eps, 1000, 3, 3, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_variance_proc(eps, 1000, 0, 5, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_variance_proc(eps, 1000, 5, 0, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_variance_proc(eps, 2000, 10, 5, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_variance_proc(eps, 2000, 5, 10, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_variance_proc(eps, 20, 50, 50, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_variance_proc(eps, 20, 10, 50, GSL_MOVSTAT_END_TRUNCATE, rng_p); test_variance_proc(eps, 20, 50, 10, GSL_MOVSTAT_END_TRUNCATE, rng_p); } gsl-2.7.1/movstat/gsl_movstat.h0000644016036000116100000001376413377336115013462 00000000000000/* movstat/gsl_movstat.h * * Copyright (C) 2018 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_MOVSTAT_H__ #define __GSL_MOVSTAT_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 enum { GSL_MOVSTAT_END_PADZERO, GSL_MOVSTAT_END_PADVALUE, GSL_MOVSTAT_END_TRUNCATE } gsl_movstat_end_t; /* accumulator struct * size - return number of bytes needed for accumulator with maximum of n elements * init - initialize accumulator state * insert - insert a single sample into accumulator; if there are already n * samples in accumulator, oldest sample is overwritten * delete_oldest - delete oldest sample from accumulator * get - return accumulated value */ typedef struct { size_t (*size) (const size_t n); int (*init) (const size_t n, void * vstate); int (*insert) (const double x, void * vstate); int (*delete_oldest) (void * vstate); int (*get) (void * params, double * result, const void * vstate); } gsl_movstat_accum; typedef struct { double (* function) (const size_t n, double x[], void * params); void * params; } gsl_movstat_function; #define GSL_MOVSTAT_FN_EVAL(F,n,x) (*((F)->function))((n),(x),(F)->params) /* workspace for moving window statistics */ typedef struct { size_t H; /* number of previous samples in window */ size_t J; /* number of after samples in window */ size_t K; /* window size K = H + J + 1 */ double *work; /* workspace, size K */ void *state; /* state workspace for various accumulators */ size_t state_size; /* bytes allocated for 'state' */ } gsl_movstat_workspace; /* alloc.c */ gsl_movstat_workspace *gsl_movstat_alloc(const size_t K); gsl_movstat_workspace *gsl_movstat_alloc2(const size_t H, const size_t J); gsl_movstat_workspace *gsl_movstat_alloc_with_size(const size_t accum_state_size, const size_t H, const size_t J); void gsl_movstat_free(gsl_movstat_workspace * w); /* apply.c */ int gsl_movstat_apply_accum(const gsl_movstat_end_t endtype, const gsl_vector * x, const gsl_movstat_accum * accum, void * accum_params, gsl_vector * y, gsl_vector * z, gsl_movstat_workspace * w); int gsl_movstat_apply(const gsl_movstat_end_t endtype, const gsl_movstat_function * F, const gsl_vector * x, gsl_vector * y, gsl_movstat_workspace * w); /* fill.c */ size_t gsl_movstat_fill(const gsl_movstat_end_t endtype, const gsl_vector * x, const size_t idx, const size_t H, const size_t J, double * window); int gsl_movstat_mean(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * y, gsl_movstat_workspace * w); int gsl_movstat_variance(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * y, gsl_movstat_workspace * w); int gsl_movstat_sd(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * y, gsl_movstat_workspace * w); int gsl_movstat_median(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * y, gsl_movstat_workspace * w); int gsl_movstat_min(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * y, gsl_movstat_workspace * w); int gsl_movstat_max(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * y, gsl_movstat_workspace * w); int gsl_movstat_minmax(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * y_min, gsl_vector * y_max, gsl_movstat_workspace * w); int gsl_movstat_mad0(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * xmedian, gsl_vector * xmad, gsl_movstat_workspace * w); int gsl_movstat_mad(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * xmedian, gsl_vector * xmad, gsl_movstat_workspace * w); int gsl_movstat_qqr(const gsl_movstat_end_t endtype, const gsl_vector * x, const double q, gsl_vector * xqqr, gsl_movstat_workspace * w); int gsl_movstat_Sn(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * xscale, gsl_movstat_workspace * w); int gsl_movstat_Qn(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * xscale, gsl_movstat_workspace * w); int gsl_movstat_sum(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * y, gsl_movstat_workspace * w); /* accumulator variables */ GSL_VAR const gsl_movstat_accum * gsl_movstat_accum_mad; GSL_VAR const gsl_movstat_accum * gsl_movstat_accum_max; GSL_VAR const gsl_movstat_accum * gsl_movstat_accum_mean; GSL_VAR const gsl_movstat_accum * gsl_movstat_accum_median; GSL_VAR const gsl_movstat_accum * gsl_movstat_accum_min; GSL_VAR const gsl_movstat_accum * gsl_movstat_accum_minmax; GSL_VAR const gsl_movstat_accum * gsl_movstat_accum_sd; GSL_VAR const gsl_movstat_accum * gsl_movstat_accum_Sn; GSL_VAR const gsl_movstat_accum * gsl_movstat_accum_sum; GSL_VAR const gsl_movstat_accum * gsl_movstat_accum_Qn; GSL_VAR const gsl_movstat_accum * gsl_movstat_accum_qqr; GSL_VAR const gsl_movstat_accum * gsl_movstat_accum_userfunc; GSL_VAR const gsl_movstat_accum * gsl_movstat_accum_variance; __END_DECLS #endif /* __GSL_MOVSTAT_H__ */ gsl-2.7.1/movstat/Makefile.in0000644016036000116100000011674314151557214013011 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 = movstat 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslmovstat_la_LIBADD = am_libgslmovstat_la_OBJECTS = alloc.lo apply.lo fill.lo funcacc.lo \ madacc.lo medacc.lo mmacc.lo movmad.lo movmean.lo movmedian.lo \ movminmax.lo movsum.lo movSn.lo movQn.lo movqqr.lo \ movvariance.lo mvacc.lo qnacc.lo qqracc.lo snacc.lo sumacc.lo libgslmovstat_la_OBJECTS = $(am_libgslmovstat_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 = libgslmovstat.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 \ ../vector/libgslvector.la ../blas/libgslblas.la \ ../cblas/libgslcblas.la ../block/libgslblock.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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/alloc.Plo ./$(DEPDIR)/apply.Plo \ ./$(DEPDIR)/fill.Plo ./$(DEPDIR)/funcacc.Plo \ ./$(DEPDIR)/madacc.Plo ./$(DEPDIR)/medacc.Plo \ ./$(DEPDIR)/mmacc.Plo ./$(DEPDIR)/movQn.Plo \ ./$(DEPDIR)/movSn.Plo ./$(DEPDIR)/movmad.Plo \ ./$(DEPDIR)/movmean.Plo ./$(DEPDIR)/movmedian.Plo \ ./$(DEPDIR)/movminmax.Plo ./$(DEPDIR)/movqqr.Plo \ ./$(DEPDIR)/movsum.Plo ./$(DEPDIR)/movvariance.Plo \ ./$(DEPDIR)/mvacc.Plo ./$(DEPDIR)/qnacc.Plo \ ./$(DEPDIR)/qqracc.Plo ./$(DEPDIR)/snacc.Plo \ ./$(DEPDIR)/sumacc.Plo ./$(DEPDIR)/test.Po 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 = $(libgslmovstat_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslmovstat_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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 = libgslmovstat.la pkginclude_HEADERS = gsl_movstat.h AM_CPPFLAGS = -I$(top_srcdir) libgslmovstat_la_SOURCES = \ alloc.c \ apply.c \ fill.c \ funcacc.c \ madacc.c \ medacc.c \ mmacc.c \ movmad.c \ movmean.c \ movmedian.c \ movminmax.c \ movsum.c \ movSn.c \ movQn.c \ movqqr.c \ movvariance.c \ mvacc.c \ qnacc.c \ qqracc.c \ snacc.c \ sumacc.c noinst_HEADERS = deque.c ringbuf.c test_mad.c test_mean.c test_median.c test_minmax.c test_Qn.c test_qqr.c test_Sn.c test_sum.c test_variance.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslmovstat.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 ../vector/libgslvector.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../block/libgslblock.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 movstat/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu movstat/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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}; \ } libgslmovstat.la: $(libgslmovstat_la_OBJECTS) $(libgslmovstat_la_DEPENDENCIES) $(EXTRA_libgslmovstat_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmovstat_la_OBJECTS) $(libgslmovstat_la_LIBADD) $(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)/alloc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/apply.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fill.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/funcacc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/madacc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/medacc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmacc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movQn.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movSn.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movmad.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movmean.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movmedian.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movminmax.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movqqr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movsum.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movvariance.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mvacc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qnacc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qqracc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snacc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sumacc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/alloc.Plo -rm -f ./$(DEPDIR)/apply.Plo -rm -f ./$(DEPDIR)/fill.Plo -rm -f ./$(DEPDIR)/funcacc.Plo -rm -f ./$(DEPDIR)/madacc.Plo -rm -f ./$(DEPDIR)/medacc.Plo -rm -f ./$(DEPDIR)/mmacc.Plo -rm -f ./$(DEPDIR)/movQn.Plo -rm -f ./$(DEPDIR)/movSn.Plo -rm -f ./$(DEPDIR)/movmad.Plo -rm -f ./$(DEPDIR)/movmean.Plo -rm -f ./$(DEPDIR)/movmedian.Plo -rm -f ./$(DEPDIR)/movminmax.Plo -rm -f ./$(DEPDIR)/movqqr.Plo -rm -f ./$(DEPDIR)/movsum.Plo -rm -f ./$(DEPDIR)/movvariance.Plo -rm -f ./$(DEPDIR)/mvacc.Plo -rm -f ./$(DEPDIR)/qnacc.Plo -rm -f ./$(DEPDIR)/qqracc.Plo -rm -f ./$(DEPDIR)/snacc.Plo -rm -f ./$(DEPDIR)/sumacc.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/alloc.Plo -rm -f ./$(DEPDIR)/apply.Plo -rm -f ./$(DEPDIR)/fill.Plo -rm -f ./$(DEPDIR)/funcacc.Plo -rm -f ./$(DEPDIR)/madacc.Plo -rm -f ./$(DEPDIR)/medacc.Plo -rm -f ./$(DEPDIR)/mmacc.Plo -rm -f ./$(DEPDIR)/movQn.Plo -rm -f ./$(DEPDIR)/movSn.Plo -rm -f ./$(DEPDIR)/movmad.Plo -rm -f ./$(DEPDIR)/movmean.Plo -rm -f ./$(DEPDIR)/movmedian.Plo -rm -f ./$(DEPDIR)/movminmax.Plo -rm -f ./$(DEPDIR)/movqqr.Plo -rm -f ./$(DEPDIR)/movsum.Plo -rm -f ./$(DEPDIR)/movvariance.Plo -rm -f ./$(DEPDIR)/mvacc.Plo -rm -f ./$(DEPDIR)/qnacc.Plo -rm -f ./$(DEPDIR)/qqracc.Plo -rm -f ./$(DEPDIR)/snacc.Plo -rm -f ./$(DEPDIR)/sumacc.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/movstat/TODO0000644016036000116100000000017013301320735011406 000000000000001. medacc: add delete function and convert to movstat_apply format 2. remove gsl_math.h / gsl_function_vec -- not used? gsl-2.7.1/movstat/alloc.c0000644016036000116100000001036013373111455012164 00000000000000/* movstat/alloc.c * * Copyright (C) 2018 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 /* gsl_movstat_alloc() Allocate a workspace for moving window statistics. The window around sample x_i is defined as: W_i^{H,J} = {x_{i-H},...,x_i,...x_{i+J}} The total window size is: K = H + J + 1 Inputs: K - total samples in window (H = J = K / 2) Return: pointer to workspace Notes: 1) If K is even, it is rounded up to the next odd */ gsl_movstat_workspace * gsl_movstat_alloc(const size_t K) { const size_t H = K / 2; return gsl_movstat_alloc_with_size(0, H, H); } /* gsl_movstat_alloc2() Allocate a workspace for moving window statistics. The window around sample x_i is defined as: W_i^{H,J} = {x_{i-H},...,x_i,...x_{i+J}} The total window size is: K = H + J + 1 Inputs: H - number of samples before current sample J - number of samples after current sample Return: pointer to workspace */ gsl_movstat_workspace * gsl_movstat_alloc2(const size_t H, const size_t J) { return gsl_movstat_alloc_with_size(0, H, J); } /* gsl_movstat_alloc_with_size() Allocate a workspace for moving window statistics with predefined workspace size for accumulators. The window around sample x_i is defined as: W_i^{H,J} = {x_{i-H},...,x_i,...x_{i+J}} The total window size is: K = H + J + 1 Inputs: accum_state_size - state size for accumulator (set to zero to use default value) H - number of samples before current sample J - number of samples after current sample Return: pointer to workspace */ gsl_movstat_workspace * gsl_movstat_alloc_with_size(const size_t accum_state_size, const size_t H, const size_t J) { gsl_movstat_workspace *w; size_t state_size = accum_state_size; w = calloc(1, sizeof(gsl_movstat_workspace)); if (w == 0) { GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM); } w->H = H; w->J = J; w->K = H + J + 1; if (state_size == 0) { /* * determine maximum number of bytes needed for the various accumulators; * the accumulators will all share the same workspace */ state_size = GSL_MAX(state_size, (gsl_movstat_accum_mad->size)(w->K)); /* MAD accumulator */ state_size = GSL_MAX(state_size, (gsl_movstat_accum_mean->size)(w->K)); /* mean/variance/sd accumulator */ state_size = GSL_MAX(state_size, (gsl_movstat_accum_min->size)(w->K)); /* min/max accumulator */ state_size = GSL_MAX(state_size, (gsl_movstat_accum_sum->size)(w->K)); /* sum accumulator */ state_size = GSL_MAX(state_size, (gsl_movstat_accum_median->size)(w->K)); /* median accumulator */ state_size = GSL_MAX(state_size, (gsl_movstat_accum_Qn->size)(w->K)); /* Q_n accumulator */ state_size = GSL_MAX(state_size, (gsl_movstat_accum_qqr->size)(w->K)); /* QQR accumulator */ state_size = GSL_MAX(state_size, (gsl_movstat_accum_Sn->size)(w->K)); /* S_n accumulator */ } w->state = malloc(state_size); if (w->state == 0) { gsl_movstat_free(w); GSL_ERROR_NULL ("failed to allocate space for accumulator state", GSL_ENOMEM); } w->work = malloc(w->K * sizeof(double)); if (w->work == 0) { gsl_movstat_free(w); GSL_ERROR_NULL ("failed to allocate space for work", GSL_ENOMEM); } w->state_size = state_size; return w; } void gsl_movstat_free(gsl_movstat_workspace * w) { if (w->work) free(w->work); if (w->state) free(w->state); free(w); } gsl-2.7.1/movstat/apply.c0000644016036000116100000001471113377336115012231 00000000000000/* movstat/apply.c * * Copyright (C) 2018 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_movstat_apply_accum() Apply moving window statistic to input vector. This is a generalized routine to handle window endpoints and apply a given accumulator to the input vector. Inputs: endtype - end point handling criteria x - input vector, size n accum - accumulator to apply moving window statistic accum_params - parameters to pass to accumulator y - output vector, size n z - second output vector (i.e. minmax), size n; can be NULL w - workspace Notes: 1) It is allowed to have x = y for in-place moving statistics */ int gsl_movstat_apply_accum(const gsl_movstat_end_t endtype, const gsl_vector * x, const gsl_movstat_accum * accum, void * accum_params, gsl_vector * y, gsl_vector * z, gsl_movstat_workspace * w) { if (x->size != y->size) { GSL_ERROR("input and output vectors must have same length", GSL_EBADLEN); } else if (z != NULL && x->size != z->size) { GSL_ERROR("input and output vectors must have same length", GSL_EBADLEN); } else { const int n = (int) x->size; const int H = w->H; /* number of samples to left of current sample */ const int J = w->J; /* number of samples to right of current sample */ int i; double x1 = 0.0; /* pad values for data edges */ double xN = 0.0; double result[2]; /* initialize accumulator */ (accum->init)(w->K, w->state); /* pad initial window if necessary */ if (endtype != GSL_MOVSTAT_END_TRUNCATE) { if (endtype == GSL_MOVSTAT_END_PADZERO) { x1 = 0.0; xN = 0.0; } else if (endtype == GSL_MOVSTAT_END_PADVALUE) { x1 = gsl_vector_get(x, 0); xN = gsl_vector_get(x, n - 1); } /* pad initial windows with H values */ for (i = 0; i < H; ++i) (accum->insert)(x1, w->state); } else if (accum->delete_oldest == NULL) /* FIXME XXX */ { /* save last K - 1 samples of x for later (needed for in-place input/output) */ int idx1 = GSL_MAX(n - J - H, 0); int idx2 = n - 1; for (i = idx1; i <= idx2; ++i) w->work[i - idx1] = gsl_vector_get(x, i); } /* process input vector and fill y(0:n - J - 1) */ for (i = 0; i < n; ++i) { double xi = gsl_vector_get(x, i); int idx = i - J; (accum->insert)(xi, w->state); if (idx >= 0) { (accum->get)(accum_params, result, w->state); gsl_vector_set(y, idx, result[0]); if (z != NULL) gsl_vector_set(z, idx, result[1]); } } if (endtype == GSL_MOVSTAT_END_TRUNCATE) { /* need to fill y(n-J:n-1) using shrinking windows */ int idx1 = GSL_MAX(n - J, 0); int idx2 = n - 1; if (accum->delete_oldest == NULL) { int wsize = n - GSL_MAX(n - J - H, 0); /* size of work array */ for (i = idx1; i <= idx2; ++i) { int nsamp = n - GSL_MAX(i - H, 0); /* number of samples in this window */ int j; (accum->init)(w->K, w->state); for (j = wsize - nsamp; j < wsize; ++j) (accum->insert)(w->work[j], w->state); /* yi = acc_get [ work(i:K-2) ] */ (accum->get)(accum_params, result, w->state); gsl_vector_set(y, i, result[0]); if (z != NULL) gsl_vector_set(z, i, result[1]); } } else { for (i = idx1; i <= idx2; ++i) { if (i - H > 0) { /* delete oldest window sample as we move closer to edge */ (accum->delete_oldest)(w->state); } /* yi = acc_get [ work(i:K-2) ] */ (accum->get)(accum_params, result, w->state); gsl_vector_set(y, i, result[0]); if (z != NULL) gsl_vector_set(z, i, result[1]); } } } else { /* pad final windows and fill y(n-J:n-1) */ for (i = 0; i < J; ++i) { int idx = n - J + i; (accum->insert)(xN, w->state); if (idx >= 0) { (accum->get)(accum_params, result, w->state); gsl_vector_set(y, idx, result[0]); if (z != NULL) gsl_vector_set(z, idx, result[1]); } } } return GSL_SUCCESS; } } /* gsl_movstat_apply() Apply user-defined moving window function to input vector Inputs: endtype - end point handling criteria F - user-defined function x - input vector, size n y - output vector, size n w - workspace */ int gsl_movstat_apply(const gsl_movstat_end_t endtype, const gsl_movstat_function * F, const gsl_vector * x, gsl_vector * y, gsl_movstat_workspace * w) { int status = gsl_movstat_apply_accum(endtype, x, gsl_movstat_accum_userfunc, (void *) F, y, NULL, w); return status; } gsl-2.7.1/movstat/fill.c0000644016036000116100000000600713373111455012023 00000000000000/* movstat/fill.c * * Copyright (C) 2018 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_movstat_fill() Fill window for sample 'idx' from x using given end conditions Inputs: endtype - how to handle end points x - input vector, length n idx - index of center sample in window in [0,n-1] H - number of samples left of center to include J - number of samples right of center to include window - (output) window of samples centered on x_{idx}, W_{idx}^{H,J}, length H + J + 1 Return: size of filled window (<= H + J + 1) */ size_t gsl_movstat_fill(const gsl_movstat_end_t endtype, const gsl_vector * x, const size_t idx, const size_t H, const size_t J, double * window) { if (idx >= x->size) { GSL_ERROR_VAL ("window center index must be between 0 and n - 1", GSL_EDOM, 0); } else { const int n = (int) x->size; const int iidx = (int) idx; const int iH = (int) H; const int iJ = (int) J; int idx1, idx2, j; size_t window_size; if (endtype == GSL_MOVSTAT_END_TRUNCATE) { idx1 = GSL_MAX(iidx - iH, 0); idx2 = GSL_MIN(iidx + iJ, n - 1); } else { idx1 = iidx - iH; idx2 = iidx + iJ; } window_size = (size_t) (idx2 - idx1 + 1); /* fill sliding window */ for (j = idx1; j <= idx2; ++j) { int widx = j - idx1; if (j < 0) { /* initial condition */ if (endtype == GSL_MOVSTAT_END_PADZERO) window[widx] = 0.0; else if (endtype == GSL_MOVSTAT_END_PADVALUE) window[widx] = gsl_vector_get(x, 0); } else if (j >= n) { if (endtype == GSL_MOVSTAT_END_PADZERO) window[widx] = 0.0; else if (endtype == GSL_MOVSTAT_END_PADVALUE) window[widx] = gsl_vector_get(x, n - 1); } else { window[widx] = gsl_vector_get(x, j); } } return window_size; } } gsl-2.7.1/movstat/funcacc.c0000644016036000116100000000541613373111455012502 00000000000000/* movstat/funcacc.c * * Moving window accumulator for arbitrary user-defined function * * Copyright (C) 2018 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 typedef double funcacc_type_t; typedef funcacc_type_t ringbuf_type_t; #include "ringbuf.c" typedef struct { funcacc_type_t *window; /* linear array for current window */ ringbuf *rbuf; /* ring buffer storing current window */ } funcacc_state_t; static size_t funcacc_size(const size_t n) { size_t size = 0; size += sizeof(funcacc_state_t); size += n * sizeof(funcacc_type_t); size += ringbuf_size(n); return size; } static int funcacc_init(const size_t n, void * vstate) { funcacc_state_t * state = (funcacc_state_t *) vstate; state->window = (funcacc_type_t *) ((unsigned char *) vstate + sizeof(funcacc_state_t)); state->rbuf = (ringbuf *) ((unsigned char *) state->window + n * sizeof(funcacc_type_t)); ringbuf_init(n, state->rbuf); return GSL_SUCCESS; } static int funcacc_insert(const funcacc_type_t x, void * vstate) { funcacc_state_t * state = (funcacc_state_t *) vstate; /* add new element to ring buffer */ ringbuf_insert(x, state->rbuf); return GSL_SUCCESS; } static int funcacc_delete(void * vstate) { funcacc_state_t * state = (funcacc_state_t *) vstate; if (!ringbuf_is_empty(state->rbuf)) ringbuf_pop_back(state->rbuf); return GSL_SUCCESS; } static int funcacc_get(void * params, funcacc_type_t * result, const void * vstate) { const funcacc_state_t * state = (const funcacc_state_t *) vstate; gsl_movstat_function *f = (gsl_movstat_function *) params; size_t n = ringbuf_copy(state->window, state->rbuf); *result = GSL_MOVSTAT_FN_EVAL(f, n, state->window); return GSL_SUCCESS; } static const gsl_movstat_accum func_accum_type = { funcacc_size, funcacc_init, funcacc_insert, funcacc_delete, funcacc_get }; const gsl_movstat_accum *gsl_movstat_accum_userfunc = &func_accum_type; gsl-2.7.1/movstat/madacc.c0000644016036000116100000001054613373111455012310 00000000000000/* movstat/madacc.c * * Copyright (C) 2018 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 computing the median absolute deviation (MAD) * of a moving fixed-sized window. */ #include #include #include #include #include #include #include typedef double madacc_type_t; typedef madacc_type_t ringbuf_type_t; #include "ringbuf.c" typedef struct { size_t n; /* window size */ const gsl_movstat_accum *medacc; /* median accumulator */ void *median_state; /* median accumulator workspace */ ringbuf *rbuf; /* ring buffer storing current window, size n */ madacc_type_t *work; /* workspace, size n */ } madacc_state_t; static size_t madacc_size(const size_t n); static int madacc_init(const size_t n, void * vstate); static int madacc_insert(const madacc_type_t x, void * vstate); static int madacc_delete(void * vstate); static int madacc_medmad(void * params, madacc_type_t * result, const void * vstate); static size_t madacc_size(const size_t n) { size_t size = 0; const gsl_movstat_accum * acc = gsl_movstat_accum_median; size += sizeof(madacc_state_t); size += (acc->size)(n); /* median accumulator */ size += ringbuf_size(n); /* rbuf */ size += n * sizeof(madacc_type_t); /* work */ return size; } static int madacc_init(const size_t n, void * vstate) { madacc_state_t * state = (madacc_state_t *) vstate; state->n = n; state->medacc = gsl_movstat_accum_median; state->median_state = (void *) ((unsigned char *) vstate + sizeof(madacc_state_t)); state->rbuf = (ringbuf *) ((unsigned char *) state->median_state + (state->medacc->size)(n)); state->work = (madacc_type_t *) ((unsigned char *) state->rbuf + ringbuf_size(n)); (state->medacc->init)(n, state->median_state); ringbuf_init(n, state->rbuf); return GSL_SUCCESS; } static int madacc_insert(const madacc_type_t x, void * vstate) { madacc_state_t * state = (madacc_state_t *) vstate; /* insert element into median accumulator */ (state->medacc->insert)(x, state->median_state); /* insert element into ring buffer */ ringbuf_insert(x, state->rbuf); return GSL_SUCCESS; } static int madacc_delete(void * vstate) { madacc_state_t * state = (madacc_state_t *) vstate; if (!ringbuf_is_empty(state->rbuf)) ringbuf_pop_back(state->rbuf); return GSL_SUCCESS; } static int madacc_medmad(void * params, madacc_type_t * result, const void * vstate) { const madacc_state_t * state = (const madacc_state_t *) vstate; if (ringbuf_is_empty(state->rbuf)) { GSL_ERROR("no samples yet added to workspace", GSL_EINVAL); } else { int status; const double scale = *(double *) params; const int n = ringbuf_n(state->rbuf); int i; double median, mad; /* compute median of current window */ status = (state->medacc->get)(NULL, &median, state->median_state); if (status) return status; /* compute current window absolute deviations from median */ for (i = 0; i < n; ++i) { double xi = state->rbuf->array[(state->rbuf->head + i) % state->rbuf->size]; state->work[i] = fabs(xi - median); } /* compute MAD of current window */ mad = gsl_stats_median(state->work, 1, n); result[0] = median; result[1] = scale * mad; return GSL_SUCCESS; } } static const gsl_movstat_accum mad_accum_type = { madacc_size, madacc_init, madacc_insert, NULL, /*XXX*/ madacc_medmad }; const gsl_movstat_accum *gsl_movstat_accum_mad = &mad_accum_type; gsl-2.7.1/movstat/medacc.c0000644016036000116100000001616613373111455012320 00000000000000/* movstat/medacc.c * * Copyright (C) 2018 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. * * Original copyright notice: * Copyright (c) 2011 ashelly.myopenid.com under */ #include #include #include #include #include #include #define ItemLess(a,b) ((a)<(b)) #define ItemMean(a,b) (((a)+(b))/2) #define minCt(m) (((m)->ct-1)/2) /* count of items in minheap */ #define maxCt(m) (((m)->ct)/2) /* count of items in maxheap */ typedef double medacc_type_t; typedef struct { int n; /* window size */ int idx; /* position in circular queue */ int ct; /* count of items in queue */ medacc_type_t *data; /* circular queue of values, size k */ int *pos; /* index into `heap` for each value, size 2*k */ int *heap; /* max/median/min heap holding indices into `data` */ } medacc_state_t; static size_t medacc_size(const size_t n); static int medacc_init(const size_t n, void * vstate); static int medacc_insert(const medacc_type_t x, void * vstate); static int medacc_delete(void * vstate); static int medacc_get(void * params, medacc_type_t * result, const void * vstate); static int mmless(const medacc_state_t * state, const int i, const int j); static int mmexchange(medacc_state_t * state, const int i, const int j); static int mmCmpExch(medacc_state_t * state, const int i, const int j); static void minSortDown(medacc_state_t * state, int i); static void maxSortDown(medacc_state_t * state, int i); static int minSortUp(medacc_state_t * state, int i); static int maxSortUp(medacc_state_t * state, int i); static size_t medacc_size(const size_t n) { size_t size = 0; size += sizeof(medacc_state_t); size += n * sizeof(medacc_type_t); size += 2 * n * sizeof(int); return size; } static int medacc_init(const size_t n, void * vstate) { medacc_state_t * state = (medacc_state_t *) vstate; int k = (int) n; state->n = n; state->ct = 0; state->idx = 0; state->data = (medacc_type_t *) ((unsigned char *) vstate + sizeof(medacc_state_t)); state->pos = (int *) ((unsigned char *) state->data + n * sizeof(medacc_type_t)); state->heap = state->pos + n + (n/2); /* points to middle of storage */ /* set up initial heap fill pattern: median,max,min,max,... */ while (k--) { state->pos[k] = ((k + 1)/2) * ((k & 1) ? -1 : 1); state->heap[state->pos[k]] = k; } return GSL_SUCCESS; } static int medacc_insert(const medacc_type_t x, void * vstate) { medacc_state_t * state = (medacc_state_t *) vstate; int isNew = (state->ct < (int) state->n); int p = state->pos[state->idx]; medacc_type_t old = state->data[state->idx]; state->data[state->idx] = x; state->idx = (state->idx + 1) % state->n; state->ct += isNew; if (p > 0) /* new item is in minHeap */ { if (!isNew && ItemLess(old, x)) minSortDown(state, p * 2); else if (minSortUp(state, p)) maxSortDown(state, -1); } else if (p < 0) /* new item is in maxHeap */ { if (!isNew && ItemLess(x, old)) maxSortDown(state, p * 2); else if (maxSortUp(state, p)) minSortDown(state, 1); } else /* new item is at median */ { if (maxCt(state)) maxSortDown(state, -1); if (minCt(state)) minSortDown(state, 1); } return GSL_SUCCESS; } static int medacc_delete(void * vstate) { medacc_state_t * state = (medacc_state_t *) vstate; if (state->ct > 0) { int p = state->pos[(state->idx - state->ct + state->n) % state->n]; if (p > 0) /* oldest item is in minHeap */ { mmexchange(state, p, minCt(state)); --(state->ct); minSortDown(state, 2 * p); } else if (p < 0) /* oldest item is in maxHeap */ { mmexchange(state, p, maxCt(state)); --(state->ct); maxSortDown(state, 2 * p); } else if (p == 0) /* oldest item is at median */ { } } return GSL_SUCCESS; } /* returns median (or average of 2 when item count is even) */ static int medacc_get(void * params, medacc_type_t * result, const void * vstate) { const medacc_state_t * state = (const medacc_state_t *) vstate; medacc_type_t median = state->data[state->heap[0]]; (void) params; if ((state->ct & 1) == 0) median = ItemMean(median, state->data[state->heap[-1]]); *result = median; return GSL_SUCCESS; } /* returns 1 if heap[i] < heap[j] */ static int mmless(const medacc_state_t * state, const int i, const int j) { return ItemLess(state->data[state->heap[i]], state->data[state->heap[j]]); } /* swaps items i and j in heap, maintains indexes */ static int mmexchange(medacc_state_t * state, const int i, const int j) { int t = state->heap[i]; state->heap[i] = state->heap[j]; state->heap[j] = t; state->pos[state->heap[i]] = i; state->pos[state->heap[j]] = j; return 1; } /* swaps items i and j if i < j; returns true if swapped */ static int mmCmpExch(medacc_state_t * state, const int i, const int j) { return (mmless(state, i, j) && mmexchange(state , i, j)); } /* maintains minheap property for all items below i/2. */ static void minSortDown(medacc_state_t * state, int i) { for (; i <= minCt(state); i *= 2) { if (i > 1 && i < minCt(state) && mmless(state, i + 1, i)) ++i; if (!mmCmpExch(state, i, i / 2)) break; } } /* maintains maxheap property for all items below i/2. (negative indexes) */ static void maxSortDown(medacc_state_t * state, int i) { for (; i >= -maxCt(state); i *= 2) { if (i < -1 && i > -maxCt(state) && mmless(state, i, i - 1)) --i; if (!mmCmpExch(state, i / 2, i)) break; } } /* maintains minheap property for all items above i, including median returns true if median changed */ static int minSortUp(medacc_state_t * state, int i) { while (i > 0 && mmCmpExch(state, i, i / 2)) i /= 2; return (i == 0); } /* maintains maxheap property for all items above i, including median returns true if median changed */ static int maxSortUp(medacc_state_t * state, int i) { while (i<0 && mmCmpExch(state, i / 2, i)) i /= 2; return (i == 0); } static const gsl_movstat_accum median_accum_type = { medacc_size, medacc_init, medacc_insert, NULL, /* XXX FIXME */ medacc_get }; const gsl_movstat_accum *gsl_movstat_accum_median = &median_accum_type; gsl-2.7.1/movstat/mmacc.c0000644016036000116100000001651013373111455012155 00000000000000/* movstat/mmacc.c * * Copyright (C) 2018 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 tracking minimum/maximum values of a * moving fixed-sized window. It is based on the algorithm of: * * [1] Daniel Lemire, Streaming Maximum-Minimum Filter Using No More than Three Comparisons per Element, * Nordic Journal of Computing, Volume 13, Number 4, pages 328-339, 2006 * * Also available as a preprint here: https://arxiv.org/abs/cs/0610046 */ #include #include #include #include #include #include typedef double mmacc_type_t; typedef mmacc_type_t ringbuf_type_t; #include "deque.c" #include "ringbuf.c" typedef struct { size_t n; /* window size */ size_t k; /* number of samples in current window */ mmacc_type_t xprev; /* previous sample added to window */ ringbuf *rbuf; /* ring buffer storing current window, size n */ deque *minque; /* double-ended queue of min values (L) */ deque *maxque; /* double-ended queue of max values (U) */ } mmacc_state_t; static size_t mmacc_size(const size_t n); static int mmacc_init(const size_t n, void * vstate); static int mmacc_insert(const mmacc_type_t x, void * vstate); static int mmacc_delete(void * vstate); static int mmacc_min(void * params, mmacc_type_t * result, const void * vstate); static int mmacc_max(void * params, mmacc_type_t * result, const void * vstate); static int mmacc_minmax(void * params, mmacc_type_t * result, const void * vstate); static size_t mmacc_size(const size_t n) { size_t size = 0; size += sizeof(mmacc_state_t); size += ringbuf_size(n); /* rbuf */ size += 2 * deque_size(n + 1); /* minque/maxque */ return size; } static int mmacc_init(const size_t n, void * vstate) { mmacc_state_t * state = (mmacc_state_t *) vstate; state->n = n; state->k = 0; state->xprev = 0.0; state->rbuf = (ringbuf *) ((unsigned char *) vstate + sizeof(mmacc_state_t)); state->minque = (deque *) ((unsigned char *) state->rbuf + ringbuf_size(n)); state->maxque = (deque *) ((unsigned char *) state->minque + deque_size(n + 1)); ringbuf_init(n, state->rbuf); deque_init(n + 1, state->minque); deque_init(n + 1, state->maxque); return GSL_SUCCESS; } static int mmacc_insert(const mmacc_type_t x, void * vstate) { mmacc_state_t * state = (mmacc_state_t *) vstate; int head, tail; if (state->k == 0) { /* first sample */ ringbuf_insert(x, state->rbuf); head = state->rbuf->head; deque_push_back(head, state->maxque); deque_push_back(head, state->minque); } else { if (x > state->xprev) { deque_pop_back(state->maxque); while (!deque_is_empty(state->maxque)) { if (x <= state->rbuf->array[deque_peek_back(state->maxque)]) break; deque_pop_back(state->maxque); } } else { deque_pop_back(state->minque); while (!deque_is_empty(state->minque)) { if (x >= state->rbuf->array[deque_peek_back(state->minque)]) break; deque_pop_back(state->minque); } } /* store new sample into ring buffer */ tail = state->rbuf->tail; ringbuf_insert(x, state->rbuf); head = state->rbuf->head; deque_push_back(head, state->maxque); deque_push_back(head, state->minque); if (state->k == state->n) { /* * window is full - check if oldest window element is a global minimum/maximum * of current window - if so pop it from U/L queues; * the check head != tail ensures there is more than 1 element in the * queue, do not pop if queue has only 1 element, since this element would * be the newest sample */ if (state->maxque->head != state->maxque->tail && tail == deque_peek_front(state->maxque)) deque_pop_front(state->maxque); else if (state->minque->head != state->minque->tail && tail == deque_peek_front(state->minque)) deque_pop_front(state->minque); } } if (state->k < state->n) ++(state->k); state->xprev = x; return GSL_SUCCESS; } static int mmacc_delete(void * vstate) { mmacc_state_t * state = (mmacc_state_t *) vstate; if (state->k > 0) { /* * check if oldest window element is a global minimum/maximum; if so * pop it from U/L queues */ if (state->rbuf->tail == deque_peek_front(state->maxque)) deque_pop_front(state->maxque); else if (state->rbuf->tail == deque_peek_front(state->minque)) deque_pop_front(state->minque); /* remove oldest element from ring buffer */ ringbuf_pop_back(state->rbuf); --(state->k); } return GSL_SUCCESS; } static int mmacc_min(void * params, mmacc_type_t * result, const void * vstate) { const mmacc_state_t * state = (const mmacc_state_t *) vstate; (void) params; if (state->k == 0) { GSL_ERROR ("no samples yet added to workspace", GSL_EINVAL); } else { *result = state->rbuf->array[deque_peek_front(state->minque)]; return GSL_SUCCESS; } } static int mmacc_max(void * params, mmacc_type_t * result, const void * vstate) { const mmacc_state_t * state = (const mmacc_state_t *) vstate; (void) params; if (state->k == 0) { GSL_ERROR ("no samples yet added to workspace", GSL_EINVAL); } else { *result = state->rbuf->array[deque_peek_front(state->maxque)]; return GSL_SUCCESS; } } static int mmacc_minmax(void * params, mmacc_type_t * result, const void * vstate) { const mmacc_state_t * state = (const mmacc_state_t *) vstate; (void) params; if (state->k == 0) { GSL_ERROR ("no samples yet added to workspace", GSL_EINVAL); } else { result[0] = state->rbuf->array[deque_peek_front(state->minque)]; result[1] = state->rbuf->array[deque_peek_front(state->maxque)]; return GSL_SUCCESS; } } static const gsl_movstat_accum min_accum_type = { mmacc_size, mmacc_init, mmacc_insert, mmacc_delete, mmacc_min }; const gsl_movstat_accum *gsl_movstat_accum_min = &min_accum_type; static const gsl_movstat_accum max_accum_type = { mmacc_size, mmacc_init, mmacc_insert, mmacc_delete, mmacc_max }; const gsl_movstat_accum *gsl_movstat_accum_max = &max_accum_type; static const gsl_movstat_accum minmax_accum_type = { mmacc_size, mmacc_init, mmacc_insert, mmacc_delete, mmacc_minmax }; const gsl_movstat_accum *gsl_movstat_accum_minmax = &minmax_accum_type; gsl-2.7.1/movstat/movmad.c0000644016036000116100000000623113373111456012360 00000000000000/* movstat/movmad.c * * Copyright (C) 2018 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_movstat_mad() Apply a moving MAD to an input vector (with scale factor to make an unbiased estimate of sigma) Inputs: endtype - how to handle end points x - input vector, size n xmedian - (output) vector of median values of x, size n xmedian_i = median of window centered on x_i xmad - (output) vector of estimated standard deviations of x, size n xmad_i = MAD of i-th window: 1.4826 * median(|x_i - xmedian_i|) w - workspace */ int gsl_movstat_mad(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * xmedian, gsl_vector * xmad, gsl_movstat_workspace * w) { if (x->size != xmedian->size) { GSL_ERROR("x and xmedian vectors must have same length", GSL_EBADLEN); } else if (x->size != xmad->size) { GSL_ERROR("x and xmad vectors must have same length", GSL_EBADLEN); } else { double scale = 1.482602218505602; int status = gsl_movstat_apply_accum(endtype, x, gsl_movstat_accum_mad, &scale, xmedian, xmad, w); return status; } } /* gsl_movstat_mad0() Apply a moving MAD to an input vector (without scale factor to make an unbiased estimate of sigma) Inputs: endtype - how to handle end points x - input vector, size n xmedian - (output) vector of median values of x, size n xmedian_i = median of window centered on x_i xmad - (output) vector of estimated standard deviations of x, size n xmad_i = MAD of i-th window: median(|x_i - xmedian_i|) w - workspace */ int gsl_movstat_mad0(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * xmedian, gsl_vector * xmad, gsl_movstat_workspace * w) { if (x->size != xmedian->size) { GSL_ERROR("x and xmedian vectors must have same length", GSL_EBADLEN); } else if (x->size != xmad->size) { GSL_ERROR("x and xmad vectors must have same length", GSL_EBADLEN); } else { double scale = 1.0; int status = gsl_movstat_apply_accum(endtype, x, gsl_movstat_accum_mad, &scale, xmedian, xmad, w); return status; } } gsl-2.7.1/movstat/movmean.c0000644016036000116100000000260313373111456012536 00000000000000/* movstat/movmean.c * * Routines related to a moving window mean * * Copyright (C) 2018 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 /* gsl_movstat_mean() Apply moving mean to input vector Inputs: endtype - end point handling criteria x - input vector, size n y - output vector, size n w - workspace */ int gsl_movstat_mean(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * y, gsl_movstat_workspace * w) { int status = gsl_movstat_apply_accum(endtype, x, gsl_movstat_accum_mean, NULL, y, NULL, w); return status; } gsl-2.7.1/movstat/movmedian.c0000644016036000116100000000261713373111456013060 00000000000000/* movstat/movmedian.c * * Routines related to a moving window median * * Copyright (C) 2018 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 /* gsl_movstat_median() Apply median filter to input vector Inputs: endtype - end point handling criteria x - input vector, size n y - output vector, size n w - workspace */ int gsl_movstat_median(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * y, gsl_movstat_workspace * w) { int status = gsl_movstat_apply_accum(endtype, x, gsl_movstat_accum_median, NULL, y, NULL, w); return status; } gsl-2.7.1/movstat/movminmax.c0000644016036000116100000000464313373111456013115 00000000000000/* movstat/movminmax.c * * Routines related to a moving window min/max * * Copyright (C) 2018 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 /* gsl_movstat_minmax() Apply minmax filter to input vector Inputs: endtype - end point handling criteria x - input vector, size n y_min - output vector of minimum values, size n y_max - output vector of maximum values, size n w - workspace */ int gsl_movstat_minmax(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * y_min, gsl_vector * y_max, gsl_movstat_workspace * w) { int status = gsl_movstat_apply_accum(endtype, x, gsl_movstat_accum_minmax, NULL, y_min, y_max, w); return status; } /* gsl_movstat_min() Apply minimum filter to input vector Inputs: endtype - end point handling criteria x - input vector, size n y - output vector of minimum values, size n w - workspace */ int gsl_movstat_min(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * y, gsl_movstat_workspace * w) { int status = gsl_movstat_apply_accum(endtype, x, gsl_movstat_accum_min, NULL, y, NULL, w); return status; } /* gsl_movstat_max() Apply maximum filter to input vector Inputs: endtype - end point handling criteria x - input vector, size n y - output vector of maximum values, size n w - workspace */ int gsl_movstat_max(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * y, gsl_movstat_workspace * w) { int status = gsl_movstat_apply_accum(endtype, x, gsl_movstat_accum_max, NULL, y, NULL, w); return status; } gsl-2.7.1/movstat/movsum.c0000644016036000116100000000257513373111456012432 00000000000000/* movstat/movsum.c * * Routines related to a moving window sum * * Copyright (C) 2018 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 /* gsl_movstat_sum() Apply moving sum to input vector Inputs: endtype - end point handling criteria x - input vector, size n y - output vector, size n w - workspace */ int gsl_movstat_sum(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * y, gsl_movstat_workspace * w) { int status = gsl_movstat_apply_accum(endtype, x, gsl_movstat_accum_sum, NULL, y, NULL, w); return status; } gsl-2.7.1/movstat/movSn.c0000644016036000116100000000315013373111456012174 00000000000000/* movstat/movSn.c * * Compute moving "S_n" statistic from Croux and Rousseeuw, 1992 * * Copyright (C) 2018 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_movstat_Sn() Calculate moving S_n statistic for input vector Inputs: endtype - how to handle end points x - input vector, size n xscale - (output) vector of "S_n" statistics, size n xscale_i = (S_n)_i for i-th window: w - workspace */ int gsl_movstat_Sn(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * xscale, gsl_movstat_workspace * w) { int status = gsl_movstat_apply_accum(endtype, x, gsl_movstat_accum_Sn, NULL, xscale, NULL, w); return status; } gsl-2.7.1/movstat/movQn.c0000644016036000116100000000315013373111455012171 00000000000000/* movstat/movQn.c * * Compute moving "Q_n" statistic from Croux and Rousseeuw, 1992 * * Copyright (C) 2018 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_movstat_Qn() Calculate moving Q_n statistic for input vector Inputs: endtype - how to handle end points x - input vector, size n xscale - (output) vector of "Q_n" statistics, size n xscale_i = (Q_n)_i for i-th window: w - workspace */ int gsl_movstat_Qn(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * xscale, gsl_movstat_workspace * w) { int status = gsl_movstat_apply_accum(endtype, x, gsl_movstat_accum_Qn, NULL, xscale, NULL, w); return status; } gsl-2.7.1/movstat/movqqr.c0000644016036000116100000000364113373111456012424 00000000000000/* movstat/movqqr.c * * Compute moving q-quantile range * * Copyright (C) 2018 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_movstat_qqr() Apply a moving q-quantile range to an input vector Inputs: endtype - how to handle end points x - input vector, size n q - quantile \in [0,0.5] xqqr - (output) vector of q-quantile ranges of x, size n xqqr_i = q-quantile range of i-th window: w - workspace */ int gsl_movstat_qqr(const gsl_movstat_end_t endtype, const gsl_vector * x, const double q, gsl_vector * xqqr, gsl_movstat_workspace * w) { if (x->size != xqqr->size) { GSL_ERROR("x and xqqr vectors must have same length", GSL_EBADLEN); } else if (q < 0.0 || q > 0.5) { GSL_ERROR("q must be between 0 and 0.5", GSL_EDOM); } else { double qq = q; int status = gsl_movstat_apply_accum(endtype, x, gsl_movstat_accum_qqr, (void *) &qq, xqqr, NULL, w); return status; } } gsl-2.7.1/movstat/movvariance.c0000644016036000116100000000354113373111456013410 00000000000000/* movstat/movvar.c * * Routines related to a moving window variance * * Copyright (C) 2018 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 /* gsl_movstat_variance() Apply moving variance to input vector Inputs: endtype - end point handling criteria x - input vector, size n y - output vector, size n w - workspace */ int gsl_movstat_variance(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * y, gsl_movstat_workspace * w) { int status = gsl_movstat_apply_accum(endtype, x, gsl_movstat_accum_variance, NULL, y, NULL, w); return status; } /* gsl_movstat_sd() Apply moving standard deviation to input vector Inputs: endtype - end point handling criteria x - input vector, size n y - output vector, size n w - workspace */ int gsl_movstat_sd(const gsl_movstat_end_t endtype, const gsl_vector * x, gsl_vector * y, gsl_movstat_workspace * w) { int status = gsl_movstat_apply_accum(endtype, x, gsl_movstat_accum_sd, NULL, y, NULL, w); return status; } gsl-2.7.1/movstat/mvacc.c0000644016036000116100000001125513373111456012170 00000000000000/* movstat/mvacc.c * * Moving window mean/variance accumulator - based on a modification * to Welford's algorithm, discussed here: * * https://stackoverflow.com/a/6664212 * * Copyright (C) 2018 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 typedef double ringbuf_type_t; #include "ringbuf.c" typedef struct { size_t n; /* window size */ size_t k; /* number of samples currently in window */ double mean; /* current window mean */ double M2; /* current window M2 */ ringbuf *rbuf; /* ring buffer storing current window */ } mvacc_state_t; static size_t mvacc_size(const size_t n) { size_t size = 0; size += sizeof(mvacc_state_t); size += ringbuf_size(n); return size; } static int mvacc_init(const size_t n, void * vstate) { mvacc_state_t * state = (mvacc_state_t *) vstate; state->n = n; state->k = 0; state->mean = 0.0; state->M2 = 0.0; state->rbuf = (ringbuf *) ((unsigned char *) vstate + sizeof(mvacc_state_t)); ringbuf_init(n, state->rbuf); return GSL_SUCCESS; } static int mvacc_insert(const double x, void * vstate) { mvacc_state_t * state = (mvacc_state_t *) vstate; if (ringbuf_is_full(state->rbuf)) { /* remove oldest window element and add new one */ double old = ringbuf_peek_back(state->rbuf); double prev_mean = state->mean; state->mean += (x - old) / (double) state->n; state->M2 += ((old - prev_mean) + (x - state->mean)) * (x - old); } else { double delta = x - state->mean; /* * Welford algorithm: * * mu_new = mu_old + (x - mu_old) / n * M2_new = M2_old + (x - mu_old) * (x - mu_new) */ ++(state->k); state->mean += delta / (double) state->k; state->M2 += delta * (x - state->mean); } /* add new element to ring buffer */ ringbuf_insert(x, state->rbuf); return GSL_SUCCESS; } static int mvacc_delete(void * vstate) { mvacc_state_t * state = (mvacc_state_t *) vstate; if (!ringbuf_is_empty(state->rbuf)) { if (state->k > 1) { /* * mu_new = mu_old + (mu_old - x_old) / (n - 1) * M2_new = M2_old - (mu_old - x_old) * (mu_new - x_old) */ double old = ringbuf_peek_back(state->rbuf); double prev_mean = state->mean; double delta = prev_mean - old; state->mean += delta / (state->k - 1.0); state->M2 -= delta * (state->mean - old); } else if (state->k == 1) { state->mean = 0.0; state->M2 = 0.0; } ringbuf_pop_back(state->rbuf); --(state->k); } return GSL_SUCCESS; } static int mvacc_mean(void * params, double * result, const void * vstate) { const mvacc_state_t * state = (const mvacc_state_t *) vstate; (void) params; *result = state->mean; return GSL_SUCCESS; } static int mvacc_variance(void * params, double * result, const void * vstate) { const mvacc_state_t * state = (const mvacc_state_t *) vstate; (void) params; if (state->k < 2) *result = 0.0; else *result = state->M2 / (state->k - 1.0); return GSL_SUCCESS; } static int mvacc_sd(void * params, double * result, const void * vstate) { double variance; int status = mvacc_variance(params, &variance, vstate); *result = sqrt(variance); return status; } static const gsl_movstat_accum mean_accum_type = { mvacc_size, mvacc_init, mvacc_insert, mvacc_delete, mvacc_mean }; const gsl_movstat_accum *gsl_movstat_accum_mean = &mean_accum_type; static const gsl_movstat_accum variance_accum_type = { mvacc_size, mvacc_init, mvacc_insert, mvacc_delete, mvacc_variance }; const gsl_movstat_accum *gsl_movstat_accum_variance = &variance_accum_type; static const gsl_movstat_accum sd_accum_type = { mvacc_size, mvacc_init, mvacc_insert, mvacc_delete, mvacc_sd }; const gsl_movstat_accum *gsl_movstat_accum_sd = &sd_accum_type; gsl-2.7.1/movstat/qnacc.c0000644016036000116100000000630413373111456012163 00000000000000/* movstat/qnacc.c * * Moving window Q_n accumulator * * Copyright (C) 2018 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 typedef double qnacc_type_t; typedef qnacc_type_t ringbuf_type_t; #include "ringbuf.c" typedef struct { qnacc_type_t *window; /* linear array for current window */ qnacc_type_t *work; /* workspace, length 3*n */ int *work_int; /* integer workspace, length 5*n */ ringbuf *rbuf; /* ring buffer storing current window */ } qnacc_state_t; static size_t qnacc_size(const size_t n) { size_t size = 0; size += sizeof(qnacc_state_t); size += n * sizeof(qnacc_type_t); /* window */ size += 3 * n * sizeof(qnacc_type_t); /* work */ size += 5 * n * sizeof(int); /* work_int */ size += ringbuf_size(n); return size; } static int qnacc_init(const size_t n, void * vstate) { qnacc_state_t * state = (qnacc_state_t *) vstate; state->window = (qnacc_type_t *) ((unsigned char *) vstate + sizeof(qnacc_state_t)); state->work = (qnacc_type_t *) ((unsigned char *) state->window + n * sizeof(qnacc_type_t)); state->work_int = (int *) ((unsigned char *) state->work + 3 * n * sizeof(qnacc_type_t)); state->rbuf = (ringbuf *) ((unsigned char *) state->work_int + 5 * n * sizeof(int)); ringbuf_init(n, state->rbuf); return GSL_SUCCESS; } static int qnacc_insert(const qnacc_type_t x, void * vstate) { qnacc_state_t * state = (qnacc_state_t *) vstate; /* add new element to ring buffer */ ringbuf_insert(x, state->rbuf); return GSL_SUCCESS; } static int qnacc_delete(void * vstate) { qnacc_state_t * state = (qnacc_state_t *) vstate; if (!ringbuf_is_empty(state->rbuf)) ringbuf_pop_back(state->rbuf); return GSL_SUCCESS; } /* FIXME XXX: this is inefficient - could be improved by maintaining a sorted ring buffer */ static int qnacc_get(void * params, qnacc_type_t * result, const void * vstate) { const qnacc_state_t * state = (const qnacc_state_t *) vstate; size_t n = ringbuf_copy(state->window, state->rbuf); (void) params; gsl_sort(state->window, 1, n); *result = gsl_stats_Qn_from_sorted_data(state->window, 1, n, state->work, state->work_int); return GSL_SUCCESS; } static const gsl_movstat_accum qn_accum_type = { qnacc_size, qnacc_init, qnacc_insert, qnacc_delete, qnacc_get }; const gsl_movstat_accum *gsl_movstat_accum_Qn = &qn_accum_type; gsl-2.7.1/movstat/qqracc.c0000644016036000116100000000602113373111456012344 00000000000000/* movstat/qqracc.c * * Moving window QQR accumulator * * Copyright (C) 2018 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 typedef double qqracc_type_t; typedef qqracc_type_t ringbuf_type_t; #include "ringbuf.c" typedef struct { qqracc_type_t *window; /* linear array for current window */ ringbuf *rbuf; /* ring buffer storing current window */ } qqracc_state_t; static size_t qqracc_size(const size_t n) { size_t size = 0; size += sizeof(qqracc_state_t); size += n * sizeof(qqracc_type_t); size += ringbuf_size(n); return size; } static int qqracc_init(const size_t n, void * vstate) { qqracc_state_t * state = (qqracc_state_t *) vstate; state->window = (qqracc_type_t *) ((unsigned char *) vstate + sizeof(qqracc_state_t)); state->rbuf = (ringbuf *) ((unsigned char *) state->window + n * sizeof(qqracc_type_t)); ringbuf_init(n, state->rbuf); return GSL_SUCCESS; } static int qqracc_insert(const qqracc_type_t x, void * vstate) { qqracc_state_t * state = (qqracc_state_t *) vstate; /* add new element to ring buffer */ ringbuf_insert(x, state->rbuf); return GSL_SUCCESS; } static int qqracc_delete(void * vstate) { qqracc_state_t * state = (qqracc_state_t *) vstate; if (!ringbuf_is_empty(state->rbuf)) ringbuf_pop_back(state->rbuf); return GSL_SUCCESS; } /* FIXME XXX: this is inefficient - could be improved by maintaining a sorted ring buffer */ static int qqracc_get(void * params, qqracc_type_t * result, const void * vstate) { const qqracc_state_t * state = (const qqracc_state_t *) vstate; double q = *(double *) params; size_t n = ringbuf_copy(state->window, state->rbuf); double quant1, quant2; gsl_sort(state->window, 1, n); /* compute q-quantile and (1-q)-quantile */ quant1 = gsl_stats_quantile_from_sorted_data(state->window, 1, n, q); quant2 = gsl_stats_quantile_from_sorted_data(state->window, 1, n, 1.0 - q); /* compute q-quantile range */ *result = quant2 - quant1; return GSL_SUCCESS; } static const gsl_movstat_accum qqr_accum_type = { qqracc_size, qqracc_init, qqracc_insert, qqracc_delete, qqracc_get }; const gsl_movstat_accum *gsl_movstat_accum_qqr = &qqr_accum_type; gsl-2.7.1/movstat/snacc.c0000644016036000116100000000563113373111456012167 00000000000000/* movstat/snacc.c * * Moving window S_n accumulator * * Copyright (C) 2018 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 typedef double snacc_type_t; typedef snacc_type_t ringbuf_type_t; #include "ringbuf.c" typedef struct { snacc_type_t *window; /* linear array for current window */ snacc_type_t *work; /* workspace */ ringbuf *rbuf; /* ring buffer storing current window */ } snacc_state_t; static size_t snacc_size(const size_t n) { size_t size = 0; size += sizeof(snacc_state_t); size += 2 * n * sizeof(snacc_type_t); size += ringbuf_size(n); return size; } static int snacc_init(const size_t n, void * vstate) { snacc_state_t * state = (snacc_state_t *) vstate; state->window = (snacc_type_t *) ((unsigned char *) vstate + sizeof(snacc_state_t)); state->work = (snacc_type_t *) ((unsigned char *) state->window + n * sizeof(snacc_type_t)); state->rbuf = (ringbuf *) ((unsigned char *) state->work + n * sizeof(snacc_type_t)); ringbuf_init(n, state->rbuf); return GSL_SUCCESS; } static int snacc_insert(const snacc_type_t x, void * vstate) { snacc_state_t * state = (snacc_state_t *) vstate; /* add new element to ring buffer */ ringbuf_insert(x, state->rbuf); return GSL_SUCCESS; } static int snacc_delete(void * vstate) { snacc_state_t * state = (snacc_state_t *) vstate; if (!ringbuf_is_empty(state->rbuf)) ringbuf_pop_back(state->rbuf); return GSL_SUCCESS; } /* FIXME XXX: this is inefficient - could be improved by maintaining a sorted ring buffer */ static int snacc_get(void * params, snacc_type_t * result, const void * vstate) { const snacc_state_t * state = (const snacc_state_t *) vstate; size_t n = ringbuf_copy(state->window, state->rbuf); (void) params; gsl_sort(state->window, 1, n); *result = gsl_stats_Sn_from_sorted_data(state->window, 1, n, state->work); return GSL_SUCCESS; } static const gsl_movstat_accum sn_accum_type = { snacc_size, snacc_init, snacc_insert, snacc_delete, snacc_get }; const gsl_movstat_accum *gsl_movstat_accum_Sn = &sn_accum_type; gsl-2.7.1/movstat/sumacc.c0000644016036000116100000000507013373111456012350 00000000000000/* movstat/sumacc.c * * Moving window sum accumulator * * Copyright (C) 2018 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 typedef double ringbuf_type_t; #include "ringbuf.c" typedef struct { double sum; /* current window sum */ ringbuf *rbuf; /* ring buffer storing current window */ } sumacc_state_t; static size_t sumacc_size(const size_t n) { size_t size = 0; size += sizeof(sumacc_state_t); size += ringbuf_size(n); return size; } static int sumacc_init(const size_t n, void * vstate) { sumacc_state_t * state = (sumacc_state_t *) vstate; state->sum = 0.0; state->rbuf = (ringbuf *) ((unsigned char *) vstate + sizeof(sumacc_state_t)); ringbuf_init(n, state->rbuf); return GSL_SUCCESS; } static int sumacc_insert(const double x, void * vstate) { sumacc_state_t * state = (sumacc_state_t *) vstate; if (ringbuf_is_full(state->rbuf)) { /* subtract oldest element from sum */ state->sum -= ringbuf_peek_back(state->rbuf); } /* add new element to sum and ring buffer */ state->sum += x; ringbuf_insert(x, state->rbuf); return GSL_SUCCESS; } static int sumacc_delete(void * vstate) { sumacc_state_t * state = (sumacc_state_t *) vstate; if (!ringbuf_is_empty(state->rbuf)) { state->sum -= ringbuf_peek_back(state->rbuf); ringbuf_pop_back(state->rbuf); } return GSL_SUCCESS; } static int sumacc_get(void * params, double * result, const void * vstate) { const sumacc_state_t * state = (const sumacc_state_t *) vstate; (void) params; *result = state->sum; return GSL_SUCCESS; } static const gsl_movstat_accum sum_accum_type = { sumacc_size, sumacc_init, sumacc_insert, sumacc_delete, sumacc_get }; const gsl_movstat_accum *gsl_movstat_accum_sum = &sum_accum_type; gsl-2.7.1/movstat/test.c0000644016036000116100000000502513373111456012054 00000000000000/* movstat/test.c * * Copyright (C) 2018 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 /* compare two vectors */ static void compare_vectors(const double tol, const gsl_vector * v, const gsl_vector * expected, const char * desc) { const size_t n = v->size; size_t i; for (i = 0; i < n; ++i) { double vi = gsl_vector_get(v, i); double ui = gsl_vector_get(expected, i); gsl_test_rel(vi, ui, tol, "%s i=%zu", desc, i); } } /* generate random vector with elements in [-1,1] */ static void random_vector(gsl_vector * v, gsl_rng * r) { size_t i; for (i = 0; i < v->size; ++i) { double vi = 2.0 * gsl_rng_uniform(r) - 1.0; /* in [-1,1] */ gsl_vector_set(v, i, vi); } } static int test_noisy_sine(const double sigma, gsl_vector * x, gsl_rng * r) { const size_t n = x->size; size_t i; for (i = 0; i < n; ++i) { double ti = (double) i / (n - 1.0); double xi = sin(2.0 * M_PI * ti) + sin(2.0 * M_PI * 40.0 * ti); double ei = gsl_ran_gaussian(r, sigma); gsl_vector_set(x, i, xi + ei); } return GSL_SUCCESS; } #include "test_mad.c" #include "test_mean.c" #include "test_median.c" #include "test_minmax.c" #include "test_Qn.c" #include "test_qqr.c" #include "test_sum.c" #include "test_Sn.c" #include "test_variance.c" int main() { gsl_rng *r = gsl_rng_alloc(gsl_rng_default); test_mean(r); test_median(r); test_minmax(r); test_mad(r); test_Qn(r); test_qqr(r); test_sum(r); test_Sn(r); test_variance(r); gsl_rng_free(r); exit (gsl_test_summary()); } gsl-2.7.1/rstat/0000755016036000116100000000000014151602576010452 500000000000000gsl-2.7.1/rstat/Makefile.am0000644016036000116100000000105113373111456012420 00000000000000noinst_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-2.7.1/rstat/gsl_rstat.h0000644016036000116100000000554513626553071012557 00000000000000/* 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__ #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 { 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(const gsl_rstat_workspace *w); int gsl_rstat_add(const double x, gsl_rstat_workspace *w); double gsl_rstat_min(const gsl_rstat_workspace *w); double gsl_rstat_max(const gsl_rstat_workspace *w); double gsl_rstat_mean(const gsl_rstat_workspace *w); double gsl_rstat_variance(const gsl_rstat_workspace *w); double gsl_rstat_sd(const gsl_rstat_workspace *w); double gsl_rstat_rms(const gsl_rstat_workspace *w); double gsl_rstat_sd_mean(const gsl_rstat_workspace *w); double gsl_rstat_median(gsl_rstat_workspace *w); double gsl_rstat_skew(const gsl_rstat_workspace *w); double gsl_rstat_kurtosis(const gsl_rstat_workspace *w); int gsl_rstat_reset(gsl_rstat_workspace *w); __END_DECLS #endif /* __GSL_RSTAT_H__ */ gsl-2.7.1/rstat/Makefile.in0000644016036000116100000010607114151557215012443 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/rquantile.Plo ./$(DEPDIR)/rstat.Plo \ ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rstat.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/rquantile.Plo -rm -f ./$(DEPDIR)/rstat.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/rquantile.Plo -rm -f ./$(DEPDIR)/rstat.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/rstat/rstat.c0000644016036000116100000001105713373111456011674 00000000000000/* 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(const 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(const gsl_rstat_workspace *w) { return w->min; } /* gsl_rstat_min() */ double gsl_rstat_max(const gsl_rstat_workspace *w) { return w->max; } /* gsl_rstat_max() */ double gsl_rstat_mean(const gsl_rstat_workspace *w) { return w->mean; } /* gsl_rstat_mean() */ double gsl_rstat_variance(const 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(const gsl_rstat_workspace *w) { double var = gsl_rstat_variance(w); return (sqrt(var)); } /* gsl_rstat_sd() */ double gsl_rstat_rms(const 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(const 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(const 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(const 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-2.7.1/rstat/rquantile.c0000644016036000116100000001221414002204615012525 00000000000000/* rstat/rquantile.c * * Copyright (C) 2015, 2016, 2017, 2018, 2019, 2020, 2021 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-2.7.1/rstat/test.c0000644016036000116100000001763014002204615011507 00000000000000/* rstat/test.c * * Copyright (C) 2015, 2016, 2017, 2018, 2019, 2020, 2021 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 int random_data(const size_t n, double data[], gsl_rng *r) { size_t i; for (i = 0; i < n; ++i) data[i] = 2.0 * gsl_rng_uniform(r) - 1.0; return 0; } void test_basic(const size_t n, const double data[], const double tol, const char * desc) { gsl_rstat_workspace *rstat_workspace_p = gsl_rstat_alloc(); const double expected_mean = gsl_stats_mean(data, 1, 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); 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, "%s n n=%zu", desc, n); gsl_test_rel(mean, expected_mean, tol, "%s mean n=%zu", desc, n); gsl_test_rel(rms, expected_rms, tol, "%s rms n=%zu", desc, n); gsl_test_rel(skew, expected_skew, tol, "%s skew n=%zu", desc, n); gsl_test_rel(kurtosis, expected_kurtosis, tol, "%s kurtosis n=%zu", desc, n); if (n > 1) { 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); var = gsl_rstat_variance(rstat_workspace_p); sd = gsl_rstat_sd(rstat_workspace_p); sd_mean = gsl_rstat_sd_mean(rstat_workspace_p); gsl_test_rel(var, expected_var, tol, "%s variance n=%zu", desc, n); gsl_test_rel(sd, expected_sd, tol, "%s stddev n=%zu", desc, n); gsl_test_rel(sd_mean, expected_sd_mean, tol, "%s stddev_mean n=%zu", desc, n); } if (n <= 5) { /* median should be exact for n <= 5 */ double * data_copy = malloc(n * sizeof(double)); double expected_median, median; memcpy(data_copy, data, n * sizeof(double)); expected_median = gsl_stats_median(data_copy, 1, n); median = gsl_rstat_median(rstat_workspace_p); gsl_test_rel(median, expected_median, tol, "%s median n=%zu", desc, n); free(data_copy); } status = gsl_rstat_reset(rstat_workspace_p); gsl_test_int(status, GSL_SUCCESS, "%s: rstat returned success", desc); 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 = malloc(N * sizeof(double)); double data2[5]; size_t i, j; char buf[64]; /* test1: test on small datasets n <= 5 (median will be exact in this case) */ for (i = 0; i < 100; ++i) { random_data(5, data2, r); for (j = 1; j <= 5; ++j) { sprintf(buf, "test1 j=%zu", j); test_basic(j, data2, tol1, buf); } } /* test2: test on large datasets */ random_data(N, data, r); for (i = 1; i <= 10; ++i) test_basic(i, data, tol1, "test2"); test_basic(100, data, tol1, "test2"); test_basic(1000, data, tol1, "test2"); test_basic(10000, data, tol1, "test2"); test_basic(50000, data, tol1, "test2"); test_basic(80000, data, tol1, "test2"); test_basic(1500000, data, tol1, "test2"); test_basic(2000000, data, tol1, "test2"); /* test3: add large constant */ for (i = 0; i < 5; ++i) data2[i] += 1.0e9; test_basic(5, data2, 1.0e-6, "test3"); 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-2.7.1/statistics/0000755016036000116100000000000014151602576011507 500000000000000gsl-2.7.1/statistics/Makefile.am0000644016036000116100000000261013373111456013457 00000000000000## 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 mad.c median.c covariance.c quantiles.c select.c Sn.c Qn.c gastwirth.c trmean.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 mad_source.c median_source.c quantiles_source.c select_source.c Sn_source.c Qn_source.c gastwirth_source.c trmean_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_robust.c test_LDADD = libgslstatistics.la ../sort/libgslsort.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../rng/libgslrng.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la ../vector/libgslvector.la gsl-2.7.1/statistics/mean_source.c0000644016036000116100000000230313135126237014065 00000000000000/* 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-2.7.1/statistics/variance_source.c0000644016036000116100000000731013373111456014741 00000000000000/* 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-2.7.1/statistics/covariance_source.c0000644016036000116100000001373513373111456015273 00000000000000/* 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-2.7.1/statistics/absdev_source.c0000644016036000116100000000305013135126237014411 00000000000000/* 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-2.7.1/statistics/skew_source.c0000644016036000116100000000335513135126237014126 00000000000000/* 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-2.7.1/statistics/kurtosis_source.c0000644016036000116100000000364413135126237015041 00000000000000/* 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-2.7.1/statistics/lag1_source.c0000644016036000116100000000327513135126237014002 00000000000000/* 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-2.7.1/statistics/p_variance_source.c0000644016036000116100000000266413135126237015266 00000000000000/* 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-2.7.1/statistics/minmax_source.c0000644016036000116100000001021613135126237014440 00000000000000/* 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-2.7.1/statistics/ttest_source.c0000644016036000116100000000324113135126237014312 00000000000000/* 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-2.7.1/statistics/mad_source.c0000644016036000116100000000366613373111456013724 00000000000000/* statistics/mad_source.c * * Copyright (C) 2018 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. */ /* gsl_stats_mad0() Compute median absolute deviation Inputs: data - array containing the observations stride - stride n - length of 'data' work - workspace of length n Return: MAD statistic (without scale/correction factor) */ double FUNCTION(gsl_stats,mad0) (const BASE data[], const size_t stride, const size_t n, double work[]) { double median, mad; size_t i; /* copy input data to work */ for (i = 0; i < n; ++i) work[i] = (double) data[i * stride]; /* compute median of input data using double version */ median = gsl_stats_median(work, 1, n); /* compute absolute deviations from median */ for (i = 0; i < n; ++i) work[i] = fabs((double) data[i * stride] - median); mad = gsl_stats_median(work, 1, n); return mad; } double FUNCTION(gsl_stats,mad) (const BASE data[], const size_t stride, const size_t n, double work[]) { double mad0 = FUNCTION(gsl_stats,mad0)(data, stride, n, work); double mad = 1.482602218505602 * mad0; return mad; } gsl-2.7.1/statistics/median_source.c0000644016036000116100000000350613373111456014411 00000000000000/* 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 ; } double FUNCTION(gsl_stats,median) (BASE 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 = (double) FUNCTION(gsl_stats,select)(data, stride, n, lhs); } else { BASE a = FUNCTION(gsl_stats,select)(data, stride, n, lhs); BASE b = FUNCTION(gsl_stats,select)(data, stride, n, rhs); median = 0.5 * (a + b); } return median; } gsl-2.7.1/statistics/quantiles_source.c0000644016036000116100000000272513135126237015162 00000000000000/* 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-2.7.1/statistics/select_source.c0000644016036000116100000000630513373111456014433 00000000000000/* statistics/select_source.c * * Copyright (C) 2018 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 { tmp = b ; b = a ; a = tmp ; } while(0) /* gsl_stats_select() Select k-th largest element from an unsorted array using quickselect algorithm Inputs: data - unsorted array containing the observations stride - stride n - length of 'data' k - desired element in [0,n-1] Return: k-th largest element of data[] */ BASE FUNCTION(gsl_stats,select) (BASE data[], const size_t stride, const size_t n, const size_t k) { if (n == 0) { GSL_ERROR_VAL("array size must be positive", GSL_EBADLEN, 0.0); } else { size_t left = 0; size_t right = n - 1; size_t mid, i, j; BASE pivot, tmp; while (1) { if (right <= left + 1) { if (right == left + 1 && data[right * stride] < data[left * stride]) { SWAP(data[left * stride], data[right * stride]); } return data[k * stride]; } else { mid = (left + right) >> 1; SWAP(data[mid * stride], data[(left + 1) * stride]); if (data[left * stride] > data[right * stride]) { SWAP(data[left * stride], data[right * stride]); } if (data[(left + 1) * stride] > data[right * stride]) { SWAP(data[(left + 1) * stride], data[right * stride]); } if (data[left * stride] > data[(left + 1) * stride]) { SWAP(data[left * stride], data[(left + 1) * stride]); } i = left + 1; j = right; pivot = data[(left + 1) * stride]; while (1) { do i++; while (data[i * stride] < pivot); do j--; while (data[j * stride] > pivot); if (j < i) break; SWAP(data[i * stride], data[j * stride]); } data[(left + 1) * stride] = data[j * stride]; data[j * stride] = pivot; if (j >= k) right = j - 1; if (j <= k) left = i; } } /* will never get here */ GSL_ERROR_VAL("select error", GSL_FAILURE, 0.0); } } gsl-2.7.1/statistics/Sn_source.c0000644016036000116100000002035013373111456013530 00000000000000/* statistics/Sn_source.c * * Copyright (C) 2018 Patrick Alken * Copyright (C) 2005, 2006, 2007 Martin Maechler, ETH Zurich * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 merge of the C version of original files qn.f and sn.f, * translated by f2c (version 20010821). ==== ==== * and then by f2c-clean,v 1.9 2000/01/13 13:46:53 * and further clean-edited manually by Martin Maechler. * * Further added interface functions to be called via .C() from R or S-plus * Note that Peter Rousseeuw has explicitely given permission to * use his code under the GPL for the R project. */ /* Original comments by the authors of the Fortran original code, * (merged for Qn & Sn in one file by M.M.): This file contains fortran functions for two new robust estimators of scale denoted as Qn and Sn, decribed in Rousseeuw and Croux (1993). These estimators have a high breakdown point and a bounded influence function. The implementation given here is very fast (running in O(n logn) time) and needs little storage space. Rousseeuw, P.J. and Croux, C. (1993) Alternatives to the Median Absolute Deviation", Journal of the American Statistical Association, Vol. 88, 1273-1283. For both estimators, implementations in the pascal language can be obtained from the original authors. This software may be used and copied freely for scientific and/or non-commercial purposes, provided reference is made to the abovementioned paper. Note by MM: We have explicit permission from P.Rousseeuw to licence it under the GNU Public Licence. */ /* gsl_stats_Sn0_from_sorted_data() Efficient algorithm for the scale estimator: S_n0 = LOMED_{i} HIMED_{i} |x_i - x_j| which can equivalently be written as S_n0 = LOMED_{i} LOMED_{j != i} |x_i - x_j| Inputs: sorted_data - sorted array containing the observations stride - stride n - length of 'sorted_data' work - workspace of length n work[i] := LOMED_{j != i} | x_i - x_j | Return: S_n statistic (without scale/correction factor) */ BASE FUNCTION(gsl_stats,Sn0_from_sorted_data) (const BASE sorted_data[], const size_t stride, const size_t n, BASE work[]) { /* Local variables */ double medA, medB; int i, diff, half, Amin, Amax, even, length; int leftA, leftB, nA, nB, tryA, tryB, rightA, rightB; int np1_2 = (n + 1) / 2; work[0] = sorted_data[n / 2 * stride] - sorted_data[0]; /* first half for() loop : */ for (i = 2; i <= np1_2; ++i) { nA = i - 1; nB = n - i; diff = nB - nA; leftA = leftB = 1; rightA = rightB = nB; Amin = diff / 2 + 1; Amax = diff / 2 + nA; while (leftA < rightA) { length = rightA - leftA + 1; even = 1 - length % 2; half = (length - 1) / 2; tryA = leftA + half; tryB = leftB + half; if (tryA < Amin) { rightB = tryB; leftA = tryA + even; } else { if (tryA > Amax) { rightA = tryA; leftB = tryB + even; } else { medA = sorted_data[(i - 1) * stride] - sorted_data[(i - tryA + Amin - 2) * stride]; medB = sorted_data[(tryB + i - 1) * stride] - sorted_data[(i - 1) * stride]; if (medA >= medB) { rightA = tryA; leftB = tryB + even; } else { rightB = tryB; leftA = tryA + even; } } } } /* while */ if (leftA > Amax) { work[i - 1] = sorted_data[(leftB + i - 1) * stride] - sorted_data[(i - 1) * stride]; } else { medA = sorted_data[(i - 1) * stride] - sorted_data[(i - leftA + Amin - 2) * stride]; medB = sorted_data[(leftB + i - 1) * stride] - sorted_data[(i - 1) * stride]; work[i - 1] = GSL_MIN(medA, medB); } } /* second half for() loop : */ for (i = np1_2 + 1; i <= (int) n - 1; ++i) { nA = n - i; nB = i - 1; diff = nB - nA; leftA = leftB = 1; rightA = rightB = nB; Amin = diff / 2 + 1; Amax = diff / 2 + nA; while (leftA < rightA) { length = rightA - leftA + 1; even = 1 - length % 2; half = (length - 1) / 2; tryA = leftA + half; tryB = leftB + half; if (tryA < Amin) { rightB = tryB; leftA = tryA + even; } else { if (tryA > Amax) { rightA = tryA; leftB = tryB + even; } else { medA = sorted_data[(i + tryA - Amin) * stride] - sorted_data[(i - 1) * stride]; medB = sorted_data[(i - 1) * stride] - sorted_data[(i - tryB - 1) * stride]; if (medA >= medB) { rightA = tryA; leftB = tryB + even; } else { rightB = tryB; leftA = tryA + even; } } } } /* while */ if (leftA > Amax) { work[i - 1] = sorted_data[(i - 1) * stride] - sorted_data[(i - leftB - 1) * stride]; } else { medA = sorted_data[(i + leftA - Amin) * stride] - sorted_data[(i - 1) * stride]; medB = sorted_data[(i - 1) * stride] - sorted_data[(i - leftB - 1) * stride]; work[i - 1] = GSL_MIN(medA, medB); } } work[n - 1] = sorted_data[(n - 1) * stride] - sorted_data[(np1_2 - 1) * stride]; /* sort work array */ TYPE (gsl_sort) (work, 1, n); return work[np1_2 - 1]; } /* gsl_stats_Sn_from_sorted_data() Efficient algorithm for the scale estimator: S_n = 1.1926 * c_n LOMED_{i} HIMED_{i} |x_i - x_j| which can equivalently be written as S_n = 1.1926 * c_n * LOMED_{i} LOMED_{j != i} |x_i - x_j| and c_n is a correction factor for small sample bias Inputs: sorted_data - sorted array containing the observations stride - stride n - length of 'sorted_data' work - workspace of length n work[i] := LOMED_{j != i} | x_i - x_j | Return: S_n statistic */ double FUNCTION(gsl_stats,Sn_from_sorted_data) (const BASE sorted_data[], const size_t stride, const size_t n, BASE work[]) { const double scale = 1.1926; /* asymptotic consistency for sigma^2 */ double Sn0 = (double) FUNCTION(gsl_stats,Sn0_from_sorted_data)(sorted_data, stride, n, work); double cn = 1.0; double Sn; /* determine correction factor for finite sample bias */ if (n <= 9) { if (n == 2) cn = 0.743; else if (n == 3) cn = 1.851; else if (n == 4) cn = 0.954; else if (n == 5) cn = 1.351; else if (n == 6) cn = 0.993; else if (n == 7) cn = 1.198; else if (n == 8) cn = 1.005; else if (n == 9) cn = 1.131; } else if (n % 2 == 1) /* n odd, >= 11 */ { cn = (double) n / (n - 0.9); } Sn = scale * cn * Sn0; return Sn; } gsl-2.7.1/statistics/Qn_source.c0000644016036000116100000002402713373111456013533 00000000000000/* statistics/Qn_source.c * * Copyright (C) 2018 Patrick Alken * Copyright (C) 2005, 2006, 2007 Martin Maechler, ETH Zurich * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 merge of the C version of original files qn.f and sn.f, * translated by f2c (version 20010821). ==== ==== * and then by f2c-clean,v 1.9 2000/01/13 13:46:53 * and further clean-edited manually by Martin Maechler. * * Further added interface functions to be called via .C() from R or S-plus * Note that Peter Rousseeuw has explicitely given permission to * use his code under the GPL for the R project. */ /* Original comments by the authors of the Fortran original code, * (merged for Qn & Sn in one file by M.M.): This file contains fortran functions for two new robust estimators of scale denoted as Qn and Sn, decribed in Rousseeuw and Croux (1993). These estimators have a high breakdown point and a bounded influence function. The implementation given here is very fast (running in O(n logn) time) and needs little storage space. Rousseeuw, P.J. and Croux, C. (1993) Alternatives to the Median Absolute Deviation", Journal of the American Statistical Association, Vol. 88, 1273-1283. For both estimators, implementations in the pascal language can be obtained from the original authors. This software may be used and copied freely for scientific and/or non-commercial purposes, provided reference is made to the abovementioned paper. Note by MM: We have explicit permission from P.Rousseeuw to licence it under the GNU Public Licence. */ #ifndef int64_t #define int64_t long int #endif static BASE FUNCTION(Qn,whimed)(BASE * a, int * w, int n, BASE * a_cand, BASE * a_srt, int * w_cand); /* gsl_stats_Qn0_from_sorted_data() Efficient algorithm for the scale estimator: Q_n0 = { |x_i - x_j|; i ni) { j = 0; /* Truncation to float : try to make sure that the same values are got later (guard bits !) */ for (i = 1; i < ni; ++i) { if (left[i] <= right[i]) { weight[j] = right[i] - left[i] + 1; jh = left[i] + weight[j] / 2; work[j] = sorted_data[i * stride] - sorted_data[(ni - jh) * stride]; ++j; } } trial = FUNCTION(Qn,whimed)(work, weight, j, a_cand, a_srt, /*iw_cand*/ p); j = 0; for (i = ni - 1; i >= 0; --i) { while (j < ni && ((double)(sorted_data[i * stride] - sorted_data[(ni - j - 1) * stride])) < trial) ++j; p[i] = j; } j = ni + 1; for (i = 0; i < ni; ++i) { while ((double)(sorted_data[i * stride] - sorted_data[(ni - j + 1) * stride]) > trial) --j; q[i] = j; } sump = 0; sumq = 0; for (i = 0; i < ni; ++i) { sump += p[i]; sumq += q[i] - 1; } if (knew <= sump) { for (i = 0; i < ni; ++i) right[i] = p[i]; nr = sump; } else if (knew > sumq) { for (i = 0; i < ni; ++i) left[i] = q[i]; nl = sumq; } else /* sump < knew <= sumq */ { found = 1; } } /* while */ if (found) { return trial; } else { j = 0; for (i = 1; i < ni; ++i) { int jj; for (jj = left[i]; jj <= right[i]; ++jj) { work[j] = sorted_data[i * stride] - sorted_data[(ni - jj) * stride]; j++; }/* j will be = sum_{i=2}^n (right[i] - left[i] + 1)_{+} */ } /* return pull(work, j - 1, knew - nl) : */ knew -= (nl + 1); /* -1: 0-indexing */ /* sort work array */ TYPE (gsl_sort) (work, 1, j); return (work[knew]); } } /* gsl_stats_Qn_from_sorted_data() Efficient algorithm for the scale estimator: Q_n = 2.219 * d_n * { |x_i - x_j|; i= 1e5 */ int64_t wleft, wmid, wright, w_tot, wrest; BASE trial; w_tot = 0; for (i = 0; i < n; ++i) w_tot += w[i]; wrest = 0; /* REPEAT : */ do { for (i = 0; i < n; ++i) a_srt[i] = a[i]; n2 = n/2; /* =^= n/2 +1 with 0-indexing */ #if 0 rPsort(a_srt, n, n2); #else TYPE (gsl_sort) (a_srt, 1, n); #endif trial = a_srt[n2]; wleft = 0; wmid = 0; wright = 0; for (i = 0; i < n; ++i) { if (a[i] < trial) wleft += w[i]; else if (a[i] > trial) wright += w[i]; else wmid += w[i]; } /* wleft = sum_{i; a[i] < trial} w[i] * wmid = sum_{i; a[i] == trial} w[i] at least one 'i' since trial is one a[]! * wright= sum_{i; a[i] > trial} w[i] */ kcand = 0; if (2 * (wrest + wleft) > w_tot) { for (i = 0; i < n; ++i) { if (a[i] < trial) { a_cand[kcand] = a[i]; w_cand[kcand] = w[i]; ++kcand; } } } else if (2 * (wrest + wleft + wmid) <= w_tot) { for (i = 0; i < n; ++i) { if (a[i] > trial) { a_cand[kcand] = a[i]; w_cand[kcand] = w[i]; ++kcand; } } wrest += wleft + wmid; } else { return trial; } n = kcand; for (i = 0; i < n; ++i) { a[i] = a_cand[i]; w[i] = w_cand[i]; } } while(1); } gsl-2.7.1/statistics/gastwirth_source.c0000644016036000116100000000264713373111456015175 00000000000000/* statistics/gastwirth_source.c * * Copyright (C) 2018 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. */ double FUNCTION(gsl_stats,gastwirth_from_sorted_data) (const BASE sorted_data[], const size_t stride, const size_t n) { if (n == 0) { return 0.0; } else { double a = FUNCTION(gsl_stats,quantile_from_sorted_data)(sorted_data, stride, n, 1.0 / 3.0); double b = FUNCTION(gsl_stats,median_from_sorted_data)(sorted_data, stride, n); double c = FUNCTION(gsl_stats,quantile_from_sorted_data)(sorted_data, stride, n, 2.0 / 3.0); double gastwirth = 0.3 * a + 0.4 * b + 0.3 * c; return gastwirth; } } gsl-2.7.1/statistics/trmean_source.c0000644016036000116100000000275713373111456014451 00000000000000/* statistics/trmean_source.c * * Copyright (C) 2018 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. */ double FUNCTION (gsl_stats, trmean_from_sorted_data) (const double trim, const BASE sorted_data[], const size_t stride, const size_t size) { if (trim >= 0.5) { return FUNCTION(gsl_stats, median_from_sorted_data)(sorted_data, stride, size); } else { size_t ilow = (size_t) floor(trim * size); size_t ihigh = size - ilow - 1; double mean = 0.0; double k = 0.0; size_t i; /* compute mean of middle samples in [ilow,ihigh] */ for (i = ilow; i <= ihigh; ++i) { double delta = sorted_data[i * stride] - mean; k += 1.0; mean += delta / k; } return mean; } } gsl-2.7.1/statistics/wmean_source.c0000644016036000116100000000263013135126237014257 00000000000000/* 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-2.7.1/statistics/wvariance_source.c0000644016036000116100000001235013373111456015130 00000000000000/* 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-2.7.1/statistics/wabsdev_source.c0000644016036000116100000000327113135126237014605 00000000000000/* 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-2.7.1/statistics/wskew_source.c0000644016036000116100000000400713135126237014310 00000000000000/* 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-2.7.1/statistics/wkurtosis_source.c0000644016036000116100000000427013135126237015224 00000000000000/* 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-2.7.1/statistics/test_float_source.c0000644016036000116100000004305613373111456015324 00000000000000/* 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 (odd)"); } { BASE * work = (BASE *) malloc (stridea * na * sizeof(BASE)); double expected = 0.07505; double median; for (i = 0; i < na; i++) work[i * stridea] = (BASE) rawa[i]; median = FUNCTION(gsl_stats,median)(work, stridea, na) ; gsl_test_rel (median, expected, rel, NAME(gsl_stats) "_median (even)"); free(work); } { BASE * work = (BASE *) malloc (stridea * (na - 1) * sizeof(BASE)); double expected = 0.0728; double median; for (i = 0; i < na - 1; i++) work[i * stridea] = (BASE) sorted[i * stridea]; median = FUNCTION(gsl_stats,median)(work, stridea, na - 1) ; gsl_test_rel (median, expected, rel, NAME(gsl_stats) "_median (odd)"); free(work); } { const double trim = 0.2; double trmean = FUNCTION(gsl_stats,trmean_from_sorted_data)(trim, sorted, stridea, na) ; double expected = 0.0719; gsl_test_rel (trmean, expected, rel, NAME(gsl_stats) "_trmean_from_sorted_data (even)"); } { const double trim = 0.2; double trmean = FUNCTION(gsl_stats,trmean_from_sorted_data)(trim, sorted, stridea, na - 1) ; double expected = 0.06806666666666666; gsl_test_rel (trmean, expected, rel, NAME(gsl_stats) "_trmean_from_sorted_data (odd)"); } { double gastwirth = FUNCTION(gsl_stats,gastwirth_from_sorted_data)(sorted, stridea, na) ; double expected = 0.07271; gsl_test_rel (gastwirth, expected, rel, NAME(gsl_stats) "_gastwirth_from_sorted_data (even)"); } { double gastwirth = FUNCTION(gsl_stats,gastwirth_from_sorted_data)(sorted, stridea, na - 1) ; double expected = 0.06794; gsl_test_rel (gastwirth, expected, rel, NAME(gsl_stats) "_gastwirth_from_sorted_data (odd)"); } { 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)"); } { size_t k; BASE * work = (BASE *) malloc (stridea * na * sizeof(BASE)); for (k = 0; k < na; ++k) { double expected = sorted[k * stridea]; double kselect; /* copy rawa[] for each k, since gsl_stats_select() changes input array */ for (i = 0; i < na; i++) work[i * stridea] = (BASE) rawa[i]; kselect = FUNCTION(gsl_stats,select)(work, stridea, na, k); gsl_test_rel(kselect, expected, rel, NAME(gsl_stats) "_select"); } free(work); } /* 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); } /* restore */ groupa [3*stridea] = (BASE) rawa[3]; { double * work = (double *) malloc (na * sizeof(double)); double expected = 0.02925; double mad0 = FUNCTION(gsl_stats,mad0)(groupa, stridea, na, work); gsl_test_rel (mad0, expected, rel, NAME(gsl_stats) "_mad0 (even)"); free(work); } { double * work = (double *) malloc ((na - 1) * sizeof(double)); double expected = 0.02910; double mad0 = FUNCTION(gsl_stats,mad0)(groupa, stridea, na - 1, work); gsl_test_rel (mad0, expected, rel, NAME(gsl_stats) "_mad0 (odd)"); free(work); } { BASE *work = malloc(na * sizeof(BASE)); double r = FUNCTION(gsl_stats,Sn_from_sorted_data) (sorted, stridea, na, work); double expected = 0.04007136; gsl_test_rel (r, expected, rel, NAME(gsl_stats) "_Sn_from_sorted_data (even)"); free(work); } { BASE *work = malloc((na - 1) * sizeof(BASE)); double r = FUNCTION(gsl_stats,Sn_from_sorted_data) (sorted, stridea, na - 1, work); double expected = 0.03728599834710744; gsl_test_rel (r, expected, rel, NAME(gsl_stats) "_Sn_from_sorted_data (odd)"); free(work); } { BASE *work = malloc(3 * na * sizeof(BASE)); int *work_int = malloc(5 * na * sizeof(int)); double r = FUNCTION(gsl_stats,Qn_from_sorted_data) (sorted, stridea, na, work, work_int); double expected = 0.04113672759664409; gsl_test_rel (r, expected, rel, NAME(gsl_stats) "_Qn_from_sorted_data (even)"); free(work); free(work_int); } { BASE *work = malloc(3 * (na - 1) * sizeof(BASE)); int *work_int = malloc(5 * (na - 1) * sizeof(int)); double r = FUNCTION(gsl_stats,Qn_from_sorted_data) (sorted, stridea, na - 1, work, work_int); double expected = 0.03684305546303433; gsl_test_rel (r, expected, rel, NAME(gsl_stats) "_Qn_from_sorted_data (odd)"); free(work); free(work_int); } free (sorted); free (groupa); free (groupb); free (w); } gsl-2.7.1/statistics/test_int_source.c0000644016036000116100000003072413373111456015007 00000000000000/* 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)"); } { BASE * work = (BASE *) malloc (stridea * ina * sizeof(BASE)); double expected = 18; double median; for (i = 0; i < ina; i++) work[i * stridea] = (BASE) irawa[i]; median = FUNCTION(gsl_stats,median)(work, stridea, ina) ; gsl_test_rel (median, expected, rel, NAME(gsl_stats) "_median (even)"); free(work); } { BASE * work = (BASE *) malloc (stridea * (ina - 1) * sizeof(BASE)); double expected = 18; double median; for (i = 0; i < ina - 1; i++) work[i * stridea] = sorted[i * stridea]; median = FUNCTION(gsl_stats,median)(work, stridea, ina - 1) ; gsl_test_rel (median, expected, rel, NAME(gsl_stats) "_median (odd)"); free(work); } { const double trim = 0.31; double trmean = FUNCTION(gsl_stats,trmean_from_sorted_data)(trim, sorted, stridea, ina) ; double expected = 17.875; gsl_test_rel (trmean, expected, rel, NAME(gsl_stats) "_trmean_from_sorted_data (even)"); } { const double trim = 0.3; double trmean = FUNCTION(gsl_stats,trmean_from_sorted_data)(trim, sorted, stridea, ina - 1) ; double expected = 17.66666666666666; gsl_test_rel (trmean, expected, rel, NAME(gsl_stats) "_trmean_from_sorted_data (odd)"); } { double gastwirth = FUNCTION(gsl_stats,gastwirth_from_sorted_data)(sorted, stridea, ina) ; double expected = 17.9; gsl_test_rel (gastwirth, expected, rel, NAME(gsl_stats) "_gastwirth_from_sorted_data (even)"); } { double gastwirth = FUNCTION(gsl_stats,gastwirth_from_sorted_data)(sorted, stridea, ina - 1) ; double expected = 17.4; gsl_test_rel (gastwirth, expected, rel, NAME(gsl_stats) "_gastwirth_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)"); } { size_t k; BASE * work = (BASE *) malloc (stridea * ina * sizeof(BASE)); for (k = 0; k < ina; ++k) { int expected = sorted[k * stridea]; int kselect; /* copy irawa[] for each k, since gsl_stats_select() changes input array */ for (i = 0; i < ina; i++) work[i * stridea] = (BASE) irawa[i]; kselect = FUNCTION(gsl_stats,select)(work, stridea, ina, k); gsl_test (kselect != expected, NAME(gsl_stats) "_select (%d observed vs %d expected)", kselect, expected); } free(work); } { double * work = (double *) malloc (ina * sizeof(double)); double expected = 2.0; double mad0 = FUNCTION(gsl_stats,mad0)(igroupa, stridea, ina, work); gsl_test_rel (mad0, expected, rel, NAME(gsl_stats) "_mad0 (even)"); free(work); } { double * work = (double *) malloc ((ina - 1) * sizeof(double)); double expected = 2.0; double mad0 = FUNCTION(gsl_stats,mad0)(igroupa, stridea, ina - 1, work); gsl_test_rel (mad0, expected, rel, NAME(gsl_stats) "_mad0 (odd)"); free(work); } { BASE * work = malloc(ina * sizeof(BASE)); double sn = FUNCTION(gsl_stats,Sn_from_sorted_data)(sorted, stridea, ina, work) ; double expected = 2.3852; gsl_test_rel (sn, expected, rel, NAME(gsl_stats) "_Sn_from_sorted_data (even)"); free(work); } { BASE * work = malloc((ina - 1) * sizeof(BASE)); double sn = FUNCTION(gsl_stats,Sn_from_sorted_data)(sorted, stridea, ina - 1, work) ; double expected = 2.503801104972376; gsl_test_rel (sn, expected, rel, NAME(gsl_stats) "_Sn_from_sorted_data (odd)"); free(work); } { BASE * work = malloc(3 * ina * sizeof(BASE)); int * work_int = malloc(5 * ina * sizeof(int)); double qn = FUNCTION(gsl_stats,Qn_from_sorted_data)(sorted, stridea, ina, work, work_int) ; double expected = 3.732513488036874; gsl_test_rel (qn, expected, rel, NAME(gsl_stats) "_Qn_from_sorted_data (even)"); free(work); free(work_int); } { BASE * work = malloc(3 * (ina - 1) * sizeof(BASE)); int * work_int = malloc(5 * (ina - 1) * sizeof(int)); double qn = FUNCTION(gsl_stats,Qn_from_sorted_data)(sorted, stridea, ina - 1, work, work_int) ; double expected = 4.118443402621429; gsl_test_rel (qn, expected, rel, NAME(gsl_stats) "_Qn_from_sorted_data (odd)"); free(work); free(work_int); } free (sorted); free (igroupa); free (igroupb); free (test1); } gsl-2.7.1/statistics/gsl_statistics.h0000644016036000116100000000100713135126237014631 00000000000000#ifndef __GSL_STATISTICS_H__ #define __GSL_STATISTICS_H__ #include #include #include #include #include #include #include #include #include #include #include #endif /* __GSL_STATISTICS_H__ */ gsl-2.7.1/statistics/gsl_statistics_char.h0000644016036000116100000001332513373111456015635 00000000000000/* 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 #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); char gsl_stats_char_select(char data[], const size_t stride, const size_t n, const size_t k); double gsl_stats_char_median_from_sorted_data (const char sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_char_median (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) ; double gsl_stats_char_trmean_from_sorted_data (const double trim, const char sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_char_gastwirth_from_sorted_data (const char sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_char_mad0(const char data[], const size_t stride, const size_t n, double work[]); double gsl_stats_char_mad(const char data[], const size_t stride, const size_t n, double work[]); char gsl_stats_char_Sn0_from_sorted_data (const char sorted_data[], const size_t stride, const size_t n, char work[]) ; double gsl_stats_char_Sn_from_sorted_data (const char sorted_data[], const size_t stride, const size_t n, char work[]) ; char gsl_stats_char_Qn0_from_sorted_data (const char sorted_data[], const size_t stride, const size_t n, char work[], int work_int[]) ; double gsl_stats_char_Qn_from_sorted_data (const char sorted_data[], const size_t stride, const size_t n, char work[], int work_int[]) ; __END_DECLS #endif /* __GSL_STATISTICS_CHAR_H__ */ gsl-2.7.1/statistics/gsl_statistics_double.h0000644016036000116100000001741613373111456016177 00000000000000/* 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 #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_select(double data[], const size_t stride, const size_t n, const size_t k); double gsl_stats_median_from_sorted_data (const double sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_median (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) ; double gsl_stats_trmean_from_sorted_data (const double trim, const double sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_gastwirth_from_sorted_data (const double sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_mad0(const double data[], const size_t stride, const size_t n, double work[]); double gsl_stats_mad(const double data[], const size_t stride, const size_t n, double work[]); double gsl_stats_Sn0_from_sorted_data (const double sorted_data[], const size_t stride, const size_t n, double work[]) ; double gsl_stats_Sn_from_sorted_data (const double sorted_data[], const size_t stride, const size_t n, double work[]) ; double gsl_stats_Qn0_from_sorted_data (const double sorted_data[], const size_t stride, const size_t n, double work[], int work_int[]) ; double gsl_stats_Qn_from_sorted_data (const double sorted_data[], const size_t stride, const size_t n, double work[], int work_int[]) ; __END_DECLS #endif /* __GSL_STATISTICS_DOUBLE_H__ */ gsl-2.7.1/statistics/gsl_statistics_float.h0000644016036000116100000002000213373111456016013 00000000000000/* 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 #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); float gsl_stats_float_select(float data[], const size_t stride, const size_t n, const size_t k); double gsl_stats_float_median_from_sorted_data (const float sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_float_median (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) ; double gsl_stats_float_trmean_from_sorted_data (const double trim, const float sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_float_gastwirth_from_sorted_data (const float sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_float_mad0(const float data[], const size_t stride, const size_t n, double work[]); double gsl_stats_float_mad(const float data[], const size_t stride, const size_t n, double work[]); float gsl_stats_float_Sn0_from_sorted_data (const float sorted_data[], const size_t stride, const size_t n, float work[]) ; double gsl_stats_float_Sn_from_sorted_data (const float sorted_data[], const size_t stride, const size_t n, float work[]) ; float gsl_stats_float_Qn0_from_sorted_data (const float sorted_data[], const size_t stride, const size_t n, float work[], int work_int[]) ; double gsl_stats_float_Qn_from_sorted_data (const float sorted_data[], const size_t stride, const size_t n, float work[], int work_int[]) ; __END_DECLS #endif /* __GSL_STATISTICS_FLOAT_H__ */ gsl-2.7.1/statistics/gsl_statistics_int.h0000644016036000116100000001315613373111456015514 00000000000000/* 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 #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); int gsl_stats_int_select(int data[], const size_t stride, const size_t n, const size_t k); double gsl_stats_int_median_from_sorted_data (const int sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_int_median (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) ; double gsl_stats_int_trmean_from_sorted_data (const double trim, const int sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_int_gastwirth_from_sorted_data (const int sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_int_mad0(const int data[], const size_t stride, const size_t n, double work[]); double gsl_stats_int_mad(const int data[], const size_t stride, const size_t n, double work[]); int gsl_stats_int_Sn0_from_sorted_data (const int sorted_data[], const size_t stride, const size_t n, int work[]) ; double gsl_stats_int_Sn_from_sorted_data (const int sorted_data[], const size_t stride, const size_t n, int work[]) ; int gsl_stats_int_Qn0_from_sorted_data (const int sorted_data[], const size_t stride, const size_t n, int work[], int work_int[]) ; double gsl_stats_int_Qn_from_sorted_data (const int sorted_data[], const size_t stride, const size_t n, int work[], int work_int[]) ; __END_DECLS #endif /* __GSL_STATISTICS_INT_H__ */ gsl-2.7.1/statistics/gsl_statistics_long.h0000644016036000116100000001332513373111456015657 00000000000000/* 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 #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); long gsl_stats_long_select(long data[], const size_t stride, const size_t n, const size_t k); double gsl_stats_long_median_from_sorted_data (const long sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_long_median (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) ; double gsl_stats_long_trmean_from_sorted_data (const double trim, const long sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_long_gastwirth_from_sorted_data (const long sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_long_mad0(const long data[], const size_t stride, const size_t n, double work[]); double gsl_stats_long_mad(const long data[], const size_t stride, const size_t n, double work[]); long gsl_stats_long_Sn0_from_sorted_data (const long sorted_data[], const size_t stride, const size_t n, long work[]) ; double gsl_stats_long_Sn_from_sorted_data (const long sorted_data[], const size_t stride, const size_t n, long work[]) ; long gsl_stats_long_Qn0_from_sorted_data (const long sorted_data[], const size_t stride, const size_t n, long work[], int work_int[]) ; double gsl_stats_long_Qn_from_sorted_data (const long sorted_data[], const size_t stride, const size_t n, long work[], int work_int[]) ; __END_DECLS #endif /* __GSL_STATISTICS_LONG_H__ */ gsl-2.7.1/statistics/gsl_statistics_long_double.h0000644016036000116100000002157213373111456017214 00000000000000/* 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 #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); long double gsl_stats_long_double_select(long double data[], const size_t stride, const size_t n, const size_t k); 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_median (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) ; double gsl_stats_long_double_trmean_from_sorted_data (const double trim, const long double sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_long_double_gastwirth_from_sorted_data (const long double sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_long_double_mad0(const long double data[], const size_t stride, const size_t n, double work[]); double gsl_stats_long_double_mad(const long double data[], const size_t stride, const size_t n, double work[]); long double gsl_stats_long_double_Sn0_from_sorted_data (const long double sorted_data[], const size_t stride, const size_t n, long double work[]) ; double gsl_stats_long_double_Sn_from_sorted_data (const long double sorted_data[], const size_t stride, const size_t n, long double work[]) ; long double gsl_stats_long_double_Qn0_from_sorted_data (const long double sorted_data[], const size_t stride, const size_t n, long double work[], int work_int[]) ; double gsl_stats_long_double_Qn_from_sorted_data (const long double sorted_data[], const size_t stride, const size_t n, long double work[], int work_int[]) ; __END_DECLS #endif /* __GSL_STATISTICS_LONG_DOUBLE_H__ */ gsl-2.7.1/statistics/gsl_statistics_short.h0000644016036000116100000001347413373111456016064 00000000000000/* 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 #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); short gsl_stats_short_select(short data[], const size_t stride, const size_t n, const size_t k); double gsl_stats_short_median_from_sorted_data (const short sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_short_median (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) ; double gsl_stats_short_trmean_from_sorted_data (const double trim, const short sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_short_gastwirth_from_sorted_data (const short sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_short_mad0(const short data[], const size_t stride, const size_t n, double work[]); double gsl_stats_short_mad(const short data[], const size_t stride, const size_t n, double work[]); short gsl_stats_short_Sn0_from_sorted_data (const short sorted_data[], const size_t stride, const size_t n, short work[]) ; double gsl_stats_short_Sn_from_sorted_data (const short sorted_data[], const size_t stride, const size_t n, short work[]) ; short gsl_stats_short_Qn0_from_sorted_data (const short sorted_data[], const size_t stride, const size_t n, short work[], int work_int[]) ; double gsl_stats_short_Qn_from_sorted_data (const short sorted_data[], const size_t stride, const size_t n, short work[], int work_int[]) ; __END_DECLS #endif /* __GSL_STATISTICS_SHORT_H__ */ gsl-2.7.1/statistics/gsl_statistics_uchar.h0000644016036000116100000001441413373111456016022 00000000000000/* 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 #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); unsigned char gsl_stats_uchar_select(unsigned char data[], const size_t stride, const size_t n, const size_t k); 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_median (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) ; double gsl_stats_uchar_trmean_from_sorted_data (const double trim, const unsigned char sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_uchar_gastwirth_from_sorted_data (const unsigned char sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_uchar_mad0(const unsigned char data[], const size_t stride, const size_t n, double work[]); double gsl_stats_uchar_mad(const unsigned char data[], const size_t stride, const size_t n, double work[]); unsigned char gsl_stats_uchar_Sn0_from_sorted_data (const unsigned char sorted_data[], const size_t stride, const size_t n, unsigned char work[]) ; double gsl_stats_uchar_Sn_from_sorted_data (const unsigned char sorted_data[], const size_t stride, const size_t n, unsigned char work[]) ; unsigned char gsl_stats_uchar_Qn0_from_sorted_data (const unsigned char sorted_data[], const size_t stride, const size_t n, unsigned char work[], int work_int[]) ; double gsl_stats_uchar_Qn_from_sorted_data (const unsigned char sorted_data[], const size_t stride, const size_t n, unsigned char work[], int work_int[]) ; __END_DECLS #endif /* __GSL_STATISTICS_UCHAR_H__ */ gsl-2.7.1/statistics/gsl_statistics_uint.h0000644016036000116100000001424513373111456015701 00000000000000/* 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 #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); unsigned int gsl_stats_uint_select(unsigned int data[], const size_t stride, const size_t n, const size_t k); 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_median (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) ; double gsl_stats_uint_trmean_from_sorted_data (const double trim, const unsigned int sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_uint_gastwirth_from_sorted_data (const unsigned int sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_uint_mad0(const unsigned int data[], const size_t stride, const size_t n, double work[]); double gsl_stats_uint_mad(const unsigned int data[], const size_t stride, const size_t n, double work[]); unsigned int gsl_stats_uint_Sn0_from_sorted_data (const unsigned int sorted_data[], const size_t stride, const size_t n, unsigned int work[]) ; double gsl_stats_uint_Sn_from_sorted_data (const unsigned int sorted_data[], const size_t stride, const size_t n, unsigned int work[]) ; unsigned int gsl_stats_uint_Qn0_from_sorted_data (const unsigned int sorted_data[], const size_t stride, const size_t n, unsigned int work[], int work_int[]) ; double gsl_stats_uint_Qn_from_sorted_data (const unsigned int sorted_data[], const size_t stride, const size_t n, unsigned int work[], int work_int[]) ; __END_DECLS #endif /* __GSL_STATISTICS_UINT_H__ */ gsl-2.7.1/statistics/gsl_statistics_ulong.h0000644016036000116100000001441413373111456016044 00000000000000/* 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 #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); unsigned long gsl_stats_ulong_select(unsigned long data[], const size_t stride, const size_t n, const size_t k); 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_median (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) ; double gsl_stats_ulong_trmean_from_sorted_data (const double trim, const unsigned long sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_ulong_gastwirth_from_sorted_data (const unsigned long sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_ulong_mad0(const unsigned long data[], const size_t stride, const size_t n, double work[]); double gsl_stats_ulong_mad(const unsigned long data[], const size_t stride, const size_t n, double work[]); unsigned long gsl_stats_ulong_Sn0_from_sorted_data (const unsigned long sorted_data[], const size_t stride, const size_t n, unsigned long work[]) ; double gsl_stats_ulong_Sn_from_sorted_data (const unsigned long sorted_data[], const size_t stride, const size_t n, unsigned long work[]) ; unsigned long gsl_stats_ulong_Qn0_from_sorted_data (const unsigned long sorted_data[], const size_t stride, const size_t n, unsigned long work[], int work_int[]) ; double gsl_stats_ulong_Qn_from_sorted_data (const unsigned long sorted_data[], const size_t stride, const size_t n, unsigned long work[], int work_int[]) ; __END_DECLS #endif /* __GSL_STATISTICS_ULONG_H__ */ gsl-2.7.1/statistics/gsl_statistics_ushort.h0000644016036000116100000001456313373111456016251 00000000000000/* 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 #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); unsigned short gsl_stats_ushort_select(unsigned short data[], const size_t stride, const size_t n, const size_t k); 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_median (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) ; double gsl_stats_ushort_trmean_from_sorted_data (const double trim, const unsigned short sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_ushort_gastwirth_from_sorted_data (const unsigned short sorted_data[], const size_t stride, const size_t n) ; double gsl_stats_ushort_mad0(const unsigned short data[], const size_t stride, const size_t n, double work[]); double gsl_stats_ushort_mad(const unsigned short data[], const size_t stride, const size_t n, double work[]); unsigned short gsl_stats_ushort_Sn0_from_sorted_data (const unsigned short sorted_data[], const size_t stride, const size_t n, unsigned short work[]) ; double gsl_stats_ushort_Sn_from_sorted_data (const unsigned short sorted_data[], const size_t stride, const size_t n, unsigned short work[]) ; unsigned short gsl_stats_ushort_Qn0_from_sorted_data (const unsigned short sorted_data[], const size_t stride, const size_t n, unsigned short work[], int work_int[]) ; double gsl_stats_ushort_Qn_from_sorted_data (const unsigned short sorted_data[], const size_t stride, const size_t n, unsigned short work[], int work_int[]) ; __END_DECLS #endif /* __GSL_STATISTICS_USHORT_H__ */ gsl-2.7.1/statistics/Makefile.in0000644016036000116100000012023514151557215013476 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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 mad.lo \ median.lo covariance.lo quantiles.lo select.lo Sn.lo Qn.lo \ gastwirth.lo trmean.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_robust.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslstatistics.la ../sort/libgslsort.la \ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \ ../rng/libgslrng.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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/Qn.Plo ./$(DEPDIR)/Sn.Plo \ ./$(DEPDIR)/absdev.Plo ./$(DEPDIR)/covariance.Plo \ ./$(DEPDIR)/gastwirth.Plo ./$(DEPDIR)/kurtosis.Plo \ ./$(DEPDIR)/lag1.Plo ./$(DEPDIR)/mad.Plo ./$(DEPDIR)/mean.Plo \ ./$(DEPDIR)/median.Plo ./$(DEPDIR)/minmax.Plo \ ./$(DEPDIR)/p_variance.Plo ./$(DEPDIR)/quantiles.Plo \ ./$(DEPDIR)/select.Plo ./$(DEPDIR)/skew.Plo \ ./$(DEPDIR)/test.Po ./$(DEPDIR)/test_nist.Po \ ./$(DEPDIR)/test_robust.Po ./$(DEPDIR)/trmean.Plo \ ./$(DEPDIR)/ttest.Plo ./$(DEPDIR)/variance.Plo \ ./$(DEPDIR)/wabsdev.Plo ./$(DEPDIR)/wkurtosis.Plo \ ./$(DEPDIR)/wmean.Plo ./$(DEPDIR)/wskew.Plo \ ./$(DEPDIR)/wvariance.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 mad.c median.c covariance.c quantiles.c select.c Sn.c Qn.c gastwirth.c trmean.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 mad_source.c median_source.c quantiles_source.c select_source.c Sn_source.c Qn_source.c gastwirth_source.c trmean_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_robust.c test_LDADD = libgslstatistics.la ../sort/libgslsort.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../rng/libgslrng.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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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)/Qn.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Sn.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/absdev.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/covariance.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gastwirth.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kurtosis.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lag1.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mad.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mean.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/median.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minmax.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/p_variance.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quantiles.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/select.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skew.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_nist.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_robust.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trmean.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ttest.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variance.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wabsdev.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wkurtosis.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wmean.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wskew.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wvariance.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/Qn.Plo -rm -f ./$(DEPDIR)/Sn.Plo -rm -f ./$(DEPDIR)/absdev.Plo -rm -f ./$(DEPDIR)/covariance.Plo -rm -f ./$(DEPDIR)/gastwirth.Plo -rm -f ./$(DEPDIR)/kurtosis.Plo -rm -f ./$(DEPDIR)/lag1.Plo -rm -f ./$(DEPDIR)/mad.Plo -rm -f ./$(DEPDIR)/mean.Plo -rm -f ./$(DEPDIR)/median.Plo -rm -f ./$(DEPDIR)/minmax.Plo -rm -f ./$(DEPDIR)/p_variance.Plo -rm -f ./$(DEPDIR)/quantiles.Plo -rm -f ./$(DEPDIR)/select.Plo -rm -f ./$(DEPDIR)/skew.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test_nist.Po -rm -f ./$(DEPDIR)/test_robust.Po -rm -f ./$(DEPDIR)/trmean.Plo -rm -f ./$(DEPDIR)/ttest.Plo -rm -f ./$(DEPDIR)/variance.Plo -rm -f ./$(DEPDIR)/wabsdev.Plo -rm -f ./$(DEPDIR)/wkurtosis.Plo -rm -f ./$(DEPDIR)/wmean.Plo -rm -f ./$(DEPDIR)/wskew.Plo -rm -f ./$(DEPDIR)/wvariance.Plo -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 -f ./$(DEPDIR)/Qn.Plo -rm -f ./$(DEPDIR)/Sn.Plo -rm -f ./$(DEPDIR)/absdev.Plo -rm -f ./$(DEPDIR)/covariance.Plo -rm -f ./$(DEPDIR)/gastwirth.Plo -rm -f ./$(DEPDIR)/kurtosis.Plo -rm -f ./$(DEPDIR)/lag1.Plo -rm -f ./$(DEPDIR)/mad.Plo -rm -f ./$(DEPDIR)/mean.Plo -rm -f ./$(DEPDIR)/median.Plo -rm -f ./$(DEPDIR)/minmax.Plo -rm -f ./$(DEPDIR)/p_variance.Plo -rm -f ./$(DEPDIR)/quantiles.Plo -rm -f ./$(DEPDIR)/select.Plo -rm -f ./$(DEPDIR)/skew.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test_nist.Po -rm -f ./$(DEPDIR)/test_robust.Po -rm -f ./$(DEPDIR)/trmean.Plo -rm -f ./$(DEPDIR)/ttest.Plo -rm -f ./$(DEPDIR)/variance.Plo -rm -f ./$(DEPDIR)/wabsdev.Plo -rm -f ./$(DEPDIR)/wkurtosis.Plo -rm -f ./$(DEPDIR)/wmean.Plo -rm -f ./$(DEPDIR)/wskew.Plo -rm -f ./$(DEPDIR)/wvariance.Plo -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/statistics/ChangeLog0000644016036000116100000000771113373111456013204 000000000000002008-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-2.7.1/statistics/TODO0000644016036000116100000000603713373111456012122 00000000000000# -*- 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-2.7.1/statistics/mean.c0000644016036000116100000000250313135126237012507 00000000000000#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-2.7.1/statistics/variance.c0000644016036000116100000000260213135126237013357 00000000000000#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-2.7.1/statistics/absdev.c0000644016036000116100000000255213135126237013037 00000000000000#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-2.7.1/statistics/skew.c0000644016036000116100000000252613135126237012545 00000000000000#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-2.7.1/statistics/kurtosis.c0000644016036000116100000000260113135126237013451 00000000000000#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-2.7.1/statistics/lag1.c0000644016036000116100000000250313135126237012413 00000000000000#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-2.7.1/statistics/p_variance.c0000644016036000116100000000260613135126237013702 00000000000000#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-2.7.1/statistics/minmax.c0000644016036000116100000000260713135126237013065 00000000000000#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-2.7.1/statistics/ttest.c0000644016036000116100000000254113135126237012734 00000000000000#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-2.7.1/statistics/mad.c0000644016036000116100000000252313373111456012333 00000000000000#include #include #include #define BASE_LONG_DOUBLE #include "templates_on.h" #include "mad_source.c" #include "templates_off.h" #undef BASE_LONG_DOUBLE #define BASE_DOUBLE #include "templates_on.h" #include "mad_source.c" #include "templates_off.h" #undef BASE_DOUBLE #define BASE_FLOAT #include "templates_on.h" #include "mad_source.c" #include "templates_off.h" #undef BASE_FLOAT #define BASE_ULONG #include "templates_on.h" #include "mad_source.c" #include "templates_off.h" #undef BASE_ULONG #define BASE_LONG #include "templates_on.h" #include "mad_source.c" #include "templates_off.h" #undef BASE_LONG #define BASE_UINT #include "templates_on.h" #include "mad_source.c" #include "templates_off.h" #undef BASE_UINT #define BASE_INT #include "templates_on.h" #include "mad_source.c" #include "templates_off.h" #undef BASE_INT #define BASE_USHORT #include "templates_on.h" #include "mad_source.c" #include "templates_off.h" #undef BASE_USHORT #define BASE_SHORT #include "templates_on.h" #include "mad_source.c" #include "templates_off.h" #undef BASE_SHORT #define BASE_UCHAR #include "templates_on.h" #include "mad_source.c" #include "templates_off.h" #undef BASE_UCHAR #define BASE_CHAR #include "templates_on.h" #include "mad_source.c" #include "templates_off.h" #undef BASE_CHAR gsl-2.7.1/statistics/median.c0000644016036000116100000000253213135126237013026 00000000000000#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-2.7.1/statistics/covariance.c0000644016036000116100000000515213373111456013705 00000000000000#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-2.7.1/statistics/quantiles.c0000644016036000116100000000257313135126237013603 00000000000000#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-2.7.1/statistics/select.c0000644016036000116100000000261713373111456013055 00000000000000#include #include #include #include #define BASE_LONG_DOUBLE #include "templates_on.h" #include "select_source.c" #include "templates_off.h" #undef BASE_LONG_DOUBLE #define BASE_DOUBLE #include "templates_on.h" #include "select_source.c" #include "templates_off.h" #undef BASE_DOUBLE #define BASE_FLOAT #include "templates_on.h" #include "select_source.c" #include "templates_off.h" #undef BASE_FLOAT #define BASE_ULONG #include "templates_on.h" #include "select_source.c" #include "templates_off.h" #undef BASE_ULONG #define BASE_LONG #include "templates_on.h" #include "select_source.c" #include "templates_off.h" #undef BASE_LONG #define BASE_UINT #include "templates_on.h" #include "select_source.c" #include "templates_off.h" #undef BASE_UINT #define BASE_INT #include "templates_on.h" #include "select_source.c" #include "templates_off.h" #undef BASE_INT #define BASE_USHORT #include "templates_on.h" #include "select_source.c" #include "templates_off.h" #undef BASE_USHORT #define BASE_SHORT #include "templates_on.h" #include "select_source.c" #include "templates_off.h" #undef BASE_SHORT #define BASE_UCHAR #include "templates_on.h" #include "select_source.c" #include "templates_off.h" #undef BASE_UCHAR #define BASE_CHAR #include "templates_on.h" #include "select_source.c" #include "templates_off.h" #undef BASE_CHAR gsl-2.7.1/statistics/Sn.c0000644016036000116100000000254213373111456012153 00000000000000#include #include #include #include #define BASE_LONG_DOUBLE #include "templates_on.h" #include "Sn_source.c" #include "templates_off.h" #undef BASE_LONG_DOUBLE #define BASE_DOUBLE #include "templates_on.h" #include "Sn_source.c" #include "templates_off.h" #undef BASE_DOUBLE #define BASE_FLOAT #include "templates_on.h" #include "Sn_source.c" #include "templates_off.h" #undef BASE_FLOAT #define BASE_ULONG #include "templates_on.h" #include "Sn_source.c" #include "templates_off.h" #undef BASE_ULONG #define BASE_LONG #include "templates_on.h" #include "Sn_source.c" #include "templates_off.h" #undef BASE_LONG #define BASE_UINT #include "templates_on.h" #include "Sn_source.c" #include "templates_off.h" #undef BASE_UINT #define BASE_INT #include "templates_on.h" #include "Sn_source.c" #include "templates_off.h" #undef BASE_INT #define BASE_USHORT #include "templates_on.h" #include "Sn_source.c" #include "templates_off.h" #undef BASE_USHORT #define BASE_SHORT #include "templates_on.h" #include "Sn_source.c" #include "templates_off.h" #undef BASE_SHORT #define BASE_UCHAR #include "templates_on.h" #include "Sn_source.c" #include "templates_off.h" #undef BASE_UCHAR #define BASE_CHAR #include "templates_on.h" #include "Sn_source.c" #include "templates_off.h" #undef BASE_CHAR gsl-2.7.1/statistics/Qn.c0000644016036000116100000000254213373111456012151 00000000000000#include #include #include #include #define BASE_LONG_DOUBLE #include "templates_on.h" #include "Qn_source.c" #include "templates_off.h" #undef BASE_LONG_DOUBLE #define BASE_DOUBLE #include "templates_on.h" #include "Qn_source.c" #include "templates_off.h" #undef BASE_DOUBLE #define BASE_FLOAT #include "templates_on.h" #include "Qn_source.c" #include "templates_off.h" #undef BASE_FLOAT #define BASE_ULONG #include "templates_on.h" #include "Qn_source.c" #include "templates_off.h" #undef BASE_ULONG #define BASE_LONG #include "templates_on.h" #include "Qn_source.c" #include "templates_off.h" #undef BASE_LONG #define BASE_UINT #include "templates_on.h" #include "Qn_source.c" #include "templates_off.h" #undef BASE_UINT #define BASE_INT #include "templates_on.h" #include "Qn_source.c" #include "templates_off.h" #undef BASE_INT #define BASE_USHORT #include "templates_on.h" #include "Qn_source.c" #include "templates_off.h" #undef BASE_USHORT #define BASE_SHORT #include "templates_on.h" #include "Qn_source.c" #include "templates_off.h" #undef BASE_SHORT #define BASE_UCHAR #include "templates_on.h" #include "Qn_source.c" #include "templates_off.h" #undef BASE_UCHAR #define BASE_CHAR #include "templates_on.h" #include "Qn_source.c" #include "templates_off.h" #undef BASE_CHAR gsl-2.7.1/statistics/gastwirth.c0000644016036000116100000000257313373111456013613 00000000000000#include #include #define BASE_LONG_DOUBLE #include "templates_on.h" #include "gastwirth_source.c" #include "templates_off.h" #undef BASE_LONG_DOUBLE #define BASE_DOUBLE #include "templates_on.h" #include "gastwirth_source.c" #include "templates_off.h" #undef BASE_DOUBLE #define BASE_FLOAT #include "templates_on.h" #include "gastwirth_source.c" #include "templates_off.h" #undef BASE_FLOAT #define BASE_ULONG #include "templates_on.h" #include "gastwirth_source.c" #include "templates_off.h" #undef BASE_ULONG #define BASE_LONG #include "templates_on.h" #include "gastwirth_source.c" #include "templates_off.h" #undef BASE_LONG #define BASE_UINT #include "templates_on.h" #include "gastwirth_source.c" #include "templates_off.h" #undef BASE_UINT #define BASE_INT #include "templates_on.h" #include "gastwirth_source.c" #include "templates_off.h" #undef BASE_INT #define BASE_USHORT #include "templates_on.h" #include "gastwirth_source.c" #include "templates_off.h" #undef BASE_USHORT #define BASE_SHORT #include "templates_on.h" #include "gastwirth_source.c" #include "templates_off.h" #undef BASE_SHORT #define BASE_UCHAR #include "templates_on.h" #include "gastwirth_source.c" #include "templates_off.h" #undef BASE_UCHAR #define BASE_CHAR #include "templates_on.h" #include "gastwirth_source.c" #include "templates_off.h" #undef BASE_CHAR gsl-2.7.1/statistics/trmean.c0000644016036000116100000000256313373111456013064 00000000000000#include #include #include #define BASE_LONG_DOUBLE #include "templates_on.h" #include "trmean_source.c" #include "templates_off.h" #undef BASE_LONG_DOUBLE #define BASE_DOUBLE #include "templates_on.h" #include "trmean_source.c" #include "templates_off.h" #undef BASE_DOUBLE #define BASE_FLOAT #include "templates_on.h" #include "trmean_source.c" #include "templates_off.h" #undef BASE_FLOAT #define BASE_ULONG #include "templates_on.h" #include "trmean_source.c" #include "templates_off.h" #undef BASE_ULONG #define BASE_LONG #include "templates_on.h" #include "trmean_source.c" #include "templates_off.h" #undef BASE_LONG #define BASE_UINT #include "templates_on.h" #include "trmean_source.c" #include "templates_off.h" #undef BASE_UINT #define BASE_INT #include "templates_on.h" #include "trmean_source.c" #include "templates_off.h" #undef BASE_INT #define BASE_USHORT #include "templates_on.h" #include "trmean_source.c" #include "templates_off.h" #undef BASE_USHORT #define BASE_SHORT #include "templates_on.h" #include "trmean_source.c" #include "templates_off.h" #undef BASE_SHORT #define BASE_UCHAR #include "templates_on.h" #include "trmean_source.c" #include "templates_off.h" #undef BASE_UCHAR #define BASE_CHAR #include "templates_on.h" #include "trmean_source.c" #include "templates_off.h" #undef BASE_CHAR gsl-2.7.1/statistics/wmean.c0000644016036000116100000000064513135126237012703 00000000000000#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-2.7.1/statistics/wvariance.c0000644016036000116100000000070213135126237013545 00000000000000#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-2.7.1/statistics/wabsdev.c0000644016036000116100000000067413135126237013231 00000000000000#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-2.7.1/statistics/wskew.c0000644016036000116100000000066713135126237012740 00000000000000#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-2.7.1/statistics/wkurtosis.c0000644016036000116100000000070213135126237013640 00000000000000#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-2.7.1/statistics/test.c0000644016036000116100000000600613373111456012551 00000000000000/* 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); int test_robust (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(); test_robust(); exit (gsl_test_summary ()); } gsl-2.7.1/statistics/test_nist.c0000644016036000116100000006357213373111456013621 00000000000000/* 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); 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-2.7.1/statistics/test_robust.c0000644016036000116100000001334713373111456014155 00000000000000/* statistics/test_robust.c * * Copyright (C) 2018 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 int test_robust (void); /* random vector in [-1,1] */ static int random_array(const size_t n, double * x, gsl_rng * r) { size_t i; for (i = 0; i < n; ++i) x[i] = 2.0 * gsl_rng_uniform(r) - 1.0; return 0; } /* calculate MAD statistic for input vector using slow/naive algorithm */ static double slow_MAD(const size_t n, const double x[]) { double *work = malloc(n * sizeof(double)); double median, mad; size_t i; for (i = 0; i < n; ++i) work[i] = x[i]; gsl_sort(work, 1, n); median = gsl_stats_median_from_sorted_data(work, 1, n); for (i = 0; i < n; ++i) work[i] = fabs(x[i] - median); gsl_sort(work, 1, n); mad = gsl_stats_median_from_sorted_data(work, 1, n); free(work); return mad; } /* calculate S_n statistic for input vector using slow/naive algorithm */ static double slow_Sn0(const size_t n, const double x[]) { double *work1 = malloc(n * sizeof(double)); double *work2 = malloc(n * sizeof(double)); double Sn; size_t i, j; for (i = 0; i < n; ++i) { for (j = 0; j < n; ++j) work1[j] = fabs(x[i] - x[j]); /* find himed_j | x_i - x_j | */ gsl_sort(work1, 1, n); work2[i] = work1[n / 2]; } /* find lomed_i { himed_j | x_i - x_j | } */ gsl_sort(work2, 1, n); Sn = work2[(n + 1) / 2 - 1]; free(work1); free(work2); return Sn; } /* calculate Q_n statistic for input vector using slow/naive algorithm */ static double slow_Qn0(const size_t n, const double x[]) { const size_t wsize = n * (n - 1) / 2; const size_t n_2 = n / 2; const size_t k = ((n_2 + 1) * n_2) / 2; double *work; double Qn; size_t idx = 0; size_t i, j; if (n < 2) return (0.0); work = malloc(wsize * sizeof(double)); for (i = 0; i < n; ++i) { for (j = i + 1; j < n; ++j) work[idx++] = fabs(x[i] - x[j]); } gsl_sort(work, 1, idx); Qn = work[k - 1]; free(work); return Qn; } static int test_median(const double tol, const size_t n, gsl_rng * r) { double * x = malloc(n * sizeof(double)); double median1, median2; random_array(n, x, r); median1 = gsl_stats_median(x, 1, n); gsl_sort(x, 1, n); median2 = gsl_stats_median_from_sorted_data(x, 1, n); gsl_test_rel(median1, median2, tol, "test_median n=%zu", n); free(x); return 0; } static int test_mad(const double tol, const size_t n, gsl_rng * r) { double * x = malloc(n * sizeof(double)); double * work = malloc(n * sizeof(double)); double mad1, mad2; random_array(n, x, r); mad1 = slow_MAD(n, x); gsl_sort(x, 1, n); mad2 = gsl_stats_mad0(x, 1, n, work); gsl_test_rel(mad1, mad2, tol, "test_mad n=%zu", n); free(x); free(work); return 0; } static int test_Sn(const double tol, const size_t n, gsl_rng * r) { double * x = malloc(n * sizeof(double)); double * work = malloc(n * sizeof(double)); double Sn1, Sn2; random_array(n, x, r); /* compute S_n with slow/naive algorithm */ Sn1 = slow_Sn0(n, x); /* compute S_n with efficient algorithm */ gsl_sort(x, 1, n); Sn2 = gsl_stats_Sn0_from_sorted_data(x, 1, n, work); gsl_test_rel(Sn2, Sn1, tol, "test_Sn n=%zu", n); free(x); free(work); return 0; } static int test_Qn(const double tol, const size_t n, gsl_rng * r) { double * x = malloc(n * sizeof(double)); double * work = malloc(3 * n * sizeof(double)); int * work_int = malloc(5 * n * sizeof(int)); double Qn1, Qn2; random_array(n, x, r); /* compute Q_n with slow/naive algorithm */ Qn1 = slow_Qn0(n, x); /* compute Q_n with efficient algorithm */ gsl_sort(x, 1, n); Qn2 = gsl_stats_Qn0_from_sorted_data(x, 1, n, work, work_int); gsl_test_rel(Qn2, Qn1, tol, "test_Qn n=%zu", n); free(x); free(work); free(work_int); return 0; } int test_robust (void) { const double tol = 1.0e-12; gsl_rng * r = gsl_rng_alloc(gsl_rng_default); test_median(GSL_DBL_EPSILON, 1, r); test_median(GSL_DBL_EPSILON, 2, r); test_median(GSL_DBL_EPSILON, 3, r); test_median(GSL_DBL_EPSILON, 100, r); test_median(GSL_DBL_EPSILON, 101, r); test_median(GSL_DBL_EPSILON, 500, r); test_median(GSL_DBL_EPSILON, 501, r); test_mad(GSL_DBL_EPSILON, 1, r); test_mad(GSL_DBL_EPSILON, 2, r); test_mad(GSL_DBL_EPSILON, 3, r); test_mad(GSL_DBL_EPSILON, 100, r); test_mad(GSL_DBL_EPSILON, 101, r); test_mad(GSL_DBL_EPSILON, 500, r); test_mad(GSL_DBL_EPSILON, 501, r); test_Sn(tol, 1, r); test_Sn(tol, 2, r); test_Sn(tol, 3, r); test_Sn(tol, 100, r); test_Sn(tol, 101, r); test_Sn(tol, 500, r); test_Sn(tol, 501, r); test_Qn(tol, 1, r); test_Qn(tol, 2, r); test_Qn(tol, 3, r); test_Qn(tol, 4, r); test_Qn(tol, 5, r); test_Qn(tol, 100, r); test_Qn(tol, 101, r); test_Qn(tol, 500, r); test_Qn(tol, 501, r); gsl_rng_free(r); return 0; } gsl-2.7.1/siman/0000755016036000116100000000000014151602576010424 500000000000000gsl-2.7.1/siman/Makefile.am0000644016036000116100000000127513373111456012402 00000000000000## 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-2.7.1/siman/gsl_siman.h0000644016036000116100000000571213135126237012472 00000000000000/* 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-2.7.1/siman/Makefile.in0000644016036000116100000010756614151557215012427 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) 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 = 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/siman.Plo ./$(DEPDIR)/siman_tsp.Po \ ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/siman_tsp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(PROGRAMS) $(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 clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/siman.Plo -rm -f ./$(DEPDIR)/siman_tsp.Po -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/siman.Plo -rm -f ./$(DEPDIR)/siman_tsp.Po -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/siman/ChangeLog0000644016036000116100000001105713373111456012117 000000000000002008-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-2.7.1/siman/TODO0000644016036000116100000000050713373111456011033 00000000000000# -*- 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-2.7.1/siman/siman.c0000644016036000116100000001772713135126237011631 00000000000000/* 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-2.7.1/siman/siman_tsp.c0000644016036000116100000002242313135126237012504 00000000000000/* 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-2.7.1/siman/test.c0000644016036000116100000001122713135126237011466 00000000000000/* 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-2.7.1/siman/siman_test_driver.sh0000755016036000116100000000107613135126237014424 00000000000000#! /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-2.7.1/sum/0000755016036000116100000000000014151602576010121 500000000000000gsl-2.7.1/sum/Makefile.am0000644016036000116100000000060513373111456012073 00000000000000noinst_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-2.7.1/sum/gsl_sum.h0000644016036000116100000001253413135126237011664 00000000000000/* 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-2.7.1/sum/Makefile.in0000644016036000116100000010615114151557215012111 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/levin_u.Plo \ ./$(DEPDIR)/levin_utrunc.Plo ./$(DEPDIR)/test.Po \ ./$(DEPDIR)/work_u.Plo ./$(DEPDIR)/work_utrunc.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/levin_utrunc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/work_u.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/work_utrunc.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/levin_u.Plo -rm -f ./$(DEPDIR)/levin_utrunc.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/work_u.Plo -rm -f ./$(DEPDIR)/work_utrunc.Plo -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 -f ./$(DEPDIR)/levin_u.Plo -rm -f ./$(DEPDIR)/levin_utrunc.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/work_u.Plo -rm -f ./$(DEPDIR)/work_utrunc.Plo -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/sum/ChangeLog0000644016036000116100000000673513373111456011623 000000000000002009-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-2.7.1/sum/levin_u.c0000644016036000116100000001617513373111456011655 00000000000000/* 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-2.7.1/sum/levin_utrunc.c0000644016036000116100000001355013135126237012722 00000000000000/* 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-2.7.1/sum/work_u.c0000644016036000116100000000413713373111456011515 00000000000000#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-2.7.1/sum/work_utrunc.c0000644016036000116100000000272713373111456012574 00000000000000#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-2.7.1/sum/test.c0000644016036000116100000001225113373111456011162 00000000000000/* 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-2.7.1/integration/0000755016036000116100000000000014151602577011641 500000000000000gsl-2.7.1/integration/Makefile.am0000644016036000116100000000161114151556700013610 00000000000000noinst_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 fixed.c chebyshev.c chebyshev2.c legendre.c hermite.c laguerre.c gegenbauer.c jacobi.c exponential.c rational.c romberg.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 ../specfunc/libgslspecfunc.la ../complex/libgslcomplex.la ../poly/libgslpoly.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la gsl-2.7.1/integration/qpsrt.c0000644016036000116100000000545613135126237013103 00000000000000/* 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-2.7.1/integration/qpsrt2.c0000644016036000116100000000371213135126237013156 00000000000000/* 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-2.7.1/integration/qelg.c0000644016036000116100000001311613135126237012652 00000000000000/* 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-2.7.1/integration/qc25c.c0000644016036000116100000000606013135126237012637 00000000000000/* 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-2.7.1/integration/qc25s.c0000644016036000116100000001332713135126237012663 00000000000000/* 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-2.7.1/integration/qc25f.c0000644016036000116100000001035113135126237012640 00000000000000/* 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-2.7.1/integration/ptsort.c0000644016036000116100000000306213135126237013254 00000000000000/* 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-2.7.1/integration/util.c0000644016036000116100000000714013135126237012677 00000000000000/* 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-2.7.1/integration/err.c0000644016036000116100000000315013135126237012507 00000000000000/* 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-2.7.1/integration/positivity.c0000644016036000116100000000054213135126237014144 00000000000000/* 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-2.7.1/integration/append.c0000644016036000116100000000233513135126237013172 00000000000000/* 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-2.7.1/integration/initialise.c0000644016036000116100000000240313135126237014051 00000000000000/* 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-2.7.1/integration/set_initial.c0000644016036000116100000000054613135126237014231 00000000000000static 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-2.7.1/integration/reset.c0000644016036000116100000000032313135126237013040 00000000000000static 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-2.7.1/integration/cquad_const.c0000644016036000116100000022571413373111455014236 00000000000000/* 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-2.7.1/integration/gsl_integration.h0000644016036000116100000003303714151556700015124 00000000000000/* 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); /* Romberg integration workspace and routines */ typedef struct { size_t n; /* maximum number of steps */ double *work1; /* workspace for a row of R matrix, size n */ double *work2; /* workspace for a row of R matrix, size n */ } gsl_integration_romberg_workspace; gsl_integration_romberg_workspace *gsl_integration_romberg_alloc(const size_t n); void gsl_integration_romberg_free(gsl_integration_romberg_workspace * w); int gsl_integration_romberg(const gsl_function * f, const double a, const double b, const double epsabs, const double epsrel, double * result, size_t * neval, gsl_integration_romberg_workspace * w); /* IQPACK related structures and routines */ typedef struct { double alpha; double beta; double a; double b; double zemu; double shft; double slp; double al; double be; } gsl_integration_fixed_params; typedef struct { int (*check)(const size_t n, const gsl_integration_fixed_params * params); int (*init)(const size_t n, double * diag, double * subdiag, gsl_integration_fixed_params * params); } gsl_integration_fixed_type; typedef struct { size_t n; /* number of nodes/weights */ double *weights; /* quadrature weights */ double *x; /* quadrature nodes */ double *diag; /* diagonal of Jacobi matrix */ double *subdiag; /* subdiagonal of Jacobi matrix */ const gsl_integration_fixed_type * type; } gsl_integration_fixed_workspace; /* IQPACK integral types */ GSL_VAR const gsl_integration_fixed_type * gsl_integration_fixed_legendre; GSL_VAR const gsl_integration_fixed_type * gsl_integration_fixed_chebyshev; GSL_VAR const gsl_integration_fixed_type * gsl_integration_fixed_gegenbauer; GSL_VAR const gsl_integration_fixed_type * gsl_integration_fixed_jacobi; GSL_VAR const gsl_integration_fixed_type * gsl_integration_fixed_laguerre; GSL_VAR const gsl_integration_fixed_type * gsl_integration_fixed_hermite; GSL_VAR const gsl_integration_fixed_type * gsl_integration_fixed_exponential; GSL_VAR const gsl_integration_fixed_type * gsl_integration_fixed_rational; GSL_VAR const gsl_integration_fixed_type * gsl_integration_fixed_chebyshev2; gsl_integration_fixed_workspace * gsl_integration_fixed_alloc(const gsl_integration_fixed_type * type, const size_t n, const double a, const double b, const double alpha, const double beta); void gsl_integration_fixed_free(gsl_integration_fixed_workspace * w); size_t gsl_integration_fixed_n(const gsl_integration_fixed_workspace * w); double *gsl_integration_fixed_nodes(const gsl_integration_fixed_workspace * w); double *gsl_integration_fixed_weights(const gsl_integration_fixed_workspace * w); int gsl_integration_fixed(const gsl_function * func, double * result, const gsl_integration_fixed_workspace * w); __END_DECLS #endif /* __GSL_INTEGRATION_H__ */ gsl-2.7.1/integration/Makefile.in0000644016036000116100000012213714151557214013631 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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 fixed.lo chebyshev.lo \ chebyshev2.lo legendre.lo hermite.lo laguerre.lo gegenbauer.lo \ jacobi.lo exponential.lo rational.lo romberg.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 ../specfunc/libgslspecfunc.la \ ../complex/libgslcomplex.la ../poly/libgslpoly.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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/chebyshev.Plo \ ./$(DEPDIR)/chebyshev2.Plo ./$(DEPDIR)/cquad.Plo \ ./$(DEPDIR)/exponential.Plo ./$(DEPDIR)/fixed.Plo \ ./$(DEPDIR)/gegenbauer.Plo ./$(DEPDIR)/glfixed.Plo \ ./$(DEPDIR)/hermite.Plo ./$(DEPDIR)/jacobi.Plo \ ./$(DEPDIR)/laguerre.Plo ./$(DEPDIR)/legendre.Plo \ ./$(DEPDIR)/qag.Plo ./$(DEPDIR)/qagp.Plo ./$(DEPDIR)/qags.Plo \ ./$(DEPDIR)/qawc.Plo ./$(DEPDIR)/qawf.Plo ./$(DEPDIR)/qawo.Plo \ ./$(DEPDIR)/qaws.Plo ./$(DEPDIR)/qcheb.Plo ./$(DEPDIR)/qk.Plo \ ./$(DEPDIR)/qk15.Plo ./$(DEPDIR)/qk21.Plo ./$(DEPDIR)/qk31.Plo \ ./$(DEPDIR)/qk41.Plo ./$(DEPDIR)/qk51.Plo ./$(DEPDIR)/qk61.Plo \ ./$(DEPDIR)/qmomo.Plo ./$(DEPDIR)/qmomof.Plo \ ./$(DEPDIR)/qng.Plo ./$(DEPDIR)/rational.Plo \ ./$(DEPDIR)/romberg.Plo ./$(DEPDIR)/test.Po \ ./$(DEPDIR)/tests.Po ./$(DEPDIR)/workspace.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 fixed.c chebyshev.c chebyshev2.c legendre.c hermite.c laguerre.c gegenbauer.c jacobi.c exponential.c rational.c romberg.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 ../specfunc/libgslspecfunc.la ../complex/libgslcomplex.la ../poly/libgslpoly.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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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)/chebyshev.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chebyshev2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cquad.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exponential.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fixed.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gegenbauer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glfixed.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hermite.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jacobi.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/laguerre.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legendre.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qag.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qagp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qags.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qawc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qawf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qawo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qaws.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qcheb.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk15.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk21.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk31.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk41.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk51.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk61.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qmomo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qmomof.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qng.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rational.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/romberg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tests.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/workspace.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/chebyshev.Plo -rm -f ./$(DEPDIR)/chebyshev2.Plo -rm -f ./$(DEPDIR)/cquad.Plo -rm -f ./$(DEPDIR)/exponential.Plo -rm -f ./$(DEPDIR)/fixed.Plo -rm -f ./$(DEPDIR)/gegenbauer.Plo -rm -f ./$(DEPDIR)/glfixed.Plo -rm -f ./$(DEPDIR)/hermite.Plo -rm -f ./$(DEPDIR)/jacobi.Plo -rm -f ./$(DEPDIR)/laguerre.Plo -rm -f ./$(DEPDIR)/legendre.Plo -rm -f ./$(DEPDIR)/qag.Plo -rm -f ./$(DEPDIR)/qagp.Plo -rm -f ./$(DEPDIR)/qags.Plo -rm -f ./$(DEPDIR)/qawc.Plo -rm -f ./$(DEPDIR)/qawf.Plo -rm -f ./$(DEPDIR)/qawo.Plo -rm -f ./$(DEPDIR)/qaws.Plo -rm -f ./$(DEPDIR)/qcheb.Plo -rm -f ./$(DEPDIR)/qk.Plo -rm -f ./$(DEPDIR)/qk15.Plo -rm -f ./$(DEPDIR)/qk21.Plo -rm -f ./$(DEPDIR)/qk31.Plo -rm -f ./$(DEPDIR)/qk41.Plo -rm -f ./$(DEPDIR)/qk51.Plo -rm -f ./$(DEPDIR)/qk61.Plo -rm -f ./$(DEPDIR)/qmomo.Plo -rm -f ./$(DEPDIR)/qmomof.Plo -rm -f ./$(DEPDIR)/qng.Plo -rm -f ./$(DEPDIR)/rational.Plo -rm -f ./$(DEPDIR)/romberg.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/tests.Po -rm -f ./$(DEPDIR)/workspace.Plo -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 -f ./$(DEPDIR)/chebyshev.Plo -rm -f ./$(DEPDIR)/chebyshev2.Plo -rm -f ./$(DEPDIR)/cquad.Plo -rm -f ./$(DEPDIR)/exponential.Plo -rm -f ./$(DEPDIR)/fixed.Plo -rm -f ./$(DEPDIR)/gegenbauer.Plo -rm -f ./$(DEPDIR)/glfixed.Plo -rm -f ./$(DEPDIR)/hermite.Plo -rm -f ./$(DEPDIR)/jacobi.Plo -rm -f ./$(DEPDIR)/laguerre.Plo -rm -f ./$(DEPDIR)/legendre.Plo -rm -f ./$(DEPDIR)/qag.Plo -rm -f ./$(DEPDIR)/qagp.Plo -rm -f ./$(DEPDIR)/qags.Plo -rm -f ./$(DEPDIR)/qawc.Plo -rm -f ./$(DEPDIR)/qawf.Plo -rm -f ./$(DEPDIR)/qawo.Plo -rm -f ./$(DEPDIR)/qaws.Plo -rm -f ./$(DEPDIR)/qcheb.Plo -rm -f ./$(DEPDIR)/qk.Plo -rm -f ./$(DEPDIR)/qk15.Plo -rm -f ./$(DEPDIR)/qk21.Plo -rm -f ./$(DEPDIR)/qk31.Plo -rm -f ./$(DEPDIR)/qk41.Plo -rm -f ./$(DEPDIR)/qk51.Plo -rm -f ./$(DEPDIR)/qk61.Plo -rm -f ./$(DEPDIR)/qmomo.Plo -rm -f ./$(DEPDIR)/qmomof.Plo -rm -f ./$(DEPDIR)/qng.Plo -rm -f ./$(DEPDIR)/rational.Plo -rm -f ./$(DEPDIR)/romberg.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/tests.Po -rm -f ./$(DEPDIR)/workspace.Plo -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/integration/ChangeLog0000644016036000116100000001265313373111455013335 000000000000002012-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-2.7.1/integration/TODO0000644016036000116100000000232513373111455012246 00000000000000# -*- 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. * Someone to volunteer to port IQPACK, the Hermite quadrature has already been ported * 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-2.7.1/integration/qk15.c0000644016036000116100000000465013135126237012506 00000000000000/* 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-2.7.1/integration/qk21.c0000644016036000116100000000533713135126237012506 00000000000000/* 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-2.7.1/integration/qk31.c0000644016036000116100000000627113135126237012505 00000000000000/* 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-2.7.1/integration/qk41.c0000644016036000116100000000725613373111455012512 00000000000000/* 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-2.7.1/integration/qk51.c0000644016036000116100000001034513135126237012504 00000000000000/* 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-2.7.1/integration/qk61.c0000644016036000116100000001117413135126237012506 00000000000000/* 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-2.7.1/integration/qk.c0000644016036000116100000000622413373111455012337 00000000000000/* 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-2.7.1/integration/qng.c0000644016036000116100000001236513373111455012514 00000000000000/* 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-2.7.1/integration/qng.h0000644016036000116100000001543513135126237012522 00000000000000/* 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-2.7.1/integration/qag.c0000644016036000116100000001541713373111455012500 00000000000000/* 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-2.7.1/integration/qags.c0000644016036000116100000003254013373111455012657 00000000000000/* 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-2.7.1/integration/qagp.c0000644016036000116100000002706613373111455012663 00000000000000/* 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-2.7.1/integration/workspace.c0000644016036000116100000000744413373111455013727 00000000000000/* 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-2.7.1/integration/qcheb.c0000644016036000116100000001341313135126237013004 00000000000000/* 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-2.7.1/integration/qawc.c0000644016036000116100000001273113373111455012657 00000000000000/* 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-2.7.1/integration/qmomo.c0000644016036000116100000001043313373111455013051 00000000000000/* 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-2.7.1/integration/qaws.c0000644016036000116100000001323713373111455012701 00000000000000/* 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-2.7.1/integration/qmomof.c0000644016036000116100000002144113373111455013220 00000000000000/* 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-2.7.1/integration/qawo.c0000644016036000116100000002510713373111455012674 00000000000000/* 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-2.7.1/integration/qawf.c0000644016036000116100000001423113135126237012657 00000000000000/* 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-2.7.1/integration/glfixed.c0000644016036000116100000032023713373111455013351 00000000000000/* * 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 < (int) 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-2.7.1/integration/cquad.c0000644016036000116100000004001413533503772013021 00000000000000/* 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-2.7.1/integration/fixed.c0000644016036000116100000002154613373111455013027 00000000000000/* integration/fixed.c * * Copyright (C) 2017 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. */ /* the code in this module performs fixed-point quadrature calculations for * integrands and is based on IQPACK */ #include #include #include #include #include static int fixed_compute(const double a, const double b, const double alpha, const double beta, gsl_integration_fixed_workspace * w); static int imtqlx ( const int n, double d[], double e[], double z[] ); gsl_integration_fixed_workspace * gsl_integration_fixed_alloc(const gsl_integration_fixed_type * type, const size_t n, const double a, const double b, const double alpha, const double beta) { int status; gsl_integration_fixed_workspace *w; /* check inputs */ if (n < 1) { GSL_ERROR_VAL ("workspace size n must be at least 1", GSL_EDOM, 0); } w = calloc(1, sizeof(gsl_integration_fixed_workspace)); if (w == NULL) { GSL_ERROR_VAL ("unable to allocate workspace", GSL_ENOMEM, 0); } w->weights = malloc(n * sizeof(double)); if (w->weights == NULL) { gsl_integration_fixed_free(w); GSL_ERROR_VAL ("unable to allocate weights", GSL_ENOMEM, 0); } w->x = malloc(n * sizeof(double)); if (w->x == NULL) { gsl_integration_fixed_free(w); GSL_ERROR_VAL ("unable to allocate x", GSL_ENOMEM, 0); } w->diag = malloc(n * sizeof(double)); if (w->diag == NULL) { gsl_integration_fixed_free(w); GSL_ERROR_VAL ("unable to allocate diag", GSL_ENOMEM, 0); } w->subdiag = malloc(n * sizeof(double)); if (w->subdiag == NULL) { gsl_integration_fixed_free(w); GSL_ERROR_VAL ("unable to allocate subdiag", GSL_ENOMEM, 0); } w->n = n; w->type = type; /* compute quadrature weights and nodes */ status = fixed_compute(a, b, alpha, beta, w); if (status) { gsl_integration_fixed_free(w); GSL_ERROR_VAL ("error in integration parameters", GSL_EDOM, 0); } return w; } void gsl_integration_fixed_free(gsl_integration_fixed_workspace * w) { if (w->weights) free(w->weights); if (w->x) free(w->x); if (w->diag) free(w->diag); if (w->subdiag) free(w->subdiag); free(w); } size_t gsl_integration_fixed_n(const gsl_integration_fixed_workspace * w) { return w->n; } double * gsl_integration_fixed_nodes(const gsl_integration_fixed_workspace * w) { return w->x; } double * gsl_integration_fixed_weights(const gsl_integration_fixed_workspace * w) { return w->weights; } int gsl_integration_fixed(const gsl_function * func, double * result, const gsl_integration_fixed_workspace * w) { const size_t n = w->n; size_t i; double sum = 0.0; for (i = 0; i < n; ++i) { double fi = GSL_FN_EVAL(func, w->x[i]); sum += w->weights[i] * fi; } *result = sum; return GSL_SUCCESS; } /* fixed_compute() Compute quadrature weights and nodes */ static int fixed_compute(const double a, const double b, const double alpha, const double beta, gsl_integration_fixed_workspace * w) { int s; const size_t n = w->n; gsl_integration_fixed_params params; size_t i; params.a = a; params.b = b; params.alpha = alpha; params.beta = beta; /* check input parameters */ s = (w->type->check)(n, ¶ms); if (s) return s; /* initialize Jacobi matrix */ s = (w->type->init)(n, w->diag, w->subdiag, ¶ms); if (s) return s; if (params.zemu <= 0.0) { GSL_ERROR("zeroth moment must be positive", GSL_EINVAL); } for ( i = 0; i < n; i++ ) { w->x[i] = w->diag[i]; } w->weights[0] = sqrt (params.zemu); for ( i = 1; i < n; i++ ) { w->weights[i] = 0.0; } /* diagonalize the Jacobi matrix */ s = imtqlx (n, w->x, w->subdiag, w->weights); if (s) return s; for (i = 0; i < n; i++) { w->weights[i] = w->weights[i] * w->weights[i]; } /* * The current weights and nodes are valid for a = 0, b = 1. * Now scale them for arbitrary a,b */ { double p = pow ( params.slp, params.al + params.be + 1.0 ); size_t k; for ( k = 0; k < n; k++ ) { w->x[k] = params.shft + params.slp * w->x[k]; w->weights[k] = w->weights[k] * p; } } return GSL_SUCCESS; } /******************************************************************************/ /* Purpose: IMTQLX diagonalizes a symmetric tridiagonal matrix. Discussion: This routine is a slightly modified version of the EISPACK routine to perform the implicit QL algorithm on a symmetric tridiagonal matrix. The authors thank the authors of EISPACK for permission to use this routine. It has been modified to produce the product Q' * Z, where Z is an input vector and Q is the orthogonal matrix diagonalizing the input matrix. The changes consist (essentially) of applying the orthogonal transformations directly to Z as they are generated. Licensing: This code is distributed under the GNU LGPL license. Modified: 11 January 2010 Author: Original FORTRAN77 version by Sylvan Elhay, Jaroslav Kautsky. C version by John Burkardt. Reference: Sylvan Elhay, Jaroslav Kautsky, Algorithm 655: IQPACK, FORTRAN Subroutines for the Weights of Interpolatory Quadrature, ACM Transactions on Mathematical Software, Volume 13, Number 4, December 1987, pages 399-415. Roger Martin, James Wilkinson, The Implicit QL Algorithm, Numerische Mathematik, Volume 12, Number 5, December 1968, pages 377-383. Parameters: Input, int N, the order of the matrix. Input/output, double D(N), the diagonal entries of the matrix. On output, the information in D has been overwritten. Input/output, double E(N), the subdiagonal entries of the matrix, in entries E(1) through E(N-1). On output, the information in E has been overwritten. Input/output, double Z(N). On input, a vector. On output, the value of Q' * Z, where Q is the matrix that diagonalizes the input symmetric tridiagonal matrix. */ static int imtqlx ( const int n, double d[], double e[], double z[] ) { double b; double c; double f; double g; int i; int ii; int itn = 30; int j; int k; int l; int m; int mml; double p; double r; double s; if ( n == 1 ) { return GSL_SUCCESS; } e[n-1] = 0.0; for ( l = 1; l <= n; l++ ) { j = 0; for ( ; ; ) { for ( m = l; m <= n; m++ ) { if ( m == n ) { break; } if ( fabs ( e[m-1] ) <= GSL_DBL_EPSILON * ( fabs ( d[m-1] ) + fabs ( d[m] ) ) ) { break; } } p = d[l-1]; if ( m == l ) { break; } if ( itn <= j ) { return GSL_EMAXITER; } j = j + 1; g = ( d[l] - p ) / ( 2.0 * e[l-1] ); r = sqrt ( g * g + 1.0 ); g = d[m-1] - p + e[l-1] / ( g + fabs ( r ) * GSL_SIGN ( g ) ); s = 1.0; c = 1.0; p = 0.0; mml = m - l; for ( ii = 1; ii <= mml; ii++ ) { i = m - ii; f = s * e[i-1]; b = c * e[i-1]; if ( fabs ( g ) <= fabs ( f ) ) { c = g / f; r = sqrt ( c * c + 1.0 ); e[i] = f * r; s = 1.0 / r; c = c * s; } else { s = f / g; r = sqrt ( s * s + 1.0 ); e[i] = g * r; c = 1.0 / r; s = s * c; } g = d[i] - p; r = ( d[i-1] - g ) * s + 2.0 * c * b; p = s * r; d[i] = g + p; g = c * r - b; f = z[i]; z[i] = s * z[i-1] + c * f; z[i-1] = c * z[i-1] - s * f; } d[l-1] = d[l-1] - p; e[l-1] = g; e[m-1] = 0.0; } } /* Sorting. */ for ( ii = 2; ii <= m; ii++ ) { i = ii - 1; k = i; p = d[i-1]; for ( j = ii; j <= n; j++ ) { if ( d[j-1] < p ) { k = j; p = d[j-1]; } } if ( k != i ) { d[k-1] = d[i-1]; d[i-1] = p; p = z[i-1]; z[i-1] = z[k-1]; z[k-1] = p; } } return GSL_SUCCESS; } gsl-2.7.1/integration/chebyshev.c0000644016036000116100000000430113373111455013676 00000000000000/* integration/chebyshev.c * * Copyright (C) 2017 Konrad Griessinger, 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. */ /* * The code in this module is based on IQPACK, specifically the LGPL * implementation found in HERMITE_RULE: * https://people.sc.fsu.edu/~jburkardt/c_src/hermite_rule/hermite_rule.html */ #include #include #include #include #include static int chebyshev_check(const size_t n, const gsl_integration_fixed_params * params) { (void) n; if (fabs(params->b - params->a) <= GSL_DBL_EPSILON) { GSL_ERROR("|b - a| too small", GSL_EDOM); } else if (params->a >= params->b) { GSL_ERROR("lower integration limit must be smaller than upper limit", GSL_EDOM); } else { return GSL_SUCCESS; } } static int chebyshev_init(const size_t n, double * diag, double * subdiag, gsl_integration_fixed_params * params) { size_t i; /* construct the diagonal and subdiagonal elements of Jacobi matrix */ diag[0] = 0.0; subdiag[0] = M_SQRT1_2; for (i = 1; i < n; i++) { diag[i] = 0.0; subdiag[i] = 0.5; } params->zemu = M_PI; params->shft = 0.5*(params->b + params->a); params->slp = 0.5*(params->b - params->a); params->al = -0.5; params->be = -0.5; return GSL_SUCCESS; } static const gsl_integration_fixed_type chebyshev_type = { chebyshev_check, chebyshev_init }; const gsl_integration_fixed_type *gsl_integration_fixed_chebyshev = &chebyshev_type; gsl-2.7.1/integration/chebyshev2.c0000644016036000116100000000423613373111455013767 00000000000000/* integration/chebyshev2.c * * Copyright (C) 2017 Konrad Griessinger, 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. */ /* * The code in this module is based on IQPACK, specifically the LGPL * implementation found in HERMITE_RULE: * https://people.sc.fsu.edu/~jburkardt/c_src/hermite_rule/hermite_rule.html */ #include #include #include #include #include static int chebyshev2_check(const size_t n, const gsl_integration_fixed_params * params) { (void) n; if (fabs(params->b - params->a) <= GSL_DBL_EPSILON) { GSL_ERROR("|b - a| too small", GSL_EDOM); } else if (params->a >= params->b) { GSL_ERROR("lower integration limit must be smaller than upper limit", GSL_EDOM); } else { return GSL_SUCCESS; } } static int chebyshev2_init(const size_t n, double * diag, double * subdiag, gsl_integration_fixed_params * params) { size_t i; /* construct the diagonal and subdiagonal elements of Jacobi matrix */ for (i = 0; i < n; i++) { diag[i] = 0.0; subdiag[i] = 0.5; } params->zemu = M_PI_2; params->shft = 0.5*(params->b + params->a); params->slp = 0.5*(params->b - params->a); params->al = 0.5; params->be = 0.5; return GSL_SUCCESS; } static const gsl_integration_fixed_type chebyshev2_type = { chebyshev2_check, chebyshev2_init }; const gsl_integration_fixed_type *gsl_integration_fixed_chebyshev2 = &chebyshev2_type; gsl-2.7.1/integration/legendre.c0000644016036000116100000000404513373111455013510 00000000000000/* integration/legendre.c * * Copyright (C) 2017 Konrad Griessinger, 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. */ /* * The code in this module is based on IQPACK, specifically the LGPL * implementation found in HERMITE_RULE: * https://people.sc.fsu.edu/~jburkardt/c_src/hermite_rule/hermite_rule.html */ #include #include #include #include #include static int legendre_check(const size_t n, const gsl_integration_fixed_params * params) { (void) n; if (fabs(params->b - params->a) <= GSL_DBL_EPSILON) { GSL_ERROR("|b - a| too small", GSL_EDOM); } else { return GSL_SUCCESS; } } static int legendre_init(const size_t n, double * diag, double * subdiag, gsl_integration_fixed_params * params) { size_t i; /* construct the diagonal and subdiagonal elements of Jacobi matrix */ for (i = 1; i <= n; i++) { diag[i-1] = 0.0; subdiag[i-1] = (double) i / sqrt(4.0*i*i-1.0); } params->zemu = 2.0; params->shft = 0.5*(params->b + params->a); params->slp = 0.5*(params->b - params->a); params->al = 0.0; params->be = 0.0; return GSL_SUCCESS; } static const gsl_integration_fixed_type legendre_type = { legendre_check, legendre_init }; const gsl_integration_fixed_type *gsl_integration_fixed_legendre = &legendre_type; gsl-2.7.1/integration/hermite.c0000644016036000116100000000416313373111455013361 00000000000000/* integration/hermite.c * * Copyright (C) 2017 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. */ /* * The code in this module is based on IQPACK, specifically the LGPL * implementation found in HERMITE_RULE: * https://people.sc.fsu.edu/~jburkardt/c_src/hermite_rule/hermite_rule.html */ #include #include #include #include #include static int hermite_check(const size_t n, const gsl_integration_fixed_params * params) { (void) n; if (params->b <= 0.0) { GSL_ERROR("b must be positive", GSL_EDOM); } else if (params->alpha <= -1.0) { GSL_ERROR("alpha must be > -1", GSL_EDOM); } else { return GSL_SUCCESS; } } static int hermite_init(const size_t n, double * diag, double * subdiag, gsl_integration_fixed_params * params) { size_t i; /* construct the diagonal and subdiagonal elements of Jacobi matrix */ for (i = 1; i <= n; i++) { diag[i - 1] = 0.0; subdiag[i - 1] = sqrt (0.5 * (i + params->alpha * (i % 2))); } params->zemu = gsl_sf_gamma(0.5 * (params->alpha + 1.0)); params->shft = params->a; params->slp = 1.0 / sqrt(params->b); params->al = params->alpha; params->be = 0.0; return GSL_SUCCESS; } static const gsl_integration_fixed_type hermite_type = { hermite_check, hermite_init }; const gsl_integration_fixed_type *gsl_integration_fixed_hermite = &hermite_type; gsl-2.7.1/integration/laguerre.c0000644016036000116100000000420013373111455013522 00000000000000/* integration/laguerre.c * * Copyright (C) 2017 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. */ /* * The code in this module is based on IQPACK, specifically the LGPL * implementation found in HERMITE_RULE: * https://people.sc.fsu.edu/~jburkardt/c_src/hermite_rule/hermite_rule.html */ #include #include #include #include #include static int laguerre_check(const size_t n, const gsl_integration_fixed_params * params) { (void) n; if (params->b <= 0.0) { GSL_ERROR("b must be positive", GSL_EDOM); } else if (params->alpha <= -1.0) { GSL_ERROR("alpha must be > -1", GSL_EDOM); } else { return GSL_SUCCESS; } } static int laguerre_init(const size_t n, double * diag, double * subdiag, gsl_integration_fixed_params * params) { size_t i; /* construct the diagonal and subdiagonal elements of Jacobi matrix */ for (i = 0; i < n; i++) { diag[i] = 2.0 * i + 1.0 + params->alpha; subdiag[i] = sqrt ((i + 1.0) * (params->alpha + i + 1.0)); } params->zemu = gsl_sf_gamma(params->alpha + 1.0); params->shft = params->a; params->slp = 1.0 / params->b; params->al = params->alpha; params->be = 0.0; return GSL_SUCCESS; } static const gsl_integration_fixed_type laguerre_type = { laguerre_check, laguerre_init }; const gsl_integration_fixed_type *gsl_integration_fixed_laguerre = &laguerre_type; gsl-2.7.1/integration/gegenbauer.c0000644016036000116100000000503013373111455014022 00000000000000/* integration/gegenbauer.c * * Copyright (C) 2017 Konrad Griessinger, 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. */ /* * The code in this module is based on IQPACK, specifically the LGPL * implementation found in HERMITE_RULE: * https://people.sc.fsu.edu/~jburkardt/c_src/hermite_rule/hermite_rule.html */ #include #include #include #include #include static int gegenbauer_check(const size_t n, const gsl_integration_fixed_params * params) { (void) n; if (fabs(params->b - params->a) <= GSL_DBL_EPSILON) { GSL_ERROR("|b - a| too small", GSL_EDOM); } else if (params->a >= params->b) { GSL_ERROR("lower integration limit must be smaller than upper limit", GSL_EDOM); } else if (params->alpha <= -1.0) { GSL_ERROR("alpha must be > -1", GSL_EDOM); } else { return GSL_SUCCESS; } } static int gegenbauer_init(const size_t n, double * diag, double * subdiag, gsl_integration_fixed_params * params) { size_t i; /* construct the diagonal and subdiagonal elements of Jacobi matrix */ diag[0] = 0.0; subdiag[0] = sqrt ( 1.0 / (2.0*params->alpha + 3.0) ); for (i = 1; i < n; i++) { diag[i] = 0.0; subdiag[i] = sqrt ( (i + 1.0) * (2.0*params->alpha + i + 1.0) / ( 4.0*(params->alpha + i + 1.0)*(params->alpha + i + 1.0) - 1.0 ) ); } params->zemu = M_SQRTPI * gsl_sf_gamma(params->alpha + 1.0) / gsl_sf_gamma(params->alpha + 1.5); params->shft = 0.5*(params->b + params->a); params->slp = 0.5*(params->b - params->a); params->al = params->alpha; params->be = params->alpha; return GSL_SUCCESS; } static const gsl_integration_fixed_type gegenbauer_type = { gegenbauer_check, gegenbauer_init }; const gsl_integration_fixed_type *gsl_integration_fixed_gegenbauer = &gegenbauer_type; gsl-2.7.1/integration/jacobi.c0000644016036000116100000000560113373111455013151 00000000000000/* integration/jacobi.c * * Copyright (C) 2017 Konrad Griessinger, 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. */ /* * The code in this module is based on IQPACK, specifically the LGPL * implementation found in HERMITE_RULE: * https://people.sc.fsu.edu/~jburkardt/c_src/hermite_rule/hermite_rule.html */ #include #include #include #include #include static int jacobi_check(const size_t n, const gsl_integration_fixed_params * params) { (void) n; if (fabs(params->b - params->a) <= GSL_DBL_EPSILON) { GSL_ERROR("|b - a| too small", GSL_EDOM); } else if (params->a >= params->b) { GSL_ERROR("lower integration limit must be smaller than upper limit", GSL_EDOM); } else if (params->alpha <= -1.0 || params->beta <= -1.0) { GSL_ERROR("alpha and beta must be > -1", GSL_EDOM); } else { return GSL_SUCCESS; } } static int jacobi_init(const size_t n, double * diag, double * subdiag, gsl_integration_fixed_params * params) { const double absum = params->beta + params->alpha; const double abdiff = params->beta - params->alpha; const double a2b2 = absum * abdiff; /* beta^2 - alpha^2 */ size_t i; /* construct the diagonal and subdiagonal elements of Jacobi matrix */ diag[0] = abdiff/(absum + 2.0); subdiag[0] = 2.0*sqrt((params->alpha + 1.0)*(params->beta + 1.0)/(absum + 3.0))/(absum + 2.0); for (i = 1; i < n; i++) { diag[i] = a2b2 / ( (absum + 2.0*i) * (absum + 2.0*i + 2.0) ); subdiag[i] = sqrt ( 4.0*(i + 1.0) * (params->alpha + i + 1.0) * (params->beta + i + 1.0) * (absum + i + 1.0) / ( pow((absum + 2.0*i + 2.0), 2.0) - 1.0 ) ) / ( absum + 2.0*i + 2.0 ); } params->zemu = pow(2.0, absum + 1.0) * gsl_sf_gamma(params->alpha + 1.0) * gsl_sf_gamma(params->beta + 1.0) / gsl_sf_gamma(absum + 2.0); params->shft = 0.5*(params->b + params->a); params->slp = 0.5*(params->b - params->a); params->al = params->alpha; params->be = params->beta; return GSL_SUCCESS; } static const gsl_integration_fixed_type jacobi_type = { jacobi_check, jacobi_init }; const gsl_integration_fixed_type *gsl_integration_fixed_jacobi = &jacobi_type; gsl-2.7.1/integration/exponential.c0000644016036000116100000000460313373111455014251 00000000000000/* integration/exponential.c * * Copyright (C) 2017 Konrad Griessinger, 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. */ /* * The code in this module is based on IQPACK, specifically the LGPL * implementation found in HERMITE_RULE: * https://people.sc.fsu.edu/~jburkardt/c_src/hermite_rule/hermite_rule.html */ #include #include #include #include #include static int exponential_check(const size_t n, const gsl_integration_fixed_params * params) { (void) n; if (fabs(params->b - params->a) <= GSL_DBL_EPSILON) { GSL_ERROR("|b - a| too small", GSL_EDOM); } else if (params->a >= params->b) { GSL_ERROR("lower integration limit must be smaller than upper limit", GSL_EDOM); } else if (params->alpha <= -1.0) { GSL_ERROR("alpha must be > -1", GSL_EDOM); } else { return GSL_SUCCESS; } } static int exponential_init(const size_t n, double * diag, double * subdiag, gsl_integration_fixed_params * params) { size_t i; double a2i = params->alpha; /* construct the diagonal and subdiagonal elements of Jacobi matrix */ for (i = 1; i <= n; i++) { diag[i-1] = 0.0; a2i += 2.0; subdiag[i-1] = (i + params->alpha*(i%2))/sqrt( a2i*a2i - 1.0 ); } params->zemu = 2.0/(params->alpha + 1.0); params->shft = 0.5*(params->b + params->a); params->slp = 0.5*(params->b - params->a); params->al = params->alpha; params->be = 0.0; return GSL_SUCCESS; } static const gsl_integration_fixed_type exponential_type = { exponential_check, exponential_init }; const gsl_integration_fixed_type *gsl_integration_fixed_exponential = &exponential_type; gsl-2.7.1/integration/rational.c0000644016036000116100000000613213373111455013533 00000000000000/* integration/rational.c * * Copyright (C) 2017 Konrad Griessinger, 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. */ /* * The code in this module is based on IQPACK, specifically the LGPL * implementation found in HERMITE_RULE: * https://people.sc.fsu.edu/~jburkardt/c_src/hermite_rule/hermite_rule.html */ #include #include #include #include #include static int rational_check(const size_t n, const gsl_integration_fixed_params * params) { if (fabs(params->b - params->a) <= GSL_DBL_EPSILON) { GSL_ERROR("|b - a| too small", GSL_EDOM); } else if (params->alpha <= -1.0) { GSL_ERROR("alpha must be > -1", GSL_EDOM); } else if (params->beta >= 0.0 || params->alpha+params->beta+2*n >= 0.0 || 0.0 >= params->alpha+2*n) { GSL_ERROR("beta < alpha + beta + 2n < 0 is required", GSL_EDOM); } else if (params->a + params->b <= 0.0) { GSL_ERROR("a + b <= 0 is not allowed", GSL_EDOM); } else { return GSL_SUCCESS; } } static int rational_init(const size_t n, double * diag, double * subdiag, gsl_integration_fixed_params * params) { const double absum = params->beta + params->alpha; const double a1 = params->alpha + 1.0; const double aba1 = absum*a1; double ab2i = absum + 2.0; size_t i; /* construct the diagonal and subdiagonal elements of Jacobi matrix */ diag[0] = -a1/(absum + 2.0); subdiag[0] = sqrt( -diag[0] * ( params->beta + 1.0 ) / ( (absum + 2.0)*(absum + 3.0) ) ); for (i = 1; i < n-1; i++) { ab2i += 2.0; diag[i] = ( -aba1 - 2.0 * i * ( absum + i + 1.0 ) ) / ( ab2i * ( ab2i - 2.0 ) ); subdiag[i] = sqrt( (i+1.0) * ( params->alpha + i + 1.0 ) / ( ab2i - 1.0 ) * ( params->beta + i + 1.0 ) / ( ab2i * ab2i ) * ( absum + i + 1.0 ) / ( ab2i + 1.0 ) ); } diag[n-1] = ( -aba1 - 2.0 * (n-1.0) * ( absum + n ) ) / ( (absum + 2.0*n) * ( absum + 2.0*n - 2.0 ) ); subdiag[n-1] = 0.0; params->zemu = gsl_sf_gamma(params->alpha + 1.0) * gsl_sf_gamma(-absum - 1.0) / gsl_sf_gamma(-params->beta); params->shft = params->a; params->slp = params->b + params->a; params->al = params->alpha; params->be = params->beta; return GSL_SUCCESS; } static const gsl_integration_fixed_type rational_type = { rational_check, rational_init }; const gsl_integration_fixed_type *gsl_integration_fixed_rational = &rational_type; gsl-2.7.1/integration/romberg.c0000644016036000116100000001025413373111455013357 00000000000000/* integration/romberg.c * * Copyright (C) 2018 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. */ /* the code in this module performs Romberg integration */ #include #include #include #include #include #define ROMBERG_PRINT_ROW(i, r) \ do { \ size_t jj; \ fprintf(stderr, "R[%zu] = ", i); \ for (jj = 0; jj <= i; ++jj) \ fprintf(stderr, "%.8e ", r[jj]); \ fprintf(stderr, "\n"); \ } while (0) gsl_integration_romberg_workspace * gsl_integration_romberg_alloc(const size_t n) { gsl_integration_romberg_workspace *w; /* check inputs */ if (n < 1) { GSL_ERROR_VAL ("workspace size n must be at least 1", GSL_EDOM, 0); } w = calloc(1, sizeof(gsl_integration_romberg_workspace)); if (w == NULL) { GSL_ERROR_VAL ("unable to allocate workspace", GSL_ENOMEM, 0); } /* ceiling on n, since the number of points is 2^n + 1 */ w->n = GSL_MIN(n, 30); w->work1 = malloc(w->n * sizeof(double)); if (w->work1 == NULL) { gsl_integration_romberg_free(w); GSL_ERROR_VAL ("unable to allocate previous row", GSL_ENOMEM, 0); } w->work2 = malloc(w->n * sizeof(double)); if (w->work2 == NULL) { gsl_integration_romberg_free(w); GSL_ERROR_VAL ("unable to allocate current row", GSL_ENOMEM, 0); } return w; } void gsl_integration_romberg_free(gsl_integration_romberg_workspace * w) { if (w->work1) free(w->work1); if (w->work2) free(w->work2); free(w); } int gsl_integration_romberg(const gsl_function * f, const double a, const double b, const double epsabs, const double epsrel, double * result, size_t * neval, gsl_integration_romberg_workspace * w) { if (epsabs < 0.0) { GSL_ERROR("epsabs must be non-negative", GSL_EDOM); } else if (epsrel < 0.0) { GSL_ERROR("epsrel must be non-negative", GSL_EDOM); } else { const size_t n = w->n; double *Rp = &(w->work1[0]); /* previous row */ double *Rc = &(w->work2[0]); /* current row */ double *Rtmp; double h = 0.5 * (b - a); /* step size */ size_t i; /* R(0,0) */ Rp[0] = h * (GSL_FN_EVAL(f, a) + GSL_FN_EVAL(f, b)); *neval = 2; /*ROMBERG_PRINT_ROW((size_t) 0, Rp);*/ for (i = 1; i < n; ++i) { size_t j; double sum = 0.0; double err; double four_j; /* 4^j */ size_t two_i = 1 << i; /* 2^i */ for (j = 1; j < two_i; j += 2) { sum += GSL_FN_EVAL(f, a + j * h); ++(*neval); } /* R(i,0) */ Rc[0] = sum * h + 0.5 * Rp[0]; four_j = 4.0; for (j = 1; j <= i; ++j) { Rc[j] = (four_j * Rc[j - 1] - Rp[j - 1]) / (four_j - 1.0); four_j *= 4.0; } /*ROMBERG_PRINT_ROW(i, Rc);*/ /* * compute difference between current and previous result and * check for convergence */ err = fabs(Rc[i] - Rp[i - 1]); if ((err < epsabs) || (err < epsrel * fabs(Rc[i]))) { *result = Rc[i]; return GSL_SUCCESS; } /* swap Rp and Rc */ Rtmp = Rp; Rp = Rc; Rc = Rtmp; h *= 0.5; } /* did not converge - return best guess */ *result = Rp[n - 1]; return GSL_EMAXITER; } } gsl-2.7.1/integration/test.c0000644016036000116100000031550314151556700012707 00000000000000/* integration/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Brian Gough * Copyright (C) 2017, 2018 Patrick Alken * Copyright (C) 2017 Konrad Griessinger * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this 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 "tests.h" #define SQRT15 3.8729833462074168852 #define SQRT30 5.4772255750516611346 #define SQRT70 8.3666002653407554798 #define CONST1 0.86113631159405257522 /* sqrt((3+2*sqrt(6./5))/7) */ #define CONST2 0.33998104358485626480 /* sqrt((3-2*sqrt(6./5))/7) */ #define CONST3 0.90617984593866399280 /* sqrt((5+2*sqrt(10./7)))/3 */ #define CONST4 0.53846931010568309104 /* sqrt((5-2*sqrt(10./7)))/3 */ 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); static int test_fixed_quadrature(const gsl_integration_fixed_type * T, const size_t n, const double a, const double b, const double alpha, const double beta, const double tol, const double exact, const gsl_function * f, const char * desc) { int status = GSL_SUCCESS; gsl_integration_fixed_workspace * w = gsl_integration_fixed_alloc(T, n, a, b, alpha, beta); char buf[2048]; double result; sprintf(buf, "%s a=%g b=%g alpha=%g beta=%g", desc, a, b, alpha, beta); gsl_integration_fixed(f, &result, w); gsl_test_rel (result, exact, tol, "%s", buf); gsl_integration_fixed_free(w); return status; } 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) ; } /* test Romberg integration */ { int status = 0; double result; size_t neval; double exp_result; int exp_ier = 0; gsl_function f; gsl_integration_romberg_workspace * w = gsl_integration_romberg_alloc (20); f = make_function(&f_sin, NULL); exp_result = 1.0; status = gsl_integration_romberg(&f, 0.0, M_PI_2, 0.0, 1e-10, &result, &neval, w); gsl_test_int(status, exp_ier, "romberg(f_sin) status") ; gsl_test_rel(result, exp_result, 1e-15, "romberg(f_sin) result") ; status = gsl_integration_romberg(&f, M_PI_2, 0.0, 0.0, 1e-10, &result, &neval, w); gsl_test_int(status, exp_ier, "romberg(f_sin) reverse status") ; gsl_test_rel(result, -exp_result, 1e-15, "romberg(f_sin) reverse result") ; f = make_function(&cqf11, NULL); exp_result = 5.0; status = gsl_integration_romberg(&f, -5.0, 5.0, 0.0, 1e-10, &result, &neval, w); gsl_test_int(status, exp_ier, "romberg(cqf11) status") ; gsl_test_rel(result, exp_result, 1e-15, "romberg(cqf11) result") ; status = gsl_integration_romberg(&f, 5.0, -5.0, 0.0, 1e-10, &result, &neval, w); gsl_test_int(status, exp_ier, "romberg(cqf11) reverse status") ; gsl_test_rel(result, -exp_result, 1e-15, "romberg(cqf11) reverse result") ; gsl_integration_romberg_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.0/M_SQRT3, 1}, { 1.0/M_SQRT3, 1} }; const double e3[3][2] = { {-SQRT15/5, 5./9}, { 0, 8./9}, { SQRT15/5, 5./9} }; const double e4[4][2] = { {-CONST1, (18-SQRT30)/36}, {-CONST2, (18+SQRT30)/36}, { CONST2, (18+SQRT30)/36}, { CONST1, (18-SQRT30)/36} }; const double e5[5][2] = { {-CONST3, (322-13*SQRT70)/900}, {-CONST4, (322+13*SQRT70)/900}, { 0, 128./225 }, { CONST4, (322+13*SQRT70)/900}, { CONST3, (322-13*SQRT70)/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 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 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 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); } } /* test fixed quadrature */ { size_t n; struct monomial_params params; gsl_function f; double exact; double a, b; int deg = 5; /* monomial degree */ double dterm = (deg % 2) == 0 ? 1.0 : -1.0; f.function = &f_monomial; f.params = ¶ms; params.degree = deg; params.constant = 1.0; n = 15; for (b = 1.1; b <= 4.0; b += 0.1) { /* test with a < b */ a = b - 1.0; /* Legendre quadrature */ exact = (pow(b,params.degree+1.0) - pow(a,params.degree+1.0))/(params.degree+1.0); test_fixed_quadrature(gsl_integration_fixed_legendre, n, a, b, 0.0, 0.0, 1.0e-12, exact, &f, "legendre monomial"); /* Chebyshev type 1 quadrature */ exact = GSL_SIGN(b-a)*M_PI*pow(0.5*(a+b),params.degree)*gsl_sf_hyperg_2F1(0.5*(1-params.degree),-0.5*params.degree,1.0,(b-a)*(b-a)/((b+a)*(b+a))); test_fixed_quadrature(gsl_integration_fixed_chebyshev, n, a, b, 0.0, 0.0, 1.0e-12, exact, &f, "chebyshev monomial"); /* Laguerre quadrature */ exact = pow(b, -1.0 - deg) * exp(a * b) * gsl_sf_gamma_inc(1.0 + deg, a * b); test_fixed_quadrature(gsl_integration_fixed_laguerre, n, a, b, 0.0, 0.0, 1.0e-12, exact, &f, "laguerre monomial"); /* Hermite quadrature */ exact = 0.5 * pow(b, -0.5*deg) * (-(-1.0 + dterm) * a * deg * gsl_sf_gamma(0.5*deg) * gsl_sf_hyperg_1F1(0.5 - 0.5*deg, 1.5, -a*a*b) + (1.0 + dterm) * gsl_sf_gamma(0.5*(1.0+deg)) * gsl_sf_hyperg_1F1(-0.5*deg, 0.5, -a*a*b) / sqrt(b)); test_fixed_quadrature(gsl_integration_fixed_hermite, n, a, b, 0.0, 0.0, 1.0e-12, exact, &f, "hermite monomial"); /* Chebyshev type 2 quadrature */ exact = GSL_SIGN(b-a)*M_PI_2*pow(0.5*(a+b),params.degree)*gsl_sf_hyperg_2F1(0.5*(1-params.degree),-0.5*params.degree,2.0,(b-a)*(b-a)/((b+a)*(b+a)))*0.25*(b-a)*(b-a); test_fixed_quadrature(gsl_integration_fixed_chebyshev2, n, a, b, 0.0, 0.0, 1.0e-12, exact, &f, "chebyshev2 monomial"); /* now test with a > b */ a = b + 1.0; /* Legendre quadrature */ exact = (pow(b,params.degree+1.0) - pow(a,params.degree+1.0))/(params.degree+1.0); test_fixed_quadrature(gsl_integration_fixed_legendre, n, a, b, 0.0, 0.0, 1.0e-12, exact, &f, "legendre monomial"); /* Laguerre quadrature */ exact = pow(b, -1.0 - deg) * exp(a * b) * gsl_sf_gamma_inc(1.0 + deg, a * b); test_fixed_quadrature(gsl_integration_fixed_laguerre, n, a, b, 0.0, 0.0, 1.0e-12, exact, &f, "laguerre monomial"); /* Hermite quadrature */ exact = 0.5 * pow(b, -0.5*deg) * (-(-1.0 + dterm) * a * deg * gsl_sf_gamma(0.5*deg) * gsl_sf_hyperg_1F1(0.5 - 0.5*deg, 1.5, -a*a*b) + (1.0 + dterm) * gsl_sf_gamma(0.5*(1.0+deg)) * gsl_sf_hyperg_1F1(-0.5*deg, 0.5, -a*a*b) / sqrt(b)); test_fixed_quadrature(gsl_integration_fixed_hermite, n, a, b, 0.0, 0.0, 1.0e-12, exact, &f, "hermite monomial"); #if 0 /* FIXME: Chebyshev doesn't work when a > b */ /* Chebyshev type 1 quadrature */ exact = -M_PI / 8.0 * (3.0*a*a + 2.0*a*b + 3.0*b*b); test_fixed_quadrature(gsl_integration_fixed_chebyshev, n, a, b, 0.0, 0.0, 1.0e-12, exact, &f, "chebyshev monomial"); /* Chebyshev type 2 quadrature */ exact = -M_PI / 128.0 * (a - b) * (a - b) *(5.0*a*a + 6.0*a*b + 5.0*b*b); test_fixed_quadrature(gsl_integration_fixed_chebyshev2, n, a, b, 0.0, 0.0, 1.0e-12, exact, &f, "chebyshev2 monomial"); #endif } /* now test on myfn1 */ f = make_function(&myfn1, 0); n = 200; test_fixed_quadrature(gsl_integration_fixed_legendre, n, 1.2, 1.6, 0.0, 0.0, 1.0e-12, 0.01505500344456001, &f, "legendre myfn1"); test_fixed_quadrature(gsl_integration_fixed_chebyshev, n, 1.2, 2.6, 0.0, 0.0, 1.0e-12, 0.0582346516219999, &f, "chebyshev myfn1"); test_fixed_quadrature(gsl_integration_fixed_gegenbauer, n, 1.2, 1.6, 2.0, 0.0, 1.0e-12, 1.2279468957162412661311711271e-5, &f, "gegenbauer myfn1"); test_fixed_quadrature(gsl_integration_fixed_gegenbauer, n, 1.2, 1.6, -0.5, 0.0, 1.0e-12, 1.228256086101808986e-1, &f, "gegenbauer myfn1"); test_fixed_quadrature(gsl_integration_fixed_jacobi, n, 1.2, 1.6, 2.0, 1.5, 1.0e-12, 3.173064776410033e-5, &f, "jacobi myfn1"); test_fixed_quadrature(gsl_integration_fixed_jacobi, n, 1.2, 1.6, -0.5, -0.5, 1.0e-12, 1.228256086101808986e-1, &f, "jacobi myfn1"); test_fixed_quadrature(gsl_integration_fixed_laguerre, n, 1.2, 0.6, 0.5, 0.0, 1.0e-12, 0.006604180366378123, &f, "laguerre myfn1"); test_fixed_quadrature(gsl_integration_fixed_hermite, n, 1.2, 0.6, 1.0, 0.0, 1.0e-12, 0.6542819629825344, &f, "hermite myfn1"); test_fixed_quadrature(gsl_integration_fixed_exponential, n, 1.2, 1.6, 2.0, 0.0, 1.0e-12, 2.1315535492168832898083633e-4, &f, "exponential myfn1"); test_fixed_quadrature(gsl_integration_fixed_rational, 15, 1.2, 1.6, 2.0, -33.4, 1.0e-9, 4.8457468060064844e-20, &f, "rational myfn1"); test_fixed_quadrature(gsl_integration_fixed_chebyshev2, n, 1.2, 2.6, 0.0, 0.0, 1.0e-12, 0.0081704088896491, &f, "chebyshev2 myfn1"); } /* test Gegenbauer quadrature */ { size_t n, k; struct monomial_params params; gsl_function f; const double exactarray[5] = {4.15933612154155020161400717857e-7, 744697.808572324010134504819452, 55.2024994284578980512106835228, 7.95574829722734114107142857143, 0.00179653588816666666666666666667}; const double aarray[5] = {0.123,7.747,1.47,-1.47,0.0}; const double barray[5] = {0.456,12.0,2.0,2.0,0.47}; const double alphaarray[5] = {2.0,0.5,-0.5,1.0,0.0}; f.function = &f_monomial; f.params = ¶ms; params.degree = 5; params.constant = 1.0; n = 50; for ( k = 0; k < 5; k++) { test_fixed_quadrature(gsl_integration_fixed_gegenbauer, n, aarray[k], barray[k], alphaarray[k], 0.0, 1.0e-12, exactarray[k], &f, "gegenbauer monomial"); } } /* test Jacobi quadrature */ { size_t n, k; struct monomial_params params; gsl_function f; const double exactarray[5] = {9.052430592016123480501898e-7,3.131716150347619771233591755e6,0.04435866422797298224404592896,5.287059602300844442782407,2.5337038518475893688512749675e-6}; const double aarray[5] = {0.123,7.747,1.47,-1.47,0.0}; const double barray[5] = {0.456,12.0,2.0,2.0,0.47}; double alpha, beta; f.function = &f_monomial; f.params = ¶ms; params.degree = 5; params.constant = 1.0; alpha = 2.0; beta = 1.5; n = 50; for ( k = 0; k < 5; k++) { test_fixed_quadrature(gsl_integration_fixed_jacobi, n, aarray[k], barray[k], alpha, beta, 1.0e-12, exactarray[k], &f, "jacobi monomial"); } } /* test Exponential quadrature */ { size_t n, k; struct monomial_params params; gsl_function f; const double exactarray[5] = {1.598864206823942764921875e-4, 624615.81848571833291063083819, 0.222578063871903188095238095238, 28.8968950008739567709168294271, 4.62725113500425479890950520833e-7}; const double aarray[5] = {0.123,7.747,1.47,-1.47,0.0}; const double barray[5] = {0.456,12.0,2.0,2.0,0.47}; const double alphaarray[5] = {1.0,1.5,2.0,3.0,5.0}; f.function = &f_monomial; f.params = ¶ms; params.degree = 5; params.constant = 1.0; n = 50; for ( k = 0; k < 5; k++) { test_fixed_quadrature(gsl_integration_fixed_exponential, n, aarray[k], barray[k], alphaarray[k], 0.0, 1.0e-12, exactarray[k], &f, "exponential monomial"); } } /* test Rational quadrature */ { size_t n, k; struct monomial_params params; gsl_function f; const double exactarray[6] = {1.312245361412108703130374957e-10,0.0170362044485924082779613124672, 8.93065131938394658578136414201e-11, 7.17990217357447544326794457270e-13, -11.0760676986664098133970869634, 0.00290392485414197833688178206557}; const double aarray[6] = {0.0,0.123,7.747,1.47,-1.47,0.0}; const double barray[6] = {2.0,0.456,12.0,2.0,2.0,0.47}; const double alphaarray[6] = {0.0,1.0,1.5,2.0,3.0,5.0}; const double betaarray[6] = {-21.0,-12.0,-13.0,-22.0,-21.0,-16.0}; f.function = &f_monomial; f.params = ¶ms; params.degree = 5; params.constant = 1.0; n = 5; for ( k = 0; k < 5; k++) { test_fixed_quadrature(gsl_integration_fixed_rational, n, aarray[k], barray[k], alphaarray[k], betaarray[k], 1.0e-12, exactarray[k], &f, "rational monomial"); } } 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-2.7.1/integration/tests.c0000644016036000116100000002110313373111455013057 00000000000000/* 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-2.7.1/integration/tests.h0000644016036000116100000000601213373111455013066 00000000000000/* 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-2.7.1/interpolation/0000755016036000116100000000000014151602577012205 500000000000000gsl-2.7.1/interpolation/Makefile.am0000644016036000116100000000145413373111455014160 00000000000000noinst_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-2.7.1/interpolation/test2d.c0000644016036000116100000003372514042062432013475 00000000000000/* 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_extrap_e, 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); test_single_high_level(&gsl_spline2d_eval_extrap, &gsl_spline2d_eval_extrap_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_extrap, &gsl_spline2d_eval_extrap_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_extrap_e, 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-2.7.1/interpolation/gsl_interp.h0000644016036000116100000001546113373111455014446 00000000000000/* 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-2.7.1/interpolation/gsl_spline.h0000644016036000116100000000533514151556700014437 00000000000000/* 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-2.7.1/interpolation/gsl_interp2d.h0000644016036000116100000002216013431326247014670 00000000000000/* 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); #ifndef GSL_DISABLE_DEPRECATED 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); #endif /* !GSL_DISABLE_DEPRECATED */ int gsl_interp2d_eval_extrap_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_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-2.7.1/interpolation/gsl_spline2d.h0000644016036000116100000001160514042062070014651 00000000000000/* 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_extrap(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya); int gsl_spline2d_eval_extrap_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-2.7.1/interpolation/Makefile.in0000644016036000116100000011311614151557214014172 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/accel.Plo ./$(DEPDIR)/akima.Plo \ ./$(DEPDIR)/bicubic.Plo ./$(DEPDIR)/bilinear.Plo \ ./$(DEPDIR)/cspline.Plo ./$(DEPDIR)/inline.Plo \ ./$(DEPDIR)/interp.Plo ./$(DEPDIR)/interp2d.Plo \ ./$(DEPDIR)/linear.Plo ./$(DEPDIR)/poly.Plo \ ./$(DEPDIR)/spline.Plo ./$(DEPDIR)/spline2d.Plo \ ./$(DEPDIR)/steffen.Plo ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/akima.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bicubic.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bilinear.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cspline.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interp2d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linear.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poly.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spline.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spline2d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/steffen.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/accel.Plo -rm -f ./$(DEPDIR)/akima.Plo -rm -f ./$(DEPDIR)/bicubic.Plo -rm -f ./$(DEPDIR)/bilinear.Plo -rm -f ./$(DEPDIR)/cspline.Plo -rm -f ./$(DEPDIR)/inline.Plo -rm -f ./$(DEPDIR)/interp.Plo -rm -f ./$(DEPDIR)/interp2d.Plo -rm -f ./$(DEPDIR)/linear.Plo -rm -f ./$(DEPDIR)/poly.Plo -rm -f ./$(DEPDIR)/spline.Plo -rm -f ./$(DEPDIR)/spline2d.Plo -rm -f ./$(DEPDIR)/steffen.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/accel.Plo -rm -f ./$(DEPDIR)/akima.Plo -rm -f ./$(DEPDIR)/bicubic.Plo -rm -f ./$(DEPDIR)/bilinear.Plo -rm -f ./$(DEPDIR)/cspline.Plo -rm -f ./$(DEPDIR)/inline.Plo -rm -f ./$(DEPDIR)/interp.Plo -rm -f ./$(DEPDIR)/interp2d.Plo -rm -f ./$(DEPDIR)/linear.Plo -rm -f ./$(DEPDIR)/poly.Plo -rm -f ./$(DEPDIR)/spline.Plo -rm -f ./$(DEPDIR)/spline2d.Plo -rm -f ./$(DEPDIR)/steffen.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/interpolation/ChangeLog0000644016036000116100000001063513373111455013677 000000000000002011-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-2.7.1/interpolation/TODO0000644016036000116100000000066413373111455012616 00000000000000# -*- 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-2.7.1/interpolation/accel.c0000644016036000116100000000271013373111455013333 00000000000000/* 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-2.7.1/interpolation/akima.c0000644016036000116100000002226213373111455013352 00000000000000/* 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-2.7.1/interpolation/cspline.c0000644016036000116100000003046413373111455013730 00000000000000/* 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-2.7.1/interpolation/interp.c0000644016036000116100000001463013373111455013571 00000000000000/* 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-2.7.1/interpolation/linear.c0000644016036000116100000001071613135126237013543 00000000000000/* 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-2.7.1/interpolation/integ_eval.h0000644016036000116100000000254313135126237014412 00000000000000/* 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-2.7.1/interpolation/spline.c0000644016036000116100000001205613373111455013562 00000000000000/* 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-2.7.1/interpolation/poly.c0000644016036000116100000001035513135126237013253 00000000000000/* 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-2.7.1/interpolation/steffen.c0000644016036000116100000002421713373111455013724 00000000000000/* interpolation/steffen.c * * 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: J.-F. Caron * * This interpolation method is taken from * M.Steffen, "A simple method for monotonic interpolation in one dimension", * Astron. Astrophys. 239, 443-450 (1990). * * This interpolation method guarantees monotonic interpolation functions between * the given data points. A consequence of this is that extremal values can only * occur at the data points. The interpolating function and its first derivative * are guaranteed to be continuous, but the second derivative is not. * * The implementation is modelled on the existing Akima interpolation method * previously included in GSL by Gerard Jungman. */ #include #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-2.7.1/interpolation/inline.c0000644016036000116100000000175713373111455013554 00000000000000/* 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-2.7.1/interpolation/interp2d.c0000644016036000116100000003306213431326204014012 00000000000000/* 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() */ #ifndef GSL_DISABLE_DEPRECATED 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); } #endif /* !GSL_DISABLE_DEPRECATED */ int gsl_interp2d_eval_extrap_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_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-2.7.1/interpolation/bilinear.c0000644016036000116100000001420613373111455014054 00000000000000/* 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-2.7.1/interpolation/bicubic.c0000644016036000116100000006735713373111455013706 00000000000000/* 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-2.7.1/interpolation/spline2d.c0000644016036000116100000002156714042061754014017 00000000000000/* 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_extrap(const gsl_spline2d * interp, const double x, const double y, gsl_interp_accel * xa, gsl_interp_accel * ya) { return gsl_interp2d_eval_extrap(&(interp->interp_object), interp->xarr, interp->yarr, interp->zarr, x, y, xa, ya); } int gsl_spline2d_eval_extrap_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_extrap_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-2.7.1/interpolation/test.c0000644016036000116100000011644713373111455013260 00000000000000/* 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-2.7.1/histogram/0000755016036000116100000000000014151602577011313 500000000000000gsl-2.7.1/histogram/Makefile.am0000644016036000116100000000144713373111455013270 00000000000000noinst_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-2.7.1/histogram/urand.c0000644016036000116100000000173613135126237012512 00000000000000/* 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-2.7.1/histogram/find.c0000644016036000116100000000361613135126237012320 00000000000000/* 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-2.7.1/histogram/find2d.c0000644016036000116100000000255513135126237012547 00000000000000/* 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-2.7.1/histogram/gsl_histogram.h0000644016036000116100000001005413135126237014241 00000000000000/* 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-2.7.1/histogram/gsl_histogram2d.h0000644016036000116100000001301213135126237014464 00000000000000/* 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-2.7.1/histogram/Makefile.in0000644016036000116100000012110714151557214013277 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/add.Plo ./$(DEPDIR)/add2d.Plo \ ./$(DEPDIR)/calloc_range.Plo ./$(DEPDIR)/calloc_range2d.Plo \ ./$(DEPDIR)/copy.Plo ./$(DEPDIR)/copy2d.Plo \ ./$(DEPDIR)/file.Plo ./$(DEPDIR)/file2d.Plo \ ./$(DEPDIR)/get.Plo ./$(DEPDIR)/get2d.Plo ./$(DEPDIR)/init.Plo \ ./$(DEPDIR)/init2d.Plo ./$(DEPDIR)/maxval.Plo \ ./$(DEPDIR)/maxval2d.Plo ./$(DEPDIR)/oper.Plo \ ./$(DEPDIR)/oper2d.Plo ./$(DEPDIR)/params.Plo \ ./$(DEPDIR)/params2d.Plo ./$(DEPDIR)/pdf.Plo \ ./$(DEPDIR)/pdf2d.Plo ./$(DEPDIR)/reset.Plo \ ./$(DEPDIR)/reset2d.Plo ./$(DEPDIR)/stat.Plo \ ./$(DEPDIR)/stat2d.Plo ./$(DEPDIR)/test.Po \ ./$(DEPDIR)/test1d.Po ./$(DEPDIR)/test1d_resample.Po \ ./$(DEPDIR)/test1d_trap.Po ./$(DEPDIR)/test2d.Po \ ./$(DEPDIR)/test2d_resample.Po ./$(DEPDIR)/test2d_trap.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add2d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calloc_range.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calloc_range2d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy2d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file2d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get2d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init2d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maxval.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maxval2d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oper.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oper2d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/params.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/params2d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdf2d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reset.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reset2d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat2d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test1d.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test1d_resample.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test1d_trap.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test2d.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test2d_resample.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test2d_trap.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/add.Plo -rm -f ./$(DEPDIR)/add2d.Plo -rm -f ./$(DEPDIR)/calloc_range.Plo -rm -f ./$(DEPDIR)/calloc_range2d.Plo -rm -f ./$(DEPDIR)/copy.Plo -rm -f ./$(DEPDIR)/copy2d.Plo -rm -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/file2d.Plo -rm -f ./$(DEPDIR)/get.Plo -rm -f ./$(DEPDIR)/get2d.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/init2d.Plo -rm -f ./$(DEPDIR)/maxval.Plo -rm -f ./$(DEPDIR)/maxval2d.Plo -rm -f ./$(DEPDIR)/oper.Plo -rm -f ./$(DEPDIR)/oper2d.Plo -rm -f ./$(DEPDIR)/params.Plo -rm -f ./$(DEPDIR)/params2d.Plo -rm -f ./$(DEPDIR)/pdf.Plo -rm -f ./$(DEPDIR)/pdf2d.Plo -rm -f ./$(DEPDIR)/reset.Plo -rm -f ./$(DEPDIR)/reset2d.Plo -rm -f ./$(DEPDIR)/stat.Plo -rm -f ./$(DEPDIR)/stat2d.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test1d.Po -rm -f ./$(DEPDIR)/test1d_resample.Po -rm -f ./$(DEPDIR)/test1d_trap.Po -rm -f ./$(DEPDIR)/test2d.Po -rm -f ./$(DEPDIR)/test2d_resample.Po -rm -f ./$(DEPDIR)/test2d_trap.Po -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 -f ./$(DEPDIR)/add.Plo -rm -f ./$(DEPDIR)/add2d.Plo -rm -f ./$(DEPDIR)/calloc_range.Plo -rm -f ./$(DEPDIR)/calloc_range2d.Plo -rm -f ./$(DEPDIR)/copy.Plo -rm -f ./$(DEPDIR)/copy2d.Plo -rm -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/file2d.Plo -rm -f ./$(DEPDIR)/get.Plo -rm -f ./$(DEPDIR)/get2d.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/init2d.Plo -rm -f ./$(DEPDIR)/maxval.Plo -rm -f ./$(DEPDIR)/maxval2d.Plo -rm -f ./$(DEPDIR)/oper.Plo -rm -f ./$(DEPDIR)/oper2d.Plo -rm -f ./$(DEPDIR)/params.Plo -rm -f ./$(DEPDIR)/params2d.Plo -rm -f ./$(DEPDIR)/pdf.Plo -rm -f ./$(DEPDIR)/pdf2d.Plo -rm -f ./$(DEPDIR)/reset.Plo -rm -f ./$(DEPDIR)/reset2d.Plo -rm -f ./$(DEPDIR)/stat.Plo -rm -f ./$(DEPDIR)/stat2d.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test1d.Po -rm -f ./$(DEPDIR)/test1d_resample.Po -rm -f ./$(DEPDIR)/test1d_trap.Po -rm -f ./$(DEPDIR)/test2d.Po -rm -f ./$(DEPDIR)/test2d_resample.Po -rm -f ./$(DEPDIR)/test2d_trap.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/histogram/ChangeLog0000644016036000116100000001172613373111455013007 000000000000002009-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-2.7.1/histogram/TODO0000644016036000116100000000020713373111455011715 00000000000000# -*- org -*- #+CATEGORY: histogram * Implement N-d histograms (Simone Piccardi is working on something here). gsl-2.7.1/histogram/add.c0000644016036000116100000000265013135126237012125 00000000000000/* 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-2.7.1/histogram/get.c0000644016036000116100000000331413135126237012152 00000000000000/* 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-2.7.1/histogram/init.c0000644016036000116100000000753513373111455012347 00000000000000/* 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-2.7.1/histogram/params.c0000644016036000116100000000217413135126237012661 00000000000000/* 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-2.7.1/histogram/reset.c0000644016036000116100000000202313135126237012511 00000000000000/* 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-2.7.1/histogram/file.c0000644016036000116100000000565413135126237012323 00000000000000/* 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-2.7.1/histogram/pdf.c0000644016036000116100000000671313373111455012152 00000000000000/* 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-2.7.1/histogram/add2d.c0000644016036000116100000000333013135126237012347 00000000000000/* 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-2.7.1/histogram/get2d.c0000644016036000116100000000472313135126237012405 00000000000000/* 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-2.7.1/histogram/init2d.c0000644016036000116100000001523013373111455012564 00000000000000/* 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-2.7.1/histogram/params2d.c0000644016036000116100000000263513135126237013111 00000000000000/* 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-2.7.1/histogram/reset2d.c0000644016036000116100000000207613135126237012747 00000000000000/* 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-2.7.1/histogram/file2d.c0000644016036000116100000001064413135126237012544 00000000000000/* 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-2.7.1/histogram/pdf2d.c0000644016036000116100000001055013373111455012372 00000000000000/* 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-2.7.1/histogram/calloc_range.c0000644016036000116100000000533313373111455014007 00000000000000/* 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-2.7.1/histogram/calloc_range2d.c0000644016036000116100000000734013373111455014235 00000000000000/* 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-2.7.1/histogram/copy.c0000644016036000116100000000414513373111455012350 00000000000000/* 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-2.7.1/histogram/copy2d.c0000644016036000116100000000447613373111455012605 00000000000000/* 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-2.7.1/histogram/maxval.c0000644016036000116100000000457613373111455012676 00000000000000/* 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-2.7.1/histogram/maxval2d.c0000644016036000116100000000640113373111455013111 00000000000000/* 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-2.7.1/histogram/oper.c0000644016036000116100000000750513373111455012346 00000000000000/* 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-2.7.1/histogram/oper2d.c0000644016036000116100000001025613373111455012571 00000000000000/* 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-2.7.1/histogram/stat.c0000644016036000116100000000621313373111455012347 00000000000000/* 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-2.7.1/histogram/stat2d.c0000644016036000116100000001327213373111455012600 00000000000000/* 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-2.7.1/histogram/test.c0000644016036000116100000000236413135126237012356 00000000000000/* 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-2.7.1/histogram/test1d.c0000644016036000116100000002430513135126237012602 00000000000000/* 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-2.7.1/histogram/test2d.c0000644016036000116100000004355713135126237012615 00000000000000/* 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-2.7.1/histogram/test1d_resample.c0000644016036000116100000000506613135126237014475 00000000000000/* 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-2.7.1/histogram/test2d_resample.c0000644016036000116100000000631313135126237014472 00000000000000/* 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-2.7.1/histogram/test1d_trap.c0000644016036000116100000001017013135126237013623 00000000000000/* 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-2.7.1/histogram/test2d_trap.c0000644016036000116100000001606713135126237013637 00000000000000/* 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-2.7.1/ode-initval/0000755016036000116100000000000014151602577011531 500000000000000gsl-2.7.1/ode-initval/Makefile.am0000644016036000116100000000132013373111456013475 00000000000000noinst_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-2.7.1/ode-initval/odeiv_util.h0000644016036000116100000000021313135126237013754 00000000000000#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-2.7.1/ode-initval/gsl_odeiv.h0000644016036000116100000001712013373111456013572 00000000000000/* 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-2.7.1/ode-initval/Makefile.in0000644016036000116100000011347114151557215013523 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/bsimp.Plo ./$(DEPDIR)/control.Plo \ ./$(DEPDIR)/cscal.Plo ./$(DEPDIR)/cstd.Plo \ ./$(DEPDIR)/evolve.Plo ./$(DEPDIR)/gear1.Plo \ ./$(DEPDIR)/gear2.Plo ./$(DEPDIR)/rk2.Plo \ ./$(DEPDIR)/rk2imp.Plo ./$(DEPDIR)/rk2simp.Plo \ ./$(DEPDIR)/rk4.Plo ./$(DEPDIR)/rk4imp.Plo \ ./$(DEPDIR)/rk8pd.Plo ./$(DEPDIR)/rkck.Plo \ ./$(DEPDIR)/rkf45.Plo ./$(DEPDIR)/step.Plo ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/control.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cscal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cstd.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evolve.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gear1.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gear2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk2imp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk2simp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk4.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk4imp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk8pd.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rkck.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rkf45.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/step.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/bsimp.Plo -rm -f ./$(DEPDIR)/control.Plo -rm -f ./$(DEPDIR)/cscal.Plo -rm -f ./$(DEPDIR)/cstd.Plo -rm -f ./$(DEPDIR)/evolve.Plo -rm -f ./$(DEPDIR)/gear1.Plo -rm -f ./$(DEPDIR)/gear2.Plo -rm -f ./$(DEPDIR)/rk2.Plo -rm -f ./$(DEPDIR)/rk2imp.Plo -rm -f ./$(DEPDIR)/rk2simp.Plo -rm -f ./$(DEPDIR)/rk4.Plo -rm -f ./$(DEPDIR)/rk4imp.Plo -rm -f ./$(DEPDIR)/rk8pd.Plo -rm -f ./$(DEPDIR)/rkck.Plo -rm -f ./$(DEPDIR)/rkf45.Plo -rm -f ./$(DEPDIR)/step.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/bsimp.Plo -rm -f ./$(DEPDIR)/control.Plo -rm -f ./$(DEPDIR)/cscal.Plo -rm -f ./$(DEPDIR)/cstd.Plo -rm -f ./$(DEPDIR)/evolve.Plo -rm -f ./$(DEPDIR)/gear1.Plo -rm -f ./$(DEPDIR)/gear2.Plo -rm -f ./$(DEPDIR)/rk2.Plo -rm -f ./$(DEPDIR)/rk2imp.Plo -rm -f ./$(DEPDIR)/rk2simp.Plo -rm -f ./$(DEPDIR)/rk4.Plo -rm -f ./$(DEPDIR)/rk4imp.Plo -rm -f ./$(DEPDIR)/rk8pd.Plo -rm -f ./$(DEPDIR)/rkck.Plo -rm -f ./$(DEPDIR)/rkf45.Plo -rm -f ./$(DEPDIR)/step.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/ode-initval/ChangeLog0000644016036000116100000001316713373111456013227 000000000000002011-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-2.7.1/ode-initval/TODO0000644016036000116100000000737113373111456012145 00000000000000# -*- 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-2.7.1/ode-initval/control.c0000644016036000116100000000431613373111456013275 00000000000000/* 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-2.7.1/ode-initval/cstd.c0000644016036000116100000001056713135126237012556 00000000000000/* 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-2.7.1/ode-initval/cscal.c0000644016036000116100000001115713135126237012702 00000000000000/* 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-2.7.1/ode-initval/evolve.c0000644016036000116100000001272113373111456013114 00000000000000/* 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-2.7.1/ode-initval/step.c0000644016036000116100000000415513373111456012571 00000000000000/* 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-2.7.1/ode-initval/rk2.c0000644016036000116100000001216413373111456012313 00000000000000/* 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-2.7.1/ode-initval/rk2imp.c0000644016036000116100000001617013135126237013021 00000000000000/* 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-2.7.1/ode-initval/rk2simp.c0000644016036000116100000002165313373111456013207 00000000000000/* 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-2.7.1/ode-initval/rk4.c0000644016036000116100000001657513373111456012327 00000000000000/* 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-2.7.1/ode-initval/rk4imp.c0000644016036000116100000002147413135126237013026 00000000000000/* 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-2.7.1/ode-initval/rkf45.c0000644016036000116100000002056013135126237012546 00000000000000/* 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-2.7.1/ode-initval/rk8pd.c0000644016036000116100000002742213135126237012647 00000000000000/* 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-2.7.1/ode-initval/rkck.c0000644016036000116100000002046213135126237012546 00000000000000/* 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-2.7.1/ode-initval/bsimp.c0000644016036000116100000003275213135126237012733 00000000000000/* 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-2.7.1/ode-initval/gear1.c0000644016036000116100000001404113135126237012607 00000000000000/* 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-2.7.1/ode-initval/gear2.c0000644016036000116100000002065713373111456012623 00000000000000/* 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-2.7.1/ode-initval/test.c0000644016036000116100000006442613373111456012604 00000000000000/* 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-2.7.1/ode-initval2/0000755016036000116100000000000014151602577011613 500000000000000gsl-2.7.1/ode-initval2/Makefile.am0000644016036000116100000000142113373111456013561 00000000000000noinst_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-2.7.1/ode-initval2/odeiv_util.h0000644016036000116100000000136513373111456014050 00000000000000#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-2.7.1/ode-initval2/step_utils.c0000644016036000116100000000175013373111456014071 00000000000000/* 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-2.7.1/ode-initval2/rksubs.c0000644016036000116100000000307713373111456013213 00000000000000/* 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-2.7.1/ode-initval2/modnewton1.c0000644016036000116100000002571613373111456014001 00000000000000/* 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-2.7.1/ode-initval2/control_utils.c0000644016036000116100000000201714002471555014572 00000000000000/* 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. */ (void) vstate; (void) d; return GSL_SUCCESS; } gsl-2.7.1/ode-initval2/gsl_odeiv2.h0000644016036000116100000003272513373111456013746 00000000000000/* 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-2.7.1/ode-initval2/Makefile.in0000644016036000116100000011411514151557215013601 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/bsimp.Plo ./$(DEPDIR)/control.Plo \ ./$(DEPDIR)/cscal.Plo ./$(DEPDIR)/cstd.Plo \ ./$(DEPDIR)/driver.Plo ./$(DEPDIR)/evolve.Plo \ ./$(DEPDIR)/msadams.Plo ./$(DEPDIR)/msbdf.Plo \ ./$(DEPDIR)/rk1imp.Plo ./$(DEPDIR)/rk2.Plo \ ./$(DEPDIR)/rk2imp.Plo ./$(DEPDIR)/rk4.Plo \ ./$(DEPDIR)/rk4imp.Plo ./$(DEPDIR)/rk8pd.Plo \ ./$(DEPDIR)/rkck.Plo ./$(DEPDIR)/rkf45.Plo \ ./$(DEPDIR)/step.Plo ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/control.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cscal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cstd.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/driver.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evolve.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msadams.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msbdf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk1imp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk2imp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk4.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk4imp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk8pd.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rkck.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rkf45.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/step.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/bsimp.Plo -rm -f ./$(DEPDIR)/control.Plo -rm -f ./$(DEPDIR)/cscal.Plo -rm -f ./$(DEPDIR)/cstd.Plo -rm -f ./$(DEPDIR)/driver.Plo -rm -f ./$(DEPDIR)/evolve.Plo -rm -f ./$(DEPDIR)/msadams.Plo -rm -f ./$(DEPDIR)/msbdf.Plo -rm -f ./$(DEPDIR)/rk1imp.Plo -rm -f ./$(DEPDIR)/rk2.Plo -rm -f ./$(DEPDIR)/rk2imp.Plo -rm -f ./$(DEPDIR)/rk4.Plo -rm -f ./$(DEPDIR)/rk4imp.Plo -rm -f ./$(DEPDIR)/rk8pd.Plo -rm -f ./$(DEPDIR)/rkck.Plo -rm -f ./$(DEPDIR)/rkf45.Plo -rm -f ./$(DEPDIR)/step.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/bsimp.Plo -rm -f ./$(DEPDIR)/control.Plo -rm -f ./$(DEPDIR)/cscal.Plo -rm -f ./$(DEPDIR)/cstd.Plo -rm -f ./$(DEPDIR)/driver.Plo -rm -f ./$(DEPDIR)/evolve.Plo -rm -f ./$(DEPDIR)/msadams.Plo -rm -f ./$(DEPDIR)/msbdf.Plo -rm -f ./$(DEPDIR)/rk1imp.Plo -rm -f ./$(DEPDIR)/rk2.Plo -rm -f ./$(DEPDIR)/rk2imp.Plo -rm -f ./$(DEPDIR)/rk4.Plo -rm -f ./$(DEPDIR)/rk4imp.Plo -rm -f ./$(DEPDIR)/rk8pd.Plo -rm -f ./$(DEPDIR)/rkck.Plo -rm -f ./$(DEPDIR)/rkf45.Plo -rm -f ./$(DEPDIR)/step.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/ode-initval2/ChangeLog0000644016036000116100000003177213373111456013313 000000000000002018-03-18 Tuomo Keskitalo * rk2imp.c and evolve.c: Added debug printouts, run indent -gnu -nut. Thanks for Dominic Steinitz for the additions! * test.c: Added identifiers to debug printouts. 2017-11-04 Tuomo Keskitalo * cscal.c: Corrected bug #52336 in cscal.c: Decreased maximum step length increase coefficient (now named maxscale) from 5.0 to 4.9 because value of 5.0 hits a singularity in msbdf stepper with order 3, causing a floating point exception. Thanks to Andrew Benson for reporting this bug! 2017-10-22 Tuomo Keskitalo * msadams.c: Corrected bug #52230 in msadams_apply, where solver crashed to order change -2 error. This could happen in a very rare case when two consecutive failed steps suggest decreasing order. Fix is to reset solver if that happens. Thanks for Michael Kaufman for reporting this bug and testing the fix! 2013-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-2.7.1/ode-initval2/TODO0000644016036000116100000000653713373111456012232 00000000000000* 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-2.7.1/ode-initval2/control.c0000644016036000116100000000553014002471425013351 00000000000000/* 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 ("driver pointer is null", GSL_EFAULT); } return GSL_SUCCESS; } gsl-2.7.1/ode-initval2/cstd.c0000644016036000116100000001220514002471676012633 00000000000000/* 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 ("errlev <= zero", GSL_ESANITY); } (void) ind; 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-2.7.1/ode-initval2/cscal.c0000644016036000116100000001262114002471512012752 00000000000000/* 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 maxscale */ double r = S / pow (rmax, 1.0 / (ord + 1.0)); const double maxscale = 4.9; if (r > maxscale) r = maxscale; 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 ("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-2.7.1/ode-initval2/evolve.c0000644016036000116100000002255214002472135013173 00000000000000/* 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; #ifdef DEBUG printf ("-- gsl_odeiv2_evolve_apply h0=%.5e\n", h0); #endif /* 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 { #ifdef DEBUG printf ("-- gsl_odeiv2_evolve_apply h0=%.5e, t0=%.5e, step_status=%d\n", h0, t0, step_status); #endif *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 ("driver pointer is null", GSL_EFAULT); } return GSL_SUCCESS; } gsl-2.7.1/ode-initval2/step.c0000644016036000116100000000503714002472336012650 00000000000000/* 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 ("driver pointer is null", GSL_EFAULT); } return GSL_SUCCESS; } gsl-2.7.1/ode-initval2/rk2.c0000644016036000116100000001236713373111456012402 00000000000000/* 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-2.7.1/ode-initval2/rk2imp.c0000644016036000116100000003353113373111456013104 00000000000000/* 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; #ifdef DEBUG { size_t di; printf ("rk2imp_apply: t=%.5e, h=%.5e, y:", t, h); for (di = 0; di < dim; di++) { printf ("%.5e ", y[di]); } printf ("\n"); } #endif /* 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 */ { #ifdef DEBUG printf ("-- evaluate jacobian\n"); #endif int s = GSL_ODEIV_JA_EVAL (sys, t, y, dfdy->data, dfdt); if (s != GSL_SUCCESS) { #ifdef DEBUG printf ("-- FAIL at jacobian function evaluation\n"); #endif return s; } #ifdef DEBUG size_t M; size_t N; size_t i; size_t j; M = dfdy->size1; N = dfdy->size2; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { double aij = gsl_matrix_get (dfdy, i, j); printf ("(%3lu,%3lu)[%lu,%lu]: %22.18g\n", M, N, i, j, aij); } } #endif } /* Calculate a single step with size h */ { int s = modnewton1_init ((void *) esol, A, h, dfdy, sys); if (s != GSL_SUCCESS) { return s; } #ifdef DEBUG size_t M; size_t N; size_t i; size_t j; printf ("-- modnewton1_init IhAJ:\n"); M = esol->IhAJ->size1; N = esol->IhAJ->size2; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { double aij = gsl_matrix_get (esol->IhAJ, i, j); printf ("(%3lu,%3lu)[%lu,%lu]: %22.18g\n", M, N, i, j, aij); } } printf ("-- modnewton1_init p:\n"); M = esol->p->size; for (i = 0; i < M; i++) { double pi = gsl_permutation_get (esol->p, i); printf ("(%3lu)[%lu]: %22.18g\n", M, i, pi); } #endif } { int s = modnewton1_solve ((void *) esol, A, c, t, h, y, sys, YZ, errlev); #ifdef DEBUG printf ("-- modnewton1_solve s=%d\n", s); #endif if (s != GSL_SUCCESS) { return s; } } #ifdef DEBUG { size_t di; printf ("YZ:"); for (di = 0; di < dim * RK2IMP_STAGE; di++) { printf ("%.5e ", YZ[di]); } printf ("\n"); } #endif { int s = GSL_ODEIV_FN_EVAL (sys, t + c[0] * h, YZ, fYZ); if (s != GSL_SUCCESS) { return s; } } #ifdef DEBUG { size_t di; printf ("fYZ:"); for (di = 0; di < dim * RK2IMP_STAGE; di++) { printf ("%.5e ", fYZ[di]); } printf ("\n"); } #endif { 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; } } #ifdef DEBUG { size_t i; printf ("-- error estimates: "); for (i = 0; i < dim; i++) { printf ("%.5e ", yerr[i]); } printf ("\n"); } #endif /* 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-2.7.1/ode-initval2/rk4.c0000644016036000116100000001662213373111456012402 00000000000000/* 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-2.7.1/ode-initval2/rk4imp.c0000644016036000116100000003113013373111456013077 00000000000000/* 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-2.7.1/ode-initval2/rkf45.c0000644016036000116100000002107413373111456012632 00000000000000/* 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-2.7.1/ode-initval2/rk8pd.c0000644016036000116100000002775313373111456012741 00000000000000/* 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-2.7.1/ode-initval2/rkck.c0000644016036000116100000002071313373111456012630 00000000000000/* 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-2.7.1/ode-initval2/bsimp.c0000644016036000116100000003316013373111456013010 00000000000000/* 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-2.7.1/ode-initval2/rk1imp.c0000644016036000116100000002741013373111456013102 00000000000000/* 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-2.7.1/ode-initval2/msadams.c0000644016036000116100000007715214002472226013327 00000000000000/* 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 } state->failcount++; { const size_t max_failcount = 3; /* If step is repeatedly rejected, then reset method */ 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 } /* Attempt to decrease order twice is indicative of system stiffness. Reset method to enable fast recovery. */ else if ((int)state->ordprev - (int)ord >= 2) { msadams_reset (vstate, dim); ord = state->ord; #ifdef DEBUG printf ("-- order decreased by two, 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 ("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-2.7.1/ode-initval2/msbdf.c0000644016036000116100000013103714002472305012764 00000000000000/* 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 ("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-2.7.1/ode-initval2/driver.c0000644016036000116100000002777614002472070013201 00000000000000/* 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 ("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 ("hmin <= fabs(h) <= hmax required", GSL_EINVAL); } if (hmax > 0.0 || hmax < 0.0) { d->hmax = fabs (hmax); } else { GSL_ERROR ("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 ("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 ("hmin <= fabs(h) <= hmax required", GSL_EINVAL); } if (hstart > 0.0 || hstart < 0.0) { d->h = hstart; } else { GSL_ERROR ("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-2.7.1/ode-initval2/test.c0000644016036000116100000016524013373111456012662 00000000000000/* 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 ("test_evolve_system at: %.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 ("sys_driver at: %.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 ("test_stepfn at: 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 ("test_stepfn2 at: 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-2.7.1/roots/0000755016036000116100000000000014151602577010464 500000000000000gsl-2.7.1/roots/Makefile.am0000644016036000116100000000077713373111456012447 00000000000000# -*-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-2.7.1/roots/roots.h0000644016036000116100000000240313135126237011715 00000000000000/* 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-2.7.1/roots/gsl_roots.h0000644016036000116100000000722013135126237012564 00000000000000/* 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-2.7.1/roots/Makefile.in0000644016036000116100000011071314151557215012452 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/bisection.Plo ./$(DEPDIR)/brent.Plo \ ./$(DEPDIR)/convergence.Plo ./$(DEPDIR)/falsepos.Plo \ ./$(DEPDIR)/fdfsolver.Plo ./$(DEPDIR)/fsolver.Plo \ ./$(DEPDIR)/newton.Plo ./$(DEPDIR)/secant.Plo \ ./$(DEPDIR)/steffenson.Plo ./$(DEPDIR)/test.Po \ ./$(DEPDIR)/test_funcs.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/brent.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/falsepos.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdfsolver.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsolver.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/newton.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/secant.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/steffenson.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_funcs.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/bisection.Plo -rm -f ./$(DEPDIR)/brent.Plo -rm -f ./$(DEPDIR)/convergence.Plo -rm -f ./$(DEPDIR)/falsepos.Plo -rm -f ./$(DEPDIR)/fdfsolver.Plo -rm -f ./$(DEPDIR)/fsolver.Plo -rm -f ./$(DEPDIR)/newton.Plo -rm -f ./$(DEPDIR)/secant.Plo -rm -f ./$(DEPDIR)/steffenson.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test_funcs.Po -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 -f ./$(DEPDIR)/bisection.Plo -rm -f ./$(DEPDIR)/brent.Plo -rm -f ./$(DEPDIR)/convergence.Plo -rm -f ./$(DEPDIR)/falsepos.Plo -rm -f ./$(DEPDIR)/fdfsolver.Plo -rm -f ./$(DEPDIR)/fsolver.Plo -rm -f ./$(DEPDIR)/newton.Plo -rm -f ./$(DEPDIR)/secant.Plo -rm -f ./$(DEPDIR)/steffenson.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test_funcs.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/roots/ChangeLog0000644016036000116100000001335713373111456012163 000000000000002009-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-2.7.1/roots/TODO0000644016036000116100000000064413373111456011074 00000000000000# -*- 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-2.7.1/roots/bisection.c0000644016036000116100000000660113135126237012525 00000000000000/* 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-2.7.1/roots/brent.c0000644016036000116100000001146513135126237011664 00000000000000/* 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-2.7.1/roots/falsepos.c0000644016036000116100000001106113135126237012356 00000000000000/* 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-2.7.1/roots/newton.c0000644016036000116100000000505413135126237012061 00000000000000/* 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-2.7.1/roots/secant.c0000644016036000116100000000560613373111456012030 00000000000000/* 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-2.7.1/roots/steffenson.c0000644016036000116100000000673013135126237012723 00000000000000/* 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-2.7.1/roots/convergence.c0000644016036000116100000000447013135126237013046 00000000000000/* 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-2.7.1/roots/fsolver.c0000644016036000116100000000512313373111456012225 00000000000000/* 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-2.7.1/roots/fdfsolver.c0000644016036000116100000000416413373111456012543 00000000000000/* 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-2.7.1/roots/test.c0000644016036000116100000002346513373111456011535 00000000000000/* 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-2.7.1/roots/test_funcs.c0000644016036000116100000001044713373111456012727 00000000000000/* 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-2.7.1/roots/test.h0000644016036000116100000000620113373111456011527 00000000000000/* 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-2.7.1/multiroots/0000755016036000116100000000000014151602577011537 500000000000000gsl-2.7.1/multiroots/Makefile.am0000644016036000116100000000137113373111456013511 00000000000000# -*-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-2.7.1/multiroots/enorm.c0000644016036000116100000000205313135126237012736 00000000000000/* 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-2.7.1/multiroots/dogleg.c0000644016036000116100000002255213135126237013065 00000000000000/* 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-2.7.1/multiroots/gsl_multiroots.h0000644016036000116100000001401013135126237014705 00000000000000/* 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-2.7.1/multiroots/Makefile.in0000644016036000116100000011222514151557215013525 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/broyden.Plo \ ./$(DEPDIR)/convergence.Plo ./$(DEPDIR)/dnewton.Plo \ ./$(DEPDIR)/fdfsolver.Plo ./$(DEPDIR)/fdjac.Plo \ ./$(DEPDIR)/fsolver.Plo ./$(DEPDIR)/gnewton.Plo \ ./$(DEPDIR)/hybrid.Plo ./$(DEPDIR)/hybridj.Plo \ ./$(DEPDIR)/newton.Plo ./$(DEPDIR)/test.Po \ ./$(DEPDIR)/test_funcs.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dnewton.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdfsolver.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdjac.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsolver.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnewton.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hybrid.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hybridj.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/newton.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_funcs.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/broyden.Plo -rm -f ./$(DEPDIR)/convergence.Plo -rm -f ./$(DEPDIR)/dnewton.Plo -rm -f ./$(DEPDIR)/fdfsolver.Plo -rm -f ./$(DEPDIR)/fdjac.Plo -rm -f ./$(DEPDIR)/fsolver.Plo -rm -f ./$(DEPDIR)/gnewton.Plo -rm -f ./$(DEPDIR)/hybrid.Plo -rm -f ./$(DEPDIR)/hybridj.Plo -rm -f ./$(DEPDIR)/newton.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test_funcs.Po -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 -f ./$(DEPDIR)/broyden.Plo -rm -f ./$(DEPDIR)/convergence.Plo -rm -f ./$(DEPDIR)/dnewton.Plo -rm -f ./$(DEPDIR)/fdfsolver.Plo -rm -f ./$(DEPDIR)/fdjac.Plo -rm -f ./$(DEPDIR)/fsolver.Plo -rm -f ./$(DEPDIR)/gnewton.Plo -rm -f ./$(DEPDIR)/hybrid.Plo -rm -f ./$(DEPDIR)/hybridj.Plo -rm -f ./$(DEPDIR)/newton.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test_funcs.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/multiroots/ChangeLog0000644016036000116100000001034213373111456013225 000000000000002011-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-2.7.1/multiroots/fdjac.c0000644016036000116100000000561213135126237012671 00000000000000/* 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-2.7.1/multiroots/fsolver.c0000644016036000116100000000754113373111456013306 00000000000000/* 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-2.7.1/multiroots/fdfsolver.c0000644016036000116100000001027213373111456013613 00000000000000/* 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-2.7.1/multiroots/convergence.c0000644016036000116100000000400113373111456014110 00000000000000/* 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-2.7.1/multiroots/newton.c0000644016036000116100000000727213373111456013141 00000000000000/* 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-2.7.1/multiroots/gnewton.c0000644016036000116100000001206113373111456013300 00000000000000/* 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-2.7.1/multiroots/dnewton.c0000644016036000116100000001047613135126237013304 00000000000000/* 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-2.7.1/multiroots/broyden.c0000644016036000116100000002331513135126237013264 00000000000000/* 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-2.7.1/multiroots/hybrid.c0000644016036000116100000003512413373111456013105 00000000000000/* 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-2.7.1/multiroots/hybridj.c0000644016036000116100000003364513373111456013265 00000000000000/* 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-2.7.1/multiroots/test.c0000644016036000116100000001560613135126237012605 00000000000000/* 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-2.7.1/multiroots/test_funcs.c0000644016036000116100000003755713135126237014014 00000000000000/* 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-2.7.1/multiroots/test_funcs.h0000644016036000116100000000705513135126237014007 00000000000000/* 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-2.7.1/min/0000755016036000116100000000000014151602577010101 500000000000000gsl-2.7.1/min/Makefile.am0000644016036000116100000000070113373111455012046 00000000000000noinst_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-2.7.1/min/min.h0000644016036000116100000000174313135126237010755 00000000000000/* 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-2.7.1/min/gsl_min.h0000644016036000116100000000770713373111455011630 00000000000000/* 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-2.7.1/min/Makefile.in0000644016036000116100000010744014151557214012071 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/bracketing.Plo ./$(DEPDIR)/brent.Plo \ ./$(DEPDIR)/convergence.Plo ./$(DEPDIR)/fsolver.Plo \ ./$(DEPDIR)/golden.Plo ./$(DEPDIR)/quad_golden.Plo \ ./$(DEPDIR)/test.Po ./$(DEPDIR)/test_funcs.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/brent.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsolver.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golden.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quad_golden.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_funcs.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/bracketing.Plo -rm -f ./$(DEPDIR)/brent.Plo -rm -f ./$(DEPDIR)/convergence.Plo -rm -f ./$(DEPDIR)/fsolver.Plo -rm -f ./$(DEPDIR)/golden.Plo -rm -f ./$(DEPDIR)/quad_golden.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test_funcs.Po -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 -f ./$(DEPDIR)/bracketing.Plo -rm -f ./$(DEPDIR)/brent.Plo -rm -f ./$(DEPDIR)/convergence.Plo -rm -f ./$(DEPDIR)/fsolver.Plo -rm -f ./$(DEPDIR)/golden.Plo -rm -f ./$(DEPDIR)/quad_golden.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test_funcs.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/min/ChangeLog0000644016036000116100000000602113373111455011565 000000000000002009-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-2.7.1/min/fsolver.c0000644016036000116100000001165013373111455011643 00000000000000/* 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-2.7.1/min/golden.c0000644016036000116100000000655513135126237011443 00000000000000/* 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-2.7.1/min/brent.c0000644016036000116100000001162213373111455011274 00000000000000/* 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-2.7.1/min/convergence.c0000644016036000116100000000332413135126237012460 00000000000000/* 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-2.7.1/min/bracketing.c0000644016036000116100000000775113135126237012303 00000000000000/* 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-2.7.1/min/quad_golden.c0000644016036000116100000002656713373111455012462 00000000000000/*----------------------------------------------------------------------------*/ /* */ /* 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-2.7.1/min/test.c0000644016036000116100000001443613373111455011147 00000000000000/* 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-2.7.1/min/test_funcs.c0000644016036000116100000000354513135126237012344 00000000000000/* 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-2.7.1/min/test.h0000644016036000116100000000306213135126237011145 00000000000000/* 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-2.7.1/multimin/0000755016036000116100000000000014151602577011154 500000000000000gsl-2.7.1/multimin/Makefile.am0000644016036000116100000000232613373111456013127 00000000000000noinst_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-2.7.1/multimin/directional_minimize.c0000644016036000116100000001325313373111456015436 00000000000000/* 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-2.7.1/multimin/linear_minimize.c0000644016036000116100000001415013135126237014407 00000000000000#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-2.7.1/multimin/linear_wrapper.c0000644016036000116100000000773413135126237014260 00000000000000typedef 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-2.7.1/multimin/gsl_multimin.h0000644016036000116100000001521313373111456013746 00000000000000/* 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-2.7.1/multimin/Makefile.in0000644016036000116100000011376514151557215013154 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/conjugate_fr.Plo \ ./$(DEPDIR)/conjugate_pr.Plo ./$(DEPDIR)/convergence.Plo \ ./$(DEPDIR)/diff.Plo ./$(DEPDIR)/fdfminimizer.Plo \ ./$(DEPDIR)/fminimizer.Plo ./$(DEPDIR)/simplex.Plo \ ./$(DEPDIR)/simplex2.Plo ./$(DEPDIR)/steepest_descent.Plo \ ./$(DEPDIR)/test.Po ./$(DEPDIR)/test_funcs.Po \ ./$(DEPDIR)/vector_bfgs.Plo ./$(DEPDIR)/vector_bfgs2.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conjugate_pr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diff.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdfminimizer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fminimizer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplex.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplex2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/steepest_descent.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_funcs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_bfgs.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_bfgs2.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/conjugate_fr.Plo -rm -f ./$(DEPDIR)/conjugate_pr.Plo -rm -f ./$(DEPDIR)/convergence.Plo -rm -f ./$(DEPDIR)/diff.Plo -rm -f ./$(DEPDIR)/fdfminimizer.Plo -rm -f ./$(DEPDIR)/fminimizer.Plo -rm -f ./$(DEPDIR)/simplex.Plo -rm -f ./$(DEPDIR)/simplex2.Plo -rm -f ./$(DEPDIR)/steepest_descent.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test_funcs.Po -rm -f ./$(DEPDIR)/vector_bfgs.Plo -rm -f ./$(DEPDIR)/vector_bfgs2.Plo -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 -f ./$(DEPDIR)/conjugate_fr.Plo -rm -f ./$(DEPDIR)/conjugate_pr.Plo -rm -f ./$(DEPDIR)/convergence.Plo -rm -f ./$(DEPDIR)/diff.Plo -rm -f ./$(DEPDIR)/fdfminimizer.Plo -rm -f ./$(DEPDIR)/fminimizer.Plo -rm -f ./$(DEPDIR)/simplex.Plo -rm -f ./$(DEPDIR)/simplex2.Plo -rm -f ./$(DEPDIR)/steepest_descent.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/test_funcs.Po -rm -f ./$(DEPDIR)/vector_bfgs.Plo -rm -f ./$(DEPDIR)/vector_bfgs2.Plo -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 am--depfiles 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 .PRECIOUS: Makefile #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-2.7.1/multimin/ChangeLog0000644016036000116100000001330313373111456012642 000000000000002010-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-2.7.1/multimin/TODO0000644016036000116100000000033613373111456011562 00000000000000# -*- 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-2.7.1/multimin/fdfminimizer.c0000644016036000116100000001014213373111456013715 00000000000000/* 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-2.7.1/multimin/steepest_descent.c0000644016036000116100000001015513373111456014577 00000000000000/* 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-2.7.1/multimin/conjugate_fr.c0000644016036000116100000001474013135126237013707 00000000000000/* 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-2.7.1/multimin/conjugate_pr.c0000644016036000116100000001523013135126237013714 00000000000000/* 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-2.7.1/multimin/convergence.c0000644016036000116100000000264613135126237013541 00000000000000/* 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-2.7.1/multimin/diff.c0000644016036000116100000000305613135126237012147 00000000000000/* 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-2.7.1/multimin/vector_bfgs.c0000644016036000116100000002074113135126237013542 00000000000000/* 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-2.7.1/multimin/vector_bfgs2.c0000644016036000116100000002033613373111456013625 00000000000000/* 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-2.7.1/multimin/fminimizer.c0000644016036000116100000000626013373111456013411 00000000000000/* 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-2.7.1/multimin/simplex.c0000644016036000116100000002605713373111456012727 00000000000000/* 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-2.7.1/multimin/simplex2.c0000644016036000116100000004142413373111456013004 00000000000000/* 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-2.7.1/multimin/test.c0000644016036000116100000001372013373111456012216 00000000000000/* 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-2.7.1/multimin/test_funcs.c0000644016036000116100000001713413373111456013417 00000000000000/* 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-2.7.1/multimin/test_funcs.h0000644016036000116100000000574513373111456013431 00000000000000/* 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-2.7.1/monte/0000755016036000116100000000000014151602577010440 500000000000000gsl-2.7.1/monte/Makefile.am0000644016036000116100000000131613373111455012410 00000000000000noinst_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-2.7.1/monte/test_main.c0000644016036000116100000000277413373111455012514 00000000000000for (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-2.7.1/monte/gsl_monte.h0000644016036000116100000000312613626554273012527 00000000000000/* 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__ #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 /* 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-2.7.1/monte/gsl_monte_vegas.h0000644016036000116100000000624213373111455013704 00000000000000/* 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-2.7.1/monte/gsl_monte_miser.h0000644016036000116100000000514613373111455013720 00000000000000/* 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-2.7.1/monte/gsl_monte_plain.h0000644016036000116100000000353413135126237013703 00000000000000/* 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-2.7.1/monte/Makefile.in0000644016036000116100000010640314151557214012426 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/miser.Plo ./$(DEPDIR)/plain.Plo \ ./$(DEPDIR)/test.Po ./$(DEPDIR)/vegas.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog README TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plain.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vegas.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/miser.Plo -rm -f ./$(DEPDIR)/plain.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/vegas.Plo -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 -f ./$(DEPDIR)/miser.Plo -rm -f ./$(DEPDIR)/plain.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/vegas.Plo -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 am--depfiles 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 .PRECIOUS: Makefile #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-2.7.1/monte/ChangeLog0000644016036000116100000001625113373111455012132 000000000000002009-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-2.7.1/monte/README0000644016036000116100000000302113135126237011227 00000000000000G. 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-2.7.1/monte/TODO0000644016036000116100000000230313373111455011041 00000000000000# -*- 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-2.7.1/monte/miser.c0000644016036000116100000004201613373111455011641 00000000000000/* 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-2.7.1/monte/plain.c0000644016036000116100000000656113373111455011632 00000000000000/* 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-2.7.1/monte/vegas.c0000644016036000116100000005507013373111455011633 00000000000000/* 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-2.7.1/monte/test.c0000644016036000116100000004010413373111455011475 00000000000000/* 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-2.7.1/ntuple/0000755016036000116100000000000014151602577010625 500000000000000gsl-2.7.1/ntuple/Makefile.am0000644016036000116100000000160713373111456012601 00000000000000noinst_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-2.7.1/ntuple/gsl_ntuple.h0000644016036000116100000000414513135126237013071 00000000000000/* 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-2.7.1/ntuple/Makefile.in0000644016036000116100000010620714151557215012616 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/ntuple.Plo ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/ntuple.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/ntuple.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/ntuple/ChangeLog0000644016036000116100000000042013373111456012307 000000000000002008-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-2.7.1/ntuple/ntuple.c0000644016036000116100000001047113135126237012216 00000000000000/* 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-2.7.1/ntuple/test.c0000644016036000116100000000677013373111456011676 00000000000000#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-2.7.1/diff/0000755016036000116100000000000014151602577010226 500000000000000gsl-2.7.1/diff/Makefile.am0000644016036000116100000000104713373111454012176 00000000000000noinst_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-2.7.1/diff/gsl_diff.h0000644016036000116100000000302613373111454012067 00000000000000/* 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-2.7.1/diff/Makefile.in0000644016036000116100000010526514151557214012221 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/diff.Plo ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/diff.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/diff.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile #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-2.7.1/diff/ChangeLog0000644016036000116100000000126313373111454011714 000000000000002008-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-2.7.1/diff/diff.c0000644016036000116100000001130113373111454011210 00000000000000/* 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-2.7.1/diff/test.c0000644016036000116100000001025513373111454011266 00000000000000/* 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-2.7.1/deriv/0000755016036000116100000000000014151602577010427 500000000000000gsl-2.7.1/deriv/Makefile.am0000644016036000116100000000105513373111454012376 00000000000000noinst_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-2.7.1/deriv/gsl_deriv.h0000644016036000116100000000303413135126237012471 00000000000000/* 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-2.7.1/deriv/Makefile.in0000644016036000116100000010532014151557214012412 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/deriv.Plo ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/deriv.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/deriv.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile #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-2.7.1/deriv/ChangeLog0000644016036000116100000000056513373111454012121 000000000000002008-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-2.7.1/deriv/deriv.c0000644016036000116100000001343013135126237011620 00000000000000/* 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-2.7.1/deriv/test.c0000644016036000116100000001105613135126237011470 00000000000000/* 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-2.7.1/cdf/0000755016036000116100000000000014151602577010052 500000000000000gsl-2.7.1/cdf/Makefile.am0000644016036000116100000000176313373111454012027 00000000000000## 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-2.7.1/cdf/beta_inc.c0000644016036000116100000001204213373111454011673 00000000000000/* 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-2.7.1/cdf/rat_eval.h0000644016036000116100000000055413135126237011737 00000000000000static 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-2.7.1/cdf/test_auto.c0000644016036000116100000036201013135126237012142 00000000000000void 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-2.7.1/cdf/error.h0000644016036000116100000000021413135126237011264 00000000000000/* 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-2.7.1/cdf/gsl_cdf.h0000644016036000116100000001631513373111454011544 00000000000000/* 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-2.7.1/cdf/Makefile.in0000644016036000116100000012575114151557213012046 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/beta.Plo ./$(DEPDIR)/betainv.Plo \ ./$(DEPDIR)/binomial.Plo ./$(DEPDIR)/cauchy.Plo \ ./$(DEPDIR)/cauchyinv.Plo ./$(DEPDIR)/chisq.Plo \ ./$(DEPDIR)/chisqinv.Plo ./$(DEPDIR)/exponential.Plo \ ./$(DEPDIR)/exponentialinv.Plo ./$(DEPDIR)/exppow.Plo \ ./$(DEPDIR)/fdist.Plo ./$(DEPDIR)/fdistinv.Plo \ ./$(DEPDIR)/flat.Plo ./$(DEPDIR)/flatinv.Plo \ ./$(DEPDIR)/gamma.Plo ./$(DEPDIR)/gammainv.Plo \ ./$(DEPDIR)/gauss.Plo ./$(DEPDIR)/gaussinv.Plo \ ./$(DEPDIR)/geometric.Plo ./$(DEPDIR)/gumbel1.Plo \ ./$(DEPDIR)/gumbel1inv.Plo ./$(DEPDIR)/gumbel2.Plo \ ./$(DEPDIR)/gumbel2inv.Plo ./$(DEPDIR)/hypergeometric.Plo \ ./$(DEPDIR)/laplace.Plo ./$(DEPDIR)/laplaceinv.Plo \ ./$(DEPDIR)/logistic.Plo ./$(DEPDIR)/logisticinv.Plo \ ./$(DEPDIR)/lognormal.Plo ./$(DEPDIR)/lognormalinv.Plo \ ./$(DEPDIR)/nbinomial.Plo ./$(DEPDIR)/pareto.Plo \ ./$(DEPDIR)/paretoinv.Plo ./$(DEPDIR)/pascal.Plo \ ./$(DEPDIR)/poisson.Plo ./$(DEPDIR)/rayleigh.Plo \ ./$(DEPDIR)/rayleighinv.Plo ./$(DEPDIR)/tdist.Plo \ ./$(DEPDIR)/tdistinv.Plo ./$(DEPDIR)/test.Po \ ./$(DEPDIR)/weibull.Plo ./$(DEPDIR)/weibullinv.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/betainv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binomial.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cauchy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cauchyinv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chisq.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chisqinv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exponential.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exponentialinv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exppow.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdist.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdistinv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flat.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flatinv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gamma.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gammainv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gauss.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaussinv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geometric.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gumbel1.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gumbel1inv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gumbel2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gumbel2inv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hypergeometric.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/laplace.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/laplaceinv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logistic.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logisticinv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lognormal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lognormalinv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nbinomial.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pareto.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paretoinv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pascal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poisson.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rayleigh.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rayleighinv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tdist.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tdistinv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/weibull.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/weibullinv.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/beta.Plo -rm -f ./$(DEPDIR)/betainv.Plo -rm -f ./$(DEPDIR)/binomial.Plo -rm -f ./$(DEPDIR)/cauchy.Plo -rm -f ./$(DEPDIR)/cauchyinv.Plo -rm -f ./$(DEPDIR)/chisq.Plo -rm -f ./$(DEPDIR)/chisqinv.Plo -rm -f ./$(DEPDIR)/exponential.Plo -rm -f ./$(DEPDIR)/exponentialinv.Plo -rm -f ./$(DEPDIR)/exppow.Plo -rm -f ./$(DEPDIR)/fdist.Plo -rm -f ./$(DEPDIR)/fdistinv.Plo -rm -f ./$(DEPDIR)/flat.Plo -rm -f ./$(DEPDIR)/flatinv.Plo -rm -f ./$(DEPDIR)/gamma.Plo -rm -f ./$(DEPDIR)/gammainv.Plo -rm -f ./$(DEPDIR)/gauss.Plo -rm -f ./$(DEPDIR)/gaussinv.Plo -rm -f ./$(DEPDIR)/geometric.Plo -rm -f ./$(DEPDIR)/gumbel1.Plo -rm -f ./$(DEPDIR)/gumbel1inv.Plo -rm -f ./$(DEPDIR)/gumbel2.Plo -rm -f ./$(DEPDIR)/gumbel2inv.Plo -rm -f ./$(DEPDIR)/hypergeometric.Plo -rm -f ./$(DEPDIR)/laplace.Plo -rm -f ./$(DEPDIR)/laplaceinv.Plo -rm -f ./$(DEPDIR)/logistic.Plo -rm -f ./$(DEPDIR)/logisticinv.Plo -rm -f ./$(DEPDIR)/lognormal.Plo -rm -f ./$(DEPDIR)/lognormalinv.Plo -rm -f ./$(DEPDIR)/nbinomial.Plo -rm -f ./$(DEPDIR)/pareto.Plo -rm -f ./$(DEPDIR)/paretoinv.Plo -rm -f ./$(DEPDIR)/pascal.Plo -rm -f ./$(DEPDIR)/poisson.Plo -rm -f ./$(DEPDIR)/rayleigh.Plo -rm -f ./$(DEPDIR)/rayleighinv.Plo -rm -f ./$(DEPDIR)/tdist.Plo -rm -f ./$(DEPDIR)/tdistinv.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/weibull.Plo -rm -f ./$(DEPDIR)/weibullinv.Plo -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 -f ./$(DEPDIR)/beta.Plo -rm -f ./$(DEPDIR)/betainv.Plo -rm -f ./$(DEPDIR)/binomial.Plo -rm -f ./$(DEPDIR)/cauchy.Plo -rm -f ./$(DEPDIR)/cauchyinv.Plo -rm -f ./$(DEPDIR)/chisq.Plo -rm -f ./$(DEPDIR)/chisqinv.Plo -rm -f ./$(DEPDIR)/exponential.Plo -rm -f ./$(DEPDIR)/exponentialinv.Plo -rm -f ./$(DEPDIR)/exppow.Plo -rm -f ./$(DEPDIR)/fdist.Plo -rm -f ./$(DEPDIR)/fdistinv.Plo -rm -f ./$(DEPDIR)/flat.Plo -rm -f ./$(DEPDIR)/flatinv.Plo -rm -f ./$(DEPDIR)/gamma.Plo -rm -f ./$(DEPDIR)/gammainv.Plo -rm -f ./$(DEPDIR)/gauss.Plo -rm -f ./$(DEPDIR)/gaussinv.Plo -rm -f ./$(DEPDIR)/geometric.Plo -rm -f ./$(DEPDIR)/gumbel1.Plo -rm -f ./$(DEPDIR)/gumbel1inv.Plo -rm -f ./$(DEPDIR)/gumbel2.Plo -rm -f ./$(DEPDIR)/gumbel2inv.Plo -rm -f ./$(DEPDIR)/hypergeometric.Plo -rm -f ./$(DEPDIR)/laplace.Plo -rm -f ./$(DEPDIR)/laplaceinv.Plo -rm -f ./$(DEPDIR)/logistic.Plo -rm -f ./$(DEPDIR)/logisticinv.Plo -rm -f ./$(DEPDIR)/lognormal.Plo -rm -f ./$(DEPDIR)/lognormalinv.Plo -rm -f ./$(DEPDIR)/nbinomial.Plo -rm -f ./$(DEPDIR)/pareto.Plo -rm -f ./$(DEPDIR)/paretoinv.Plo -rm -f ./$(DEPDIR)/pascal.Plo -rm -f ./$(DEPDIR)/poisson.Plo -rm -f ./$(DEPDIR)/rayleigh.Plo -rm -f ./$(DEPDIR)/rayleighinv.Plo -rm -f ./$(DEPDIR)/tdist.Plo -rm -f ./$(DEPDIR)/tdistinv.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/weibull.Plo -rm -f ./$(DEPDIR)/weibullinv.Plo -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/cdf/ChangeLog0000644016036000116100000000773513373111454011552 000000000000002009-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-2.7.1/cdf/TODO0000644016036000116100000000257413373111454010464 00000000000000# -*- 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-2.7.1/cdf/beta.c0000644016036000116100000000260713373111454011050 00000000000000/* 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-2.7.1/cdf/betainv.c0000644016036000116100000001126413373111454011564 00000000000000/* 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-2.7.1/cdf/cauchy.c0000644016036000116100000000243613135126237011412 00000000000000/* 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-2.7.1/cdf/cauchyinv.c0000644016036000116100000000275413135126237012132 00000000000000/* 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-2.7.1/cdf/chisq.c0000644016036000116100000000206513373111454011242 00000000000000/* 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-2.7.1/cdf/chisqinv.c0000644016036000116100000000210013373111454011745 00000000000000/* 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-2.7.1/cdf/exponential.c0000644016036000116100000000250113135126237012455 00000000000000/* 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-2.7.1/cdf/exponentialinv.c0000644016036000116100000000213113135126237013171 00000000000000/* 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-2.7.1/cdf/exppow.c0000644016036000116100000000345113135126237011456 00000000000000/* 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-2.7.1/cdf/fdist.c0000644016036000116100000000340613373111454011244 00000000000000/* 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-2.7.1/cdf/fdistinv.c0000644016036000116100000000431713373111454011763 00000000000000/* 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-2.7.1/cdf/flat.c0000644016036000116100000000245613135126237011066 00000000000000/* 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-2.7.1/cdf/flatinv.c0000644016036000116100000000240713135126237011577 00000000000000/* 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-2.7.1/cdf/gamma.c0000644016036000116100000000276113373111454011220 00000000000000/* 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-2.7.1/cdf/gammainv.c0000644016036000116100000001055013373111454011730 00000000000000/* 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-2.7.1/cdf/gauss.c0000644016036000116100000001577013373111454011264 00000000000000/* 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-2.7.1/cdf/gaussinv.c0000644016036000116100000001004613373111454011770 00000000000000/* 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-2.7.1/cdf/gumbel1.c0000644016036000116100000000241613373111454011467 00000000000000/* 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-2.7.1/cdf/gumbel1inv.c0000644016036000116100000000254513135126237012210 00000000000000/* 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-2.7.1/cdf/gumbel2.c0000644016036000116100000000244213135126237011470 00000000000000/* 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-2.7.1/cdf/gumbel2inv.c0000644016036000116100000000253513135126237012210 00000000000000/* 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-2.7.1/cdf/laplace.c0000644016036000116100000000242513135126237011535 00000000000000/* 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-2.7.1/cdf/laplaceinv.c0000644016036000116100000000272013135126237012250 00000000000000/* 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-2.7.1/cdf/logistic.c0000644016036000116100000000245113135126237011750 00000000000000/* 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-2.7.1/cdf/logisticinv.c0000644016036000116100000000247513135126237012473 00000000000000/* 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-2.7.1/cdf/lognormal.c0000644016036000116100000000232313135126237012123 00000000000000/* 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-2.7.1/cdf/lognormalinv.c0000644016036000116100000000267013135126237012645 00000000000000/* 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-2.7.1/cdf/pareto.c0000644016036000116100000000234313135126237011425 00000000000000/* 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-2.7.1/cdf/paretoinv.c0000644016036000116100000000251613135126237012144 00000000000000/* 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-2.7.1/cdf/rayleigh.c0000644016036000116100000000217113135126237011736 00000000000000/* 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-2.7.1/cdf/rayleighinv.c0000644016036000116100000000253413135126237012456 00000000000000/* 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-2.7.1/cdf/tdist.c0000644016036000116100000001313213373111454011257 00000000000000/* 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-2.7.1/cdf/tdistinv.c0000644016036000116100000001206013373111454011773 00000000000000/* 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-2.7.1/cdf/weibull.c0000644016036000116100000000215213135126237011574 00000000000000/* 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-2.7.1/cdf/weibullinv.c0000644016036000116100000000253113135126237012312 00000000000000/* 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-2.7.1/cdf/binomial.c0000644016036000116100000000472413135126237011732 00000000000000/* 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-2.7.1/cdf/poisson.c0000644016036000116100000000357613373111454011635 00000000000000/* 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-2.7.1/cdf/geometric.c0000644016036000116100000000337713373111454012120 00000000000000/* 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-2.7.1/cdf/nbinomial.c0000644016036000116100000000342413373111454012103 00000000000000/* 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-2.7.1/cdf/pascal.c0000644016036000116100000000240113135126237011371 00000000000000/* 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-2.7.1/cdf/hypergeometric.c0000644016036000116100000001021613373111454013156 00000000000000/* 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-2.7.1/cdf/test.c0000644016036000116100000021355313373111454011120 00000000000000/* 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-2.7.1/wavelet/0000755016036000116100000000000014151602577010765 500000000000000gsl-2.7.1/wavelet/Makefile.am0000644016036000116100000000103513517226736012744 00000000000000noinst_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 ../matrix/libgslmatrix.la ../vector/libgslvector.la ../blas/libgslblas.la ../cblas/libgslcblas.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-2.7.1/wavelet/gsl_wavelet.h0000644016036000116100000000574313373111456013377 00000000000000/* 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-2.7.1/wavelet/gsl_wavelet2d.h0000644016036000116100000001012713135126237013614 00000000000000/* 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-2.7.1/wavelet/Makefile.in0000644016036000116100000010711514151557216012756 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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 ../matrix/libgslmatrix.la \ ../vector/libgslvector.la ../blas/libgslblas.la \ ../cblas/libgslcblas.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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/bspline.Plo \ ./$(DEPDIR)/daubechies.Plo ./$(DEPDIR)/dwt.Plo \ ./$(DEPDIR)/haar.Plo ./$(DEPDIR)/test.Po \ ./$(DEPDIR)/wavelet.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 ../matrix/libgslmatrix.la ../vector/libgslvector.la ../blas/libgslblas.la ../cblas/libgslcblas.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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/daubechies.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwt.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/haar.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wavelet.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/bspline.Plo -rm -f ./$(DEPDIR)/daubechies.Plo -rm -f ./$(DEPDIR)/dwt.Plo -rm -f ./$(DEPDIR)/haar.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/wavelet.Plo -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 -f ./$(DEPDIR)/bspline.Plo -rm -f ./$(DEPDIR)/daubechies.Plo -rm -f ./$(DEPDIR)/dwt.Plo -rm -f ./$(DEPDIR)/haar.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/wavelet.Plo -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/wavelet/ChangeLog0000644016036000116100000000171013373111456012452 000000000000002009-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-2.7.1/wavelet/TODO0000644016036000116100000000076213373111456011376 00000000000000# -*- 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-2.7.1/wavelet/dwt.c0000644016036000116100000002512113373111456011644 00000000000000/* 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-2.7.1/wavelet/wavelet.c0000644016036000116100000000613313373111456012517 00000000000000/* 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-2.7.1/wavelet/bspline.c0000644016036000116100000003674613135126237012520 00000000000000/* 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-2.7.1/wavelet/daubechies.c0000644016036000116100000003000413135126237013135 00000000000000/* 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-2.7.1/wavelet/haar.c0000644016036000116100000000373013135126237011762 00000000000000/* 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-2.7.1/wavelet/test.c0000644016036000116100000001466513373111456012040 00000000000000#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-2.7.1/bspline/0000755016036000116100000000000014151602577010752 500000000000000gsl-2.7.1/bspline/Makefile.am0000644016036000116100000000121314151556700012717 00000000000000noinst_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-2.7.1/bspline/bspline.h0000644016036000116100000000140214151556700012470 00000000000000static 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-2.7.1/bspline/gsl_bspline.h0000644016036000116100000000662114151556700013345 00000000000000/* 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; 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-2.7.1/bspline/Makefile.in0000644016036000116100000010646114151557213012743 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/bspline.Plo ./$(DEPDIR)/greville.Plo \ ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver \ ChangeLog TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/greville.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/bspline.Plo -rm -f ./$(DEPDIR)/greville.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/bspline.Plo -rm -f ./$(DEPDIR)/greville.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/bspline/ChangeLog0000644016036000116100000000300513373111454012434 000000000000002011-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-2.7.1/bspline/TODO0000644016036000116100000000037714151556700011365 00000000000000# -*- 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-2.7.1/bspline/bspline.c0000644016036000116100000006701514151556700012477 00000000000000/* 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() */ /* 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; } /******************************************************************** * 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; } /* 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; } gsl-2.7.1/bspline/greville.c0000644016036000116100000001370714151556700012653 00000000000000/* 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-2.7.1/bspline/test.c0000644016036000116100000004440214151556700012015 00000000000000/* 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-2.7.1/spblas/0000755016036000116100000000000014151602577010602 500000000000000gsl-2.7.1/spblas/Makefile.am0000644016036000116100000000102213377336121012547 00000000000000noinst_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 ../bst/libgslbst.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-2.7.1/spblas/gsl_spblas.h0000644016036000116100000000341313377336121013023 00000000000000/* 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, int *w, double *x, const int mark, gsl_spmatrix *C, size_t nz); __END_DECLS #endif /* __GSL_SPBLAS_H__ */ gsl-2.7.1/spblas/Makefile.in0000644016036000116100000010602514151557215012571 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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 \ ../bst/libgslbst.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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/spdgemm.Plo ./$(DEPDIR)/spdgemv.Plo \ ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 ../bst/libgslbst.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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spdgemv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/spdgemm.Plo -rm -f ./$(DEPDIR)/spdgemv.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/spdgemm.Plo -rm -f ./$(DEPDIR)/spdgemv.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/spblas/spdgemm.c0000644016036000116100000001230013377336121012314 00000000000000/* 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; int *Bi = B->i; int *Bp = B->p; double *Bd = B->data; int *w = A->work.work_int; /* workspace of length M */ double *x = C->work.work_atomic; /* workspace of length M */ int *Cp, *Ci; double *Cd; size_t j; int 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, (int) (j + 1), C, nz); } for (p = Cp[j]; p < (int) 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, int *w, double *x, const int mark, gsl_spmatrix *C, size_t nz) { int p; int *Ai = A->i; int *Ap = A->p; double *Ad = A->data; int *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-2.7.1/spblas/spdgemv.c0000644016036000116100000001010213377336121012323 00000000000000/* 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; size_t incX, incY; size_t lenX, lenY; double *X, *Y; double *Ad; int *Ap, *Ai, *Aj; int p; 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 < (int) 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-2.7.1/spblas/test.c0000644016036000116100000001620213373111456011642 00000000000000/* 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-2.7.1/spmatrix/0000755016036000116100000000000014151602577011165 500000000000000gsl-2.7.1/spmatrix/Makefile.am0000644016036000116100000000214713521374466013150 00000000000000noinst_LTLIBRARIES = libgslspmatrix.la check_PROGRAMS = test pkginclude_HEADERS = gsl_spmatrix.h gsl_spmatrix_char.h gsl_spmatrix_double.h gsl_spmatrix_float.h gsl_spmatrix_int.h gsl_spmatrix_long_double.h gsl_spmatrix_long.h gsl_spmatrix_short.h gsl_spmatrix_uchar.h gsl_spmatrix_uint.h gsl_spmatrix_ulong.h gsl_spmatrix_ushort.h gsl_spmatrix_complex_float.h gsl_spmatrix_complex_double.h gsl_spmatrix_complex_long_double.h libgslspmatrix_la_SOURCES = compress.c copy.c file.c getset.c init.c minmax.c oper.c prop.c util.c swap.c AM_CPPFLAGS = -I$(top_srcdir) noinst_HEADERS = compress_source.c copy_source.c file_source.c getset_source.c getset_complex_source.c init_source.c minmax_source.c oper_source.c oper_complex_source.c prop_source.c swap_source.c test_source.c test_complex_source.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslspmatrix.la ../bst/libgslbst.la ../test/libgsltest.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../block/libgslblock.la ../sys/libgslsys.la ../err/libgslerr.la ../utils/libutils.la ../rng/libgslrng.la gsl-2.7.1/spmatrix/compress_source.c0000644016036000116100000001455513377620266014502 00000000000000/* spmatrix/compress_source.c * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018 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. */ /* gsl_spmatrix_csc() 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) */ int FUNCTION (gsl_spmatrix, csc) (TYPE (gsl_spmatrix) * dest, const TYPE (gsl_spmatrix) * src) { if (!GSL_SPMATRIX_ISCOO(src)) { GSL_ERROR_NULL("input matrix must be in COO format", GSL_EINVAL); } else if (!GSL_SPMATRIX_ISCSC(dest)) { GSL_ERROR_NULL("output matrix must be in CSC format", GSL_EINVAL); } else if (src->size1 != dest->size1 || src->size2 != dest->size2) { GSL_ERROR("matrices must have same dimensions", GSL_EBADLEN); } else { int status; const int *Tj = src->p; /* column indices of triplet matrix */ int *Cp; /* column pointers of compressed column matrix */ int *w; /* copy of column pointers */ size_t n, r; if (dest->nzmax < src->nz) { status = FUNCTION (gsl_spmatrix, realloc) (src->nz, dest); if (status) return status; } Cp = dest->p; /* initialize column pointers to 0 */ for (n = 0; n < dest->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 < src->nz; ++n) Cp[Tj[n]]++; /* compute column pointers: p[j] = p[j-1] + nnz[j-1] */ gsl_spmatrix_cumsum(dest->size2, Cp); /* make a copy of the column pointers */ w = dest->work.work_int; for (n = 0; n < dest->size2; ++n) w[n] = Cp[n]; /* transfer data from triplet format to CSC */ for (n = 0; n < src->nz; ++n) { int k = w[Tj[n]]++; dest->i[k] = src->i[n]; for (r = 0; r < MULTIPLICITY; ++r) dest->data[MULTIPLICITY * k + r] = src->data[MULTIPLICITY * n + r]; } dest->nz = src->nz; return GSL_SUCCESS; } } /* XXX deprecated function */ TYPE (gsl_spmatrix) * FUNCTION (gsl_spmatrix, compcol) (const TYPE (gsl_spmatrix) * src) { return FUNCTION (gsl_spmatrix, ccs) (src); } /* XXX deprecated function */ TYPE (gsl_spmatrix) * FUNCTION (gsl_spmatrix, ccs) (const TYPE (gsl_spmatrix) * src) { TYPE (gsl_spmatrix) * dest = FUNCTION (gsl_spmatrix, alloc_nzmax) (src->size1, src->size2, src->nz, GSL_SPMATRIX_CSC); FUNCTION (gsl_spmatrix, csc) (dest, src); return dest; } /* gsl_spmatrix_csr() Create a sparse matrix in compressed row format Inputs: dest - (output) sparse matrix in CSR format src - sparse matrix in triplet format Return: success/error */ int FUNCTION (gsl_spmatrix, csr) (TYPE (gsl_spmatrix) * dest, const TYPE (gsl_spmatrix) * src) { if (!GSL_SPMATRIX_ISCOO(src)) { GSL_ERROR("input matrix must be in COO format", GSL_EINVAL); } else if (!GSL_SPMATRIX_ISCSR(dest)) { GSL_ERROR("output matrix must be in CSR format", GSL_EINVAL); } else if (src->size1 != dest->size1 || src->size2 != dest->size2) { GSL_ERROR("matrices must have same dimensions", GSL_EBADLEN); } else { int status; const int *Ti = src->i; /* row indices of triplet matrix */ int *Cp; /* row pointers of compressed row matrix */ int *w; /* copy of column pointers */ size_t n, r; if (dest->nzmax < src->nz) { status = FUNCTION (gsl_spmatrix, realloc) (src->nz, dest); if (status) return status; } Cp = dest->p; /* initialize row pointers to 0 */ for (n = 0; n < dest->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 < src->nz; ++n) Cp[Ti[n]]++; /* compute row pointers: p[i] = p[i-1] + nnz[i-1] */ gsl_spmatrix_cumsum(dest->size1, Cp); /* make a copy of the row pointers */ w = dest->work.work_int; for (n = 0; n < dest->size1; ++n) w[n] = Cp[n]; /* transfer data from triplet format to CSR */ for (n = 0; n < src->nz; ++n) { int k = w[Ti[n]]++; dest->i[k] = src->p[n]; for (r = 0; r < MULTIPLICITY; ++r) dest->data[MULTIPLICITY * k + r] = src->data[MULTIPLICITY * n + r]; } dest->nz = src->nz; return GSL_SUCCESS; } } /* XXX deprecated function */ TYPE (gsl_spmatrix) * FUNCTION (gsl_spmatrix, crs) (const TYPE (gsl_spmatrix) * src) { TYPE (gsl_spmatrix) * dest = FUNCTION (gsl_spmatrix, alloc_nzmax) (src->size1, src->size2, src->nz, GSL_SPMATRIX_CSR); FUNCTION (gsl_spmatrix, csr) (dest, src); return dest; } TYPE (gsl_spmatrix) * FUNCTION (gsl_spmatrix, compress) (const TYPE (gsl_spmatrix) * src, const int sptype) { int status = GSL_SUCCESS; TYPE (gsl_spmatrix) * dest = FUNCTION (gsl_spmatrix, alloc_nzmax) (src->size1, src->size2, src->nz, sptype); if (dest == NULL) return NULL; if (sptype == GSL_SPMATRIX_CSC) { status = FUNCTION (gsl_spmatrix, csc) (dest, src); } else if (sptype == GSL_SPMATRIX_CSR) { status = FUNCTION (gsl_spmatrix, csr) (dest, src); } else if (sptype == GSL_SPMATRIX_COO) { /* make a copy of src */ status = FUNCTION (gsl_spmatrix, memcpy) (dest, src); } else { status = GSL_EINVAL; GSL_ERROR_NULL ("unknown sparse matrix format", status); } if (status != GSL_SUCCESS) { FUNCTION (gsl_spmatrix, free) (dest); return NULL; } return dest; } gsl-2.7.1/spmatrix/copy_source.c0000644016036000116100000000606613377336121013611 00000000000000/* spmatrix/copy_source.c * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018 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. */ int FUNCTION (gsl_spmatrix, memcpy) (TYPE (gsl_spmatrix) * dest, const TYPE (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 status = GSL_SUCCESS; size_t n, r; if (dest->nzmax < src->nz) { status = FUNCTION (gsl_spmatrix, realloc) (src->nz, dest); if (status) return status; } /* copy src arrays to dest */ if (GSL_SPMATRIX_ISCOO(src)) { void *ptr; for (n = 0; n < src->nz; ++n) { dest->i[n] = src->i[n]; dest->p[n] = src->p[n]; for (r = 0; r < MULTIPLICITY; ++r) dest->data[MULTIPLICITY * n + r] = src->data[MULTIPLICITY * n + r]; /* copy binary tree data */ ptr = gsl_bst_insert(&dest->data[MULTIPLICITY * n], dest->tree); if (ptr != NULL) { GSL_ERROR("detected duplicate entry", GSL_EINVAL); } } } else if (GSL_SPMATRIX_ISCSC(src)) { for (n = 0; n < src->nz; ++n) { dest->i[n] = src->i[n]; for (r = 0; r < MULTIPLICITY; ++r) dest->data[MULTIPLICITY * n + r] = src->data[MULTIPLICITY * n + r]; } for (n = 0; n < src->size2 + 1; ++n) { dest->p[n] = src->p[n]; } } else if (GSL_SPMATRIX_ISCSR(src)) { for (n = 0; n < src->nz; ++n) { dest->i[n] = src->i[n]; for (r = 0; r < MULTIPLICITY; ++r) dest->data[MULTIPLICITY * n + r] = src->data[MULTIPLICITY * n + r]; } 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 status; } } gsl-2.7.1/spmatrix/file_source.c0000644016036000116100000002670613377336121013561 00000000000000/* spmatrix/file_source.c * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018 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. */ /* 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 FUNCTION (gsl_spmatrix, fprintf) (FILE * stream, const TYPE (gsl_spmatrix) * m, const char * format) { int status; /* print header */ #if defined(BASE_GSL_COMPLEX_LONG) || defined(BASE_GSL_COMPLEX) || defined(BASE_GSL_COMPLEX_FLOAT) status = fprintf(stream, "%%%%MatrixMarket matrix coordinate complex general\n"); #else status = fprintf(stream, "%%%%MatrixMarket matrix coordinate real general\n"); #endif 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_ISCOO(m)) { size_t n; for (n = 0; n < m->nz; ++n) { status = fprintf(stream, "%d\t%d\t", m->i[n] + 1, m->p[n] + 1); if (status < 0) { GSL_ERROR("fprintf failed", GSL_EFAILED); } status = fprintf(stream, format, m->data[MULTIPLICITY * n]); if (status < 0) { GSL_ERROR("fprintf failed", GSL_EFAILED); } #if defined(BASE_GSL_COMPLEX_LONG) || defined(BASE_GSL_COMPLEX) || defined(BASE_GSL_COMPLEX_FLOAT) status = putc('\t', stream); if (status == EOF) { GSL_ERROR("putc failed", GSL_EFAILED); } status = fprintf(stream, format, m->data[MULTIPLICITY * n + 1]); if (status < 0) { GSL_ERROR("fprintf failed", GSL_EFAILED); } #endif status = putc('\n', stream); if (status == EOF) { GSL_ERROR("putc failed", GSL_EFAILED); } } } else if (GSL_SPMATRIX_ISCSC(m)) { size_t j; int p; for (j = 0; j < m->size2; ++j) { for (p = m->p[j]; p < m->p[j + 1]; ++p) { status = fprintf(stream, "%d\t%u\t", m->i[p] + 1, (unsigned int) (j + 1)); if (status < 0) { GSL_ERROR("fprintf failed", GSL_EFAILED); } status = fprintf(stream, format, m->data[MULTIPLICITY * p]); if (status < 0) { GSL_ERROR("fprintf failed", GSL_EFAILED); } #if defined(BASE_GSL_COMPLEX_LONG) || defined(BASE_GSL_COMPLEX) || defined(BASE_GSL_COMPLEX_FLOAT) status = putc('\t', stream); if (status == EOF) { GSL_ERROR("putc failed", GSL_EFAILED); } status = fprintf(stream, format, m->data[MULTIPLICITY * p + 1]); if (status < 0) { GSL_ERROR("fprintf failed", GSL_EFAILED); } #endif status = putc('\n', stream); if (status == EOF) { GSL_ERROR("putc failed", GSL_EFAILED); } } } } else if (GSL_SPMATRIX_ISCSR(m)) { size_t i; int p; for (i = 0; i < m->size1; ++i) { for (p = m->p[i]; p < m->p[i + 1]; ++p) { status = fprintf(stream, "%u\t%d\t", (unsigned int) (i + 1), m->i[p] + 1); if (status < 0) { GSL_ERROR("fprintf failed", GSL_EFAILED); } status = fprintf(stream, format, m->data[MULTIPLICITY * p]); if (status < 0) { GSL_ERROR("fprintf failed", GSL_EFAILED); } #if defined(BASE_GSL_COMPLEX_LONG) || defined(BASE_GSL_COMPLEX) || defined(BASE_GSL_COMPLEX_FLOAT) status = putc('\t', stream); if (status == EOF) { GSL_ERROR("putc failed", GSL_EFAILED); } status = fprintf(stream, format, m->data[MULTIPLICITY * p + 1]); if (status < 0) { GSL_ERROR("fprintf failed", GSL_EFAILED); } #endif 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; } TYPE (gsl_spmatrix) * FUNCTION (gsl_spmatrix, fscanf) (FILE * stream) { TYPE (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 = FUNCTION (gsl_spmatrix, alloc_nzmax) ((size_t) size1, (size_t) size2, (size_t) nz, GSL_SPMATRIX_COO); if (!m) { GSL_ERROR_NULL ("error allocating m", GSL_ENOMEM); } #if defined(BASE_GSL_COMPLEX_LONG) || defined(BASE_GSL_COMPLEX) || defined(BASE_GSL_COMPLEX_FLOAT) { unsigned int i, j; ATOMIC_IO xr, xi; BASE x; while (fgets(buf, 1024, stream) != NULL) { int c = sscanf(buf, "%u %u " IN_FORMAT " " IN_FORMAT, &i, &j, &xr, &xi); if (c < 4 || 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_REAL(x) = xr; GSL_IMAG(x) = xi; FUNCTION (gsl_spmatrix, set) (m, i - 1, j - 1, x); } } } #else { unsigned int i, j; ATOMIC_IO tmp; while (fgets(buf, 1024, stream) != NULL) { int c = sscanf(buf, "%u %u " IN_FORMAT, &i, &j, &tmp); 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 */ FUNCTION (gsl_spmatrix, set) (m, i - 1, j - 1, tmp); } } } #endif return m; } int FUNCTION (gsl_spmatrix, fwrite) (FILE * stream, const TYPE (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(int), m->nz, stream); if (items != m->nz) { GSL_ERROR("fwrite failed on row indices", GSL_EFAILED); } items = fwrite(m->data, MULTIPLICITY * sizeof(ATOMIC), m->nz, stream); if (items != m->nz) { GSL_ERROR("fwrite failed on data", GSL_EFAILED); } if (GSL_SPMATRIX_ISCOO(m)) { items = fwrite(m->p, sizeof(int), m->nz, stream); if (items != m->nz) { GSL_ERROR("fwrite failed on column indices", GSL_EFAILED); } } else if (GSL_SPMATRIX_ISCSC(m)) { items = fwrite(m->p, sizeof(int), m->size2 + 1, stream); if (items != m->size2 + 1) { GSL_ERROR("fwrite failed on column indices", GSL_EFAILED); } } else if (GSL_SPMATRIX_ISCSR(m)) { items = fwrite(m->p, sizeof(int), m->size1 + 1, stream); if (items != m->size1 + 1) { GSL_ERROR("fwrite failed on column indices", GSL_EFAILED); } } return GSL_SUCCESS; } int FUNCTION (gsl_spmatrix, fread) (FILE * stream, TYPE (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(int), nz, stream); if (items != nz) { GSL_ERROR("fread failed on row indices", GSL_EFAILED); } items = fread(m->data, MULTIPLICITY * sizeof(ATOMIC), nz, stream); if (items != nz) { GSL_ERROR("fread failed on data", GSL_EFAILED); } m->nz = nz; if (GSL_SPMATRIX_ISCOO(m)) { items = fread(m->p, sizeof(int), nz, stream); if (items != nz) { GSL_ERROR("fread failed on column indices", GSL_EFAILED); } /* build binary search tree for m */ FUNCTION (gsl_spmatrix, tree_rebuild) (m); } else if (GSL_SPMATRIX_ISCSC(m)) { items = fread(m->p, sizeof(int), size2 + 1, stream); if (items != size2 + 1) { GSL_ERROR("fread failed on row pointers", GSL_EFAILED); } } else if (GSL_SPMATRIX_ISCSR(m)) { items = fread(m->p, sizeof(int), size1 + 1, stream); if (items != size1 + 1) { GSL_ERROR("fread failed on column pointers", GSL_EFAILED); } } } return GSL_SUCCESS; } gsl-2.7.1/spmatrix/getset_source.c0000644016036000116100000001457613377336121014137 00000000000000/* spmatrix/getset_source.c * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018 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 * FUNCTION (tree, find) (const TYPE (gsl_spmatrix) * m, const size_t i, const size_t j); BASE FUNCTION (gsl_spmatrix, get) (const TYPE (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); } else if (j >= m->size2) { GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0); } else if (m->nz == 0) { /* no non-zero elements added to matrix */ return (BASE) 0; } else { if (GSL_SPMATRIX_ISCOO(m)) { /* traverse binary tree to search for (i,j) element */ void *ptr = FUNCTION (tree, find) (m, i, j); BASE x = ptr ? *(BASE *) ptr : (BASE) 0; return x; } else if (GSL_SPMATRIX_ISCSC(m)) { const int *mi = m->i; const int *mp = m->p; int p; /* loop over column j and search for row index i */ for (p = mp[j]; p < mp[j + 1]; ++p) { if (mi[p] == (int) i) return m->data[p]; } } else if (GSL_SPMATRIX_ISCSR(m)) { const int *mj = m->i; const int *mp = m->p; int p; /* loop over row i and search for column index j */ for (p = mp[i]; p < mp[i + 1]; ++p) { if (mj[p] == (int) j) return m->data[p]; } } else { GSL_ERROR_VAL("unknown sparse matrix type", GSL_EINVAL, 0); } /* element not found; return 0 */ return (BASE) 0; } } int FUNCTION (gsl_spmatrix, set) (TYPE (gsl_spmatrix) * m, const size_t i, const size_t j, const BASE x) { if (!GSL_SPMATRIX_ISCOO(m)) { GSL_ERROR("matrix not in COO representation", GSL_EINVAL); } else if (!(m->spflags & GSL_SPMATRIX_FLG_GROW) && (i >= m->size1 || j >= m->size2)) { GSL_ERROR ("indices out of range", GSL_EINVAL); } else if (m->spflags & GSL_SPMATRIX_FLG_FIXED) { /* * sparsity pattern is fixed - no elements may be inserted, but existing * elements can be replaced */ void * ptr = FUNCTION (tree, find) (m, i, j); if (ptr == NULL) { GSL_ERROR("attempt to add new matrix element to fixed sparsity pattern", GSL_EINVAL); } else { *(BASE *) ptr = x; } return GSL_SUCCESS; } else { int status = GSL_SUCCESS; void *ptr; /* check if matrix needs to be reallocated */ if (m->nz >= m->nzmax) { status = FUNCTION (gsl_spmatrix, realloc) (2 * m->nzmax, m); if (status) return status; } /* store the triplet (i, j, x) */ m->i[m->nz] = i; m->p[m->nz] = j; m->data[m->nz] = x; ptr = gsl_bst_insert(&m->data[m->nz], m->tree); if (ptr != NULL) { /* found duplicate entry (i,j), replace with new x */ *((BASE *) ptr) = x; } else { /* no duplicate (i,j) found */ /* increase matrix dimensions if needed */ if (m->spflags & GSL_SPMATRIX_FLG_GROW) { m->size1 = GSL_MAX(m->size1, i + 1); m->size2 = GSL_MAX(m->size2, j + 1); } ++(m->nz); } return status; } } BASE * FUNCTION (gsl_spmatrix, ptr) (const TYPE (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_ISCOO(m)) { /* traverse binary tree to search for (i,j) element */ void *ptr = FUNCTION (tree, find) (m, i, j); return (BASE *) ptr; } else if (GSL_SPMATRIX_ISCSC(m)) { const int *mi = m->i; const int *mp = m->p; int p; /* loop over column j and search for row index i */ for (p = mp[j]; p < mp[j + 1]; ++p) { if (mi[p] == (int) i) return &(m->data[p]); } } else if (GSL_SPMATRIX_ISCSR(m)) { const int *mj = m->i; const int *mp = m->p; int p; /* loop over row i and search for column index j */ for (p = mp[i]; p < mp[i + 1]; ++p) { if (mj[p] == (int) j) return &(m->data[p]); } } else { GSL_ERROR_NULL("unknown sparse matrix type", GSL_EINVAL); } /* element not found; return NULL */ return NULL; } } /* 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 * FUNCTION (tree, find) (const TYPE (gsl_spmatrix) * m, const size_t i, const size_t j) { const gsl_bst_avl_table *table = (const gsl_bst_avl_table *) &(m->tree->table.avl_table); struct gsl_bst_avl_node *p; for (p = table->avl_root; p != NULL; ) { size_t n = (ATOMIC *) p->avl_data - m->data; int pi = m->i[n]; int pj = m->p[n]; int cmp = GSL_SPMATRIX_COMPARE_ROWCOL(m, (int) i, (int) 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; } gsl-2.7.1/spmatrix/getset_complex_source.c0000644016036000116100000001502713377336121015656 00000000000000/* spmatrix/getset_complex_source.c * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018 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 * FUNCTION (tree, find) (const TYPE (gsl_spmatrix) * m, const size_t i, const size_t j); BASE FUNCTION (gsl_spmatrix, get) (const TYPE (gsl_spmatrix) * m, const size_t i, const size_t j) { BASE zero = ZERO; 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); } else if (m->nz == 0) { /* no non-zero elements added to matrix */ return zero; } else { if (GSL_SPMATRIX_ISCOO(m)) { /* traverse binary tree to search for (i,j) element */ void *ptr = FUNCTION (tree, find) (m, i, j); BASE x = ptr ? *(BASE *) ptr : zero; return x; } else if (GSL_SPMATRIX_ISCSC(m)) { const int *mi = m->i; const int *mp = m->p; int p; /* loop over column j and search for row index i */ for (p = mp[j]; p < mp[j + 1]; ++p) { if (mi[p] == (int) i) return *(BASE *) &m->data[2 * p]; } } else if (GSL_SPMATRIX_ISCSR(m)) { const int *mj = m->i; const int *mp = m->p; int p; /* loop over row i and search for column index j */ for (p = mp[i]; p < mp[i + 1]; ++p) { if (mj[p] == (int) j) return *(BASE *) &m->data[2 * p]; } } else { GSL_ERROR_VAL("unknown sparse matrix type", GSL_EINVAL, zero); } /* element not found; return 0 */ return zero; } } int FUNCTION (gsl_spmatrix, set) (TYPE (gsl_spmatrix) * m, const size_t i, const size_t j, const BASE x) { if (!GSL_SPMATRIX_ISCOO(m)) { GSL_ERROR("matrix not in COO representation", GSL_EINVAL); } else if (!(m->spflags & GSL_SPMATRIX_FLG_GROW) && (i >= m->size1 || j >= m->size2)) { GSL_ERROR ("indices out of range", GSL_EINVAL); } else if (m->spflags & GSL_SPMATRIX_FLG_FIXED) { /* * sparsity pattern is fixed - no elements may be inserted, but existing * elements can be replaced */ void * ptr = FUNCTION (tree, find) (m, i, j); if (ptr == NULL) { GSL_ERROR("attempt to add new matrix element to fixed sparsity pattern", GSL_EINVAL); } else { *(BASE *) ptr = x; } return GSL_SUCCESS; } else { int status = GSL_SUCCESS; void *ptr; /* check if matrix needs to be reallocated */ if (m->nz >= m->nzmax) { status = FUNCTION (gsl_spmatrix, realloc) (2 * m->nzmax, m); if (status) return status; } /* store the triplet (i, j, x) */ m->i[m->nz] = i; m->p[m->nz] = j; m->data[2 * m->nz] = GSL_REAL (x); m->data[2 * m->nz + 1] = GSL_IMAG (x); ptr = gsl_bst_insert(&m->data[2 * m->nz], m->tree); if (ptr != NULL) { /* found duplicate entry (i,j), replace with new x */ *((BASE *) ptr) = x; } else { /* no duplicate (i,j) found */ /* increase matrix dimensions if needed */ if (m->spflags & GSL_SPMATRIX_FLG_GROW) { m->size1 = GSL_MAX(m->size1, i + 1); m->size2 = GSL_MAX(m->size2, j + 1); } ++(m->nz); } return status; } } BASE * FUNCTION (gsl_spmatrix, ptr) (const TYPE (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_ISCOO(m)) { /* traverse binary tree to search for (i,j) element */ void *ptr = FUNCTION (tree, find) (m, i, j); return (BASE *) ptr; } else if (GSL_SPMATRIX_ISCSC(m)) { const int *mi = m->i; const int *mp = m->p; int p; /* loop over column j and search for row index i */ for (p = mp[j]; p < mp[j + 1]; ++p) { if (mi[p] == (int) i) return (BASE *) &(m->data[2 * p]); } } else if (GSL_SPMATRIX_ISCSR(m)) { const int *mj = m->i; const int *mp = m->p; int p; /* loop over row i and search for column index j */ for (p = mp[i]; p < mp[i + 1]; ++p) { if (mj[p] == (int) j) return (BASE *) &(m->data[2 * p]); } } else { GSL_ERROR_NULL("unknown sparse matrix type", GSL_EINVAL); } /* element not found; return NULL */ return NULL; } } /* 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 * FUNCTION (tree, find) (const TYPE (gsl_spmatrix) * m, const size_t i, const size_t j) { const gsl_bst_avl_table *table = (const gsl_bst_avl_table *) &(m->tree->table.avl_table); struct gsl_bst_avl_node *p; for (p = table->avl_root; p != NULL; ) { size_t n = ((ATOMIC *) p->avl_data - m->data) >> 1; int pi = m->i[n]; int pj = m->p[n]; int cmp = GSL_SPMATRIX_COMPARE_ROWCOL(m, (int) i, (int) 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; } gsl-2.7.1/spmatrix/init_source.c0000644016036000116100000002624613673207137013607 00000000000000/* spmatrix/init_source.c * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018 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 int FUNCTION(compare, func) (const void * pa, const void * pb, void * param); static int FUNCTION (spmatrix, pool_init) (TYPE (gsl_spmatrix) * m); static int FUNCTION (spmatrix, pool_free) (TYPE (gsl_spmatrix) * m); static void * FUNCTION (spmatrix, malloc) (size_t size, void * params); static void FUNCTION (spmatrix, free) (void * block, void * params); static const gsl_bst_allocator FUNCTION(spmatrix, allocator) = { FUNCTION (spmatrix, malloc), FUNCTION (spmatrix, free) }; TYPE (gsl_spmatrix) * FUNCTION (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 FUNCTION(gsl_spmatrix, alloc_nzmax) (n1, n2, nzmax, GSL_SPMATRIX_COO); } TYPE (gsl_spmatrix) * FUNCTION (gsl_spmatrix, alloc_nzmax) (const size_t n1, const size_t n2, const size_t nzmax, const int sptype) { TYPE(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(TYPE(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; if (n1 == 1 && n2 == 1) m->spflags = GSL_SPMATRIX_FLG_GROW; /* allow matrix size to grow */ else m->spflags = 0; m->i = malloc(m->nzmax * sizeof(int)); if (!m->i) { FUNCTION(gsl_spmatrix, free) (m); GSL_ERROR_NULL("failed to allocate space for row indices", GSL_ENOMEM); } m->work.work_void = malloc(GSL_MAX(n1, n2) * MULTIPLICITY * GSL_MAX(sizeof(int), sizeof(ATOMIC))); if (!m->work.work_void) { FUNCTION(gsl_spmatrix, free) (m); GSL_ERROR_NULL("failed to allocate space for work", GSL_ENOMEM); } if (sptype == GSL_SPMATRIX_COO) { m->tree = gsl_bst_alloc(gsl_bst_avl, &FUNCTION(spmatrix, allocator), FUNCTION (compare, func), (void *) m); if (!m->tree) { FUNCTION(gsl_spmatrix, free) (m); GSL_ERROR_NULL("failed to allocate space for binary tree", GSL_ENOMEM); } m->node_size = gsl_bst_node_size(m->tree); /* initialize memory pool */ FUNCTION (spmatrix, pool_init) (m); m->p = malloc(m->nzmax * sizeof(int)); if (!m->p) { FUNCTION(gsl_spmatrix, free) (m); GSL_ERROR_NULL("failed to allocate space for column indices", GSL_ENOMEM); } } else if (sptype == GSL_SPMATRIX_CSC) { m->p = malloc((n2 + 1) * sizeof(int)); if (!m->p) { FUNCTION(gsl_spmatrix, free) (m); GSL_ERROR_NULL("failed to allocate space for column pointers", GSL_ENOMEM); } } else if (sptype == GSL_SPMATRIX_CSR) { m->p = malloc((n1 + 1) * sizeof(int)); if (!m->p) { FUNCTION(gsl_spmatrix, free) (m); GSL_ERROR_NULL("failed to allocate space for row pointers", GSL_ENOMEM); } } m->data = malloc(m->nzmax * MULTIPLICITY * sizeof (ATOMIC)); if (!m->data) { FUNCTION(gsl_spmatrix, free) (m); GSL_ERROR_NULL("failed to allocate space for data", GSL_ENOMEM); } return m; } void FUNCTION (gsl_spmatrix, free) (TYPE (gsl_spmatrix) * m) { if (m->i) free(m->i); if (m->p) free(m->p); if (m->data) free(m->data); if (m->work.work_void) free(m->work.work_void); /* binary tree should be freed before pool */ if (m->tree) gsl_bst_free(m->tree); FUNCTION (spmatrix, pool_free) (m); free(m); } int FUNCTION (gsl_spmatrix, realloc) (const size_t nzmax, TYPE (gsl_spmatrix) * m) { int status = GSL_SUCCESS; void *ptr; ATOMIC * ptr_atomic; if (nzmax < m->nz) { GSL_ERROR("new nzmax is less than current nz", GSL_EINVAL); } ptr = realloc(m->i, nzmax * sizeof(int)); if (!ptr) { GSL_ERROR("failed to allocate space for row indices", GSL_ENOMEM); } m->i = (int *) ptr; if (GSL_SPMATRIX_ISCOO(m)) { ptr = realloc(m->p, nzmax * sizeof(int)); if (!ptr) { GSL_ERROR("failed to allocate space for column indices", GSL_ENOMEM); } m->p = (int *) ptr; } ptr_atomic = realloc(m->data, nzmax * MULTIPLICITY * sizeof (ATOMIC)); if (!ptr_atomic) { GSL_ERROR("failed to allocate space for data", GSL_ENOMEM); } if (GSL_SPMATRIX_ISCOO(m)) { const size_t nnew = nzmax - m->nz; /* number of new nodes to allocate in memory pool */ gsl_spmatrix_pool * node; /* * if the address of m->data has moved, traverse binary tree and change * all node data to point to the new array 'ptr_atomic' */ if (ptr_atomic != m->data) { gsl_bst_trav trav; ptr = gsl_bst_trav_first (&trav, m->tree); while (ptr != NULL) { ATOMIC * q = (ATOMIC *) ptr; size_t idx = q - m->data; gsl_bst_trav_replace (&trav, &ptr_atomic[idx]); ptr = gsl_bst_trav_next (&trav); } } /* allocate a new block in the memory pool to accomodate the additional nodes */ node = malloc(sizeof(gsl_spmatrix_pool)); if (!node) { GSL_ERROR ("failed to allocate space for memory pool node", GSL_ENOMEM); } node->block_ptr = malloc(nnew * m->node_size); if (!node->block_ptr) { GSL_ERROR ("failed to allocate space for memory pool block", GSL_ENOMEM); } node->free_slot = (unsigned char *) node->block_ptr; /* insert node at beginning of pool linked list */ node->next = m->pool; m->pool = node; } m->data = ptr_atomic; m->nzmax = nzmax; return status; } size_t FUNCTION (gsl_spmatrix, nnz) (const TYPE (gsl_spmatrix) * m) { return m->nz; } const char * FUNCTION (gsl_spmatrix, type) (const TYPE (gsl_spmatrix) * m) { if (GSL_SPMATRIX_ISCOO(m)) return "COO"; else if (GSL_SPMATRIX_ISCSR(m)) return "CSR"; else if (GSL_SPMATRIX_ISCSC(m)) return "CSC"; else return "unknown"; } int FUNCTION (gsl_spmatrix, set_zero) (TYPE (gsl_spmatrix) * m) { m->nz = 0; if (m->tree != NULL) { /* reset tree to empty state */ gsl_bst_empty(m->tree); /* reset memory pool */ FUNCTION (spmatrix, pool_free) (m); FUNCTION (spmatrix, pool_init) (m); } return GSL_SUCCESS; } /* 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 FUNCTION (gsl_spmatrix, tree_rebuild) (TYPE (gsl_spmatrix) * m) { if (!GSL_SPMATRIX_ISCOO(m)) { GSL_ERROR("matrix must be in COO format", GSL_EINVAL); } else { size_t n; /* empty the tree */ gsl_bst_empty(m->tree); /* reset memory pool */ FUNCTION (spmatrix, pool_free) (m); FUNCTION (spmatrix, pool_init) (m); /* re-insert all tree elements */ for (n = 0; n < m->nz; ++n) { void *ptr = gsl_bst_insert(&m->data[MULTIPLICITY * n], m->tree); if (ptr != NULL) { GSL_ERROR("detected duplicate entry", GSL_EINVAL); } } return GSL_SUCCESS; } } /* compare_func() 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 (ATOMIC *) pb - element 2 for comparison (ATOMIC *) 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 FUNCTION(compare, func) (const void * pa, const void * pb, void * param) { TYPE (gsl_spmatrix) * m = (TYPE (gsl_spmatrix) *) param; /* pointer arithmetic to find indices in data array */ #if (MULTIPLICITY == 1) const size_t idxa = (const ATOMIC *) pa - m->data; const size_t idxb = (const ATOMIC *) pb - m->data; #else const size_t idxa = ((const ATOMIC *) pa - m->data) >> 1; const size_t idxb = ((const ATOMIC *) pb - m->data) >> 1; #endif return GSL_SPMATRIX_COMPARE_ROWCOL(m, m->i[idxa], m->p[idxa], m->i[idxb], m->p[idxb]); } /* initialize m->pool by preallocating nzmax tree nodes */ static int FUNCTION (spmatrix, pool_init) (TYPE (gsl_spmatrix) * m) { m->pool = malloc(sizeof(gsl_spmatrix_pool)); if (m->pool == NULL) { GSL_ERROR ("failed to allocate space for memory pool", GSL_ENOMEM); } m->pool->block_ptr = malloc(m->nzmax * m->node_size); if (m->pool->block_ptr == NULL) { GSL_ERROR ("failed to allocate space for memory block", GSL_ENOMEM); } m->pool->next = NULL; m->pool->free_slot = (unsigned char *) m->pool->block_ptr; return GSL_SUCCESS; } /* free memory pool */ static int FUNCTION (spmatrix, pool_free) (TYPE (gsl_spmatrix) * m) { while (m->pool != NULL) { gsl_spmatrix_pool * next = m->pool->next; free(m->pool->block_ptr); free(m->pool); m->pool = next; } return GSL_SUCCESS; } #if 0 static void * FUNCTION (spmatrix, malloc) (size_t size, void * params) { (void) params; return malloc (size); } static void FUNCTION (spmatrix, free) (void * block, void * params) { (void) params; free (block); } #else static void * FUNCTION (spmatrix, malloc) (size_t size, void * params) { TYPE (gsl_spmatrix) * m = (TYPE (gsl_spmatrix) *) params; gsl_spmatrix_pool * pool = m->pool; void * ptr = (void *) pool->free_slot; pool->free_slot += size; return ptr; } static void FUNCTION (spmatrix, free) (void * block, void * params) { (void) block; (void) params; } #endif gsl-2.7.1/spmatrix/minmax_source.c0000644016036000116100000000612413445210340014111 00000000000000/* spmatrix/minmax_source.c * * Copyright (C) 2019 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. */ int FUNCTION (gsl_spmatrix, minmax) (const TYPE (gsl_spmatrix) * m, ATOMIC * min_out, ATOMIC * max_out) { ATOMIC 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) { ATOMIC x = m->data[n]; if (x < min) min = x; if (x > max) max = x; } *min_out = min; *max_out = max; return GSL_SUCCESS; } int FUNCTION (gsl_spmatrix, min_index) (const TYPE (gsl_spmatrix) * m, size_t * imin_out, size_t * jmin_out) { if (m->nz == 0) { GSL_ERROR("matrix is empty", GSL_EINVAL); } else { ATOMIC * Ad = m->data; ATOMIC min = Ad[0]; int imin = 0; int jmin = 0; size_t n; if (GSL_SPMATRIX_ISCOO(m)) { imin = m->i[0]; jmin = m->p[0]; for (n = 1; n < m->nz; ++n) { ATOMIC x = m->data[n]; if (x < min) { min = x; imin = m->i[n]; jmin = m->p[n]; } } } else if (GSL_SPMATRIX_ISCSC(m)) { const int *Ap = m->p; int p; size_t j; for (j = 0; j < m->size2; ++j) { for (p = Ap[j]; p < Ap[j + 1]; ++p) { if (Ad[p] < min) { min = Ad[p]; imin = m->i[p]; jmin = (int) j; } } } } else if (GSL_SPMATRIX_ISCSR(m)) { const int *Ap = m->p; int p; size_t i; for (i = 0; i < m->size1; ++i) { for (p = Ap[i]; p < Ap[i + 1]; ++p) { if (Ad[p] < min) { min = Ad[p]; imin = (int) i; jmin = m->i[p]; } } } } else { GSL_ERROR("unknown sparse matrix type", GSL_EINVAL); } *imin_out = (size_t) imin; *jmin_out = (size_t) jmin; return GSL_SUCCESS; } } gsl-2.7.1/spmatrix/oper_source.c0000644016036000116100000003265513614714135013606 00000000000000/* spmatrix/oper_source.c * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018 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 size_t FUNCTION (spmatrix, scatter) (const TYPE (gsl_spmatrix) * A, const size_t j, int * w, ATOMIC * x, const int mark, TYPE (gsl_spmatrix) * C, size_t nz); int FUNCTION (gsl_spmatrix, scale) (TYPE (gsl_spmatrix) * m, const BASE x) { size_t i; for (i = 0; i < m->nz; ++i) m->data[i] *= x; return GSL_SUCCESS; } /* m := m * diag(x) */ int FUNCTION (gsl_spmatrix, scale_columns) (TYPE (gsl_spmatrix) * m, const TYPE (gsl_vector) * x) { if (m->size2 != x->size) { GSL_ERROR("x vector length does not match matrix", GSL_EBADLEN); } else { ATOMIC * Ad = m->data; if (GSL_SPMATRIX_ISCSC(m)) { const int *Ap = m->p; int p; size_t j; for (j = 0; j < m->size2; ++j) { BASE xj = FUNCTION (gsl_vector, get) (x, j); for (p = Ap[j]; p < Ap[j + 1]; ++p) Ad[p] *= xj; } } else if (GSL_SPMATRIX_ISCSR(m)) { const int *Aj = m->i; size_t i; for (i = 0; i < m->nz; ++i) { BASE y = FUNCTION (gsl_vector, get) (x, Aj[i]); Ad[i] *= y; } } else if (GSL_SPMATRIX_ISCOO(m)) { const int *Aj = m->p; size_t i; for (i = 0; i < m->nz; ++i) { BASE y = FUNCTION (gsl_vector, get) (x, Aj[i]); Ad[i] *= y; } } else { GSL_ERROR("unknown sparse matrix type", GSL_EINVAL); } return GSL_SUCCESS; } } /* m := diag(x) * m */ int FUNCTION (gsl_spmatrix, scale_rows) (TYPE (gsl_spmatrix) * m, const TYPE (gsl_vector) * x) { if (m->size1 != x->size) { GSL_ERROR("x vector length does not match matrix", GSL_EBADLEN); } else { ATOMIC * Ad = m->data; if (GSL_SPMATRIX_ISCSC(m)) { const int *Ai = m->i; size_t i; for (i = 0; i < m->nz; ++i) { BASE y = FUNCTION (gsl_vector, get) (x, Ai[i]); Ad[i] *= y; } } else if (GSL_SPMATRIX_ISCSR(m)) { const int *Ap = m->p; int p; size_t i; for (i = 0; i < m->size1; ++i) { BASE xi = FUNCTION (gsl_vector, get) (x, i); for (p = Ap[i]; p < Ap[i + 1]; ++p) Ad[p] *= xi; } } else if (GSL_SPMATRIX_ISCOO(m)) { const int *Ai = m->i; size_t i; for (i = 0; i < m->nz; ++i) { BASE y = FUNCTION (gsl_vector, get) (x, Ai[i]); Ad[i] *= y; } } else { GSL_ERROR("unknown sparse matrix type", GSL_EINVAL); } return GSL_SUCCESS; } } /* 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 FUNCTION (gsl_spmatrix, add) (TYPE (gsl_spmatrix) * c, const TYPE (gsl_spmatrix) * a, const TYPE (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_ISCOO(a)) { GSL_ERROR("COO format not yet supported", GSL_EINVAL); } else { int status = GSL_SUCCESS; int * w = a->work.work_int; ATOMIC * x = c->work.work_atomic; int *Cp, *Ci; ATOMIC * Cd; int p; size_t j; size_t nz = 0; /* number of non-zeros in c */ size_t inner_size, outer_size; if (GSL_SPMATRIX_ISCSC(a)) { inner_size = M; outer_size = N; } else if (GSL_SPMATRIX_ISCSR(a)) { inner_size = N; outer_size = M; } else { GSL_ERROR("unknown sparse matrix type", GSL_EINVAL); } if (c->nzmax < a->nz + b->nz) { status = FUNCTION (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; /* CSC: x += A(:,j); CSR: x += A(j,:) */ nz = FUNCTION (spmatrix, scatter) (a, j, w, x, (int) (j + 1), c, nz); /* CSC: x += B(:,j); CSR: x += B(j,:) */ nz = FUNCTION (spmatrix, scatter) (b, j, w, x, (int) (j + 1), c, nz); for (p = Cp[j]; p < (int) nz; ++p) Cd[p] = x[Ci[p]]; } /* finalize last column of c */ Cp[j] = nz; c->nz = nz; return status; } } /* gsl_spmatrix_dense_add() a := a + b Inputs: a - (input/output) on input, dense matrix a; on output, a + b b - (input) sparse matrix Return: success or error */ int FUNCTION (gsl_spmatrix, dense_add) (TYPE (gsl_matrix) * a, const TYPE (gsl_spmatrix) * 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 ATOMIC * bd = b->data; /* check for quick return */ if (b->nz == 0) return GSL_SUCCESS; if (GSL_SPMATRIX_ISCOO(b)) { const int * bi = b->i; const int * bj = b->p; size_t n; for (n = 0; n < b->nz; ++n) { a->data[bi[n] * tda_a + bj[n]] += bd[n]; } } else if (GSL_SPMATRIX_ISCSC(b)) { const int * bi = b->i; const int * bp = b->p; size_t j; int p; for (j = 0; j < N; ++j) { for (p = bp[j]; p < bp[j + 1]; ++p) { a->data[bi[p] * tda_a + j] += bd[p]; } } } else if (GSL_SPMATRIX_ISCSR(b)) { const int * bj = b->i; const int * bp = b->p; size_t i; int p; for (i = 0; i < M; ++i) { for (p = bp[i]; p < bp[i + 1]; ++p) { a->data[i * tda_a + bj[p]] += bd[p]; } } } return GSL_SUCCESS; } } #ifndef GSL_DISABLE_DEPRECATED int FUNCTION (gsl_spmatrix, add_to_dense) (TYPE (gsl_matrix) * a, const TYPE (gsl_spmatrix) * b) { return FUNCTION (gsl_spmatrix, dense_add) (a, b); } #endif /* gsl_spmatrix_dense_sub() a := a - b Inputs: a - (input/output) on input, dense matrix a; on output, a - b b - (input) sparse matrix Return: success or error */ int FUNCTION (gsl_spmatrix, dense_sub) (TYPE (gsl_matrix) * a, const TYPE (gsl_spmatrix) * 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 ATOMIC * bd = b->data; /* check for quick return */ if (b->nz == 0) return GSL_SUCCESS; if (GSL_SPMATRIX_ISCOO(b)) { const int * bi = b->i; const int * bj = b->p; size_t n; for (n = 0; n < b->nz; ++n) { a->data[bi[n] * tda_a + bj[n]] -= bd[n]; } } else if (GSL_SPMATRIX_ISCSC(b)) { const int * bi = b->i; const int * bp = b->p; size_t j; int p; for (j = 0; j < N; ++j) { for (p = bp[j]; p < bp[j + 1]; ++p) { a->data[bi[p] * tda_a + j] -= bd[p]; } } } else if (GSL_SPMATRIX_ISCSR(b)) { const int * bj = b->i; const int * bp = b->p; size_t i; int p; for (i = 0; i < M; ++i) { for (p = bp[i]; p < bp[i + 1]; ++p) { a->data[i * tda_a + bj[p]] -= bd[p]; } } } return GSL_SUCCESS; } } /* gsl_spmatrix_d2sp() Convert a dense gsl_matrix to sparse (COO) format Inputs: T - (output) sparse matrix in COO format A - (input) dense matrix to convert */ int FUNCTION (gsl_spmatrix, d2sp) (TYPE (gsl_spmatrix) * T, const TYPE (gsl_matrix) * A) { if (T->size1 != A->size1 || T->size2 != A->size2) { GSL_ERROR("matrices must have same dimensions", GSL_EBADLEN); } else if (!GSL_SPMATRIX_ISCOO(T)) { GSL_ERROR ("sparse matrix must be in COO format", GSL_EINVAL); } else { size_t i, j; FUNCTION (gsl_spmatrix, set_zero) (T); for (i = 0; i < A->size1; ++i) { for (j = 0; j < A->size2; ++j) { BASE x = FUNCTION (gsl_matrix, get) (A, i, j); if (x != (BASE) ZERO) FUNCTION (gsl_spmatrix, set) (T, i, j, x); } } return GSL_SUCCESS; } } /* gsl_spmatrix_sp2d() Convert a sparse matrix to dense format */ int FUNCTION (gsl_spmatrix, sp2d) (TYPE (gsl_matrix) * A, const TYPE (gsl_spmatrix) * S) { if (A->size1 != S->size1 || A->size2 != S->size2) { GSL_ERROR("matrices must have same dimensions", GSL_EBADLEN); } else { FUNCTION (gsl_matrix, set_zero) (A); if (GSL_SPMATRIX_ISCOO(S)) { size_t n; for (n = 0; n < S->nz; ++n) { int i = S->i[n]; int j = S->p[n]; BASE x = S->data[n]; FUNCTION (gsl_matrix, set) (A, i, j, x); } } else if (GSL_SPMATRIX_ISCSR(S)) { const int *Sj = S->i; const int *Sp = S->p; const ATOMIC *Sd = S->data; size_t i; int p; for (i = 0; i < S->size1; ++i) { for (p = Sp[i]; p < Sp[i + 1]; ++p) FUNCTION (gsl_matrix, set) (A, i, Sj[p], Sd[p]); } } else if (GSL_SPMATRIX_ISCSC(S)) { const int *Si = S->i; const int *Sp = S->p; const ATOMIC *Sd = S->data; size_t j; int p; for (j = 0; j < S->size2; ++j) { for (p = Sp[j]; p < Sp[j + 1]; ++p) FUNCTION (gsl_matrix, set) (A, Si[p], j, Sd[p]); } } else { GSL_ERROR("unknown sparse matrix type", GSL_EINVAL); } return GSL_SUCCESS; } } /* spmatrix_scatter() Keep a running total x -> x + alpha*A(:,j) for adding matrices together in CSC, 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 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 CSC but not necessarily in order - ie: the row indices C->i may not be in ascending order. 2) based on CSparse routine cs_scatter */ static size_t FUNCTION (spmatrix, scatter) (const TYPE (gsl_spmatrix) * A, const size_t j, int * w, ATOMIC * x, const int mark, TYPE (gsl_spmatrix) * C, size_t nz) { int p; int * Ai = A->i; int * Ap = A->p; ATOMIC * Ad = A->data; int * Ci = C->i; for (p = Ap[j]; p < Ap[j + 1]; ++p) { int 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] = Ad[p]; /* x(i) = A(i,j) */ } else /* this (i,j) exists in C from a previous call */ { x[i] += Ad[p]; /* add alpha*A(i,j) to C(i,j) */ } } return (nz) ; } gsl-2.7.1/spmatrix/oper_complex_source.c0000644016036000116100000004021613614715021015320 00000000000000/* spmatrix/oper_complex_source.c * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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 size_t FUNCTION (spmatrix, scatter) (const TYPE (gsl_spmatrix) * A, const size_t j, int * w, ATOMIC * x, const int mark, TYPE (gsl_spmatrix) * C, size_t nz); int FUNCTION (gsl_spmatrix, scale) (TYPE (gsl_spmatrix) * m, const BASE x) { const ATOMIC xr = GSL_REAL (x); const ATOMIC xi = GSL_IMAG (x); size_t i; for (i = 0; i < m->nz; ++i) { ATOMIC mr = m->data[2 * i]; ATOMIC mi = m->data[2 * i + 1]; m->data[2 * i] = mr * xr - mi * xi; m->data[2 * i + 1] = mi * xr + mr * xi; } return GSL_SUCCESS; } /* m := m * diag(x) */ int FUNCTION (gsl_spmatrix, scale_columns) (TYPE (gsl_spmatrix) * m, const TYPE (gsl_vector) * x) { if (m->size2 != x->size) { GSL_ERROR("x vector length does not match matrix", GSL_EBADLEN); } else { ATOMIC * Ad = m->data; if (GSL_SPMATRIX_ISCSC(m)) { const int *Ap = m->p; int p; size_t j; for (j = 0; j < m->size2; ++j) { BASE xj = FUNCTION (gsl_vector, get) (x, j); ATOMIC xr = GSL_REAL(xj); ATOMIC xi = GSL_IMAG(xj); for (p = Ap[j]; p < Ap[j + 1]; ++p) { ATOMIC ar = Ad[2 * p]; ATOMIC ai = Ad[2 * p + 1]; Ad[2 * p] = ar * xr - ai * xi; Ad[2 * p + 1] = ai * xr + ar * xi; } } } else if (GSL_SPMATRIX_ISCSR(m)) { const int *Aj = m->i; size_t i; for (i = 0; i < m->nz; ++i) { BASE y = FUNCTION (gsl_vector, get) (x, Aj[i]); ATOMIC yr = GSL_REAL(y); ATOMIC yi = GSL_IMAG(y); ATOMIC ar = Ad[2 * i]; ATOMIC ai = Ad[2 * i + 1]; Ad[2 * i] = ar * yr - ai * yi; Ad[2 * i + 1] = ai * yr + ar * yi; } } else if (GSL_SPMATRIX_ISCOO(m)) { const int *Aj = m->p; size_t i; for (i = 0; i < m->nz; ++i) { BASE y = FUNCTION (gsl_vector, get) (x, Aj[i]); ATOMIC yr = GSL_REAL(y); ATOMIC yi = GSL_IMAG(y); ATOMIC ar = Ad[2 * i]; ATOMIC ai = Ad[2 * i + 1]; Ad[2 * i] = ar * yr - ai * yi; Ad[2 * i + 1] = ai * yr + ar * yi; } } else { GSL_ERROR("unknown sparse matrix type", GSL_EINVAL); } return GSL_SUCCESS; } } /* m := diag(x) * m */ int FUNCTION (gsl_spmatrix, scale_rows) (TYPE (gsl_spmatrix) * m, const TYPE (gsl_vector) * x) { if (m->size1 != x->size) { GSL_ERROR("x vector length does not match matrix", GSL_EBADLEN); } else { ATOMIC * Ad = m->data; if (GSL_SPMATRIX_ISCSC(m)) { const int *Ai = m->i; size_t i; for (i = 0; i < m->nz; ++i) { BASE y = FUNCTION (gsl_vector, get) (x, Ai[i]); ATOMIC yr = GSL_REAL(y); ATOMIC yi = GSL_IMAG(y); ATOMIC ar = Ad[2 * i]; ATOMIC ai = Ad[2 * i + 1]; Ad[2 * i] = ar * yr - ai * yi; Ad[2 * i + 1] = ai * yr + ar * yi; } } else if (GSL_SPMATRIX_ISCSR(m)) { const int *Ap = m->p; int p; size_t i; for (i = 0; i < m->size1; ++i) { BASE y = FUNCTION (gsl_vector, get) (x, i); ATOMIC yr = GSL_REAL(y); ATOMIC yi = GSL_IMAG(y); for (p = Ap[i]; p < Ap[i + 1]; ++p) { ATOMIC ar = Ad[2 * p]; ATOMIC ai = Ad[2 * p + 1]; Ad[2 * p] = ar * yr - ai * yi; Ad[2 * p + 1] = ai * yr + ar * yi; } } } else if (GSL_SPMATRIX_ISCOO(m)) { const int *Ai = m->i; size_t i; for (i = 0; i < m->nz; ++i) { BASE y = FUNCTION (gsl_vector, get) (x, Ai[i]); ATOMIC yr = GSL_REAL(y); ATOMIC yi = GSL_IMAG(y); ATOMIC ar = Ad[2 * i]; ATOMIC ai = Ad[2 * i + 1]; Ad[2 * i] = ar * yr - ai * yi; Ad[2 * i + 1] = ai * yr + ar * yi; } } else { GSL_ERROR("unknown sparse matrix type", GSL_EINVAL); } return GSL_SUCCESS; } } /* 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 FUNCTION (gsl_spmatrix, add) (TYPE (gsl_spmatrix) * c, const TYPE (gsl_spmatrix) * a, const TYPE (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_ISCOO(a)) { GSL_ERROR("COO format not yet supported", GSL_EINVAL); } else { int status = GSL_SUCCESS; int * w = a->work.work_int; ATOMIC * x = c->work.work_atomic; int *Cp, *Ci; ATOMIC * Cd; int p; size_t j; size_t nz = 0; /* number of non-zeros in c */ size_t inner_size, outer_size; if (GSL_SPMATRIX_ISCSC(a)) { inner_size = M; outer_size = N; } else if (GSL_SPMATRIX_ISCSR(a)) { inner_size = N; outer_size = M; } else { GSL_ERROR("unknown sparse matrix type", GSL_EINVAL); } if (c->nzmax < a->nz + b->nz) { status = FUNCTION (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; /* CSC: x += A(:,j); CSR: x += A(j,:) */ nz = FUNCTION (spmatrix, scatter) (a, j, w, x, (int) (j + 1), c, nz); /* CSC: x += B(:,j); CSR: x += B(j,:) */ nz = FUNCTION (spmatrix, scatter) (b, j, w, x, (int) (j + 1), c, nz); for (p = Cp[j]; p < (int) nz; ++p) { Cd[2 * p] = x[2 * Ci[p]]; Cd[2 * p + 1] = x[2 * Ci[p] + 1]; } } /* finalize last column of c */ Cp[j] = nz; c->nz = nz; return status; } } /* gsl_spmatrix_dense_add() a := a + b Inputs: a - (input/output) on input, dense matrix a; on output, a + b b - (input) sparse matrix Return: success or error */ int FUNCTION (gsl_spmatrix, dense_add) (TYPE (gsl_matrix) * a, const TYPE (gsl_spmatrix) * 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 ATOMIC * bd = b->data; /* check for quick return */ if (b->nz == 0) return GSL_SUCCESS; if (GSL_SPMATRIX_ISCOO(b)) { const int * bi = b->i; const int * bj = b->p; size_t n; for (n = 0; n < b->nz; ++n) { const size_t idx = 2 * (bi[n] * tda_a + bj[n]); a->data[idx] += bd[2 * n]; a->data[idx + 1] += bd[2 * n + 1]; } } else if (GSL_SPMATRIX_ISCSC(b)) { const int * bi = b->i; const int * bp = b->p; size_t j; int p; for (j = 0; j < N; ++j) { for (p = bp[j]; p < bp[j + 1]; ++p) { const size_t idx = 2 * (bi[p] * tda_a + j); a->data[idx] += bd[2 * p]; a->data[idx + 1] += bd[2 * p + 1]; } } } else if (GSL_SPMATRIX_ISCSR(b)) { const int * bj = b->i; const int * bp = b->p; size_t i; int p; for (i = 0; i < M; ++i) { for (p = bp[i]; p < bp[i + 1]; ++p) { const size_t idx = 2 * (i * tda_a + bj[p]); a->data[idx] += bd[2 * p]; a->data[idx + 1] += bd[2 * p + 1]; } } } return GSL_SUCCESS; } } #ifndef GSL_DISABLE_DEPRECATED int FUNCTION (gsl_spmatrix, add_to_dense) (TYPE (gsl_matrix) * a, const TYPE (gsl_spmatrix) * b) { return FUNCTION (gsl_spmatrix, dense_add) (a, b); } #endif /* gsl_spmatrix_dense_sub() a := a - b Inputs: a - (input/output) on input, dense matrix a; on output, a - b b - (input) sparse matrix Return: success or error */ int FUNCTION (gsl_spmatrix, dense_sub) (TYPE (gsl_matrix) * a, const TYPE (gsl_spmatrix) * 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 ATOMIC * bd = b->data; /* check for quick return */ if (b->nz == 0) return GSL_SUCCESS; if (GSL_SPMATRIX_ISCOO(b)) { const int * bi = b->i; const int * bj = b->p; size_t n; for (n = 0; n < b->nz; ++n) { const size_t idx = 2 * (bi[n] * tda_a + bj[n]); a->data[idx] -= bd[2 * n]; a->data[idx + 1] -= bd[2 * n + 1]; } } else if (GSL_SPMATRIX_ISCSC(b)) { const int * bi = b->i; const int * bp = b->p; size_t j; int p; for (j = 0; j < N; ++j) { for (p = bp[j]; p < bp[j + 1]; ++p) { const size_t idx = 2 * (bi[p] * tda_a + j); a->data[idx] -= bd[2 * p]; a->data[idx + 1] -= bd[2 * p + 1]; } } } else if (GSL_SPMATRIX_ISCSR(b)) { const int * bj = b->i; const int * bp = b->p; size_t i; int p; for (i = 0; i < M; ++i) { for (p = bp[i]; p < bp[i + 1]; ++p) { const size_t idx = 2 * (i * tda_a + bj[p]); a->data[idx] -= bd[2 * p]; a->data[idx + 1] -= bd[2 * p + 1]; } } } return GSL_SUCCESS; } } /* gsl_spmatrix_d2sp() Convert a dense gsl_matrix to sparse (COO) format Inputs: T - (output) sparse matrix in COO format A - (input) dense matrix to convert */ int FUNCTION (gsl_spmatrix, d2sp) (TYPE (gsl_spmatrix) * T, const TYPE (gsl_matrix) * A) { if (T->size1 != A->size1 || T->size2 != A->size2) { GSL_ERROR("matrices must have same dimensions", GSL_EBADLEN); } else if (!GSL_SPMATRIX_ISCOO(T)) { GSL_ERROR ("sparse matrix must be in COO format", GSL_EINVAL); } else { size_t i, j; FUNCTION (gsl_spmatrix, set_zero) (T); for (i = 0; i < A->size1; ++i) { for (j = 0; j < A->size2; ++j) { BASE x = FUNCTION (gsl_matrix, get) (A, i, j); if (!(GSL_REAL(x) == (ATOMIC) 0 && GSL_IMAG(x) == (ATOMIC) 0)) FUNCTION (gsl_spmatrix, set) (T, i, j, x); } } return GSL_SUCCESS; } } /* gsl_spmatrix_sp2d() Convert a sparse matrix to dense format */ int FUNCTION (gsl_spmatrix, sp2d) (TYPE (gsl_matrix) * A, const TYPE (gsl_spmatrix) * S) { if (A->size1 != S->size1 || A->size2 != S->size2) { GSL_ERROR("matrices must have same dimensions", GSL_EBADLEN); } else { FUNCTION (gsl_matrix, set_zero) (A); if (GSL_SPMATRIX_ISCOO(S)) { size_t n; for (n = 0; n < S->nz; ++n) { int i = S->i[n]; int j = S->p[n]; BASE x = *(BASE *) &S->data[2 * n]; FUNCTION (gsl_matrix, set) (A, i, j, x); } } else if (GSL_SPMATRIX_ISCSR(S)) { const int *Sj = S->i; const int *Sp = S->p; const ATOMIC *Sd = S->data; size_t i; int p; for (i = 0; i < S->size1; ++i) { for (p = Sp[i]; p < Sp[i + 1]; ++p) { BASE x; GSL_SET_COMPLEX(&x, Sd[2*p], Sd[2*p + 1]); FUNCTION (gsl_matrix, set) (A, i, Sj[p], x); } } } else if (GSL_SPMATRIX_ISCSC(S)) { const int *Si = S->i; const int *Sp = S->p; const ATOMIC *Sd = S->data; size_t j; int p; for (j = 0; j < S->size2; ++j) { for (p = Sp[j]; p < Sp[j + 1]; ++p) { BASE x; GSL_SET_COMPLEX(&x, Sd[2*p], Sd[2*p+1]); FUNCTION (gsl_matrix, set) (A, Si[p], j, x); } } } else { GSL_ERROR("unknown sparse matrix type", GSL_EINVAL); } return GSL_SUCCESS; } } /* spmatrix_scatter() Keep a running total x -> x + alpha*A(:,j) for adding matrices together in CSC, 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 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 CSC but not necessarily in order - ie: the row indices C->i may not be in ascending order. 2) based on CSparse routine cs_scatter */ static size_t FUNCTION (spmatrix, scatter) (const TYPE (gsl_spmatrix) * A, const size_t j, int * w, ATOMIC * x, const int mark, TYPE (gsl_spmatrix) * C, size_t nz) { int p; int * Ai = A->i; int * Ap = A->p; ATOMIC * Ad = A->data; int * Ci = C->i; for (p = Ap[j]; p < Ap[j + 1]; ++p) { int 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[2*i] = Ad[2*p]; /* x(i) = A(i,j) */ x[2*i+1] = Ad[2*p+1]; } else /* this (i,j) exists in C from a previous call */ { x[2*i] += Ad[2*p]; /* add A(i,j) to C(i,j) */ x[2*i+1] += Ad[2*p+1]; } } return (nz) ; } gsl-2.7.1/spmatrix/prop_source.c0000644016036000116100000001164613673212151013612 00000000000000/* spmatrix/prop_source.c * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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. */ int FUNCTION (gsl_spmatrix, equal) (const TYPE (gsl_spmatrix) * a, const TYPE (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, r; /* check for different number of non-zero elements */ if (nz != b->nz) return 0; if (GSL_SPMATRIX_ISCOO(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) { ATOMIC * bptr = (ATOMIC *) FUNCTION (gsl_spmatrix, ptr) (b, a->i[n], a->p[n]); if (bptr == NULL) return 0; for (r = 0; r < MULTIPLICITY; ++r) { if (a->data[MULTIPLICITY * n + r] != *(bptr + r)) return 0; } } } else if (GSL_SPMATRIX_ISCSC(a)) { /* * for CSC, 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]) return 0; for (r = 0; r < MULTIPLICITY; ++r) { if (a->data[MULTIPLICITY * n + r] != b->data[MULTIPLICITY * n + r]) 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_ISCSR(a)) { /* * for CSR, 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]) return 0; for (r = 0; r < MULTIPLICITY; ++r) { if (a->data[MULTIPLICITY * n + r] != b->data[MULTIPLICITY * n + r]) 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; } } #if !defined(UNSIGNED) && !defined(BASE_GSL_COMPLEX) && !defined(BASE_GSL_COMPLEX_FLOAT) && !defined(BASE_GSL_COMPLEX_LONG) ATOMIC FUNCTION (gsl_spmatrix, norm1) (const TYPE (gsl_spmatrix) * A) { const size_t N = A->size2; ATOMIC value = (ATOMIC) 0; if (A->nz == 0) { return (ATOMIC) 0; } else if (GSL_SPMATRIX_ISCSC(A)) { int * Ap = A->p; ATOMIC * Ad = A->data; size_t j; for (j = 0; j < N; ++j) { ATOMIC sum = (ATOMIC) 0; int p; for (p = Ap[j]; p < Ap[j + 1]; ++p) sum += (Ad[p] >= (ATOMIC) 0) ? Ad[p] : -Ad[p]; if (sum > value) value = sum; } } else { ATOMIC * colsum = A->work.work_atomic; ATOMIC * Ad = A->data; size_t j; /* initialize column sums to zero */ for (j = 0; j < N; ++j) colsum[j] = (ATOMIC) 0; if (GSL_SPMATRIX_ISCOO(A)) { int * Ap = A->p; for (j = 0; j < A->nz; ++j) colsum[Ap[j]] += (Ad[j] >= (ATOMIC) 0) ? Ad[j] : -Ad[j]; } else if (GSL_SPMATRIX_ISCSR(A)) { int * Aj = A->i; for (j = 0; j < A->nz; ++j) colsum[Aj[j]] += (Ad[j] >= (ATOMIC) 0) ? Ad[j] : -Ad[j]; } for (j = 0; j < N; ++j) { if (colsum[j] > value) value = colsum[j]; } } return value; } #endif gsl-2.7.1/spmatrix/swap_source.c0000644016036000116100000001303413377336121013602 00000000000000/* spmatrix/swap_source.c * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018 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. */ int FUNCTION (gsl_spmatrix, transpose) (TYPE (gsl_spmatrix) * m) { /* swap dimensions - this must be done before the tree_rebuild step */ if (m->size1 != m->size2) { size_t tmp = m->size1; m->size1 = m->size2; m->size2 = tmp; } if (GSL_SPMATRIX_ISCOO(m)) { size_t n; /* swap row/column indices */ for (n = 0; n < m->nz; ++n) { int tmp = m->p[n]; m->p[n] = m->i[n]; m->i[n] = tmp; } /* need to rebuild binary tree, or element searches won't * work correctly with transposed indices */ FUNCTION (gsl_spmatrix, tree_rebuild) (m); } else if (GSL_SPMATRIX_ISCSC(m)) { m->sptype = GSL_SPMATRIX_CSR; } else if (GSL_SPMATRIX_ISCSR(m)) { m->sptype = GSL_SPMATRIX_CSC; } else { GSL_ERROR("unknown sparse matrix type", GSL_EINVAL); } return GSL_SUCCESS; } /* FIXME XXX: deprecated function */ int FUNCTION (gsl_spmatrix, transpose2) (TYPE (gsl_spmatrix) * m) { return FUNCTION (gsl_spmatrix, transpose) (m); } int FUNCTION (gsl_spmatrix, transpose_memcpy) (TYPE (gsl_spmatrix) * dest, const TYPE (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 status = GSL_SUCCESS; const size_t nz = src->nz; if (dest->nzmax < src->nz) { status = FUNCTION (gsl_spmatrix, realloc) (src->nz, dest); if (status) return status; } if (GSL_SPMATRIX_ISCOO(src)) { size_t n, r; void *ptr; for (n = 0; n < nz; ++n) { dest->i[n] = src->p[n]; dest->p[n] = src->i[n]; for (r = 0; r < MULTIPLICITY; ++r) dest->data[MULTIPLICITY * n + r] = src->data[MULTIPLICITY * n + r]; /* copy binary tree data */ ptr = gsl_bst_insert(&dest->data[MULTIPLICITY * n], dest->tree); if (ptr != NULL) { GSL_ERROR("detected duplicate entry", GSL_EINVAL); } } } else if (GSL_SPMATRIX_ISCSC(src)) { int * Ai = src->i; int * Ap = src->p; ATOMIC * Ad = src->data; int * ATi = dest->i; int * ATp = dest->p; ATOMIC * ATd = dest->data; int * w = dest->work.work_int; int p; size_t j, r; /* initialize to 0 */ for (j = 0; j < M + 1; ++j) ATp[j] = 0; /* compute row counts of A (= column counts for A^T) */ for (j = 0; j < nz; ++j) ATp[Ai[j]]++; /* 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) { int k = w[Ai[p]]++; ATi[k] = j; for (r = 0; r < MULTIPLICITY; ++r) ATd[MULTIPLICITY * k + r] = Ad[MULTIPLICITY * p + r]; } } } else if (GSL_SPMATRIX_ISCSR(src)) { int * Aj = src->i; int * Ap = src->p; ATOMIC * Ad = src->data; int * ATj = dest->i; int * ATp = dest->p; ATOMIC * ATd = dest->data; int * w = dest->work.work_int; int p; size_t i, r; /* initialize to 0 */ for (i = 0; i < N + 1; ++i) ATp[i] = 0; /* compute column counts of A (= row counts for A^T) */ for (i = 0; i < nz; ++i) ATp[Aj[i]]++; /* 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; for (r = 0; r < MULTIPLICITY; ++r) ATd[MULTIPLICITY * k + r] = Ad[MULTIPLICITY * p + r]; } } } else { GSL_ERROR("unknown sparse matrix type", GSL_EINVAL); } dest->nz = nz; return status; } } gsl-2.7.1/spmatrix/test_source.c0000644016036000116100000006537513673211156013625 00000000000000/* spmatrix/test_source.c * * Copyright (C) 2018, 2019, 2020 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. */ /* test_random() Create a random sparse matrix with approximately M*N*density non-zero entries in [lower,upper] 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 lower - lower bound on entries upper - upper bound on entries 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 TYPE (gsl_spmatrix) * FUNCTION (test, random)(const size_t M, const size_t N, const double density, const double lower, const double upper, const gsl_rng *r) { size_t nnzwanted = (size_t) floor(M * N * GSL_MIN(density, 1.0)); TYPE (gsl_spmatrix) * m = FUNCTION (gsl_spmatrix, alloc_nzmax) (M, N, nnzwanted, GSL_SPMATRIX_COO); while (FUNCTION (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 */ BASE x = (BASE) (gsl_rng_uniform(r) * (upper - lower) + lower); FUNCTION (gsl_spmatrix, set) (m, i, j, x); } return m; } static TYPE (gsl_spmatrix) * FUNCTION (test, random_int)(const size_t M, const size_t N, const double density, const double lower, const double upper, const gsl_rng *r) { size_t nnzwanted = (size_t) floor(M * N * GSL_MIN(density, 1.0)); TYPE (gsl_spmatrix) * m = FUNCTION (gsl_spmatrix, alloc_nzmax) (M, N, nnzwanted, GSL_SPMATRIX_COO); while (FUNCTION (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); FUNCTION (gsl_spmatrix, set) (m, i, j, (BASE) x); } return m; } static void FUNCTION (test, random_dense)(TYPE (gsl_matrix) * m, const double lower, const double upper, const gsl_rng *r) { const size_t M = m->size1; const size_t N = m->size2; size_t i, j; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { double mij = gsl_rng_uniform(r) * (upper - lower) + lower; FUNCTION (gsl_matrix, set) (m, i, j, (BASE) mij); } } } static void FUNCTION (test, random_vector)(TYPE (gsl_vector) * x, const double lower, const double upper, const gsl_rng *r) { size_t i; for (i = 0; i < x->size; ++i) { double xi = gsl_rng_uniform(r) * (upper - lower) + lower; FUNCTION (gsl_vector, set) (x, i, (BASE) xi); } } static void FUNCTION (test, alloc) (const size_t M, const size_t N, const int sptype) { TYPE (gsl_spmatrix) * m = FUNCTION (gsl_spmatrix, alloc_nzmax) (M, N, 10, sptype); size_t i, j; gsl_test (m->data == 0, NAME (gsl_spmatrix) "_alloc(%s) returns valid data pointer", FUNCTION (gsl_spmatrix, type) (m)); gsl_test (m->i == 0, NAME (gsl_spmatrix) "_alloc(%s) returns valid i pointer", FUNCTION (gsl_spmatrix, type) (m)); gsl_test (m->p == 0, NAME (gsl_spmatrix) "_alloc(%s) returns valid p pointer", FUNCTION (gsl_spmatrix, type) (m)); gsl_test (m->size1 != M, NAME (gsl_spmatrix) "_alloc(%s) returns valid size1", FUNCTION (gsl_spmatrix, type) (m)); gsl_test (m->size2 != N, NAME (gsl_spmatrix) "_alloc(%s) returns valid size2", FUNCTION (gsl_spmatrix, type) (m)); gsl_test (m->nz != 0, NAME (gsl_spmatrix) "_alloc(%s) returns valid nz", FUNCTION (gsl_spmatrix, type) (m)); gsl_test (m->sptype != sptype, NAME (gsl_spmatrix) "_alloc(%s) returns valid sptype", FUNCTION (gsl_spmatrix, type) (m)); /* test that a newly allocated matrix is initialized to zero */ status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE mij = FUNCTION (gsl_spmatrix, get) (m, i, j); if (mij != (BASE) 0) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) "_alloc(%s) initializes matrix to zero", FUNCTION (gsl_spmatrix, type) (m)); FUNCTION (gsl_spmatrix, free) (m); } static void FUNCTION (test, realloc) (const size_t M, const size_t N) { TYPE (gsl_spmatrix) * m = FUNCTION (gsl_spmatrix, alloc_nzmax) (M, N, 10, GSL_SPMATRIX_COO); const BASE x = (BASE) 5; const size_t nnz_total = 30; size_t i, j, nnz; /* add enough elements to m to trigger a realloc call, then check the result */ nnz = 0; i = 0; j = 0; while (nnz++ < nnz_total) { if (i >= m->size1) { i = 0; if (++j >= m->size2) break; } FUNCTION (gsl_spmatrix, set) (m, i++, j, x); } status = 0; nnz = 0; i = 0; j = 0; while (nnz++ < nnz_total) { if (i >= m->size1) { i = 0; if (++j >= m->size2) break; } if (FUNCTION (gsl_spmatrix, get) (m, i++, j) != x) status = 1; } gsl_test (status, NAME (gsl_spmatrix) "_realloc[%zu,%zu]", M, N); FUNCTION (gsl_spmatrix, free) (m); } static void FUNCTION (test, getset) (const size_t M, const size_t N, const int sptype) { TYPE (gsl_spmatrix) * A = FUNCTION (gsl_spmatrix, alloc_nzmax) (M, N, M * N, GSL_SPMATRIX_COO); TYPE (gsl_spmatrix) * B = NULL; size_t i, j, idx; size_t k = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { k++; FUNCTION (gsl_spmatrix, set) (A, i, j, (BASE) k); } } status = 0; k = 0; idx = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { k++; if ((A->i[idx] != (int) i) || (A->p[idx] != (int) j) || (A->data[idx] != (BASE) k)) status = 1; idx++; } } gsl_test (status, NAME (gsl_spmatrix) "_set[%zu,%zu] writes into arrays", M, N); B = FUNCTION (gsl_spmatrix, compress) (A, sptype); status = 0; k = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { k++; if (FUNCTION (gsl_spmatrix, get) (B, i, j) != (BASE) k) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) "_get[%zu,%zu](%s) reads from arrays", M, N, FUNCTION (gsl_spmatrix, type) (B)); status = FUNCTION (gsl_spmatrix, nnz) (B) != M * N; gsl_test (status, NAME (gsl_spmatrix) "_nnz[%zu,%zu](%s) %zu/%zu", M, N, FUNCTION (gsl_spmatrix, type) (B), FUNCTION (gsl_spmatrix, nnz) (B), M * N); /* test gsl_spmatrix_ptr */ status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE mij = FUNCTION (gsl_spmatrix, get) (B, i, j); BASE * ptr = FUNCTION (gsl_spmatrix, ptr) (B, i, j); if (ptr != NULL) { *ptr += (ATOMIC) 2; if (FUNCTION (gsl_spmatrix, get) (B, i, j) != (BASE) (mij + (ATOMIC) 2)) status = 1; } } } gsl_test (status, NAME (gsl_spmatrix) "_ptr[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); /* test set_zero */ FUNCTION (gsl_spmatrix, set_zero) (B); status = FUNCTION (gsl_spmatrix, nnz) (B) != 0; gsl_test (status, NAME (gsl_spmatrix) "_set_zero[%zu,%zu](%s) nnz=%zu", M, N, FUNCTION (gsl_spmatrix, type) (B), FUNCTION (gsl_spmatrix, nnz) (B)); if (B->sptype == GSL_SPMATRIX_COO) { const size_t min = GSL_MIN(M, N); const size_t expected_nnz = min; size_t nnz; /* test setting duplicate values */ status = 0; k = 0; for (i = 0; i < min; ++i) { for (j = 0; j < 5; ++j) { BASE x = (BASE) ++k; BASE y; FUNCTION (gsl_spmatrix, set) (B, i, i, x); y = FUNCTION (gsl_spmatrix, get) (B, i, i); if (x != y) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) " duplicates[%zu,%zu]", M, N); nnz = FUNCTION (gsl_spmatrix, nnz) (B); status = nnz != expected_nnz; gsl_test (status, NAME (gsl_spmatrix) " duplicates nnz[%zu,%zu] %zu/%zu", M, N, nnz, expected_nnz); /* test setting an element to 0 */ FUNCTION (gsl_spmatrix, set) (B, 0, 0, (BASE) 1); FUNCTION (gsl_spmatrix, set) (B, 0, 0, (BASE) 0); status = FUNCTION (gsl_spmatrix, get) (B, 0, 0) != (BASE) 0; gsl_test (status, NAME (gsl_spmatrix) " zero element[%zu,%zu] %f", M, N, FUNCTION (gsl_spmatrix, get) (B, 0, 0)); } FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (B); } static void FUNCTION (test, memcpy) (const size_t M, const size_t N, const int sptype, const double density, gsl_rng * r) { /* test memcpy */ { TYPE (gsl_spmatrix) * m = FUNCTION (test, random) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * A = FUNCTION (gsl_spmatrix, compress) (m, sptype); TYPE (gsl_spmatrix) * B = FUNCTION (gsl_spmatrix, alloc_nzmax) (M, N, m->nz, sptype); TYPE (gsl_spmatrix) * C = FUNCTION (gsl_spmatrix, alloc_nzmax) (M, N, 1, sptype); FUNCTION (gsl_spmatrix, memcpy) (B, A); status = FUNCTION (gsl_spmatrix, equal) (A, B) != 1; gsl_test (status, NAME (gsl_spmatrix) "_memcpy[%zu,%zu](%s) equality", M, N, FUNCTION (gsl_spmatrix, type) (A)); /* this will force a realloc call */ FUNCTION (gsl_spmatrix, memcpy) (C, A); status = FUNCTION (gsl_spmatrix, equal) (A, C) != 1; gsl_test (status, NAME (gsl_spmatrix) "_memcpy[%zu,%zu](%s) realloc equality", M, N, FUNCTION (gsl_spmatrix, type) (A)); FUNCTION (gsl_spmatrix, free) (m); FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (B); FUNCTION (gsl_spmatrix, free) (C); } /* test transpose memcpy */ { TYPE (gsl_spmatrix) * m = FUNCTION (test, random) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * A = FUNCTION (gsl_spmatrix, compress) (m, sptype); TYPE (gsl_spmatrix) * AT = FUNCTION (gsl_spmatrix, alloc_nzmax) (N, M, m->nz, sptype); TYPE (gsl_spmatrix) * BT = FUNCTION (gsl_spmatrix, alloc_nzmax) (N, M, 1, sptype); size_t i, j; FUNCTION (gsl_spmatrix, transpose_memcpy) (AT, A); FUNCTION (gsl_spmatrix, transpose_memcpy) (BT, A); /* force realloc call */ status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE Aij = FUNCTION (gsl_spmatrix, get) (A, i, j); BASE ATji = FUNCTION (gsl_spmatrix, get) (AT, j, i); BASE BTji = FUNCTION (gsl_spmatrix, get) (BT, j, i); if (Aij != ATji) status = 1; if (Aij != BTji) status = 2; } } gsl_test(status == 1, NAME (gsl_spmatrix) "_transpose_memcpy[%zu,%zu](%s) AT", M, N, FUNCTION (gsl_spmatrix, type) (A)); gsl_test(status == 2, NAME (gsl_spmatrix) "_transpose_memcpy[%zu,%zu](%s) BT", M, N, FUNCTION (gsl_spmatrix, type) (A)); FUNCTION (gsl_spmatrix, free) (m); FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (AT); FUNCTION (gsl_spmatrix, free) (BT); } } static void FUNCTION (test, transpose) (const size_t M, const size_t N, const int sptype, const double density, gsl_rng * r) { TYPE (gsl_spmatrix) * A = FUNCTION (test, random) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * B = FUNCTION (gsl_spmatrix, compress) (A, sptype); size_t i; FUNCTION (gsl_spmatrix, transpose) (B); status = 0; for (i = 0; i < A->nz; ++i) { BASE Aij = A->data[i]; BASE Bji = FUNCTION (gsl_spmatrix, get) (B, A->p[i], A->i[i]); if (Aij != Bji) status = 1; } gsl_test(status, NAME (gsl_spmatrix) "_transpose[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (B); } static void FUNCTION (test, scale) (const size_t M, const size_t N, const int sptype, const double density, gsl_rng * r) { TYPE (gsl_spmatrix) * A = FUNCTION (test, random) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * B = FUNCTION (gsl_spmatrix, compress) (A, sptype); TYPE (gsl_vector) * x; size_t i, j; FUNCTION (gsl_spmatrix, scale) (B, 2.0); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE aij = FUNCTION (gsl_spmatrix, get) (A, i, j); BASE bij = FUNCTION (gsl_spmatrix, get) (B, i, j); if (bij != (ATOMIC) (2*aij)) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) "_scale[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); /* reset B = A */ FUNCTION (gsl_spmatrix, free) (B); B = FUNCTION (gsl_spmatrix, compress) (A, sptype); /* test column scaling */ x = FUNCTION (gsl_vector, alloc) (A->size2); FUNCTION (test, random_vector) (x, 1.0, 20.0, r); FUNCTION (gsl_spmatrix, scale_columns) (B, x); status = 0; for (i = 0; i < A->nz; ++i) { BASE aij = A->data[i]; BASE bij = FUNCTION (gsl_spmatrix, get) (B, A->i[i], A->p[i]); BASE xj = FUNCTION (gsl_vector, get) (x, A->p[i]); if (bij != (ATOMIC) (xj * aij)) status = 1; } gsl_test (status, NAME (gsl_spmatrix) "_scale_columns[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); FUNCTION (gsl_vector, free) (x); /* reset B = A */ FUNCTION (gsl_spmatrix, free) (B); B = FUNCTION (gsl_spmatrix, compress) (A, sptype); /* test row scaling */ x = FUNCTION (gsl_vector, alloc) (A->size1); FUNCTION (test, random_vector) (x, 1.0, 20.0, r); FUNCTION (gsl_spmatrix, scale_rows) (B, x); status = 0; for (i = 0; i < A->nz; ++i) { BASE aij = A->data[i]; BASE bij = FUNCTION (gsl_spmatrix, get) (B, A->i[i], A->p[i]); BASE xi = FUNCTION (gsl_vector, get) (x, A->i[i]); if (bij != (ATOMIC) (xi * aij)) status = 1; } gsl_test (status, NAME (gsl_spmatrix) "_scale_rows[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); FUNCTION (gsl_vector, free) (x); FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (B); } static void FUNCTION (test, add) (const size_t M, const size_t N, const int sptype, const double density, gsl_rng * r) { TYPE (gsl_spmatrix) * m1 = FUNCTION (test, random) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * m2 = FUNCTION (test, random) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * A = FUNCTION (gsl_spmatrix, compress) (m1, sptype); TYPE (gsl_spmatrix) * B = FUNCTION (gsl_spmatrix, compress) (m2, sptype); TYPE (gsl_spmatrix) * C = FUNCTION (gsl_spmatrix, alloc_nzmax) (M, N, 1, sptype); size_t i, j; FUNCTION (gsl_spmatrix, add) (C, A, B); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE aij = FUNCTION (gsl_spmatrix, get) (A, i, j); BASE bij = FUNCTION (gsl_spmatrix, get) (B, i, j); BASE cij = FUNCTION (gsl_spmatrix, get) (C, i, j); if (aij + bij != cij) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) "_add[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (A)); /* test again with C = 2*A */ FUNCTION (gsl_spmatrix, add) (C, A, A); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE aij = FUNCTION (gsl_spmatrix, get) (A, i, j); BASE cij = FUNCTION (gsl_spmatrix, get) (C, i, j); if (aij + aij != cij) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) "_add[%zu,%zu](%s) duplicate", M, N, FUNCTION (gsl_spmatrix, type) (A)); FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (B); FUNCTION (gsl_spmatrix, free) (C); FUNCTION (gsl_spmatrix, free) (m1); FUNCTION (gsl_spmatrix, free) (m2); } static void FUNCTION (test, dense_add) (const size_t M, const size_t N, const int sptype, const double density, gsl_rng * r) { TYPE (gsl_spmatrix) * m = FUNCTION (test, random) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * B = FUNCTION (gsl_spmatrix, compress) (m, sptype); TYPE (gsl_matrix) * A = FUNCTION (gsl_matrix, alloc) (M, N); TYPE (gsl_matrix) * A_copy = FUNCTION (gsl_matrix, alloc) (M, N); size_t i, j; FUNCTION (test, random_dense) (A, 1.0, 20.0, r); FUNCTION (gsl_matrix, memcpy) (A_copy, A); FUNCTION (gsl_spmatrix, dense_add) (A, B); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE aij = FUNCTION (gsl_matrix, get) (A_copy, i, j); BASE bij = FUNCTION (gsl_spmatrix, get) (B, i, j); BASE cij = FUNCTION (gsl_matrix, get) (A, i, j); if (aij + bij != cij) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) "_dense_add[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); FUNCTION (gsl_matrix, free) (A); FUNCTION (gsl_matrix, free) (A_copy); FUNCTION (gsl_spmatrix, free) (B); FUNCTION (gsl_spmatrix, free) (m); } static void FUNCTION (test, dense_sub) (const size_t M, const size_t N, const int sptype, const double density, gsl_rng * r) { TYPE (gsl_spmatrix) * m = FUNCTION (test, random) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * B = FUNCTION (gsl_spmatrix, compress) (m, sptype); TYPE (gsl_matrix) * A = FUNCTION (gsl_matrix, alloc) (M, N); TYPE (gsl_matrix) * A_copy = FUNCTION (gsl_matrix, alloc) (M, N); size_t i, j; FUNCTION (test, random_dense) (A, 1.0, 20.0, r); FUNCTION (gsl_matrix, memcpy) (A_copy, A); FUNCTION (gsl_spmatrix, dense_sub) (A, B); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE aij = FUNCTION (gsl_matrix, get) (A_copy, i, j); BASE bij = FUNCTION (gsl_spmatrix, get) (B, i, j); BASE cij = FUNCTION (gsl_matrix, get) (A, i, j); if ((BASE) (aij - bij) != cij) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) "_dense_sub[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); FUNCTION (gsl_matrix, free) (A); FUNCTION (gsl_matrix, free) (A_copy); FUNCTION (gsl_spmatrix, free) (B); FUNCTION (gsl_spmatrix, free) (m); } static void FUNCTION (test, convert) (const size_t M, const size_t N, const int sptype, const double density, gsl_rng * r) { TYPE (gsl_spmatrix) * A = FUNCTION (test, random) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * B = FUNCTION (gsl_spmatrix, compress) (A, sptype); TYPE (gsl_spmatrix) * C = FUNCTION (gsl_spmatrix, alloc_nzmax) (M, N, 1, GSL_SPMATRIX_COO); TYPE (gsl_matrix) * D = FUNCTION (gsl_matrix, alloc) (M, N); size_t i, j; /* convert D := B */ FUNCTION (gsl_spmatrix, sp2d) (D, B); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE bij = FUNCTION (gsl_spmatrix, get) (B, i, j); BASE dij = FUNCTION (gsl_matrix, get) (D, i, j); if (bij != dij) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) "_sp2d[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); /* convert C := D */ FUNCTION (gsl_spmatrix, d2sp) (C, D); status = FUNCTION (gsl_spmatrix, equal) (A, C) != 1; gsl_test (status, NAME (gsl_spmatrix) "_d2sp[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (B); FUNCTION (gsl_spmatrix, free) (C); FUNCTION (gsl_matrix, free) (D); } static void FUNCTION (test, minmax) (const size_t M, const size_t N, const int sptype, const double density, gsl_rng * r) { TYPE (gsl_spmatrix) * A = FUNCTION (test, random) (M, N, density, 5.0, 20.0, r); TYPE (gsl_spmatrix) * B; BASE min, max; size_t imin, jmin; FUNCTION (gsl_spmatrix, set) (A, 4, 3, (BASE) 12); FUNCTION (gsl_spmatrix, set) (A, 3, 5, (BASE) 5); FUNCTION (gsl_spmatrix, set) (A, 1, 1, (BASE) 10); FUNCTION (gsl_spmatrix, set) (A, 7, 3, (BASE) 2); FUNCTION (gsl_spmatrix, set) (A, 1, 0, (BASE) 30); B = FUNCTION (gsl_spmatrix, compress) (A, sptype); FUNCTION (gsl_spmatrix, minmax) (B, &min, &max); status = min != (BASE) 2; gsl_test (status, NAME (gsl_spmatrix) "_minmax[%zu,%zu](%s) minimum", M, N, FUNCTION (gsl_spmatrix, type) (B)); status = max != (BASE) 30; gsl_test (status, NAME (gsl_spmatrix) "_minmax[%zu,%zu](%s) maximum", M, N, FUNCTION (gsl_spmatrix, type) (B)); FUNCTION (gsl_spmatrix, min_index) (B, &imin, &jmin); status = imin != 7; gsl_test (status, NAME (gsl_spmatrix) "_min_index[%zu,%zu](%s) imin", M, N, FUNCTION (gsl_spmatrix, type) (B)); status = jmin != 3; gsl_test (status, NAME (gsl_spmatrix) "_min_index[%zu,%zu](%s) jmin", M, N, FUNCTION (gsl_spmatrix, type) (B)); FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (B); } #if !defined(UNSIGNED) && !defined(BASE_CHAR) static void FUNCTION (test, norm) (const size_t M, const size_t N, const int sptype) { TYPE (gsl_spmatrix) * A = FUNCTION (gsl_spmatrix, alloc) (M, N); TYPE (gsl_spmatrix) * B; ATOMIC norm, norm_expected; size_t i, j, k = 0; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { k++; FUNCTION (gsl_spmatrix, set) (A, i, j, (BASE) k); } } B = FUNCTION (gsl_spmatrix, compress) (A, sptype); norm = FUNCTION (gsl_spmatrix, norm1) (B); norm_expected = N*M*(M+1)/2; status = norm != norm_expected; gsl_test (status, NAME (gsl_spmatrix) "_norm1[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (B); } #endif static void FUNCTION (test, io_ascii) (const size_t M, const size_t N, const int sptype, const double density, gsl_rng * r) { TYPE (gsl_spmatrix) * A = FUNCTION (test, random_int) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * B = FUNCTION (gsl_spmatrix, compress) (A, sptype); TYPE (gsl_spmatrix) * C; char filename[] = "test.dat"; FILE *f; f = fopen (filename, "w"); FUNCTION (gsl_spmatrix, fprintf) (f, B, OUT_FORMAT); fclose (f); f = fopen (filename, "r"); C = FUNCTION (gsl_spmatrix, fscanf) (f); fclose (f); status = FUNCTION (gsl_spmatrix, equal) (A, C) != 1; gsl_test (status, NAME (gsl_spmatrix) "_fscanf[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); unlink (filename); FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (B); FUNCTION (gsl_spmatrix, free) (C); } static void FUNCTION (test, io_binary) (const size_t M, const size_t N, const int sptype, const double density, gsl_rng * r) { TYPE (gsl_spmatrix) * A = FUNCTION (test, random) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * B = FUNCTION (gsl_spmatrix, compress) (A, sptype); TYPE (gsl_spmatrix) * C = FUNCTION (gsl_spmatrix, alloc_nzmax) (M, N, A->nz, sptype); char filename[] = "test.dat"; FILE *f; f = fopen (filename, "wb"); FUNCTION (gsl_spmatrix, fwrite) (f, B); fclose (f); f = fopen (filename, "rb"); FUNCTION (gsl_spmatrix, fread) (f, C); fclose (f); status = FUNCTION (gsl_spmatrix, equal) (B, C) != 1; gsl_test (status, NAME (gsl_spmatrix) "_fread[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); unlink (filename); FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (B); FUNCTION (gsl_spmatrix, free) (C); } static void FUNCTION (test, all) (const size_t M, const size_t N, const double density, gsl_rng * r) { FUNCTION (test, alloc) (M, N, GSL_SPMATRIX_COO); FUNCTION (test, alloc) (M, N, GSL_SPMATRIX_CSC); FUNCTION (test, alloc) (M, N, GSL_SPMATRIX_CSR); FUNCTION (test, realloc) (M, N); FUNCTION (test, getset) (M, N, GSL_SPMATRIX_COO); FUNCTION (test, getset) (M, N, GSL_SPMATRIX_CSC); FUNCTION (test, getset) (M, N, GSL_SPMATRIX_CSR); FUNCTION (test, memcpy) (M, N, GSL_SPMATRIX_COO, density, r); FUNCTION (test, memcpy) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, memcpy) (M, N, GSL_SPMATRIX_CSR, density, r); FUNCTION (test, transpose) (M, N, GSL_SPMATRIX_COO, density, r); FUNCTION (test, transpose) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, transpose) (M, N, GSL_SPMATRIX_CSR, density, r); FUNCTION (test, scale) (M, N, GSL_SPMATRIX_COO, density, r); FUNCTION (test, scale) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, scale) (M, N, GSL_SPMATRIX_CSR, density, r); FUNCTION (test, add) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, add) (M, N, GSL_SPMATRIX_CSR, density, r); FUNCTION (test, dense_add) (M, N, GSL_SPMATRIX_COO, density, r); FUNCTION (test, dense_add) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, dense_add) (M, N, GSL_SPMATRIX_CSR, density, r); FUNCTION (test, dense_sub) (M, N, GSL_SPMATRIX_COO, density, r); FUNCTION (test, dense_sub) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, dense_sub) (M, N, GSL_SPMATRIX_CSR, density, r); FUNCTION (test, convert) (M, N, GSL_SPMATRIX_COO, density, r); FUNCTION (test, convert) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, convert) (M, N, GSL_SPMATRIX_CSR, density, r); FUNCTION (test, minmax) (M, N, GSL_SPMATRIX_COO, density, r); FUNCTION (test, minmax) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, minmax) (M, N, GSL_SPMATRIX_CSR, density, r); #if !defined(UNSIGNED) && !defined(BASE_CHAR) FUNCTION (test, norm) (M, N, GSL_SPMATRIX_COO); FUNCTION (test, norm) (M, N, GSL_SPMATRIX_CSC); FUNCTION (test, norm) (M, N, GSL_SPMATRIX_CSR); #endif FUNCTION (test, io_ascii) (M, N, GSL_SPMATRIX_COO, density, r); FUNCTION (test, io_ascii) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, io_ascii) (M, N, GSL_SPMATRIX_CSR, density, r); FUNCTION (test, io_binary) (M, N, GSL_SPMATRIX_COO, density, r); FUNCTION (test, io_binary) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, io_binary) (M, N, GSL_SPMATRIX_CSR, density, r); } gsl-2.7.1/spmatrix/test_complex_source.c0000644016036000116100000006461614032245137015345 00000000000000/* spmatrix/test_complex_source.c * * Copyright (C) 2018, 2019, 2020 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. */ /* test_random() Create a random sparse matrix with approximately M*N*density non-zero entries in [lower,upper] 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 lower - lower bound on entries upper - upper bound on entries 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 TYPE (gsl_spmatrix) * FUNCTION (test, random)(const size_t M, const size_t N, const double density, const double lower, const double upper, const gsl_rng *r) { size_t nnzwanted = (size_t) floor(M * N * GSL_MIN(density, 1.0)); TYPE (gsl_spmatrix) * m = FUNCTION (gsl_spmatrix, alloc_nzmax) (M, N, nnzwanted, GSL_SPMATRIX_COO); while (FUNCTION (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 */ BASE z; GSL_REAL (z) = (ATOMIC) (gsl_rng_uniform(r) * (upper - lower) + lower); GSL_IMAG (z) = (ATOMIC) (gsl_rng_uniform(r) * (upper - lower) + lower); FUNCTION (gsl_spmatrix, set) (m, i, j, z); } return m; } static TYPE (gsl_spmatrix) * FUNCTION (test, random_int)(const size_t M, const size_t N, const double density, const double lower, const double upper, const gsl_rng *r) { size_t nnzwanted = (size_t) floor(M * N * GSL_MIN(density, 1.0)); TYPE (gsl_spmatrix) * m = FUNCTION (gsl_spmatrix, alloc_nzmax) (M, N, nnzwanted, GSL_SPMATRIX_COO); while (FUNCTION (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 xr = (int) (gsl_rng_uniform(r) * (upper - lower) + lower); int xi = (int) (gsl_rng_uniform(r) * (upper - lower) + lower); BASE x; GSL_REAL(x) = (ATOMIC) xr; GSL_IMAG(x) = (ATOMIC) xi; FUNCTION (gsl_spmatrix, set) (m, i, j, x); } return m; } static void FUNCTION (test, random_dense)(TYPE (gsl_matrix) * m, const double lower, const double upper, const gsl_rng *r) { const size_t M = m->size1; const size_t N = m->size2; size_t i, j; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { double x; BASE z; x = gsl_rng_uniform(r) * (upper - lower) + lower; GSL_REAL (z) = (ATOMIC) x; x = gsl_rng_uniform(r) * (upper - lower) + lower; GSL_IMAG (z) = (ATOMIC) x; FUNCTION (gsl_matrix, set) (m, i, j, z); } } } static void FUNCTION (test, random_vector)(TYPE (gsl_vector) * x, const double lower, const double upper, const gsl_rng *r) { size_t i; for (i = 0; i < x->size; ++i) { BASE z; GSL_REAL (z) = gsl_rng_uniform(r) * (upper - lower) + lower; GSL_IMAG (z) = gsl_rng_uniform(r) * (upper - lower) + lower; FUNCTION (gsl_vector, set) (x, i, z); } } static void FUNCTION (test, alloc) (const size_t M, const size_t N, const int sptype) { TYPE (gsl_spmatrix) * m = FUNCTION (gsl_spmatrix, alloc_nzmax) (M, N, 10, sptype); size_t i, j; gsl_test (m->data == 0, NAME (gsl_spmatrix) "_alloc(%s) returns valid data pointer", FUNCTION (gsl_spmatrix, type) (m)); gsl_test (m->i == 0, NAME (gsl_spmatrix) "_alloc(%s) returns valid i pointer", FUNCTION (gsl_spmatrix, type) (m)); gsl_test (m->p == 0, NAME (gsl_spmatrix) "_alloc(%s) returns valid p pointer", FUNCTION (gsl_spmatrix, type) (m)); gsl_test (m->size1 != M, NAME (gsl_spmatrix) "_alloc(%s) returns valid size1", FUNCTION (gsl_spmatrix, type) (m)); gsl_test (m->size2 != N, NAME (gsl_spmatrix) "_alloc(%s) returns valid size2", FUNCTION (gsl_spmatrix, type) (m)); gsl_test (m->nz != 0, NAME (gsl_spmatrix) "_alloc(%s) returns valid nz", FUNCTION (gsl_spmatrix, type) (m)); gsl_test (m->sptype != sptype, NAME (gsl_spmatrix) "_alloc(%s) returns valid sptype", FUNCTION (gsl_spmatrix, type) (m)); /* test that a newly allocated matrix is initialized to zero */ status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE mij = FUNCTION (gsl_spmatrix, get) (m, i, j); if (GSL_REAL(mij) != (ATOMIC) 0 || GSL_IMAG(mij) != (ATOMIC) 0) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) "_alloc(%s) initializes matrix to zero", FUNCTION (gsl_spmatrix, type) (m)); FUNCTION (gsl_spmatrix, free) (m); } static void FUNCTION (test, realloc) (const size_t M, const size_t N) { TYPE (gsl_spmatrix) * m = FUNCTION (gsl_spmatrix, alloc_nzmax) (M, N, 10, GSL_SPMATRIX_COO); const size_t nnz_total = 30; BASE z; size_t i, j, nnz; GSL_REAL (z) = (ATOMIC) 5; GSL_IMAG (z) = (ATOMIC) 200; /* add enough elements to m to trigger a realloc call, then check the result */ nnz = 0; i = 0; j = 0; while (nnz++ < nnz_total) { if (i >= m->size1) { i = 0; if (++j >= m->size2) break; } FUNCTION (gsl_spmatrix, set) (m, i++, j, z); } status = 0; nnz = 0; i = 0; j = 0; while (nnz++ < nnz_total) { BASE y; if (i >= m->size1) { i = 0; if (++j >= m->size2) break; } y = FUNCTION (gsl_spmatrix, get) (m, i++, j); if (GSL_REAL(y) != GSL_REAL(z) || GSL_IMAG(y) != GSL_IMAG(z)) status = 1; } gsl_test (status, NAME (gsl_spmatrix) "_realloc[%zu,%zu]", M, N); FUNCTION (gsl_spmatrix, free) (m); } static void FUNCTION (test, getset) (const size_t M, const size_t N, const int sptype) { TYPE (gsl_spmatrix) * A = FUNCTION (gsl_spmatrix, alloc_nzmax) (M, N, M * N, GSL_SPMATRIX_COO); TYPE (gsl_spmatrix) * B = NULL; size_t i, j; size_t k = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE z; GSL_REAL(z) = (ATOMIC) k++; GSL_IMAG(z) = (ATOMIC) (k + 1000); FUNCTION (gsl_spmatrix, set) (A, i, j, z); } } status = 0; k = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE z; GSL_REAL(z) = (ATOMIC) k++; GSL_IMAG(z) = (ATOMIC) (k + 1000); if ((A->i[k - 1] != (int) i) || (A->p[k - 1] != (int) j) || (A->data[2*(k - 1)] != GSL_REAL(z)) || (A->data[2*(k - 1) + 1] != GSL_IMAG(z))) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) "_set[%zu,%zu] writes into arrays", M, N); B = FUNCTION (gsl_spmatrix, compress) (A, sptype); status = 0; k = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE y = FUNCTION (gsl_spmatrix, get) (B, i, j); BASE z; GSL_REAL(z) = (ATOMIC) k++; GSL_IMAG(z) = (ATOMIC) (k + 1000); if (GSL_REAL(y) != GSL_REAL(z) || GSL_IMAG(y) != GSL_IMAG(z)) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) "_get[%zu,%zu](%s) reads from arrays", M, N, FUNCTION (gsl_spmatrix, type) (B)); status = FUNCTION (gsl_spmatrix, nnz) (B) != M * N; gsl_test (status, NAME (gsl_spmatrix) "_nnz[%zu,%zu](%s) %zu", M, N, FUNCTION (gsl_spmatrix, type) (B), FUNCTION (gsl_spmatrix, nnz) (B)); /* test gsl_spmatrix_ptr */ status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE mij = FUNCTION (gsl_spmatrix, get) (B, i, j); BASE * ptr = FUNCTION (gsl_spmatrix, ptr) (B, i, j); BASE mij2; GSL_REAL(*ptr) += (ATOMIC) 2; GSL_IMAG(*ptr) += (ATOMIC) 5; mij2 = FUNCTION (gsl_spmatrix, get) (B, i, j); if ((GSL_REAL(mij2) != GSL_REAL(mij) + (ATOMIC) 2) || (GSL_IMAG(mij2) != GSL_IMAG(mij) + (ATOMIC) 5)) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) "_ptr[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); /* test set_zero */ FUNCTION (gsl_spmatrix, set_zero) (B); status = FUNCTION (gsl_spmatrix, nnz) (B) != 0; gsl_test (status, NAME (gsl_spmatrix) "_set_zero[%zu,%zu](%s) nnz=%zu", M, N, FUNCTION (gsl_spmatrix, type) (B), FUNCTION (gsl_spmatrix, nnz) (B)); if (B->sptype == GSL_SPMATRIX_COO) { const size_t min = GSL_MIN(M, N); const size_t expected_nnz = min; BASE one = ONE; BASE zero = ZERO; size_t nnz; BASE z; /* test setting duplicate values */ status = 0; k = 0; for (i = 0; i < min; ++i) { for (j = 0; j < 5; ++j) { BASE x, y; GSL_REAL(x) = (ATOMIC) k++; GSL_IMAG(x) = (ATOMIC) (k + 1000); FUNCTION (gsl_spmatrix, set) (B, i, i, x); y = FUNCTION (gsl_spmatrix, get) (B, i, i); if (GSL_REAL(x) != GSL_REAL(y) || GSL_IMAG(x) != GSL_IMAG(y)) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) " duplicates[%zu,%zu]", M, N); nnz = FUNCTION (gsl_spmatrix, nnz) (B); status = nnz != expected_nnz; gsl_test (status, NAME (gsl_spmatrix) " duplicates nnz[%zu,%zu] %zu/%zu", M, N, nnz, expected_nnz); /* test setting an element to 0 */ FUNCTION (gsl_spmatrix, set) (B, 0, 0, one); FUNCTION (gsl_spmatrix, set) (B, 0, 0, zero); z = FUNCTION (gsl_spmatrix, get) (B, 0, 0); status = GSL_REAL(z) != (ATOMIC) 0 || GSL_IMAG(z) != (ATOMIC) 0; gsl_test (status, NAME (gsl_spmatrix) " zero element[%zu,%zu] %f", M, N, FUNCTION (gsl_spmatrix, get) (B, 0, 0)); } FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (B); } static void FUNCTION (test, memcpy) (const size_t M, const size_t N, const int sptype, const double density, gsl_rng * r) { /* test memcpy */ { TYPE (gsl_spmatrix) * m = FUNCTION (test, random) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * A = FUNCTION (gsl_spmatrix, compress) (m, sptype); TYPE (gsl_spmatrix) * B = FUNCTION (gsl_spmatrix, alloc_nzmax) (M, N, m->nz, sptype); FUNCTION (gsl_spmatrix, memcpy) (B, A); status = FUNCTION (gsl_spmatrix, equal) (A, B) != 1; gsl_test (status, NAME (gsl_spmatrix) "_memcpy[%zu,%zu](%s) equality", M, N, FUNCTION (gsl_spmatrix, type) (A)); FUNCTION (gsl_spmatrix, free) (m); FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (B); } /* test transpose memcpy */ { TYPE (gsl_spmatrix) * m = FUNCTION (test, random) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * A = FUNCTION (gsl_spmatrix, compress) (m, sptype); TYPE (gsl_spmatrix) * AT = FUNCTION (gsl_spmatrix, alloc_nzmax) (N, M, m->nz, sptype); size_t i, j; FUNCTION (gsl_spmatrix, transpose_memcpy) (AT, A); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE Aij = FUNCTION (gsl_spmatrix, get) (A, i, j); BASE ATji = FUNCTION (gsl_spmatrix, get) (AT, j, i); if (GSL_REAL(Aij) != GSL_REAL(ATji) || GSL_IMAG(Aij) != GSL_IMAG(ATji)) status = 1; } } gsl_test(status, NAME (gsl_spmatrix) "_transpose_memcpy[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (A)); FUNCTION (gsl_spmatrix, free) (m); FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (AT); } } static void FUNCTION (test, transpose) (const size_t M, const size_t N, const int sptype, const double density, gsl_rng * r) { TYPE (gsl_spmatrix) * A = FUNCTION (test, random) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * B = FUNCTION (gsl_spmatrix, compress) (A, sptype); size_t i; FUNCTION (gsl_spmatrix, transpose) (B); status = 0; for (i = 0; i < A->nz; ++i) { BASE Aij = *(BASE *) &A->data[2 * i]; BASE Bji = FUNCTION (gsl_spmatrix, get) (B, A->p[i], A->i[i]); if (GSL_REAL(Aij) != GSL_REAL(Bji) || GSL_IMAG(Aij) != GSL_IMAG(Bji)) status = 1; } gsl_test(status, NAME (gsl_spmatrix) "_transpose[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (B); } static void FUNCTION (test, scale) (const size_t M, const size_t N, const int sptype, const double density, gsl_rng * r) { TYPE (gsl_spmatrix) * A = FUNCTION (test, random_int) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * B = FUNCTION (gsl_spmatrix, compress) (A, sptype); TYPE (gsl_vector) * x; BASE s; size_t i, j; GSL_SET_COMPLEX (&s, 2.0, 3.0); FUNCTION (gsl_spmatrix, scale) (B, s); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE aij = FUNCTION (gsl_spmatrix, get) (A, i, j); BASE bij = FUNCTION (gsl_spmatrix, get) (B, i, j); BASE cij; GSL_SET_COMPLEX(&cij, GSL_REAL(aij)*GSL_REAL(s) - GSL_IMAG(aij)*GSL_IMAG(s), GSL_IMAG(aij)*GSL_REAL(s) + GSL_REAL(aij)*GSL_IMAG(s)); if (GSL_REAL(bij) != GSL_REAL(cij) || GSL_IMAG(bij) != GSL_IMAG(cij)) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) "_scale[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); /* reset B = A */ FUNCTION (gsl_spmatrix, free) (B); B = FUNCTION (gsl_spmatrix, compress) (A, sptype); /* test column scaling */ x = FUNCTION (gsl_vector, alloc) (A->size2); FUNCTION (test, random_vector) (x, 1.0, 20.0, r); FUNCTION (gsl_spmatrix, scale_columns) (B, x); status = 0; for (i = 0; i < A->nz; ++i) { BASE aij = *(BASE *) &A->data[2 * i]; BASE bij = FUNCTION (gsl_spmatrix, get) (B, A->i[i], A->p[i]); BASE xj = FUNCTION (gsl_vector, get) (x, A->p[i]); BASE cij; /* aij * xj */ GSL_SET_COMPLEX(&cij, GSL_REAL(aij)*GSL_REAL(xj) - GSL_IMAG(aij)*GSL_IMAG(xj), GSL_IMAG(aij)*GSL_REAL(xj) + GSL_REAL(aij)*GSL_IMAG(xj)); gsl_test_rel(GSL_REAL(bij), GSL_REAL(cij), 10.0 * GSL_DBL_EPSILON, NAME (gsl_spmatrix) "_scale_columns[%zu,%zu](%s) real", M, N, FUNCTION (gsl_spmatrix, type) (B)); gsl_test_rel(GSL_IMAG(bij), GSL_IMAG(cij), 10.0 * GSL_DBL_EPSILON, NAME (gsl_spmatrix) "_scale_columns[%zu,%zu](%s) imag", M, N, FUNCTION (gsl_spmatrix, type) (B)); } FUNCTION (gsl_vector, free) (x); /* reset B = A */ FUNCTION (gsl_spmatrix, free) (B); B = FUNCTION (gsl_spmatrix, compress) (A, sptype); /* test row scaling */ x = FUNCTION (gsl_vector, alloc) (A->size1); FUNCTION (test, random_vector) (x, 1.0, 20.0, r); FUNCTION (gsl_spmatrix, scale_rows) (B, x); status = 0; for (i = 0; i < A->nz; ++i) { BASE aij = *(BASE *) &A->data[2 * i]; BASE bij = FUNCTION (gsl_spmatrix, get) (B, A->i[i], A->p[i]); BASE xi = FUNCTION (gsl_vector, get) (x, A->i[i]); BASE cij; /* aij * xi */ GSL_SET_COMPLEX(&cij, GSL_REAL(aij)*GSL_REAL(xi) - GSL_IMAG(aij)*GSL_IMAG(xi), GSL_IMAG(aij)*GSL_REAL(xi) + GSL_REAL(aij)*GSL_IMAG(xi)); gsl_test_rel(GSL_REAL(bij), GSL_REAL(cij), 10.0 * GSL_DBL_EPSILON, NAME (gsl_spmatrix) "_scale_rows[%zu,%zu](%s) real", M, N, FUNCTION (gsl_spmatrix, type) (B)); gsl_test_rel(GSL_IMAG(bij), GSL_IMAG(cij), 10.0 * GSL_DBL_EPSILON, NAME (gsl_spmatrix) "_scale_rows[%zu,%zu](%s) imag", M, N, FUNCTION (gsl_spmatrix, type) (B)); } FUNCTION (gsl_vector, free) (x); FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (B); } static void FUNCTION (test, add) (const size_t M, const size_t N, const int sptype, const double density, gsl_rng * r) { TYPE (gsl_spmatrix) * m1 = FUNCTION (test, random) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * m2 = FUNCTION (test, random) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * A = FUNCTION (gsl_spmatrix, compress) (m1, sptype); TYPE (gsl_spmatrix) * B = FUNCTION (gsl_spmatrix, compress) (m2, sptype); TYPE (gsl_spmatrix) * C = FUNCTION (gsl_spmatrix, alloc_nzmax) (M, N, 1, sptype); size_t i, j; FUNCTION (gsl_spmatrix, add) (C, A, B); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE aij = FUNCTION (gsl_spmatrix, get) (A, i, j); BASE bij = FUNCTION (gsl_spmatrix, get) (B, i, j); BASE cij = FUNCTION (gsl_spmatrix, get) (C, i, j); if ((GSL_REAL(aij) + GSL_REAL(bij) != GSL_REAL(cij)) || (GSL_IMAG(aij) + GSL_IMAG(bij) != GSL_IMAG(cij))) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) "_add[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (A)); /* test again with C = 2*A */ FUNCTION (gsl_spmatrix, add) (C, A, A); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE aij = FUNCTION (gsl_spmatrix, get) (A, i, j); BASE cij = FUNCTION (gsl_spmatrix, get) (C, i, j); if ((2 * GSL_REAL(aij) != GSL_REAL(cij)) || (2 * GSL_IMAG(aij) != GSL_IMAG(cij))) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) "_add[%zu,%zu](%s) duplicate", M, N, FUNCTION (gsl_spmatrix, type) (A)); FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (B); FUNCTION (gsl_spmatrix, free) (C); FUNCTION (gsl_spmatrix, free) (m1); FUNCTION (gsl_spmatrix, free) (m2); } static void FUNCTION (test, dense_add) (const size_t M, const size_t N, const int sptype, const double density, gsl_rng * r) { TYPE (gsl_spmatrix) * m = FUNCTION (test, random) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * B = FUNCTION (gsl_spmatrix, compress) (m, sptype); TYPE (gsl_matrix) * A = FUNCTION (gsl_matrix, alloc) (M, N); TYPE (gsl_matrix) * A_copy = FUNCTION (gsl_matrix, alloc) (M, N); size_t i, j; FUNCTION (test, random_dense) (A, 1.0, 20.0, r); FUNCTION (gsl_matrix, memcpy) (A_copy, A); FUNCTION (gsl_spmatrix, dense_add) (A, B); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE aij = FUNCTION (gsl_matrix, get) (A_copy, i, j); BASE bij = FUNCTION (gsl_spmatrix, get) (B, i, j); BASE cij = FUNCTION (gsl_matrix, get) (A, i, j); if ((GSL_REAL(aij) + GSL_REAL(bij) != GSL_REAL(cij)) || (GSL_IMAG(aij) + GSL_IMAG(bij) != GSL_IMAG(cij))) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) "_dense_add[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); FUNCTION (gsl_matrix, free) (A); FUNCTION (gsl_matrix, free) (A_copy); FUNCTION (gsl_spmatrix, free) (B); FUNCTION (gsl_spmatrix, free) (m); } static void FUNCTION (test, dense_sub) (const size_t M, const size_t N, const int sptype, const double density, gsl_rng * r) { TYPE (gsl_spmatrix) * m = FUNCTION (test, random) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * B = FUNCTION (gsl_spmatrix, compress) (m, sptype); TYPE (gsl_matrix) * A = FUNCTION (gsl_matrix, alloc) (M, N); TYPE (gsl_matrix) * A_copy = FUNCTION (gsl_matrix, alloc) (M, N); size_t i, j; FUNCTION (test, random_dense) (A, 1.0, 20.0, r); FUNCTION (gsl_matrix, memcpy) (A_copy, A); FUNCTION (gsl_spmatrix, dense_sub) (A, B); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE aij = FUNCTION (gsl_matrix, get) (A_copy, i, j); BASE bij = FUNCTION (gsl_spmatrix, get) (B, i, j); BASE cij = FUNCTION (gsl_matrix, get) (A, i, j); if ((GSL_REAL(aij) - GSL_REAL(bij) != GSL_REAL(cij)) || (GSL_IMAG(aij) - GSL_IMAG(bij) != GSL_IMAG(cij))) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) "_dense_sub[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); FUNCTION (gsl_matrix, free) (A); FUNCTION (gsl_matrix, free) (A_copy); FUNCTION (gsl_spmatrix, free) (B); FUNCTION (gsl_spmatrix, free) (m); } static void FUNCTION (test, convert) (const size_t M, const size_t N, const int sptype, const double density, gsl_rng * r) { TYPE (gsl_spmatrix) * A = FUNCTION (test, random) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * B = FUNCTION (gsl_spmatrix, compress) (A, sptype); TYPE (gsl_spmatrix) * C = FUNCTION (gsl_spmatrix, alloc_nzmax) (M, N, 1, GSL_SPMATRIX_COO); TYPE (gsl_matrix) * D = FUNCTION (gsl_matrix, alloc) (M, N); size_t i, j; /* convert D := B */ FUNCTION (gsl_spmatrix, sp2d) (D, B); status = 0; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { BASE bij = FUNCTION (gsl_spmatrix, get) (B, i, j); BASE dij = FUNCTION (gsl_matrix, get) (D, i, j); if ((GSL_REAL(bij) != GSL_REAL(dij)) || (GSL_IMAG(bij) != GSL_IMAG(dij))) status = 1; } } gsl_test (status, NAME (gsl_spmatrix) "_sp2d[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); /* convert C := D */ FUNCTION (gsl_spmatrix, d2sp) (C, D); status = FUNCTION (gsl_spmatrix, equal) (A, C) != 1; gsl_test (status, NAME (gsl_spmatrix) "_d2sp[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (B); FUNCTION (gsl_spmatrix, free) (C); FUNCTION (gsl_matrix, free) (D); } static void FUNCTION (test, io_ascii) (const size_t M, const size_t N, const int sptype, const double density, gsl_rng * r) { TYPE (gsl_spmatrix) * A = FUNCTION (test, random_int) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * B = FUNCTION (gsl_spmatrix, compress) (A, sptype); TYPE (gsl_spmatrix) * C; char filename[] = "test.dat"; FILE *f; f = fopen (filename, "w"); FUNCTION (gsl_spmatrix, fprintf) (f, B, OUT_FORMAT); fclose (f); f = fopen (filename, "r"); C = FUNCTION (gsl_spmatrix, fscanf) (f); fclose (f); status = FUNCTION (gsl_spmatrix, equal) (A, C) != 1; gsl_test (status, NAME (gsl_spmatrix) "_fscanf[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); unlink (filename); FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (B); FUNCTION (gsl_spmatrix, free) (C); } static void FUNCTION (test, io_binary) (const size_t M, const size_t N, const int sptype, const double density, gsl_rng * r) { TYPE (gsl_spmatrix) * A = FUNCTION (test, random) (M, N, density, 1.0, 20.0, r); TYPE (gsl_spmatrix) * B = FUNCTION (gsl_spmatrix, compress) (A, sptype); TYPE (gsl_spmatrix) * C = FUNCTION (gsl_spmatrix, alloc_nzmax) (M, N, A->nz, sptype); char filename[] = "test.dat"; FILE *f; f = fopen (filename, "wb"); FUNCTION (gsl_spmatrix, fwrite) (f, B); fclose (f); f = fopen (filename, "rb"); FUNCTION (gsl_spmatrix, fread) (f, C); fclose (f); status = FUNCTION (gsl_spmatrix, equal) (B, C) != 1; gsl_test (status, NAME (gsl_spmatrix) "_fread[%zu,%zu](%s)", M, N, FUNCTION (gsl_spmatrix, type) (B)); unlink (filename); FUNCTION (gsl_spmatrix, free) (A); FUNCTION (gsl_spmatrix, free) (B); FUNCTION (gsl_spmatrix, free) (C); } static void FUNCTION (test, all) (const size_t M, const size_t N, const double density, gsl_rng * r) { FUNCTION (test, alloc) (M, N, GSL_SPMATRIX_COO); FUNCTION (test, alloc) (M, N, GSL_SPMATRIX_CSC); FUNCTION (test, alloc) (M, N, GSL_SPMATRIX_CSR); FUNCTION (test, realloc) (M, N); FUNCTION (test, getset) (M, N, GSL_SPMATRIX_COO); FUNCTION (test, getset) (M, N, GSL_SPMATRIX_CSC); FUNCTION (test, getset) (M, N, GSL_SPMATRIX_CSR); FUNCTION (test, memcpy) (M, N, GSL_SPMATRIX_COO, density, r); FUNCTION (test, memcpy) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, memcpy) (M, N, GSL_SPMATRIX_CSR, density, r); FUNCTION (test, transpose) (M, N, GSL_SPMATRIX_COO, density, r); FUNCTION (test, transpose) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, transpose) (M, N, GSL_SPMATRIX_CSR, density, r); FUNCTION (test, scale) (M, N, GSL_SPMATRIX_COO, density, r); FUNCTION (test, scale) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, scale) (M, N, GSL_SPMATRIX_CSR, density, r); FUNCTION (test, add) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, add) (M, N, GSL_SPMATRIX_CSR, density, r); FUNCTION (test, dense_add) (M, N, GSL_SPMATRIX_COO, density, r); FUNCTION (test, dense_add) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, dense_add) (M, N, GSL_SPMATRIX_CSR, density, r); FUNCTION (test, dense_sub) (M, N, GSL_SPMATRIX_COO, density, r); FUNCTION (test, dense_sub) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, dense_sub) (M, N, GSL_SPMATRIX_CSR, density, r); FUNCTION (test, convert) (M, N, GSL_SPMATRIX_COO, density, r); FUNCTION (test, convert) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, convert) (M, N, GSL_SPMATRIX_CSR, density, r); FUNCTION (test, io_ascii) (M, N, GSL_SPMATRIX_COO, density, r); FUNCTION (test, io_ascii) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, io_ascii) (M, N, GSL_SPMATRIX_CSR, density, r); FUNCTION (test, io_binary) (M, N, GSL_SPMATRIX_COO, density, r); FUNCTION (test, io_binary) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, io_binary) (M, N, GSL_SPMATRIX_CSR, density, r); } gsl-2.7.1/spmatrix/gsl_spmatrix.h0000644016036000116100000000414713377336121013776 00000000000000#ifndef __GSL_SPMATRIX_H__ #define __GSL_SPMATRIX_H__ enum { GSL_SPMATRIX_COO = 0, /* coordinate/triplet representation */ GSL_SPMATRIX_CSC = 1, /* compressed sparse column */ GSL_SPMATRIX_CSR = 2, /* compressed sparse row */ GSL_SPMATRIX_TRIPLET = GSL_SPMATRIX_COO, GSL_SPMATRIX_CCS = GSL_SPMATRIX_CSC, GSL_SPMATRIX_CRS = GSL_SPMATRIX_CSR }; /* memory pool for binary tree node allocation */ struct gsl_spmatrix_pool_node { struct gsl_spmatrix_pool_node * next; void * block_ptr; /* pointer to memory block, of size n*tree_node_size */ unsigned char * free_slot; /* pointer to next available slot */ }; typedef struct gsl_spmatrix_pool_node gsl_spmatrix_pool; #define GSL_SPMATRIX_ISCOO(m) ((m)->sptype == GSL_SPMATRIX_COO) #define GSL_SPMATRIX_ISCSC(m) ((m)->sptype == GSL_SPMATRIX_CSC) #define GSL_SPMATRIX_ISCSR(m) ((m)->sptype == GSL_SPMATRIX_CSR) #define GSL_SPMATRIX_ISTRIPLET(m) GSL_SPMATRIX_ISCOO(m) #define GSL_SPMATRIX_ISCCS(m) GSL_SPMATRIX_ISCSC(m) #define GSL_SPMATRIX_ISCRS(m) GSL_SPMATRIX_ISCSR(m) #define GSL_SPMATRIX_FLG_GROW (1 << 0) /* allow size of matrix to grow as elements are added */ #define GSL_SPMATRIX_FLG_FIXED (1 << 1) /* sparsity pattern is fixed */ /* compare matrix entries (ia,ja) and (ib,jb) - sort by rows first, then by columns */ #define GSL_SPMATRIX_COMPARE_ROWCOL(m,ia,ja,ib,jb) ((ia) < (ib) ? -1 : ((ia) > (ib) ? 1 : ((ja) < (jb) ? -1 : ((ja) > (jb))))) /* common/utility functions */ void gsl_spmatrix_cumsum(const size_t n, int * c); #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /* __GSL_SPMATRIX_H__ */ gsl-2.7.1/spmatrix/gsl_spmatrix_char.h0000644016036000116100000001427613673205721014777 00000000000000/* spmatrix/gsl_spmatrix_char.h * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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_CHAR_H__ #define __GSL_SPMATRIX_CHAR_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 /* * COO format: * * If data[n] = A_{ij}, then: * i = A->i[n] * j = A->p[n] * * Compressed column format (CSC): * * 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 (CSR): * * 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: * * COO/CSC: row indices * CSR: column indices */ int *i; char *data; /* matrix elements of size nzmax */ /* * COO: p[n] = column number of element data[n] * CSC: p[j] = index in data of first non-zero element in column j * CSR: p[i] = index in data of first non-zero element in row i */ int *p; size_t nzmax; /* maximum number of matrix elements */ size_t nz; /* number of non-zero values in matrix */ gsl_bst_workspace *tree; /* binary tree structure */ gsl_spmatrix_pool *pool; /* memory pool for binary tree nodes */ size_t node_size; /* size of individual tree node in bytes */ /* * workspace of size MAX(size1,size2)*MAX(sizeof(char),sizeof(int)) * used in various routines */ union { void *work_void; int *work_int; char *work_atomic; } work; int sptype; /* sparse storage type */ size_t spflags; /* GSL_SPMATRIX_FLG_xxx */ } gsl_spmatrix_char; /* * Prototypes */ /* allocation / initialization */ gsl_spmatrix_char * gsl_spmatrix_char_alloc (const size_t n1, const size_t n2); gsl_spmatrix_char * gsl_spmatrix_char_alloc_nzmax (const size_t n1, const size_t n2, const size_t nzmax, const int sptype); void gsl_spmatrix_char_free (gsl_spmatrix_char * m); int gsl_spmatrix_char_realloc (const size_t nzmax, gsl_spmatrix_char * m); size_t gsl_spmatrix_char_nnz (const gsl_spmatrix_char * m); const char * gsl_spmatrix_char_type (const gsl_spmatrix_char * m); int gsl_spmatrix_char_set_zero (gsl_spmatrix_char * m); int gsl_spmatrix_char_tree_rebuild (gsl_spmatrix_char * m); /* compress */ int gsl_spmatrix_char_csc (gsl_spmatrix_char * dest, const gsl_spmatrix_char * src); int gsl_spmatrix_char_csr (gsl_spmatrix_char * dest, const gsl_spmatrix_char * src); gsl_spmatrix_char * gsl_spmatrix_char_compress (const gsl_spmatrix_char * src, const int sptype); gsl_spmatrix_char * gsl_spmatrix_char_compcol (const gsl_spmatrix_char * src); gsl_spmatrix_char * gsl_spmatrix_char_ccs (const gsl_spmatrix_char * src); gsl_spmatrix_char * gsl_spmatrix_char_crs (const gsl_spmatrix_char * src); /* copy */ int gsl_spmatrix_char_memcpy (gsl_spmatrix_char * dest, const gsl_spmatrix_char * src); /* file I/O */ int gsl_spmatrix_char_fprintf (FILE * stream, const gsl_spmatrix_char * m, const char * format); gsl_spmatrix_char * gsl_spmatrix_char_fscanf (FILE * stream); int gsl_spmatrix_char_fwrite (FILE * stream, const gsl_spmatrix_char * m); int gsl_spmatrix_char_fread (FILE * stream, gsl_spmatrix_char * m); /* get/set */ char gsl_spmatrix_char_get (const gsl_spmatrix_char * m, const size_t i, const size_t j); int gsl_spmatrix_char_set (gsl_spmatrix_char * m, const size_t i, const size_t j, const char x); char * gsl_spmatrix_char_ptr (const gsl_spmatrix_char * m, const size_t i, const size_t j); /* minmax */ int gsl_spmatrix_char_minmax (const gsl_spmatrix_char * m, char * min_out, char * max_out); int gsl_spmatrix_char_min_index (const gsl_spmatrix_char * m, size_t * imin_out, size_t * jmin_out); /* operations */ int gsl_spmatrix_char_scale (gsl_spmatrix_char * m, const char x); int gsl_spmatrix_char_scale_columns (gsl_spmatrix_char * m, const gsl_vector_char * x); int gsl_spmatrix_char_scale_rows (gsl_spmatrix_char * m, const gsl_vector_char * x); int gsl_spmatrix_char_add (gsl_spmatrix_char * c, const gsl_spmatrix_char * a, const gsl_spmatrix_char * b); int gsl_spmatrix_char_dense_add (gsl_matrix_char * a, const gsl_spmatrix_char * b); int gsl_spmatrix_char_dense_sub (gsl_matrix_char * a, const gsl_spmatrix_char * b); int gsl_spmatrix_char_d2sp (gsl_spmatrix_char * T, const gsl_matrix_char * A); int gsl_spmatrix_char_sp2d (gsl_matrix_char * A, const gsl_spmatrix_char * S); #ifndef GSL_DISABLE_DEPRECATED int gsl_spmatrix_char_add_to_dense (gsl_matrix_char * a, const gsl_spmatrix_char * b); #endif /* properties */ int gsl_spmatrix_char_equal (const gsl_spmatrix_char * a, const gsl_spmatrix_char * b); char gsl_spmatrix_char_norm1 (const gsl_spmatrix_char * a); /* swap */ int gsl_spmatrix_char_transpose (gsl_spmatrix_char * m); int gsl_spmatrix_char_transpose2 (gsl_spmatrix_char * m); int gsl_spmatrix_char_transpose_memcpy (gsl_spmatrix_char * dest, const gsl_spmatrix_char * src); __END_DECLS #endif /* __GSL_SPMATRIX_CHAR_H__ */ gsl-2.7.1/spmatrix/gsl_spmatrix_double.h0000644016036000116100000001340313673205721015323 00000000000000/* spmatrix/gsl_spmatrix_double.h * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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_DOUBLE_H__ #define __GSL_SPMATRIX_DOUBLE_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 /* * COO format: * * If data[n] = A_{ij}, then: * i = A->i[n] * j = A->p[n] * * Compressed column format (CSC): * * 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 (CSR): * * 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: * * COO/CSC: row indices * CSR: column indices */ int *i; double *data; /* matrix elements of size nzmax */ /* * COO: p[n] = column number of element data[n] * CSC: p[j] = index in data of first non-zero element in column j * CSR: p[i] = index in data of first non-zero element in row i */ int *p; size_t nzmax; /* maximum number of matrix elements */ size_t nz; /* number of non-zero values in matrix */ gsl_bst_workspace *tree; /* binary tree structure */ gsl_spmatrix_pool *pool; /* memory pool for binary tree nodes */ size_t node_size; /* size of individual tree node in bytes */ /* * workspace of size MAX(size1,size2)*MAX(sizeof(double),sizeof(int)) * used in various routines */ union { void *work_void; int *work_int; double *work_atomic; } work; int sptype; /* sparse storage type */ size_t spflags; /* GSL_SPMATRIX_FLG_xxx */ } gsl_spmatrix; /* * Prototypes */ /* allocation / initialization */ 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 int sptype); void gsl_spmatrix_free (gsl_spmatrix * m); int gsl_spmatrix_realloc (const size_t nzmax, gsl_spmatrix * m); size_t gsl_spmatrix_nnz (const gsl_spmatrix * m); const char * gsl_spmatrix_type (const gsl_spmatrix * m); int gsl_spmatrix_set_zero (gsl_spmatrix * m); int gsl_spmatrix_tree_rebuild (gsl_spmatrix * m); /* compress */ int gsl_spmatrix_csc (gsl_spmatrix * dest, const gsl_spmatrix * src); int gsl_spmatrix_csr (gsl_spmatrix * dest, const gsl_spmatrix * src); gsl_spmatrix * gsl_spmatrix_compress (const gsl_spmatrix * src, const int sptype); gsl_spmatrix * gsl_spmatrix_compcol (const gsl_spmatrix * src); gsl_spmatrix * gsl_spmatrix_ccs (const gsl_spmatrix * src); gsl_spmatrix * gsl_spmatrix_crs (const gsl_spmatrix * src); /* copy */ int gsl_spmatrix_memcpy (gsl_spmatrix * dest, const gsl_spmatrix * src); /* file I/O */ 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); /* get/set */ 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 (const gsl_spmatrix * m, const size_t i, const size_t j); /* minmax */ int gsl_spmatrix_minmax (const gsl_spmatrix * m, double * min_out, double * max_out); int gsl_spmatrix_min_index (const gsl_spmatrix * m, size_t * imin_out, size_t * jmin_out); /* operations */ int gsl_spmatrix_scale (gsl_spmatrix * m, const double x); int gsl_spmatrix_scale_columns (gsl_spmatrix * m, const gsl_vector * x); int gsl_spmatrix_scale_rows (gsl_spmatrix * m, const gsl_vector * x); int gsl_spmatrix_add (gsl_spmatrix * c, const gsl_spmatrix * a, const gsl_spmatrix * b); int gsl_spmatrix_dense_add (gsl_matrix * a, const gsl_spmatrix * b); int gsl_spmatrix_dense_sub (gsl_matrix * a, const gsl_spmatrix * b); int gsl_spmatrix_d2sp (gsl_spmatrix * T, const gsl_matrix * A); int gsl_spmatrix_sp2d (gsl_matrix * A, const gsl_spmatrix * S); #ifndef GSL_DISABLE_DEPRECATED int gsl_spmatrix_add_to_dense (gsl_matrix * a, const gsl_spmatrix * b); #endif /* properties */ int gsl_spmatrix_equal (const gsl_spmatrix * a, const gsl_spmatrix * b); double gsl_spmatrix_norm1 (const gsl_spmatrix * a); /* swap */ 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_DOUBLE_H__ */ gsl-2.7.1/spmatrix/gsl_spmatrix_float.h0000644016036000116100000001445513673205707015172 00000000000000/* spmatrix/gsl_spmatrix_float.h * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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_FLOAT_H__ #define __GSL_SPMATRIX_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 /* * COO format: * * If data[n] = A_{ij}, then: * i = A->i[n] * j = A->p[n] * * Compressed column format (CSC): * * 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 (CSR): * * 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: * * COO/CSC: row indices * CSR: column indices */ int *i; float *data; /* matrix elements of size nzmax */ /* * COO: p[n] = column number of element data[n] * CSC: p[j] = index in data of first non-zero element in column j * CSR: p[i] = index in data of first non-zero element in row i */ int *p; size_t nzmax; /* maximum number of matrix elements */ size_t nz; /* number of non-zero values in matrix */ gsl_bst_workspace *tree; /* binary tree structure */ gsl_spmatrix_pool *pool; /* memory pool for binary tree nodes */ size_t node_size; /* size of individual tree node in bytes */ /* * workspace of size MAX(size1,size2)*MAX(sizeof(float),sizeof(int)) * used in various routines */ union { void *work_void; int *work_int; float *work_atomic; } work; int sptype; /* sparse storage type */ size_t spflags; /* GSL_SPMATRIX_FLG_xxx */ } gsl_spmatrix_float; /* * Prototypes */ /* allocation / initialization */ gsl_spmatrix_float * gsl_spmatrix_float_alloc (const size_t n1, const size_t n2); gsl_spmatrix_float * gsl_spmatrix_float_alloc_nzmax (const size_t n1, const size_t n2, const size_t nzmax, const int sptype); void gsl_spmatrix_float_free (gsl_spmatrix_float * m); int gsl_spmatrix_float_realloc (const size_t nzmax, gsl_spmatrix_float * m); size_t gsl_spmatrix_float_nnz (const gsl_spmatrix_float * m); const char * gsl_spmatrix_float_type (const gsl_spmatrix_float * m); int gsl_spmatrix_float_set_zero (gsl_spmatrix_float * m); int gsl_spmatrix_float_tree_rebuild (gsl_spmatrix_float * m); /* compress */ int gsl_spmatrix_float_csc (gsl_spmatrix_float * dest, const gsl_spmatrix_float * src); int gsl_spmatrix_float_csr (gsl_spmatrix_float * dest, const gsl_spmatrix_float * src); gsl_spmatrix_float * gsl_spmatrix_float_compress (const gsl_spmatrix_float * src, const int sptype); gsl_spmatrix_float * gsl_spmatrix_float_compcol (const gsl_spmatrix_float * src); gsl_spmatrix_float * gsl_spmatrix_float_ccs (const gsl_spmatrix_float * src); gsl_spmatrix_float * gsl_spmatrix_float_crs (const gsl_spmatrix_float * src); /* copy */ int gsl_spmatrix_float_memcpy (gsl_spmatrix_float * dest, const gsl_spmatrix_float * src); /* file I/O */ int gsl_spmatrix_float_fprintf (FILE * stream, const gsl_spmatrix_float * m, const char * format); gsl_spmatrix_float * gsl_spmatrix_float_fscanf (FILE * stream); int gsl_spmatrix_float_fwrite (FILE * stream, const gsl_spmatrix_float * m); int gsl_spmatrix_float_fread (FILE * stream, gsl_spmatrix_float * m); /* get/set */ float gsl_spmatrix_float_get (const gsl_spmatrix_float * m, const size_t i, const size_t j); int gsl_spmatrix_float_set (gsl_spmatrix_float * m, const size_t i, const size_t j, const float x); float * gsl_spmatrix_float_ptr (const gsl_spmatrix_float * m, const size_t i, const size_t j); /* minmax */ int gsl_spmatrix_float_minmax (const gsl_spmatrix_float * m, float * min_out, float * max_out); int gsl_spmatrix_float_min_index (const gsl_spmatrix_float * m, size_t * imin_out, size_t * jmin_out); /* operations */ int gsl_spmatrix_float_scale (gsl_spmatrix_float * m, const float x); int gsl_spmatrix_float_scale_columns (gsl_spmatrix_float * m, const gsl_vector_float * x); int gsl_spmatrix_float_scale_rows (gsl_spmatrix_float * m, const gsl_vector_float * x); int gsl_spmatrix_float_add (gsl_spmatrix_float * c, const gsl_spmatrix_float * a, const gsl_spmatrix_float * b); int gsl_spmatrix_float_dense_add (gsl_matrix_float * a, const gsl_spmatrix_float * b); int gsl_spmatrix_float_dense_sub (gsl_matrix_float * a, const gsl_spmatrix_float * b); int gsl_spmatrix_float_d2sp (gsl_spmatrix_float * T, const gsl_matrix_float * A); int gsl_spmatrix_float_sp2d (gsl_matrix_float * A, const gsl_spmatrix_float * S); #ifndef GSL_DISABLE_DEPRECATED int gsl_spmatrix_float_add_to_dense (gsl_matrix_float * a, const gsl_spmatrix_float * b); #endif /* properties */ int gsl_spmatrix_float_equal (const gsl_spmatrix_float * a, const gsl_spmatrix_float * b); float gsl_spmatrix_float_norm1 (const gsl_spmatrix_float * a); /* swap */ int gsl_spmatrix_float_transpose (gsl_spmatrix_float * m); int gsl_spmatrix_float_transpose2 (gsl_spmatrix_float * m); int gsl_spmatrix_float_transpose_memcpy (gsl_spmatrix_float * dest, const gsl_spmatrix_float * src); __END_DECLS #endif /* __GSL_SPMATRIX_FLOAT_H__ */ gsl-2.7.1/spmatrix/gsl_spmatrix_int.h0000644016036000116100000001411713673205721014646 00000000000000/* spmatrix/gsl_spmatrix_int.h * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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_INT_H__ #define __GSL_SPMATRIX_INT_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 /* * COO format: * * If data[n] = A_{ij}, then: * i = A->i[n] * j = A->p[n] * * Compressed column format (CSC): * * 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 (CSR): * * 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: * * COO/CSC: row indices * CSR: column indices */ int *i; int *data; /* matrix elements of size nzmax */ /* * COO: p[n] = column number of element data[n] * CSC: p[j] = index in data of first non-zero element in column j * CSR: p[i] = index in data of first non-zero element in row i */ int *p; size_t nzmax; /* maximum number of matrix elements */ size_t nz; /* number of non-zero values in matrix */ gsl_bst_workspace *tree; /* binary tree structure */ gsl_spmatrix_pool *pool; /* memory pool for binary tree nodes */ size_t node_size; /* size of individual tree node in bytes */ /* * workspace of size MAX(size1,size2)*MAX(sizeof(int),sizeof(int)) * used in various routines */ union { void *work_void; int *work_int; int *work_atomic; } work; int sptype; /* sparse storage type */ size_t spflags; /* GSL_SPMATRIX_FLG_xxx */ } gsl_spmatrix_int; /* * Prototypes */ /* allocation / initialization */ gsl_spmatrix_int * gsl_spmatrix_int_alloc (const size_t n1, const size_t n2); gsl_spmatrix_int * gsl_spmatrix_int_alloc_nzmax (const size_t n1, const size_t n2, const size_t nzmax, const int sptype); void gsl_spmatrix_int_free (gsl_spmatrix_int * m); int gsl_spmatrix_int_realloc (const size_t nzmax, gsl_spmatrix_int * m); size_t gsl_spmatrix_int_nnz (const gsl_spmatrix_int * m); const char * gsl_spmatrix_int_type (const gsl_spmatrix_int * m); int gsl_spmatrix_int_set_zero (gsl_spmatrix_int * m); int gsl_spmatrix_int_tree_rebuild (gsl_spmatrix_int * m); /* compress */ int gsl_spmatrix_int_csc (gsl_spmatrix_int * dest, const gsl_spmatrix_int * src); int gsl_spmatrix_int_csr (gsl_spmatrix_int * dest, const gsl_spmatrix_int * src); gsl_spmatrix_int * gsl_spmatrix_int_compress (const gsl_spmatrix_int * src, const int sptype); gsl_spmatrix_int * gsl_spmatrix_int_compcol (const gsl_spmatrix_int * src); gsl_spmatrix_int * gsl_spmatrix_int_ccs (const gsl_spmatrix_int * src); gsl_spmatrix_int * gsl_spmatrix_int_crs (const gsl_spmatrix_int * src); /* copy */ int gsl_spmatrix_int_memcpy (gsl_spmatrix_int * dest, const gsl_spmatrix_int * src); /* file I/O */ int gsl_spmatrix_int_fprintf (FILE * stream, const gsl_spmatrix_int * m, const char * format); gsl_spmatrix_int * gsl_spmatrix_int_fscanf (FILE * stream); int gsl_spmatrix_int_fwrite (FILE * stream, const gsl_spmatrix_int * m); int gsl_spmatrix_int_fread (FILE * stream, gsl_spmatrix_int * m); /* get/set */ int gsl_spmatrix_int_get (const gsl_spmatrix_int * m, const size_t i, const size_t j); int gsl_spmatrix_int_set (gsl_spmatrix_int * m, const size_t i, const size_t j, const int x); int * gsl_spmatrix_int_ptr (const gsl_spmatrix_int * m, const size_t i, const size_t j); /* minmax */ int gsl_spmatrix_int_minmax (const gsl_spmatrix_int * m, int * min_out, int * max_out); int gsl_spmatrix_int_min_index (const gsl_spmatrix_int * m, size_t * imin_out, size_t * jmin_out); /* operations */ int gsl_spmatrix_int_scale (gsl_spmatrix_int * m, const int x); int gsl_spmatrix_int_scale_columns (gsl_spmatrix_int * m, const gsl_vector_int * x); int gsl_spmatrix_int_scale_rows (gsl_spmatrix_int * m, const gsl_vector_int * x); int gsl_spmatrix_int_add (gsl_spmatrix_int * c, const gsl_spmatrix_int * a, const gsl_spmatrix_int * b); int gsl_spmatrix_int_dense_add (gsl_matrix_int * a, const gsl_spmatrix_int * b); int gsl_spmatrix_int_dense_sub (gsl_matrix_int * a, const gsl_spmatrix_int * b); int gsl_spmatrix_int_d2sp (gsl_spmatrix_int * T, const gsl_matrix_int * A); int gsl_spmatrix_int_sp2d (gsl_matrix_int * A, const gsl_spmatrix_int * S); #ifndef GSL_DISABLE_DEPRECATED int gsl_spmatrix_int_add_to_dense (gsl_matrix_int * a, const gsl_spmatrix_int * b); #endif /* properties */ int gsl_spmatrix_int_equal (const gsl_spmatrix_int * a, const gsl_spmatrix_int * b); int gsl_spmatrix_int_norm1 (const gsl_spmatrix_int * a); /* swap */ int gsl_spmatrix_int_transpose (gsl_spmatrix_int * m); int gsl_spmatrix_int_transpose2 (gsl_spmatrix_int * m); int gsl_spmatrix_int_transpose_memcpy (gsl_spmatrix_int * dest, const gsl_spmatrix_int * src); __END_DECLS #endif /* __GSL_SPMATRIX_INT_H__ */ gsl-2.7.1/spmatrix/gsl_spmatrix_long_double.h0000644016036000116100000001570713673205721016353 00000000000000/* spmatrix/gsl_spmatrix_long_double.h * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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_LONG_DOUBLE_H__ #define __GSL_SPMATRIX_LONG_DOUBLE_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 /* * COO format: * * If data[n] = A_{ij}, then: * i = A->i[n] * j = A->p[n] * * Compressed column format (CSC): * * 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 (CSR): * * 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: * * COO/CSC: row indices * CSR: column indices */ int *i; long double *data; /* matrix elements of size nzmax */ /* * COO: p[n] = column number of element data[n] * CSC: p[j] = index in data of first non-zero element in column j * CSR: p[i] = index in data of first non-zero element in row i */ int *p; size_t nzmax; /* maximum number of matrix elements */ size_t nz; /* number of non-zero values in matrix */ gsl_bst_workspace *tree; /* binary tree structure */ gsl_spmatrix_pool *pool; /* memory pool for binary tree nodes */ size_t node_size; /* size of individual tree node in bytes */ /* * workspace of size MAX(size1,size2)*MAX(sizeof(long double),sizeof(int)) * used in various routines */ union { void *work_void; int *work_int; long double *work_atomic; } work; int sptype; /* sparse storage type */ size_t spflags; /* GSL_SPMATRIX_FLG_xxx */ } gsl_spmatrix_long_double; /* * Prototypes */ /* allocation / initialization */ gsl_spmatrix_long_double * gsl_spmatrix_long_double_alloc (const size_t n1, const size_t n2); gsl_spmatrix_long_double * gsl_spmatrix_long_double_alloc_nzmax (const size_t n1, const size_t n2, const size_t nzmax, const int sptype); void gsl_spmatrix_long_double_free (gsl_spmatrix_long_double * m); int gsl_spmatrix_long_double_realloc (const size_t nzmax, gsl_spmatrix_long_double * m); size_t gsl_spmatrix_long_double_nnz (const gsl_spmatrix_long_double * m); const char * gsl_spmatrix_long_double_type (const gsl_spmatrix_long_double * m); int gsl_spmatrix_long_double_set_zero (gsl_spmatrix_long_double * m); int gsl_spmatrix_long_double_tree_rebuild (gsl_spmatrix_long_double * m); /* compress */ int gsl_spmatrix_long_double_csc (gsl_spmatrix_long_double * dest, const gsl_spmatrix_long_double * src); int gsl_spmatrix_long_double_csr (gsl_spmatrix_long_double * dest, const gsl_spmatrix_long_double * src); gsl_spmatrix_long_double * gsl_spmatrix_long_double_compress (const gsl_spmatrix_long_double * src, const int sptype); gsl_spmatrix_long_double * gsl_spmatrix_long_double_compcol (const gsl_spmatrix_long_double * src); gsl_spmatrix_long_double * gsl_spmatrix_long_double_ccs (const gsl_spmatrix_long_double * src); gsl_spmatrix_long_double * gsl_spmatrix_long_double_crs (const gsl_spmatrix_long_double * src); /* copy */ int gsl_spmatrix_long_double_memcpy (gsl_spmatrix_long_double * dest, const gsl_spmatrix_long_double * src); /* file I/O */ int gsl_spmatrix_long_double_fprintf (FILE * stream, const gsl_spmatrix_long_double * m, const char * format); gsl_spmatrix_long_double * gsl_spmatrix_long_double_fscanf (FILE * stream); int gsl_spmatrix_long_double_fwrite (FILE * stream, const gsl_spmatrix_long_double * m); int gsl_spmatrix_long_double_fread (FILE * stream, gsl_spmatrix_long_double * m); /* get/set */ long double gsl_spmatrix_long_double_get (const gsl_spmatrix_long_double * m, const size_t i, const size_t j); int gsl_spmatrix_long_double_set (gsl_spmatrix_long_double * m, const size_t i, const size_t j, const long double x); long double * gsl_spmatrix_long_double_ptr (const gsl_spmatrix_long_double * m, const size_t i, const size_t j); /* minmax */ int gsl_spmatrix_long_double_minmax (const gsl_spmatrix_long_double * m, long double * min_out, long double * max_out); int gsl_spmatrix_long_double_min_index (const gsl_spmatrix_long_double * m, size_t * imin_out, size_t * jmin_out); /* operations */ int gsl_spmatrix_long_double_scale (gsl_spmatrix_long_double * m, const long double x); int gsl_spmatrix_long_double_scale_columns (gsl_spmatrix_long_double * m, const gsl_vector_long_double * x); int gsl_spmatrix_long_double_scale_rows (gsl_spmatrix_long_double * m, const gsl_vector_long_double * x); int gsl_spmatrix_long_double_add (gsl_spmatrix_long_double * c, const gsl_spmatrix_long_double * a, const gsl_spmatrix_long_double * b); int gsl_spmatrix_long_double_dense_add (gsl_matrix_long_double * a, const gsl_spmatrix_long_double * b); int gsl_spmatrix_long_double_dense_sub (gsl_matrix_long_double * a, const gsl_spmatrix_long_double * b); int gsl_spmatrix_long_double_d2sp (gsl_spmatrix_long_double * T, const gsl_matrix_long_double * A); int gsl_spmatrix_long_double_sp2d (gsl_matrix_long_double * A, const gsl_spmatrix_long_double * S); #ifndef GSL_DISABLE_DEPRECATED int gsl_spmatrix_long_double_add_to_dense (gsl_matrix_long_double * a, const gsl_spmatrix_long_double * b); #endif /* properties */ int gsl_spmatrix_long_double_equal (const gsl_spmatrix_long_double * a, const gsl_spmatrix_long_double * b); long double gsl_spmatrix_long_double_norm1 (const gsl_spmatrix_long_double * a); /* swap */ int gsl_spmatrix_long_double_transpose (gsl_spmatrix_long_double * m); int gsl_spmatrix_long_double_transpose2 (gsl_spmatrix_long_double * m); int gsl_spmatrix_long_double_transpose_memcpy (gsl_spmatrix_long_double * dest, const gsl_spmatrix_long_double * src); __END_DECLS #endif /* __GSL_SPMATRIX_LONG_DOUBLE_H__ */ gsl-2.7.1/spmatrix/gsl_spmatrix_long.h0000644016036000116100000001427613673205721015021 00000000000000/* spmatrix/gsl_spmatrix_long.h * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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_LONG_H__ #define __GSL_SPMATRIX_LONG_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 /* * COO format: * * If data[n] = A_{ij}, then: * i = A->i[n] * j = A->p[n] * * Compressed column format (CSC): * * 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 (CSR): * * 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: * * COO/CSC: row indices * CSR: column indices */ int *i; long *data; /* matrix elements of size nzmax */ /* * COO: p[n] = column number of element data[n] * CSC: p[j] = index in data of first non-zero element in column j * CSR: p[i] = index in data of first non-zero element in row i */ int *p; size_t nzmax; /* maximum number of matrix elements */ size_t nz; /* number of non-zero values in matrix */ gsl_bst_workspace *tree; /* binary tree structure */ gsl_spmatrix_pool *pool; /* memory pool for binary tree nodes */ size_t node_size; /* size of individual tree node in bytes */ /* * workspace of size MAX(size1,size2)*MAX(sizeof(long),sizeof(int)) * used in various routines */ union { void *work_void; int *work_int; long *work_atomic; } work; int sptype; /* sparse storage type */ size_t spflags; /* GSL_SPMATRIX_FLG_xxx */ } gsl_spmatrix_long; /* * Prototypes */ /* allocation / initialization */ gsl_spmatrix_long * gsl_spmatrix_long_alloc (const size_t n1, const size_t n2); gsl_spmatrix_long * gsl_spmatrix_long_alloc_nzmax (const size_t n1, const size_t n2, const size_t nzmax, const int sptype); void gsl_spmatrix_long_free (gsl_spmatrix_long * m); int gsl_spmatrix_long_realloc (const size_t nzmax, gsl_spmatrix_long * m); size_t gsl_spmatrix_long_nnz (const gsl_spmatrix_long * m); const char * gsl_spmatrix_long_type (const gsl_spmatrix_long * m); int gsl_spmatrix_long_set_zero (gsl_spmatrix_long * m); int gsl_spmatrix_long_tree_rebuild (gsl_spmatrix_long * m); /* compress */ int gsl_spmatrix_long_csc (gsl_spmatrix_long * dest, const gsl_spmatrix_long * src); int gsl_spmatrix_long_csr (gsl_spmatrix_long * dest, const gsl_spmatrix_long * src); gsl_spmatrix_long * gsl_spmatrix_long_compress (const gsl_spmatrix_long * src, const int sptype); gsl_spmatrix_long * gsl_spmatrix_long_compcol (const gsl_spmatrix_long * src); gsl_spmatrix_long * gsl_spmatrix_long_ccs (const gsl_spmatrix_long * src); gsl_spmatrix_long * gsl_spmatrix_long_crs (const gsl_spmatrix_long * src); /* copy */ int gsl_spmatrix_long_memcpy (gsl_spmatrix_long * dest, const gsl_spmatrix_long * src); /* file I/O */ int gsl_spmatrix_long_fprintf (FILE * stream, const gsl_spmatrix_long * m, const char * format); gsl_spmatrix_long * gsl_spmatrix_long_fscanf (FILE * stream); int gsl_spmatrix_long_fwrite (FILE * stream, const gsl_spmatrix_long * m); int gsl_spmatrix_long_fread (FILE * stream, gsl_spmatrix_long * m); /* get/set */ long gsl_spmatrix_long_get (const gsl_spmatrix_long * m, const size_t i, const size_t j); int gsl_spmatrix_long_set (gsl_spmatrix_long * m, const size_t i, const size_t j, const long x); long * gsl_spmatrix_long_ptr (const gsl_spmatrix_long * m, const size_t i, const size_t j); /* minmax */ int gsl_spmatrix_long_minmax (const gsl_spmatrix_long * m, long * min_out, long * max_out); int gsl_spmatrix_long_min_index (const gsl_spmatrix_long * m, size_t * imin_out, size_t * jmin_out); /* operations */ int gsl_spmatrix_long_scale (gsl_spmatrix_long * m, const long x); int gsl_spmatrix_long_scale_columns (gsl_spmatrix_long * m, const gsl_vector_long * x); int gsl_spmatrix_long_scale_rows (gsl_spmatrix_long * m, const gsl_vector_long * x); int gsl_spmatrix_long_add (gsl_spmatrix_long * c, const gsl_spmatrix_long * a, const gsl_spmatrix_long * b); int gsl_spmatrix_long_dense_add (gsl_matrix_long * a, const gsl_spmatrix_long * b); int gsl_spmatrix_long_dense_sub (gsl_matrix_long * a, const gsl_spmatrix_long * b); int gsl_spmatrix_long_d2sp (gsl_spmatrix_long * T, const gsl_matrix_long * A); int gsl_spmatrix_long_sp2d (gsl_matrix_long * A, const gsl_spmatrix_long * S); #ifndef GSL_DISABLE_DEPRECATED int gsl_spmatrix_long_add_to_dense (gsl_matrix_long * a, const gsl_spmatrix_long * b); #endif /* properties */ int gsl_spmatrix_long_equal (const gsl_spmatrix_long * a, const gsl_spmatrix_long * b); long gsl_spmatrix_long_norm1 (const gsl_spmatrix_long * a); /* swap */ int gsl_spmatrix_long_transpose (gsl_spmatrix_long * m); int gsl_spmatrix_long_transpose2 (gsl_spmatrix_long * m); int gsl_spmatrix_long_transpose_memcpy (gsl_spmatrix_long * dest, const gsl_spmatrix_long * src); __END_DECLS #endif /* __GSL_SPMATRIX_LONG_H__ */ gsl-2.7.1/spmatrix/gsl_spmatrix_short.h0000644016036000116100000001445513673205721015220 00000000000000/* spmatrix/gsl_spmatrix_short.h * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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_SHORT_H__ #define __GSL_SPMATRIX_SHORT_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 /* * COO format: * * If data[n] = A_{ij}, then: * i = A->i[n] * j = A->p[n] * * Compressed column format (CSC): * * 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 (CSR): * * 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: * * COO/CSC: row indices * CSR: column indices */ int *i; short *data; /* matrix elements of size nzmax */ /* * COO: p[n] = column number of element data[n] * CSC: p[j] = index in data of first non-zero element in column j * CSR: p[i] = index in data of first non-zero element in row i */ int *p; size_t nzmax; /* maximum number of matrix elements */ size_t nz; /* number of non-zero values in matrix */ gsl_bst_workspace *tree; /* binary tree structure */ gsl_spmatrix_pool *pool; /* memory pool for binary tree nodes */ size_t node_size; /* size of individual tree node in bytes */ /* * workspace of size MAX(size1,size2)*MAX(sizeof(short),sizeof(int)) * used in various routines */ union { void *work_void; int *work_int; short *work_atomic; } work; int sptype; /* sparse storage type */ size_t spflags; /* GSL_SPMATRIX_FLG_xxx */ } gsl_spmatrix_short; /* * Prototypes */ /* allocation / initialization */ gsl_spmatrix_short * gsl_spmatrix_short_alloc (const size_t n1, const size_t n2); gsl_spmatrix_short * gsl_spmatrix_short_alloc_nzmax (const size_t n1, const size_t n2, const size_t nzmax, const int sptype); void gsl_spmatrix_short_free (gsl_spmatrix_short * m); int gsl_spmatrix_short_realloc (const size_t nzmax, gsl_spmatrix_short * m); size_t gsl_spmatrix_short_nnz (const gsl_spmatrix_short * m); const char * gsl_spmatrix_short_type (const gsl_spmatrix_short * m); int gsl_spmatrix_short_set_zero (gsl_spmatrix_short * m); int gsl_spmatrix_short_tree_rebuild (gsl_spmatrix_short * m); /* compress */ int gsl_spmatrix_short_csc (gsl_spmatrix_short * dest, const gsl_spmatrix_short * src); int gsl_spmatrix_short_csr (gsl_spmatrix_short * dest, const gsl_spmatrix_short * src); gsl_spmatrix_short * gsl_spmatrix_short_compress (const gsl_spmatrix_short * src, const int sptype); gsl_spmatrix_short * gsl_spmatrix_short_compcol (const gsl_spmatrix_short * src); gsl_spmatrix_short * gsl_spmatrix_short_ccs (const gsl_spmatrix_short * src); gsl_spmatrix_short * gsl_spmatrix_short_crs (const gsl_spmatrix_short * src); /* copy */ int gsl_spmatrix_short_memcpy (gsl_spmatrix_short * dest, const gsl_spmatrix_short * src); /* file I/O */ int gsl_spmatrix_short_fprintf (FILE * stream, const gsl_spmatrix_short * m, const char * format); gsl_spmatrix_short * gsl_spmatrix_short_fscanf (FILE * stream); int gsl_spmatrix_short_fwrite (FILE * stream, const gsl_spmatrix_short * m); int gsl_spmatrix_short_fread (FILE * stream, gsl_spmatrix_short * m); /* get/set */ short gsl_spmatrix_short_get (const gsl_spmatrix_short * m, const size_t i, const size_t j); int gsl_spmatrix_short_set (gsl_spmatrix_short * m, const size_t i, const size_t j, const short x); short * gsl_spmatrix_short_ptr (const gsl_spmatrix_short * m, const size_t i, const size_t j); /* minmax */ int gsl_spmatrix_short_minmax (const gsl_spmatrix_short * m, short * min_out, short * max_out); int gsl_spmatrix_short_min_index (const gsl_spmatrix_short * m, size_t * imin_out, size_t * jmin_out); /* operations */ int gsl_spmatrix_short_scale (gsl_spmatrix_short * m, const short x); int gsl_spmatrix_short_scale_columns (gsl_spmatrix_short * m, const gsl_vector_short * x); int gsl_spmatrix_short_scale_rows (gsl_spmatrix_short * m, const gsl_vector_short * x); int gsl_spmatrix_short_add (gsl_spmatrix_short * c, const gsl_spmatrix_short * a, const gsl_spmatrix_short * b); int gsl_spmatrix_short_dense_add (gsl_matrix_short * a, const gsl_spmatrix_short * b); int gsl_spmatrix_short_dense_sub (gsl_matrix_short * a, const gsl_spmatrix_short * b); int gsl_spmatrix_short_d2sp (gsl_spmatrix_short * T, const gsl_matrix_short * A); int gsl_spmatrix_short_sp2d (gsl_matrix_short * A, const gsl_spmatrix_short * S); #ifndef GSL_DISABLE_DEPRECATED int gsl_spmatrix_short_add_to_dense (gsl_matrix_short * a, const gsl_spmatrix_short * b); #endif /* properties */ int gsl_spmatrix_short_equal (const gsl_spmatrix_short * a, const gsl_spmatrix_short * b); short gsl_spmatrix_short_norm1 (const gsl_spmatrix_short * a); /* swap */ int gsl_spmatrix_short_transpose (gsl_spmatrix_short * m); int gsl_spmatrix_short_transpose2 (gsl_spmatrix_short * m); int gsl_spmatrix_short_transpose_memcpy (gsl_spmatrix_short * dest, const gsl_spmatrix_short * src); __END_DECLS #endif /* __GSL_SPMATRIX_SHORT_H__ */ gsl-2.7.1/spmatrix/gsl_spmatrix_uchar.h0000644016036000116100000001457513673205721015166 00000000000000/* spmatrix/gsl_spmatrix_uchar.h * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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_UCHAR_H__ #define __GSL_SPMATRIX_UCHAR_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 /* * COO format: * * If data[n] = A_{ij}, then: * i = A->i[n] * j = A->p[n] * * Compressed column format (CSC): * * 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 (CSR): * * 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: * * COO/CSC: row indices * CSR: column indices */ int *i; unsigned char *data; /* matrix elements of size nzmax */ /* * COO: p[n] = column number of element data[n] * CSC: p[j] = index in data of first non-zero element in column j * CSR: p[i] = index in data of first non-zero element in row i */ int *p; size_t nzmax; /* maximum number of matrix elements */ size_t nz; /* number of non-zero values in matrix */ gsl_bst_workspace *tree; /* binary tree structure */ gsl_spmatrix_pool *pool; /* memory pool for binary tree nodes */ size_t node_size; /* size of individual tree node in bytes */ /* * workspace of size MAX(size1,size2)*MAX(sizeof(unsigned char),sizeof(int)) * used in various routines */ union { void *work_void; int *work_int; unsigned char *work_atomic; } work; int sptype; /* sparse storage type */ size_t spflags; /* GSL_SPMATRIX_FLG_xxx */ } gsl_spmatrix_uchar; /* * Prototypes */ /* allocation / initialization */ gsl_spmatrix_uchar * gsl_spmatrix_uchar_alloc (const size_t n1, const size_t n2); gsl_spmatrix_uchar * gsl_spmatrix_uchar_alloc_nzmax (const size_t n1, const size_t n2, const size_t nzmax, const int sptype); void gsl_spmatrix_uchar_free (gsl_spmatrix_uchar * m); int gsl_spmatrix_uchar_realloc (const size_t nzmax, gsl_spmatrix_uchar * m); size_t gsl_spmatrix_uchar_nnz (const gsl_spmatrix_uchar * m); const char * gsl_spmatrix_uchar_type (const gsl_spmatrix_uchar * m); int gsl_spmatrix_uchar_set_zero (gsl_spmatrix_uchar * m); int gsl_spmatrix_uchar_tree_rebuild (gsl_spmatrix_uchar * m); /* compress */ int gsl_spmatrix_uchar_csc (gsl_spmatrix_uchar * dest, const gsl_spmatrix_uchar * src); int gsl_spmatrix_uchar_csr (gsl_spmatrix_uchar * dest, const gsl_spmatrix_uchar * src); gsl_spmatrix_uchar * gsl_spmatrix_uchar_compress (const gsl_spmatrix_uchar * src, const int sptype); gsl_spmatrix_uchar * gsl_spmatrix_uchar_compcol (const gsl_spmatrix_uchar * src); gsl_spmatrix_uchar * gsl_spmatrix_uchar_ccs (const gsl_spmatrix_uchar * src); gsl_spmatrix_uchar * gsl_spmatrix_uchar_crs (const gsl_spmatrix_uchar * src); /* copy */ int gsl_spmatrix_uchar_memcpy (gsl_spmatrix_uchar * dest, const gsl_spmatrix_uchar * src); /* file I/O */ int gsl_spmatrix_uchar_fprintf (FILE * stream, const gsl_spmatrix_uchar * m, const char * format); gsl_spmatrix_uchar * gsl_spmatrix_uchar_fscanf (FILE * stream); int gsl_spmatrix_uchar_fwrite (FILE * stream, const gsl_spmatrix_uchar * m); int gsl_spmatrix_uchar_fread (FILE * stream, gsl_spmatrix_uchar * m); /* get/set */ unsigned char gsl_spmatrix_uchar_get (const gsl_spmatrix_uchar * m, const size_t i, const size_t j); int gsl_spmatrix_uchar_set (gsl_spmatrix_uchar * m, const size_t i, const size_t j, const unsigned char x); unsigned char * gsl_spmatrix_uchar_ptr (const gsl_spmatrix_uchar * m, const size_t i, const size_t j); /* minmax */ int gsl_spmatrix_uchar_minmax (const gsl_spmatrix_uchar * m, unsigned char * min_out, unsigned char * max_out); int gsl_spmatrix_uchar_min_index (const gsl_spmatrix_uchar * m, size_t * imin_out, size_t * jmin_out); /* operations */ int gsl_spmatrix_uchar_scale (gsl_spmatrix_uchar * m, const unsigned char x); int gsl_spmatrix_uchar_scale_columns (gsl_spmatrix_uchar * m, const gsl_vector_uchar * x); int gsl_spmatrix_uchar_scale_rows (gsl_spmatrix_uchar * m, const gsl_vector_uchar * x); int gsl_spmatrix_uchar_add (gsl_spmatrix_uchar * c, const gsl_spmatrix_uchar * a, const gsl_spmatrix_uchar * b); int gsl_spmatrix_uchar_dense_add (gsl_matrix_uchar * a, const gsl_spmatrix_uchar * b); int gsl_spmatrix_uchar_dense_sub (gsl_matrix_uchar * a, const gsl_spmatrix_uchar * b); int gsl_spmatrix_uchar_d2sp (gsl_spmatrix_uchar * T, const gsl_matrix_uchar * A); int gsl_spmatrix_uchar_sp2d (gsl_matrix_uchar * A, const gsl_spmatrix_uchar * S); #ifndef GSL_DISABLE_DEPRECATED int gsl_spmatrix_uchar_add_to_dense (gsl_matrix_uchar * a, const gsl_spmatrix_uchar * b); #endif /* properties */ int gsl_spmatrix_uchar_equal (const gsl_spmatrix_uchar * a, const gsl_spmatrix_uchar * b); unsigned char gsl_spmatrix_uchar_norm1 (const gsl_spmatrix_uchar * a); /* swap */ int gsl_spmatrix_uchar_transpose (gsl_spmatrix_uchar * m); int gsl_spmatrix_uchar_transpose2 (gsl_spmatrix_uchar * m); int gsl_spmatrix_uchar_transpose_memcpy (gsl_spmatrix_uchar * dest, const gsl_spmatrix_uchar * src); __END_DECLS #endif /* __GSL_SPMATRIX_UCHAR_H__ */ gsl-2.7.1/spmatrix/gsl_spmatrix_uint.h0000644016036000116100000001441613673205721015035 00000000000000/* spmatrix/gsl_spmatrix_uint.h * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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_UINT_H__ #define __GSL_SPMATRIX_UINT_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 /* * COO format: * * If data[n] = A_{ij}, then: * i = A->i[n] * j = A->p[n] * * Compressed column format (CSC): * * 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 (CSR): * * 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: * * COO/CSC: row indices * CSR: column indices */ int *i; unsigned int *data; /* matrix elements of size nzmax */ /* * COO: p[n] = column number of element data[n] * CSC: p[j] = index in data of first non-zero element in column j * CSR: p[i] = index in data of first non-zero element in row i */ int *p; size_t nzmax; /* maximum number of matrix elements */ size_t nz; /* number of non-zero values in matrix */ gsl_bst_workspace *tree; /* binary tree structure */ gsl_spmatrix_pool *pool; /* memory pool for binary tree nodes */ size_t node_size; /* size of individual tree node in bytes */ /* * workspace of size MAX(size1,size2)*MAX(sizeof(unsigned int),sizeof(int)) * used in various routines */ union { void *work_void; int *work_int; unsigned int *work_atomic; } work; int sptype; /* sparse storage type */ size_t spflags; /* GSL_SPMATRIX_FLG_xxx */ } gsl_spmatrix_uint; /* * Prototypes */ /* allocation / initialization */ gsl_spmatrix_uint * gsl_spmatrix_uint_alloc (const size_t n1, const size_t n2); gsl_spmatrix_uint * gsl_spmatrix_uint_alloc_nzmax (const size_t n1, const size_t n2, const size_t nzmax, const int sptype); void gsl_spmatrix_uint_free (gsl_spmatrix_uint * m); int gsl_spmatrix_uint_realloc (const size_t nzmax, gsl_spmatrix_uint * m); size_t gsl_spmatrix_uint_nnz (const gsl_spmatrix_uint * m); const char * gsl_spmatrix_uint_type (const gsl_spmatrix_uint * m); int gsl_spmatrix_uint_set_zero (gsl_spmatrix_uint * m); int gsl_spmatrix_uint_tree_rebuild (gsl_spmatrix_uint * m); /* compress */ int gsl_spmatrix_uint_csc (gsl_spmatrix_uint * dest, const gsl_spmatrix_uint * src); int gsl_spmatrix_uint_csr (gsl_spmatrix_uint * dest, const gsl_spmatrix_uint * src); gsl_spmatrix_uint * gsl_spmatrix_uint_compress (const gsl_spmatrix_uint * src, const int sptype); gsl_spmatrix_uint * gsl_spmatrix_uint_compcol (const gsl_spmatrix_uint * src); gsl_spmatrix_uint * gsl_spmatrix_uint_ccs (const gsl_spmatrix_uint * src); gsl_spmatrix_uint * gsl_spmatrix_uint_crs (const gsl_spmatrix_uint * src); /* copy */ int gsl_spmatrix_uint_memcpy (gsl_spmatrix_uint * dest, const gsl_spmatrix_uint * src); /* file I/O */ int gsl_spmatrix_uint_fprintf (FILE * stream, const gsl_spmatrix_uint * m, const char * format); gsl_spmatrix_uint * gsl_spmatrix_uint_fscanf (FILE * stream); int gsl_spmatrix_uint_fwrite (FILE * stream, const gsl_spmatrix_uint * m); int gsl_spmatrix_uint_fread (FILE * stream, gsl_spmatrix_uint * m); /* get/set */ unsigned int gsl_spmatrix_uint_get (const gsl_spmatrix_uint * m, const size_t i, const size_t j); int gsl_spmatrix_uint_set (gsl_spmatrix_uint * m, const size_t i, const size_t j, const unsigned int x); unsigned int * gsl_spmatrix_uint_ptr (const gsl_spmatrix_uint * m, const size_t i, const size_t j); /* minmax */ int gsl_spmatrix_uint_minmax (const gsl_spmatrix_uint * m, unsigned int * min_out, unsigned int * max_out); int gsl_spmatrix_uint_min_index (const gsl_spmatrix_uint * m, size_t * imin_out, size_t * jmin_out); /* operations */ int gsl_spmatrix_uint_scale (gsl_spmatrix_uint * m, const unsigned int x); int gsl_spmatrix_uint_scale_columns (gsl_spmatrix_uint * m, const gsl_vector_uint * x); int gsl_spmatrix_uint_scale_rows (gsl_spmatrix_uint * m, const gsl_vector_uint * x); int gsl_spmatrix_uint_add (gsl_spmatrix_uint * c, const gsl_spmatrix_uint * a, const gsl_spmatrix_uint * b); int gsl_spmatrix_uint_dense_add (gsl_matrix_uint * a, const gsl_spmatrix_uint * b); int gsl_spmatrix_uint_dense_sub (gsl_matrix_uint * a, const gsl_spmatrix_uint * b); int gsl_spmatrix_uint_d2sp (gsl_spmatrix_uint * T, const gsl_matrix_uint * A); int gsl_spmatrix_uint_sp2d (gsl_matrix_uint * A, const gsl_spmatrix_uint * S); #ifndef GSL_DISABLE_DEPRECATED int gsl_spmatrix_uint_add_to_dense (gsl_matrix_uint * a, const gsl_spmatrix_uint * b); #endif /* properties */ int gsl_spmatrix_uint_equal (const gsl_spmatrix_uint * a, const gsl_spmatrix_uint * b); unsigned int gsl_spmatrix_uint_norm1 (const gsl_spmatrix_uint * a); /* swap */ int gsl_spmatrix_uint_transpose (gsl_spmatrix_uint * m); int gsl_spmatrix_uint_transpose2 (gsl_spmatrix_uint * m); int gsl_spmatrix_uint_transpose_memcpy (gsl_spmatrix_uint * dest, const gsl_spmatrix_uint * src); __END_DECLS #endif /* __GSL_SPMATRIX_UINT_H__ */ gsl-2.7.1/spmatrix/gsl_spmatrix_ulong.h0000644016036000116100000001457513673205721015210 00000000000000/* spmatrix/gsl_spmatrix_ulong.h * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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_ULONG_H__ #define __GSL_SPMATRIX_ULONG_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 /* * COO format: * * If data[n] = A_{ij}, then: * i = A->i[n] * j = A->p[n] * * Compressed column format (CSC): * * 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 (CSR): * * 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: * * COO/CSC: row indices * CSR: column indices */ int *i; unsigned long *data; /* matrix elements of size nzmax */ /* * COO: p[n] = column number of element data[n] * CSC: p[j] = index in data of first non-zero element in column j * CSR: p[i] = index in data of first non-zero element in row i */ int *p; size_t nzmax; /* maximum number of matrix elements */ size_t nz; /* number of non-zero values in matrix */ gsl_bst_workspace *tree; /* binary tree structure */ gsl_spmatrix_pool *pool; /* memory pool for binary tree nodes */ size_t node_size; /* size of individual tree node in bytes */ /* * workspace of size MAX(size1,size2)*MAX(sizeof(unsigned long),sizeof(int)) * used in various routines */ union { void *work_void; int *work_int; unsigned long *work_atomic; } work; int sptype; /* sparse storage type */ size_t spflags; /* GSL_SPMATRIX_FLG_xxx */ } gsl_spmatrix_ulong; /* * Prototypes */ /* allocation / initialization */ gsl_spmatrix_ulong * gsl_spmatrix_ulong_alloc (const size_t n1, const size_t n2); gsl_spmatrix_ulong * gsl_spmatrix_ulong_alloc_nzmax (const size_t n1, const size_t n2, const size_t nzmax, const int sptype); void gsl_spmatrix_ulong_free (gsl_spmatrix_ulong * m); int gsl_spmatrix_ulong_realloc (const size_t nzmax, gsl_spmatrix_ulong * m); size_t gsl_spmatrix_ulong_nnz (const gsl_spmatrix_ulong * m); const char * gsl_spmatrix_ulong_type (const gsl_spmatrix_ulong * m); int gsl_spmatrix_ulong_set_zero (gsl_spmatrix_ulong * m); int gsl_spmatrix_ulong_tree_rebuild (gsl_spmatrix_ulong * m); /* compress */ int gsl_spmatrix_ulong_csc (gsl_spmatrix_ulong * dest, const gsl_spmatrix_ulong * src); int gsl_spmatrix_ulong_csr (gsl_spmatrix_ulong * dest, const gsl_spmatrix_ulong * src); gsl_spmatrix_ulong * gsl_spmatrix_ulong_compress (const gsl_spmatrix_ulong * src, const int sptype); gsl_spmatrix_ulong * gsl_spmatrix_ulong_compcol (const gsl_spmatrix_ulong * src); gsl_spmatrix_ulong * gsl_spmatrix_ulong_ccs (const gsl_spmatrix_ulong * src); gsl_spmatrix_ulong * gsl_spmatrix_ulong_crs (const gsl_spmatrix_ulong * src); /* copy */ int gsl_spmatrix_ulong_memcpy (gsl_spmatrix_ulong * dest, const gsl_spmatrix_ulong * src); /* file I/O */ int gsl_spmatrix_ulong_fprintf (FILE * stream, const gsl_spmatrix_ulong * m, const char * format); gsl_spmatrix_ulong * gsl_spmatrix_ulong_fscanf (FILE * stream); int gsl_spmatrix_ulong_fwrite (FILE * stream, const gsl_spmatrix_ulong * m); int gsl_spmatrix_ulong_fread (FILE * stream, gsl_spmatrix_ulong * m); /* get/set */ unsigned long gsl_spmatrix_ulong_get (const gsl_spmatrix_ulong * m, const size_t i, const size_t j); int gsl_spmatrix_ulong_set (gsl_spmatrix_ulong * m, const size_t i, const size_t j, const unsigned long x); unsigned long * gsl_spmatrix_ulong_ptr (const gsl_spmatrix_ulong * m, const size_t i, const size_t j); /* minmax */ int gsl_spmatrix_ulong_minmax (const gsl_spmatrix_ulong * m, unsigned long * min_out, unsigned long * max_out); int gsl_spmatrix_ulong_min_index (const gsl_spmatrix_ulong * m, size_t * imin_out, size_t * jmin_out); /* operations */ int gsl_spmatrix_ulong_scale (gsl_spmatrix_ulong * m, const unsigned long x); int gsl_spmatrix_ulong_scale_columns (gsl_spmatrix_ulong * m, const gsl_vector_ulong * x); int gsl_spmatrix_ulong_scale_rows (gsl_spmatrix_ulong * m, const gsl_vector_ulong * x); int gsl_spmatrix_ulong_add (gsl_spmatrix_ulong * c, const gsl_spmatrix_ulong * a, const gsl_spmatrix_ulong * b); int gsl_spmatrix_ulong_dense_add (gsl_matrix_ulong * a, const gsl_spmatrix_ulong * b); int gsl_spmatrix_ulong_dense_sub (gsl_matrix_ulong * a, const gsl_spmatrix_ulong * b); int gsl_spmatrix_ulong_d2sp (gsl_spmatrix_ulong * T, const gsl_matrix_ulong * A); int gsl_spmatrix_ulong_sp2d (gsl_matrix_ulong * A, const gsl_spmatrix_ulong * S); #ifndef GSL_DISABLE_DEPRECATED int gsl_spmatrix_ulong_add_to_dense (gsl_matrix_ulong * a, const gsl_spmatrix_ulong * b); #endif /* properties */ int gsl_spmatrix_ulong_equal (const gsl_spmatrix_ulong * a, const gsl_spmatrix_ulong * b); unsigned long gsl_spmatrix_ulong_norm1 (const gsl_spmatrix_ulong * a); /* swap */ int gsl_spmatrix_ulong_transpose (gsl_spmatrix_ulong * m); int gsl_spmatrix_ulong_transpose2 (gsl_spmatrix_ulong * m); int gsl_spmatrix_ulong_transpose_memcpy (gsl_spmatrix_ulong * dest, const gsl_spmatrix_ulong * src); __END_DECLS #endif /* __GSL_SPMATRIX_ULONG_H__ */ gsl-2.7.1/spmatrix/gsl_spmatrix_ushort.h0000644016036000116100000001475413673205721015407 00000000000000/* spmatrix/gsl_spmatrix_ushort.h * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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_USHORT_H__ #define __GSL_SPMATRIX_USHORT_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 /* * COO format: * * If data[n] = A_{ij}, then: * i = A->i[n] * j = A->p[n] * * Compressed column format (CSC): * * 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 (CSR): * * 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: * * COO/CSC: row indices * CSR: column indices */ int *i; unsigned short *data; /* matrix elements of size nzmax */ /* * COO: p[n] = column number of element data[n] * CSC: p[j] = index in data of first non-zero element in column j * CSR: p[i] = index in data of first non-zero element in row i */ int *p; size_t nzmax; /* maximum number of matrix elements */ size_t nz; /* number of non-zero values in matrix */ gsl_bst_workspace *tree; /* binary tree structure */ gsl_spmatrix_pool *pool; /* memory pool for binary tree nodes */ size_t node_size; /* size of individual tree node in bytes */ /* * workspace of size MAX(size1,size2)*MAX(sizeof(unsigned short),sizeof(int)) * used in various routines */ union { void *work_void; int *work_int; unsigned short *work_atomic; } work; int sptype; /* sparse storage type */ size_t spflags; /* GSL_SPMATRIX_FLG_xxx */ } gsl_spmatrix_ushort; /* * Prototypes */ /* allocation / initialization */ gsl_spmatrix_ushort * gsl_spmatrix_ushort_alloc (const size_t n1, const size_t n2); gsl_spmatrix_ushort * gsl_spmatrix_ushort_alloc_nzmax (const size_t n1, const size_t n2, const size_t nzmax, const int sptype); void gsl_spmatrix_ushort_free (gsl_spmatrix_ushort * m); int gsl_spmatrix_ushort_realloc (const size_t nzmax, gsl_spmatrix_ushort * m); size_t gsl_spmatrix_ushort_nnz (const gsl_spmatrix_ushort * m); const char * gsl_spmatrix_ushort_type (const gsl_spmatrix_ushort * m); int gsl_spmatrix_ushort_set_zero (gsl_spmatrix_ushort * m); int gsl_spmatrix_ushort_tree_rebuild (gsl_spmatrix_ushort * m); /* compress */ int gsl_spmatrix_ushort_csc (gsl_spmatrix_ushort * dest, const gsl_spmatrix_ushort * src); int gsl_spmatrix_ushort_csr (gsl_spmatrix_ushort * dest, const gsl_spmatrix_ushort * src); gsl_spmatrix_ushort * gsl_spmatrix_ushort_compress (const gsl_spmatrix_ushort * src, const int sptype); gsl_spmatrix_ushort * gsl_spmatrix_ushort_compcol (const gsl_spmatrix_ushort * src); gsl_spmatrix_ushort * gsl_spmatrix_ushort_ccs (const gsl_spmatrix_ushort * src); gsl_spmatrix_ushort * gsl_spmatrix_ushort_crs (const gsl_spmatrix_ushort * src); /* copy */ int gsl_spmatrix_ushort_memcpy (gsl_spmatrix_ushort * dest, const gsl_spmatrix_ushort * src); /* file I/O */ int gsl_spmatrix_ushort_fprintf (FILE * stream, const gsl_spmatrix_ushort * m, const char * format); gsl_spmatrix_ushort * gsl_spmatrix_ushort_fscanf (FILE * stream); int gsl_spmatrix_ushort_fwrite (FILE * stream, const gsl_spmatrix_ushort * m); int gsl_spmatrix_ushort_fread (FILE * stream, gsl_spmatrix_ushort * m); /* get/set */ unsigned short gsl_spmatrix_ushort_get (const gsl_spmatrix_ushort * m, const size_t i, const size_t j); int gsl_spmatrix_ushort_set (gsl_spmatrix_ushort * m, const size_t i, const size_t j, const unsigned short x); unsigned short * gsl_spmatrix_ushort_ptr (const gsl_spmatrix_ushort * m, const size_t i, const size_t j); /* minmax */ int gsl_spmatrix_ushort_minmax (const gsl_spmatrix_ushort * m, unsigned short * min_out, unsigned short * max_out); int gsl_spmatrix_ushort_min_index (const gsl_spmatrix_ushort * m, size_t * imin_out, size_t * jmin_out); /* operations */ int gsl_spmatrix_ushort_scale (gsl_spmatrix_ushort * m, const unsigned short x); int gsl_spmatrix_ushort_scale_columns (gsl_spmatrix_ushort * m, const gsl_vector_ushort * x); int gsl_spmatrix_ushort_scale_rows (gsl_spmatrix_ushort * m, const gsl_vector_ushort * x); int gsl_spmatrix_ushort_add (gsl_spmatrix_ushort * c, const gsl_spmatrix_ushort * a, const gsl_spmatrix_ushort * b); int gsl_spmatrix_ushort_dense_add (gsl_matrix_ushort * a, const gsl_spmatrix_ushort * b); int gsl_spmatrix_ushort_dense_sub (gsl_matrix_ushort * a, const gsl_spmatrix_ushort * b); int gsl_spmatrix_ushort_d2sp (gsl_spmatrix_ushort * T, const gsl_matrix_ushort * A); int gsl_spmatrix_ushort_sp2d (gsl_matrix_ushort * A, const gsl_spmatrix_ushort * S); #ifndef GSL_DISABLE_DEPRECATED int gsl_spmatrix_ushort_add_to_dense (gsl_matrix_ushort * a, const gsl_spmatrix_ushort * b); #endif /* properties */ int gsl_spmatrix_ushort_equal (const gsl_spmatrix_ushort * a, const gsl_spmatrix_ushort * b); unsigned short gsl_spmatrix_ushort_norm1 (const gsl_spmatrix_ushort * a); /* swap */ int gsl_spmatrix_ushort_transpose (gsl_spmatrix_ushort * m); int gsl_spmatrix_ushort_transpose2 (gsl_spmatrix_ushort * m); int gsl_spmatrix_ushort_transpose_memcpy (gsl_spmatrix_ushort * dest, const gsl_spmatrix_ushort * src); __END_DECLS #endif /* __GSL_SPMATRIX_USHORT_H__ */ gsl-2.7.1/spmatrix/gsl_spmatrix_complex_float.h0000644016036000116100000001551013614714746016715 00000000000000/* spmatrix/gsl_spmatrix_float.h * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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_COMPLEX_FLOAT_H__ #define __GSL_SPMATRIX_COMPLEX_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 /* * COO format: * * If data[n] = A_{ij}, then: * i = A->i[n] * j = A->p[n] * * Compressed column format (CSC): * * 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 (CSR): * * 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: * * COO/CSC: row indices * CSR: column indices */ int *i; float *data; /* matrix elements of size nzmax */ /* * COO: p[n] = column number of element data[n] * CSC: p[j] = index in data of first non-zero element in column j * CSR: p[i] = index in data of first non-zero element in row i */ int *p; size_t nzmax; /* maximum number of matrix elements */ size_t nz; /* number of non-zero values in matrix */ gsl_bst_workspace *tree; /* binary tree structure */ gsl_spmatrix_pool *pool; /* memory pool for binary tree nodes */ size_t node_size; /* size of individual tree node in bytes */ /* * workspace of size 2*MAX(size1,size2)*MAX(sizeof(float),sizeof(int)) * used in various routines */ union { void *work_void; int *work_int; float *work_atomic; } work; int sptype; /* sparse storage type */ size_t spflags; /* GSL_SPMATRIX_FLG_xxx */ } gsl_spmatrix_complex_float; /* * Prototypes */ /* allocation / initialization */ gsl_spmatrix_complex_float * gsl_spmatrix_complex_float_alloc (const size_t n1, const size_t n2); gsl_spmatrix_complex_float * gsl_spmatrix_complex_float_alloc_nzmax (const size_t n1, const size_t n2, const size_t nzmax, const int sptype); void gsl_spmatrix_complex_float_free (gsl_spmatrix_complex_float * m); int gsl_spmatrix_complex_float_realloc (const size_t nzmax, gsl_spmatrix_complex_float * m); size_t gsl_spmatrix_complex_float_nnz (const gsl_spmatrix_complex_float * m); const char * gsl_spmatrix_complex_float_type (const gsl_spmatrix_complex_float * m); int gsl_spmatrix_complex_float_set_zero (gsl_spmatrix_complex_float * m); int gsl_spmatrix_complex_float_tree_rebuild (gsl_spmatrix_complex_float * m); /* compress */ int gsl_spmatrix_complex_float_csc (gsl_spmatrix_complex_float * dest, const gsl_spmatrix_complex_float * src); int gsl_spmatrix_complex_float_csr (gsl_spmatrix_complex_float * dest, const gsl_spmatrix_complex_float * src); gsl_spmatrix_complex_float * gsl_spmatrix_complex_float_compress (const gsl_spmatrix_complex_float * src, const int sptype); gsl_spmatrix_complex_float * gsl_spmatrix_complex_float_compcol (const gsl_spmatrix_complex_float * src); gsl_spmatrix_complex_float * gsl_spmatrix_complex_float_ccs (const gsl_spmatrix_complex_float * src); gsl_spmatrix_complex_float * gsl_spmatrix_complex_float_crs (const gsl_spmatrix_complex_float * src); /* copy */ int gsl_spmatrix_complex_float_memcpy (gsl_spmatrix_complex_float * dest, const gsl_spmatrix_complex_float * src); /* file I/O */ int gsl_spmatrix_complex_float_fprintf (FILE * stream, const gsl_spmatrix_complex_float * m, const char * format); gsl_spmatrix_complex_float * gsl_spmatrix_complex_float_fscanf (FILE * stream); int gsl_spmatrix_complex_float_fwrite (FILE * stream, const gsl_spmatrix_complex_float * m); int gsl_spmatrix_complex_float_fread (FILE * stream, gsl_spmatrix_complex_float * m); /* get/set */ gsl_complex_float gsl_spmatrix_complex_float_get (const gsl_spmatrix_complex_float * m, const size_t i, const size_t j); int gsl_spmatrix_complex_float_set (gsl_spmatrix_complex_float * m, const size_t i, const size_t j, const gsl_complex_float x); gsl_complex_float * gsl_spmatrix_complex_float_ptr (const gsl_spmatrix_complex_float * m, const size_t i, const size_t j); /* operations */ int gsl_spmatrix_complex_float_scale (gsl_spmatrix_complex_float * m, const gsl_complex_float x); int gsl_spmatrix_complex_float_scale_columns (gsl_spmatrix_complex_float * m, const gsl_vector_complex_float * x); int gsl_spmatrix_complex_float_scale_rows (gsl_spmatrix_complex_float * m, const gsl_vector_complex_float * x); int gsl_spmatrix_complex_float_add (gsl_spmatrix_complex_float * c, const gsl_spmatrix_complex_float * a, const gsl_spmatrix_complex_float * b); int gsl_spmatrix_complex_float_dense_add (gsl_matrix_complex_float * a, const gsl_spmatrix_complex_float * b); int gsl_spmatrix_complex_float_dense_sub (gsl_matrix_complex_float * a, const gsl_spmatrix_complex_float * b); int gsl_spmatrix_complex_float_d2sp (gsl_spmatrix_complex_float * T, const gsl_matrix_complex_float * A); int gsl_spmatrix_complex_float_sp2d (gsl_matrix_complex_float * A, const gsl_spmatrix_complex_float * S); #ifndef GSL_DISABLE_DEPRECATED int gsl_spmatrix_complex_float_add_to_dense (gsl_matrix_complex_float * a, const gsl_spmatrix_complex_float * b); #endif /* properties */ int gsl_spmatrix_complex_float_equal (const gsl_spmatrix_complex_float * a, const gsl_spmatrix_complex_float * b); /* swap */ int gsl_spmatrix_complex_float_transpose (gsl_spmatrix_complex_float * m); int gsl_spmatrix_complex_float_transpose2 (gsl_spmatrix_complex_float * m); int gsl_spmatrix_complex_float_transpose_memcpy (gsl_spmatrix_complex_float * dest, const gsl_spmatrix_complex_float * src); __END_DECLS #endif /* __GSL_SPMATRIX_COMPLEX_FLOAT_H__ */ gsl-2.7.1/spmatrix/gsl_spmatrix_complex_double.h0000644016036000116100000001444313673205721017057 00000000000000/* spmatrix/gsl_spmatrix_double.h * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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_COMPLEX_DOUBLE_H__ #define __GSL_SPMATRIX_COMPLEX_DOUBLE_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 /* * COO format: * * If data[n] = A_{ij}, then: * i = A->i[n] * j = A->p[n] * * Compressed column format (CSC): * * 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 (CSR): * * 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: * * COO/CSC: row indices * CSR: column indices */ int *i; double *data; /* matrix elements of size nzmax */ /* * COO: p[n] = column number of element data[n] * CSC: p[j] = index in data of first non-zero element in column j * CSR: p[i] = index in data of first non-zero element in row i */ int *p; size_t nzmax; /* maximum number of matrix elements */ size_t nz; /* number of non-zero values in matrix */ gsl_bst_workspace *tree; /* binary tree structure */ gsl_spmatrix_pool *pool; /* memory pool for binary tree nodes */ size_t node_size; /* size of individual tree node in bytes */ /* * workspace of size 2*MAX(size1,size2)*MAX(sizeof(double),sizeof(int)) * used in various routines */ union { void *work_void; int *work_int; double *work_atomic; } work; int sptype; /* sparse storage type */ size_t spflags; /* GSL_SPMATRIX_FLG_xxx */ } gsl_spmatrix_complex; /* * Prototypes */ /* allocation / initialization */ gsl_spmatrix_complex * gsl_spmatrix_complex_alloc (const size_t n1, const size_t n2); gsl_spmatrix_complex * gsl_spmatrix_complex_alloc_nzmax (const size_t n1, const size_t n2, const size_t nzmax, const int sptype); void gsl_spmatrix_complex_free (gsl_spmatrix_complex * m); int gsl_spmatrix_complex_realloc (const size_t nzmax, gsl_spmatrix_complex * m); size_t gsl_spmatrix_complex_nnz (const gsl_spmatrix_complex * m); const char * gsl_spmatrix_complex_type (const gsl_spmatrix_complex * m); int gsl_spmatrix_complex_set_zero (gsl_spmatrix_complex * m); int gsl_spmatrix_complex_tree_rebuild (gsl_spmatrix_complex * m); /* compress */ int gsl_spmatrix_complex_csc (gsl_spmatrix_complex * dest, const gsl_spmatrix_complex * src); int gsl_spmatrix_complex_csr (gsl_spmatrix_complex * dest, const gsl_spmatrix_complex * src); gsl_spmatrix_complex * gsl_spmatrix_complex_compress (const gsl_spmatrix_complex * src, const int sptype); gsl_spmatrix_complex * gsl_spmatrix_complex_compcol (const gsl_spmatrix_complex * src); gsl_spmatrix_complex * gsl_spmatrix_complex_ccs (const gsl_spmatrix_complex * src); gsl_spmatrix_complex * gsl_spmatrix_complex_crs (const gsl_spmatrix_complex * src); /* copy */ int gsl_spmatrix_complex_memcpy (gsl_spmatrix_complex * dest, const gsl_spmatrix_complex * src); /* file I/O */ int gsl_spmatrix_complex_fprintf (FILE * stream, const gsl_spmatrix_complex * m, const char * format); gsl_spmatrix_complex * gsl_spmatrix_complex_fscanf (FILE * stream); int gsl_spmatrix_complex_fwrite (FILE * stream, const gsl_spmatrix_complex * m); int gsl_spmatrix_complex_fread (FILE * stream, gsl_spmatrix_complex * m); /* get/set */ gsl_complex gsl_spmatrix_complex_get (const gsl_spmatrix_complex * m, const size_t i, const size_t j); int gsl_spmatrix_complex_set (gsl_spmatrix_complex * m, const size_t i, const size_t j, const gsl_complex x); gsl_complex * gsl_spmatrix_complex_ptr (const gsl_spmatrix_complex * m, const size_t i, const size_t j); /* operations */ int gsl_spmatrix_complex_scale (gsl_spmatrix_complex * m, const gsl_complex x); int gsl_spmatrix_complex_scale_columns (gsl_spmatrix_complex * m, const gsl_vector_complex * x); int gsl_spmatrix_complex_scale_rows (gsl_spmatrix_complex * m, const gsl_vector_complex * x); int gsl_spmatrix_complex_add (gsl_spmatrix_complex * c, const gsl_spmatrix_complex * a, const gsl_spmatrix_complex * b); int gsl_spmatrix_complex_dense_add (gsl_matrix_complex * a, const gsl_spmatrix_complex * b); int gsl_spmatrix_complex_dense_sub (gsl_matrix_complex * a, const gsl_spmatrix_complex * b); int gsl_spmatrix_complex_d2sp (gsl_spmatrix_complex * T, const gsl_matrix_complex * A); int gsl_spmatrix_complex_sp2d (gsl_matrix_complex * A, const gsl_spmatrix_complex * S); #ifndef GSL_DISABLE_DEPRECATED int gsl_spmatrix_complex_add_to_dense (gsl_matrix_complex * a, const gsl_spmatrix_complex * b); #endif /* properties */ int gsl_spmatrix_complex_equal (const gsl_spmatrix_complex * a, const gsl_spmatrix_complex * b); /* swap */ int gsl_spmatrix_complex_transpose (gsl_spmatrix_complex * m); int gsl_spmatrix_complex_transpose2 (gsl_spmatrix_complex * m); int gsl_spmatrix_complex_transpose_memcpy (gsl_spmatrix_complex * dest, const gsl_spmatrix_complex * src); __END_DECLS #endif /* __GSL_SPMATRIX_COMPLEX_DOUBLE_H__ */ gsl-2.7.1/spmatrix/gsl_spmatrix_complex_long_double.h0000644016036000116100000001665413673205721020104 00000000000000/* spmatrix/gsl_spmatrix_long_double.h * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 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_COMPLEX_LONG_DOUBLE_H__ #define __GSL_SPMATRIX_COMPLEX_LONG_DOUBLE_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 /* * COO format: * * If data[n] = A_{ij}, then: * i = A->i[n] * j = A->p[n] * * Compressed column format (CSC): * * 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 (CSR): * * 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: * * COO/CSC: row indices * CSR: column indices */ int *i; long double *data; /* matrix elements of size nzmax */ /* * COO: p[n] = column number of element data[n] * CSC: p[j] = index in data of first non-zero element in column j * CSR: p[i] = index in data of first non-zero element in row i */ int *p; size_t nzmax; /* maximum number of matrix elements */ size_t nz; /* number of non-zero values in matrix */ gsl_bst_workspace *tree; /* binary tree structure */ gsl_spmatrix_pool *pool; /* memory pool for binary tree nodes */ size_t node_size; /* size of individual tree node in bytes */ /* * workspace of size 2*MAX(size1,size2)*MAX(sizeof(long double),sizeof(int)) * used in various routines */ union { void *work_void; int *work_int; long double *work_atomic; } work; int sptype; /* sparse storage type */ size_t spflags; /* GSL_SPMATRIX_FLG_xxx */ } gsl_spmatrix_complex_long_double; /* * Prototypes */ /* allocation / initialization */ gsl_spmatrix_complex_long_double * gsl_spmatrix_complex_long_double_alloc (const size_t n1, const size_t n2); gsl_spmatrix_complex_long_double * gsl_spmatrix_complex_long_double_alloc_nzmax (const size_t n1, const size_t n2, const size_t nzmax, const int sptype); void gsl_spmatrix_complex_long_double_free (gsl_spmatrix_complex_long_double * m); int gsl_spmatrix_complex_long_double_realloc (const size_t nzmax, gsl_spmatrix_complex_long_double * m); size_t gsl_spmatrix_complex_long_double_nnz (const gsl_spmatrix_complex_long_double * m); const char * gsl_spmatrix_complex_long_double_type (const gsl_spmatrix_complex_long_double * m); int gsl_spmatrix_complex_long_double_set_zero (gsl_spmatrix_complex_long_double * m); int gsl_spmatrix_complex_long_double_tree_rebuild (gsl_spmatrix_complex_long_double * m); /* compress */ int gsl_spmatrix_complex_long_double_csc (gsl_spmatrix_complex_long_double * dest, const gsl_spmatrix_complex_long_double * src); int gsl_spmatrix_complex_long_double_csr (gsl_spmatrix_complex_long_double * dest, const gsl_spmatrix_complex_long_double * src); gsl_spmatrix_complex_long_double * gsl_spmatrix_complex_long_double_compress (const gsl_spmatrix_complex_long_double * src, const int sptype); gsl_spmatrix_complex_long_double * gsl_spmatrix_complex_long_double_compcol (const gsl_spmatrix_complex_long_double * src); gsl_spmatrix_complex_long_double * gsl_spmatrix_complex_long_double_ccs (const gsl_spmatrix_complex_long_double * src); gsl_spmatrix_complex_long_double * gsl_spmatrix_complex_long_double_crs (const gsl_spmatrix_complex_long_double * src); /* copy */ int gsl_spmatrix_complex_long_double_memcpy (gsl_spmatrix_complex_long_double * dest, const gsl_spmatrix_complex_long_double * src); /* file I/O */ int gsl_spmatrix_complex_long_double_fprintf (FILE * stream, const gsl_spmatrix_complex_long_double * m, const char * format); gsl_spmatrix_complex_long_double * gsl_spmatrix_complex_long_double_fscanf (FILE * stream); int gsl_spmatrix_complex_long_double_fwrite (FILE * stream, const gsl_spmatrix_complex_long_double * m); int gsl_spmatrix_complex_long_double_fread (FILE * stream, gsl_spmatrix_complex_long_double * m); /* get/set */ gsl_complex_long_double gsl_spmatrix_complex_long_double_get (const gsl_spmatrix_complex_long_double * m, const size_t i, const size_t j); int gsl_spmatrix_complex_long_double_set (gsl_spmatrix_complex_long_double * m, const size_t i, const size_t j, const gsl_complex_long_double x); gsl_complex_long_double * gsl_spmatrix_complex_long_double_ptr (const gsl_spmatrix_complex_long_double * m, const size_t i, const size_t j); /* operations */ int gsl_spmatrix_complex_long_double_scale (gsl_spmatrix_complex_long_double * m, const gsl_complex_long_double x); int gsl_spmatrix_complex_long_double_scale_columns (gsl_spmatrix_complex_long_double * m, const gsl_vector_complex_long_double * x); int gsl_spmatrix_complex_long_double_scale_rows (gsl_spmatrix_complex_long_double * m, const gsl_vector_complex_long_double * x); int gsl_spmatrix_complex_long_double_add (gsl_spmatrix_complex_long_double * c, const gsl_spmatrix_complex_long_double * a, const gsl_spmatrix_complex_long_double * b); int gsl_spmatrix_complex_long_double_dense_add (gsl_matrix_complex_long_double * a, const gsl_spmatrix_complex_long_double * b); int gsl_spmatrix_complex_long_double_dense_sub (gsl_matrix_complex_long_double * a, const gsl_spmatrix_complex_long_double * b); int gsl_spmatrix_complex_long_double_d2sp (gsl_spmatrix_complex_long_double * T, const gsl_matrix_complex_long_double * A); int gsl_spmatrix_complex_long_double_sp2d (gsl_matrix_complex_long_double * A, const gsl_spmatrix_complex_long_double * S); #ifndef GSL_DISABLE_DEPRECATED int gsl_spmatrix_complex_long_double_add_to_dense (gsl_matrix_complex_long_double * a, const gsl_spmatrix_complex_long_double * b); #endif /* properties */ int gsl_spmatrix_complex_long_double_equal (const gsl_spmatrix_complex_long_double * a, const gsl_spmatrix_complex_long_double * b); /* swap */ int gsl_spmatrix_complex_long_double_transpose (gsl_spmatrix_complex_long_double * m); int gsl_spmatrix_complex_long_double_transpose2 (gsl_spmatrix_complex_long_double * m); int gsl_spmatrix_complex_long_double_transpose_memcpy (gsl_spmatrix_complex_long_double * dest, const gsl_spmatrix_complex_long_double * src); __END_DECLS #endif /* __GSL_SPMATRIX_COMPLEX_LONG_DOUBLE_H__ */ gsl-2.7.1/spmatrix/Makefile.in0000644016036000116100000011206314151557215013153 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(pkginclude_HEADERS) $(am__DIST_COMMON) 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 = compress.lo copy.lo file.lo getset.lo \ init.lo minmax.lo oper.lo prop.lo util.lo swap.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 ../bst/libgslbst.la \ ../test/libgsltest.la ../matrix/libgslmatrix.la \ ../vector/libgslvector.la ../blas/libgslblas.la \ ../cblas/libgslcblas.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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/compress.Plo ./$(DEPDIR)/copy.Plo \ ./$(DEPDIR)/file.Plo ./$(DEPDIR)/getset.Plo \ ./$(DEPDIR)/init.Plo ./$(DEPDIR)/minmax.Plo \ ./$(DEPDIR)/oper.Plo ./$(DEPDIR)/prop.Plo ./$(DEPDIR)/swap.Plo \ ./$(DEPDIR)/test.Po ./$(DEPDIR)/util.Plo 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver TODO 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 gsl_spmatrix_char.h gsl_spmatrix_double.h gsl_spmatrix_float.h gsl_spmatrix_int.h gsl_spmatrix_long_double.h gsl_spmatrix_long.h gsl_spmatrix_short.h gsl_spmatrix_uchar.h gsl_spmatrix_uint.h gsl_spmatrix_ulong.h gsl_spmatrix_ushort.h gsl_spmatrix_complex_float.h gsl_spmatrix_complex_double.h gsl_spmatrix_complex_long_double.h libgslspmatrix_la_SOURCES = compress.c copy.c file.c getset.c init.c minmax.c oper.c prop.c util.c swap.c AM_CPPFLAGS = -I$(top_srcdir) noinst_HEADERS = compress_source.c copy_source.c file_source.c getset_source.c getset_complex_source.c init_source.c minmax_source.c oper_source.c oper_complex_source.c prop_source.c swap_source.c test_source.c test_complex_source.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslspmatrix.la ../bst/libgslbst.la ../test/libgsltest.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../block/libgslblock.la ../sys/libgslsys.la ../err/libgslerr.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 spmatrix/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu spmatrix/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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)/compress.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getset.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minmax.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oper.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prop.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/swap.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/compress.Plo -rm -f ./$(DEPDIR)/copy.Plo -rm -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/getset.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/minmax.Plo -rm -f ./$(DEPDIR)/oper.Plo -rm -f ./$(DEPDIR)/prop.Plo -rm -f ./$(DEPDIR)/swap.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/util.Plo -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 -f ./$(DEPDIR)/compress.Plo -rm -f ./$(DEPDIR)/copy.Plo -rm -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/getset.Plo -rm -f ./$(DEPDIR)/init.Plo -rm -f ./$(DEPDIR)/minmax.Plo -rm -f ./$(DEPDIR)/oper.Plo -rm -f ./$(DEPDIR)/prop.Plo -rm -f ./$(DEPDIR)/swap.Plo -rm -f ./$(DEPDIR)/test.Po -rm -f ./$(DEPDIR)/util.Plo -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/spmatrix/TODO0000644016036000116100000000123113471453340011566 000000000000001. extend transpose to CCS/CRS (in-place) 2. extend spblas_dgemm to CRS 3. range checking on get/set - move part of the routine into the .h header file, and put the rest in a _source file ? 4. sorted csc,csr 5. document: spmatrix_compress 6. _csc, _csr : should these accept matrix input argument? instead of allocating matrix ? 7. example program for parallel assembly / FLG_FIXED flag documentation 8. scipy routines: gsl_spmatrix_diagonal - extract diagonal gsl_spmatrix_memcpy - convert CSR to CSC etc, csr_tocsc csr_tobsr ? csr_sort_indices get_csr_submatrix 9. spmatrix_max_index + tests for min/max_index 10. document FLG_FIXED and FLG_GROW ? gsl-2.7.1/spmatrix/compress.c0000644016036000116100000000347713377342160013115 00000000000000#include #include #include #include #define BASE_GSL_COMPLEX_LONG #include "templates_on.h" #include "compress_source.c" #include "templates_off.h" #undef BASE_GSL_COMPLEX_LONG #define BASE_GSL_COMPLEX #include "templates_on.h" #include "compress_source.c" #include "templates_off.h" #undef BASE_GSL_COMPLEX #define BASE_GSL_COMPLEX_FLOAT #include "templates_on.h" #include "compress_source.c" #include "templates_off.h" #undef BASE_GSL_COMPLEX_FLOAT #define BASE_LONG_DOUBLE #include "templates_on.h" #include "compress_source.c" #include "templates_off.h" #undef BASE_LONG_DOUBLE #define BASE_DOUBLE #include "templates_on.h" #include "compress_source.c" #include "templates_off.h" #undef BASE_DOUBLE #define BASE_FLOAT #include "templates_on.h" #include "compress_source.c" #include "templates_off.h" #undef BASE_FLOAT #define BASE_ULONG #include "templates_on.h" #include "compress_source.c" #include "templates_off.h" #undef BASE_ULONG #define BASE_LONG #include "templates_on.h" #include "compress_source.c" #include "templates_off.h" #undef BASE_LONG #define BASE_UINT #include "templates_on.h" #include "compress_source.c" #include "templates_off.h" #undef BASE_UINT #define BASE_INT #include "templates_on.h" #include "compress_source.c" #include "templates_off.h" #undef BASE_INT #define BASE_USHORT #include "templates_on.h" #include "compress_source.c" #include "templates_off.h" #undef BASE_USHORT #define BASE_SHORT #include "templates_on.h" #include "compress_source.c" #include "templates_off.h" #undef BASE_SHORT #define BASE_UCHAR #include "templates_on.h" #include "compress_source.c" #include "templates_off.h" #undef BASE_UCHAR #define BASE_CHAR #include "templates_on.h" #include "compress_source.c" #include "templates_off.h" #undef BASE_CHAR gsl-2.7.1/spmatrix/copy.c0000644016036000116100000000344013377342225012224 00000000000000#include #include #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-2.7.1/spmatrix/file.c0000644016036000116100000000340713377342300012166 00000000000000#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-2.7.1/spmatrix/getset.c0000644016036000116100000000352413377342262012551 00000000000000#include #include #include #include #include #define BASE_GSL_COMPLEX_LONG #include "templates_on.h" #include "getset_complex_source.c" #include "templates_off.h" #undef BASE_GSL_COMPLEX_LONG #define BASE_GSL_COMPLEX #include "templates_on.h" #include "getset_complex_source.c" #include "templates_off.h" #undef BASE_GSL_COMPLEX #define BASE_GSL_COMPLEX_FLOAT #include "templates_on.h" #include "getset_complex_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-2.7.1/spmatrix/init.c0000644016036000116100000000344013377342314012214 00000000000000#include #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-2.7.1/spmatrix/minmax.c0000644016036000116100000000260413445207145012541 00000000000000#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-2.7.1/spmatrix/oper.c0000644016036000116100000000343713377342325012226 00000000000000#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-2.7.1/spmatrix/prop.c0000644016036000116100000000340713377342341012234 00000000000000#include #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-2.7.1/spmatrix/util.c0000644016036000116100000000276313377342374012243 00000000000000/* spmatrix/util.c * * Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017, 2018 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_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, int * c) { int sum = 0; size_t k; for (k = 0; k < n; ++k) { int ck = c[k]; c[k] = sum; sum += ck; } c[n] = sum; } gsl-2.7.1/spmatrix/swap.c0000644016036000116100000000344013377342355012230 00000000000000#include #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-2.7.1/spmatrix/test.c0000644016036000116100000000727513377341570012245 00000000000000/* spmatrix/test.c * * Copyright (C) 2018 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 int status = 0; #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 int main (void) { const size_t num = 3; const size_t M[] = { 53, 40, 30 }; const size_t N[] = { 107, 20, 30 }; const double density[] = { 0.3, 0.2, 0.5 }; gsl_rng * r = gsl_rng_alloc(gsl_rng_default); size_t i; for (i = 0; i < num; ++i) { test_all (M[i], N[i], density[i], r); test_float_all (M[i], N[i], density[i], r); test_long_double_all (M[i], N[i], density[i], r); test_ulong_all (M[i], N[i], density[i], r); test_long_all (M[i], N[i], density[i], r); test_uint_all (M[i], N[i], density[i], r); test_int_all (M[i], N[i], density[i], r); test_ushort_all (M[i], N[i], density[i], r); test_short_all (M[i], N[i], density[i], r); test_uchar_all (M[i], N[i], density[i], r); test_char_all (M[i], N[i], density[i], r); test_complex_all (M[i], N[i], density[i], r); test_complex_float_all (M[i], N[i], density[i], r); test_complex_long_double_all (M[i], N[i], density[i], r); } gsl_rng_free(r); exit (gsl_test_summary ()); } gsl-2.7.1/splinalg/0000755016036000116100000000000014151602577011127 500000000000000gsl-2.7.1/splinalg/Makefile.am0000644016036000116100000000111613377336121013100 00000000000000noinst_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 ../bst/libgslbst.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-2.7.1/splinalg/gsl_splinalg.h0000644016036000116100000000467113373111456013702 00000000000000/* 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-2.7.1/splinalg/Makefile.in0000644016036000116100000010625014151557215013116 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) 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 ../bst/libgslbst.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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/gmres.Plo ./$(DEPDIR)/itersolve.Plo \ ./$(DEPDIR)/test.Po 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ 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@ runstatedir = @runstatedir@ 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 ../bst/libgslbst.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 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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 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) 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/itersolve.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .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 -o $@ $< .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 -o $@ `$(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; \ elif test -n "$$redo_logs"; then \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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: $(check_PROGRAMS) @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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 -f ./$(DEPDIR)/gmres.Plo -rm -f ./$(DEPDIR)/itersolve.Plo -rm -f ./$(DEPDIR)/test.Po -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 -f ./$(DEPDIR)/gmres.Plo -rm -f ./$(DEPDIR)/itersolve.Plo -rm -f ./$(DEPDIR)/test.Po -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 am--depfiles 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 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.7.1/splinalg/itersolve.c0000644016036000116100000000447013373111456013230 00000000000000/* 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-2.7.1/splinalg/gmres.c0000644016036000116100000003123213373111456012325 00000000000000/* 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-2.7.1/splinalg/test.c0000644016036000116100000002300213373111456012163 00000000000000/* 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-2.7.1/doc/0000755016036000116100000000000014151602600010046 500000000000000gsl-2.7.1/doc/images/0000755016036000116100000000000014151602577011330 500000000000000gsl-2.7.1/doc/images/bspline.png0000644016036000116100000005747414151556700013427 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœìÝ{|ÕùÇñÏ’p‹‚]´¨E.­¥JPPÔŠÄB@Tb­Š·¢UT*hQ”ÔÊϪÕz xË‚U@T¼â-­x•ÒzIŠ&@Ù 0¿?¦;d“ÈîÎìî÷ýò™Ý$g6“yæœó<çx Ã@DDDb«Ó IF À"""Pq€°ˆˆˆ€EDD ,""â`(‹ˆˆ8@XDDÄ À"""Pq€°ˆˆˆ€EDDàÞ¼fÍšË.»,##ÃãñìõÍž01h¡ˆˆÈ~sož2eJ÷îÝßyç¾ß¨/ªmi%ûc•dz÷F¶ä="""îáÞ°ˆˆHKœÜ£G¶mÛ|ðÁçœsÎúõënŽˆˆHs$;Öï÷ÿðÃï¿ÿþ1Ç3|øð>úÈéF‰ˆˆ4)¦N÷c~÷¾ûî{î¹ç^|ñÅæßÖ¶mÛ]»vµ¢i""’ø¢(3÷Ýw}úôÙ¾}{Ä¿³ËéŒÜOgï¤tF.üA 2Ý@‚]g""’x3:ÔéVˆˆˆ4)Õéì'û˜À¨Q£.½ôÒaÆuíÚuãÆO>ùä]wÝõÒK/9ÛB‘f¸·l_T²ù&gÍšõÄO 0 --íøã_¿~ýÛo¿=hРضWDDd$Ú´ü>QV‚ûéŒÜ/ñΈD<)‘ {{À""" L8¡Ìž=Ûé&D˜ÎÈýïŒHēҹP¢ Jì“Ä“‘ÈÒ´ˆˆHBQq€°ˆˆˆ€EDD ,""â`(‹ˆˆ8@XDDÄ À"""Pq€°ˆˆˆ€EDD ,""â`(‹ˆˆ8@XDDÄ À"""Pq€°ˆˆˆ€EDD ,""â`(‹ˆˆ8@XDDÄ À"""Pq€°ˆˆˆ€EDD ,""â`(‹ˆˆ8@XDDÄ À"""Pq€°ˆˆˆ€EDD ,""â`(‹ˆˆ8@XDDÄ À"""Pq€°ˆˆˆ€EDDêt\¡¦¦fåÊ•%%%½{÷>í´ÓÒÒÒœn‘ˆˆ$8`À¤I“JKKÍz½^¿ßŸ““ãl«DD$±y Ãpº Žñx‰ˆdÀGqÄ>‰ÍW 8ÐÊÀ2y½ÞuëÖiXDD4-ééé………^¯×:âóù }ED$ª’½lž¾ê€ED¤QÑë+'ï鋈È^iZDD$¡(‹ˆˆ8@XDDÄ À"""Pq€°ˆˆˆ€EDD ,""â€T§à.ZKDDbCøÀ¤I“¬222®»îº+¯¼RaXDD".A† ×¬YsÙe—eddx<ž–¼¿¦¦fÉ’%À’%Kjjj€êêê‰'Ú·Eª¬¬œ9sæGQ\\¥f‹ˆHÒJÅû÷››››;`À€½žQƒž®×ëõûýßÿýرc}¿Ïç[»v­öGIBÚŒ¡¥öúIUWW0 ¬¬ÌüçIð ø|¾©S§Þpà M}Õ²eËÆŒá¶Šˆˆëi3†ˆY½zµ}`%üJKKüñÇf¾jÆ ±hœˆˆ$¤K²Bi máa8R;tðù|ö9`»#Ž8"Fí‘ät=`+”š ¿‡=0N|時‚‚^½z…‰×ë>|x Û(""‰/éððáÃ}>ŸõÏ{aì€ãÖ¬ylĈM›6:t°Þàóù •%"’Ønºé&Oc¢÷“. (..ÎÍ͵ò°€³àIøÆ|páúõ©©©ZŽCDDPt˵𓪩©™3gÎüùó­#ÀoáS(ñûO›0!ŠM‘ø¡,èKKKëÖ­›ýÈïá3è¾;îpªU""’<’4–Ø„‰PÞ{%Kœj•ˆˆ$‰‚ntž|¯+rtÐA ^ß¹ó¼mÛðùX¿žŽ#ÙD‰C‚Þ £1͉™Øìõz­#>ŸoìŠ}4¥¥äçG·Å""’ܤ¼<O0l˜ðüî» F‡¬_­`IDD’² £¢ÉuâDü~Î=—E‹bÞ(qà¨hòc-+£o_vìà­·:4æí·Ðply½\u†Áµ×:ÝILê7qúÛ·sØa|÷«Vqòɱm—ˆˆ¸…zÀ1wàüá·ÝætSDD$©ÜôéWWsÈ!lÛÆÛok&XD$9©ì„ôt.¿À¶d´ˆˆHD¨ÜìéoÙÂ!‡ òÁüâ±j—ˆˆ¸…zÀéÚ• /Ä0Ð ""Qêïíô7n¤OvïæóÏ9üð˜´KDDÜB=`çdg“—ÇîÝÜsÓM‘Ä¡p Nÿ³ÏèߟƒbÓ&8 úí·PØQýú1t(UU<ý´ÓM‘¡Ü2_ ðÀN·CDD„† [vú;wâõR^Î0hP”Û%""n¡!h§µoϹçüíoN7EDDzÀ->ýý‹#䀨´‰ôôh¶KDDÜB=`øéO1‚íÛyâ §›"""qOx_˜©X÷ßït;DD$îiz_N¿¶–ìlÊËY³FKC‹ˆ$ A»C»vLšðøãN7EDDâ›zÀûxúÇËÁSVFJJMMÍÊ•+KJJz÷î}Úi§¥¥¥E§¥""âŒèõ€€÷ýôûöå_ÿbÕª@§N“&M*--5{½^¿ßŸ““áVŠˆˆs€£b¯kãÜ›o榛ê&OîóöÛeeeö÷û|¾µkצ«HID$Q(GEók h¼ƒûÅ~xmjj׺ºía_µlÙ²1cÆD­É""SJеêêê‰'ZÑ(++›8qbuuu ¼|M»víêêÆ6ö…6lˆY#ED$~)7nõêÕ †—ÒÒÒÙ³g=úï;wç6ö…GqDô['""qO¸qMudï¾ûîÊÊʧ N†õ_õz½Ã‡AóDD$Þ)7®ùŽìVxRa¢í Ïç+,,T–ˆˆ´„pã†îóùšyÓä†þ9cÆŒÏ?ÿ|È!Ñn˜ˆˆ$eA7yúÅÅŹ¹¹á3Á¦4(‡à…¯wݺuêûŠˆ$•!EEËë€ËËËçÏŸßàÕgàLøSçΧ­\©¾¯ˆHBRŽŠ–¬ÕÕÕ´W%¦¥=XS³ûøãSÞ|3: ‡©Øaééé………^¯×:âóù¦._N‡)ï¼Ã·ß:Ø6‰GêïÃé7²2åg°lý+—^½vŠˆˆS4øX 8ïý­[éÑà»ïèܹõ­÷д‹ué²û¸ã¨«[9mÚ’%KjjjœnˆˆÄàÖ ·~ò ðÃãçææöíÛ·¸¸ØéF‰ˆˆÛiºU§_]]=`À€6ee_C5tƒZðù|k×®ÕÒÐI®‘ªq‰CÑ‚NÆ7MT@æ¦MÛ׬9pÐ gÛ&1°×ÕÂͤè¦Æ §*a‘„§!èÈh°ìÑx€×þøG%µ&¼@ pä‘Gæææ^sÍ5¹¹¹öôfKxRt·nÝšú†ªI À‘>`øm^~¹ÑÛ±$Œð5ŸËÊÊ&NœX]]Ýà999ëׯ÷ûýùùù~¿íÚµ ggg*K$á¹7—––Ž?>=====}üøñÍ/«ë ³všÂ W#໲²ÓO?ý»ï¾‹q“$6]ó¹©,ª´´´ &LŸ>}„ Yݺ=ë­Ó»t¹^‡wáõÔÔõýú}5bÄõëÙ´)&ÍǸ4oß¾}äÈ‘ƒ *)))))4hШQ£šË5ê‹YSMáË}ká@  P?8!5•-Õ\Õ7ßpë­ôé3 //ëÖ+a #víúégŸ¥.^Ìùç“M¿~ÌžÍÖ­Qj¹ˆ8Ë¥øÁ2dȬY³:wîܹsçY³f <ø¡‡rº]M ŸáVð+***–”x×T¶Tyyy#Œ_}En.½{sã|ý5½{3i·ÝÆ /ðÎ;¼ü2K–pÏ=ŒKz:ŸΜ9z(7Þ¨0,’€ W:ñÄ_zé%û‘—^ziäÈ‘M½ÿN$â§ g̘a}¶'klŸö²eË"ûÅqUUUM­ùìõzÀß·s§1w®Ñ±£F»vÆ„ ƪUÆîÝM}Û`UÕ³gÕ·¯ééÆÃÇè”DÄ&zÒ¥¸{÷î›7o¶ùöÛo{ôèÑÔû¬¬¬ÔÔÔ=zœ}öÙŸþyK~J4>Vûí¸ad…îÈùùùÿ‰â¸@ Ð`ðÃâóùªªªŒ@À0C©Çcœ{®ñÍ7Íâ¢"ë*otèðß0|î¹Æ?Äæ¤DĽìÒ!èmÛ¶uéÒÅ~¤k×®[›…;v¬ßïÿá‡ÞÿýcŽ9føðá}ôQô›Ùs,:33øVƒN½Úø°¤Ä93½Ù>øa)--ýÏ-·0bë×Ó·/¯¾Ê¢E|p3»/4H«Àˆ¼¦kW#-Å‹9úh>þ8g%"Ñ¥ÀÞJmÛ¶­­­µ©­­m×®] ¿ü¯ýë¯~õ«½¾­©ÏdöìÙûÑf»Í›7›1ø`À"Û7¯7,) $??¿Á…ä›Ì^/—]fìÜi¾ÓÞÁ ¿$–-[ÖèeùÚ½÷þw8ú­·:K‘„5{öìJ—à}‚n`óæÍpÀ^ßÕçsXòH0`3Øë¢þ;,)‰¥Aàl O€{Ú´1î¹Çz[UUUøxµý’ä¦üü|£¦Æ8ë,Œ0^{Í¡I.Ñ‹.‚îß¿ÿÇõÇÙ>ùä“~ýúµðË lñdKŽ1£²à(ÛKZj?!ÙKÑR &Ãö6mvøýL›f½m¯uÃM¥UqÄtìXó·¿}}≃»O=uçòåQ8‰—àÓO?½  À~¤   ÑÝÜUXX8tèÐ(´kߤ¥¥uëÖÍ,F:¥þKZj?ñX¥h¸΂Ú´ùêïOûÍoìoÛkÝpxM9¡Å)À‘ôyýõ ¥¶–3Îøø®»ššK·‹RϺ•ª««=ôйsçnݺuëÖ­·ÞzkŸ>}¶oßn½ÁÞò‘#Gúýþo¿ý¶¶¶öË/¿œ;wnffæ|°×ŸƒÓ_¶lY.ðrý]õH‰* nøõ¯ ØÕ¾ýŽ—_CSS¼öK¢AZµÏç{ýõ× 222Ì#Xl…Ÿ†Þ¦ô‘hˆ^¤pi6 㫯¾7n\§N:uê4nܸ¯¿þÚþªýyõÕWÏ<óÌ®]»¦¦¦öêÕkÊ”)ëׯoɈA®ªªúyvönØm7JÍ'¬¹s 0Ú·7ê²[­¿$‚Á µjô믿þ%mà0àßÐÕªui‰DVô"…ÇpÁt©S<žXœ~qqqÚ ' ¬­=^ŸÏ÷ôÓO2$Ú?W°|9ãÆáñà÷sæ™M½«¸¸877ך nþ’¨®®0`@£k¡o X §@-Ë–-3fLëOEDLÑ‹Ú8êrrrê~ÿ{î¼sÞ‰'^|Ùen+ñËÚ x@jê)7ÞèÙ³‡Ûoo&úJÐk~ÿ`K£I[¦ Œ…b÷ÂE€Ò Dâ‡p,´=š;ï<¦ªê˜ œn‹DR ˜4iRiiéAP ØròÉ]¯»n¯_hn‹Ô’Ñ|@ÝgÀ›p!¼ …M'Q‹ˆÛ¸4 :Ñ FÇŽ|ôN7E"ÆZ²ª <?…`èúõÕ?üÁŸ²×€úLà~ܳçðáÃ#øÓE$z€c¢C† cÏ^{Íé¦H«Ø—\µj•98< ~ p&ü«¬,²EÞV%5ð,‡ÎðrÏžéÁŸ."Ñ£!èX9é$^~™W^aâD§›"ûÉp6ÿió8¾Z7 kÍ([sÃfy±=i+œwÜÈO>Iÿç?ën¿½íÌ™û݉eAÇêô׬ᗿäÐCùòËýD‰¨F³‘SàM8…óC÷;¹A€÷z½‹-*///))éÑ£°yóæòòòùóç7úå§Á Øåñ¬/(xî¹ûÑ ½H¡«Óß³‡¬,**øÏèÓ'F?T"gùòåák±]wÀF•x½ÞuëÖ¥§§ïë÷o4À§¦¦îÚµ‹ÐwöûýGyäÀ­ ÝÀÿÁåðq»v‡nޜ޹ó¾¶ADÂE/Rh8VÚ´aäH€W^qº)²?–ûÂ0`j(úú|¾ÂÂÂýˆ¾4QndE_ ¬¬lâĉ€¹àe£ßd| ?¯­-kloDqà:é$€—_ÞÛûÄd#{à!èÅž³x±¹dÕ矾ßK¬´dæØÜ³Á,#6×ÉÊË˳¿!WpxAMÏ‹ˆ(Ç€_Ý»nŠì³ÙÈy0¾…_­]{ýõ×6l„ ­Yb¥…õ»fœ6ˈ§OŸ^L¼–B»;¹üòýnŒˆÄ€p z(}ú°u+~ètSdŸY›`æA] Õ¡ÁáêêêÖ|ÿ–”§ýªÛ{ö4ÒÓY¾œ¥K[Ó$‰*à˜Ú5bðÖìÙÚ<.™c¿3f̸²àMx"ôRë÷x¶xSjjÃ*AsSÂæ¿Êçó-\ºÔsûíW^I0ØšV‰Hô¨8vÀcÏ=wÔ®\™»r¥™Ôš““ãt»¤9á…¹ýví:vÁïÁžÙúE˜¬Ý­[·)S¦4س!<ëñ•¥æÑGyï=æÏgΜV6LD¢AeH1:}³È¤¦¬ì{¨….°|>ßÚµk÷/iVb ¼0×_XxØEu]·în¸ªþ›£± Qxøß‡/8î8:tà³Ïjºwßÿï#’ÜT± ÀVéûp4œf2´6s­F s/É̼¯¢¢<%åðÝ»«lÇ÷»ü7ªvMš”ZX¸æðõm[Ehr ½ˆìÕÇ=k|Ò¬v\Ü&¼07®¨¨¶_{mzýi×ý.ÿ’šššyóæýìŃ0èßÿ>Ò¶ HYYÙ©§žºhÑ"e!ˆ8K8F¬äÕW8)츸Mø³ÑïàHØ–™yèœ9V%n+Ë#ËÜ+âŠ+®ðù|³fÍú¼ºúþRÿO½²²2//¯oß¾ÅÅÅÎ4TD4Ë9`sÁ°ÚCwHs帥˜¬=Ùþ ÙðÄØ±ãž|Ò…Ó¨ f¬Mi°¼ð[x,ìK”… ²W‚Ž{V¹È𴉙™n·»%¶—C6|ç.[æÂ¾£µ9qƒã5`n4:„}Uë«§Dd¿)ÇŽµ‚`ûÓNî9ã —Œ[J£ì%¶Áõ\F„VÞˆ¬F—’6=kÀÓ{UY"NQŽ)sÁãçÌR_ÝéæÈ^X+oL‡®ð¼zÉm}ÇfâèÛÓCøIÊBF™ù ,h°jPSÇe?h!Ôüô§©:µûòËî½wøùç»p6Q,iiiÙ8€Yõ_rUß±ù8º V·m;¼®îz¸Îv<|i-Ix ŠËðñF*àýþœœœ¦Ž;u.qÏHbŽœ~QQ‘Ïç+ mcçõz@ì›!-÷ù9ç¡ú1»eË–9Ý´ÿ©ªªjj)錌Œ¹sçîxçÃãùÑã±Ê§|>_QQ‘Ó —˜2ï?Öµ‘•••••e¿Tn¾ùæ|0##£ÁUäóù6nܾ¦Ï竪ªrú´¢+z‘BYÐ1=}km‡‹á~(„IÊDu¹íÛCñlÙ2ìs.\y£¸¸877ך ÎÌÌœ›'ŸüzĈ¥§Ÿ®%±’„½¿{üñÇsÌ1Må ìÕøñã—6¶½G¯&¤•°¢"öتl96À÷ÐŒ$¸‚ãØ‚\sÍö¯¬l°,³ sèö²tå—_rä‘ìÞͺuôíëP%vŒgffVØ–d‰”üüüéÓ§GüÛºGô"…æ€cÊš5ü7l„lk]6›(ÿ³s'wÞ tš?ýðáî_NÙÌòkòåŸü„óÏç¸å<†í˜•iöþn4¢/Êãkà˜²_©¯AŒ„µº‚]롇øæŽ:ŠSOMóxš‹mñbÖ,}”§žâúë0ÀéÖH5S™A òøZµ}HòQŽ)smsDÈ ÀÏ(Õ}jjj^\¾ü¤oL‡×^ÛÞãqºEâõrÁüõ¯Üz+O=åtk$ŠZ8®Ö ~ ƒÁ ½ ²`'ì ¾‚¯à?ð.l®ÿµ ¶ÈTŽô>ÛkšV]]]”À×’Ó¸@ `fzÁ€ê6mï¼ûfHS‚Áàܹs322Î>…Þ –©^Vf´oo´ic¬[çtS$Š–-[Öè=?33ø9ÜŸ¥¦î£Åÿ­‡¿Á™ÐÆwÛm·ùýþ`0hFUUU¢æHG/Rì}n9;;û’K.™:uj÷îÝ[ï]%öIX&k”fj~~§Í›¿âŠöǯá7¹¹¹7n$´qäEðPÂeªïºä’ÔØðóŸrà ºð•µþ¼ýà€^½Š~÷»==–:¾'5õÛ¬¬•ëvîü¾…ï -tà`8…þph}sxž„UÐËëõûýßÿ½}ítKd˜F1Rì5DôÑG\pAFFÆ”)SŠ‹‹£ô àˆ–œ~ô->ð@þ¨ ØìðCÁ€òÐm—Uý¶FQQÑà^½vÀn¨ /qƒÁyóæY½=áoéé»ÒÒ̾lE›6 áxh^¯÷7Þ0w÷Z¼xñâÅ‹óóó ôhS!fÀ?={Ÿø"ÈÊȘø ©¹áF¯`0hí{mÎõæçç[_’ “aM( —Àyõ7ðz½f\ÿ>qÄ-ØT[[{ýõ×:t˜:ujü>;;€­‹ø0à„ÄêfÅëóÝ,nì>ïìwÏÀ€Gtá%–`0hvR®$‰Ž IDAT{ ¡Ðø.üf̘‘ŸŸo=h6ÐÂk Ñø}*|úYÁ±@¨Çì÷û_ýuûßWÜÍz¸%———ßzë­½zõ5jÔòåËkjjfÏž}æ™gF©qÑæ`¶.â»Á€›š}•¨j½y lŽÉÎÎN˜5“íwÏŸ@ÔÂ!0cÆŒ¸ë—H8ëQr4|l‹Z¶í] o>M­:ÞÎ JïñxìØÑÊØJIIiðæøšõp>¯]»ö /ìҥ˅^¸ÎV½°uëÖ´´´è´-ê ÀÖE< x3ô`GeÂhðD9ð6ÚÆ ‘"Sƒ»gð×Ðå_ý± ƒ©0ö„òK²h‘}ºù4˜¶ë·@mhDúWMÿÄ8êl8€W¬XqÒI'eggÏ;·¢¢¢‘o·[*9Ûró">vÁNèëõ&L7+¾ØGeOÁ€ ———H¡×b¿{ »aGh¶;##£   !Ï:±Yß xÝÌ´‚™-Þï}?öŲâ}£ßp ›]a¸Ë–ãbG³Nàœœœ'žx"!—ãpüÑÁLLøÖç3àÇçžs¶1IËÞ> Ø©qõ„¾¯¬iBBùÞ lwFu…ã‹5‡â…µ¡ xX ân^^^+³¢šé §ÀŒPWø#èö†8úûr2'0Çðýñ×]çt;’”}Töq0`NLXýþ£`l‡®¶›c|MÑ%'+¯Ø|–e¡µÛÌÐŽ?¾Ñ‘h/w4l‚pŽíxvvvAAA¼$E+G…[ðªUGít;’—ù ŸªÌÒ³gÂOØûýσ³ã¶ƒ’„äíç@%°:×ÿ=z½Þ7†§ME𳩺&ÓðH(Az>¤@VVVVV–½%.qQŽ ·à`ÐhßÞHI1¶msº)É+ ~h¼ Ì-Úeí$lÏvO6Lô"…zÀ>|¸9Sò:ê»ç6õîÝÛüŸÁоƒ8âˆ#l•SÌñ€aÚÍFS!î.ºè"à2¸vÀð5×_½½—9dÈG[Ú$û˜“iÜ©°̵<öìÙc½ZVV6qâÄÄžRv˜5S²*á0Ò³gaa¡ý©V".\uÕUæÿŸÀãP—Ä>æ”ÇöÐÆ ×Õ?.Î2Ÿ+++…»øB¯öïß„ Ó§OŸ0aBZZZ“ßÅi^K‚YÃÙa¯&ü# °óÌ™’§üþŠþýÕ³g»ö61˜·³7BÃ_BvvvÒ>úXýþ{`Œ…¾õ‹SjjjæÍ›WVVÖüÐî„§B¯ÆÑ#cS×Ò<˜ )ðL{5±€]!--m„ ‡M ´{ûm§›“àìCac¡3|ká®»îJÚGk*ä{x ÚÀ5qusOTVÚs[xzÁ0#ôjFFF=2Z×X¸ÛàfH…'àŒú/•——'p6–°‹üxÜqÀöeË’%Ð!ögêßð(%%%´ÆìE#ù°¦x<Ïþõ¯ñrsOHöJ¹ùpl„³`Wè >ø`=2†&õèÑÃZú&¸Ì猓m_5þüDNÈRrW\pÕéõöùÌÊú¾nÊL~ogÑPTTôë= ¨‚ƒô,èk›¿ðpmý€äÚr£ý`-%í‡Á€Š°-„|>Ž^¤Ð´+X³’¯0 H‚ @§XCafåÃc¡5z4ÜJhØóùÍ›_ƒt¸89ªAÜÆœú-((hAwx„^1c†›ËöƒµdÇùùoM™òt…— ·í= ™¥ì Öµõ*#B¿˜„¼æÜ ''gÃSOõƒšüíSO%Øí¬5¬gÁ;¸ÚéY0¶ìS¿WÃ)PçY!ëõzgΜéær£ýc&¢NŸ>ýÌÜܳà Ȇ— 3ô†„ÌÆRv+Aÿ+ø ºÀQõKÄuX²H;ÿüñ“&%Þíl¿YÏ|/ÁZèªÎTb`ÌXÏ@¿€¹`Àïà[ 9†j†ÞÝç;>„ŸÂòÐ6Õ ™¥ì ö}³̵:¯$ÞíÏÌg öPíà^X@^^^2 Õ˜3Dy½§ÁW0ĶÕqâ͆(»‚=Aß\“ò´þQ×I¯¼Â·ßrøá ìtSÜÅþ,ø$”B $âíÏÌERo…°Þ¶*™ËºŠ sJø¼3N†ïàtx<@Â͆(»…•†püìÙx<à #ðæ›÷‹¸ššš%K–|>kPwÖYN7ÇuìÏ‚u°°åß&ØíÏ…ÌER‡«aœ;€äKKKëÖ­Û0‚p.Ì ½ôé§Ÿ:ٲȊRvu\pçé­oÛÖíV­"***òù|À°†|°>ÛFY50éP ºc$çnQ±a–#_€a 9ÙÙÙ‰TtÔBVôiP \ @fffŒÿl£)ÜbÆ…Øü ü 0;ôç§‚àˆ°Š­ÏÞÖgÛ,ëögîWºý~¿ÓMKXæg~?ð´MîÏܪ×~ {`üƉ?ÛèE A»‹™i¯Fã~b%—žÀb@ŸmÓ¬Éà¿@-üúð‡?üA©XÑ`NŽŒ„©°ò .ôRr.’jΆdff†6MzN€ÒÒÒyóæ%Àôœ°»˜ «a7äÀõKk˜Ÿa8 jm]:}¶2o½zõúC L`Ó¦MJÅŠ8s奂æ€}ž3iËsrr¦O7¯;nƒÿƒð,ôK”ª$`w1ÿÒ*áŸÐ.4 LÿFùN€Tx¶Ö?.árrrî¾ûn  ø-t4lQ555‹-=ztiié\ø |¶½!ÙÒ¯èß¿¿õÿWÂ3ÐVÂÁPVVvê©§.Z´(~»Â Àîbû½„F¡“ü/0"jjj*++322̼ç'CÇõÙ6Ïüü–CGø}踆 "ÂìøæååUVVßÃ.¸Ð¶ßQ2¬¼Ñ<{]Ü8Þ…Þ°„ÊÊʼ¼¼8î Gin9.¸óôÍuÉO>L¸U×a&?Ù°‚¡±}}¶{e¥b -‘o~tÚ9ªõ¬¬@ |Üb»9çååi+*öUƒ©ü x>´@QNËŠ^¤HpiiéøñãÓÓÓÓÓÓÇom·Ì‚àß?ñD]Û¶Gy<ëßz+á×¾‰*ûʺ¹Ðž‡¶ɰ®P+Yý·¡ºÂ‘‘QYY¿ã~.ae7@_ønµ½!yVÞhžyKœ1c†ùÏr pÜzOiiéªU«œjá~K„¼}ûö‘#G4¨¤¤¤¤¤dРA£FŠë»CZZÚo&On;r$†ÑñÝwnN|³ßæ&ð4˜ÃѺ»í•}]sbò*Øïã~î`-(1®ƒ=pì ½ªÉ»´´´™3gZcÑÿ±°¦Âõ¡÷\tÑEqwA&B~ðÁ‡ 2kÖ¬Î;wîÜyÖ¬Yƒ~衇œnW«ðê«N·#¾Y³•‡À`øVÖ?.Í3ûofd¬‡CÀœG×Ê”­î¼óN  ü ÚÂ}PzUS¿áìÏ‚@œ {`nh¿ÊÊʸ» !/_¾Ü\µÇ’——÷ÜsÏ9ÕžHùqèP zéR-HÙV’ó$ðÀ²ÐÚ~J~n¹´´´ŒŒŒ­••ó˜ºq(zÿ˜Ó"åååÀå0¾Ydhr¤iÖ³`FFðLh§Gm{¨ÇY}p”æ–c©{÷î›7o¶ùöÛo{ôè±×/tóéâó•ƒ}´ e+Xëé|ŒÀëõj¬}’ŸŸ´…0àŒÐ D+Sî+µÍ ն˲[·nÊ l‰@ `Æ`àn0`XåJ¿[F/R$BxÛ¶m]ºt±éÚµëÖ­[›z¿û™È_—–šKb¤á¾V0G®N8øàAP /i|o¿˜u¡= ÿXÿ¸´œ¹â•ùÿ÷B'Xf@¾úê«Õñm‰œœœ|Ðüÿ«áÈ€ WwËDÀ­áiÌM7Ýäl«¬¼!³ø$@Ã}û«¦¦¦¬¬ì–²AƒûýßÛV:ôß¡†À‰J‡ÞwfáoAA0Æ@%\zÕ¾è„4ï”SN1/H³8øðÂJ8Øß±è›nº©Ñˆ…æ‡D©gK‰7m÷? _šJîÛWVðÇ`@^·nÉßoV9æ,0ÀªùÐüH Ù Óa£m‡4-²ïìõÁ]B…Ô¯@»H_™Ñ‹‰Ðîß¿ÿÇl?òÉ'Ÿôë×Ï©ö´ž5¬÷%| ]áõKKXÀ?…ŸÁ6xª¼<^Ʀ\ÈJY|ÐAÕp2 ÄÕˆŸ³ìq·B/(‚M‹ì{}ðV ßÂ(x$Ôc)++;ýôÓ¿ûî;gÛÙŒDÀ§Ÿ~º9¤c)((;v¬Síi=ûêkÖ(´ê÷•u¿Ëà9¨ÕH~ë˜éÐ%UU÷03t\ŸjKX•oÇÀeP—ÀÈËËÓ´Èþ±× ¿†j8î ½¡¢¢bÀ€®­N„|ÑE½ûî»óæÍÛ¶mÛ¶mÛæÎ.¼ðB§Ûµÿìofð˜ô€¼¯¬ûÝüaÇe?˜ŸÞ]°ÆÁ€úÇ¥½{÷RáH;á@+^µŽýnù!Œƒp¥mŽŠŠ ×ŽÐ$BîÔ©Ók¯½öþûï÷îÝ»wïÞÿüç?_}õÕ8`ï_ébæèŠßï>gŽáñ …!?û™ÓŠ3æˆýðs¨ % ‘üÖ1?½ÍðwðØnsft‘¦«®º ¸~_Á@#[‘`‹~ÎÝ0.½Á½õÁQš[Ž qsúÇc€ñâ‹N·#ΘÀ3Á€GC¼R]Zɪ«öÂN؇ЫW/¥b5ÅJ¿ê ÛÁ€Ñdgg«ð7R¬+¸ ØãmÁn¿s²¢)¡œðêFŒþyÛmZkŸ˜cSg·m ˜u—Jui=óSíÕ«W@J¨&xÓ¦M®èsœ•Žp/OÁ Üu×]šúóÊÌÌÌî‡?A <§„Þàœ,`· ç>öÐnõêÜÜ\­€ßBærŸ>ûlÿººÚ´´Q·ßîWp„äääÜ}÷ÝÀí° ¦€9ú¬T¬¦˜äá×PÓCÇÍí–%RrrrÖ­[gÆà[ ÚÁ?àøÐÜ–“¥ìjf!ͳß„ÐC%-c.w››ûŸÛoVx<ÇŽ¡T—2#Çð4´…kCÇ5H®¦¦¦¼¼<îà:ø&ô’Ò".++kÅŠæ€ÿuð¤ÁspTè îÊÉŠÒÐv\pÿé[kÆ>L ýÖ´z3ìˬÆDy¿î$d]™ýa7쀞¡‹Sër˜‚Á ßïŸ6mšÙ!» x <¶J×d”ƒA3'+–†–3²bð¾ÞB£)Ôv5«´Ã\uèä°ãΚoë¿€*X¥ÑÑH³JÕ?…¥Ð® ½¤Alc0 .¬¨¨8¦B-\  t„(³êƒwÃdX]á[ vÉP°«Y#T/pRèñY#WͰžNÌÈå¡MÎõÔAöâË9°¦Ú:ÁIþ¸c-Áfþ³-ÜmàÏð3fÌP:B´Y9Yµƒ ÜO£ìjV?ã3ØÃîõtbà%aÇ%"Ìâ˼¼¼u°:Ú:ÁÀ§Ÿ~êXËœf_r˜á?07t¤[·nJGˆ+'˃_…ÀC5 À®fïg˜à‰;käªyƒÎÌÌôÁ1°=4z¯§–hHKK›0au‚,Xàx÷Â)ö‡ŸÀ\ ?†êY0f¬œ,3ÿºÀËp"à‚¡`·³–Äê~Î9Àï¼ÞwÞyÇ%.\QQ1<°vh¾-šÌAšðN°»rMc(Üy§µ14Xl[ˆMÏ‚1f Õ˜1øè/À™€ã3SQJîŠ ñuúÿ\¹r¡ \ÓÆØóŸßr!33³Án•Y@ 33sì†['˜äK×·_ÀY`Àè:âóù´ô•#¬¼ý6p/P çÁŒ3‚Á`ó_½H¡p|¨®®>óâ‹?„48pdžÛXsoÃq°^€ŠŠŠ÷Þ{Ïé¦%²œœœéÓ§[àëm/%[â›}ö·‹­ð÷ÇôôiÓ¦i)Yù4{àr¸ Ú£pàüùÙ½zÍ™3çñÇ_°`AŒScö“¤5Ì?ìaœš×4'0ÆŒãpãÜÁ\úÊüÿ3¡ ¼Ûä ±×¿àfø L…»àK ù&;íWÚoÀÃ0ïúëÿøÇ?:×.ùo>Mnn®ù„4JàÿàèSYyþìÙ;Cïôz½~¿?'''­R8>˜Øæú±§†³ìÒÚÚÌ^z5ÙÂ@ì™Ý‹Oa´ƒ›¤œì´®´á|ø1Tøk> ˆ³ì›&ÀéP “á5èz[,€ãƒù‡€J8©<É5(»ì'ÀNX$eˆ=+]ÿ&Ø gÃñãÆ[µjURe š"áðÀ-°AW ›¤¥¥uëÖÍúçK0 Já8X#CÇc·}a”æ–ãB¾µÓ– ¸ÐRv!Vz…éB0BÑW9/±d.¾øúÏn€õ+I¶lÁ@ ðéé|muºOƒÛ «BÛ^o[+4##cÞ¼yÁ`0z‘"n"P4ÄQ6 #x½Þ À€gõ‡m“ŸŸoÿsz 8òòòöšß(‘UUUuT¯^Õ`ÀÐÐo$¹âþðC#5uÇóøWøý~]ncß6Ø’s`7ðªmˆèÒ¥ ¥_e” Gòd æç³f ‡Êܹ{³8$''gÆ óæÍËÈȰÀÓÐ î‡Wëo ä,àøS7jðþ-·h=,“}ÁNóŽÿz—.ZúÊfVà0€?C{ÊËËc_dfýÛ‚ ^Z¸›oÆãáo〜n—4'--íúë¯ß´i“ßïÏÏÏ_¼xñÕW_ TÀY0ÊáDø±}Uä—®Œl‡:¾ÄãéMêÞÝLñ ù2\š ÿQPP—šº§M›š¯¾rº9IÊš`K…u`Àu’’bÝpìŠ-**2Ï· ¼ úõÓÔo}Òá–úoHŒ+6 8pË–-Àáp;—Á6@+ÅÆ§ð¹á/`¢í /éVŽ'V&‹¹$ÖiaÇ“ZM /¼€ÇÃo~ãtS’¹MáôéӋƯƒ àgõß×WlMMÍ¢E‹F]^^¤À£‹àYÛÛã9#ÙØç†¯¸â k„ƒèlª¦O¬u¯žNe¸h=,€_$dÈ+0Gt:æ˜û î­_ÔQ^^§ÙX梧yyy•••æ‘épl‚+ÂÞ×ÏÉÌ|‚üË_þRZZê÷ûhm¤Ááì¸w§oOø ø•ÖòLžl€±`Óíÿ***ÊÎÎN‡`ÀEõï<ñ8KÚ`·A ì€=0º±»k²T?'ºèE õ€ã‰½ÞÆ\jqr§Nª·ع“çŸ×ø³{˜ toܸ±®`>dÙÞ³¤öÝö°:ÀßB³BvZZöJ8ÎX.}®¼ÈëÒ%É·5«0Ÿ½ì2ª«÷u‡ât‹êǪBX áÎúYÒCÊ·Á/à ¸€6mþw;Æ|¡$íÌù ÆÇï÷””°n8Ý(gI“&•––>ÀŸ¿üòÄââØlä)Ík«.ƒup6<Ï7ý6—³'[ü þ»` lŸÏ÷ØcUTT”””ôîÝû´ÓNKKKs°©€ã–ÇÃèÑüýï,_žœØä,++kcx¤ªê¾‰×®]«ž‡ã$–À-0î7 ØÄÛ\Î\ô´´´4 ÜŸgdÜsÏøñãqe_i:ž~:ÀŠN·ÃÖ çHè ŸÀ†8ÕLTöºMw‡ðX:/³¤æ4Çí·ß>gΜÓO?=³k×G! ^ƒ§|¾^xaÊ”)о²ÔŽc5C‡¶oÛ¶M °â‘GFMš”l·kôrKÃŽ‹ƒÌ„ÁÜÜ\k&8³G«êê^ܲe*,‡âÌÌqãÆ­ZµÊ壵Ö4‡uäZ8‚;î¸ûîOÏ=×Í·‹Rvu\ˆëÓ7¡5÷¾Í‹Ï¢ŽV2ëóR¡ 躤UûáÁ`Ð\ìÞ\9 ~|Þy|צMfè÷åæK7¼î訃=p~·n*ÿKÑ‹qZ/~°u_¸ŒÐj¥ ³ÄnK˜5¦ÀÉ`ÀzÛÝ„xTµmÛ;íÛð[Tsí¥kßjÈ‚M`À\=ê%“èE ÍÇ%kúÓœþ=Ú%Óô§Uc ˜e¿æ#Hvv¶j?\nõ[o½sgŒƒß…ºöÒµOg¤ÂÓÐ^ƒ?…½*²€ã’õ—_ŸÀA0¼þñÄf=¤À™@hø®»îJòªh÷Û°aC Là^d;îX›šfOÒžÃá8v‡½*²€ã’ý/ÿ9Î;žÀ¬›õ0È‚ÃÇ”””8Ø*i ó]÷CX æj÷½{÷v¶aájjj*++Íq~×BL‚ï€øIá7SŽKös–3À—4wë9ÃÜwpiØqq-ëÒ½p<)ð‡?ü¡¸¸ØéÖý}Ó…‘p?—ÃÛ€º’ñ˜3ÌÉÉã‰ãÓ/..6k<<ð5ø`íÃ<ÿ|§Û ÕÕÕÜXZZ=áø'x½ÞuëÖéžè~ÅÅÅãÇß´iS/ø²à6˜ >ŸÏÙETjjjV®\YRRÒ½{÷™3gšI}á]è ÷´oÿŸ©S{öìyØa‡¹¼tJ"+Š‘"JÉ]q!ÞOߪñø÷©§`ÜpƒÓ-Š@ 0¾{w¾ø|¾¢¢"§%-e–áζW’ƒyÅf]_ƒÛcwø X m”öœ¬¢)4ǬmϽӦ=´dÉ’8Ýfu_åää<5~ÉÏÏ·nJ¸ ö€@Ûý*ü’nP¿Ûü%¾½ ’’r)ü¼Ó¶mFc÷ÉDúS’}½H¡!踗““3}útà{xÚƒ5÷›0íf­HnnîÂ… ZQѾ‚Bó‚ÕÕÕN7PZË^ácÀõp6á·ð& @vvveeå‚ ¬zws_,{6uó—DxÖU'X¼{÷_¡=|qꩇ}ñEzØrZöY¢D8ôïßßüŸ%LOŒ²Å7ÙÉ< fY@R¤|'ûò榧`(|ÇÀ:¸¹S'£®.//ÏžÝhs3—DƒGÒ±ð1œ;Ú¶ÝYPÐç…º{½ Ò³•ÿ,Ñ£œ¬›×3°~è±Ý~“M =^iôš9Vá ÃY¤}`<‡Â8ª®îðY³Ì¼E3=Û\äÕ¯EÖ$ª¢4´éô€ùؾ ø}ff¬lŸ |ZÿÖü\\ktæ<Ù\“y¬€cCÇo¸á†æ¿°Á”pUUÕˆž=ï‡`À6˜)¡7û|¾ªª*? q§èE õ€„õؾ{Ü8àîaÃæ±Ý>~OÚ^M˜Ž~r ŸÄ çõz7öï?æA~ ïÂ+0‚æƒ÷ÿ¦„ëêxå•ôßþöõÍ›/†vðô……`U;i:Cb-J=.$æéoÜh´ic¤¥Û·;ݔȨªª2o²¡ 8,tõj¤x·lÙ²æoPæ¯Øz[W¸¶ìNM­2äæŒŒ“ |™Œƒàh86 ftù%FûöuçŸ?cܸF\~~¾Ó‰¸Nô"…ê€N¯^ »ï²reb,e.[˜›››SV–ïAefæ´É“O8ámËïšš¿ÏËËûÙÏ~fÕõVWW›õî[àFȇ<8«}ûcëê þúªÚ·/ß¹ÓüÿNÐÍúvo¿ ìéß}¿~«ûõë6`ÀÑÀ³Ï†ÿÜÄÈ[”¸¥ÀõôwÞ~»ë:Êï÷ƒA§›Á`pcNŽw^œ”4՟׷²LYYYYYY]á<¸ÞkßþÇ´4#Ô36ÿû>?|rñÅkþñû`u¯^½Â—–ôz½š–pÑ‹q¿Pk$ÀnHáÀUãÇ¿ûÍ7Aè™^¯ßïÏÉÉÙûWº\u5YYÔÖRVFÏžN·F"#|[$šÞwÈZñª{÷î3gÎܸq£ýÕ”””î»ww ýs|únEEEÇ{lƒ‚¥=z¤¤¤lÚ´Éü§Ïç{úé§&sB"(z‘"#PË%^¶¶W+‚!0 ãwBó¶{àÒ¥§>õÔîNHQšLb)..ÎÍ͵¢cKáòåËÇŽÛ’ožžž~Þy祥¥ÍŸ??üU¿ßDo»CI Ñ‹šN(VÉì0ΆÂPngœnŽd­Üû"³Ö­;³¸8:ô¾-Rƒ@¾ÔsË+¿«««.\ØÔ«%%%æ*r"ŽPN(Ö©î„ÑжÆíRfJYYY8 jáÁ­[ŸLÐM&’™¹-R£/5Ø;ÁëõúýþH¥J)åJœ¥:à„bÝP¾ƒW¡Œ¯<¾Xú³!ž‡­*ÖL&M-õj/ÆqøálÜÈÿ·wïQQ]÷À¿DyèêrXk£Qš\BÄÜ+|a”6­&­ñFÓÅJʵÒê­h51×­ðV«V¥1_-Æ B¢y4†Ä‰΀0 âæþ1arÂ<@˜aÏ™óýü%{ÎÌüN2³³ÏÙû·±´Ù›Û"vv±õ¢ÏI€(ŽVU}¿«+)›{~t‰:ÇMð¦M›bcc333233ÇŒ³yófÑqÉ—×ÝÙ³|ñê«»wï6ÿˆ‘.¶>»ØzÑç¯ï`ý à®]¢ÎqÓ¼ÿþôôtiKzzúßþö7QñÈWIIÉlÞÜ „Ÿ??ÆŒ¡C‡ž>}Ú¼\¸Máu .\¸ ýsPkùÉ¿´¶¿BN¹çG—¨sÜtÒ€ÊËË¥vVUU5ª²²Òæñ^^^ ¨©© JHHxíµ×†Úî»xü$,ËlçC@"°Ø ™2êV3SJJJ&Ož¬×ë--¯Ë¿³Z[Üa޹·úè’ÇSÜ,è^½zݸqÃÛÛÛÒr÷îݾ}ûÞ¾}ÛæñÏ<óÌÒ¥Kcbb ÃîÝ»ÿøÇ?9Òñ»x|¶ÌvNòR`4÷ËdÖË¢¼€ÀSÀûìïKDäRJœ}_,W§ ´xñbŸW_}õðáÃb£ÎrÍv/`Feîw-×úîï8 ÐÅZ×n2û‘'q‹{À^æ–€€€ÚÚZé1555ýû÷ïà N:õäÉ“÷ûÖYYY÷¾û²L µÜIýÅÛÝ„õ‚_Î ¾jõêÂÂÂÏ>ûŒ•ˆÈ¥²²²lf×½£[$`ëåC‘‘‘eeeÒcÊˡ ÖñìÄ[[xL3fLPPùß¹€T D­®««s¼¦«›µùA ¦-@¿_\²dÉôéÓy“ˆ\-++ËfFpÝ;ºE¶–”””——'mÉË˳Y¼É¦‚‚‚Ç{ÌqÉIIIɘ1c ƒùϳÀy x²®.==Ý<Zl„mÖ–Ìzÿôõ±UóˆˆÈCt²†´‹ÆðððìììÚÚÚÚÚÚ+VDDD466ZFžPXXXYYyçί¿þ:;;;((¨´´´ÝwqÛÓïºúúzëÂaópªõO­Vë>%饥óKðïåËEEDäÂLá¦#`•JU\\|æÌ™ÐÐÐÐÐÐ?þøƒ>èӧ̓333wîÜåçç÷ù矟>øå/»-""˜€•żî¨ØXöãönPRR²fÍëö¯–¤¤ 8¸{"!"‹ XY,ëŽÖMÀTà¡·»”ÑhLII‘núkÖ˜k®xþÒKÝ‘;`VKÕå*`;Ðx Ðt×z$›õ¹¼Ò§O“ & ½-œ‰ˆ<°²øûû˜«.¯š_xyí]·®{f`Ù¼Ðí ,ìÑX{’ˆ”„…8Ç\uÙ¼<©ò¯ôÏFŸ8gžqúY—Ú°y¡û9 OCCµFs¢¦æç7orçA"RŭÑRà2¤¶ÎCt4T*|ý5Zwv ›¥6zè¡áÇKës=| f"%9ÆeHä£FaâD44àp⫚'[I­N§KII`¹n6­GÁÀ×ÀÿI3N †ˆÈ=)zÈ0”•!:ÞÞøâ „†:å%í•ÚØ·oߤI“,—¦ zýôU«o[æ”Hˆˆºˆ#`r™#0kn߯ï~笗´·ªØÜnÞvpÉ’%VV>\r;öt""OÂLÀŠðñÁöí(+sÊëÙ[Uü£öææqGøoàVÇžNDäI˜€  üyhiÁë¯;åõ,«¥Ú®6Þºµ¯NWѳg®ãȈ<”¢o‚òðª«1x0ÿ²paÏÎîQ(]wœ––f)»¡Õjóóóccc¿?´© C†@§ûjÅŠ„wßµ{‘hÜ É%˜€-JJJN'&¾X_ô LMM‹‹ëH&6çÝãÇïÚµË`0˜5ÍöíÛõz½tðÏÉÉÁÒ¥5 ¥¥7oÝj³\Øu§IDt¿˜€]‚ جºº:22²©¦æS XüOëCí.Ìm³ÞWÊî.‡õõˆˆ@M Bb¢“N‚ˆÈ%8 š\¥¤¤døðá5557€ù€ß­:^˜k½ÞWÊî.‡™™¨©A|<³/)°¢µÙž¨Øø›¯Öcìlos  Š>ú7¢gO¼ñF×b'"’7Ö‚V4ë ºx x˜¼×ÚhΣֵÛ]°ÛvAѽ{xá47ã·¿åÆGD¤pLÀŠfAk€%Àv 8|2dˆÍÚÎŽìÚXPô§?áüyDDàµ×œwDD²ÄKЊf3ƒîþô ^€F£‰ŽŽ¶YÛ9::Úz½¯™V«-((øÑ ¬¯¾Âï7¢woçž‘ì(z0gAÆ6ÛèÑ£G@KK) ä©TCþñ½^o¯¶sHHÈŒ3,×±ƒ‚‚fÍšõøã·]Ptïž|ÇŽ!- yy®<'""gr]¦à%hEó÷÷/((fP­V»mÛ6ƒÁpâäÉAo¿ÞЀ¯¾Ê©®¶ùô/¿ürÒ¤I–Ý…-ä]ºÇŽá'?ANŽëN‡ˆHF=äØÌzvÕ÷lڄ矇Ÿß±•+ŸX´Èú‰ݶ(/sæÀǧøõ×Ïùø°àÉ q¸pû~õ+lÝj yúÞ¯¬”>¢Ñh>ýôSu6ÚøøcÄÅ¡©é•þýÿT[ky®ãúDDn‚ Ø%˜€Û×Ô„ädÝS«'ùøn½ÝѢ͈‡N—×·ïœÆFé#vëd¹&`—`îÛ·1cöï7©ÕG—-;çíÝÑkȧNaÊèõµ‘‘/\¸kõxG¯`‰ÃR”$ÀÍ›7wïÞ³~ý_gÏnNNöª«KÈÎ^âë;}êÔö³ïŽ?z=ÿ}0`&OÆâÅ •>ëæÍ›:.##Ã`0 <˜ë€‰ˆ˜€É{wgh<‹aÑ"ܺ½ÁÁöÊ;ÛÜÅÙ—ˆHÑ7AyØgݵµw/™+€‰H.x˜º•³îÚÚ»—|ìØ1'DID$g¼M¶;¶C»,8äè^2‘²1“]~~~Ó§OïÊ+´/™ˆH©}”÷€;ÇîîIV¸˜ˆäŽû“»°9«ÙÞ¾F6÷ÎÏÏgö%"Rô#àŽŽwãââbbbîwVsÇGÌDD!¹p»ÚŒwƒ‚‚ ƒõaÜ׈ˆ</A“F£1%%E:Þµ™}ÁYÍDD÷ ˜ì²¹Š×&é¬f^p&"ê&`²«ƒãZFoþ÷}MÑ""R2VÂ"»ì­Ö ²ü[­VÏŸ?¿gÏžh½d-]t¤ÓéRRRŒF£«C%"’&`²+>>^«Õ¶i4¯âÍÎÎV«Õêêê233‡zúôiž$"ê8&`²Ë^EèÞ½{oܸ±®®ÎÒné–——Û|NÑ""²Æ{ÀäˆÍŠÐû÷ï·9Òmjj²ù",`ÀÑ¡y2Ž€‰”.00ðí·ßž7o^sssssó¼yórrr˜}‰\#`"€çž{.**Êd2}øá‡‘çc&"¨®®?~|}}}qqñƒ>(:"ÏÇLD°hÑ¢qãÆ †O>ùä­·Þ‘çã=`"‘#G.]º4eÊ”¹sçž?þÈ‘#¢#"ò|)Ýõë×cbbŠŠŠ"""\¼x1))©´´4 @thDžŒ#`"¥ËÈÈHMM5g_Æ ›={vFF†Ø¨ˆ<GÀDDDpLDD$0‘LÀDDD0 ÀLDD$0‘ÿÚ6¿ª®¸×IEND®B`‚gsl-2.7.1/doc/images/cheb.png0000644016036000116100000005476013373111455012666 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœìÝw@SWßð !QàXAASÀÑ* NĉÕ*Hµ®J•ÖÑ>Vk¡Vl«b«ØZWEŠuâ¨Pë@‚u†!ÓD1„HÞ?ò¼yò@rs“ðýü¥'çžóK_ÎçÒÄb1ê¥Gu€` €(€ €` €(€ €` €(€ é\PPàïïÏd2™L¦¿¿aa¡‚ÎW®\9r¤‰‰‰……Å‚ ÊÊÊÈ.€ä0ŸÏ÷ööf³Ù‡Ãá°Ùl@ ·sbbâ‡~¸téÒ‚‚‚'OžŒ;væÌ™uuu¤V@ ©ïŽˆˆHKK‹ŽŽ–¶zzz†„„4ïìååµhÑ¢… J[:T[[L^…” wœ$Û/·sjjªŸŸŸlËÔ©ScccI¬€"äpNNŽ›››l‹««ë£G”!;;[ÕEPÜæñx²-Ý»wçr¹r;»»»_¸pA¶åܹs-uÐnb2ÑéôúúzÙ–úúzCCC¹---9RQQQQQqøðáîÝ»·:‹Õÿ@g©&›!÷&,‹•••Åb±¤-¥¥¥C‡-))‘Ûÿúõëß~ûí½{÷D"›Í Y¿~}^^žâYh4r¿…Jh~‘¨P%P¤J B•Ðü"5¿B‚Ì"É=íââ’™™)Û’••åììÜR//¯¤¤$>Ÿ/nÞ¼Ùµk×#FZ!%È `??¿¨¨(Ù–¨¨¨iÓ¦)yøÞ½{—.]JB]#7€—.]zûöí­[·òx<ž’’²dÉi&ÛßÏÏ/==](æåå-_¾ÜÎÎn̘1¤V@ r˜Á`$%%¥¦¦ÚÛÛÛÛÛß¿?11ÑÔÔ´¥þ , 433›2eг³sdd$©åPE .€·ª“_ÆWT¨(R%P¡Jh~‘š_!¡½7a€\`5 ¥º„V B•@‘* UBó‹Ôü I¥ËÿViÅI ÐF8  SÀ@P @0À@P @0À@P @0À@P @0À@P @0À@P @0À@P @0À@P ÿuùòåúúzª«èhb±˜ê:ŠFÓ…o@9‘HäêêÚ³gϸ¸8cccªËÐäE VÀð=*..NKKËÈÈ ºݧ kG¬€T%%%¥_¿~VVVT )È‹]ˆ.0§ t é\PPàïïÏd2™L¦¿¿aaaK=###ß}÷ÝnݺuíÚ•ÍfGFF666’]!€ú‘À|>ßÛÛ›Ífs8‡Ãf³}||ÜΟþùÑ£G#"" #""~ÿý÷Ï?ÿœÔ :³ÆÆÆÅ‹:tH$Q] @§CîÕÓˆˆˆ´´´èèhiK`` §§gHHHóÎL&3++ËÁÁAÚòâÅ WWתª*ųà0@ûܸqÃËËkÀ€?¦º ¥­×€‚‚‚d[‚‚‚âããåv–ûÜ¡‰‰ )•A899EFF®_¿žêB:#r8''ÇÍÍM¶ÅÕÕõÑ£Gr;úé§~øáßÿýöíÛ·oßÞ¸qcΜ9«V­"µB€ÎÌÆÆ&88xáÂ…Í?züø±¯¯ïÌ™3Õ^@gAîÉ[CCÃêêj:.m …fffuuuÍ;‹ÅâY³fÅÅÅI[f̘qæÌ¦xœ‚P9gkkÛÐÐÀår™L&ÕåPF[OA·ÉöíÛ}>þøã¼¼<ų` $ÑÖ°‹‹Kff¦lKVV–³³³ÜÎÅÅÅîîî²-îîîÅÅÅ$Ö@rØÏÏ/**J¶%**jÚ´ir;÷îÝ;--M¶åÞ½{½zõ"±>Š:úÒ¥KÝÜܶnݺbÅ ‚ öîÝ›’’²oß>iÙ¥ýçŸþÑGíÞ½{Ô¨Qb±øúõë«V­ÂÐ\uuujjjZZZvv6‡Ã)**’ìšgffÖ䬀Æ"ýêé‹/V¯^˜˜H„Ï®]»ìííÿ;ýÿž[?yòäÎ;%{ 0`Íš5sæÌiu \h«üüüéÓ§3æçŸ¦º–¶©ªªš7o^rrrMMMóO™Læ›7oÔ_è0ò"†Ü0A±±±-}Úä[}ðÁ|ðÙ%À?ÿüóðáCÙ$µ“ÉìÙ³gMM¹¹ùÈ‘#‡ âììÜ»wo[[[¦§§AOv(¦ kG¬€ÚªººúÑ£Gúúúl6[qO±XüðáCkkkõÔÖª´´´êêê‘#Gth QUUÅ`0H}Ît€¶Þ šÉÔÔÔÃãÕô%â“O>qss“ÝÑrï¾ûîèÑ£;˜¾AlÚ´ÉÃÃãôéÓxëP ŠŒ1ÂÞÞÞÈȈêBTL(^¸p!--möìÙC† 9qâN¤šéÂÉ[œ‚ H$ÒÕ «yyy»víÚ¿mm-AžžžáááãÆ£º.Ð,äEŒ.DÚ­´´tëÖ­¿ýö[]]F›2eʶmÛHu] )ÀŠ €´Úƒ”¹Mª¼¼¼ÐÐИ˜‘Hd``šš:dÈjK V  ½Ž=ºxñ⪪*.—«§§gccCa1÷ïß_·nN¿rå …e€FA+‚ÐR/_¾4hÇûþûï:dooöìYj«âp8²ûA'‡Ç@e–,YÒ¿ÿ‹/R]agg÷ôéÓððð}ûö={ö¬¬¬L !‹9²hÑ"JªBú‚z¾hšœœœÜÜ\Êš"‘èðáÃ/^¼x÷Ýw¯\¹bnnNÄÓ§O?ýôÓêêj???ªk ….œ¼Å)h€6ÅÅŽ{÷VþéÞŠŠŠøøx}}}Õ®Jß¼yãåå•™™éââò÷ßKÒWâÀ¯_¿^³f:‚zñâ…ƒƒƒÚ¦­€kÀŠ €Èv÷îÝáÇ÷ïßÿÙ³gª³¾¾~Ò¤IÉÉÉŽŽŽ7oÞ¤|«K±Xlii°mÛ6cccj‹ÍkÀ@¥wß}wþüùŸþ¹ -[¶,99ÙÚÚúÂ… jNß‚‚‚æGår¹ñññ¯^½RO………ê™KͲ³³£££¿úê«™3g8°k×®=¢º(Í#Ö~ºñ-:•;vaddtóæM5O½ÿ~##£øøøæ]¼x144TÉqOŸ>-‰Ú]Ipp0Nß¶m[»GP ±±1==ýÙ³gd .×£G¶oßîëë+{)AjãÆÊ½|ùò“'Or¹\ò Vyƒ›°@­Î;§¯¯okkkkk»cÇŽ÷Þ{OÍþ¼y»H$ºråÊ›7o:XŒ\±±±FFF!!!d .‹kkk @Ä¥K—$-åååÞÞÞaaa×®]ãóùÊ•——,ý«H$:vìØ¢E‹dwe111™?þÕ«WåríÚ5__ßñãÇ?xð@™Iâ·nÝzðàäaÊÊJ忎òt!ºÀÚ¢¶¶6$$ÄÉÉ©ªªªMŠD¢Ç“TU»=xðÀÝÝ]’žžžiiiÍû>|˜ ˆÞ½{¿}ûVµUWW¿~ýšÔ)~ùå—7–——wd.—kaaAÄ“'Oš|ÔØØxýúõÏ>û¬GÒ$7nœÜq***‚èÛ·¯2"##§OŸ®¸Ï|Э[7RWªº]`åÕÕÕQ]B›½~ýzèÐ¡æææüYß>B¡PÁ§ ;vì055%ÂÀÀ`ݺuMV´ÕÕÕÞÞÞQQQ$—ÙÛ¶mûᇨ®â¿>ýôSû÷ï·ÔA(^ºtiîÜ¹ÆÆÆ'Ožl©Ï®]»þúë¯V§KOO—<Û–’’ÒRŸ‚‚Éé +++‚ Š‹‹•ù"m¥ ðà1$åY[[×ÕÕmÛ¶M²ìÐ[¶lyùòågŸ}&9í©6<ï»ï¾[±b…£££‚n|ðàA,+""ÂÀà¿w؈Åb¦ü¤uuuä½€977wÆ zzzÛ¶mëÕ«W«ý…B¡$ŠÈÃãñ˜L¦¾¾~“ö’’’C‡­\¹²k×®’>Ÿ¯§§×¥K—Θ––öâÅ Å{¼$''¿}û6###;;;&&fÞ¼yœ´9]ˆ.0€’Äb±®¾Ü€GŽ‘žè¥Ñh#GŽüüóÏ8påÊ•þù§ºººI.—;yòä[·n5 ¬@ITðÞ½{étúÖ­[U8fGö€ì êêê’’’æíB¡ÐËËkòäÉ555*ŸôáÇýúõ“ݰBµ&OžL£ÑfΜIÒøb±¸ªªêÞ½{ä/«¾¾þâŋ˗/—}†XJîF¤-!/b°%îùóç4MUoú‹Å±±±¿þúëùóçÉ~BF®7nøûû/_¾|ûöí²÷DDD¸¸¸HÏå*PTTô¯ýkÁ‚&LPæf¢mÛ¶åææ¦¦¦ŠÛøP“’.\¸P\\\__¯ò‘¥ †‡‡yãË¢Óé’EÅbñÓ§O¯_¿ž‘‘ñâÅ‹‚‚‚ššÉsÛ”Ó…û‡q4€’Äb±žžF“,…Õ©°°Åb)“L­âr¹ƒ *))ùùçŸW­ZÕñÛjÒ¤I—.] k÷ [¶lÙ´iA½zõ š={ö!Cô////**2118p`»'…vÀû€A(©¢¢ÂÚÚZ=\^^¾zõê/¾øBq®´OrròÕ«WIzÍ@«N:õÎ;ïtä«Ý¹sg÷îÝqqq555’–þýûûùùM˜0áý÷ßïøEׯ_÷ððxçw:8T'‡V   ±Xlll\__¯ž Ù½{÷¨Q£nܸAö\;wîüý÷ßSSS;¾Y’zp¹Ü“'Ož>}:))©±±QÒÈd2³³³•yèVª±±‘ÃáüóÏ??~ðàÁíÛ·_¼xAÄ/^LFå‰CÒµeuÒo@6'Ù\^%7aUTTœ?¾¥OsrrètºAzzzÇçRRUU•äcXX˜Ú&U•ŠŠŠÌ™3§{÷î~ø¡ò8p ÿþr÷E8p Üçj MÈ‹]X;b  $‘H¤¯¯¯§§']lµÏ›7oX,F+..–»§´ŸŸßùóç—-[¶oß¾ŽLÔVQQQ\.wÕªUÍ÷NÒ"‘èÕ«W’w(£¾¾ÞÜÜ\ õéÓÇÕÕuÀ€Æ swwg±X¤–ÚIà´"`%©*€ ‚ðõõÕ×׈ˆèß¿“®\¹2aÂ33³ÜÜ\kkëN­ÊÌÌìÚµkÏž=•ÙºÚ ¬@I* `q ÈÅb6›‘‘ñÃ?¬]»‘ÚŽ¼ˆÁ{Q =Zz5:::##£gÏžƒf±XëÖ­SsaÚ *# %ÆnÞ¼9%%…Çãi×[‡Ô g‡@e:”——7pàÀÀÀ@:>dȪ‹ÐPºpõ×€”¤ÂkÀr …Â#GŽôèÑcòäÉdŒ ~¸ K0€2 ÍÍÍ y  {ptˆX,îׯ“É$c𺺺Y³fmݺU 1>€N"=€ üýý™L&“Éô÷÷/,,l©'M•lÝUUU666¶¶¶d {äÈ‘ªª*2ÆÐIäÞ„Åçó½½½-ZtàÀ‚ öîÝëãã“‘‘!w›Öækü]»v¥¦¦’Z!@'ѵkׂ‚‚ÆÆF2Ì]¼xqCCCMMÊÐUä^=ˆˆHKK‹ŽŽ–¶zzz†„„´z¬H$rttüóÏ?[}$®(IÀúúú T× ´õpBBBPPlKPPP||¼2Çž;wŽÅb©ííÍêDnçä丹¹É¶¸ºº>zôH™cwíÚõÙgŸ‘SÅÈ=ykhhX]]M§Ó¥-B¡ÐÌ̬®®Nñ>œ2eJ^^ž2׫p @I8 ÐVÚz ºÝ~úé§àà`l㺊Ü677çr¹²-¯^½juoØÊÊÊØØØeË–)?‘ÜG˜${Ò´*,,Ln”7#¹ìââ’™™)Û’••åìì¬ø¨}ûöÍž=»M{¸‹åAHåææ–””`,€–„……Éòf$7€ýüü¢¢¢d[¢¢¢¦M›¦à¡PøË/¿àö+Õ?~¼‡Ã¡ºørxéÒ¥·oßÞºu+Çãñxááá)))K–,‘vh¾º?uꔳ³s««dhkkkkkkKKKª €ÿ 7€ FRRRjjª½½½½½ýýû÷MMMòÓO?aù  r)))eee CU~óÍ7111Øü Ýtá<† ¤††:n``  ;2NII‰ƒƒƒH$zôè‘£££ªÊÐ@î1$Ðd»wﮯ¯÷óóCú´›.¬±P’JVÀÀÁÁ¡¢¢âæÍ›ï½÷ž ËÐ@X€¦ˆ‰‰©¨¨pwwGútÚfÏž=A¬\¹’êB´›.œ¼Å)h%uütRR’¥¥eQQ‘‘‘‘jËÐ@8 í—••õìÙ³Þù,ñ믿ñÉ'Ÿ }:HÖŽX(æååuãÆäää÷ß¿#+àââb==½ÜÜÜž={ª¼N D^ÄàuCºÏÎÎÎÑÑÑÆÆ¦ƒãTUU=º[·nH_€ŽÓ…µ#VÀJ …††† ©K—.*¬ @“á0¨Lß°†ôP 0À@P @0ð0€ŽËËË{óæƒƒƒ¹¹9ÕµÀa  ã~ùå6›}àÀª €ÿÐq,kÈ!öööTÿCöÂNXJª¯¯722¢ÓéõõõT× °¨Lw•@P @<†òýúë¯%%%ŽŽŽT× ƒÀ ßž={rrr<<<ÀdÀ)hãÎ;999ÖÖÖ'N¤ºÝ„Ðe\.÷Æyyym=ðÈ‘#AÑétê0€Nûû�¼¼V¯^ݦ£êêêNœ8ADPP9u@§uéÒeÔ¨QC† iÓQgΜáñxC‡‡öððXºt©ÚªÐLaaar£„¼ÉÝŠÒÅÅ%33s„ Ò–¬¬,ggç–:“Z @gÙjÉÓöÓ§O'¿ø䮀ýüü¢¢¢d[¢¢¢¦M›&·óÌ™3/\¸ ÛrîÜ9ëèdšü:ÿøñ㌌ &“9qâDªJè´È]/]ºÔÍÍmëÖ­+V¬ bïÞ½)))ûöí“v}¾jñâÅ>>>Aøúúqîܹ/¾øâäÉ“¤VÐ I/kIþÿš5k–‘‘¥tF䮀 FRRRjjª½½½½½ýýû÷MMMåv666>uêÔåË—œœzöìùÛo¿?~|ìØ±¤VЙÅÄÄ1{ölª èŒta)ì„ ¤ššš.]º˜˜˜‚œœœAƒYZZ–––êëëS]€†ÒÖ°@cI–¿Ó§OGúP ЉÅâÓ§O1oÞ<ªkè¤Àº)'''..®¥]8222žƒÁÀ)håá4´ÇóçÏ-,,† bnn.mÄNXš  Ë† VPPŸŸOu!ОÐqÆÆÆ¤º h  @0ÀºæöíÛ|üø1Õ…€"`]süøñ%K–\¾|™êB@0€®6lØÇŸïííÍf³9‡Ãa³Ù>>>@Á!âÿEjyT!÷žˆˆˆ´´´èèhiK`` §§gHHˆüjÚu·7CúçŸÎ;÷Î;ïL:µù§oß¾e2™ £ªªJýµh#m} )!!!((H¶%(((>>žÔI:³;w~ùå—k×®¥ºh¹œ““ãææ&ÛâêêúèÑ#‡ØØØÐét[[Û€€lf ÐV÷ïß'bøðáT­ 7€y<ž………lK÷îݹ\nKý§M›vòäÉ·oߦ¦¦zxxxyyeddZ!€.)((ÈÈÈ033‹ŒŒ¤ºh…f=†?jÔ(ccãž={~þùçaaaëׯWæÀæ·OÓh´°°0’ëÐ, AL˜0Á`P] €– “%äÍHîíK,+++‹ÅbI[JKK‡ZRR¢ÌáeeeýúõãóùŠ»á&, ooïäääèè耀¹ªªªºv튛°”§­7a¹¸¸dffʶdee9;;+y8b@y•••7oÞ400ðõõUÜOØhrØÏÏ/**J¶%**jÚ´iJ~âĉ÷Þ{„ºtйsç„B¡¹¹9Õµ@ëÈ à¥K—Þ¾}{ëÖ­<Çã…‡‡§¤¤,Y²DÚAö7qŸS§N•–– …Âüüü­[·~÷Ýwßÿ=©茸¸8‚ ”ÿ¨En3Œ¤¤¤ÔÔT{{{{{ûû÷ï'&&šššÊí¼qãÆ˜˜˜AƒuéÒeÔ¨Q?¾yó&›Í&µBÝ .]º¤§§7sæLªk¥èÂíK¸ àÕ«Waaa¾¾¾"‘( €Éd6ï&¹ ‹Éd¾yóFýEh#ò"F¢  %yÔ¾¬¬ÌÚÚºù§`€¶"/b È(!‹—/_^UUeeeEu-Ð ]X;b  $¬€ÚJ[Ÿ¹ÀÎh0@§ƒ°4€` €(€ç€tÇ™3gòòò¦N:`Àªk€V €tG\\ÜÑ£G­­­Àš  ;¦M›fccãêêJu!Ð:]ØC ;a(éÍ›7ݺuëÚµëëׯ©®@;`',‚ÐJ•••.\¨¯¯oÓQ8W 9ÀZ)>>~Ê”)þþþí8;ah0€VŠ‹‹#ÂÏÏêB táö%Ü„ ŸÏ·´´lhh(,,´µµUþÀׯ_›››wëÖÇã‘W€.ÁMXð_.\¨««6lX›Ò4 @ûœ9s† ˆ9sæÈ6>þ<44ôäÉ“mƒÐ2555—.]"š]~øðáæÍ›;FQ]Ð6Ø @Ë$''¿~ýzèСýúõ“mwrr 8p U…@› €´Ì©S§‚˜6mZ“v**€öÀ)hm"‰ÎŸ?OÄ|@u-Ð!XhvòäÉäääö-vñÀ€æÐ…'hñ0€’x<ž………¹¹9—Ë¥ºí€ç€t €` €tĦM›ÂÃÃÛú‚B Š.ܾ„›°D"N'B(êéµø‹5nÂh+ò"!è‚ÆÆÆ~ø¡¦¦FAú€FÑ…µ#VÀJ  ­ð€NAt"8W 9ÀF£º@P @0À­  `úôégΜQÜíðáÃëׯÏÉÉQOUÐq¤pAA¿¿?“Éd2™þþþ………ÊUZZêèèˆ[EΞ=£¸[\\Ü?þøüùsõTGnóù|ooo6›Íáp8›ÍöññŠ‹Å}ôÑæÍ›I­ @+?~œ ˆ3f(î¶dÉ’­[·4H-E€ »‡TDDDZZZtt´´%00ÐÓÓ3$$DÁQ;wîÌÈÈˆŠŠRrÿ섺ª¼¼ÜÎÎÎÀÀ ²²ÒÌ̬ãr¹ÜîÝ»[XX¼zõªã£tÚºVBBBPPlKPPP||¼‚C222öïßIjaZáĉãÆSIú€F!7€srrÜÜÜd[\]]=zÔRÿššš   Ã‡3 R Ð ±±±AÌ;WUâ\€æ ÷ä­¡¡auuµä-iB¡ÐÌ̬®®Nnÿ+VØÙÙmÚ´é?Åá4tbeeevvv†††ÅÅÅ*óÕ«W–––Ý»w¯¬¬TÉ€:O[OA·I|||NNΆ Úq,Mž°°0U× >qqq"‘ÈÇÇGUé „……Éòf$÷}À’·ž±X,iË«W¯Zúi²víÚÄÄD}}ývL„0èž“'O1gΪ èÂÂÂä.ÛÈË`rWÀ...™™™²-YYYÎÎÎr;çææ:884ù½ƒì_@4S]]]aa!NŸ:u*Õµ)È `??¿¨¨(Ù–¨¨¨iÓ¦Éí,nFÚHj‘ÈÈÈèÉ“'ÙÙÙæææ­v¾wïÞªU«Ž;¦†Â@UÈ à¥K—Þ¾}{ëÖ­<Çã…‡‡§¤¤,Y²DÚ«[œœœ”é–‘‘±gÏžääd²ë"7€ FRRRjjª½½½½½ýýû÷MMMI ³1bÄÏ?ÿüá‡R]´.<ÀƒÇ”„ÇÚªS<†Ðy €(€èDp±@s €:<}  À@P  Ýø|þ¢E‹6nÜHu!Ð6`íVQQñûï¿ÿñÇTmCîÛ€l–––ÑÑÑ€êB mta)ì„ ¤ÊÊJ+++KKËŠŠ ªkÐØ @ǽ~ýº¦¦†ê*@}Àá‡~°¶¶>xð Õ…€š €¨'‹Oœ8ÁçóÉžˆÔñ@y`êýý÷ßùùùvvvï¿ÿ¾¦ÃNXš @½'N¨§‡ÿ%: üß@±†††cÇŽ1oÞ<ªkõAPìÒ¥K\.×ÙÙyÈ!í8|Ù²e+W®är¹*/ H… Xtt4Aí;<...22²±±Q¥Eé°•Þ¾}{öìY¢çŸ÷íÛW^^nnn®Òº€t`*ÅÇÇ ‚Q£F988´o„™3gª´"P0•<==×­[7pà@ª uÓ…]”±4€’***¬­­­¬¬ÊËË©®@;`/hPüª  9ÀvÂÐ` €(€ÐbwîÜ¡ºh30€»~ýzLLLYYÕ…@›á9`-¶aÆ>øÀÃÃêB Ítá Z<  ¤òòr‹emmE3€’ð0€NAP Љàb €æ@t:Ø @ €(€PŸ˜˜˜iÓ¦]½z•êB€z`õÙ³gOBB‡ÃQÉh±±±Ó¦M;zô¨JF5C¨IvvvJJ ƒÁ˜7ožJÌÊÊJHHxþü¹JF5ÃNXjrèÐ!±Xzô¨Õß¼ysãÆ¹sç®X±‚´êÔdß¾}A,Z´ÈÌÌŒêZ;ahrï‚æñx²-Ý»wçr¹ ‘ýÑ0~üø°°0’jPÉ¥ßåË—S]h{X,‹Åâ²²²˜˜˜œœœððpª+è¨Å‹ß½{×ÅÅ…êB@ƒÀæææMÖ»¯^½j²&–ËÚÚzÞ¼yÑÑÑPf"š 4¹+à¥K—Þ¾}{ëÖ­<Çã…‡‡K¶»’v]ÝOœ81>>¾¼¼\(>|xñâÅßÿ=©h)‹5fÌWWWª €v"7€ FRRRjjª½½½½½ýýû÷MMMåv^¿~}TT”³³s—.]<<<Ο?úôéÉ“'“Z!%ta)ì„¥¾¾~ûöí«W¯VÕKT¨´´ÔÖÖÖÆÆ¦¤¤„êZ´ƒ¶î„ÐÙðùü©S§~ýõ×< ºÐh`U …½zõ²²²ª¨¨ º9p®@sèÂÉ[œ‚" ûöíKu!r”””ØÙÙÙÚÚ¾|ù’êZ´NACGÕÖÖ^¾|yýúõ£FêÚµk“ç³A…ètºf¦/h°Ž‹ÅÉÉÉ‹-²±±™8qâ?þxóæÍªªªëׯ+?H«o„„V=}úôÖ­[ª-==Íf¯^½ZU€ú‘»P¨¡¡áàÁƒ?ýôÓ?ÿü#iéÚµë¸qã¼¼¼FŒ1hÐ å‡òññ±²²Z»víøñãñ"vHNNž0aÂàÁƒUugVaaazzz=T2P¬³ÊËË¿ûî»ââb##£)S¦,X°`Ò¤IÆÆÆmçÆb±øòåËÆ Û¼y³ìÖfÐDQQ‘……E“<=={÷î=xðàêêê–žƒo“I“&=xð@(v|( Š.ܾ¤Ìòââb¡Phggghh¨žª4Áºu댌Œ‚ƒƒ;¸TJOOß¹sçñãÇ%?ñ}}}wìØ]Båš5kVJJÊ©S§FŽ)ÛÞÐÐ``@ýﻸ  ­È» K÷˜Çã 4HòãÆÈÈhĈK—.3gŽ&ü4Ô.¹¹¹aaa111"‘ÈÈÈhÍš5ß|óM;–ÔºçßÿþwFFÆêÕ«MLL dhh˜——gggGu]r €Ú wA·Ÿ¹¹¹¿¿¿±±±‰‰I]]ݵk×ÜÝÝïÞ½KuiZ¦_¿~G}ðà——W]]Ý÷ß?|øpm9 ÷øñc2F‰D‘‘‘üñGYYÙwß}'‹?þøcÍL_Ð(ºÀA¬_¿¾²²’Ï秦¦®^½šÁ`dffŽ=zÇŽT—¦}ÜÜÜ’““=jeeµdÉ:NuE­«­­Ý¾}û°aÃÚtï·’ôôôÎ;·yóæÞ½{Ÿ:uŠN§ÿë_ÿRù, {:ÅiXérÄÝÝÝÝÝ}õêÕ«W¯>}úôºuëètzHHµåi8iÒ¤††ªkiª±±Q 0 ÙF.—K§Ó---{õêEƤ...... K—.µ··'c•ÐKN:C÷¯·ä·ß~;{öìÉ“'MLLȨ d]¼xñرcžžž+W®$u¢+Vðx¼˜˜=½ÿ9»#‰^¿~MÞÛs?~ÒÓÓ#õÝõ¡¡¡ .ÔäôÒyX{9rääÉ“$ ÎårÉöã?þꫯŒŒŒÈ_‚Ífggg=zTͯ©ÏÌÌ88xáÂ…«W¯.**êÈ8kÖ¬‘;ÂŒ3¾øâ‹ÆÆÆ”)Gß¾}###§OŸÞä̰Ê9::Î;—Ô)š»|ù2F[±bE«×˜»uëváÂ…+W®´{º¢¢¢gÏžiæÛ–  ÄÚ¯ÕoqæÌ&“ùÛo¿©¡˜… 1sæL‘HÔ‘qA\\œlKIIÉûï¿/ù·6þüÆÆÆv>}út‚ 6lØÐ¤===]OON§ß¹s§Ýƒ·I}}ýüùóoݺ¥žéÈ“““SYY©LÏ¿þúëÉ“'™«¶¶öÉ“'ÏŸ?oDZ’K¿vvv) S!/(µ~|èÐ!‚ |x»o“]»vÅÄÄ,X° ¾¾^=3JUTT<|ø°Ý‡¿yóæË/¿,--•üÕÙÙ¹{÷îÊ8qâD''§vÏK„‘‘‘““S¿~ý:2P¤`W›]»váççwçÎ‹ÎØØØúúzÅC]¸pF£Ñéôœœœv×ÓØØXWW×îÃ% Æ׫W/É&̇’ì-ìêêúìÙ³ÐÐÐüüüNÁår;8BK*++###•<P__ðèÑ#’ŠiÉíÛ·ÍÌÌœÚ7ÂîÝ» ‚?~¼j #VÀmE^PjýcHÖÖÖl6ûÁƒ#FŒh¾ªk“¢¢¢ªª*gggÙF@pãÆ wwwKKËŽ ~ûöíaÆéëë+Ó¹¡¡¡¶¶ÖÔÔ499955• ˆwÞygòäÉš¿—uLLLaa¡³³óÔ©S ‚¨®®~úôéСC©®ë4668pÀÒÒròäÉM^œ ¤âââÌÌLGGGGGG•—G>Ÿ‰Ç”‡½ Á òÚ  <òXGvÂúá‡^¾|ikk+ cgff¦ª]…BáþýûçÎÛü"ŸH$RòZìË—/÷ïßïëëëáá¡üÔb±xÇŽS¦L8p`*V5±Xܦßr¥ }É#: l6Ûßß_ÉJúã?>|èææ6oÞ<«óÌĮ̀.´ÿ°X,&¢¨¨ˆF£ 8P$íÙ³ÇÚÚú›o¾Q|Ttttttt«÷K.Oʽ¢×·o߬¬,%ëlß…[@ L·Ç˽öÌáp6nÜØî+b±X$-Y²¤Õž \ºtIò\___%¿Ž’Þ¾}ëææVQQ¡Â1d‘”:À’;b¦OŸ.‹/]ºDÄ'Ÿ|¢àS§Néé饥¥)èVYYÙ«W¯5kÖÈ à?þ˜ ˆ… v¤øÔÔÔ¹sç®^½º#ƒ<}úÔÆÆæÝwßmEB¡PòÖÞ5kÖ´{ðÛ·oëé陚šväί»wïJÎŒ9²Õû¿ªªª”ˆ«Õ{ë4Vaaá›7o¨®ZV„ ˆ)S¦%iÙ±c‡äþá–ˆD¢¯¿þúÝwßUcÆŒæEÆÇÇ>¼¸¸¸#E9r¤¥§¨«ªª”ŒÀGIö©pww///o©[JJÊ Aƒ¾þúëvÖª%–-[&ùű­>|ØÒÒrãÆdTÍ!€!¢K—.4íåË—*<..NòèíìÙ³U{úTâÍ›7‹-º~ýzÇyñâÅÍ›7›· …ÂþŠÐ’ººº 6XZZ*ÿÑ‹/$[%0€ÃáÈísöìY===77··oߪ®X³oß> ‹ÿûßm=póæÍ„¼MT€$`E$³=<ŸïííÍf³9Žäe>>>@ng//¯ŠŠŠ¸¸¸’’’Ý»w‡……8p€Ôò@󹸸ܽ{÷ÓO?‰DC† INN¦º(Ð,Ÿ~úé Aƒš´4håÊ•’¿Òh´šššU«V±X,érPv]˜™™9aÂSSSKKËO>ùD 4ïF£Ñ·lÙâàà`ddäää´gÏÙI‹‹‹W®\É`0úôéóå—_ÖÖÖ*.žF£‰D"===¹%ÉvS²‡óÑGÙÚÚ¹¹¹?~\z8íÿ5Ÿ(!!aøðᦦ¦¦¦¦Ã‡?þ¼ìÔŠg„ö#)Ø%vîÜ ÛðÓO?Éí¼nÝ:Ù_333ûõë§Ì,d ÐgΜ‘<~óþûïãUT ËÉÉ);;[îG>trr’ü™ ˆE‹ÅÄÄȾÑYúÓãÉ“'ÖÖÖ{öì)-----ݽ{·dÓÙ&Ý‚X¶lÙ† ž={Æçó¯]»Ö·oß?ÿüS: ½½ý¡C‡Þ¾}›ŸŸ?gΜõë×7¡¹&Éí©dÇÎÎîÛo¿ÍËË«­­½}ûöŒ3ZVÚrçÎ ‹?þø£¼¼¼¬¬ìèÑ£æææ÷îÝSò+ë<ò"†Üx¼½½×¯_/û$ÉåË—üñÇÄÄÄVæææuuu­öÄcHDyyùúõëg̘1mÚ4ªkQ±ýë_7nÜHJJ211‘ÛáÍ›7ùùù...t:]͵i>'÷Y5½â-÷IDAT55Ý»w—œu£Ñh;wî\½zµléO€€€Áƒ¯_¿^úÑ–-[6mÚ$ùTÚF£mÚ´ióæÍÒn.\ؼysJJJóÙy<ž»»{nn.¡ðÇT“äöT²€E‹ÙÙÙ…‡‡·:‹lËÌ™3Ç,ýhÏž=ÉÉɧOŸnëW–ºvíÚµk×tP³1cÆŒ3¦}Ç’1$»„µµuii©lKII‰2Çž:uŠÍf+Ó“ìo@6‚ ZêðçŸ1uêTuV¥-Œkjjä~$LLL$&"??¿IéO‹•——'û‘$8›t#"77W¶—Ë577—ü¹¦¦æÛo¿0`€ô)}}ýG´q¬ [[Û§OŸ*3‹lKïÞ½›ÜÃápìíí•™±%¡¡¡¤$V{…††*.X‚´ˆ!÷Bgaa!ÛÒ½{w.—Ûê\.wãÆû÷ï'­4褒’’^¿~­üþSj°uëV==½#F(è3`À€¡C‡ª­$-Ò»wïÜÜ\ÉÍzMäææöêÕKú×=z´4Hee¥­­­lK“¿J988ÈþÕÜÜœÇãIþ¼~ýúÇ;vÌÉÉÉÔÔ´¶¶¶¥SmÒäQxTTTôìÙ³­ã—••5y3‹Å*--UfÆ–´{¹IM«ç?H v :^__/ÛR__ohh¨ø¨ÒÒÒÑ£G'%%)9KK_­#¿ò€Îhhh(**ºuëÖ¯¿þº`ÁÉû+Gމ É:cÅŠß~û­Ü‚ƒƒ%–ûãŽhû XÁ vvv………ÒöœœÅÊý¨[·n<O¶åùóçJ`cc£’pAAì X™Ñt€‚U;I3jÜ)袢"77·«W¯*?‹Nþ§7gι›F™˜˜Ì™3§¼¼œêA5žŸOui b111ÖÖÖ?ýôSaaa}}}QQÑÏ?ÿlmm#í£8HžvìXÿþýoܸQ]]ýüùóõë×/[¶LɤwAççç×ÖÖÞ¹sGz´‹‹Kll¬ì‰éQ·nÝ277—Ü]^^þÇXXXܽ{W™;m à;v4 i×®]r;—•• <øüùóm¥Sý§mÂãñ°wG'‘žž>wî\:Îb±æÎûàÁÙ­Izzú¸qãLLL,,,–-[V^^nddÔ¤›âA^½z`aaÑ­[·E‹½}û¶,‹wïÞíèèH§Ó{õêõí·ß644(Y€X,ÎÏϰ²²¢ÓéC† ‘î±uñâEGGG}}}¹CÅÆÆzxx˜˜˜˜˜˜xxxÄÇÇ+(Oñ×Ñ=ä}Yràyûö­››Û’%KV¬XAÄÞ½{>œ™™ijj*é {{7›ÍþòË/?üðö΂Ç@å®\¹òÅ_dddP]PL[߆Ä`0’’’RSSííííííïß¿Ÿ˜˜(Mß&ÒÓÓçÍ›Gû_¯_¿&µB‰3füý÷ßUUU•••gΜY¼xq“‡†TKÖŽXƒÎàóù7oÞœ4iÕ…tF§OŸÞ¹sçÇ ´jÕªÀÀ@ª‹ê‘1º]`Ð ½zõ*--½wïždk‚ """ètú¼yóºwïNmyyƒ7{h ƒ¹s禧§Kÿo›7o~ýúµ——@ÇèÂÚ+`ÐB¡Pv·g¡PxæÌ™\¹r…ª:3œ‚V º­¡¡AîŽ" Úz4tÒWó=xð 88¸[·nrßæ[PPàïïÏd2™L¦¿¿aa¡‚¡äŽ@6J&0@G-X°ÀÚÚúÖ­[Í?âóùÞÞÞl6›Ãáp86›íãã#yC"äëÜtáä-NA€†hþã("""---::ZÚèéé"·?%?ÐðSTœ‚ÐJ AAA²-AAAñññÄÿ/¥ûI;466nÙ²ÅÁÁÁÈÈÈÉÉiÏž=ŠÇ>|¸©©©©©éðáÃÏŸ?/ýˆF£ÕÔÔ¬ZµŠÅbÉŽŸ=yòdSSSKKË+VH—ãׯ_÷ôô466vpp8xð`«£A»!€H”““ãææ&ÛâêêúèÑ#‚ šì3,í\SSsõêU.—»ÿþˆˆˆãÇË<%%eáÂ…!!!/^¼ÈÏÏ_¹rå‚ RSS¥>ýôÓ‘#G>{öL:~nnî¸qã&Mš”›››íää´dÉiÿ'OžÌž={õêÕååå'Nœ¿v횂Ѡ#tá´Nž€†hþãÈÐаºººÉÓefffuuurûÓh´M›6mÞ¼YÚráÂ…Í›7§¤¤4ŸnæÌ™ãÇ–¶ìÙ³'99ùôéÓ’¡vîÜÙdCÍ 899mÚ´IÚºyófIAAAnnnk×®•|ÿÛo¿IVÕrGkɵk×d“»‰1cÆŒ3F™qÈ­­HŒ’^ò Nºñ-@4ÿqD§Óëëëe[êëë [êODnn®l —Ë577—;]ïÞ½ d[8޽½½t¨üüü&‡°X¬&ã?þ\ZF¿~ý¤oP–LÝ£G£µDÁËí ‚ Ur2Fk+ò"7ÈÜÜœËå²X,iË«W¯,,,âààÐd'·gYY™µµµl ‹Å*--•þµGM©¬¬´³³“m‘ýkaa¡“““ì§zzÿ½RÙ|´–(^’¶uÁªÚÑ4€D...™™™&L¶dee9;;+8D6óc±Xååå½zõ’¶”——ÛØØHÿ*{ê[ÂÒÒòåË—}ûö•¶¼|ùRúg&“™••ekk+wºæ£µDµ§…É>ÉLÜ„@"??¿¨¨(Ù–¨¨¨iÓ¦Iþlll\__ßîÁÙlvBB‚lËÙ³gÙl¶‚CÆ#Û"ûˆÔرc%whƒ:tj[tã[€hþ㨪ªªOŸ>ááá\.—ËånÙ²¥_¿~|>_ò©‹‹KlllCCƒ‚Zj‹Å·nÝ277ÿã?ÊËËËËËÿøã ‹»wï*8êÙ³g,ëçŸ.-----ýé§ŸæÏŸ/í™mkkûûï¿WVVòùü«W¯úúú*®Aç‘÷Åuáh§ýÏ4„âåM~~þŒ3 ƒÁ˜1cÆ‹/¤]¼xÑÑÑQ___Ú¿M,‹ccc=<yòdƒabb2vìØ«W¯¶Zƒn#ï‹ëÂ|¸©©©©©éðáÃÏŸ?/ýˆF£ÕÔÔ¬ZµŠÅbÉŽŸ=yòdSSSKKË+VH—ãׯ_÷ôô466vpp8xð`«£Aû‘´Å¥:鯷í%|çÎÉ_e(Y[[—––Êv.))±±±iÞSÚ²lÙ² 6<{öŒÏç_»v­oß¾þù§Üyïܹcaa!yCYYÙÑ£GÍÍÍïÝ»'jÑ¢E111oÞ¼‘òüùs‹µk×ÿµw¿1mÔÇo::ÖÊ?¡0œPÉ*Ø[a ‹„”¡q8 îÎhŒT!ºdÂ&‚1Ù``Ä1gèpÎÍÑâæ62uê°üÙF)£˜ZX,Âý”_¹µÐq¥ßë•}^Ìúí¿7wpß¶wõŒŒŒŒŒŒTVV>ûì³ÖŒ«W¯YîrñâŘ˜˜öövv/ 7Ŭ„© 0¸WqqqYY™õ"s£äíím6›™76›ÍÀþ–Ö‘·ß~›9òÍ7ߤ¤¤,ø¼ …¢¦¦†9R]]½cÇëCUVVÚÜå¹çžc¦Ò4ýÎ;ïX3”Jåþýû­W©T*æÙìm1ííí%%%ÖÉ›'×:°#˜€ÀT*Uzzúb§tbîïïgŽ †€€€Ÿ:**jhhˆ9288(•J­¥Õjmîbóø×®]³fÄÆÆþñÇÌ§Žˆˆpðh‹)))¡(ª¤¤„W×:‡ÜãÅÉçÜ+Ök¯½¦V«-§´`0BBB¬#ãããb±ØÁFGGÛ<ÂÄÄÄ‚·•H$Ì‘Ng½as—[·n…‡‡3G˜‡‡‡|ðAæµ÷Ý7¨ý£-fëÖ­ÖÿòçZ¾Y G¾áø=p#G$Ñ4™™ùæ›oæääX¿ûî»}ûö©ÕjjÉGA/¶•“J¥‘‘‘Ö‘áááôôôÅîzþüùõë×[GúûûxàË-ƒƒƒûúúÂÂÂü1ïÍ--Ž‚à)ZR•››ÛØØÈ¼}ccc^^žåß>>>f³Ùé§–Éd_ý5s¤µµU&“9¸KvvvSSs„ù)¹\n9B¸@è£m.­ŒŸV æFÉh4ÆÄÄTTT ƒÁP^^k2™,×&$$´´´,¶ÿØñ MÓ]]]–£ õzýçŸ.‹/^¼èà^þùgHHÈG}¤Óét:ÝÁƒwíÚe½å•+WÂÂÂŽ9rëÖ-“ÉÔÖÖÆ<‹õ‚XÈýà+aÞ³¿ÀO6%­V«P(D"‘H$R(Ö«¾ýöÛ 6Xö/x_ƒ---ÉÉÉB¡P(&''Ÿ8qâ®÷êííÍÉÉY³fX,.**šœœdÞ²§§gûöí"‘H(Êåò¶¶¶»6¬lä~ð•ð™þ=»gHÃ>`€0€`pLÀ)--uwÂ] Ð%é(t þGò¿(â‡/ ½úê«gÏž¥(*;;ûÀÌïŒÛèîî>tèõö½Ä§ðˆƒ°ø‰B—@¤K Ð%øÉÿBÊsÂr|&j{J¥R"‘tuu­p;²¯>Ÿ‰ÚQ›W÷øk(WA¡K Ò%Pèüä!å¹ï€œ‰à^Fvþå—_™#>ú诿þJôIøìÛ@099éíím™žž^»ví¿ÿþ{—,|Í9º"]….ÁÿHþR$#WÈù€œŒ?ø‰B—@¤K Ð%øÉÿBrÈNÀNœ‰Ú ü`ƒì>à„„„ÞÞ^æH___||<Ñ'à?²°ã3QܳÈîÿçŸwïÞýÒK/QU[[[__ßÛÛëëë;÷ô‹ìÜöˆ=óN#ûX$i4šŸ~úI*•J¥ÒŸþY­V[g_{«þÏæß+ Þh¸Άà˜€Ü0€`pLÀn€ À VÂ<44TPP°nݺuëÖ {JLww÷ž={üýý¹üºóÒ ;::žyæ™àà`??¿ÔÔT•JÅÃÈ .ìÞ½;&&F „‡‡oÛ¶í«¯¾âU!“N§Û°ag«›Uä*;|+œ­®®NHHðññyøá‡›››9(di¿ W­Z%øS833SSSóØcùûûûùùÉd²ššš™™Ò…¬")Š:{öì¦M›„B¡X,V*•£££.†Ü†Úã'`“É”™™)“Ée2YVVÖÔÔ”GÄ(•J‰DÒÕÕÅÏÂ-[¶Œ©Tª‘‘‘êêêÒÒÒC‡ñ-òå—_Þ¸qãéÓ§M&Ó•+WÞxãòòò’’þZÑ4ýüóÏ—••m[N$}'¾îÙ³§¯¯¯µµÕh4644444.dIÛ©ªªzúé§ùS¸wïÞÏ>û¬ªªjxxxxx¸ªªêÈ‘#{÷î%ZÈ6R­Vïܹ³¨¨hhhè÷ß—Ëåùùùw=‰-97Ôö¿1ž¥²²²°°9RXXxðàAÏŠálE°*|ýõ×ggg­{{{cccÉöÑ4½ìuzíÚ5]óœ+üðÕJ%ÍÕêfÉýÖ€U¡F£ÉÍÍå¤ëËùmœ™™Y¿~ý¥K—ȤÍaU(‰´Z-sD«ÕŠD"ry¬"322êëë™#‡®©©!—·D.ÿñø X.—Ÿ9s†9ræÌ™ÌÌLÏŠálÛ·œÅ599)ÈtÝa™ëtpp000@×<' {zzâââŒF#ÍÕêfÉý̪pçΧOŸæ¤ëËùmwî\jjê[o½E¬Ž¦ÙNMM=òÈ#?þø£å"7«›m$EQ!!!^^^¡¡¡»víúí·ßxU(•J?ž‘‘! ×®]›••ÕÙÙIºm¤ ¹\~ôèQ2]óX–––¦¤¤tttF£Ñxîܹäää÷Þ{W‘ NÀîÚª3a¶åíím6›™#f³™›7j.Œálvºp||ü¡‡êèè –6ωHæ^•ìììÿþûW…ÅÅÅeee֋ܬn¶‘yyy·oß¶ì”H$===ü)\½zu```]]^¯×ëõ‡ üᇈ²dêë닌Œœžž&–6‡Uáìì¬B¡`þ½( æž&>D¦§§7440GêêêܵUgÂl 0+ÎêtºŒŒ FC2mžÓ‹qtt´©©)<<üÝwß%VGÓ, U*Uzz:ó5?'`µµµ?þ8®y¬ ½½½í÷ nݺ•\žõy[Œ/¼ðÂûï¿O¬k«Â}ûöEEEµ´´ ƒÁÐÒÒµÿ~^EªÕê   †††±±±±±±úúúÀÀ@Ò‘w… Ø>‚fʼnÂëׯ'&&¶µµN›·ÌuªÑh"## tÍcU;00ÀáçGÐ6t:¯¯/®y¬ CCCí?–\³f Á>š¦]Œcccb±x||œdÚV…ÑÑÑíííÌ‘ööö˜˜rylã÷ß/—Ë}}}…BáæÍ››››9ˆ¼+—ÿåzü×z{{™#}}}ñññˆYÛ›7onß¾½²²2++‹|Ýœe.Ƥ¤$½^O k«Âþþþèèh›ï×rðEÛe.Fšü×X&$$îYìyXŒŸ~úéSO=%‹I¦ÍaUxãÆ¤¤$æHRRÒ7öQÅ~1nÙ²E£Ñ˜L¦©©©ÎÎN??¿´´4Ò‘Üóø 877·±±‘9ÒØØ˜——‡˜±*ÔëõO<ñÄ|™™ÉIÝœe.ÆóçÏÇÅÅèšÇªÐÁëhþDÚ;vìØæÍ› tÍcU˜ŸŸêÔ)æÈÉ“'“““ öQåÔbœžžþä“O^yåÂisXFEE]¾|™9réÒ¥ÈÈH‚}E-û·±¶¶¶¨¨ˆ@—»¹ö 5÷ŒFcLLLEE…e—Fyyyll¬ÉdâgÌb œ³ÁªpãÆ_|ñ7aNGæää¨TªÑÑQ³Ù|ýúõºººˆˆˆS§Nñ§Ð7«›Udffæ—_~922b6›ÿúë¯ŠŠŠ   Ë—/ó§ðöíÛ›6m²Ù/ÈÁq N¬ë¦¦¦ììlÒaÎVWWK¥ÒÖÖÖ‰‰ Ë>àûï¿ÿã?æU$MÓO>ùdww·ÙlîïïñÅ‹‹‹I.…Ëÿr=~¦iZ«Õ* ‘H$‰ …Íþ6^ÅØ¬?·¼$Zzá‚y¤ YEj4š;vzyy………\¸pW…ö8{½µôHµZŸŸoYŒJ¥òêÕ«¼*¤iúæÍ›………«W¯NKKã츶ë:%%åäɓܴY°*ßÒÒÒÛÛûÌ™3d×Ì1wîÜ´´4º« é¼hÑ"›ÄÄÄ{Ž?¾¸¸øÌ™3ùùùû÷ï‹ÅQQQd—LpÿþýǯY³W³@çÁ ·!…„„ìÞ½[=P–H$³gÏ~úôiû— '‹ËËË“’’V¬X±xñbºËø?âu„TWWs¹ÜW¯^|ÉÀ4ƒ>r䈩©i@@Àƒ,--é®àuÆû€/\¸àááAw@º‡–––z{{>ÜËËëòåËtW@½X“\. ŒŒ¤» Ý©S§U§¨ÏI#ÀÄpaaá¬Y³:äãã£ç,&ÚˆÅb2ËÃ8}út`` êg0ÐB,kòÖȸsÀ¹¹¹Ó§Oß»w¯ŸŸŸa— TQQaggW^^Þ¥K‚ þúë¯Ý»wÿóÏ?t×ð¿È‹f‚ÎËË›:uê¾}û|}}鮨••åìì¬J_‚ úõë—••EoIÔ`Ð!袢¢)S¦ìܹéÛy<{ö¬_¿~ê …‚‚}.}èèh`ÍÃëS¦LÙ´iÓ´iÓh¬(öìÙ3gggõ?»víêààMcIÔ =€5Ïcë>§}÷îÝ 4:û]ZZJv…@£gÏž999i¶¸ºº>yò„®z(Cz+µÑœª»'‡Ã!»B Q£CÐ.„€NƒA瀡jtšÀuXÐi €6õõõ2™L(j6b h#“Éø|~=4q: 0Цéñg‚ œœœòòòjkki) €2` MÓ+°‚èÖ­[Ÿ>}ž?NGEÔAmšÞƒ¤‚ÓÀÐ €6ZAáää„0=fpjjêªU«8©/ †Ðzš >Ÿ_\\L}=TbV/Z´ÈÆÆ&11‘îB€ ª714mçñx%%%Ô×@%f½ )##ƒî€"eee¯_¿æóùM'ñùü[·nQ_•˜5†Î#77×ÁÁAë$kkë—/_R\ÅÀ@‚‚‚Þ½{k„€Î ô(((°µµÕ:  ‘°‰6b±˜îº Y………Í€q4PO,kòÖh¢ùB@æ01iEa­ê ñÙgŸq¹ÜO?ýTëT ‹¢¢" Š«h„¼ˆ1’0t8:ÎammA070ÐCÇ9`§ @=tœ&ÀÐ 0ëAš§»Õ?ãü®Qjñ4Œ³YÛI444Èårkkëæ: €Àèá4Р¸¸˜ËåvëÖì÷?<ŒhPXX¨ã ,#`èÀ@Ý'€ 0t` A‹ÌçóÀ`ÜÀ@‚@ À` >ç€KJJp[10РÅ655577/++£¬$Š‘À999l6›ÍfÊd²æzÖ××GDD 6ŒÃáXZZŠD¢ˆˆˆúúz²+êµxšÀQh0väpee¥¯¯¯H$’J¥R©T$ùùùUWWkí¼nݺŸþ9<<\&“Éd²ðððŸ~úiݺu¤V´hqL €ÀØ‘û&Ýððð”””ãÇ«[.\8räȵk×6íÌf³%‰P(T·<þÜÓÓ³¼¼\÷Zð>àŽ¥®®Î¢¦¦¦K]ßÿüýý—/_þöÛoSV@Sõ}ÀqqqAAAš-AAA±±±Z;›™™5mìÙ³')•} ù|¾îô%0cGngddxyyi¶xzzfffjí¼zõêùóç_»v­¢¢¢¢¢âêÕ«sçÎýè£H­¨§ûMÀj`0nä¾ I¡PXYYi¶ðx<¹\®µóæÍ›ÓÒÒÆ§n™9sfhh(©õŠŠŠø|~‹Ýt|TŒƒnCÚ³gOjjjLLŒ\.—Ëå111©©©aaaúÌk¢X,&¹dh‹¢¢"}FÀ§´´”‚z‚‹ÅZ£„¼5’;ær¹r¹\so[RRÒhL¬vèСcÇŽM˜0AõÏ™3gr8œ÷ßãÆ-®au zŽ€¹\®B¡  ‚ Äb±ÖayLîØÝÝ===]³E"‘¸¹¹i휛›;|øpÍ–áÃ‡çææ’XС¸¸ @nûûûGGGk¶DGGhíìè蘒’¢Ù’œœìàà@b}@=˜Ãá €Àˆ‘ÀË–-»qãÆŽ; …B¡Ø¾}ûÍ›7ƒƒƒÕ4‡öëÖ­[¼xq\\\ii©B¡8sæÌâŋׯ_Oj…@½ââb›»q¹\œ#Fî9`‹•°~ýú;wáççoaa¡µóš5klmmwìØñðáC‚  °wïÞ¹sç’Z!P瀲Ÿ„E < «cqrrŠwvvÖÝíõëׯ^½"õ*DÝ:ê“°šÒó°©©i=*++)( €z` Tuuu}}=‹ÅÒ§3®Ã#†Jé9üUÁuX`ÄÀ@©¢¢"}.VÁuX`ÄÀ@©ÖŽ€À`¬À@©V0 F  ”Â!hÒ8'''00Íf³ÙìÀÀ@™L¦£sCCÃþýûÝÝÝÍÌÌ<<Š222ÒÛÛ;44TõÏÐÐÐDEE­]»¶içK—.åææÆÅÅ©þ9lذóçÏ“ZP#`rGÀqqqAAAš-AAA±±±Z;9rdÍš5¤Ö´Ã9`r8##ÃËËK³ÅÓÓ333Sk礤¤ÊÊÊñãÇ›››³X¬I“&%&&’ZP#`rX¡PXYYi¶ðx<¹\®µsAAÁòåË—,Y"•JŸ={öî»ïΘ1ãúõë¤VÃ9`݆ÔÐÐðÍ7ß,]º”Ïçóùü÷ß÷îÝ_~ù¥>óšh#‹I.Z§U‚&0 ‰Åb­QBÞÉ}‘Ÿ­­­D"±µµU· :4??¿ig;;»{÷îY[[«[Š‹‹…BaUU•îµàu„…T*õññÉÉÉѳMM••UMM ©UèÐQ_Gèîîžžž®Ù"‘HÜÜÜšëLj1@»ââbý¯À"¢gÏžAüû¦U@rØßß?::Z³%::: @kçY³f5ºïèܹs#FŒ ±> VQQ‘þ'€UðFB0VäÞ¼lÙ2//¯;v¬\¹’ ˆƒÞ¼yóðáÃêšCû>øÀÏÏ ˆiÓ¦qîܹS§N‘Z!PéåË—š§ô¡: lggGRIt!wÌb±nß¾-Á;wâãã-,,´v633ûý÷ßÿúë¯þýû÷íÛ÷È‘#'Ožœ8q"©•ŠŠŠ4/Ð.„cEî˜ ¡PÓÜÔFg¶íììŽ?NvI@—V݃¤‚ ¡ÀX1è6$0zm8Œc…ê´aŒCÐ`¬À@‚PCuZõ&0+0P§ ·!á4+0P¤ººº®®ŽÍf·j.++«’’’J (Ò†ÀAX[[¿|ù’ŒzèEzçää²Ùl6›(“Éô™«  ÀÕÕ•Ô×PÅÚÀ€Q"7€+++}}}E"‘T*•J¥"‘ÈÏϯººZ÷\J¥rñâÅ[·n%µ6 XkßÄ ‚0+r822ÒÛÛ;44”Ëår¹ÜÐÐБ#GFEEéž+<<ÜÖÖvÁ‚¤ÖkÃS8‚àr¹eeeõõõd”@#r8...((H³%(((66VÇ,iii‘‘‘¤ÔkÛ!è®]»ZZZâN$0>äpFF†———f‹§§gfffsýkjj‚‚‚Ž=Êb±H- ¨×¶&pŒ¹¬P(¬¬¬4[x<ž\.o®ÿ† æÌ™ãííMjU@‹60ÇC€ñaÐmH±±±›6mjü&ÚˆÅbC×m׆Ç`©` ‹ÅZ£„¼5’û:B.—+—Ë5_[RRÒhL¬¶qãÆøøø®]»¶aE^k „CÐÀdb±Xë°¼ &wìîîžžž®Ù"‘HÜÜÜ´vÎÊÊ …¾wý(ӞƭÀ`|È `ÿèèhÍ–èè耀­•M¨I-¨ÑæCÐ< ƇÜ^¶lÙ7vìØ¡P( ÅöíÛoÞ¼¬î€Ñm'QSSSWW×¶‹ÛqŒ¹Ìb±nß¾-Á;wâãã-,,H])0P۞¡‚« À(‘{AB¡0&&¦¹©º/ãà³ÑhÛs(U0£Ä ÛÀˆµù , F  Thgã",0>` B›/&‚Ëå–——×ÕÕ¶$z!€ yyyvvvm›·K—.GÇL:"0PáñãÇ®®®mžG¡Àø € ?îß¿›gÇuX`|À@ººº:™LæääÔæ%àV`0>¤pNNN`` ›Íf³Ù2™¬¹žW¯^7oŸÏ·´´ôöö>sæ Ùµ5²³³íììÌÌÌÚ¼Œ€ÀøÀ•••¾¾¾"‘H*•J¥R‘HäççW]]­µóøñã‹‹‹Ïœ9“ŸŸ¿ÿ~±XEjy@'Ož´ç0cDnGFFz{{‡††r¹\.—:räÈæbõ“O>‰;v¬¹¹ùˆ#¢££wîÜIjy@vž&ð>0Fäp\\\PPfKPPPll¬ÖÎ{öìÑ|7ƒ‹‹‹ŽãÕÐdŒ#Cngddxyyi¶xzzfffê3ï… <<<È© (…CÐM‘û2…Baee¥ÙÂãñôy¢‚\. ŒŒ$­4  )&Þ†TXX8kÖ¬C‡ùøøè9‹‰6b±˜Ì2A/¯^½*(( …íYHß¾}q>H%‹µF yk4!õ•¶¶¶‰ÄÖÖVÝRPP0tèÐüüüæfÉÍÍ>}úÞ½{ýüüô\‹‰ ¹[í‘‘‘øðáÃö,¤¡¡ÁÂÂB¡P´ç^&€6 /bÈ»»»§§§k¶H$77·æúçååM:5,,Lÿô†kÿñg‚ ºtéâàà •J RÀþþþÑÑÑš-ÑÑÑZ;M™2eçξ¾¾¤VTzòäI;ïARqrrÊÎÎnÿr‚Ü^¶lÙ7vìØ¡P( ÅöíÛoÞ¼¬î yx}Ê”)›6mš6m©%Å 2&ÂÙÙùÙ³gí_CÀ,+!!áöíÛ@ ܹs'>>ÞÂÂBkç»wï.X° ÑÙïÒÒRR+²µó=HjB¡ðùóçí_C{AB¡0&&¦¹©šg¶q!•Qjÿc°Tœoß¾Ýþå0oC£QQQQ^^Þ·oßö/ ç€ÀÈ>f¦üüü+W®Ü¾}ÛÙÙù7Þðôô4ìÍ^%%%<Ï€ ì ž.ªT*/^¼¸mÛ¶ýû÷GGG;99ýöÛo÷ïß?~üo¼ann®Ïòׯ__YY¹víÚ­[·FEEmݺõðáÃdnS`¨+°TTƒ`.—k¨Ш³Œ€80yòä[·n­Y³æ¯¿þÒ<+ibb2uêÔëׯ/X°`̘1 8xð AÛ¶mãr¹êë±»wï>xðà÷Þ{oÿþýiii ªÙ_½zµiÓ¦¹s熄„ܿŊ...Ÿ~úiLLÌãÇéÙZÆ0à˜ ggg…£a qlñ9a=òññ¹qㆋ‹‹îE=xðàåË—ZŸA][[›‘‘‘žž~ãÆëׯŽ7îÕ«W‰‰‰“&M:tèfÿ;wÞ½{÷äÉ“mØ"£1räÈo¿ývôèÑYÚÆíìì>ùäƒ, @ä=ŠÒøÑ£GÆ «ªª"ÂÜÜ<$$äÂ… K—.]±b…WZPPpéÒ¥=zL˜0¡ÑŸTª««]]]ÏŸ?ßè…Œ ‡ÃÉÊÊ2ÔõhxðàADD„A– Žú,hêÕÖÖ¾ûî»aaaJ¥R©T>|øðÑ£G<oùòå†]QïÞ½,X0{öl­éK„¹¹ùºuëvïÞmØõv ………ݺu3àÕฌ ³8'''00Íf³ÙìÀÀÀV½®ºº:!!aÉ’%àÃ?T5:88œ8qâìÙ³¤¾Rª9+V¬øë¯¿:mfê)Ðj`0& àÊÊJ___‘H$•J¥R©H$òóó«®®Ög^.—»yóf''§ÈÈÈFS»u£çbo‹µ|ùò½{÷Ò²vÚö ,‚ úõë'•Jkkk ¸Lº0èpxxxJJÊñãÇÕ- .9räÚµkuÏÈä÷ …ššssóÏ?ÿ<$$¤GtE‘Ï>ûŒÍfoÚ´É€Ëtww?qâ„§§§— `^¿~mjjJöZþý÷ß;wîܺukÞ¼yyÈóuŠsÀqqqAAAš-AAA±±±tÕc666ÕÕÕJ¥2333%%eðàÁÿó?ÿ£¾…ɸö&`OOÏ{÷îv™]AAÁ† ìííSRR4ÛÛ³«Ñ9?ÿüsŸ>}6lØ––6|øðßÿ½¹z"""êêêÚ¼öN‚Aœ‘‘Ñè‚aOOÏÌÌLºê1,@óÝwßíܹsðàÁ/^¤»"Òedd¸¹¹v™`0zR©ô‹/¾xã7zôèabbbaaqùòåF}nß¾½téÒž={š˜˜ôë× ˆÝ»wÏœ93''GÕáõëד'Ovrr :th÷îÝMLLzõêõ믿ª—SWW÷í·ßNŸ>ËåN™2åÊ•+¿ÿþûˆ# °wïÞ’’‚ ª««ÿúë¯yóæíÞ½ûÒ¥KÉÉÉ?ÿüó¹sç6mÚ4`À€¥K—ž?^Ø111C‡ýé§ŸÆŽÛܳ{Ì’jJÆ055­­­Õl©­­íÞ½{‹32j+ôqáÂ…Þ½{Ÿ;wN³±  à³Ï>ãr¹"‘hÕªU3fÌàóùcÇŽ=wî\CCC;ט}àÀv.¤U*++-,,^¿~mØÅž={vÚ´i†]&•ªªªöïßïäääââ²dÉ’K—.iN-..^²d ÇÛ¸qcBBBUU•R©¼téŸÏWõ”Ëå‰DÎÎλwï~ùò¥æìûöí>þÞ½{£Gž¿Àúúú6ÿò«««¿ùæ›’’’VÍE^Ä0(ºÚÀZmÙ²åðáÃêngÏžÍÍÍUÿSs’æÏ¹¹¹gÏžÕ:É€KHNN¶±±Y¿~½R©ÌÏÏ_¿~½……ÅêÕ«?~œ˜˜(‹CBB¤R鯿þêåå5`À™L¦ ÷îÝûî»ï~øá‡²²²‹/÷êÕËÅÅeûöí–ÐÐÐðÑG}ðÁNNNvvv£Fúã? ò{HJJòòò2øo2;;»oß¾íYBûkÀ°„6/!>>ÞÞÞ~ôèÑIII÷ïß?pà€µµõœ9s¤R©R©üöÛo7nܨP(-aãÆª0333›9sæÿûÿOCj‹Å666ãÇ÷òòúî»ï´ÖóàÁƒwÞygìØ±l6{ß¾}ßÿ½zRlll~ßÿý¹sç<(‘Hš[ÂÓ§Oû÷ï?räH[[Û={ö\¿~}ݺuû÷ï¿{÷îÝ»wGŒÁçó¿úê+…BÑè7q÷îÝcÇŽ­X±ÂÖÖvøðáªmÃß"88ØÞÞžÇã…„„\¹r%++Ks þþþTÀ666š-ùùù½{÷nqÆ7V¹víš………ê‹áúõëóóóµv«¯¯ß¾}»­­íÁƒU_lu{ñâ…ƒƒÃ´iÓlmmÍÍÍÇ¿cǹ\ž››ëààðûï¿«{ž>}zðàÁC‡ýî»ï233³²²¢¢¢4ÿ7¶Ù÷ßÿÁ´9444°Ùl¹\nð%ª¡¡!44´OŸ>ÿý·f{MMÍÖ­[UájaaqòäÉö¯«¼¼ü믿V…z‹Uµuúkhh8tèЭ[·´N}òäÉÒ¥K9Î[o½õé§ŸNš4Iuɪ©©©‡‡Ç‚ öíÛ—žž2dÈââbõŒ¥¥¥;wî …êkÐÌÌÌf̘qüøñ²²2u·cÇŽ 4¨¢¢B*•~úé§£F2773fÌþóŸììl¥RYWW·lÙ2KKKÍQœ²“Œ€'NœøçŸj¶üù矾¾¾-ÎØA¸UnÞ¼©zÏ‹ÅR8TÇ…>ûì³yóæ988¼óÎ;×®]:tè®]»Ts5:¢’’bmm½nݺû÷ï/Z´hРA/^l´¢¬¬,gg篿þºÿ3W®\©ùíۀƌsåÊ2– @žíÛ·1¢¨¨ˆîB˜®¤¤$66vË–-111Zû„††òùüÀÀÀÏ?ÿü­·Þâp8 .¼{÷®zWVVvüøñ3f¨¡«XXXÜ¿_s9UUU Ÿ~ú)ŸÏÿñÇçÏŸïççWXXØhuäE ƒnà KMMmtÒˆ#>þøcÝ32ù6$ƒ+++SA«®®¾~ýúÍ›7…BáÈ‘#/^¼¸wïÞ©S§9r¤¹Ùsss÷íÛwäÈ‘wß}wïÞ½ZßõôâÅ‹wÞy‡Ëå9r¤  àîÝ»‹-êÙ³g«ê;vì×_=nܸVÍ¥•+Wzxx¬^½ÚàK0 ŠŠŠ¤¤¤çÏŸ5êÑ£G!!!7oÞ´³³£».#!•J¯_¿þäÉ‘H4vìØv>qïÞ½{ .¿ýö›ff«tŠgAWTTxyy¯\¹’ ˆƒ=z4==]uœV‡NÀºÕÖÖvéҥżzõJ÷íÈuuuÛ·oß±cÇ€8N÷îÝÏž=«ç› ‚hhhàp8999GßÒõqïÞ½ï¿ÿÞàKh¿gÏžEFF^ºt)##cèСB¡ðöíÛ/^¼¸víÚ!C讚õêÕ«.]ºh½‘ºSÜÌb±nß¾-Á;wâãã[L_ÐÔ½{w}ûÕâÃ@ºuë¶eË–ŠŠ ‰DréÒ%GGÇiÓ¦éùT2‚ ž={ÆãñÈH_‚’[_¾|ùõ×_4èï¿ÿnÃìJ¥òܹs>>>»ví2xmTÊËË›2eÊš5kjjj讥c())™zô¨Q©Tzøða‘H4zôèÒÒÒ#Fœ={V.—7·F…B±ÿþ!C†8pÀ[Ò¡ÔÖÖΙ3gïÞ½ãÇ×üšÛyž­CÒ¹e*ÇV0\JJJß¾}_½z¥Oç/¿üróæÍäãææ–””ÔÜT‰D¢:pÒ³gÏ+Vܼyóرc6løí·ß4o4,..Þ¹s§@ àóù›7oÖzuLZZš½½ý‰'4Ÿ?¾yóf___‹5xðàÁƒûûûgggGDD8;;?^}-aJJŠú޹¹ùîÝ»Ý}éÒ%õý^½zñx¼wÞyçöíÛê …âôéÓúßN]PPÂår8lذ7ÞxãÙ³gªIçÎÓ,F}áýáLJ ¦úËVUU}ûí·ÎÎν{÷ LNNVÍûË/¿Lš4‰Íf¿ùæ›999J¥òåË—aaaêëTÍÌÌÞ}÷ÝÓ§O»¸¸|ýõת*--ݵk—¿¿¿»»{xxxsWÖth………Ó¦M›={v{îRf"/bŒ!ºÀÔ˜=NŸ>M^%_}õÕǬuRii©««ëñãÇõ\T]]êY͹wïž­­í… Tÿ¼}ûvŸ>}Ö¯_ÿǨnÖ¬­­ýâ‹/LMMgΜyãÆæ–óìÙ³)S¦ 0`ß¾}ª»5Ÿ® T*+** ¿ýö[@0iÒ¤k×®]»vM(zzz …ÂÐÐйs纺ºìÞ½;99¹®®®´´ôìÙ³Ÿ|òÉèÑ£UGÏzöì¹víZÕý'õõõaaa<ÏßßíÚµvvvÍÝþ1sæÌY³fÍš5ËÚÚzÖ¬YÍu{ýúõ®]»lmm—.]jeeµtéÒØØØÊÊJÍ>yyynnno¾ùæO?ýTZZªT*%‰««ë{ï½÷Ûo¿]½zuîܹêÛ=-_"‘œ={V5WÇòçŸÚÛÛþùçî;ã€ÖLË—/÷ïß¿®®®ÅžªC¸äUòèÑ#;;»¦•444Ìœ9sõêÕ†]Ý7ÔcG Í;÷Õ4o7ÔáêÕ« .T]finnÞè)H*µµµ?üðƒ³³³­­m\\œR©¼uëÖÆ;&‘HNž<¹víZKKK‹5iÒ¤­[·^¾|¹¹¯§NÚ°aÓ'Oš«ª¸¸øã?þïÿ«~Þ‹wîÜùâ‹/òòòšëPUUõ믿Μ9Sµ™¾=~üxéÒ¥<ïóÏ?WÝú/“É–.]jkk«:®0a„?þø£¡¡áÑ£GçÏŸ×zG\zzúÇ[¬–Ož<áóù¸5Έ!€uASf̘1»wïÖÝG&“ñù|²oð6lX|||£Æo¾ùfôèÑz'g¸ÚÚZÝÌ+..îÐ[š½zõjÕímæææ›6mR}‰yõêÕ/¿üâééÙ«W/77··ÞzKó©F2™lÉ’%½{÷¶µµ5k–D"¡o#”¯_¿5jI·¼C €uASæùóçZOòiR~È®ä›o¾ ÖlIKK³±±yþü9Ù« 444¨NQ¿~ýzëÖ­\.×ÚÚÚÄÄD3­«ªª¾ûî;›Ë—/7šýÎ;cƌٶm›ÁšöàÁƒ¨¨¨%K– :táÂ… ,˜2e ÅÏ“Š‘1Æp-î¦R~~þ›o¾ùÁ¬_¿^k‡µk×:88„„„Z†L&:thnn®ê" ÿýwäÈ‘!!!‹-"u½@‹ÂÂBkkë.]߸qéÒ¥ùóçïÙ³ÇßßßÊÊêÙ³g¿üò˾úê«[·nÅÆÆúøøøøø¼ñÆ"‘Hë}&ÙÙÙ÷îÝóððpvvÖºv™LvêÔ©ëׯ'&&öìÙÓÇÇgìØ±žžžŸÒÒÒüqÑ¢E}úô±³³›}]ñž““óá‡òx¼+Vü÷¿ÿU/:ò"†ôè’J¥³gÏf±X,köìÙ:>ÁW®\™;w®µµ5›Í5jTLLŒž«@SïçŸvsskôn2¥RYQQÑ«W¯ÿý—‚ÊË˽¼¼víÚµ`Á??¿F—ãBgóúõk—†)•J¹\¾páB 6¨îø:räˆæµiÉÉÉýû÷V5þúë¯666¡¡¡­}{™ŽÀýúõS‰‘ËåÛ¶msuumîrM‚ &Nœxýúõªªªääd//¯ÈÈH}Ö‚¦Å‚ 6lØÐ¨ñŸþyã7(«A*•öîÝÛßß_õ¢S€=zôã?nîMA«W¯îÛ·¯••ÕÀSSS).ˆ¼ˆ!÷ìixxxJJJ£÷+Œ9ríÚµM;‡„„ìÞ½[uA‰döìÙOŸ>mq-8L‹’’77·øøxuãÖ­[«««wîÜIY=rvv¦þr`ܤR)ŸÏ×ÿùç`Ä:ê³ ãââ‚‚‚4[‚‚‚bccµvÞ³g:} ‚pqq‘Éd¤–íÁãñ¶lÙ²jÕ*Íæõë×ßxã *Ë0`Ò N  }läpFFF£g{zzfffê3ï… 4‡VÀ@Ë—/¯¨¨8uê”êŸeeeÉÉÉ£G¦·*€܃·Ý»w¯ªªÒ ¼~ýºW¯^¯^½Ò=£\.3fLdd¤O‹kÁ!h%%%Íž=ûÊ•+ýû÷_°`µµõþýûé. À`:ê!è¶),,œ5kÖ¡C‡ôI_mÄb1™eAÄèÑ£·mÛ6}úôðððû÷ïïÞ½›îŠÚB,kòÖhÈ`×,TµX[[[‰Dbkk«n/((:th~~~s ÉÍÍ>}úÞ½{ýüüô_/FÀôÚ´iSxxxrròàÁƒé®À:ƸÑuÛA¸»»§§§kö‘H$nnnÍ-!//oêÔ©aaaú§/0ÁöíÛÿúë/¤/€þÈ=íïï­Ù µsQQÑ”)SvîÜéëëKjU`p&&&úŸ/‚ì‹°***¼¼¼‚ƒƒW®\IÄÁƒ=šžž®~¹›æÐ^$ýç?ÿ™?~kׂCÐ@ò"†ôèzþüùúõëããã ‚ðóóÛ·oŸ@ ø¿Õkl˜ÖsÝ …‚Ãáè^HÒ˜` IǸ ô„ €` €h€ ˜YŒéØÆ2¦ÍÁ¶0“1m yH¿ƒ6''gýúõÿý7Ao¾ùæ¾}ûZœ«  ÀÇÇçéÓ§ú”gL÷c[˜É˜¶…0®ÍÁ¶0¶E䎀+++}}}E"‘T*•J¥"‘ÈÏϯººZ÷\J¥rñâÅ[·n%µ6‘û%%<<<%%åøñãê–… Ž9ríÚµ:æ KKK‹ŽŽÖó{¾j1¶…±Œis°-Ì„mѹ#ุ¸   Í–   ØØX³¤¥¥EFFFDDZ½È àŒŒ ///ÍOOÏÌÌÌæú×ÔÔ=z”Åb‘Z½È=Jн{÷ªª*SSSuËëׯ{õêõêÕ+­ýW®\iooÿå—_þoq8Ý‘a[˘6ÛÂLØ}t#c¡m›‘‘qàÀ6Ì«õU†¶…™Œi[ãÚl 3ӶĬùëV}_àr¹r¹ÜÖÖVÝ^RRbee¥uö7ÆÇÇwíÚµµë5šïYÐyò°RƒªÅÝÝ===]³D"qssÓ:{VV–P(4Ñ@„úcBîEXþþþÑÑÑš-ÑÑÑZ;+›P7’Z$õÈ=O^QQáåå¼råJ‚  o½õÖ/¿üÂäÏÞ?ÿüceeõã?ýðãGþ÷ßÕôÙR¹¹¹mÙ²åþýûMɺ?TkÖ¬5jÔ•+WÊËËËÊÊ._¾<|øð5kÖP[~c:6G©óoÁÀƒŽmÑý©cÚÞ@w=zV˽A‹Õê.¯={æîõöÞ{ïi¶¼÷Þ{ß~û-]õ´ÓÓ§O9ŽêçO>ù¤¡¡A=)==½_¿~4ÕÕ²„„ÿ»íÝ»wÑ¢EÊ–>Óô7nÜÑ£G5[~øá‡ˆˆÕÏzn)4ý%ëþP±X¬ììlÍþÙÙÙ,‹Ì[¡éæèþ[0yçÐt[t꘶7Ð]žÕ2doÐbµ:ÊkçÞ€¹;A=Mœ8ñÏ?ÿÔlùóÏ?}}}骧¤R)ÇÓ:©ªªª{÷î×£¿ùóç_¼xQwŸ»wï8°¼¼\I÷9ÝzöìY\\¬ÙRTT4iÒ$ÕÏúl)C´øKnô¡âóùMØÆÆ†ŒÚÚ éæèþ[0yçÐt[têaÚÞ@w=Z§2voдZåµsoÐáÏgddxyyi¶xzzfffÒUO›•••©NE¨^\ÑÔ… <<<(®JIII•••ãÇ777g±X“&MJLLÔìPSStôèQ‹EW‘í¡:lHè±¥H£ÕêÕ«çÏŸíÚµŠŠŠŠŠŠ«W¯Î;÷£>¢±BÝtÿ-Œ`ç þÔ5´½îzšNeòÞ@ë¶ôîÝÛÔÔÔÎÎî½÷Þ{øð¡º½½{ƒ6G7C˜ššÖÖÖj¶ÔÖÖ2ê»a‹4ÿo¾ùf]]]Ó>%%% ¸zõ*õåé©G<Oó Ç»v횺Ê+¶nݪþ'“?{>>>ÇŽÓlùñÇÕª·”9tÿ’›~¨fΜ©ùœ9s¦æÑ9z5ÝÝ &ïšn‹îO&¦í t×£u*c÷Z« ¸zõjMML& ·±±¹{÷®jR;÷LÙì6còÿ±V),,üå—_ìíí¿úê«F“ Æ—@Kaz255mzk„ ªŸÏœ9ããã£ùÝ‚9ÿ嚊·¶¶>vìXqqqqqñÑ£Gy<ž™™™jªî-e¿d­ª]»v9::ÆÄĨ®ZЉ‰qttüæ›oȯT/M7G÷ß‚É;‡¦Û¢ûS§Æ´½îz´NeìÞ@ÏßíÁƒ'Ož¬ú¹{Flv{ØØØh¶äçç÷îÝ›®zÚ)!!ÁÁÁA³åÅ‹^^^ÿüó]%é©wïÞMÏ`™››«~îׯßóçÏ5§2ä¿\s._¾}Ο?¯š:tèÐ'NÐ[¡þjjjÆŒÓè –Ž³) ÿìMŸ>=55µ¶¶6++ëÃ?\±b…zRk·”FMɺ?Tû÷ïgÏžU(ªsÀ}ûö=pàÉeê«éæèþ[0yç õó¯ãSÇ´½îzZ[-½{ÝÕúúúž:u*??¿¶¶öÙ³gÛ·o·¶¶NIIQMmçÞ€Ñ;A=eggÏœ9“Åb±X¬™3g6:»Àd ³gÏæñxݺu³³³ ¼yó¦zªÖ/L …‚Æ‚uËËË{ï½÷¸\n=F­ûl Ãø×_ussëÞ½ûÀ÷íÛW__¯9µU[J=_µ[üPýöÛoÞÞÞ‡ÃáŒ5êäÉ“4mÄÿÑ=rÐý·`ÚÎA÷¶èøÔ1mo »žÖVKк7Ð]m||ü¬Y³T{é>}ú,Z´èáÇš³·go`ÒÜê€<þ0@G„ €` €h€ €` €h€ €` €h€ €` €h€ €` €h€ €` €h€ éœššºjÕ*‡cbb¢ÿ\®®®­š !=€-Zdcc“˜˜¨ÿ,J¥rñâÅ[·n%¯*z™(•JŠÖd¢ïºÂÂÂÒÒÒ¢££õŸ céFw¥¥¥EFF&''Ó]‰˜uVMMMPPÐÑ£GY,ݵˆY¼aÆ9sæx{{Ó]É”Tiq]gΜñññ©««Ó•nÝw ŒF»Â¯y ºËÅÅ%>>^ è?K«ºuØf2¦m!Œks°-Ì„mÑkÉÌ `wý¶8#þÒ „ma,cÚl 3a[ôÁ ƒ·M·Ð˜þ„šh¾ Ϻ€Î‰ô°fĪƸ:9ÒXwÖ¶g*@ÇŬû€: 0³lÙ²…î ÛÂXÆ´9Øf2¦m!1\fŒ‹¥€$äE FÀÀ÷ïßÿ÷ß鮀:` ŸR©3fLRRÝ…P ôËËË«¨¨ÈÌ̤»ê €~?&âÁƒt@Ò855uÕªU§Å‡^]½zuÞ¼y|>ßÒÒÒÛÛûÌ™3d× ñäÉ@€€N…ô^´h‘Mbbb‹=Ç_\\|æÌ™üüüýû÷‹Å⨨(²Ë&xüøñŒ3ÀЩ0èmH!!!»wïV”%ÉìÙ³Ÿ>}Úþ%üÿþûK–,ÉÎÎær¹t—ð:ÅmH{öìÑ}ïÞ½~~~†]20SXX˜T*ýöÛo³²²&Mš”MwEÿ§S\„ED^^ÞÔ©SÃÂÂôO_èèž}ú”••uéÒ… ˆLš4I*•vëÆÐëó ³éÀ瀕ÚhNÕݳÅô…-%%eÈ!ªô%bРAŽŽŽþù'½UP€A瀡JII>|¸fËÒ¥K=JW=”ARRR† ¦Ù2þüøøøââbºJ 蔚š*‰4[Ølö[o½õÇÐU5À@›²²²üüü6jwttÄŒh“’’2tèPõXj–––eee´”@0Цé `0t`  :3fpjjêªU«8©/ †¸sçN£{T,--KKK©¯€JÌ àE‹ÙØØ$&&Ò]®¬¬¬¸¸Xõ†F,--ËËË©/ €JÌzà_FFÝ%Ed2Yß¾}›^E‡ÃÁŒ³FÀÐyÙØØh„sÀÐ €`èäÀ@ââb>Ÿ¯u›Í®¨¨À®À¸I›h#‹é® š¥#€»uëÖ£Gªª*ŠK€ÎL,kòÖh$¬õU†`&ÓqšÀQh œX,Öýþ\ƒ3’† è€N ôÐq˜@@'À¬qhžîVÿŒ«a’î0žÅFYŒ¬í$jkk«ªª¸\ns0£‡CÐ@ƒââbkkk×÷#€Àè!€º?`èÀ@0hP\\Œ€N 4(**Òq€N 4Ð}0€N 4À9`0Ð @zçää²Ùl6›(“ÉšëY__1lØ0‡cii)‰"""êëëÉ®¨‡‹°È àÊÊJ___‘H$•J¥R©H$òóó«®®ÖÚyݺu?ÿüsxx¸L&“Édááá?ýôÓºuëH­h¡ÏEXx21R÷qááá)))ÇW·,\¸päÈ‘k×®mÚ™ÍfK$¡P¨nyþü¹§§gyy¹îµ˜˜»`p½zõÊÏÏg±X:ú°X¬¼¼<Ý}ÈF^Ä;Ž‹‹ Òl ŠÕÚÙÌ̬icÏž=I© èS]]]__ßb²â(47r8##ÃËËK³ÅÓÓ333SkçÕ«WÏŸ?ÿÚµkW¯^;wîG}Dj…@½¯ÀRA€q#÷mH …ÂÊÊJ³…ÇãÉår­7oÞœ––6nÜ8uËÌ™3CCCI­¨‡ uÒž={RSScbbär¹\.‰‰IMM Óg^mÄb1É%C[”””X[[·Ø  T‹ÅZ£„¼5’;ær¹r¹ÜÖÖVÝRRRÒhL¬vèСcÇŽM˜0AõÏ™3gr8œ÷ßãÆ-®au -^­‚*‰Åb­Ã6ò2˜Ü°»»{zzºf‹D"qssÓÚ977wøðáš-ÇÏÍÍ%±> ÃË—/1 7€ýýý£££5[¢££´vvttLIIÑlINNvpp ±> CII Çk±Œ¹¼lÙ²7nìØ±C¡P(ŠíÛ·ß¼y388XÝAsh¿nݺŋÇÅÅ•––*Š3gÎ,^¼xýúõ¤VÔÓ3€¹\®B¡  Z{˜Åb%$$¬_¿~çÎAøùùÅÇÇ[XXhí¼fÍ[[Û;v<|ø ˆìÝ»wîܹ¤VÔkñUH*<ïÙ³gÔ@ r˜ ¡PÓÜÔFOÍ™3gΜ9d—ôÒó°µµõË—/)¨€ º : 0êéy0Œ(¥T*›>M+kkë’’ J (¥P(zõêejjÚbO§P((¨ €z` ”ž'€ ‚èÚµ+›ÍÆH`¬À@)ý˜Ài`0j` @…ôÎÉÉ d³Ùl6;00P&“éèÜÐаÿ~www333“'O’]P¬UÌãñÀ`¬È àÊÊJ___‘H$•J¥R©H$òóó«®®n®ÿªU«$ÉÙ³gËËË;vìØ1RËêa  Bî“°"##½½½CCCUÿ }ðàATTÔÚµk›v¾téRnnn\\œêŸÃ† ;þ<©åõô|´ Œ¹#ุ¸   Í–  ÒQx  IDAT ØØX­9²fÍRëÚµö4ncEngddxyyi¶xzzfffj휔”TYY9~üxsss‹5iÒ¤ÄÄDRËêá4€ ¹Üô™G<O.—kí\PP°|ùò%K–H¥ÒgÏž½ûî»3f̸~ý:©ÅÀ* º ©¡¡á›o¾Yºt)ŸÏçóùï¿ÿþîÝ»¿üòK}æ5ÑF,“\2´ÚË—/qH,kòÖhÒè…€†ekk+‘HlmmÕ-C‡ÍÏÏoÚÙÎÎîÞ½{šÃ£ââb¡PXUU¥{-&&änÇ{ô葞ƒàG½ýöÛ?&»*€æ1䎀ÝÝÝÓÓÓ5[$‰››[sI-hW___^^Îårõì÷1€#7€ýýý£££5[¢££´vž5kV£ûŽÎ;7bÄëj•””p8œ®]»êÙŸËåVTTÔÕÕ‘Z-ȽxÙ²e^^^;vìX¹r%A¼yóæáÇÕ4‡ö|ðŸŸAÓ¦M#âܹs!!!§N"µB R«®À"¢K—.G.—ÛØØW-ȳX¬„„„Û·o @pçÎøøx ­ÍÌÌ~ÿý÷¿þú«ÿþ}ûö=räÈÉ“''NœHj…@¥Ö0ë°Àx‘;&B(ÆÄÄ47µÑ™m;;»ãÇ“]Ð  Æ ÛÀè•””´6€ñ>0V` NnnnŸ>}Z5 FÀ`¬À@/^ôíÛ·U³ €ÀX!€:2™¬µŒ÷1€±Burss[À|>#`0J` ŽL&spphÕ,|>¿¨¨ˆ¤zh„ŠTTT(•JKKËVÍekk[XXHRI4"=€srrÙl6›Í ”ÉdúÌUPPàêêJêk(€bm8L €Àx‘À•••¾¾¾"‘H*•J¥R‘HäççW]]­{.¥R¹xñâ­[·’ZP¬mlccS\\Œ·]€ñ!7€###½½½CCC¹\.—Ë 9rdTT”î¹ÂÃÃmmm,X@jm@±/^´ö0AÝ»w·°°P(d”@#r8...((H³%(((66VÇ,iii‘‘‘¤ÔkÃMÀ*8 F‰ÜÎÈÈðòòÒlñôôÌÌÌl®MMMPPÐÑ£GY,©…õ^¼xÑÚÇ`© €À(‘À …ÂÊÊJ³…ÇãÉåòæúoذaΜ9ÞÞÞ¤V´hÛ!h‚ lllp'݆›‘‘±iÓ¦6Ìk¢X,6tÐv8 L&‹µF yk$÷u„\.W.—ÛÚÚª[JJJ‰Õ6nÜßµk×6¬WÉ2_›#` €X,Ö:l#/ƒÉ»»»§§§k¶H$777­³²²„Ba£ïdjTUU½~ýšËå¶a^Œ€À(‘ÀþþþÑÑÑš-ÑÑÑZ;+›P7’Z$P m7« €À(‘ÀË–-»qãÆŽ; …B¡Ø¾}ûÍ›7ƒƒƒÕ0ºí$Úðh5‚£Dn³X¬„„„Û·o @pçÎøøx RW ÔæÀFÀ`¤È½‹ ¡PÓÜT݇—qðÙhäææ¶í&`#`0R º ŒXÞ¬Æb±”Jeee¥aK ¨››kooßæÙ1ãƒ*äååµù4ÓÀ`ŒÀ@…vŽ€À`|À@ººº:…BaccÓæ%ØÚÚâ40.??ŸÏç·í!£*666€‘AéòòòÚsü™ÀŒéœ““Èf³Ùlv`` L&k®çÕ«WçÍ›Ççó---½½½Ïœ9Cvm@öܬ‚0r¸²²Ò××W$I¥R©T*‰üüüª««µv?~|qqñ™3gòóó÷ïß/‹£¢¢H-¨ÑÎK  \„ƈ܎ŒŒôöö år¹\.744täÈ‘ÍÅê'Ÿ|?vìXssó#FDGGïܹ“Ôò€yyyvvvíYîãCnÇÅÅi¶ÅÆÆjí¼gÏÍw3¸¸¸è8^ HûAóùüââbCÕÀäpFF†———f‹§§gff¦>ó^¸pÁÃܺ€Rí?ÍãñÊËËëêê UíÈ `…Baee¥ÙÂãñäry‹3ÊåòÐÐÐ}ûö‘VP§Oá ¢K—.§¤¤ÄP%ÐŽ‰·!Κ5ëСC>>>zÎb¢X,&³LÐWûA8 $‹ÅZ£„¼5’À\.·Ñx·¤¤¤Ñ˜¸‘ÜÜÜÉ“'oÞ¼yâĉú¯H© ˜ ªªªêêê,--Û¹\‡¤‹ÅZ£„¼5’Àîîîéééš-‰ÄÍÍ­¹þyyyS§N óóó#µ0 ŒA†¿FÀ`tÈ `ÿèèhÍ–èè耀­‹ŠŠ¦L™²sçN___R«*!€´"7€—-[vãÆ;v( …B±}ûö›7o«;h^Ÿ2eʦM›¦M›FjI@±ö_­‚#Cn³X¬„„„Û·o @pçÎøøx ­ïÞ½»`Á‚Fg¿KKKI­ÈÖþK UpŒL7²W  cbbš›ªy~›ÔsÝ@—¼¼<¡PØþå` F†‰·!1‘Éd8 ÐX—ººº¤¤¤£GâLmöäÉ—ö/ FÆÄüš˜r+”Jezzú?ÿüséÒ¥ÄÄD''§^½zÕ×ן8qB j-DCC‹Å*,,ìÕ«W;U\\}ú|òÉ'YÚ„ ¶lÙÒª‡„´yl̇  /^¼?}úôˆˆ2^mѽ{÷!C† 2DÝxóæÍ¾}û|uÈ“'O ˜—xf]„•““Èf³Ùlv`` L&kÃBJKK¿úê+OOÏAƒ;wnÆŒYYYÇ7n©/–ÒôöÛoôÑG3gά¨¨ fÌdÀsÀîD`¼W¯^UUUÑ]E‡Á ®¬¬ôõõ‰DR©T*•ŠD"??¿êêjý—PRR²uëÖþýûçääDEEŸ:ujÑ¢Eº_€H’O?ýÔÛÛÛ××·ÓÞ9óúõ뜜gggC- Àÿþûï£GþþûïLJ„„Ì™3gÔ¨Qöööl6[(†……©®Ýt:22ÒÛÛ;44TõÏÐÐÐDEE­]»¶Åy«ªªBCC£££gÏž}ãÆ ƒ<ù¡ý8ðÅ_Œ7îôéÓƒ ¢»ªeggÛÛÛ÷èÑÃP äóù†ZèVQQñüùs¹\þòåK™Löüùs™L–““#“ÉJKKœœ\\\FŒáèè(z÷îýèÑ£ÿüç?ß}÷ÝòåË—.]Ú»woº·ƒ¹ÀqqqŸ}ö™fKPPЮ]»ô àaÆ=:33“iìmÛ¶999M˜0aùòå¡¡¡L#æ3ìñg‚ lll.]ºdÀ€Jee¥T*ÍÊÊzòäÉÓ§O³²²?~üòåK¡Pheeemm­ÊWGGG{Úž={6%%åûï¿8p ½½ýˆ#T7›8::ä©FƒAWAÛÚÚJ$Í»< †šŸŸ¯{F“'NÌŸ?ŸäÛ.??ÿ£>zôèÑñãǽ¼¼ôŸ±¡¡áêÕ«¶¶¶eeeUUUYYYÏŸ?ÏËË«¬¬|ë­·fÏžmiiI^ñm¶oß¾gÏž}÷Ýw†ZàåË—·lÙråÊC-€vUUUçÏŸïÒ¥K`` e+­¯¯øðaffæýû÷oß¾}çÎêêj@  û÷ïïââÒ¯_¿…Âv^7S__Ÿ™™yëÖ­k׮ݸq#??ÿõë×öööŽŽŽ®®®0`€‹‹KïÞ½9e×è´V§¸ ©{÷îUUU¦¦¦ê–ׯ_÷êÕëÕ«Wºg$ï·cXÇ߸qã’%KV¯^íè訣§T*½råJrrrll,Ç0`€L&+..¶´´433ëׯŸ³³³½½½©©éÙ³gãããÝÜÜFŒÑ¿@ Šj›®]»R¶iZ­ZµjРA}ô‘¡˜‘‘1gΜÌÌLC-€.•ÿ¿½{jâN…"@ä4\á@åæza=aÕb¥ v¡•®nn×µ»ÕjOíÁŠˆËe·µÂÂö´U¶EÀR¨"ŠÅ" —EHH„„Å„Ûïyß¼ó#q—ax> sÉ<ÏäË÷ÉÜåò+W®äçç—––®[·N(:::fffâzß„@ (,,,))©ªª²´´ôððpuuõõõõóóc2™ø­M¡Ptwwwvv>zôˆÏçóùüÖÖÖÞÞÞ¾¾>Õ>>îîîªãŽJ¥²±±±­­M__Ù²eFFFH¹QÕ~SSS …¢££cllŒŽÇ3NT*U©T¢Ç(•J==½I|Ujüñ_|¡š­¨¨H(ªþDOB …¢¢"“fþ ÙÙÙ #::úáÇêŸ022ròäIƒœššÚØØ8i r¹¼¢¢âôéÓëׯŒŒôòòb2™K—.EÚ¹¹¹››‡Ã‰‰‰9pàÀñãÇOœ8ÑÞÞ>Û!88øØ±c³¸%Ïž=kllÜßß?íO [{€OXlŸ T*³³³ƒ‚‚LLL¶lÙò¯ýëÌ™3ããã …âøñãFFFyyyUUUb±X›ärùG}TPPpþüù”””¨¨¨íÛ·ïØ±#***<<ÜÅÅÅÏÏÍf›ššêêêZYY%$$444yK677‹ÅâÇß¾}ûí·ßNMMýè£ýüüÂÃÃÝÝÝýýý×®]ëââ‚ÔQ]]Ý€€€C‡%''ÇÆÆîرÃÓÓ½GG¥R=<<¼½½###ÃÃÃ×®]ëéé‰ìî;:::::¢gž›BI¢}Ç™‚&OÚËå_|ñÅéÓ§Nž<Éf³‘ñƒƒƒ›7oÖÕÕ=þü¬¼Cwll¬··÷Ù³gb±ùµ(‘HÊÊÊø|þk¯½æïïܬÅápôôôf¾º \\\~øá‡Ù½úŒÇãñx¼={öÌâg€7¹\~ëÖ­ëׯ_¼xù5¼}ûvõ»3øá‡Ë—/····µµ-Y²ÄÕÕU$µµµŒŒèèèX[[³X,&“É`0d2Ùýû÷Ÿ>}êäääàà€ì2™LKKK]]]F¡PŒ‘I†††Dd?_)Š¥K—R©ÔEq:44ôðáÃ6lP¹qãÆÉ“'ËÊʰœw144ô÷¿ÿ=%%eïÞ½ýë_ŒŒx<“ÉüòË/ñ>Ò××wïÞ½û÷ï766677·µµ­ZµÊÕÕ¹ÎÂÉÉiÕªUvvv3 ÃØØ¸««kÂÁœÊÏÏ?wîÜ7fñ3ÀÃË—/îܹsùòåêêjd×-::Zûó„B!ŸÏ·¶¶vrr¢R©###B¡°££ù1mhhèççÇápÃ]?‹¢§¦¦>xðà믿Vyë­·üüüÞÿ}ìçiFH$’#GŽq¹\¢¢"]ݹ¾4ýåË—|>¹Óyšf__r}„““Ó‘#G¦zýv¿]ÿì†:44dccÓÔÔ4g§¬Ð^WWWrròÍ›7¥Ré‹/V¯^½f͚͛7GDD˜¦EQ€e2—ËOLL¤P(YYY999õõõ“¾qh^`DcccffæçŸŽ5"ƒ–––ǧ§§ïÞ½{ß¾}SZ¼¹¹yûöíx\0µwï^OOϤ¤¤Yÿd¦­»»û³Ï>ûî»ïvíÚÅ`0V¬XÇ™0÷ÅEXããã€ÇãÑh4ÆãñÐ× a [ LUU‹ÅR(SZêÆáááxÄSZZêëë;GGGKJJk¸˜----`0þóŸ{{{‰Ì>üJ ‰ÄA¡Pìíí ˆŽüüýýW¯^››› ýR]]]8ÝP"D"‘öG¡»»»ÿóŸÿ¤§§ëêêÊd²S§N½ùæ›xÄÇ_¾|¹¸¸ø×_ýýïߨØH¶§ò#WätôèÑØØØ={ö`\¦?P(´±±Á#ooﺺ:t~ñâ…ŽŽŽúüæææøøøGmÞ¼9777  ªªjÿþýGݱc‡··7N§Óévvv|>¿ººúÊ•+7oÞT(ºººŽŽŽ...ööööööL&“ÉdÒét###cccx¦Ïâ422rüøñ/¿ü’Çã½ÿþû›6m‚CÍ`z ƒÉr8œÔÔÔ¿üå/Z." ===qŠÇËË«¾¾~Ó¦MÈŸR©tÆ ÎÎÎß~û-z¶’’’Ý»wöÙgqqqªKÛÖ­[WSSSWW—ŸŸŸŸŸÿâÅ ©TÚÙÙ944Äáp¸\nBBB~~>Fnmmåóùííí÷î݉D}}}ƒƒƒýýý …B.—#Ÿ©ºs___ßÐÐN§K$±X<::ª1~&“)‘HºººFFFf¾M ß}÷ÝC‡Á~®ø|þÛo¿mbb2ážI¦§CÛsiadArȃA´‰¾Ë~výûßÿŽŽŽF†{zz¼¼¼<èíížž®š§¤¤„ÉdÞ¹s§ÐFFF¤R©T*‰DOž<©©©éìì~ÕüÃÃÃàîÝ»Ož<™ðð™i‰DIII‹çR[ƒ½{÷ÖÔÔÌÊÖÓ†R©àiƒ|¸²²¿222jkk à±”@È»I¤ÿK"‘ ¯Ö …ÝÝÝÝÝÝŽŽŽ,ËÁÁyCŽ™™ÙúõëÏœ9óÛßþ–èðað+1øÞ†$—ËCCC÷îÝûÕW_Q(”¬¬¬°°°ºº:×j¾þúë!!!—.]òöönjjJHHxöìY||<®‚i011¹zõj@@ÀÈÈÈÎ;ÕßmŒßS8T¼¼¼>ìîîÕhiéÒ¥–––¯º.A¡Püðÿýío­­­È$üƒ¥bll|ðàÁíÛ·ãºÀ¾¸©©‰Ëå¢Çxzzjù†œk×®¹»»ã˜5K—.åñxµµµo¾ùf@@@^^…B …x‚¦P()))«V­Â{-€|/_ÒÓÓD?@xxxØÈÈH¡P`/(•JÎ;4éZà",’hhhصk—‹‹KKKKVVV`` ÑÀLáWbðÝž‰DõüC›ê‹X¢É±cÇð Läááqÿþ}‹ÕØØˆ÷!h˜]ÇŽÓXJð[ãlvt ÈǪ?I,{{{‹D¢W}ˆP(ܲeËéӧô_/ì“JEE…¿¿?<3°Ì=à —Q(77·úúzô<>tuu}Õ'twwoÚ´)55Uûê H(88ª/`Ã÷tdd$rUŽJ^^ÞÖ­[5ÎÜÓÓ³qãÆäääÐÐP\£‡ïÁ[™LÆårããã)JVVVNNN}}½ê‰¬è]{ŸC‡íܹsªkCÐp2EÙÞÞž””TVVF¡PÂÂÂÒÒÒX,Öÿ­•˜ÆsÝ}}}t:{P€àdà9NæÇEXÐ`€P€@ `€P€Ée!½@r!­…”äBN )üà~mgggRRRii)…B‰ˆˆHKK³µµt)±XÔÚÚªMx é>`È…œR.”…•äBN‹6ðÝ–Ëå¡¡¡>>>>>>aaaÿýï±—ß½{÷'Ÿ|‚klðý‘ræÌ™ššš¯¿þZ5æ­·ÞZ³fÍÿøGŒ¥RSSëêêòòò´üÝ?µÈ r!­…”äBN‹6ðÝ...Ž‹‹C‰‹‹+,,ÄX¤®®îܹs™™™¸ ßÜÔÔÄårÑc<==›››_5ÿÐÐP\\\NNFÃ50€Xø%ÐÓÓ¤R©ª1ÃÃÃFFF …Bãü‰‰‰ÖÖÖGŽùŸààô|¹ÖBJr!'ÈEºx|èô655eddLcY¯2œ§ rZH¹PV: 9-¤\p2›½¹‘ß ¦¦¦R©ÔÒÒR5þùóçfffÿÓŸþTVV¦££3Õõ.˜ßYÙ<<Ž‚Œqss«¯¯GÏóðáCWWW‹?yòÄÞÞ~ …BQ ¾aEFFæåå¡ÇäååmݺUãÌãjT#q ˜{øž'—Éd\.7>>>11‘B¡deeåääÔ××/_¾üVyr{!ÆÐðݦÑhååå÷ïßg±X,ë—_~)++SU_`Ñ‚]L€ð6$€P€@ `€P€,„ÜÙÙ¹mÛ6cccccãmÛ¶=}ú”舴uïÞ½øøx===kkëðððï¿ÿ^5µ¢¢"::ÚÜÜÜÄÄÄßßÿÒ¥K†ª±±±ôôt777ww÷ .hœM,;;;“ü £¥¥¥Ë–-333‹•H$è©ZfJ”¼÷Þ{t:]}#c7ªÑÑÑÌÌÌ×^{N§›˜˜øøødffŽŽŽÎaì`¤C™ì» [ç€ F«#[o€öÑ’¡7˜4Ú%jÐSgÔ¨?r~‘Édl6ûÓO?•J¥R©ôÓO?uvv$:.­øùùeddðù|…Bñüùó’’//¯£G"S)JHHHeeåàà`uu5—Ë=wî±c{÷Ýwããã[[[ Å/¿ü²iÓ&õyÆÆÆ6lØðÍ7ß¹íýøãfffÙÙÙ======çÏŸ_ 1•PÅIDAT·nÝË—/U3h“)\]]?þøãÆÆFõŒÝ¨öïß¿víÚ[·n ô÷÷ß¼yÓ××wÿþýsþDéŒc~$ì0rÁnudë °ãÑ2Z’ô“F‹ÞLzòv‚ZJMM‰‰A‰‰‰9{ö,QñÌPkk+NG†?øàƒ±±1Õ¤úúz6›MP\“+//ŒŒœt¶Ó§OÇÆÆŽOÖ¦‰œ““ƒsþüùÌÌLdXËLÉ@}#c7*&Ðó †gŒS žöwAæÎA=ìVG¶Þ;-£%Io0i´áͰ7 o'¨¥’’ô˜’’’ÐÐP¢â™¡ŽŽƒ¡qÒàà žžÞÇ£½;w^¿~{žÚÚZ‡3000Nô¿¶eË–õöö¢Çôôô„‡‡#ÃÚdJ“nä ÊÜÜ\½[XXàÛ4¨§ƒý]¹sPÏ»ÕM@¶Þ;SIÛ¨G‹Þ {ƒy¸©©‰Ëå¢Çxzz677Ï´õ÷÷#§"W¨»víš»»ûG¥½ªª*¹\þúë¯Òh´ððð;wî gŠ‹‹ËÉÉ¡ÑhD9ÈaCŠ™Î#Õþð‡;wÞ¾}[&“Éd²ŠŠŠ7ÞxãÀFˆ û»XƒªÕM@¶Þ;õ©dî 4æbeeE¥R™LfLL ŸÏWŸio0íÒMT*U©T¢Ç(•JRý6œú눈ˆQŸçùóç«W¯®¨¨˜û𴤯¯Ï`0Ðg° ÆíÛ·U3ìÛ·ï“O>QýIæ¶”››‹“­jT“fJØY½QñxäðÊ•+322pS[êé`dî4¶ŒVG¶Þ;ž©FKlo€mhhh~~¾H$R*•mmm'NœX±bEMM 2u†½©;A- G£Ñh4Ç›pvÌÊËË÷»ß1 ]]]&“¹mÛ¶{÷jüÁÔ××G`Àغ»»cbbLMMõõõ×­[‡}6…äø»ï¾suuÕÓÓãp8iii£££è©SÊtîaüÔž´Q]¼xÑßߟN§Óéôµk×^¸p $þöžöwA¶Î;ŒVG¶Þ;ž©FK!´7À޶¬¬,** é¥mllbccù|>zñ™ôK^µzàgÞŸæ#(À €  0@(À €  0@(À € àÿø½ú±þ|§IEND®B`‚gsl-2.7.1/doc/images/fft-complex-radix2.png0000644016036000116100000003510213373111455015365 00000000000000‰PNG  IHDRX p‹“bKGDÿÿÿ ½§“ IDATxœíÝmlS÷ÝÿqûNn m®ÜTKˆ­­"´^iY!0M£ŠXyБö`puáAŤMšF/á4TꦵiEËºŽ’áD…JåfÚmM5š´F"QE¢„  Rî¡Íù?pÿ¾NmçÄqü;wß÷ëQr|÷ý:ö÷ãs㯦i¤ú/« ÀJ!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆf£ <}úôÓO?ŸŸ¿dÉ’Õ«W?~ÜêŠî·ÀêþÏúõë7lØpüøñ•+W^¼xqçΟ~úéŽ;¬® àf^ûü?Â_üâ¿ùÍo¼^oôמžž§žzê“O>±¶*€»Ù(ãLNNÞÿýwïÞµº€›Ùhaœ¿üå/+V¬°º €ËÙtpddä‰'žxóÍ7«ªª¬®àjšý ¯[·®³³3Åë/X`£C~Š( ÛEȵk×~ðƒ¼üòË6lHñ&Ÿþ¹fËõÚyòzmº¾>Oôå8nm¾œ%v(eÆÙ+¯_¿þä“O¾úê«ÕÕÕV×ÁFËܼysãÆ/½ô)0‚pãÆ¿úÕ¯¾ÿýï[]@mJNºý÷öíÛ¹¹¹³ÞÐ>]d}9‹[ûò¸·5úru}Ùh¡+ÿr›³Ñ¦QÌGÚ×Þ½{­.A úr·¶F_ˆræd·nĨõ¬D#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€hʃðüùó»víÊÍÍõz½³^Ù›@uyá”á¶mÛ Îž=›âõµ¯RZ^ÓÂÆëý±R¹N¦npu£ž}„Ñl„EEE>ŸïÁ¬¯¯ïííµº€ËÙ+kkk;666ÖÕÕµjÕªõë×_¸pÁê¢nf¯}„q~÷»ß8qâý÷ߟõž“.ß»wo8žÓ#¬‡“^¤(°l„7nÜ(++Ïø=œEèÁ2Ä@5[áÑ£G׬Ycu7[`íÃëWukjjÖ®]›——788ØÞÞÞÜÜÜÑÑam…wS¾F¨?Yšñ‰ÓöìÙÓÖÖ¶bÅŠE‹UUUõööž9s& ©® ™3á`p=¡Ë A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4{áùóçwíÚ•››ëõz­® ‚½‚pÛ¶mgÏžµº€^MÓ¬®! ¯w…ÍéÊ'R7êíµF8W‘H$ z<ž`0¸k×®`0˜••UPPPPP••5ë´o‰D¬n€hÑéÇÄË›®K¥’üííí;w˜0§$=¿ßðàÁºº:óLž~6™xêÖ„ååå}}}æÔ“ôÑ/]ºdÕ£Ìüég‡‰Ç¦Ñ$-|ô €dæO?3'^8ö&£î„%%%>zqq±…@2ó§Ÿ™/kɨ{Dacc£ßï·ä¡ý~SS“% &O?×O<a]]]KKK ðx<@ ¡¡!ø|¾üüüüü|ŸÏ7ë´oÕÒÒ²uëV«ŸBŦ/#|°LzW8‘ºQ¿@ŦM¿;4ö3!PÇ^AHæLæà}„ÌA ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€hʃðêÕ«[¶lY¼xñâÅ‹·lÙ200`peoÕå„S„ãããÕÕÕ¡P¨¿¿¿¿¿? ÕÔÔLNNÜDû*¥åàU6ÍÍÍçÎ;räHlÉ3Ï<óØc=÷ÜsÉ«ñ¦SOz·8ˆºQ¯vðÔ©SÛ·o×/Ù¾}û‰'”>(©S„/^¬¬¬Ô/yä‘G>þøcƒ›ù|¾|°¾¾¾··Wiy¨ ÂÛ·o?ðÀú%yyy###3]¿¶¶öرcccc]]]«V­Z¿~ý… ”VÎ^_Ÿ8qâDUUÕÂ… ‹‹‹wïÞ‡ùË_¦rÃÄÃM½^o8V\/ ÃÂápÒ‘®îÕfRXXØÓÓSXX[2<<¼råÊ¡¡¡Tn~ãÆ²²²ññqã«q° ¸žS–©¨¨èîîÖ/éééY¾|yŠ7'Þª© ÂM›6µ¶¶ê—´¶¶ÖÖÖ¦xó£G®Y³FA]|IíFű±±ÊÊÊ;v444x<ž:t¨»»Ûï÷ùðºUÝššš†††µk׿åå ¶··777wtt„B¡Yz`Ó(¸S7æäätvvvuu•–––––~ôÑG|ðA,ãìÙ³§­­mÅŠ‹-ªªªêíí=sæÌ¬)À|¸a]Š5Bp=§®`s!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„Ñì„W¯^ݲeËâÅ‹/^¼eË–«+¸œ‚p||¼ºº: õ÷÷÷÷÷‡B¡šššÉÉI«ë¸™WÓ4«køRssó¹sçŽ9[òÌ3Ï<öØcÏ=÷œñ ½^uPAá¨×lcÆ ú%ÕÕÕ³ÞÐü.Ž9|>_~~~~~¾Ïç  Ñ…úŸ“^[Yu+[#¶·ÞÊäbŽ9bòܳœºQo£ ,((Ö/***šõ†&a[[›ßïWò©Rã÷û#‘ˆ™£Ïre£ÞF³²²&&&|>_lɽ{÷î»ï¾»wïßÐäM£ååå}}}¦=$U^^~éÒ%««0ºQo£ƒeæÃ›L8>xð`ì:§Nº~ýzìWýEúŸ¯_¿~êÔ©¤EïappPU²èqõ*¦œµ÷PWW—t¤'<c£5žžžÂÂÂØ’ááá•+W ßÐä5ÂeË–}òÉ'¦=$UVV&j‰X#¬¨¨èîîÖ/éééY¾|¹Uõ̤±±‘}„¬å÷û›šš¬®Â%¾‡­®áKŸ}öÙûï¿ÿÔSOÅ–ìÝ»·ººzõêÕÆ7lll4³‹‡~¸´´ôüùóyyy~¿ÿÞ½{K—.ݺuë§Ÿ~:11¡ÿ9鸕U·²U1b[pë­L.¦¹¹¹®®Î´¹gêF½6ŽUVVîØ±£¡¡Áãñ8pàСCÝÝݳ®~ñ=Bp=›Fsrr:;;»ººJKKKKK?úè£>ø€¥Ü°.Å!¸žˆ5BÌGD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚оÂá°Õ%(A_ŽãÖÖè Q^MÓ”>ÀÕ«Wö³Ÿýõ¯õx<ßýîw_}õÕ’’’«ñzã–¤Rž×«¼ KЗ³¸µ/{[£/gQ×—Ú5ÂñññêêêP(Ôßßßßß …jjj&'' n¢}•ÒòPûÁ¡¹¹ùܹsGމ-yæ™g{ì±çž{.y5i>œ…¾Ç­­Ñ—³8uðÔ©SÛ·o×/Ù¾}û‰'”>(©S„/^¬¬¬Ô/yä‘G>þøcƒ›ù|¾|°¾¾¾··Wiy¨ ÂÛ·o?ðÀú%yyy###3]¿¶¶öرcccc]]]«V­Z¿~ý… ”VNSÉçóMMMé—LMMeee¥xó|ï{ß›õjV?…3¤“C)Èä¾Gý—¢w[XXØÓÓSXX[><<¼råÊ¡¡¡TîðÆeeeãã㙪€8™Ü4š¸–VQQÑÝÝ­¿NOOÏòåËS¿Ã –@"µû7mÚÔÚÚª_ÒÚÚZ[[›âÍ=ºfÍuð%µ_7«¬¬Ü±cGCCƒÇã9pàÀ¡C‡º»»ý~ÿ—¯û^HMMMCCÃÚµkóòòÛÛÛ›››;::B¡º ©]#ÌÉÉéìììêê*-----ýè£>øàƒX ÆÙ³gO[[ÛŠ+-ZTUUÕÛÛ{æÌR ”;O@@ŠøïÑB€h!@4‚ A ˆæ† ¼zõê–-[/^¼xñâ-[¶ X]Q:NŸ>ýôÓOççç/Y²dõêÕÇ»‚ Ú^¶l™þœ´'÷5==½ÿþŠŠŠ… ®X±âwÞÑ_êܾ¾øâ‹7Þxã[ßúVnnî’%KB¡Ðo¼ñÅ_Ä®à ÖΟ?¿k×®ÜÜܸW]”q#vnÓ /GOã¿WLÆ'‰ãƒp||¼ºº: õ÷÷÷÷÷‡B¡šššÉÉI«ëš³õë×ߺuëøñãCCCû÷ï‡Ã¿ÿýïc—º MMÓ~üã¿ð ú…Žîk×®]==='Ož=|øðáÇc9º¯Ý»wÿñlnnhnn~ûí·wïÞ½ÔY­mÛ¶­  àìÙ³‰7bó6 úrô$1è+FÉ$Qô_-LóÊ+¯Ô××ë—Ô×׿öÚkVÕ“¶ŸÿüçÓÓÓ±_»»»ËÊÊb¿º Í—_~yÛ¶mš¦é_uÎí«³³sÓ¦M3]êܾ4MËÉɹ|ù²~ÉåË—srr¢?;´µÄYg܈SÚLìË“Ä ›TLÇᆠ:::ôK:::ª««­ª'S&&&ôÿ¸Ñémþûßÿ~衇FGGµ¯¾|Û×~ô£÷ߦKÛ—¦iùùù‰AXPPýÙ¡­%VãFœÒæ¬+3$3õ¥h’8> †‡‡õK†††ŠŠŠ¬ª'SÞ}÷ÝP(ûÕÑmNNN>üðÃÿüç?£¿ê_¾Îí«´´ôÝwß]·nÝ׿þõû¦¦æÌ™3±KÛ—¦iápøñÇ?}úôèèèèèèßÿþ÷U«V555E/uhk‰ƒÕ¸§´9k:t’$íKÝ$q|ú|¾©©)ý’©©)ý' 'úì³Ï¾ùÍož>}:¶ÄÑmþô§?}á…b¿ê_¾Îí+;;;//ïøÃÍ›7oÞ¼ùÖ[oåååýãÿˆ^êܾ4M›žžÞ¼y³~ÊæÍ›c[ÛÚZâ`5nÄ)m¡s'IÒ¾ÔM‚Ðv†‡‡×­[×ÙÙ©_èÜ6?^UUõùçŸÇ–¸#}>ß¡C‡ôKÞzë­ï|ç;±KÚ—¦i¿þõ¯—.]úÞ{ŒŒŒ¼÷Þ{K—.ýío½Ô¡­ BGO’ľ”NÇ¡SÖôS488XYYù·¿ý-n¹sÛ,++»råŠ~‰;6ݺuK¿äæÍ›‹-Šþìܾ4M ~ø¡~ɇ~ £?;´5i›F>IûR:Iÿõ‰ŠŠŠîîný’žžžåË—[UÏ|\¿~ýÉ'Ÿ|å•Wjjjâ.rn›}}}@À«ãñxb?8·¯ŠŠ ãKÚ—Çã¹víÚ£>ª_òè£^»v-ú³£[Ó3nÄÑm2IëyœÜ×øÃ?ÿùÏú%úÓŸV­ZýÙ¹}y<ž¥K—ž;wN¿ä_ÿúWIIIôgG·¦g܈sÛd’DÍ­¯×mktt4 ¾øâ‹Ñýûöí+++·º®9[¹re{{ûL—º¦Mí«4œÛ×þóŸ'žxâðá÷nݺuëÖ¡C‡òòòbûcœÛ—¦iû÷ï/--=yòäíÛ·£û‹‹‹_ýõè¥m-qÖ7â”6ûrÇ$I%›28I„š¦]¾|yóæÍ999999›7oŽÛŽìI?¦Ü¾};vw´©%¼ÄÛ×õë×ëëëï¿ÿþìììoûÛqûcœÛ—¦iG]½zunnnnnîã?þÎ;ïè/uPkÆŸþ±s›}9z’Ìim-ƒ“Ä;Óc ã÷0!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4áéÓ§Ÿ~úéüüü%K–¬^½úøñãVWp¿VðÖ¯_¿aÆãǯ\¹òâÅ‹;wîüôÓOwìØau]7ójšfu _úÅ/~ñ›ßüÆëõFíééyê©§>ùäk«¸›‚0Îäääý÷ß÷î]« ¸™öÆùË_þ²bÅ ««¸œM×GFFžxâ‰7ß|³ªªÊêZ®¦ÙÏðððºuë:;;S¼þ‚6:ä ˆ¢Ð±]„\»ví?øÁË/¿¼aÆoòùçŸk¶\¯'¯×¦ëëóD_ŽãÖÖèËYb‡Rfœ½‚ðúõëO>ù䫯¾Z]]mu-lt°ÌÍ›77nÜøÒK/‘‚ÓØ(7nÜø«_ýêûßÿ¾Õ…±Ñ¦ä¤Ûoß¾››;ë íÓEÑ—³¸µ/{[£/gQ×—öºò/°9mÀ|¡}íÝ»×ê” /Çqkkô…(7lJvëq@ŒºQÏ!@4‚ A ˆFD#¢„Ñœ„‘H$ z<ž`0‰D¬.à<þ*z{{ûÎ;'&&¢¿úýþƒÖÕÕY[@u_¨wp–——÷õõÅ-¹té’UõÔ!“X¸páÝ»wõK²³³ïܹcU=u8ÅZ%%%qKŠ‹‹-©à\ÂÆÆF¿ßûÕï÷755YXÀ‰„uuu---@Àãñ–––­[·Z]Àa¼0†Ã®Ç>B” ¢„ÑÜ„ÑÓ­eeeqº5˜'QÕ ‡™x½Þ¶¶6N·aÏXrf#^¯·¬¬ŒÓ­@FØó–¡¯×›ÍéÖ #ìyK¾>1 N·™"m¢º$9ÝdŠ´‰ê’ ŒnÍçóqº5˜iÕ%û]ÐÀûP‚ ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4a$ ƒYYYÁ`0‰X]8ƒØáéÕ4ÍêæËëý¿.ÚÛÛwîÜ911ýÕï÷Ã÷ì² ,//ïëëÓ_Z^^~éÒ%+êǰÿðT„Ê7ž?~×®]¹¹¹^¯wÖ+{Ìõáã– ÌõN@ÉÃSynÛ¶­  àìÙ³)^_ûª¹>\IIIÜ’âââ¹Þ H#yx*‹/†Ãኊ ÕÕØØè÷ûc¿úýþ¦¦&sœKòðtÛQ£uuu---@Àçó–––­[·Z]ØäáiÞÁ2©ìçôz½………Ÿ}öÙÿ÷WWWÿïÿþïC=”‘{8šƒ–™“ÚÚÚcÇŽuuu­Zµjýúõ.\°º(€›Ùk0Îï~÷»'N¼ÿþû³ÞsÒå{÷î ‡ÃszD€µÂápcccÒ‹ÿ=Â4‚ðÆeeeããã¿g€³HÙ4‡x¨fë qÚž={ÚÚÚV¬X±hÑ¢ªªªÞÞÞ3g΄B!Õ$sÃa&,®'ô`T#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ AÍåA‰D‚Á`VVV0ŒD"V—¶Ãœôjšfu óåõ&½}çÎÑ_ý~ÿÁƒëêêÌ­ìËAsr¦QŸ{vq–——÷õõÅ-¹té’Yu€Ý9hN„Ffzv.\x÷î]ý’ììì;wî˜U؃椺 tó>Â’’’¸%ÅÅÅ–TöÄœô¸;ý~ìW¿ßßÔÔda=`7ÌI»ƒ°®®®¥¥%ø|¾@ ÐÒÒ²uëV«‹aNzܽàì#@ ‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4{áùóçwíÚ•››ëõz­® ‚½‚pÛ¶mgÏžµº€^MÓ¬®! ¯w…ÍéÊ'R7êíµF€ÉB€h!@4—¡7™p8lu]€¹ ‡ÃIGººG´éa&,Ðã`” ¢„ÑX]ÀWèw‡Æ~fÿ@{!™0›F¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„Ѥa$ ƒYYYÁ`0‰X]X‰‘¨çÕ4ÍêæË륋ööö;wNLLDõûý¬««3¥:°‡ŽÄYG}ú÷,!ËËËûúúâ–\ºtIq]`G‰¡‘YŸ… Þ½{W¿$;;ûÎ;Šë;rèHT„"ö–””Ä-)..¶¤°#1Žˆ lllôûý±_ý~SS“…õ€…‰qDa]]]KKK ðù|@ ¥¥eëÖ­VÖ`$Ʊàtì#@ ‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑB€h!@4‚ A Ó ëIDATˆFDS„W¯^ݲeËâÅ‹/^¼eË–ƒ+{¨. œÚ ¯®®…Býýýýýý¡P¨¦¦frrÒà&ÚW)-¯Ò°inn>wîÜ‘#GbKžyæ™Ç{ì¹çžK^7zÒ»ÀAÔzµk„§NÚ¾}»~ÉöíÛOœ8¡ôAHÚ ¼xñbee¥~É#<òñÇܤ¨¨Èçó=øàƒõõõ½½½JË@mÞ¾}ûÐ/ÉËË™éúµµµÇŽëêêZµjÕúõë/\¸ ´B€pöúúĉ'ªªª.\X\\¼{÷îp8üË_þ2•&nêõzÃá°âz‡“Žtu¨ö0“žžžÂÂÂØ’ááá•+W ¥ró7n”••_ƒeÀõœz°LEEEww·~IOOÏòåËS¼9ñPMmnÚ´©µµU¿¤µµµ¶¶6Å›=ztÍš5 êàKj7*ŽUVVîØ±£¡¡Áãñ8pàСCÝÝÝ~¿ÿˇ׭êÖÔÔ444¬]»6//opp°½½½¹¹¹££# ÍÒ›FÀ휺i4''§³³³«««´´´´´ô£>úàƒb)gÏž=mmm+V¬X´hQUUUooï™3gfMAæÃ ëR¬€ë9u›#¢„ÑB€h!@4‚ šÄ ŒD"Á`0+++ F"«Ë“0ý’rÃ7ðæôå’ööö;wNLLDõûý¬««SV؂ӧŸºïŠ Âòòò¾¾¾¸%—.]RP؈ӧAhdNÏÎÂ… ïÞ½«_’}çÎu€8}úqf™Œ)))‰[R\\lI%`&¦ßLÄacc£þ¬ß~¿¿©©ÉÂzÀL¿™ˆ ººº–––@ àóù@KKËÖ­[­. ”cúÍDÜ>B€±%B€h!@4‚ A ˆFD#¢„ÑB€h!@4‚P­H$ ³²²‚Á`$±º¶Ã”°œNWmÛ“n···ïܹsbb"ú«ßï?xð`]]µU°¦DêøõFl„ååå}}}qK.]ºdU=ì†)‘:‚ЈmƒpáÂ…wïÞÕ/ÉÎξsçŽUõ°¦Dêø7LŽTRR·dzzš=bû§§§ã.*..¶¤$ÉB%¢¯òË—/{½^ýò{÷îÝ»wïÊ•+Ï>ûl[[›Uå°P{{û³Ï>{åÊ•è@Ð_äõzûûûù¬l2›nTœ»mÛûíõz¿öµ¯y½Þ¸W<{™÷ ú|¾ééééééØ(㨙Dì#4b· Lº÷{``€=<3ì,..æ¨cì#t’ÁÁÁ¸%‰û ÙÈ”t$fU$A˜yI_å~¿?¶Äï÷755™[[H: ø¬l!‚0ó’¾ÊëêêZZZ€Ïç ---[·nµ°HVI: ø¬l!{í]KÝöz<žH$òüóÏ_»víßøÆ¾}ûêëë­®€Ý17Œq°Œ! ³8X%B—ãÄö€Þ ð„–0í½§?Å•+W~ò“Ÿðž¢ïÁ lÛ¶-öQ}¾'B×¾4çsVmmmqdžE"EUVV6Óß]éãv÷Ô+//7çAy¦AݨwÃa&Î:XÆÌÿº’x s°³Ä÷`Œºó=ñï–æƒe Åífž?"ñ+ºæ<.`g‰ïÁußaŸëŸí¨f"3#noœÁÎsÎ1Ó¿¿Pý¸ÆxoÃcƒ—ÁL³³³GGG6§7~êó™¡h“«™ìÐEâÞ¸™v6D"‘¸]mmm™-&no„×ë]°`A~~~vv¶ÒÇÉ‘#G@ô_pè `‰@q/Îìììüüüè VŽ9bN qïÁ™Þ ™}}ÎéŸú<Eݨ·>BæÏA¨ ÅÞá3]9 êÞü3½‹ôÛÐР´†KL0 úÉ·?kŸ à2~ý›=©?ósš'r„Fì„åååq/ܲ²2«Š™õ]d“#WM{oÇêOýs*Æ’²|…,ñÅ©4{bf}ÍÛ*{l5OìCݨ·>BæOݳ“:6x¦nÖw‘™^ ŸÏç³v•Ôãñx½^2`¦$Žn”3'„¢5ì36g…Ì Êì™õ5o«ì±Õ<±Ah@ݳ3'öÙæ6ë»È„¿±gÃçó >F°Á*©9'± ¤XƒÇIJ™¨ûl4ëkÞnÙcŸyb‚ЀºgǹŒßEª?üL½è:Pb:Z²JjN©$±ÒR¯ÁÌ2¯×·~¬—ñO©¼æÉ›ó„Ô=;n¥úÃoâÔ‹û¤o·UR¥b+Ý#•b ê6Ïô7ø3eö“ÝVøAh@ݳã,sú<«ôÃï¬9gá*iôðÄ=U*v¥²W,FéÓÄ'Ü`…LÅvÚYÿâf~6šõIfÕО<¡uÏŽƒØêL†³N=ËWIã PqðäLa}¬¸oU*Ê!ƒÃe£OøLQñí´³þÅís¬Š­ÞJÐó„Ô=;’ö *>ü¦’súñJeõBõw*’îÓ÷¨z«`êß”P·6–úWW}6JãåÍ—Ùm‹ 42ŸgÇòm ™* ½Y–Ù¿i|a_ѧï9­^(|©ÿEåPê})Z›ë7ãŸÒ{ueüÏáš!c9 ìïïê©§rrrrrržzê©«W¯¦r«´ŸË·d°€ôfY3 ½^…МV/åPêE9”z_ŠÖÆÒûãfðM‘^™ýs¸iÈXÎ#!ÇÆÆÊÊÊöíÛ722222²oß¾eË–MLLÌzôŸË·d°€ôfY3 ½^Ô}úN}­BQ¥þQ”CsêKÅé÷ÒûãfðM‘^™ýs¸iÈXÎ#!_yå•úúzý’úúú×^{mÖ¦ýìX~R¥ÌÆ f@z½ØáÓwf_z‰¢"‡ÒëËò­|S¤ýêÊà¶D— ky$ᆠ:::ôK:::ª««g½aÚÏŽåªY^@3 ½^lòé;Sƒoþ)¢n¯­ù‡Š¤÷ÇÍà›Âß´ü=nyä‘„ÃÃÃú%CCCEEE³Þ0ígÇò÷‰åh™Ë€´{±Õ§ïy3ÿ™ÿ=̳Ë·R¨[A·ä8Ëßã–A"‚ÐçóMMMé—LMMeeeÍzÃù<;–¿O,/ ƒæßË<ïaž~ç¿66ÿ™ç=Ì¿…Œ¬@Ìóïè¦7…fƒv,/ SB#žìÝ»·¥¥%vµ“'O^»v-ö«þ"ýÏ×®];yòdÒ‹¸¥÷8Ä_ýõ9ÝCâ‡ß7Þx#õ{Hº66§.’¦ˆ™÷ŸŸŸØ‚6—¿ÅO~ò“¤+©ßÃŽ;’†±_“܃%÷°uëÖ™¦º¦†‚ÐüM£óg‡Z¬!½»ÊTÙ;5Ÿbæ¿>7ÿÍP󼇌lØ´|ûðü‹±üM‘A–`"‚ÐüƒeæÉ_ÐÉ` éÝU H{ˆgjRdä Ãùó9Ÿï•güȈ4žÛ îe´ü5iù{ÜòlED¾üòˉ_ŸxõÕWg½¡UAh‡/èd°†ôî*ƒ¤7Ä38),ÿ¾Áüï6³GF¤WCÃØòפåïqË °„  ƒ/¾øbì õeeeããã³ÞPݳcÌ_ÐÉ` éÝU Hoˆ«Û—⺢Q5×»UqîÖôZË`[þš´ü=ny¶â‘„š¦]¾|yóæÍÑS¬mÞ¼ùÊ•+©ÜJݳcÌ_ÐÉ` éÝUfŸ„4rHѤH}eHQsº[Ek¥sªAÅ9,MZþ·¼[ñ Âô¨{vŒeü :Ö~é*½»Rô-¥Ô'»¢Iaù«ípÞðÔkP”Ä–¿&-ÿv¬›¾8‚ЀºggV< +íQbùr*Žj›u²ÏúŸöæ)õä÷Ÿ3UÀœþc¢¢µÒ¸¼^ï‚ ’ nW–å¯É4îÊòÓ¹AhÄÂ Ì gíWýæ4žì©ÿ§½´%® Åýk߸ B"ma¬±+$þGÃLm@›)ìã&»­þ¿¼åœõ^v‚Ј;‚ÐV{Å‡Ž ‡t'æþ¿Úš0hâV†â*Y°`¢ÿ¦›Tb¿>ŸÏøÜgvÚLO¸ I•ÊKÎ>Ii«÷²›xBêž3Ùg¯ø¬CÇŠ®ü%]žÙ4Ã)Ÿ”ºa—8X“Š[gUZ€×ëµCÇØêûvöy/»Œ‡ 4 îÙ1ÓœöŠ+ýð;ëÐ1ço´Ç™F­™ƒ&ÅRWCâ`MJ]§X€™I׬9[#S|ßq„‹"‚ЀºgÇd)¾ÍTøuè˜ù7•R=hR‰¥5l§5ç¯bf&q\³&|8›ÓûÎ>ÛiÝÄCP÷ìØ“ê¿ljD¿¦è8É‹‰c 1ˆuë@qfÝN«úÓ@¬ƒutÓ’XxTô5™XUÆ‹áËyBêž{Rýá7Åÿ*Ž“œk1¦ízQúM‰9Iý+ ŠÌôÑÄ´$Ž;†Ö´b8Ær‚ЀºgÇžLØ2™âq"æ|"Vý•ÁôŠqÇÿIƒåIœ¸f¦§?º8³8Ær¡iAhæ®xãÞæ"¶CÁÚ¿‚U¯I±AhÄ}A8ë 1mï¢ã1ÌgákÒ>oL™B#. B[}#Ê`Ÿˆa Û¾&mõÎu%‚Ј˂pÖ³x˜üaSÅæÃò×dÒ7#‡•ª¦nÔ{£÷îh^¯ºˆY¸páÝ»wõK²³³:´sçΉ‰‰è¿ßðàÁºº:+ DkooOúfLúνsçŽ5º“ºQï†qY.[¶ì“O>Ñ/ñù|Ÿþy\ååå—.]2·4žòòò¾¾>ý’ØÁÕ÷îÝÓ//++‹{/c>ÔúÿRq§˜ÆÆÆ¸] ÷îÝKüó ˜X€/ Æ-¹÷ÿéúýþ¦¦&ëBúÂtD"‘`0˜•• #‘Hfï¼®®®¥¥eÖ¯ñgöq¤¢¤¤Äà񯃠ZZZ¶nÝšÙ‡V:yDS´ïÑL&waæ±a3}eŠ#6«ŸíHÝ9*UݨwÃÞ5“÷&î!P·».q¡×ë---Ý·o_}}½ŠG0«H$òüóÏ_»vÍcâ~A3'=±ÐF÷¨Û]·¿0úðòåˤ `¡úúúË—/OMM½ýöÛqïPuûÍœ<Ò„s–¸‡@Ýî:ýþBE{¤ÍÌw¨™“G6ÎY[[ÛÿüÏÿè¿Eôæ›o’O”bò°iT¹ÔÇb- €ùæ4y8¾tNX#ôxf>UD&ªS¹u qf#óv8 €k¸u „Fæÿìp’@®áÖÆ>Bµ8 €k0ÐæŠ ôx’}]“p(Ú\„‚pÚ\±àì#@ ‚ A ˆFD#SÅIlØ)ƒÜðž>áÖ“Øp"™‰s1!Ýz[N$s"„FLB·žÄ€ÉœH|¡ÞbœÄ€}0‘2‹ L '±`L¤Ì"“H<‹“ذ™&‡’¦‡}„ñdŽÀé\?»8XÆHfŸ™‡cp:×Ï.‚ÐHfŸ™‡cp:×Ï.Ž5OâáXSSSlp`O±ý‚ÓÓÓqq(iŠÂxq‡cy<MÓ®\¹òì³Ï¶µµYU$jooöÙg¯\¹rïÞ½{÷îé/âPÒÔ±i4‰H$òüóÏ÷÷÷ÇÝ­Ë6¸pºÄý‚>ŸÏãñ|ãߨ·o_}}½Eu)Á>B#Šž×opàt¢Æû-À¹Øc*#Âqî6ǘÊ‚pFœM€Í1¦2‚}„`!J„ö‡­.A úr·¶F_ˆR¾QñêÕ«?ûÙÏþú׿z<žï~÷»¯¾újâaNÿW×·$•òܺi”¾œÅ­}yÜÛ}9‹S7ŽWWW‡B¡þþþþþþP(TSS399ipí«”–€ÚÍÍÍçÎ;räHlÉ3Ï<óØc=÷ÜsÉ«I+ðùøã,ôå8nm¾œÅ©k„§NÚ¾}»~ÉöíÛOœ8¡ôAHÚ ¼xñbee¥~É#<òñÇܤ¨¨Èçó=øàƒõõõ½½½JË@mÞ¾}ûÐ/ÉËË™éúµµµÇŽëêêZµjÕúõë/\¸ ´B€tšJ>ŸojjJ¿djj*+++Å›8pà{ßûÞ¬W³ú)˜!JA&÷=ê¿ü½ÛžžžÂÂÂØòááá•+W ¥r‡7nÜ(++ÏT…ÄÉä¦Ñĵ´ŠŠŠîînýuzzz–/_žúf°<©ÝG¸iÓ¦ÖÖVý’ÖÖÖÚÚÚo~ôèÑ5kÖ(¨ €/©ýºÉØØXeeåŽ;<Ï:ÔÝÝû¿!úï…ÔÔÔ444¬]»6//opp°½½½¹¹¹££# ©« œÚ5œœœÎÎή®®ÒÒÒÒÒÒ>úèƒ>Ðÿ÷,½={ö´µµ­X±bÑ¢EUUU½½½gΜ!J¹ó¤ˆÿ> ˆFD#¢„ÑB€hn«W¯nÙ²eñâÅ‹/Þ²eËÀÀ€Õ¥ãôéÓO?ýt~~þ’%KV¯^}üøñ¸+¸ ÍáááeË–éÏIëqr_ÓÓÓû÷ﯨ¨X¸páŠ+Þyçý¥Îíë‹/¾xã7¾õ­oåææ.Y²$ ½ñÆ_|ñEì jíüùó»víÊÍÍ{ÕE7bç6 úrô$1þ{Åd|’8>ÇÇÇ«««C¡P(ª©©™œœ´º®9[¿~ý­[·Ž?>44´ÿþp8üûßÿ>v© ÚÔ4íÇ?þñ /¼ _èè¾víÚÕÓÓsòäÉÑÑÑÇ>|8v‘£ûÚ½{÷ÿøÇææææææ·ß~{÷îÝÑKÕÚ¶mÛ Îž=›x‘q#6oÓ /GOƒ¾b”LEÿÕÂ4¯¼òJ}}½~I}}ýk¯½fU=iûùÏ>==ûµ»»»¬¬,ö« Ú|ùå—·mÛ¦išþUçܾ:;;7mÚ4Ó¥ÎíKÓ´œœœË—/ë—\¾|9'''ú³C[KœuÆ8¥ÍľÜ1I ²IÅ$q|nذ¡££C¿¤£££ººÚªz2ebbBÿÞæ¿ÿýï‡zhttTûêË×¹}ýèG?zÿý÷gºÔ¹}iš–ŸŸŸ„ÑŸÚZâ`5nÄ)mκ2ãÐI2S_Š&‰ãƒ°  `xxX¿dhh¨¨¨Èªz2åÝwß …B±_ÝæäääÃ?üÏþ3ú«þåëܾJKKß}÷ÝuëÖ}ýë_¿ï¾ûjjjΜ9»Ô¹}iš‡üñÓ§OŽŽŽŽŽþýï_µjUSSSôR‡¶–8XqJ›³¡C'IÒ¾ÔMÇ¡Ï盚šÒ/™ššÒr¢Ï>ûì›ßüæéÓ§cKÝæOúÓ^x!ö«þåëܾ²³³óòòþð‡?ܼyóæÍ›o½õV^^Þ?þñè¥ÎíKÓ´éééÍ›7ëw lÞ¼9¶µÍ¡­%VãFœÒ¦q:w’$íKÝ$!mgxxxݺuú…ÎmóøñãUUUŸþyl‰;‚Ðçó:tH¿ä­·ÞúÎw¾»Ô¡}išöë_ÿzéÒ¥ï½÷ÞÈÈÈÈÈÈ{ï½·téÒßþö·ÑKÚšÀ tô$IìKé$q|:eM?Eƒƒƒ•••ûÛßâ–;·Í²²²+W®è—¸cÓhQQÑ­[·ôKnÞ¼¹hÑ¢èÏÎíKÓ´@ ðá‡ê—|øá‡Á`0ú³C[“¶iÔé“$±/¥“Äñ_Ÿ¨¨¨èîîÖ/éééY¾|¹UõÌÇõëן|òÉW^y¥¦¦&î"ç¶Ù××¼:'öƒsûª¨¨0¾Ô¡}y<žk×®=úè£ú%>úèµk×¢?;º5=ãFÝ&“Ä3Ǿ„›6mjmmÕ/imm­­­µªž´Ý¼ysãÆ/½ôRuuuâ¥ÎmÓೞÇÉ}ýð‡?üóŸÿ¬_ò§?ýiÕªUÑŸÛ—ÇãYºté¹sçôKþõ¯•””DvtkzÆ8·M&IÔÜúJqÍѶFGGƒÁà‹/¾ÝŸ±oß¾²²²ññq«ëš³•+W¶··Ït©kÚÔ¾ºAù}ýç?ÿyâ‰'>|ëÖ­[·n:t(///¶?ƹ}iš¶ÿþÒÒÒ“'OÞ¾};º°¸¸øõ×_^êÐÖgq#Ni3±/wL’T²)ƒ“ÄñA¨iÚåË—7oÞœ“““““³yóæ¸íÈN‘ôcÊíÛ·cWpG›ZÂKܹ}]¿~½¾¾þþûïÏÎÎþö·¿·?ƹ}išvôèÑÕ«Wçæææææ>þøãï¼óŽþRµfüé߸;·iЗ£'ÉœÖÖ28I¼3=68~!óAD#¢„ÑB€h!@4‚ A ˆFD#¢„ÑþÍê²£Î[Ó IEND®B`‚gsl-2.7.1/doc/images/fft-real-mixedradix.png0000644016036000116100000005410713373111455015614 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœìÝy@Tõþ?þsfc€X]Á\rÁM…Ы©©eš–R–~,óš¶ØUJ±55éúѬ›dyËÛuëf.,#bÀLš**J.`²Ïúûã|î|çÇ2ë9sΜy>þrŽgy1æ9ï÷yŸ÷! Î%`»w„`€` €X€`€` €X€`€` €XÀxŸ;wnùòåþþþ$Iš_óôéÓO=õT=üüüÆŽ{èÐ!¦k` ã¼hÑ¢ž={æçç[\S.—ß¹sçСC·nÝÚ¹sgjjêž={˜.€¤ÓžL’ŽõÆo|ðÁƆrqqñOTH I TH îÉý ‚°x­Ý¸À7oÞ|ôÑGÓÓÓÙ®€A„uûöí©S§nÞ¼é ¼Çr›6í§NºnݺiÓ¦±X€s0ÞÿÞiï¹ñ ¦:]³¾¾Þßßßâ!\â*Ç‹D…´@‘´@…´à~‘ܯ`²HƯ›¯Ûô¹ÿk  ‡®¸°“lذí,@…´@‘´@…´à~‘ܯQ.Ðÿn‘K\EWÄ\Ä  À0 À,@° À0 À,@° À0 À,@° À0 À,@0E©Tnß¾½¨¨ˆíBX†÷ S"¶ à'•J• V«%Inn®L&c»"và}è ZÀ´1mê>|¸µµU£Ñ´¶¶æää°]krssïÿÿýo b€ÿ" Û58Š$ùðS€«S©T'Nlmm%I2((¨©©éÁƒÔ™~àÀÈÈH¶kt¶²²²yóæýöÛoA$éçç'•Joß¾­×ë¥R)Äà˜‹´€è¡P(ÚÚÚt:Á`˜;wîÝ»wóóó·lÙröìÙ×^{-11qÓ¦M¼oüQ Ü‚‚‚ôôô &,]ºÔø>ܽ{wÁ‚z½^§Óµ¶¶* ¶‹`ÚŽh>|øñÇ …Ûv·nÝzê©§òóóA§+ðÕ ÐÖÖf0¢¢¢¾ûî»ðððNWÐét_ýõ‚ Ø*ÀJÌE aÐ@­V¿ÿþû¯¾újPPP|||Çp š9sæÙ³gµZ-I’ …‚—¬P(ÔjµV« … .l—¾AÈd²ììì¼¼¼¤¥¥Íš5ËËË‹•RX‡ ÁÚµk{öì¹uëV’$»ZgâĉR©´µµU§Ó7Ιå9M\\œ^¯R©tâĉ®KÄõë×W¯^ýé§Ÿ:µDÎÀ5`G;vìÀ{÷î5“¾Ä›7ož0aÂáÇVž3?~|Ĉ›7oÎÉɱØÄß½{·B¡øæ›oœS×ðáê)®[”JåÑ£GwïÞ}èС &X¹ÕÝ»wGõücÒ¤IŒ–çdJ¥rÆŒJ¥²ÿþVnR\\ö 8 -`{Ü¿ÿÇ\´h‘Ý{ iiiÁÁÁ÷ïß§±6gÒëõï¿ÿ¾}ÝFO=õT^^^MM µpÆc48_zzú¹sç233ßÕwß}—––vîÜ9Àõ¾'&&.\¸ðùçŸw|WË—/~ë­·ß0 €[öìÙ³téRZv5wî\//¯o¿ý––½9ÓÑ£Goݺ•œœLËÞ^|ñÅŒŒ NGËÞ¸ `³üü|­VkýÌæ‘$¹yóæ”””¶¶6Zvè:nݺu[·n‰èJ2|øðž={ž:uŠ–½pÀfÿó?ÿc~âI›ÄÇÇ:ÔµfEÞ»wo@@ÀŒ3hÜçÒ¥K322hÜ!—ñáê)®ƒ3ýùçŸ (--íÑ£»½xñâäÉ“KKKýüühÜ-CZ[[#""öïßOïS%CBB.^¼Lãn©(ÍAƒ3íܹ³  à믿¦}Ï‹/&I2222..޳#+•ÊÓ§O_»víöíÛ }ÿË–- ]»v-í{°Ø085ãqWÏÚsıcǦOŸ. =<<¸975ýu[[›N§ûöÛoçÎËÄ!æÍ›W^^îŠc—0 €}J¥råÊ•uuu Í›qéÒ%@ Õj9;75ï•V«%I²ªªŠ‰CÈd2—^zÉէȰ3aX…šô¸¥¥E$ýòË/L4Oår¹‡‡õx%nÎ%—ËÅb±F£‘J¥ U¨R©®_¿^ZZúõ×_s³€.hX…jüéõz;ž}d%™L–““3iҤɓ's3xd2Ù¬Y³ââ☋F…BA½Éœí  ZÀV‘ËåB¡P«ÕÚ=é±5bcc8~ýúõ0t»ýñÇÇ/..îÓ§C‡ ¦ÈÖjµB¡›ÝtáÃð% Âçxá…ªªªÒÒÒbbb=Ð[o½uçÎÞüÚk¯étºôôtFRTT´qãF??¿o¾ù†ÑX£ ÍAƒsŒ3fëÖ­ñññL¨®®.<<\©Trª|÷îÝ!C†\¸p¹æ¯Ñ¹sç-ZTRRÂô,r—QÐçÎ[¾|¹¿¿?s Т¾¾þÊ•+cÆŒq±—-[¶eË'Ëz›7o~æ™gœ¾AŒ9òîÝ»ÕÕÕN8[¸À‹-êÙ³g~~>Û…´wêÔ)j”²s÷ꫯþë_ÿºqã†sgÑÝ»w÷îÝ»fÍçN $%%a^hà7npIIIjjjdd$Û…´wòäÉÉ“';ípݺu[ºt)wÁ[¶l™?¾sš¿”É“'ŸŽ^=µ©Ï×€Á xìØ±ˆˆ§ñÞ½{\±bŬY³Xœ™R©T;vlÇŽ/^ìÛ·¯ÓŽ[SS3räÈ?þøSb»˜‹ajj*ûuÐÆ­/̦•Á}(•ÊþóŸ"‘ˆj·µ{iÓ _~ùåìÙ³mÚƒ#GìÓ§Ï¥K—>ùä“Ó§OïÛ·oÊ”)Ôó è=„Å—*•J.—Ÿ:uJ«ÕΟ??88˜é#—œ:ujܸq¿ÿþ;½G° ƒcà$› ãìO,R*•ÞÞÞb±ØÛÛ[©T¶{ië o¼ñƬY³lÚƒƒGT*•¯¼òŠñïô•W^¡ý‡²¦æv58ሦK,XðòË/Ó{D6NFpmÌE G£ËÖîÔ† +¸nÛ¶mb±˜‘/­àšÄbñ¶mÛØ>1»6lØÐÕÉÃÐyrq¥ÓŸ ýÒP‰ Z‹>>>'Ožtr X©Tzzz ’$}Úî „0𖃬P(ÚÚÚ‚P«Õ …‚¾ºì———'t:C%) µZ­Õj…BáÙ³giß¿¨’ ƒƒ?28 ¼¥V« `¹\N’¤P(äÎ JÔp0êî&J¢~d’$=<<¸ó#K$¡Pèà,‹Õj5…8 ¼å` X&“…„„¬\¹2''‡ ýÏAÈd²ììì·ß~ÛÛÛ›‰ ´Ý»w÷öö~óÍ7¹ö#¿ñÆ={öt¤$´€ƒp xËÁnllüã?¶lÙ©‡:ÄÆÆÆÆÆöîÝû…^ÈÏÏ …4î|Ù²eëÖ­{ýõ×iܧãbcccbb222n߾ݳgOûv‚B xËñAX#GŽäTú-[¶L"‘|üñÇ4îóË/¿üã?XŸy£S$IÊd2¥Ri÷ÀÀA`à-¸¨¨(66–Æzh$öìÙ“ššzýúuZvx÷îݵk×~ñÅÜüÂADll¬#7_!€ƒÀÀ[°R©4>]‡ƒÂÃÃW­ZµpáBo ¦nü}úé§/^Mc…ôЉ‰AÏà0ð–ƒ\XX¸eËë¡ÝäÉ“7lØPXXh÷mÁÔ¿­­­³O#ç‚1cÆ<÷ÜsƒÁ¾ùáÀÀAho92emmmssó€è-‰^gΜqð¶`ê.[N'œjŠi={öôññ©¨¨°osLE „Þr¤¬T*ccc9þ0.ê¶`*ƒ£¢¢ìØÃ¨Q£¨ôåοf8r-`à tAo9À………œeDÝ#›——WUUõÊ+¯äææÚ4mõŸþù·¿ýí©§ž=zt||ýôÓvl‹Bo9ÀEEE«V­¢·&P·±qãÆ„„„ÜÜÜ^½zY³aSSÓc=öÈ#|ôÑG ×H›1cƬ]»Ö¾mÀÀA`à-»Ø`0¨T*î·MmذA§Óýå/Ù¾}û… âââºjÁ+•ʬ¬¬Œ5*==ÝÉu:B&“Û÷kE!€·ìž º¬¬, ÀîI—ØòÎ;ïüþûïS¦L¡®év:.šöÜÜÜ, ?þøcŽ_änÇËËkàÀ/^´ãv)Ì „AXÀ[v·€9~°‘‘‘$IjµÚ–––½{÷ ê6_jìÒ¯¿þúúë¯755Q7óäåå±]¯Íì¾-`à ´€·ì`.Ïež\.—J¥mmmà?ÿùÏÁƒoß¾m0Aß¾} CBBBQQ‘V«åÎ#žlPðâ‹/Úº!8-`à-GZÀ.ÀÔ¸èÍ›7Ÿ9sæÚµkóæÍÓétZ­V«ÕN›6­¢¢âóÏ?ÏÍÍÝ´iwžwd»ïDB¡ ¼e_«Õê‹/Ž5Љ’œÀ8.š ˆ§Ÿ~ú³Ï>S«Õ‰äÙgŸ¥®øš®àr~øáªªªøúúÚ´¡X,nhh`¨*û  ¼e__¸p!,,ÌÛÛ›‰’œŒj»n{·#¡P8bĈ_~ùÅÖ ÑB x˾.**3f õ°Â¥Û»¢z¡lÚ  „0ð–Ýì¢C Ý5–­[!€ƒÀÀ[ö=ŒÁu‡@»‰1cÆÚºÆ„Þ²£üçŸþþûïC‡e¨$pÜ€ÔjõÍ›7mÚ -`à 0ð–¬T*G-al§Ù18 ¼ek+•Ê?ü°_¿~Ì•´þßÿý_›2 „oúÀ[6°q’d‰DòÊ+¯ðã¦^R©T_}õU[[[bbb§ó]w  „0ð–McP(jµÚ`0èõz…BÁhaà…B¡Óé ƒZ­¶þ7…‡1!€·ljËårje$Ù}Èårjp»X,¶þ7…0px˦–Éd;vì áͤQ|EMïž––fýo  „Þ²u–F£™:u*fáà¾ØØØÇ{¬µµÕúMÀÀA`à-[øâÅ‹?ü0sõ~øá‹/Z¿>8 ¼ek>œ¹z€FÇ/..¶~}0px˦6 %%%QQQŒ–t6lXEE…õ›ÀÀA`à-›æ‚¾~ýº¿¿@@£%]<<|øp§+K¥ÒŽ ===© øÎ¦.hŒÀr]è‚×Ål—””´»º6|øðK—.uºòË/¿<þü¼¼¼††††††Ó§OÏ›7ï¯ý+£_Y9¥V«---6l˜J&„‡‡ß¼y³©©É⚘¸†Ù®¯¯ 4]Ò­[·ºººNW^¿~}PPP||<5bK.—÷éÓ'%%…Ñ ¯¬l—••õíÛ×ÛÛÛ %„BaDDDII‰Å5Ñ®áÐmH[·n=wîÜÁƒëêêêêêÀ࢘ à3fdffš.ÉÌÌœ9sf§+÷ïßÿ—_~1]RTTÔ¯_?ëþ²&€•Jå™3gÐ}âê CaaaQQ‘ùÕÀÀ5ÌðÒ¥KÏž=›––V_____ÿþûï,Y²Ä¸‚iÓ~ÕªUÏ>ûìÑ£Gïß¿___èСgŸ}võêÕŒV|e1€U*UBBB}}}rr²J¥rZa@/•JõÄO477'$$˜ÿ="€k˜ `Ÿììl¥R¢R©²²²ºqºbÅŠ­[·¦¥¥ 0`àÀ›7oÞ¾}ûË/¿Ìh…ÀWç‚V(mmmA¨Õj…Bᬺ€f …‚º¹ÈâïsA×0;‹ ˆÐÐЃvõ¿ízÿæÎ;wî\¦Kw`±,—Ë…B¡^¯—H$r¹Üi…½är¹D"ÑétÀüï-`àÆ€X&“Í™3çÁƒëׯo7ú\ˆL&ËÎÎþàƒôz½ùß#¸†C÷ÐÈšAXõõõË–-‹‰‰qNIÀØØØ+Vܽ{×üj`à0ð“5|ùòå¡C‡:§`ÔСC»šãÖ \ƒ~²8tssóíÛ·CCCU0ˆšíÇ|#sA× €Ÿ,¶€KKK, V0*""âòåËfV@ ¸ üd1€ÑÿÌ3C‡EƒkA?Y à+W® €ùdèСW®\1³¸ ü„°»A \ø ìnÀàrÀÀOæX«Õ^¿~=,,Ì™%£BBBîÞ½ÛØØØÕ `à0ð“ù¾víZpp°T*ufIÀ(@VVVÖÕ `à0ð“ù‡1 ÿ™—Ì÷Bãa À5`à'ó-àË—/2Ä™õ€ 2ÄL£ \ƒ~²Àhóù0¸ ü„vC`p-`à'ósA—––FDD8³p‚ððð7nt•²˜ ¸ üd¦\SSãííàä’€i‰¤oß¾þ/ZÀÀ5`à'3Œþg33!%¸ ü„vOf.#€kÀÀO`÷„‚~B»'0¸0ðØ= 2äÊ•+ƒ¡ã!€kÀÀO]MEyÿþý–––   ç—Nàëëëçç÷ûï¿wü/LE \ƒ~êª|éÒ%4ù­« )Ñ®A?uÀèæ½®.#€kÀÀO`·…W~ê*€¯\¹‚æ·®æâ@× €Ÿºš -`Þ3ÓÆ\ÐÀ)`à§N[À­­­·nÝ e£"p’Þ½{k4š{÷îµ[Ž0p ø©Ó.--~üx»ßµH$ÒjµlÐx¨Ó!ÐAAA½zõBó×<òÈ#ƒ ò÷÷o·½ÐÀ)`à¡®îA g¥p¾ðððÒÒÒv ÀÀ)`à¡®8""‚•zÀù"""ÀÀq`à¡Nç¡,++C Ø}„‡‡—••µ[ˆÙ(SÀÀChZÀÀ}`à¡N-`·‚kÀÀ}`ࡎÜÒÒòÇ„„„°U8Y¯^½ôz}»G2 €SÀÀCøêÕ«ÄcÜJÇF08 <Ô1€ËÊÊpØÝDDD´‡…NAu `Üì†ÐŽCi4‰Dbº-`7Ô±,‘HÀÀ`à!´€@ 8ñ®ªªš3gޝ¯¯¯¯ïœ9sª««Í¬¬×ëwîÜ)•J£¢¢¾ýö[¦Ë^êtZÀî&<<üÚµk:θ œÂl766&&&FGGWVVVVVFGG'%%577wµþòåË‹‹‹9òàÁƒ½{÷îÝ»—Ñò€¯ÚðíÛ· ‚èÞ½;{ <=={ôèQYYi\‚Na6€322ÆŽ›’’’’»gÏžNWÎÉÉ©©©ÉÈÈ4hD"=zô?þÈhyÀWí€ÝV»ËÀ`àføèÑ£ÉÉɦKŽæ¶ IDAT’““>ÜéÊŸ}öÙŠ+­ÜD»¹ qØmµ» Œ¹ S˜ à’’’#F˜.>|ø¥K—:]ùçŸnll”Ëå^^^>>>“&MÊÏÏg´<૎-`°{j÷H´€S˜ àúúúÀÀ@Ó%ݺu«««ëtåÚÚÚeË–=÷Üs•••×®]{úé§gÍšuæÌF+^jÀx ƒÛj÷H0p ‡nCÒëõÛ¶m[¼xq=zôèñüóÏðÁo¿ý¶5Û’IMMe¸dà(\ ®ƒõRSS;æŽÈl´kïÞ»w¯]›Ø¨[·n3fÌ0]òØcYs CgÀnË4€u:Ý7ÌnIÀŠþýûß»w¯±±‘z‰3RSS;æŽÈlGFF^¸pÁtIqqñ°aúZ™ÑbÀ}˜ðõë×{õê%•JÙ- X!X^^N½D§0À3fÌÈÌÌ4]’™™9sæÌNW~üñÇÛÝwôÃ?ÄÄÄ0Xð”iã°›3½ ŒNaöélK—.1bDZZÚK/½DÄîÝ» >ýôSã $Iø/¼ðBRRAÓ¦M#â‡~xã78Àh…ÀK¦sAã°›3½ Œ¹ S˜mûøødgg+•Ê•J•••åííÝéÊR©ô_ÿú׉'ÂÃÃûöíûÙgŸ}ûí· ŒV¼Ô®Œ{Ü™é­Àh§0þ|òÐÐЃvõ¿í®oíÛ·é’€÷4ñ¢oYYÙ“O>Én=À¢ˆˆˆ]»vQÿ‹ÅMMMìÖ`Ä¡Ûè‚0á0pxÈÀ ÷ïßïÛ·/Ûk$Imm-ŽA¸¬¬,,,L ÀyîÖŒ`0p >˜€‡ŒcÀh LBãa À)`à!c €00p xÈ´  Æg"!€SÀÀCT+•ÊÓ§OkµZ¶Ë–i4š‚‚‚¢¢"0p xH£ÑTUU%$$ÔÔÔ¬X±B¥R±]°F¥R=ÿüówîÜILL¬ªªBw €‡4ÍåË—©á6F¡P°]°F¡PPg‚Z­¾rå ¸ <¤ÑhFŽ) I’”H$r¹œíŠ€5r¹\"‘$) Gމî@i4š¨¨¨U«VÅÆÆæääÈd2¶+ÖÈd²ììì &,[¶,22 Ü¢a©Õê9sæà‰–;þü–– ÂNAQŒ›€Áˆš  œ‚¢7ƒu+08 <¤ÑhH’¬®®8p Ûµ'ôíÛ·¡¡A­V#€;ÀÀCjµº¶¶¶oß¾lל@’äàÁƒkjj04pxH£ÑTWW£ÿL…‡‡WWW£ Ü¢fÂÂsÀTxx8fÂNAi4š7n„……±]pHxxø7ÀÀ`à!FsíÚ5´€ÁTDDÄõë×ÀÀ"¶  À¸ ¦"""***„B!Û…ü0ðF£Ñét}úôa»à???OOÏÆÆF¶ ø?è‚R«Õaaa$I²]pKxx8º ;ÀÀ7ƒA¯×ã0t4dÈNg0Ø.€ ÀÀ?Z­–$I\†Ž¨~NÇv!þQ«Õ`èTDDI’˜ 8 |C]äC4tn0p8 |£V«õz=fဎl0š››Ù.€ ÀÀ?¿ÿþ;I’þþþlœ#‘HÁµkר.€ ÀÀ?Ôc_Ù®8J,—––²]A €®^½Š§BW<<<ÊËËÙ®€ ÀÀ?×®]“J¥lW%•J+**Ø®€ ÀÀ?^^^lWåååuýúu¶« 0ðOee¥··7ÛUGy{{#€#ÀÀ+¦¶¶ö¡‡b»à(oo簾¦°]ø¥¢¢¢G‰„íB€£ÄbqŸ>}®^½Êv!`à—²²²¾}ûâ6$èŠX,îÛ·oYYÛ…àyÀÀ/eeeÁÁÁ˜êº"‹»uë†[ Ð^)++ëÝ»7ZÀбX„.hà0ðJiii¯^½ÀбXܳgO´€ ÀÀ+eee={öDCW¨.++3 l×î üÑÐÐÐÐÐðÐC!€¡+b±X"‘H¥ÒÚÚZ¶kw‡þ(-- ×jµ`èŠX,Öh4è…Ö!€'”JåŽ;ºwï®ÑhÀÐ*€wíÚUTTÄv9àÖpðJ¥JHHhii …£FÂDЉDRQQñÓO?iµÚcÇŽåææÊd2¶‹7…0ðB¡P«Õz½Þ`0”––¢ ]‹ÅW®\Ñëõz½^­V+ ¶+÷…>Ë剄$I±X‚†®ˆÅâÐÐPê ‘H$r¹œíŠÀ}1ÀUUUsæÌñõõõõõ3gNuuµ5[ÕÖÖ†……‘$ÉtyÀ2™,++K"‘;v ÷ƒb±¸W¯^§N‹ÅÇGÿ3°ˆÙnllLLLŒŽŽ®¬¬¬¬¬ŒŽŽNJJ²8M Á`xöÙgßyçFkžéÝ»wÏž=år9aÔ ¬qãÆ 4( €írÀ­1ÀcÇŽMII HII‰Ý³gù­vìØÑ«W¯ 0ZðÌ•+W"""‚@ƒT1dÈ+W®°]¸5føèÑ£ÉÉɦK’““>lf“_ý5##c×®]ŒüSZZ:dÈ‚ Ôj5º"‹Õj5A``³\RR2bÄÓ%Ç¿téRWë·´´$''ÿãÿðñña´0àŸÒÒR´€Á"c sqë˜ àúúúÀÀ@Ó%ݺu«««ëjýW_}uîܹcÇŽe´*à¥+W®P-`0˜aÚvqè6¤Ã‡—””¬[·ÎŽmÉΤ¦¦Ò]#p¬a à¡C‡^¾|™ír€CRSS;æŽÈl´kïÞ»w¯]›Øèµ×^ûꫯ„B¡2tì>}ú`0ËÀþþþžžž·nÝb»"àŠÔÔÔN£„¹#2À‘‘‘.\0]R\\€1!%8 \ „0p\‰F£¹~ýzxx¸™À`žù ­¯¯ÿóÏ?Y¸'0¸’+W®„††zxxtµæ‚‹ºš šB’ä!C.]ºäÌ’À=!€Á•˜™„’‚0Xd¾L`>,p0¸ó€ 0XÁbã208ã\UU5gÎ_____ß9sæTWWwµæéÓ§Ÿzê©=zøùù;öСCL×.ÇÌs(`°ÈšÆ@hpf¸±±1111::º²²²²²2:::))©¹¹¹Ó•årù;w:tëÖ­;w¦¦¦îÙ³‡ÑòÀå  ‡.hàf8##cìØ±))))))±±±]Åê믿ž••5~üx//¯˜˜˜ÌÌÌÍ›73Z¸–ÖÖÖšššÁƒ›Yc‹Ì<ŒÒ·oß–––{÷î9­$pOÌðÑ£G“““M—$''>|¸Ó•·nÝJ’¤ñåàÁƒÍôWƒ»Q*•ëÖ­ ‰DfVC ,²Ø&¢ÿþ6l(**rNIàžÌ}–9®¤¤dĈ¦K†nåøþcÇŽ™ïl÷¡R©Z[[I’T©T2™¬«5À`‘ÅV©T—/_.))ùòË/sssÍœoŽ`¶\__hº¤[·nuuu7¬««KIIIOOg¬4p% …B­Vët:ƒÁ P(̬‰‹,°B¡Ðëõ:N­V›?ßÁÅÛþøãÇüã?Ž‹‹c»à¹\.‘HH’‹År¹ÜÌš`°ÈbËår±XL’¤D"1¾8‚Ùh×Þ½wï^»6q;555S¦LY¿~}BB‚õ";“ššj_ÙÀ52™,++ËÓÓóàÁƒæûÀ`‘Å–Éd?ýô“H$:yò$úŸÝGjjj§QÂÜ™ àÈÈÈ .˜.)..6lXWëß¼yóÑGýðÓ’’l:¡3`>éÕ«W@@ÀÔ©Sͯ†‹¬„%—Ëèãã㜒€ RSS;æŽÈlϘ1#33ÓtIffæÌ™3;]ùöíÛS§Nݼysbb"£U+:wî\tt´ÅÕ04Xd~.h£èèèsçÎ9¡p[ÌðÒ¥KÏž=›––V_____ÿþûï,Y²Ä¸‚ië~êÔ©ëÖ­›6m£%‹:þ¼•Œ0˜gM ˜ ˆQ£F?Þ õ€Ûb6€}||²³³•JeHHHHHˆJ¥ÊÊÊòööîtåóçÏ/X° ]çûýû÷­\ŹsçFeq50Xde£ Lcö>`‚ BCC<ØÕÿšv¯3ÚÕ®Îú.h0˜g}ÿúë¯z½^ àâÝ"À8±ÀܼyS£Ñôë×Ïâš`°ÈÊ ,//wBIàžÀàΟ??zôhkÖÄ\Ð`‘Ź ¢££q˜ƒ`eÿ30XÁÊ0qXÀ00¸€óçÏ[3‹@ƒ¬`ŒÃF!€ÁXÙÖëõƒA(:¡$p]"‘H¯×ëõz‹kŽ= ÌA×ÕÕÕÕ××8Ðâšhþ‚•D"‘V«µ¸Z¯^½$Iee¥J7„®£î¶æV0Xɦ^h\† €ël…y(ÁVÎFI €I`à:ŒÀÚÙ4—!`à:܃´Ã@hà0pZcccMMMDD„5+#€ÁJÖpHHˆZ­®­­eº$pC`à´sçÎ=üðÃ"‘U“–#€ÁJÖ0A#GŽD#˜€N³ò)„ÌC V²~6Jã°€1`à4ëG`hƒÕljcBJ`8ÍúX¬fSc0 ÜÕÚÚZQQiåú`°’MVWWWWWÇhIà†ÀÀ].\ˆˆˆððð°r}0Xɦ&Irøðáè…Ú!€»lê&À`5›˜@/40 ¥T*÷îÝhý&`°’­ìïï¿ÿþ¢¢"æJ7„.R©T EEE;wîT©TVn…¹ ÁJÖÏM„J¥úàƒ~ýõ×ÄÄDëÏF‹ÀÀE …B­V N§P(¬Ü -`°’M-`…B¡Õj ƒZ­¶þl° \$—Ë…B!I’‰D.—[¹¬dSËår‰DB’¤P(´þl° \$“É/^Ÿ““#“É¬Ü  V²)€e2Yvvö¤I“æÏŸoýÙ`8êúõë«V­Š‰‰±~0XÉÖAX±±±kÖ¬)//g®$pC`à"NWPP0nÜ8›¶Â\Ð`%›æ‚¦<òÈ#¿þúkkk+C%BõìÙÓ¦­Ð+ÙÚ&ÂÛÛ{èСJ¥’¡’À !€‹òòò&L˜`ëV`°’LÄ„ òòò˜¨Ü¸(///..ÎÖ­À`%û8.. 4Båçç#€9vðÏ?ÿ¬Óé˜( Ü8çêÕ« 44ÔÖ À`%û¸{÷îAAAÅÅÅL”n œsæÌ™øøx;6Dƒ•ì `‚ âââΜ9C{=àžÀÀ9ö]&À`5G—.`àGckØô0S` ¸¥¶¶¶®®nذavl‹0XÉîphh¨X,Æ”X@ 0pK^^Þøñã{ÎL0XÉî&p70Ð Übwÿ3«9Àè…º €[Àà`à0pȃÊËË£££íÛc+Ùñ0£ÈÈÈúúú›7oÒ[¸!°KR*•Û·o/**êô¥ëÊÏω‰±{$3ZÀ`%GZÀ$IŽ7.??ŸÞ’œ¯#.DÄv`3•J• V«%É÷ßóæÍ—^z‰ºç§Ÿ~’ËåA(•ÊÓ§OÇÅÅÅÆÆ²]¯ Μ9cÇ3ŒÀ`%G˜øo/ôܹsi,‰ií>NŸ>=eʪÓh×®]ÁÁÁsçÎ¥>Ursse2Ûõº°ëùá‡Z[[u:F£yòÉ'5^¯okk›2eÊèÑ£‡ öõ×_kµZ—û[ÊËË{ûí·íÞ Vr<€_zé%ëašñ[»P(LNN¾|ùrQQ‘Z­6 æÝwß­««kjj"B¯×9rÄ…>4\Ø¿ºz{{ïØ±ãÀ€$Iœœ‚ &NœH}u=qâDKKKZZZkk«Á`0 …ÂUþ–òóó‹ŠŠIP0XÉÁÖëõ—/_ÎÎÎNLL¤±*æ(ж¶6­V«ÕjËÊÊRRR¼½½§NJ}nüë_ÿ"B.—«Õj’$?úè£7n¼úê«Æ;Ò\ˆË0õ|좢"¾ž"ÔW×¶¶6ƒÁ°jÕªk×®UTTäååÅÇÇSášM½Œ‰‰!ÂÏÏoâĉT+9??éÒ¥¾¾¾lÿ¨TªÉ“'«Õê3fØÝjGƒ• `•Jõ—¿üE­VOŸ>=//û_p›ššT*•N§ …R©tëÖ­í>7¨—999ÔËðððO?ýtÊ”)÷îÝ#B*•ºVGšMÚõÌ;ùâk0NA$&&òõÉÊÊjiiÑëõB¡ðõ×_óÍ7 ‚èÖ­›éùkúR&“QZ£Gþæ›o~øá×_]­Vsù›¬B¡ :ÄÔjµÝ­v0XÉ‘¦å\u*K¼½½·nÝ:~üø'N\¸pÁ·D‡Ï Ó—kÖ¬!"%%E«Õ¶´´œ:uг?¦#LÇÓäææêõzꥇ‡‡sŵ˜úK ¢­­z¿\tðQ;¦}Οþ9I’"‘ÈÃÃ#))ÉÊ=ÿ–&Nœ¸{÷î+V$)•J9ûy!—Ë ƒH$’H$Ô82;`.h°’ÝsA!—Ë%‰Á`ÐétvŸ«L£¢¥¥¥Å`0lß¾}õêÕALš4Éú=$&&zxxPÿþì³Ï¦L™¢Õjùôé›››kì™ôÑGïß¿¯Õj ‚ IÒ9•®ÀÔ_5iëÖ­¿ýöÛwß}犃L¿”‘$I}{}øá‡M{ŠlÕÒÒ"‰4MKKKVV7ß–ÀÀÀ€€€¿ýíor¹Üî Ñ+9Ò6ö0¥§§sö _vv6Õs&‹õz½{0þ˜ñññW¯^MJJjjj2 üøt‰DO?ýô?þ¨×ëD"ùä“O‚‚‚¨‹ Ž4lâÚL"cÆŒ)((ðööþë_ÿÚÒÒB„Á`pÝS„jÖk4’$—-[ö /áÈWNêk AƒáÈ‘#«V­2~±åŽC‡Í™3çõ×_wd'`°’ƒƒ°¨¦[·nãO¡T*½½½…B¡@ ˆŒŒÌÏÏg·0û|÷Ýw@ x{{+•JZöYXX¸mÛ¶ŸþyÞ¼yÓ§O7Ž‘æŽ¸¸¸üÑÁ 4¨¼¼œ–z€ß®^½:xð`w’——7räHZê¡‘F£™;wîŒ3Μ9³mÛ¶¢¢"ZvK}ºR÷_|ýõ×´ìÓÉ”Jå¨Q£P(´éÓ•¹ $©½sDUUÕêÕ«Ož¼víÚ1cÆäççÛôéj14c(ØíÐÐÐ0hР÷Þ{¯®®®®®î½÷Þ £®:˜×ÕOÑÔÔ´lÙ2’$émMÒ®¨¨hÛ¶m………éééÁÁÁgÏžeôpjµ:11Q$‰Åb޼-óçÏw|?½{÷¾yó¦ãûÞ«©© r|?K—.ݱc‡ãûqÕB%IR(2Ýù÷Ë/¿ôë×/--êZ+,,dôpv3mµ/^¼¸¡¡Á¾ý0”š :##cìØ±))))))±±±{öì±{‡^^^aaa"‘H¯×777ïß¿ŸÆjéB X»víøñãwíÚõóÏ??òÈ#ŒQ,O™2E¯×k4ê> FgC‡Íž=Ûñýà0XÉÁkÀF³gÏ>xð ãûqœB¡ Æ< ‚Ÿþ™ÑcEGG~ýõ×ãÇ_»vmbb¢J¥bôˆöùî»ïš››õz½H$ŠŒŒ|衇خ¨=ðÑ£G“““M—$''>|Ø‘}R㨑_~ùå¦M› 95á¸qÈ•^¯î¹çœÓ}š˜˜(•JI’$I’õû(òòò¦M›æø®À`%º8))©¸¸øÎ;ŽïÊAuuuA88êÊzAAA .äÔ÷x õH‰‚‚‚ôôô={öˆÅb§½'v¦¦¦²]ÃÿY³fÍÆM¿¤x{{¿÷Þ{æGÆ*•ÊŒŒŒiÓ¦õéÓ‡zùÏþS$Q/ƒƒƒƒƒƒ5Ío¼ñ êšMäIDATᇦ¥¥¥¦¦žMMMwïÞ:ujXX‹o‚R©¼ÿþâÅ‹ÍïÁšRÓ÷„„„ØpÚ[***úüóϧL™bßùl|rþüy­V«ÓéXüùùçŸß|óÍ·ÞzËÃÃãµ×^£¾Î2ýG-•J¿úê+N§×ë—,Yi÷ÛHWI*•J.—ÿôÓO_|ñEMMÍÉ“'GŒ¡ÑhŒï‰%±qãF¦‚’¡®m;POè4]BÝefª‹Ÿ êZ&õÒôÒf»%¯¼òŠñå•W:®`qô®‘‘Ñ­[7‰D" ===pÄv+H¥Ònݺ>|˜Å7aÊ”)Ÿ}ö™ù=X¹Cã™@ÿÙ }>úè#Çÿ‚l]ÁÓÓS(J$’ÀÀÀ]»v9ò6ÒR’é'üÊ•+üÍOæ‚ÒµxÛ¶mèrSb±øÉ'Ÿ4ž!555GŽ1¾üôÓOÿ>räHMMM§ÿeúoì{ÀçØÊÀ pÏž=kkkM—ܺu«wïÞf6±ã›,õ•ÍÓÓó¹çž NOO7.qÎW×ÌÌLã/uÓ¦MN8¢Åf̘! ù&_J¥RêNJ[¿™ZùÕ #Ï®Žë?òÈ#NnS\B¡0))I¯×Óþdë [·n5~²effÚñ6Úý&xzzîÞ½»_¿~óçÏ—J¥v”uõ1âœpüøqÓ%ÇOLL4¿Uaa!Aƛͩañ¦÷ž·[bú2777((H$ c°M{°c…wÞy‡$I‚ D"ѶmÛœpD‹+äççS#õö&_>ñÄÛ·o·fv +ž]í^Rƒœù7Keu¥B¡°£fÚWضm›H$"‚$É 68¡$êM"‘¨G?ýô“ã‡èôcÄ-xûöíÏ<óŒé’gžy&==Ý↎¼;ï¾û®@ 0CF={6((ˆ˜Ç¶š±GÎ9o‚‘N§ëÝ»wEE…ÓŽÀ„[·nRÏ uã߬X,væß¬Ææ£D"éÑ£5£Œo‚@ ظq#sb.€94ôÒ¥KGŒ‘––öÒK/±{÷î‚‚‚O?ý”уN:uóæÍL?:W©T*Š[·níß¿?##£GNnÔêf-½^¯ÓéFŒᜃ*•ÊÌÌLŽÌ"`·Þ½{÷íÛ÷¯ýë /¼àœ©åbbb¨çûrçÓ‡7455-\¸páÂ…?þø™3g˜˜q¯¥¥åâÅ‹Z­–zÈ1-÷1:·¦¢¼qãÆêÕ«³²²‚HJJJOO·æ–ç £æW5jÔ7ß|sòäÉU«VéõzÏjd|KK I’‡ž1c-»¥õ&\¸p¡¾¾þÈ‘#T'9sT*Õĉ[ZZ„BáÙ³g9òEÀ>*•jüøñZ­ÖÓÓÓ9Y°`F£yä‘G˜˜°–·nÝš9sæùóçI’¤ññºJ¥òôéÓ;vìxä‘G’““/^¼Èô›àSQÚÆŸâã?¦®†zyyÑÒ?¬V«gÍšE½ÕÜé,êŠZ­3fŒ¦Öã`€Ýœ|>ïÙ³gøðáÔ¼W\öÁ…B‚ „BáæÍ›ß¡R©ôòò¢>¢?úè#Çwh%æ‚’C]Ð\ÐÔÔ$ 5MssóŠ+¾ùæ›*MàlÍNŒëß¼ysÍš5Ý»w÷ôô¤žȒ΢®ˆÅâýû÷;6..nôèÑÌH.—SEÜO,¢.âhµZ@Àôù|éÒ¥µk×* ÚŸµ@»„„©TÚÖÖFÄG}:`Àêa9¶~–ÆÆÆVUU­Zµª¹¹™ o"3ö1ìÎDãOaGàååµdÉ’îÝ»OŸ>ÝËËËü˜)ãÓŒ{‰DB¡pðàÁÔ¸n× {àÀ~ýú½÷Þ{Ìͱ®×ëÖ,Yâ*ï €y………/¿ür¿~ý´Z-C‡(**Ú´iÓ Aƒ¾øâ †A;ãG_nnîСC©ËÆÏRÓOÎŽŒŸÆžžž³gÏîÖ­Û³Ï>kñÓ˜ Ì%¸=Ó°¼ÿþÔ©S©o*B¡ðµ×^ÓëõíNÓ[Ç>ùä¹\N]@ …|ð…9R©‹Å$I2w–ÿç?ÿ1b„^¯gbçl?~ü·ß~ËÄž•ÿ}°5{+‡`ÚÖ­[÷)M˜0¡ãÌY†ÿ$¿ñÆT6A“'O¾wïž¥Æ ØFÛñÔU¡P(‹ûõëHµn=<<Ö­[·sçÎéÓ§Ï’~ýú-[¶ÌÓÓ“SwÙÊxAK(2tA+>>þ›o¾abÏ,:zôè¨Q£˜Ø³ñ.[×6aÚ¢]¾|¹ñÁ3B¡púôéÿûß×­[çáá! E"Q·nÝ‚ƒƒ©[Ö?K™‹= ‰›d2YNNΖ-[òó󫪪–/_N„N§Óh4ÙÙÙeeeÝ»wB¡ÐËËëßÿþ÷'Ÿ|’››»iÓ¦œœÜK]ТãØ³gOÚ÷ŸŸŸ_SS3oÞ<Ú÷ À®éÓ§kµÚãÇÓ¾ç~ýúét:‘HäºÃ&¨û”6mÚ¤P(víÚõý÷ßSm@н{÷òòòììlF£Óé òeËjjjòóó·lÙ⺟¥që6$û08F¼êþj’jãÀzêÎÞ`ê'"bçÎJ¥²G4îü±Ç›>}ú‹/¾Hã>8bß¾}_|ñEvv6ûlhh3fÌ“O>éççÇ¿ÏãOÔé§+01`›ñ/nÍX»vmQQщ'ŒÝìº|ùrRRREE…§§'-;àN‘™™9nÜ8Zvh0æÎ´sçNZvÈeÜütE›ãäv+z½~Ú´iÑÑÑiii´ìpÑ¢EQQQo¾ù&-{à ]»v:uêàÁƒ´ìíý÷ßÿᇠ…D"¡e‡`+°9`FÕÕÕÅÄÄ,]ºT,;8AXuuõ¨Q£ÊËËýýýi¬€SZ[[ tâĉÈÈH»wBÝ+•JÓÒÒŠŠŠLŸNÆ\Ä`"° 00ðÝwß]¸p!5öÛîk3J¥rõêÕ3fÌ@ú¿I¥ÒY³f=÷Üs»ví²ï «J¥JHHhkkÓétŸ|ò Ò—¯0 ,»uë–@ ÐjµjµZ¡PرjxE~~þT*íp‡J¥ÊÌ̤BÔ¾³]¡P¨Õjjj­††Ú+Ž@ƒer¹\*• NeDz²²ZZZ‚Ðh4öE8€« â“ ˆ–––“'OÚ±‡‘#Gêt:@ •J]ô¦#°®žâ°P£+++?žmSŸ˜^¯Ÿ2eJnn.5ù3§n0 ñv‚ bbb 5‡†•îܹ3iÒ¤áÇ9’kãÝa™ƒv¦mÛ¶íÞ½;;;;44ÔÊMV¯^ý믿¾ûî»………ø@w@}a0a–-[¼½½333­|ÄçíÛ·'Mš4mÚ´Í›73]$X lØÉ>þøãwß}÷¹çž›={¶Å1&[¶lÙ·o_^^Æ^jii™4iRRRÒ;ï¼c~M¥RùŸÿügß¾}‹-Ú°aƒsÊk €ÍA;õøqµZíééyúôéNû“©›(¿üòËüüüàà`ç× ÀwïÞ?~üO<ѽ{÷®näS©Tñññ­­­b±8??×h8·!‡( êtliiyæ™gvïÞ””dúäNjügkk«^¯ÿöÛo‘¾àκwï¾uëÖÙ³gSƒª¨1¦/yyyË–-£F) …Bv`°õ´‚ $É‚ V®\IĵkרÉâ—.]zòäɦ¦&‚ D"QUUËå°íêÕ«"‘H£Ñ455-Z´())é‹/¾ÐjµB¡0""¢©©iÞ¼yUUUÔ4Èöì>pØÌøT“œœœÔÔÔ‹/Ž3¦­­M£Ñ´¶¶ž;wnñâÅÔs³=<<ði@}g‹Å^^^K–,)..nmmÕh4mmmÇ/--}ÿý÷Shþº>\=Å5`ÖQ÷]´µµ§Êâæ¤êl1ý‹èø÷Âvu`a™ƒæ$.€õð÷âBÀæ €€!ÌE ®° À0 À,@° À0 À,@° À0 À,@° À0 À,@° À0 À,@° À0 À,@;Ijj*Û%X€ i"i iÁý"¹_!£HƒÁÀ說ªV¯^}òäI‚ &OžœžžÞ¯_¿N×<}úô®]»²³³ÕjõСCÿö·¿Íž=ÛšC$ã?…ã¸_$*¤Ф*¤÷‹ä~…“E2ÛnllLLLŒŽŽ®¬¬¬¬¬ŒŽŽNJJjnnîte¹\~çÎC‡ݺukçΩ©©{öìa´<¶0ûícÇŽ¿üò˾}ûŒK.\»råÊŽ+¿ñÆ|ðI’ÔËâââ'žx¢¼¼ÜâQÜü;]P!-P$-P!-¸_$÷+$\·|ôèÑäädÓ%ÉÉɇîtå­[·Ó— ˆÁƒWWW3Z[˜ à’’’#F˜.>|ø¥K—¬ÙöرcQQQÌÔÀ2f›ÿ‰¤©©I,—h4š‡z¨­­Íü†uuuãÆËÈȈ‹‹³x7ïÄ  *¤Ф*¤÷‹ä~…£E˜$‹ÕjµéµZ-‘HÌoU[[ŸmåQy_‚`,(E4–hz—ÊÅ€€€ººº^½z—ß»w/00ÐÌNjjj¦OŸ¾}ûö„„+‹ —Cç5àŽ­ÒÈÈÈ .˜®S\\À?x À,@° À0 À,àCWUUÍ™3Ç×××××wΜ9\xŠð¹sç–/_îïïßéÍÍ\(øôéÓO=õT=üüüÆŽ{èÐ!®YPP°dÉ’H$’àààI“&}ÿý÷œª°ÚÚÚ°°°v¿q.IvÀµ ‚Ðëõ;wŒ”J¥QQQß~û-§Šìø’$)‘H¸S!A:n×®]£Gö÷÷÷óó‹ŽŽÞµk—N§ãT‘'Ož7nœ§§g``à¢E‹þøãÓÿe«BG>±©Ù帱±1111::º²²²²²2:::))©¹¹™Ýª-ZÔ³gÏüüüŽÿÅ‘‚årù;w:tëÖ­;w¦¦¦îÙ³‡SE®\¹rÔ¨Q?ýôSccão¿ý¶fÍš÷Þ{oÆ ܩДÁ`xöÙgßyçÓ…Ü)²«ˆq§ÂåË—9räÁƒ{÷îýÿÚ;¿¦Þ0Žïš--­•mj»h(Åd.qµ™ý!‘­? ¯Âð./ºì¢RA¹¢2ºp6S´IhG]’"˜èMÙ*ÿÍ3Ô¦pLOïÃÛ™®Ÿ¿Qç<Ÿ«çý¾‚ÎËÞg;ïÆñz½ $#Ÿcãv»OŸ> ÇP¡PTTTqMòÛ·oÝÝݹ¹¹/^$ ÃùùùÝ»w÷öö’!½â@$ ÅÖ­[´Zí™3gÞ½{Í0==½¹¹Ùjµ*•Ê7ôôô@“¤±Ùl âˆá¥K—Ìf³ßï‡Ãáp¸»»;''çêÕ«p$WlÀ¢õîØ1:Ç}NLLäyžNxž§?ÌÉKäržžžÞµk—ßï8’ôqIaaá? –——_¹rEÒ+D²¸¸Øï÷/,,sAF388Ê0))‰aÇÃqÇq555 ü~ý”¤Èðð°N§[\\ †Ëˡƒ~É8ñ¤ ‚d~~¾×ë¥Ç#:@0\뎣36à? ü ­V+˲tMrjjª¾¾~ûöí—/_& ÃÖÖÖüü|ñm²K¨®®>rä©&&&F Ÿ/55Õëõ†B¡P(T[[Ë0Ìúõëáb^îZDø-è±±±={ö¼zõJ’ƒ’aYV§Ó‘ˆ¡Á`øüù3¼-! &''“ˆ¡V«¼3¹aÃR‘$„B¡”””ééi:b˜‘‘ÑÙÙI'™™™¤"ÙÕÕe³Ù’““•Je^^^cc#(ÿ| :=44D'ÃÃÃYYYrùü8ÂÇŽ«ªª*((LÁ‘¤1™LÇ‘ˆáÈÈHFF†ä'¶bDR‚@ÝØb˜}‚$áÑ£G§NJII¡C †ããã&“‰NL&Óøø8©H8p€eÙ¹¹¹ùùùžžžM›6Y,P†¢[Åè÷ ¸¨¨¨®®ŽNêêꊋ‹åòù-@„9Ž;zôè7ìv{ä,I oÞ¼1¤bå4I MMMyyy¤bèt:ÛÛÛ餭­-''‡Ô@$ ÅâââÇÏŸ?/Éêõú:éïï×ét¤")¡ººº¬¬ŒÔ0 £[Åêü?)ƒ%gffVVV’ck×® †¹¹9¹½þ%ò Þ»wïÓ§OW›… yøðáÖÖÖ©©)žçÇÆÆ<OZZZ{{;áW‚¤ÝnöìÙää$ÏóŸ>}ª¬¬LMM€c(ÂÂÂÂþýû%Gƒâ÷€H ‚P___XX™1¼wï^zzú‹/fggÉðŽ;îß¿Jòøñãoß¾åy~ddäܹsåååâõîØ1:Ç}!8•J¥R©‡äLN¢¿× ¼¢áìì,I–eOœ8Á0LBB¶mÛNž<Ù××Gÿì†+"yË.éóùœN'¹Œiii¥¥¥ïß¿eH˜˜˜p¹\›7oNJJ²X,’ï%‘4›Ímmm+N1ljjÊÍÍU«ÕjµÚl6766B“lhhÈÊÊZ·nÑh¼sçÎÒÒÃXvìXœÿYí#‚ òçˆû3`A‰G°#‚ ˆ `FAÀŒ ‚ 2€ AAd0‚ ‚È6`A‘lÀ‚ "Ø€AD°#‚ ˆ `FAÀŒ ‚ 2ðòóî>ì®kˆIEND®B`‚gsl-2.7.1/doc/images/filt_edge.png0000644016036000116100000032570713373111455013711 00000000000000‰PNG  IHDR@ ô¢9 bKGDÿÿÿ ½§“ IDATxœìÝyœu?þOUß×\™;!™d’IHá$BXͺˆð\Õ îêW¹\ìÊ7š‡ˆî"*¸²êz¬ëƒ€ì÷±²?D¼A&,!YÌÍä˜ÉÜgO÷ô]]]Çïê©®©««»g¦{z^Ï¿zº«ª?ÝÓŸ:Þõþ¼?”(Š RÑån€° ¢!€ ,¨h`@EC *XPÑÀ€Š†T4° ¢!€ ,¨h`@E[ðÖÛo¿ýéOº®®Ž¢¨¼ S Ý<¨p ÀºãŽ;š››÷ïßoqyq®mT>jÑ‚D•ÿ½¬,Ë j`@E«¸Vkk«ÃáhkkûØÇ>ÖÓÓSîæ@™UV릛nzá…b±ØÁƒ/¿üòk¯½öðáÃån”SeÕÀRyæ™g^|ñÅW^yÅ|1»ÝÎó| M€y°@¦Š`MLLtvvÆãñyß2Ì/tC€²C7(;tC€²C7(»…놕5„P»¨èÖÏ~ö³«¯¾ºÜ­€r²—÷í•©eï}ï{wíÚµ}ûö+V ïÛ·ïßøÆ¯~õ«ò¶ÊkÁ3°¨YªÇZÿøÿøì³ÏnݺÕëõ¾ç=ïééééîî¾ä’Kº…Pɪ¡Ä õ”º!@Ù¡”º!@Ù¡”Ý2-â€̃={ö”» ˺!@Ù¡”ÝÝwß]î&ÀB©†K¤‰”†@E;vìX¹›°Ü¡”º!ÀÂA æÁêÕ«ËÝ€åÝ ìÐ –"j–Ëåjii¹öÚk¿ô¥/ —»] †̃ÚÚÚr7`¹C7(;tC€%JEQ“Éä;ï¼ó•¯|%‹]|ñÅ/¼ð‚•u)ŠZèæ¤ªG¡A7¤pøðá;w¾úê«[¶l)bõå 5°ÃE]ôÀ<ùä“ò3###ŸùÌgÀÚµkwïÞÍ0 ™M¿’!š/ %ª†H!âe×Ýݽ}ûör·`YC7(;tC€¥È(¤ðÎ;ïÜxãgÏž•þìèèØ³gÏ­·Þ zè¡uëÖ=þøãF«-ldff&ÏÓšõõõuuuÅ­»p!šjý €E0 )0 ÓÐÐL&µ/…ÃáË.»¬··×duÝ…œ;w®¿¿¿°v/¤ŽŽŽµk×·.†,AäQ ÃìÝ»wÓ¦M^¯—¢¨†††£ Z¬C `ŽþþþöövéñÃ?üÆoìÛ·ojjJÅT*Åó¼ÑŠ- ÖÙËݨ¨úPvè†e‡nPM~þóŸïرCzü /8p`ÕªUÒŸ}}}&+´°¤¾¾¾¤¶Î·Jk,˜8_(;tC€²C7¨GŽùæ7¿ùÚk¯I¦R)·Û-¿ú£ýH~ìv»Y–u:ò3& ©««+ºhúò!„°Üñ<‡÷ïßÿùÏ~çÎÏ<óÌùçŸ/½týõ×ßÿýããã“““O<ñ„²àzggçË/¿¬$h²0”,X¾(Š¢(Êëõnܸñ‘GñûýúÓŸ>üáË <ýôÓ„-[¶lܸñäɓʤª'žxb÷îÝ.—K®øn²0”b¡f7\L 7G#X‰DjkkËÝ €e Ý ìÐ .Dƒ ,˜ƒƒƒånÀr‡nPvè† §r—PvÈÀ€e ,¨h`À<èîî.w–;tC€²C7X8ÕP= 5°Ê5°–¶ÿøÇ—^zi hhhøÐ‡>ô»ßýnÑÞš¢¨EØEQùÈGt_ºí¶ÛŠnƒ¼âü~ iƒZ ý¦P°ÜW¾ò•ý×}æ™g&&&^ýu»Ýþ¾÷½O~µj¢$ìïïW=Ùßß?44TŽæä'j-Y5ÿ£% ,˜ÇŽ+w–;tC€²C7sÿò/ÿò“ŸüäŠ+®ðz½[¶lùÏÿüÏ={ö”»Qóïž{îùæ7¿©zòßøÆ®]»Jßøb–B©¢Jƒ̃իW—» ˺!@Ù¡€¹™™™öövå3_üâ¥Rjj!dddä3ŸùL X»víîÝ»†‘—çyþË_þrGG‡Ëåêêêúö·¿­Üòñãǯ¿þzŸÏ×ØØ¸k×®d2©|Õd³©T곟ýlKK‹²æ[Sùä'?ùÜsÏÍÌÌ(?øK/½¤ZøÚk¯]qÅn·»££ã?øÅÆÏË—c‘*ßÊèdôAŒ¾L(Z5”?Gw¨p;vì¸ùæ›ï»ï>ÝWu/l;::öìÙsë­·ƒÁ‡zhݺu?þ¸´ð§>õ©ÆÆÆ»ï¾»­­íСCŸøÄ'¾ò•¯HA¢ÞÞÞ«¯¾ú‘G‘þÜ·oßÁƒ÷íÛ'oßd³wß}÷Î;o¸á†ššiá¼[Ó~Š]»vIA%éɯ}íkÑhô±Ç“?ã©S§¶oßþÔSOÝpà ===·ß~ûøÃ;vä};å·TÜ—cåkW½¤} 3ù º_¦‘Ó™Ó™óeS—cM—cMqë.\ˆ¦B?`@…;yòä-·ÜâõzÿüÏÿ|Ë–-×\sÍš5¹AÞ Ûp8|Ùe—õööJ ?úè£{÷î•_}ùå—÷îÝûæ›oBî¸ãŽ®®®G}T~uÏž={÷îÕݾj³O>ùä< \  ­IŸ¢§§gçÎ}}}‡#“Élذ¡»»{ÕªUòg¼óÎ;·mÛö¹Ï}NZëÅ_üÞ÷¾÷‹_ü"ïÛ}KÖ¿mƒUÏÈÛ·À2ù º_¦‘—’|)ùº•%ǽïù ÷šâÖÅ,„KØæÍ›?þÏÿüÏ.—ëÅ_¼ä’KÞÿþ÷-Ï0ÌÞ½{7mÚäõz)ŠjhhÈ%é|üãW.|ÕUW>}Zzü›ßüæcû˜òÕ;ï¼Óâfo¾ùfU3Ì·¦kÓ¦M[·n}î¹ç!ûöí»üòËW­Z¥\à7޸馛ä?¯¹æš#GŽôvE9Z+¸ë2ù DïË„RTCî2°Ê®»»{ûöíånÀ²†nPvè†P†aî»ï¾‰‰‰ŸÿüçDïÂöþûïïééyüñÇ»ºº|>Ã0GNâyž¦ç¤¤È[°ÛíñxÜívË/¥R)¯×+½j¾Y–e‡r³æ[S‘ÛðÊ+¯<üðǾ袋¾õ­o]{íµÊW].˲Êišæy>ïÛÉ[(úË1j°ÉK&X&D÷Ë4‚ ,K[®‚ÐX°ä„Ãá5kÖD£Q¢wa»råÊȹK'OžÜ²e‹ÉH:ùÉÖÖÖ7ÞxcݺuòK½½½ëׯ—^-t³æ[3jƒ(Š[¶l¹ñÆùË_=zTõjSSÓÑ£GÛÚÚ´[0;y E9Ÿ'ÖX&¤ Hj`Ya_ˆ€Ò½÷Þûo|Ãf³ÉÏŒŽŽé±ÛífYÖétʯ¦R)e"Ò~ô#‹o´sçÎgŸ}ö _ø‚üÌOúÓ¢7k¾5#EÝ{ï½»víúîw¿«}õºë®{ñÅï¹çž¢ß®è/§Úÿ‘É)H)£å,Ð799955%=njjjnn.o{–´§Ÿ~º»»ûÿüŸÿsÝu×QuèСx೟ý¬ôjggçË/¿|ã7ʮ믿þþûïâ‰'hšþÉO~ÒßßoñöìÙ³}ûöÚÚÚÛn»òüóÏ++@ºY󭙸çž{Œ";{öìÙ¹s§Çãùà?èv»ß|óÍ'Ÿ|Rª}nñíŠþrJ¡ý™|˜w(âúâñøä¬X,Vîæ@¥ëîî.w–;tC€²C7sû÷ï¿è¢‹î¿ÿþÆÆÆU«V}á _¸ÿþû~øaéÕ'žxb÷îÝ.—Kžïé§Ÿ&„lÙ²eãÆ'Ož´žd´~ýú_ÿú×/½ôÒºuë¤Êñßÿþ÷åW ݬùÖŠ³eË–—_~ùùçŸ_»vmSSÓc=öàƒôvE9¥ÐþL>Ì»j¨…X ¡··wppPz¼råÊ®®®ò¶*ÜÂ…húAKs(”X O1U³X XPH$Rî&,wè†e‡n°pÀ}Ê ,° /¹b” º!@Ù¡,œj(Ž"î áĉ“““ÒãšššK/½´¼í€ ‡"î°Ø,Ї@)(…@ ð®w½ë‡?üa¹¥FQÔüní#ùˆîK·Ýv[Ñï%¯8¿­%sÿG²…~S(X OYijB^ÝÝÝånÀr‡nPv膠%Îêëëû‡ø‡Ç{ì[ßúV¹µ°<Øß߯z²¿¿hh¨ÍÉOÔ0Z‘¬òª†êQ¨µ>‡¥Ç6›íšk®)o{–íµêþýûï¼óÎÞÞÞr5i¡Qõµ¯}mttô›ßü¦òùûî»ïÒK/½ë®»Š»x_¸«~+[–—AðÁ ÔÀ‚ŦüÁ!  tÛ¶mS%"½öÚkW\q…ÛíîèèøÁ~ |i``à®»îjkks¹\Û¶m{þùç¥çuó€”ãÝR©Ôg?ûÙ––ùÉX,¶{÷î 6x½ÞÚÚÚ;w¾ôÒKòò§OŸ¾ð µ×}‚ lݺõ÷¿ÿ½y;U>ùÉO>÷Üs333ò3333/½ô’jh¡É?~ýõ×û|¾ÆÆÆ]»v%“IíÇ$„ŒŒŒ|æ3Ÿ k׮ݽ{7Ã0ò2<ÏùË_îèèp¹\]]]ßþö·MlDõ=Kª†š|Ý”Â^î@…Rî¼DQ¦î(ÞÛo¿½råJùÏS§Nýå_þåSO=uà 7ôôôÜ~ûí;vì „ ¾ûÝïþÛ¿ýÛ7Þx£½½ýí·ßþ§ú'£òR*÷w·sçÎÇ{¬¦¦Fzæ®»îêèèøíoÛÞÞ‹ÅÞxã§Ÿ~úƒü ôjWWWWW×üÇÜu×]Êíüä'?©©©ù³?û3“vjÕ××ß|óÍßûÞ÷vïÞ-=óÝï~÷öÛow¹\V>xooïûÞ÷¾GyäG?ú!dß¾}ó7£ûFW_}õž={¾úÕ¯ƒÁ‡zèK_úÒã?.½ôéOº±±ñ·¿ým[[Û¡C‡>ñ‰O455YüöŒˆ¢¨Í-2ÿf´ÿ#¹3bßÙRš7¿¨uëéµÊÝ µjÈCßB8tèP,“ÿܾ}»Ãá(c{ Â;vì‚ .(w+–5tC€²C7åµj0|ýõ×|ðÁGyäSŸú”ôäwÞ¹mÛ¶Ï}îsÒŸ/¾øâ÷¾÷½_ü℻ᄏ½½ý±Ç3߬öIŠ¢ž|òÉx@ùj Ñ £H+:tèÖ[o=uê”Ó锞O§Ó7nüÎw¾ó|À¤º[ëééÙ¹sg__ŸÃáÈd26lèîî^µj•ÜH“ ÞqÇ]]]>ú¨¼Í={öìÝ»×|_8¾ì²Ë¤±™E=úè£{÷î•_}ùå—÷îÝûæ›oê6XõŒ¼}íÈAí»›|Ý„þw¿äÿK+K.ÛŸ]o{ïõÅ­‹!„°ØT飘ˆÌ­^½ºÜMXîÐ ÊÝ´ägMMM·ÜrKKK‹½"„¼ñÆ7Ýt“üç5×\säÈéñ¯~õ«üãŽéÍ7߬zfóæÍÿ÷?22b´Êe—]ÖÙÙùÌ3ÏÈÏ<óÌ3 øÀÌÛ©kÓ¦M[·n}î¹ç!ûöí»üòËW­Z¥\Àdƒ¿ùÍo>ö±)¾óÎ;µoÁ0ÌÞ½{7mÚäõz)Šjhh_U}uW]uÕéÓ§Zk±‚».óoFû€RTCî2°Â”#ßõ®wy½Þ2¶ ŒŽ9’Éd¤Ç^x¡|W À„|­*Šb8þÍo~óéOú©§ž’4.—‹eYå*4MKÙ‡#z<“ÍÊA°Ùlr–˲ª4çÎ{ðÁ_yå•ŽŽŽ+¯¼òCúÐM7Ý$u’VüíoûÑ~´¯¯Ïï÷Çb1)žõáؼFm{å•W~øáÇ_tÑEßúÖ·®½öZå«&´ÛíñxÜívË/¥R)¯×«Êºÿþû{zzüñ®®.ŸÏÇ0ŒÇã‘—áy^UÇ(n`O°’eòAtÿFej`>ÕX°œÅb19€…9  PRŠÐG>òitÛG?úQ)xTSSsôèѶ¶6í*ÃÃÃ6èÔ!ª««›™™©««“Ÿ9wîœrmÐdíÚµÿõ_ÿ•N§{zz8ðØcý÷ÿ·ªtúûÞ÷¾5kÖ|ýë_ß³gÏ׿þõÆÆÆ[n¹EzɤFÞÿþ÷?øàƒ=ô RôJÉüƒŽŽ®[·N~fttT»Ø /¼pàÀ9±«¯¯Oùê¢Up6ÿf¬×á¡Ö­·‘"F Z·¾ÜMÐèÃBr<`^Üzë­_ýêWö³ŸIů»îº_|ñž{îÑ.ùñ?þñuk`uuuýÏÿüÏõ×çâ?üá­¼»4›á¶mÛ>üá¯Y³F;™àC=ô‰O|â¶Ûn{òÉ'¿óïÈõ¡LÚi„¢¨{ï½w×®]ßýîwµ¯šlpçÎÏ>ûì¾ðù™Ÿþô§ÚÅR©”2KKªø¾ÐÜn7˲ÊE|3ºèµHåM¯4¨ú´)©åj , ÝÝÝånÂRMÊYÆ–˜¨în°$ @^E}ñ‹_üâ¿(aJåÉÿýßÿ}zz:‘Hüîw¿»á†¤%¿ô¥/ýøÇ?Þ»wo:~óÍ7å‚J<ðÀ½÷Þûúë¯'“ÉÞÞÞGy$ š¿ï5×\óÓŸþtxx˜ã¸ñññ'Ÿ|òšk®Ñ.vË-·´µµ]sÍ5MMMõW%?oÒN÷Üs(ŠÊš_V6¸gÏžoûÛO?ýôÄÄÄÄÄÄSO=¥[¾êú믿ÿþûÇÇÇ'''Ÿxâ‰þþþ¼í)]ggçË/¿¬Lï(î›â €ú0„ ²}ûör7a)»XP±ª»!¥Pî¶ÀrnVÜtÓM>ŸOÊ*Ú²eËË/¿üüóϯ]»¶©©é±Ç{ðÁ¥ÅV¯^½ÿþÓ§O_qÅ@`×®]rDéöÛo¿ï¾ûþú¯ÿº®®îºë®óx<ßùÎwÌßtïÞ½?ÿùÏ/ºè¢@ ðž÷¼‡çù}ûöi£iúóŸÿ|0|øá‡m6›ü¼I;‹c²Áõë×ÿú׿~饗֭[·yóæãÇÿûß×náé§Ÿ–¶³qãÆ“'O.NÖO<±{÷n—Ë%ç¦Íû7&ª¡ü9Џ/„?þñÊ ÕæÍ›[ZZÊØ€2úÃþ ?¾âŠ+|>_Vˆ¢øê«¯ÊîØ±C;I6!„ã8ù±ÝŽº ¥BwXlÈÀ¨úÂåK‚¶çê°Þxã ù÷ž÷¼1,€Š…!„ ,(HWý@ –Š*î†E°ØsQáæº!ÀÂA tˆ¢ˆ"îP*®ú¡úñã*VwÃ"X침pó Ý`á €:´'ñÈÀ‚e XK‘•ž‹[5KX C{,[`,EE°Ð»*X C{ûÒ`.‰”» ×´°TTq7,XPè†e‡nPÅÀÈÀ‚B –» —¸°TTq7,‚•XèÝ0ïÐ ÊÝ Š!€:P uÁ”» EÜa©¨ânX+Á)ôn˜wè†e‡nPÅìånŽãb±˜ôØf³ÕÔÔ”·=C£°Y)ÐŽ"îKXå—L&>,=öûý—_~yyÛC0„@,€¥Cª †–Ÿò$»BΞ1„ ÕÝÝ]î&,\âÂRQÅݰ(âenPvè†U Xå§88¨û’IÖ¼¼µòËa&‰‚àñxLÒ»ú©Ñ£­Êgœ‚½ô†B)”?˜Å¼Î4:Wþžÿº×$ ,(ÇqRôGEš¦•9•À<‹ã8©*–Ñ&Oâ¨H„×^{MþsÇŽ•Ç1I`)¥™(ž´s (Jšü’K.)ekP•JÌÀ*onþRqôèÑH$BEqË–-+V¬(w‹`‰©ÂVef`™´Ê$k^ÞZyÆ055555EéèèX»v­váP(‡Çé ™[:eO“ù.âŽ=;¤\å0¬d`•}¡r7¢L<a ݺ‡ ‡¥éD! Û¶m+o{Tt»›2Kw- !„%J{ó¯ˆ";ét: ¥R©d2éóùtÏçÅÂe`•~œ•Có„A×Ò `I×eªx+_*•’¯(-VgPZb¿x#eBøÖ[oÉ‘¦K/½Ô¨—I^˜Ñþ1™LÎË•§î¹Ñ·‡ƒ«fTÏ3Ž )9›Cõ% 7¤š,BÕre`½Wy3°LfXS ð<3õe¢ÄnÈó¼ EUø<âæ¡(£k°`qÌûÑP{îTD+ ž>}Zz<33ÓÑѱ@i\XF;–ãÇOMMI‡`¼` IDATIR F[.ŽòÔ÷P«[qÝPÅ"ê®(-ÎBQ_}õUùÏk¯½viæ)÷iétºŒ-%ªJXeBhñDߤUŠxþ´ÛÅ;”Ï‹¢˜L&K»¡{6jôRõÞ$ig 2°Àj`-Z{$&5°´Uöä ¡º•Ø ƒÁàÉ“'UOV`R32° ’i»¡ ¡PHŠ:9ŽBÏëT}°¸s'ÕyòÌÌL}}}ÛÉËäúßJ–´Š(ŠÇÍËWÒnpi]öƒu¥Wp×þ™—t¨èÕ­Sª8Žs: ô^ AÙ‘E¨ÂÖ"Ÿm[ÜU™°Fj¦ß<ï !ÄÎÛZuWl”_bÆèDGE¹ÏÓ4ír¹Œ¶¯{FnÔé#$¬êy)«ÄáH`A)ÊÀÒ½‡,¼ÜËUÎ8¾aßÏgqE£±‚ `¶(ŽîÐ üýÌcЏÃ"H¥RÇŽ“;ŽB/­ç¥~¨j­ÉÉÉ `Y<+6`i›oÍ"Õúû2Ä0L(’»Ýnó,?“ßôãQ¥1.Z©ß%Àâ8NÙ~d`Aª0€%ŠbqùÕÅQîÝLvU&aµáÚìž”³ñWRù’É“Éä[o½%=v»ÝW]u•Ñ’ºGh–ec±˜ô˜¢(9LÆó¼HHR“%ÕÀ"%ì%AP *ðº*YEÕÀR¦}¬šq¼è–Ü›†ÑžÙ×6Xnto„VàŽÚ<Ëhç`^úÝ|]€R”Xg^®ŠU?õ`0ØÕÕµ£K¬…,¨H$rêÔ)éq]]*€eýˆ‰Dþô§?Ic]ÀE]D±RŠªaKë4Oõ-! ŠP%,Õ>"“É,Z«Ä!„%Nøs§xÊjˆÇú(kÝýo*•’çi¢iúÚk¯•NÛYRÔ[F DZ¤ŠÞ«²B!Éd2 QEQ”Ûí6™*_$©­­µ¾|<?xð ôØår½ûÝïλJ…ÔÀ’þœ¯tB‹p-£Dwí©@ `Ú U–aV‡š'ÀÒ¥í†%Îø¡º:-®KªÞ—eY–eM’÷‹£*!TDËääv!†–¸A¨XFGCåå˜6îc=KêÔÒXW¹ƒ—1kÞh!¨¾¥t:-Šb%Ϭ ¨JXå E‹¢XâÂqÿL†V\ÁÚÄwšGÂîì"GÚ:‘;Áíìì”—4¹I¥m¤öI£Ëfžç“u¤‰B(ÂØYoÆUôw« `…Ãáp8,=niiÙ¼ysq[†J088xÁX_^gaYÖÊÑ«¢j`ÍWVÑQ9£ ,U,R‘X …vCÝ– •vrY5°”‰õõõ`U m7TÍøQh‡Zˆ ,²0‡óëÿB3°J,Hd¾q‚ ¬ªft4Tö&m°ÀR.åҼĚ­XÒ,m"äBÓ¡ºUIKµX´žl}O§:ÿˆ;ŠPÁ6\;­|ž£„q_xÒŸR49ÊLf§8ôz½F,ó +Gh¹²• I§þhdÆ‘)%€e^\§K]¡—ͪc:Λ‚·@C8@Ó´Ô}.¾øbmòæ‚f`i#àʪX@ ïŠÊ?‘µœ•½"Æ¥(xž¯œYºU)Ê祥d`-fF†y",]Ún¨=^4J`!j`‘E `UøBd`U1££¡ò7PhÖØØX2™­ô"O@O?ìJÎÀbF¾Áér¹¼^ï‚´Ìíõ`:F R)§¤%Rí#m"BëWÕÎåõ5ïDÝêD BOñÛ#°„¸tßKû§Ñ†•¨Àây>éÒ¿†I•6¡6 –3Uœ…a˜‚Xóñ”æú”ÿÔ½®0ª"§Z¦¿¿_¾þ_»v­ÅRqÚV8–XétÚ(€e”¥AàÚÌ ‚N§¥!Eº ”ÀJ§ÓÃÃÄŽã\.WGGGÑ›2êûó˜Å0ŒT´Q„šššyÉ>‹Çã###ÒcŸÏ·jÕ*óë(¨&ÚËÚRXVOCCCýýýv»¢¨ÖÖÖŽŽí©àÉ“'¥f\xá…óUºÄ–4Sü'j`Á¼+h¡êÏñññ™™lÕå|V‹À*bàÑÄÄD__ŸôxåÊ•]]]ªúúúV®\¹$íE:Ã0555 ý¾PMª3€UiXªyUEŠÄ]ú%ëDŠdl¹Æ§…Üå„y–™É†Å ,y;)Í„i"¢oÙá”Tq+E¢–•º'4Ú!„£££ò‡jkk“On¤ŸF Ð~(‹£ƒN³´ X`nbb¢§§ÇdÒB©TjppPzìv»K `åM°*½Ö›o¾)?å•Wz<ž¢[+K&“£££ÒㆆU ´º•˜±k=ohjjjddDº1Ãqœ´¢”v¡]K¾y3—Ù%°ÌÈÈÀ‚Ò©Æóʳ~:tˆaÕ4ëÚ ËòcÝ2‹VĽˆ ¬¼%›ƒÁàÈÈÈúõëÛÚÚJo¡ mk1! ¬’X¼;¤Ú£%Œ¶Jº,­ `‰†…?­ÏèWPK„„b BÆwd# %f`ὺuww45x¬…B¨{º<33#¿Wmm­• ,9‡Q299944$=nhhضm›Q´ç@˺e`!€µœÚ %y÷ê…þ„b±Ø‰'¤ÇgÛ¶mÊ-ä};颢Ð[2yg!´žE1“É(—L&“óÀÒöt°ª•¶–˜—a}õd2)—•I¿.“SÁ… `Z«ˆ)‰TzzzÆÆÆ¤Ç]]]+W®T¾Š ¬åÃèh¨ú pg³ÙDQL$ژūËyÉÀEQξWÎoþŽæ 3jŒnG㸞žžÉÉÉM›6šŠuòäI9&~þùç›Ì©­›UÐ{TIK¥Ò†ªö,Q—ÎàA«`eHÐÕü°äeTEÜ’þxmv·Â8J `!«ºzÙ¬:\3 ãõzW¯^­]8!¦ìĶCuOgOœ8!ǧ®ºê*‹EÜ•Ýß¼J¨r-í }qXÿ×óǧƒ?·‰´m%}1µ¶c¦ÉÊF Ê½" ÀJ¥Rr­ i㪖ykizr»Ýîv»kjj6nܨ|Õè8;/C§¦¦¦¦¦”Ï$“É+V5Õ:mKµ—¨´JùP4m7,1ËzZ‡î\êƒÖo‡”ÂmÏîG(BꓹV©Öe`á4bYaYÖd8ÏñãÇÛÚÚäAø}ÁC+NÙ…U™Ü¡tAXª“lÝ ,óëj£B *Úr!E¦Ž\È@êª2$?‚¹y`©ÂÓ,Ëj+‰˜k¦§s“óªzß7ù'¶g°)[ ¢(Q×Ì4z3®¼Cn°›} ¬³gÏÊŸnݺuFŸ+o‹eYŠ¢ÌKæÁÒÂqܹsçX–-¨ôÇq§N’SÕÜÜl^XJÉ$kq†m×¾´@XæWé`-sÚ ”•–´W79PÎKËúäò¤¨VÞü%Vã±€Ó­…d(Hu°$ʾÄ0ŒÜÛÝn÷|u’â2° `i2°r/YÎSµÀây>egÅÙïÆÅ9}™Üè”=­}_ëRÝŽ;f4i±–Q¶°  ÃD"‘h4J‘bXoºOò” š÷`¾N¸uOgU‡aÝ–ùï¹è ¬âÓ¬Ëй%ûœ{YèzËGAÝP&õ‚˜‹®™V½Ô¯«OùJ `¥ÓióIH”X–U^K¨úÈ©ÌÀKìë¤uÎ*žŒ³c¦Iî¥ !ÔÊÀ‘¹jÕ*+,Ý ø[o½E©««»øâ‹Íß*œÜ 3™Œ4ù¦JÞ–üXEmnB¡÷‹9„Ð$Ö¦=’J¦Ö¯__WW'=9¿¬¼XBXÅt†ÒvÕ3Ä4€eT ]iÞ3°¤?Mnf,t–Åm­ný YÂ0ÌÔÔTsssAïËY5°”Ý[9©ÐÕW_½8ËT{ë,ž6ܾŠ]U‘#Ò–APNAèeÎIJ$"!„±eDJD ,Ð¥[»Êˆ6€ÅSBÆÆñ´xnrP¤D"é´½ÙÝã"„ÄsVY¸ ,m]ªE `I4Mšg´®2ýŠÌη`²eTަiÕ´;°tÔ eÒ¯nÒ9Ú: z‰§J`éf`­«*A­ì}gÏž=%œ! êU¢®$™§"îZRúŒQEyÕc+·èå7Õ]¥@ª€Ü J”©:‹ö'Qh(ªŒEÜÍÃI±XŒÌ=Th+ É¡‡††¿ßo2ŽI{‹XUL÷h¨ÝëZÉÀ2ZW&_±Z{OT˜;à 혋X›·MÙ£÷"zW‹…÷M.QÏž=+ú'`uÕÀ’û’*âÎqœÀ …BÒd%v»½¶¶¶µµUw;&ŠBÈÚ8ÆnµÆ¨é2º–T Ì`Oöq#×Rmâœp•êGȲìÉ“'¥Çv»}ëÖ­©TJ®yg²¢ŠöVë©S§|³t …°TËD£Q)çƒâõzÏ;ï<“…þL:Ù?ðÿl B¦äœ;C`EË1€%ÿi=o9ï[èþ©|Ç)ôOmý…nŸ§çì¡Lv²‰DÂãñ¬[·Î¨I"%žjÕ®WEWôöf£ Ók²ƒºÕ‘ðŠdf›Ò“õ©c¼x:ºiMMMKÁŸÅôÆiD›žž>{ö¬TJ&.$_‰dú ®Ó3Í6QD–v-+«²@C34ÏÑ‚] UÑÝR#«O8–H ÃX `©Fžf_š›¥ü}Ík§hÐ!4¯¥üSê’Rü—eYÖ¦³bÜÁð” _6ò̹òÅ¥–´ï …BgÎdê­­­çŸ>)!‹ã¸‘šÐ„?"P"-Ήn§Ói°ªCA,ŽãäÄX¥Ò3°ˆÞ+k;vLE»Ýn·Û;::¤Ÿåäää‰'¤êëëY–M$F[V¡2:Í›¯–<’@ùîÊ…‘ºCå'“ÎôÀìÄë’5‘ƼXš?Ô~–2%„O´ ]8¾Fùª6€¥Ì2–îXèn¶Ð¾0::*?v¹\ï~÷»MVÑŽmÌ›Få·¨««S°ÌƒÅòŸ“¾Èû¹ŠeK¼¶%ž½…ãlë§I(jhД Ш¶–Ýn—»œQQ=ùÏÒXÖ3°zÔ‰–¶O[=¸&“Éd2év»U,åñ{Â9¢)qBqòö@ÚM ™öeÏà7 e.=:@é8«\6N\ûVÍ%7ð1!ÈÀªvÝÝÝÛ·oW=)ÝR–Oʇj§ÿ›úß“¾=QjЄž§Ÿ“6€¥= k‡.P«è!„I—ú 'mÏØÙlØBîz`U=©*ÿ§Vf§––Oè!Ì]JyC¹— ¦1ŠD"ª'µ!-ëXÒûR%%v¥í¹7¥gEÝ©ú”O:#7º(M¥Rƒƒƒdnm”9,ïœëð 7¦l­nf‡õ¡‘ªÕ3™ÌhMˆ£ùI_¤5>' ‹a)½ –(ùhXÐBÕ“¾È´7îäía:M»ùZÆk¾ºÄ$Ëä6¡ê¥ãÇÇãqUܹ¹¹Y `);¯jÀ ®¼¬R†”e>w0TÝ“Rí¡'Åç„'4… ÝœC~U¹nÚ–ékÈŽà z£rþrOãèy‘õ©Üîª~­:À±,k2©‘ágË÷ÓÕ=îkOnÍX&·´Û·ÀŠ:çLŠ2áLøs' uŒo``,°¢šX•“’ÃõìNVpTaWéÚ(÷qõúmKŸÄ\É´-»ƒ^9m¸ëÌŒô“K j—NªŒöD²¬ò–òh ”"iBHm2÷ëéjvÓî”ÛqJräˆ:ýÊÎ¥ÓiU1Z“–ö%éX:^³Š ’Æug³’#®d}Ê'½µÑ±&™LJ¹Æ«V­’OÜs S$äžSÇ7ìI´H ”É…qqX„Iv:ìNBÆ3ªÊ`-uòÑÐÊžŸçù³gÏÍoéìŠñ¡Ùs¶ \Û%£kuW7Ù²RAC•)œ2ù„YyæœN§ áÉäû7 ¥ÛOåÊ;‡XËŠîI©öøòJà­r.=VÍv-=366‹ÅV­Z¥üýèÎyB)ñàªÞ÷½PΫUýÆ´„‹ËÀ2¿¤Ò-¯1)klév.åFæTsÎ75ªQdë:Ñ<Ôx.033£[@© Xòã¼5°”§‰ª¾Ç0ŒTR—ËU__¯ûvX§|CÂì`@/ëZiLÙÙþú)Ý…•x›Á‰øÜ4׎™&OÆ©Ûù‡ ‚hò­ƒ)onÅêIã{t"oËUå±<©Ü¶ìÏ F‘ÕxÅM‘475›SòÅ~¿î˜îϳ? °h¾à!„ Ã$ é§èõzý~?)¶VXºÏÀIMHK§Óét:åO‰¾ì÷wªÏºú&‚¾ØÆ`;%f·c·Û‘µ˜ßïÕâ8.ä‰õ×Mqz ¿ª–jEÕÂétZuV=Xüßö¾ë‡.iäçœzt/³¥mJÇë4[±)Q#Ÿ ËÚl¶¼¥Ê;Ïrƒ£®g›Ûû(!쎯H¤¯üb“Éä¹sçAÎò~.¢éìÇù>b#„±@øâ±åK`U +,Žã”cd!o.œšwbY™I–“Ű—ÑNޓȧК?»b„¢(Ý7]]!¥öç-NWJK¹¼¶V=˲‡’Ó4½qãFÕêÊ&I\ºbÏ•ƒ%Jµ‹yãçÜãÇÙ>7!„˜&€s13ã3333µµµÊuC>ÃY ÃîÄX ¼2šM#2¯ÿ(ÎénÇü@–÷0g%€•wƒò¤gDS@À|¢rãÊÛÀÒ‘ÚȸfÚ@ òª¶}´nK÷©(Š&Xáp¸§§Gz¼bÅ £–ÑÕf*•ššš’z¸Ûíöæ‚M]ÓmƒíwÒJKºxÐRÕšõf\kf‰iÖ¤?ÂÎ&¶8y{k¼np6&ŸMûs¬æPîK¼¸#Â$.x'Ûà†‰¸QQj#¸H^žÔ¬Ù‹Ï€"‹®©¥§sKG:³™iOlÒŸ½DŒ¹s¿"[Ῠ±±±þþ~éqKKËæÍ›Ébe`Y `©†hÉ+Æãqi'öÇà[¯Õ%.B\„èÏŠ–u®~’RÏøZbµ¬åD[qÃ|yŽãÆü3ƒuAÝW¥™p¥IÞl#Õ{ Öß<ïŒH‰h?vÃðåæëJt3³¤OIJ¬@‹rŒ‰Icª¦—dï¦('"´rf¯}òè\L{s,åZÉdRÞ™Xù\ÚV²¬˜+w2~Ö-¿deX, VöüºË¤íe^mÊ1§g-èB£%µ¬)¿~ŠÄÉÛéV²À,Õº&cµ‡Wåê}}}ÙÏrÞyç­_¿Þ¤°t©1çê& !ûmÇÞKm!¢z€Q ySÍ¥ôƈ±¤¢ó ‚033ò¬Ýn§iZUËx2°ˆ^åŠ"XÊe´¡7»Ýg›ò특D Z”g¢yϹó§üQBÈh qg¿çžÆ‘þD"áóùÌ? ,sË"€¥›¥:H›$>˜œ’êÎã@Ót<—Ë¢{½ÞäêÜîIšrÈ&˜MªšÛ%(ê|íýÒżj–±wb i$z{4ùåøÁó¢+6Ûä–|ž$HÌî)jýÿóÙýo½•êû™'-B‡¨¨–6KZ ··W‰9Õ¢Sâ×Ä@í”ÀÒ¾yÛ`)êîî¾ôÒK•ÏXB8˜QGwóÆ–K² XÚ`“89^7z,áLBJð1Ñ÷NH}'‘N¿Ö1ÓDD"ÒôèyFCuOåå ,–έåʪ@ʉóMTù&Òƒi·ÎIÐí"m&ÝGÅb‹µq#öܬ±@xÃtî0Š ¬¥N.¾£ü§+3•TXÚ-¨Â©º,Žã´‰Bª_©\©'HØàŠàÚé&¯3oÞö½!„Êâ5ZÉÙ6ˇ˜E¨e2\K;½£²IÊA®yk`ñ” ݹ Ú"#5¡öHƒ6™=îdDB¨¹,Þ\ÁÄÁvZ¤‚ÞØ”/{²Ê(†º ‚044$nW¦/:+{X´gúê'•Ï7%j“ÝÕµ¬P($O,¨Û=Mª^²,FåUT©‘Òƒ˜3%RÙwñd\mñúu|{*•j‰×½º6;/Ä´'F‰F£`¹j`ɽQwàƒj—Q\K7Ÿ™¦é9õ•Sɤ=÷^ÞŒ›¢šfÕˆHGñv1»¿›ôG”;MYÄ“ ]+'l’Ÿ±sOðäúäôÚÙ|®uá„'3ÈÍd7E‹Éæà;aOü]ÌŒôL ·“!Tý âpØl¶‰žŽÑì¹^ûcv[§m>X°Ô¹Ýn9*$MÚE X~F°ñ³}Óݪ³–t[Ì ¬¼ÃµT«ËMR®ˆVuЭ¥ÜEÔ†ä;7'š†ëS~íÄY<-¤ioÆ¥ `…ÝqžÊ.éeuBή—Xi‡"LÆóÊ_”ê'Zb–j8!„"dM¸iÛø+¬T*59™=.+ëaé¶Ázõ.bÀR&¸Õ0BH H¥RM‰Z¤¤cbÊÁ²vN•Ï ÷“¤ IDATUm,ÝŠtº§ÝªŽ'×9–þ,%‹Ì=N§ì¬|ªêäìÒÜö3°!<-Ø…lK{s@våμ¥" Ê?ùTÿ…Çû.œ³FœÒyZùLa š[ !6›m¦ÞOFÕéµÉकْåQÝDQT¡åÇê|~OæŽ̸ÜNšVÝ’Rò¥s#k"Š ,›ÀÀRî2™ÌÁƒ‡êTUÀRe`Å\LoíT?šjš"„¬Œ5H‡asÖ3°tÇ8È«'¬53MÞL6 @jEÒïàíc0!ä\ä”AÃÚ¸±šðªÈ mŸ¼mƒ%J{~l¾üYaH¤ç\XÖ¤½ÁÙéh•5°ŒXÿzëÉîKs•´ ÷ŸihÖ}É|aFQ£ÊÅÛm"]+øfè8!„Päxë`е;‰ÓaãÌ÷ Ú ,g<‰Öink_š"ÇÅIØãùýØqÛŒ¸2šçNL¬SPÐ}Ó‘š9©”“þè;M# Œ_Ê—”J‰´sƒÊ¤ìŒ‡Cþyë^Ý)©bÊ%26ÖÍewøÒ ¤‰‰‰õë×›Œòù|!_¿òÕ/ž7€¥<)çôTe`1v6:;ꇩÁvŠ„3­MíŸß˲Gå8N{¬Ôf`©¶¦½*–—W.‰rSþlúêrõ|ÞøéRt„˜‹ñd\™LFî¿ÓŠøòŠTöÈÃåîʤìsX&¿¨¢XÒOWºÅ¢$Ò_?5á\Í_¥»Šòϼ—º&X'NœÈÛ<‰¢‚{î|»†õÒ4í÷û'''i‘ªM{¥YM!3®„ê>€Vµ°¬!ÔCA^½” ,Õór‰tBˆË^ËIUye(ÞE„´-“±éïÎËØ2nÞA4¬a’KÝ·„ni#„Ð4Íx›å[è2v&¬·’2°ª›ªx³œß¤.ÇCs„š˜"€åtÛl6“ ,7ï°ó6)ò•t)*g™VôÐ¥êòºwx´CUX“¾È¡†^Bi%„šP³ 6rq:÷¯äè>¯ï ýPÊ»Êʪ(Wž­_9¦¼ f!B­‚³é$5LOkt…È„SOû¹Am˜•kŒš K‘öG¥-æªtFV=S“ÎÅd­q?î{ÿ-!$´ ]15v.Ãê€2BÈØr¯:9;!d_› `ÒÓ8Ú“%²Ýµe%©5i€6+âJð”°a(sS·v·PÀ­àÞ€ai:éÿq'GáñÀÌœöPÂÑÖJ¤®^ß1Ó$èt¹\[‚%C•¥û¼•!„„”#£ `MOO ‚099ÙÞÞ®\Ly©«« ÎkT¸GÙe9œâ¤Ä»ÝJq”H\†2áÈïÔòo_C‰¸“¹âªÎb2°ò!ä8NžXPżP=Ñ;èëf`±,k¾Ï„¥Kþ%¬j ìéÆ1ÝU¦½±£-;"Û¼\¶ ½¹ªÉì>ß='€5g¦N“Ÿe<·˜¡¯"ýtÃ^ýÃã`ÏžëuÙ„M›6Ùl6Ý“[U‘8ívL2°Ìég`¹”XnÇ#ïkR¹VÄŒG‘y,Ç–n1`IW°º·C­d`%ì¹³—Íîàh’&Íñ6dÑ›ÞU)âIºãµdî.O ¹—v”t7‰šÍÀÝç½±m$éd›ÃÜ…g³Û¤­åZ#Ë£º©ÊRê°xJ~ð5Š«\Öå¢(ÊüL1q‡m BHÚ‘ëƒ6žSÅjóÊ;–Šd`)ŸI9æô¦Ã­ý‡[û !­ñºkÏm6Ú¬ö÷/íRTÏëŽ\X-æ#‹¤u*ÒqVÿXÇœ¿â„L’ÓïhžÏ2ÌKQ$ÑþØX–u»s™Œñx|ll,“ɰ,ë÷û{kÕ¬@Ú#WâiPúX‰Dâø!d¸fš¬!„EreßêúHÀéÍ8#îdÔÅB.ëIÕÅB-ðcƒº,ó ,Ö‘;”K¥|š„Ú^2¢Z~&3`i3°Bž™›ZOØ0MzS£É× !"%XuÆ&PçE3™ XKW$©­UŸÍX¯ê°)ÛÛ0‘¶«;™cÙÈ2EˆcÚIW°”[¦6Uщ°'!Ð"-¨Ïf2°†ëCô¿#W”x;ÑK¹Î·¥9^;È]ü·$²ÝÍ›Éýh“Ž´T<¨ Xy³NL®êµCU´ È•—ž»Y†a¼^/¥Lî†JòÏ»¿n’Ìí¢âŠÌÁÛäŒÍC%¾ä>°9¿) sóžV$ýÒ7›ëàÊ:ÅæÉD&¿Ø¼?f‘ʹ$]Óíçê'¤²•"!ã±Iizú 6èNΛ·¿Å×¥-¦aN¿–;w¥P“ö*XuißÉÖ…œq'3Ó™t:ƒ ˜¨æ–ÜÙTçÄÒŸÚ”N“S Žãt‡e`Í©¥ÈÀRÝm-dTÍÙàìì¸iù›ˆ;ѯ%„œ9s&K%êë:!¾2˜Ý‰9weW}Ô›L$ÉÜy”êRÞ¦DMs}“ßï'„Pk: !4Mg\îàšK×ylS?«`™M‰*C÷ꦊ¼ÈC`æÜYýµŠ'Ý^¢©j©âcÝÒ™Œ#ç¢õަ}}}RR´|m,ŠâÆ¥–X‰¢æ-âžtèGÁÌãËò÷000‰D’É$Ã0^x¡•ª:òIFÒž–Ï·¼œËi!g=OÛ²;uêÔôô´öP¥ `…ÃááálÐj$=©SŸ^{Y§M 9Z rFÁ&‚Ñ Xyd«2d[5çöYv¨vúÕ§!)'uãþìmÕÖ‘L&£l•ÜTíöåX¬'wqòvBHÑ™ ˜¡óü¤çÜæ2{ÃÜb™ _$Ìó¼îMz#e/9Û8~^´Ä%mppð‚ . sÏ$-f`Mú¢'š‡´Û<7·Ts]¿¯•ÔE"†a”ýHùË™vFåJ=žÂîøŠ¤ºðƒÜž)>ü:u$Ô"„dl\TÔÜgí¯›ªKù†jr±Ú–xvÎ{os¶ìÌ”¶eܼÃz–vÊí’æ¬BK:êf`°ª‚Ü eÊ_ÈhÀløHk¼nhvæ+éÎ+Ks¯uœØ4ÕN‰”|Ygézf6€¥ÈÁOÛ3rÑ:¹&l¡òf`E]Iyªzç¸x´cÂ7#_Ö1öŒÀ’¶Sb« ô+¢{AM‘¨+ågÄ+% !›'Gk÷pßÊñqBHÍXªi({*®Ÿ&¤3‘H €&ª-€e³Ùä©^äŠæÚ:Í<Ïëf`ɵ£0òÖ·S®8g¡CYÁ=×í¢-CòŸ.sTv™¸3e²ØÌì>+ʱ¹‘ôdç+Ÿ~¤k6}ð3§OŸ!„k<Ù¬¾÷NDò—'®éšÍ›k[r“ÁI92É€'ãLxs;2:]p–r.¨ª ,©$–Çã™30aö@[›T°y;ŰäŠèYòÐ%i#QgЧ„õCìì8ýw¤%;fW‘ÿ[èßÐïìlhh(èMaY©¬ÖÛo¿ýoÿöoÏ>ûl$)îަiš¦å.' 2Òvè‹Jy¦"E†:qXЬ !T^Ê“J›­ ‰£ë(‘š˜˜P°”G«ÛуÞhQÏ-­uüøñãîwHzJ¤:§[FêBÒýŽæO6æ.㻦ۤkx§ÓÉ0Œ—sEÉlË‘®Où¬!´’ªo~É]hžˆIVAÛJ“Éd¢Ñ(Ã0,Ë:Îpó_‰ßBtƒ³[&W ”ÈÑBÈ {"-®Œ5tÛO5ê—u—5λ9‡|‹‚±³rabå2¾£Qä„MSíÛÆ;¤Çy3°”#’>Bˆ²«|#§,XDQ–Gz—ã­C„ޱüÛ¡qÝ©#!·‹¬þ }SX>*+€uÇwÜzë­û÷ïߺukA+:‚‡¤#OÛãqZj3uÁ¶õÒŧö¨Éqܼ°´_o¡â²“Ëez[¬ãžBh^Ë•)‘ç\…©ève«¥Ì `éÔ¾©™½WÝC–C Îõ(Fré°†‘o…ùý~¹ÖOóhï”;È1ѹPQ™&¯`X?*Ÿ*‹ÌžÿÍ `eÏ `ùˆÞB·Û-×[õ(~¨¬ƒv³³«ÏM2:92áC©ÓÉLr¬)›ãàm‚(ðŠ™×6Ûi‘"z5°TXFC !1WÊ<€¥º©+Šâd,˜ð¤†&t{T?Œ+ï©”{/ërdrÒWl§7lŠ9# ›D^íPWÈò²®Om!„¬˜•Xv.£,ÿÕGu°“þL8Òã™ITNé—xE÷ʉÓ;â1©ŠGÊEóbÀJBܬèà²=E°ÙˆËÝÜìŽÅbápxãTûpÍ4!d¢Á¶¹?»–¨7ˆª©½ ã„‘ˆ!!P­ñ\ÀWšòIºeEqq¹pžazúX™»k"þ€Ý”§&„d¨ìfãf¨nNæÚ–šÚºP¶v5½ÿsN ìv›2€eË´Os›ûÒ„uamíÿ® …8Žû@ðgSoé3´s€lž3ø–"+CU§‘ÊI¥×O·:fÒOýT͈t…ÌØ2“¾hK¼6™LF£Ñššln òh5$N í´er{¢ÑèŒ[ý*%RWmXitŠö“M³q«Ù3M‡`[ʦêK³úúwF¥›.y‡õÉ XÉ{2r©öQawB5a‚lõL£/ã2ª… ¬¥. Žã<±‰ 'nÐÿ”±¾mNBþÜèK€ §Í‘`GÇÓ‘Óö>·›H?K–ΞY*ÓD¿Ÿèe`)ÇÖy¹Ü㌃rÏv\anðÔè,ùXüôo]"DÿΛ¤.åm‹×½ ¬9³Ûxθn]Ì8Ä,µMõ-¯wd“¨‚íÆw.s:Am£–]¿£|>Bˆ²Jc*@Jœ{ÿ=éL¿Ó<²ir%gÏåØ2l¡uC`iQMÚ%]›½ÝÞ7Z&„(Rú%qB‚gswoŸ&n¯áBŠ$œ ™Û¯OöH!É@{´~´&®Éý©˜ú<^5ˆ±e†uvDJŒ(æ0rϰ¤äA—ªþˆ)m–P~ʰÙlÊDi9€5åªn¡oot×dMe¢›âY;wáù Ò+}SsVŠ3®Ó`-]ÝÝÝÛ·o'…qglfö -R—Œ­•ïJz½^š¦éx´i<Eò³G¬‡Òóû#WºV¤CÓÒÛˆD¼ì`6vCŠ"d Wôá»éñÈšÝloŽ×Mù"ªu›s’èÝewýÃДß,€ÅÚ¹þÚ©Îp Ñ;§ ƒ‘HDš¹;–ˆEVdˆ!+˜Q×áb{ÆÍ9JÉÀ’CÃþȽ>%'ø+× …BÇE£QiŒ¼'çMæú/ýî"MË·]'}‘°;~ÝÛIJ !îX„gR6·‡è©¬V¡zÞ|Á~ø°Ñ««ûzDñƒºG»L&£}ÞJkbb" Bü~]&ÓZ“ÅÑ<;§ÊÃ)‡Z³#e`q4Ÿ¶³ëFÙ¿úɾO=íh‡âq,\n¢¸ ¨Œ ÈjÒúX¹!„¼’ðPu±ìg“qÊ™Ûm©r¼Óé´Ïçãy¾eÐ,:´« °T¨*Ê ×Nï_}ŠBb„¸Èƺö‹Æ;!œ^ÖÿÏÞ›ÅH’eWb×vó} _bȈ̌ŒÜ++³öÊêf» ’]á2’ ø!a$J‚ H# J‚>ô%} 4æg0P"G²G6›Åª®ìêÚ³*÷52–ŒÕ#Â÷Õ6}<÷gÏ77÷ðˆ ÷´ƒÒÜÜ–gö¶óÎ=Wm£Àâ J”T`Õ9:„ã®XÏU›UhÖÃû˜À²*°ðv…uZ•u°T@1‰É `‰V–c;§ö ‘;ÁB¼Ä¿m™Ôrš<°üfK¤„q6¹.|àVze¤ ôQ«È^’ÐáF.—#³Â£7 Gw”ôŸ~øôñ¥)Y–m;Ó [oe5++ CÎoOm„³Ù ^Ó颹͗$ƒ÷Ój,cJÔKfDAÍÎa*(,hMaH–¬zd¶© ÓX‘a¶®X_L²PÕ+£Ì™6«ÅJ©HÞ±ÎÈZg¾¸ªÕlܶ< {î<°ÈjEÆFêòF§_zW¿Æ#=›Lóó® hs¢00e>l‹ü¼`)C˜Õ¬ñÛ{—¦ÔV„c_,çP&Ó· N%±^á˼X&ûD¥m"æ&ú£òÕô­ [3´Fm&}†KS¼µÈ¶LU£¥èV0·ï+éK ÎìN°M«ô®¿€Ö“àar=(‰éRÄ:0ÛÙÙÙÞnhK| ÷‚Ä#SH’AÛf9™=›™ìoáóˆ}¦Ý`ÁD`©ªúèÑ#ŸQ©ÀäŽÌ)Í27|þàoýަiË}Ô,p8ûÉÌý‹O뉜 ”¦U–ž„¼…m0Ø–¼·3·f#‡Fˆìï(+KRÊí¿(~(…Ò¬Ìä“Xå†ÀºâR©„CœH˜<° n™'õ]…®Eö4€>qåîi‹R4…Vª1YÀ+,ÛJ5…iC` ,J"¢TÊÕ›-SÈÕNcïËêÃzåþol:STžgí Â4Ô3%KÚ ç.oH´ œ¬ùê­õXšÖÚx`‘ ¬fÅ¡j¼þžhF‘;Ѿ¯s­Ùgµ  ìXwÞiè\:X¦¨„²`øø(±‰+£OâÇK±_M=šÊŒ5š¤V°!Xþ øý~Q)ŠbYV„ŸøßûzívµZÝ æ·‚zÅRl{zGo©áXà EQ²ÙìÈÈÚ–e¹ÎJØÍ­£¤?•ÉnçöPjQÓW[ÁÜzxάԯ> Þç@+1“("?»X-(È\.D¬¾ZX¦Hdò¥5Ck.5c¥Q‚Ê5ݯ(¨32¹m‚5aKƒ‘C%¢ €aRÙÀ!„?Ê['àüêi´‰DëkñVˆ®Z©I`±R Ö¹³ó<܇݆æ ÷hÕ ¨gYVUÕtvÀÔ²±½Z'¬"SýÙŸ²*]Õª••Í·:Óñb¬ T§ò#øà®BtۃтžÛ›Êæ…:È?(æ†@P8“I¢Ð¾§ iú ÌrË*Ý~9„„¸ÔFh£åfHiÔ\6½Û&szÆêK[3h»Â'7C_£o‹BíãÙ{¯®Ï]lÐÛŽ›r©˜\1 5š‹—Èu ¡ V×Ãûg3“}4qW)m-dO`mÌý5Vm+”ŠB‘f·O›‘T€¢(†aÐ]•ÔjšE4VŸyJdí0ØVàä¹o y¸y. û¾Òâr}"ÓhþìO7NŽq¥"„ê¢Ä(;‰¶Ÿ=þåôf³;Ö¼q(Э‰;N' Ñš™ÀRÅWî}ó… ¶¿³Þ)„p=¼wSYëg’oý»ÂV0—¨¼Š…Ø])°$B5^Œ ÷,Ú\`+ u\$ÛtLí’{8¬i1fr‰G­”¯Öž‚Q•ÑÕ§ Òr´XœÎd\ÞÈ¿]N®µ«¡%SD…/èÂÝßÉhy<÷V½´ºt÷&EQssshWtmÍßš„Š¿Û<>^¥&ò Î5ø y‘²¿¾®ªgÀî%/kÕnX;Á<*âvn?ý0±ŽÈ½‚X©1É a«,ÔÑ ô‰ ½z6ÒãhµlÀËlR‹®¦ÊW¶zØ «;M¸âPŽ-N,|/pñ'P{«2öVuô­ÿû,ýg¿¦Kï#[ÙÅ÷^ûvíµo×ï?¾xgéýÏ÷>¸QÂÿ^¹½<ûä.úúüÊ_ÿ%ú7óøÞÙÏ ª{ë֭މEÉçó™L¶B¹[£Ëø+¿ÑsÊ¥k+”»5ºRä«ÜеfÔä sý}æúû«'O=zmîÖ¥ñ_ þüZýûðÕàòÜÜý…I¼ç³‹#…x­T¯¬èÑËc"Bœ‚ÊåòíÛ·ñWËËÍiXD"‡7¿ÆÛ7nÜ0X5 ÆEþ›ï-<Ÿ¿¸sñZõÔŒþD”~¼3ŸÏ“e ¿º}ûv>Ÿ·ýÊ»Â_áÉÝ/çYtǺRµÊBk(.éýeƒÑôuiiÉt I`E(qú‹·ôð!ùØèg×_¼Ÿ\Gÿâ¤0¼Â^Þ2 !Ȥfˆw³5¶Ã¨¶wp€:#5Ú¸G ¨uòŠj»þ"ûN¦Õ [Ǿ¹~YàëzIdNoXLM¤6O”Ë™ œuT¡Ô§#:ÇÁÊÒ­ï¾kw…}'_Ú+ì ·FWÈ_M,eü…½½=EQnܸ”9s~8¹#³-I¿ä0¿ù÷×}ùpí ¬ IDATä¹O_'{Ò`!ùòîÑ¿Ëwž}p£øÁÒû_–B^Ø« ­-]U¼,ù(™i¾Ç¬,ýꣿ#Ÿ‚ì›òB×\+p0þƒË­ûƆô¤išD+*¥…ÊfÖî®ÁÄð£´h-)¸=ºŠ~ð_îÜÛÕ¿ªéB+@p±T_yùÑ¿ Ä™}ðl’$,š”þFyWèá ø,¾yLŽ !¬€2¾ñUõÙéÓ‰G¯ÍÝ»2}ó\ÚúïÛó£Oß<õÝù±›çÒ+'æWNÌß<—¾ñJ o\ŽÞZCÿî]œ^ysñ«óIüí§—c'˜ëï«o¾·>{ÿ[›=õñ•ðϯ–ÎÏ“û×gOçÏ_YŸ=½vâÔϯp5+%&ŸE¿d»¾•äÜeFÉ,ÞF(«RÚ“ø–Fi’ë÷“ë_ˆpÿŽþ‘fC¦5f‰ÖÛÙýäÅM}ÌY"X¶ö»èRÇäò®Ðójlcß×Z Ñ`v? FBx?ƒú8õgøÕG¦ŽÏáß+·—É ¦ó¿·¾Ù Ï}ïËmÓ¯û|öÉÝ™ÇwðÌtüÞM|ü«ß­à#ßùz í\¼ÿØt‘K_}éûå‡Ê/~žý鿞X~„ÿÅ7îÀò/Ç–;ÉáÜXLÜÉøÁ©ÂÈ¥­™X-ØúiÍö^FUy,›ÝÒ«ê6Û”t ã¬6¶–Ö?r™ícøFyW°½ÂŸüÉŸPv€Cå0[{ (·ÛÚÚûðÃÑÇ;W¶ïJOÿÑŸgV{+™°=1[xïGçΫ×ëŸ~úi» >‰Ÿ*ŒD¦â±©ÄóÕµÒVágóߑڳ;“ˆT_/=Ù²\Æ'×ü5W¿5ŠâÿøS)Ý’úÁƒ²Oÿvþ6î­' ñX-p'Õd¯ÏìŽ_ÚœžžžŸŸ/•J_~ù%ÚÿÅÔ¼ã…ø»+gÐöõë×ɵñÍÍÍÀr4óùÔãßÿ»Â»ß6›$æ·yó:>2›Í~K“}ujy•[ÿ_ÿ÷ ²åSêþñ‡G¥+W®¬ýí¿œºqöå•ôÛ¿ûß»ü5<+<¹ûÑÖ½æµç+J–ig¨á;±ŸZìïùŠé¬üúÝ&q“MŽû÷Ožÿüsò”·ÞzëóÏ?Ç#û_Οïêë×þéÒ¿:¿Ú’>Qðgç>S(Wñ “…AbŸŽ4½’•ðßN^ú¼9ù¯EãáÿúOlOÜÞÞÆ‰xî%Ÿß]ÅûOþÙ2Óúy‹ÿé;26î¦$Ž3nܸq3¾t7e^´-Eß{vöâÅ‹›››‰DâþýûŸÎú¨Â7þjá«w¿­þþß5Çßê+¯‰¿÷=}útéù³??×lšX•þÝ»oÔéßœýÒùñÇvåü/š%i„£ÁÿæBÝnÖWþÙÉïþ«µ7³ÕšüÁâ?½ˆ¶ÿæ/þÇ÷¾lžµ÷æµ±ßþÎwñpl‘Ïç#‘üâ¿À½Øõë×?ùä<²ýÞ÷¾‡÷øÒþìÜgØ×æ'÷®‘r†©©©F£qâOÿO¦5¥ÌüÁ?š8½7nܰ®­r÷Î;ï|þù畊Îeü…çï¸y„Ù\òúÎù·ÞzK–åO>ù„üj5²»7WÿÉÞ›«««äþ©©©b±˜ËåþŸÅ/þðßdpÓ±uå­éßý÷ÁØ„Êz+°ënz͹+îÚóùOfì„7WOOçh›¦iRiòщ»ÛÁf“ò½åsébä_Ÿû“rÿZÒ¿zõªu—/_ŽÅìS{8þØÚÚºÿ>¬GöoL7ßœ‘Jèמÿ³s¿"‡ˆ—·f2†ñÏüÃïF×Ì«ª/!6Òáõ±H<>…BA’¥Œ¿ ´ªÏ\6¬‹›¡,Ϋ8R ‘6XñxyFg‚…Í`–Uà7ÕdUšÙûÃÿrbzŒý>\ðÿeýgÿË?ÝEF¦èÿîæ|*ßÃ`Á=ŸÓ-;„âñ8p'Š¢(г,}WzúïÞ .¬¶É ÔÃ-v6²†$IHâ±,ئ` ¾Òž*” y Ã”ÏÇ›äY$ÿæBMÏLlÅ+uíFiz~$eH¨FÓt¤æ¿´5ûÕøS´g#´Ÿ%"§Bu˜<°À" Ã)ɸŒfi ç,0*° bô0)°öéB¸¤R­§® Ü¢ÿ$uÙàÒ ày~ 0ªËwíÒ€’(df-{¼€Þ+«‰;Ã0XW „«Á•ĸ֪hÊ'3÷÷íÂŽæ7¤ïoQ»;û˜ü†ôeÓ k yeXÁóÝ5Šztþjajî£ÚW÷Â+'¸’=VØ:²s*sr¯Y£÷|¥`Þt2K<»ÂÛdc@ mÝOäRwÒ«H—K2ÇbK%f8uÚF#¼Ìeü…F£‘Éd9»/6I+RÒ¯ŒOA«›à4ºêIU 6Nœ˜™œzfïÇ>îñZȆL`%VîýucüƒßEÉÂý S¨V`Ñ4»*Ò¿v9júàe–$°LiÑÐfLAÔ i Nô«Ð*PP‰(È6±ï¢¤u|G”1PÕO¢‰XK‡€‡Áb¯À¨®Bï*Þ£ª*Ã08h½ÆJ˜½%žd¯€eY­TÄ앲Át³×`ÆJ`¡zaÈ%+ad&Ýñü )#X–Å&5SùÄCW 9ó2MÓ¨+÷ËÂýXVÚDƒ;ª%•§jŒôåx[B!ë+aË'E†"ÿÖ`×mPßK=P¹½ªÔÏ“ë »ã¤k~GÃ2â;^ Ò*Å),)ïµz`EwÝj †ãÛ…ñí@»á} ,I ᙨï7P Es…éÊ•+xN-þéþÏ3Q&••€Rµåg_ž:û½ÞÊïa¸1ðâApέñªðtœû‹wCÉ"ëçÄ=pJYJi°°;a;nL¯/#›dNjðkw‚Á ¬Dìá5<#U)mj³0Ùò‰Ö¼Â&û¼TÀý+»—Ÿ èctFeÚ>™Ñè«õ®T;Ùüs{é§ñmÔ7k`^Z£ÆŠ1°#°|ÆBœ‚eY“ðÏäUòŒCÅ0Ó ,  ÈUg2úsi|ȧOª½û0 ç¿bƒ9†;,D`a#U<_­³ú‘ìÓ ¨ªª¢ˆÝUvçŠh_7/?~a†¬”¦¾óÕóJîNq÷š*;VŠeŠVÞ/6+Ž_Nî5K¨ÐÌ£d]¢œ Re6E¤DP„¶i†}>_"‘h4…BÁ'ñc¥ 瀪@cÏ.­æXCrÕ„ÑhÜ%};¾¬¿—Ü€HÝ_ie´$%ýÌô´*#Ò¢ž4è˜5åW€|$Þ˜=9÷Úk¦X–õûý•J…—Ù`]̆ô¾cbmÖV+§ÏøÏœ«Õj¸ï`YvK°WA"ˆ-F›Ô¨ J[Ú oh£«´ÄʪèýjX ÓJu¢È”RäôøÁd)2R BK÷Qæë«‘]¨Šz£h °üu{K34¥ÞŠÎÀƒ$SP¶+…íÃ3Âýä:>>V€P­$¶›ìO¸´¯åõJQó#¡¾¸õîÖñÂÙíI—v€âyžL°À±lœ‰”óÐXÁ†øh†‡–lË·ßì—I«ÆvGÕÚÇï;äi±!°ê&°lÀWåÇ£­F‰4s5ÐÀ/ñ–1xGËW)‰ÕÖˆˆå˜·ÞËd2äûïóù’Éfb.—CëœÆÎåR´ÜËèXx<²©Ð®äù »ctËþe)¶"èI{ûV¥›ËJÑ‘„(Z÷GéÐü<õ/¥'àXì0ð– ³ì„ëþzr„é|è/©¿v>å·Γk³¬ÔH¯/£íÀÊ“ÇQ®æSã”%]B8³RŸÜ±™júë&S[Ô_®“Ç̺y dŽ^zÕ´ _(€¹ýÔ×ãf ÈL.‰3Žƒq@“¨„3ºs²Ü\*7Ë£ âÓÊm ¬*W—)%Bdw’I-(M4îÞpýåƒ$‚Ý*1ë“ñ¶ ,öÉåÉ@k¯ €+pAiÚÔÓÇSMqd `cÖ|H @×XÍ?2m¡Ž«vãžç/\¸ ªêÇ ébXÂCuÍS` 4M# ¬Ó™±û©f§³ï+=ÜûâìZ“ÇùÁ«@¬ÐšNÓ 7= ­Ê˜¨„Q×°}‚Þ4Šöü¥@“?eUæ·^©µ&Ö~DqêÔ)EQ8Ž{ ídC»¦o¥ŸþùææÝÚ>J·,Ë^-9ùæN2ñJ8¹ªT&ö÷@Ì”ÆBöSÙXm}"×äk·¦ç1³Ð´¦¢e0æ— ‚MwôŒ8=¨L«eÁ°žqkFGG·¶¶rBX –’ ™‹Ñª R£e/Ñ*‘†€ñ뢷ž3d0ɯÀØÓ5}ý[ã%ݦ"U?D²™Ù'-{¦'ä÷ ‡£øj–õ«d%|½rÑ7¨×ëÈ$ÑÉJ˜ 5«³ äuÍVj XášïA‚m°/kÀÖªZ>GE¢$EGzôGçv~?-Óêã–wÎWnÀ@f!äB¶ë=Ï#{5| XÁº‚Ä–ˆ)ŽHx`qGʯè'™} mn.?ÐÃW'&&FO7sÎæ—–HëFøÙ™j•mü‡Òs›´‰Ûrï&Ä¥xÛºi‚ s¾ûzª¾æ4Ówo†ŸßX…–™f§­ú+\½Á*@ipf·9Ü æÈ¨émétÿ|x¬(„c‚}èÀ›âÅob4c%èÌŽía</‹Týàí®‚'Ctà7ò×Âk,R *vVé>¹™Ô BÕ–ÀÚMM`+¾³ûy¦ såðõošc÷P•zï›"}´ÌK~|z,`ŽÆc”é\âÛ±eÒM€½…¢[Yq$c¤æ¿ØJãJÂJ`™BK¢+ÊË%|»¿Ì<ÌXó•ÇÓµj-Q 牄hÁ†(Ó 6[=±Ÿ®‰Ø)°šóF{ë@Å+‡"ÕñéX*¾]ÈhyžÄ·ð"íü^:îjšV6r²{¾R¼Ð%mÌïPñü¯R°*½°]F~l¬"´%°hšfYV–å(á \&9èZ[;yƒray¢Ï*›&eyjµñÁ¶yýJ¡H,ØÀH98R@(ÂéjŒôÿ¾‰˜²…Ý12…S»¤](Ò®”—}÷ õË—Ýõýüƈñ”NdtëAžÜ q æµÃñÍiI%–#Íij“Wj*°½L8Ðl¸dZ!§C8y9Ê´è—õyU¤CåVòRIU5¨³²¿8‘ºÂñ<ù‹+:ÇӜԃKܸqãwÞÉÈY,ªâXömP­&¹rFÑ›'®V¶2¤e» t"…·­\ã=ëW¯5ONÕâW[_Ù^Üçó¿xMBTÍm ,ÔkGj~•†ç)'ÎÖÖWMV™ÖE‘'wc¯Ý)îú‹ª SÈ‘jh"_€»éšB5=¶ü­Ñ´‰r˜<øz-zÎm/Qåß.GìUF]Ï(¨znMÍyÖp€Ì–ƒæz‚bxŸIÏóñ=1¡N/Jà‹A:3X=ª}Šp*?v:6½çÛë™ÀšÊ¸'°BÆ ,Ù#ßîÎYy"‚ýJ”yø|ê±)î~~C:·Ô¬¤“LªV¬âª…OñÓªÒT>-­®ò;8ü™Òàäþ(«2H˜¬RÚ£–m4¥ÁÂÞ8¥QåDÚ!Å'ŸžÂV`Ïl©áÁÂñ"°ú2h[hLmiÍ¡ªÌD B²^6׋BŠ6NùXBâx®E(ýè34 p²p>È ç¬;Éø¾ÉüÈ Ñ ãaÂÙ m0 crª2ÁQÅ@ÙO µX¤CQ¨@”P`)Ë‚¯t(‡ã 2ãûÞhòìÿèË/¿,äÅÊ¿;Õ´óeŽViÈóÛ‘£Ø ,‹°ca«ÎèMYZ¸$ž^?wN{ö %Öüż–ñ7ï=›y%´¨iÚÖ–¾§ÒÚŸŸý,U¦/nNÿì”ýpäÒæì™Ýq‚Kø²¿µ2‘Ú¦¾÷é}ÈsQ‡B ŽãdYŽÖu«è#¦ ^á°€T`ñ2{9;·hf‰ 8FVâÉ„›lí D…»²7ÿYú¡¨pxum£ÀÂx…?õWîŸ~¸É..×'2NÝÐ!!¾·½9Ý´èj £d—ÍVSiB¸U*´jœ5«žßïEQ*J¬Ê d…°L.dŸÝÈ_Õ—sd–;Ô=^©Å#i…´yz[Zn§ÀÒöE}u¾4{:>}‹Þ+mçØü)¼Ý• ìä`&°,‹3L@GV¤î€µ4KXpö¢‘ÀÒëÑ…×n¶ÍØ`AÓggö‰i§ ŒÇÜ€Y€Wœ.Þœ-WƒáF2åt ‡A€JiØM´f‹-(†~ X‰u¡Röù|ᬮ¦OŸžçÑBÃ0<Ï“UÃÚ€¿!žÿíÉïÓ@U lOU"‹;x^$ÑŠCʯ`ÝD`ÙO{mQáèxkÎß§ãÜÓq( þ·‘ÿì—ßÀõ÷µV ÿò²¶öèïæî \Ú9Ó îÉø Î7GÎÁ†(><‹ƒDbò@33[bÿ…€x8æ8^V_@öÊLƒËäŽS™x5h °,x:²Ý åøtäÌS§@ghµ5q"1>Ž ûÍÍMÌï”|õµ`³ ¼Ì0S%‚üy™I—£¨M‰WƒÑh”eYYQb¯\³ÞˆlJæ²)’À:C$×8…+´F1*]2˜¸–³ A`ñU C!Ld–·à<À0üíb£Âu?žÎÕX‰"ŽBÑ@¼WÈ „Ü™J¥DQÔ4MQj¿¹õl’ÿùµŒ”ƒ©J´ŒÓóÑ*•ª„cÕ 6)$is³h qB!:E fÚ†i%+«pul©‹Qä«*¥ms¹9ý=÷7ÒU‡( "U?v‘ÿtæÌÀãDd~ÃÆW•B’(䑇÷‡B!”ü¨\.ïííÙžKB5¦t°21áeÖßà+|*‚^…©º7D&î‚Ê%”øå­Ù:#ÀL~Ã$}"ÑH¡ Ó´V´ P}?úÆãÊÆt>Á*†I¬Ãš*Ã0•@¸¸öéüí»sûÿùŸö-׊{Dw·Ö& µ !äTý댔õß0"û“ɤ,Ë@@Åb±è—„‚P€²@4¹ª'ùûâÔYÉ_ÑÛAÙØÏû@¯CTììì‹EY–ŸË@,Ø}S¿†N㤫ÌÕ0õÌ)ÌõâŦišT`)®ð1=ÃEäIp`©lXh(è@žš.(ƒ}Xhg¨á£Uj5­wjÚú*—¨Ë”>ðÝ9v"‹èÞöNãä‹.…‡ƒ¢Ä×ð<Ã/ñ´FQ£Ä* £Ñ‘ìîé[_˜êC#ä[:ÇË—/“ C0¬{Þ¦.Ñ@€Ï×ye±h•º¸­Çh”ö,¾Ó.Sg°á›ššB³6UUw2y•RË\=ï«T;9ÍU¸z¼; #$ûÆ•—ôDðù|¢ÌÜOß[F{žŒl±#Sªéº®û/_¾ŒìÿJ•;Yâ)¡¡€¿®f2ËÉä¬óƒxx 1äÔ4+%JÊʇ`%°vE”ίqQ>ó´ÃíK•œ˜(0m_ªÕj€Ü^i¥Jf“cáË—­\¼[_}…Ã1r£µ¿N~ƒ¶cµ  ³¤³ædaäí•…f )*ñê«¡–a§ó#'K‘s;SH‰Í©l’TãÜÛpT`§°áËNXYµð”]C³{@!„$¥õ§04‚5° ÷ Î-  JƒX5€£ñÉ£¸Ö¼×ÖűKÉd;eVnV8…‘eiŒ[ãàÔÞØ•õ•~v²ùÆjÁ>¾˜H§Ó£gÏ€Òh,ÿò—diE#åoèCó2_×4ͤÍ Íe´£SñZ°ÊëVÌX‚­LiÛH¸æ³é«ÏçÀ´N7==˜Ÿ5—[¾yÓö\c‰tÇcpŽÖˆÀª Äߣî…4J“[ñ°”¼Âr‡„§ ú8òÞœO¤GgSx•8r±©Kè¨À€€?ðãý·Ê{fAbG`¿¸9óá|‘tˆ§4ˆVhèEAi¼\Šïm58³;NÕjåê¶‚ þµ¯k´ª€X­ðÅæ„¹™…‘ņÆÉÍ ­2 "`)¨¢ÿ Û¡<öÃòIü=þ<úˆ_ƒ+UbçóÊW~¸2 ¾#Çkzó¢òrÐ0'ðúÃÅîî.ò–Ú™2¼–7ëÏ0úbI`‘ñƒ±ZcY išT`i?øM¦&¨+wp¡Àrn:*°h• 5|«i½ÇT××€ì[)(S„—ÜÞ ²ÝÏ<÷Bèe3:¸7ç}ÓŒµ¿£ Zúßd%üÊæ‰Í}Š˜(‡ÄbS`òÊÛoïíí=xð*.|›çõj(Êœï~sj1ùÎ;Õ½½åû÷mïE_XÒ;Íyrh»éLÔÊB¨ò+¹e*Gx`5±ÒgÚ£¥(ù[¡†Û`UëÜÃBuïöÄvôZ)Ïo ¶5oEg(€iš²1÷eY«núöƒ¹fgA†’îñj½x‚,1-¥¼Â²l$ mÐmœ`3íOûŽÃô•{,¼3R÷¯Å*5ž@¥üè¯ÿYY‘¹J4JûÁWÍGæ:PÔW¹ž\›§ºZ­ª e'P˜Í&QbŽã(Š"}©$ZÁSú‚P‘Z6Õ©VnÐ*ÛXŽ5ÃD‰;‘kÒáp˜4'Ò@{<²©Ð|ÿ› £hà+©b^Ó4/Èw Qô:ˆ½¢ÈBŸÄº÷ o·†ÇŸ»ÔñúÖ×ïéH`Y;VDÖX1©ù¾œ| Á†ˆoJÖ÷tɇȩl°.f}%2 –h9)°*Â_|?Z›ô¤¼ÌNæGpl“Érx²–èø¤ÅxZV}{ÕåY^* !E6(µZWX%J\@iBTq•ŒŒ¹¤Œ¿°lÖm•†¿z[—€£¬ä´J}ÿÙùõ˜AI„:x‡±ÂÅ‹ñöóçÏ‚ÿtúa³x2÷[»¯+r³Ùžžžœœt~dë}@£Ñ0iIÜXÖyy ¯²PöQÑbóúZ¥Lñ<Üm<]2`² T9ó@¥4JÓÂe"O»A˜7\XP†?˜oW‚ÖãYbô@†Zwb «(Ô´Œ$Å«>¾YŠBþåø³K2*°jmXÑZàÌîxšŽñŸ$I¹\'6ŠV ý¢ÄÏæ’Tk;˜û#~Ð4mmu-]Š€t¿9w–ÃB:®ÑØÇT`QÞRóP Îâ)Š"[rº¡ÑǧæêIûÈSÓˆœ¦iŽãLãl–eEQL§Ó¤[tC`Àéݱvà8Ž|«y‰%Ý,}„W:²Ïkw/2@xu<Œ ¬h¦Y즋–„LXj™ÊY ,’ÎN—#V+ÐjOª7uåa ®¬y@åíµ™`Ô«zP +žù·ÐòX¡üîû+MÖt>n*[«ãOâkþ`»ŸÐ½ÖC;*° RD²ó IDATó¯FàyŠ;ù¼Ù¹Ì~r:¡ŒÌýð|>߃f—¾]ö-/¢¯B¡Ã0¹\ÎöÄ'‰ïZáKA‰›Û‹@‰¯-Å›sàt)B=kÈž8qbùÙ3òô[“¾§±m8±!ͯ7 ÝÛi4B›\iEN_0˜ÝR&–@â¹|vÉ …r¹\2[Œet»tõôYn´©Y¦çNA'8(°xžw ¨Pƃ.¬ªéR¬˜Í%7ùçá½`C´ e 5C"ÂT~äYlG'°xL`Ù;]@¸nX—µV|ŽãÐ0{>;ê@`]Øšî8÷ÄP)€¦›>»ß»“‡!ÆXdF–îá>™§4Õ}x0z7µ†}ïžGÚ˜ÎhpýÙÙOfî_ÞšMT z(´4míF ¦ýh”̪ô»Ë‹ñ`8H¥Róóó¶§“°ŽQ8Ž¡fL.Ö·B™€’HG‹­A¥ÑØ­»·ï¦žJœ\æë™`A¢Ô4¶ÕDËψú¢„™öð0˜ÐÉŠëÁ&—(ºÞŽɱíw­ï'EQ±z`´ÃTÈÓ È<Ù >^ßÉqV ß‚Ì@Z¶óÀ*Xc¥Ø›+§9•9 'N§Oçr¹›õ(¿X=à“ùPM ×ý‘†2;¤|±X,„Sa2—Í'{ŸÈšý’.˲¤·};t«ÀBU‚À¢žÖ0 NÜMž‘^ƒgflòÏ‚%£"°L] šÁÎÌÌ P)üƺ$°œàyÞä²!(†ËŠÁÊÑ´ÃûO?™ \k¦”€pvWþøo(Š¢êõ‰çÏ_/íE ú¹„Px¦Z…š?kOÔv›…ð€!„ ,œˆ0&`eT'°Ü M[á“áºÌ‘MQ”CÓq"›¼Ý _*q5Ò;¿Yfã²™©cÌ ëá §Xû;’$yÖ@£,êc›ÙõÊì“g"ñàïýÆÑ_ÜgW,ŸÏW*Ù§`Æ=›ÄÈ !^ Àµõù"_åe–T`á,óíà#\Þ+\ZÅ9i•ZØŸžžÞÝÝEIcfOÛvÃçó‹Åd)|~gj-¼G®ôˆ2w"›d.Y 3A·ì¸ƒ¶Ù¶¹,<¼ÌrKQ^1?£(ñëQb³ãeãÕ`ªþá“‹Xm¡_°esë°Øå\N UŠÒ¨7WâÕ a ...v,˜í-†ñù|¦Y>¬£S‰•ÀB3 Ô,¢Ÿ´âÓ˯•˲$Ý­<‘(¶‚Ù2Ûì6t’  !ˆä­=¬áŠ‚ÁóØ`CôK‚‰A&ŸÝ+°.lÏàh [ù³%–!li% ò žÇüÇ5'¥X% Ø ÂÖePȾ_¡ô¤cÀÜþè«'Pü£m«0Ü¿JâçÎÙd5Ñj$ jGž7Õb+Ü(°p5Ä`C,ñµ*aâîXÃK(°–D+,‡ëo5"°Lߢêã÷û‰D¥Ryíµ×ÜÒåò Y’±?1þvV`‘Öf‚ªùübµ´ª¨?û+`fÍ©Ê@6X6Õ|>‰'ŸÅ¤ÀrC`©‚Ñ Ÿ"NÑ:ÐÖŽ9Š\ N>o|pÃ4û²×9£ ;|Û[B÷ ,¤ˆÄŒƒ+¿ûî»Q²¿ÈÞ#}ÜÝ KLã\¨Dˆ|LÙBP8çð%2ƒ•õFÁVOãÛ¦…ßü´)…‹ìgjµ™rÎà äÊœ>|ò7œÚd‰^xíõ.ùJ‡B‡ÃXcU«Õȱ¥©wîˆx#4YKH´"©2¥h¡†x™}wy,]¶³°‹ ;@ƒs2~W¹W2sׯ¯ì®,mÙøXÙXÀ¹í©X%øÉ¬Ô?“Mb&Úý#‹~=@ñ:Cvr xÙüŒˆ~[x(ëad‡±R {eZ½Á“ÃŽ!„û¹º17^ŒÇq@àÂ… n¦¦¶·`Æš=ê X@„~ @-2¡zó yei,ÿðýÝ2DêK”+eHæô–´!øxrBŒ×)oñy€¡÷¨‡&šéräYt‡<š³#°:*°h•b5}?!lÐXx¯¦âÒ*å—[Åõ¢X©óõD9DµÙñ<I¼ºnNüÔQýÔ® “´šÃ)n¬®X ÁÂÞø×cKUC¡G` H'³Hh€>RšÆH­”ö :uäØJ`‘µ{fffiÉfŒë—½ÑuÑ^EµÐîRc€p.1:ºÖ¹´ŠèÇ×g†Ól Ž,FGk-¿¤Ïïª\C3ýJ ‹!ÐF‰ÖN…·ÇбHÍ"³¹$\¸pA„n™üa½é¡¼–j!°$ÈD„¶xcõÔ/§bŸæ±¢nÞä÷ûI](ž$„ðÔîhPjRN,Ë^ºt©£N ÖÀr¶F"Y–išÎf³V¯wÙîtBXöëǨß}ż¥k/ø¬ b€˜ yî˜Ã ²—J-–¦¿Ø.CÑ·,{ˆíd »kµ#°0«KÞ"@hÄ>Œ} m®Z ‡õmkÉ­pð·"Ëf“erõêJ§ŠÆ7«¼~…šVìxÇuVÿ›šX¬,á*¡p<ãëgÈ b4Ò# …ÒéÎI0Iô ÀŒ«PØ«c$”)@xdÂåÓu ÃØ*°Ò%3¢(Ê%ùíÕ(\ÒþrìW†o®ÖzöX-À>>—1Î=òP ™þL¨ÀäŽ+K¥©å ¿˜š èœf&“Á‹Õ6Žu ¬¾„ÀÂÂêtX–Å¢$¼¨i=‹êÕ+ë™uH €G™¾þW _“W¾´5{¦•)÷S¶–óø$;}½~)“Ý€ÍP.'–Éoɉ@»¸ãé|âéÈöãiþÒãfy©ÕgÐJÏêaaHò£è lmb:0zuµé^†óñ$Ë0ÝÎJœX$Ì’G q=µZ K%pÕp¨Ñ¶7²‚UVaÐÈY¡T‰• N² ãL`µS`ám `13ùÙÔ#ˆÔüÑZ€¢¨‘‘‘žg|”×3z°ÃK@`É–”Ÿ2Érx13áóùâñøææ¦ÉhFP¸T92YYŠm€¨p#UÝ÷*ÚX !Äìúª«À{[Ë¡a€Û·o[ ¬vSk|Qá ì"D„†à3†ê_y ÔƒŒv¡›K»˜dI—"”q¯…’ãÈŽ!„Àf4 ccâN^YßÙ†À«Ǥӳ"Æ ƒT`ÍÌÌ„ÃáJ¥R.—Ëå2¹bf !´žk ?t3,EEv  ˜¯¨¿>Áßú* Ð4/+è ƒôaåŽ\Æ`%]M,³œ3‹d ›,ÓÇn ,—ì5G9¼˜™@ïy4 • BK',c€pn$±<7·Ù«32E¥R3¹Äf(Wãš¿[²NTC2!ŒbY6Q /f&LWN•Ã`G`¡ÁÄÄÄ{ñSßn>Üäô¬…5ò¯#ÛaRÖväa@Pâª0±«ÿÑ—¯ÌUA©µò ¼ ˆB¥^+aÕ?ES¾³gÏ2DmÚ¿wyÌ@,ê”{¾·BtŒ­]Žõ¬x¤‹!R*ïüÎŒce®(Š&•nƒQ¦áïÈÈÈúú:¹ÇªÀ"OEñ7Þ ÷8?  üÙô#Ó|”ôþH—"ÈÝÖ=q`U`ÀÂÂ:k:8~ýáÙ;é5œ³Cíò¸L?¼™ó`£$Ô¦6ô·KŽ'#Œ$ä0u/™4íì¨ÀrA+œ ¬vu'(ùH‹Ì‰¦{SÚ)°:VFžçÏž= ÷îÝ[Øw8²ÝƒT‚@UÏ«† MÓL©´ª¯âP¼¹©‡žº6«çýÖ9ÚÜÜœIÎL6x»ãÌÎ¥ o£ü›úZ+å|}üíì~2ã/ø$z”¶ñÈ^5ô`‡—€ÀR8Z¥"õÀùØ)af6 –˜{:uêT.—«V«$‘DkÔyfþ+åÞhIŸZs'Âøø¸$IˆlöûõØ"÷|¼)W ÛGèÛ,„Ö&ÃeSÛQ%Ê<¯°k)XKun•å»t®Í• 厗ti`¡Ù­R¬Räшγv ,g4=°7e™RPlPG÷Ž˜g'·š!BsÒx¼h4¡Â×ÿƒs?øfñµòuô4ˆ.Xnê²Ã¼Å¤À"ÁzÏ:Ž|zZ–¶¶\.—>|øÖ[o9ŸåáØ").²Ý&ª!Õó¶˜ü%H-ô‡À꣖õõž›››ššB7ž«vŒ­q3®&}ÜMàV"‘ØÝ5$÷ìX Ñ$šÑèkëÍ×^½<w0üÖx1ö»÷ßà(öúÔõ§ÛOWk«ä·d£°¸¸xóæÍÑÑQRŠu…;“,™ÊXÎÍ͹¹;¸hÎ(ŠZXXxüøqÇSÚÁv±Ú:Íp!eYUUI>®ÝÁáºo×ïÊø™ôörŠ=ñžÄ Oku;äß:UŽ&2‰J3tÎ=óÒ4»Ñ€Ñ覩*­2*-ó§Ç»DšŽã,¿@ ®ÖET€¡õ®Úv™ë0XíBÛ-È÷l©O4Cc{wîÜqN^ãá˜cj³øý/±9c à)ÌZëèe‚iá¡¿ ,Q€ÕS²Ë +‹„“=Ñ4”;dkA˜ßOŸUNL,ŒƒÑ¼¶+â  ’2Rš¦@¬j~ˆléoÌ>ÀÈó•Òæ7tKMŽ‚å À …B©TJÓ4Y–q¼¹-zöÀr©iS7är" R+Ð*Å£kg,÷•ѹOlç±Jô~ÇN&‹R¿6Aw®mÎpïe­ ,Žã¬ó¸¾(°|R[“e’ÀJ&“Ç™,7«¶¨Yîµ=ý°duîöl/†À27* 4go@Í#‘Èôôt*•ÚÛÛã8.qßD–.’iõºIt"LMMƒÁnMøœoá’ÀJ&“ØÖ:"!˜›»„ë~—–¿¡7”¦"iDy<èp€ôÀÂ;Y…Á F:&ý_¡GB)´Â¶‚)…º£‰{ç2i¤„üÊT}ÚH›lqݰK ¬P(ôúë¯7-ÀX›¾Ë[Ø">yNan0ŠÑ|=~÷f9Ñ!·‡c•r¥c•ù!„&8{`u S/Ìq\(" ¬v ¬v÷5éóù05;;ˤ#wJ«vçé˜Î'®nÌR~d–çæ¦¦ŸÑ$ €p8œÜ±ñ€OTÂ`ù)¼0úဦi{"£hóÏõ%îäièR•J¥R©”›;öìÕG–õ”vu'D,jŠ2G–à€X…1ÙîNe|šøKPñzÄÁ…auS嵃ëà&î/^ ,[tôÀrSy“U›^ !Q Ñ-ƒcŸÏçÒËt€i)´«3x³CvB˶ö¢úc­E¦d'NœÐ4íí·ß&w¾ç¿zƒùWHœBØ݆ú|¾ÙÙYèfùÈŠvX¦¹´õ°X,f5ÌnüºæjYŒ–YåòŽ;(ëfÇYîÉ“'Ýð«Ëª4ž¨Œ Ši‘­­ƒ†L9£p¨•íBEQĹÏ]–ÄaüÁ0Œ­"Òý`Ýãáéõ7½ÝüEgžÞ{î-u 2lƒy­P±«.ÆT—Bh½Z8ƪg<¬w¯À2=K,SUé5ÀI.xµrº\nê*ÖÃÙ‚ ûñã¥Øëk§@³ïv{0Ï&FOÑsÓõ‰LÆ&M„CÍõFì]qv[Í?£Ä ÙyheãB£2Y–5MsP`¹GÏ ¬XÎÝP»º«ÎíLŽ'ÇyžÏ<ß²=ÅVÕGË´4¥iË6³^e½Ã­P5» x ÞäœÂÐd®gч ÀrŸ›ËJÈöL`¹T>Æb1Ôw3 #ìÚNâè€S}¾½XÞPÔC'¼,VÓCÇÂf‹[UÐ@5::Z«ÕPβ®X›³Ó§O£º}æÌ<”içBÕ¶v!h/Þ½=+5È#Dê†Iõx!©7[CžçGGG`kk«Ñh$+úÏeî¨ç50Èèàe‹®ëâ#Yh.2­Ò$«£u—;_ºQ`µ ! ‡ÃÝX&õ¥›Â' LlYu.ðû7SL`xÕpÀAhx”™Y~椢(&‹t(Ç]]•¦iœTúªÀBƒøp8ìóùТ V·óÀjW<ÄÐ4“¼S¹°¹Õ"È4úNJ'°ÎìNœßž¢5{5¥ÃMñ­¾€t:N§wwwm ,ÓÅ ðjâ c7P|÷Þ®–G'­þÊ4M“$ÉAåƒ^g¬†’M{Ë/ ç·§Ï%Î¥"©ÏjŸUAï.qimW‚M4¹ÝõìŲì;#?~õÓ/ñ¶ž7ë BÓ4Ãê¦Ê0d]}Ð,÷ê§~)°z!\\\ÄŠ¯¿þÚ”›¥Ý¬¥êXξXÕ¹Û“=¼x¹,S-âyÞåD÷ôéÓ½Ýݹ9Çã¸0.oÑñ¦ÐzÒÃ#°ÂFÖbf%“Éóóð]é»ýý}ò0Ç¥{¯TI{p´zÇЛ®V›õBU?K¦2‰¯éwì™ÀrXoG`™tŽ‘Hd{{Ût˜3œ‡ ¶0MÑ{MÓÅD ‹÷äIJÃñŽ9h"†:ŠùÁ5Y^þäÓa˜$rŽãƒÀB=B0ĉ1ÜX,˾ûî»w$/5R6¬?¥KÌzÛVÕ̳­ˆF£¦V¢«Ó= ªt½Ä×Vôù¡:3·ÉÖ&ëXÖwÏ'rÞo‚s¡›¾llllii tP`Y+ÇáI¸UTåpSÓÁåôXä†)Ã%ë³!Ö׫gVC]*° ¶®ûµ¾(°zhÙ(Ú[ÎñÐ/ eBhŠ<Œ»;4g Ü8wÝÈB¼S¦r… '7„._uò=$§΃`ÒFÄD`Ù–Ü=XýÂXìÕgã«'6šÓ€­@ÖùxÇF&¹m²Þ±ùùy<ëv¢ïžç‘ŠYUU‡.¸?a`¬ÈñjjýP@œpXï!„нPåܹs È¢øí·ß’³n7§{,ÔrO~}¥<»MÌ–Îâm“ Öá…’2+Ó]x¢®JÒ›ªncccÏž=ÃhWYAhW•ºòÀrˆ  ¼d ƒ Ù ÀbbçLÜ_ˆËte”üòù*5Yºƒ”Íà eÈBØD ,=„РÀRmSB—¯z;ËË´ŸeY“e•›’$Ãަ+áIØxÚÚáצ÷(Š2Ú@O£Éd2yÀ²a«W¯v<̽‰{GuŠWØ¿û-—wìxS÷µÿ€/­öp4¶×~üµž” …Æu¿drTÖh40wƒªjowtvj7y*“ðCõÀBÑv™mÑ­yžŸ˜˜h4~¿?`KVÛ«!â ·f<ϳ,‹¼Üu‘üÊÔk;?¦‡¹ÀÉË ûAŠ¢x,¯ÙÁMÜ{öÀr_ý;*°pò‡»wïîìì ¦—Üýø¼/ ,¯Šy8 á[å^u¨=—w? gÔÕ}ñ@?f ,2'Îýû÷·¶¶lÃwïL`‘ÞßžFt€aP~ ÿœ{¬n º‹ˆThµ¡$âÖãÝÀäe»ßúÑv};˜ÙÇ\å÷ûe™¨•^5dØþñ¬Ö@IÕíaÎ7í¡HNs~Ïk( Q†ìºÊô¹VJö}¤ ÍAjeG¹¿–³:À™À€S§N9|kÚÃ0 nÍü~ÿ… ö˨…0N–»4, ,±A㿦JÓ`§P~Xî»Ä|‘ÕÊM-î*ËXý !4ô†Ýžíá¥ÀËB`½(Ö‘Ml‡Å¦Fª…q¸”ƒË©ÑôZ¨¡\wîäzV`1Š^¿dJZo8µ ,=(°°,Ûh4l/b žçÑʳ,ËŒÏê@ p”÷óp˜ —¨ö>̓"ü±‹ïí:=Ö/ÆÈÈj%àpF Ž £™ØÕ×Éä(¨VӓܤV:x`Y¯L¾u‡Bh½µmñ\X8–Ù¡ÎÞà8·÷0Ð4­Aëa¼>‰Ú3ö!´Gì%ÂåË—;žhÏónÌaÈÚgz´X,&I’,ËŠ¢”ËeòjЉÀêØ8ô%„¤Ž½ð¶†ÛÀ2ÕáëÕ_ØzRZ³.ÆíLp¯À¢â·òVº† Võ9=€–þRmD²¤<©Àê åREîGñƒ$å¦$Á`cŽ~¿ßhEç ®4DƒB`™¼{ƒÀbfdd„aš¦£Ñ¨õ€¾Xóóóм%Áñ§+L¤' £CR`YÚ@å÷ûÇÇÇÑv8¶àP}\ZLšŠÔQóÕñâè,ËèééUÆD!„ ÂéâÐ,÷ ,$ÕÇ1³]A’rêAFq·¶¶öäÉò[ò`« Áe!$/âÕBvBËêh/G!Þ¶ !PÚ ÷ IDATìoIÜ(°¬ƒË›9ð¼Ëô×gg1³~Ûø}#³>ï‘ÇpŠ«¡­T`‘‡!mÅÜÜZ%¦i«-Ž'X–M&Sðø^k‡7R`X”ýôÕvÏñ„ËäJ1>>žH$ ^¯ß¾}›üJ„sçÎ9œkm©H/È~!*Ù›90ô¿]nf,a\(m§À:`­4±½Ð^ÕG+ .,,8páÂEQžÝê.ßU²ÔÁ}{, !¹Ø­ºÀð†⦊*õ·$=(°h"÷ ¾ ñÁ¯¬]àA,ü¾qZÛŽWT…?^¼x±ÑhȲ,IZ…î£ãõÀOPl”W ”ݧV`‘{.¶ ¨¯÷ù|¦¯:6D&K;ˆÅbÓÓÓ½•ÄÆÊç͆V”2»Ú)°X+,V»aa¿Ö;ѽlW.»U`¡=ýR`% Ô&(ŠbVÁxÃÒaA% ¬Ö yðHÒƒ„öp;ÓÔÕM °ÃÓuô\'ãvᨲzš1œ–‰0bÕ%Nkš†jã0…CVg½›æ­t  d±>h&&Y–%ë}Q`™Ð³ ì(oëEÚqÓ~¿ß”yp°@>•§û\hšfë1¸V¿X(aY·±Ì¦áÄÑWi v>Èñe¡@LYñöÁXíö8x`PåÎIm!Š¢(ŠV…Z À?šCMt(?*L,k½EžëuˆŒ£Ó.‚AÕ¬ƒ.5J8ˆ‰{·C0›±´©Jét:«ªª(ŠÃÕ‹üxD ,2Ç—W =Øah ,’0¢þœ={öPoý’X=(°¬«p”—íe8`௠Ê|’À"Ïè™ÀJ”Ë™ Ûc•QŠîÞv[Ë¥ÖÀƒ&ê©W †EË6ú Ë”™¤/5Žã8’5póS°,K'“ÀòÖq†¥'jg¤pp–¹.XGC`9{Ì·;evvöÁƒ¦ã]ZȹÂX¡‘ :¯CXÈš¢¶þ”´F±²¾$@qÍ*0 ¬v7E,pÇ«u!8ìá‚n@iÃ2ÀöphNËÚ½P¾£¼¯­‰» È­ƒaç´©Ý¢/ ,Ê`ùá݇äR‰ƒ]EÏ!„‰Jˆ$ªÚ¡VWö L³f¯2ì<°zÈ"tL`Û©&ËMCt¹_šðb—†*)„tK`™ËMá '°`tttee¥Z­r‰DºÊÏ{ ¾›‹zÕp`Q§ôv^žÕMk«’Yz¶+%—?]¾xȽ·ÛkË%¬§[CɃ;Þ®?kf49=ìúl/<«ÏpÏÇ÷íXε=ÃËôW°·ì!¼&j@.X’ñ~)°\¢VÇäÇA¡Ü€¢ôá'ÕhØÚF ®ë,òã±"°<òxHàø‡´Æ±"ð ·žn«À¢(j Xè€ .PÕC„þAX†È¯CXÔ€ °4ΖÀꘅÀ ÈêìòÅ;`ýréå])°Ü4S¦czcë(ž1¶‡CÂpX/ÐõãX…Ò^¸É}Óº )Õîcé<-4ûçP(„½cLöÉ=+°Ðv<¯T*FCÓ4“Ûõøn¯áP—¬^9†õ¹^ØÔÄÁõÀ:ŒNÍD`u;7Íÿû Í“`  µÐÆŒÜ$D8ÇqWbú¾<ÓÅtUãÉm?x Ô)"î[ãYÃâj?Ûp2ˇKÖ»3—X.a]©u °Ü4} –lÉë =Øa8 ¬ãB8¬V»ßÓª·÷+Þx}èpêÔ)¼½¿¿¿²²‚?vÐʲìÕ«WÑ6EQ(š@Ó´O?ýÔ:€>)¶^)„ôLÜDakcpX‡Ñ©õ %áyþðútòÂ^E\tlEm ¬£ñÀr3õ=>Vïˆàâw&c—¼\ ƒ akãýÝ2ÚŽªtt§ˆ¿¢ûºári“eÙP¨iq@Gš¦9ŽÃÎŒ¬Jù¦nX}!°Œé[½îЃ ^ëȆì/Êéù0¢-\ÞŽùË»P`iAúV4G'ËSEèA…û~rg¿²€w«À&‹"ã½z8°Ð4Íà$ØÞkP,²Æõæ°k…©ê–À:š„†”MOa;}=–«ïÔRYÓÅY–•em»P`yª«a@àùó¾*µ>•ȯ(¡³µ¹{¸Š¢ˆWaA0uÀ¦£c¶ßnXÝš¾·+WOgyx‰0œÖ ´­}Q ¬™™™ÑÑQ´Ýƒe@·p©À"ƒÃ­ƒ6Ú ýèw='ÀryY76“ÖS:îV ("BÊc°†„ è?‡™í1Ça¬Ê8ØÓº9å ,/„p(@(°l“Ó …«Ïç‹ÅbˆÁ1­½ÀÂC…éŽÇuA`‘ðjáÀBmÿÇãý=†¦Úâ…Œ Ý8Ù¹DÇÁù Q`ÑwÌò`ƒá$°^ÂB¿ß¼†0 ƒÇ Î ,¯}`8Z~ ˜¢úU/úµ´k:…çùH$‹ÅÚ3(€nëîa``'…\Öx`¹aÒ@,SUUUÕp8Ü—bxbBŠìZT[ëðB‰D"‘°=kXCMç8®Z­:ÆtöáÊã-E½ˆÂþ‚\Jé¯ÖÁX}òÀ"[QHö`ƒá$°Ž‰û0MtI¸Q`ÀÔÔrÚÛµkÃz³×B ¬É•#ú·€lêÂãñøââ¢Ã1ÃU¯ YÃ5M^‹ú—T{Ö XG…ÐÍeS©T*•êËÝ;À` Úd5Á8 –5ó—›w{X ,Ó“Éd4EÛx£-8¤û¯÷‘ Óét:îË¥Û«·öÄ‹ðÐÃ9z{&î/*„ðˆáRÕ¤òÖ[éXh.B)Šòù|}¿õ!)°:òbêÀ¢4Ð<.y`aPÚ·C¡Ð•+WnݺU¯×ÑžAy{@u¼,­íêE(°L§»œÜë…›¸wÕzhž7ëPÀP óFƒ>2ì(˜J¥R8ÙMµíS!oHêÁÇiôÖ?¼@÷•…ðˆáRÕé"äŸÉ) Ž˜°í×Ò®›ÈßA¦´…ÁKÂLhšáGþ ƒÁ૯¾zëÖ­R©ž‹À±ú)ÈFó:ÄÁ…aæü,š¦“ɤ›³ÆÆÆ‰„ªª«««})‰sÙ0Ž2„°«jn äõªáàB%¶ˆ-DÉ‚5e§éš¦»júdâN$òj¡; 'õš¸1Ú=Ww¢YΟéåÀ tn9ÊÂá%°ˆgñìƒ é‡ ¯¼òÊÝ»w³Ùì ¼½ñx¥9 Í˲ãããh›¦écE`yæ;ÃR©¹V`ðU ‡Ãñx¼R©Ôëõ‘‘—K‰4M£Øº>zBÛÞźó° ,¬øî:+1y°Úþ0„Ü` úȰï‚)Óz» 7%ôÐÕg¼$V»ß³+–¤T{8¨—$éqÄë/*„pXë5 iªÒò0,`YöâÅ‹OŸ>}Ñq‹P( …ú{MŠ¢ú{Í~Á㬆šFö6†+Çãq@é2»=Ý$à:HIœ/Žq¨}(Ã0}ñÜÎnþ%Ášõˆä~ƒ82ì¨ÀêýaÄ<‡0œ–ÕCîÈš•—œÀêRåe]äãÿÇÇÇ‘4ãÑ£G’$5Ës8 ,žçñtÚï÷w]Öc c¶¯. J{;’¢¨“'OYyé›NVIˆ=7©~Ü `ZYˆ…_nÑ’j\çãì’,{g–äXÍVÞƒŽÔ¿Ž“Y`+ndv<•®:Ý8ËC ”íÂTX[$€Uûw9rdçÎÅG9äŒILXGs‹$NaâÈE¤'ÊŠî¶éL‡žŒ±ç¼uÔX½24©f„&ÆþÑ ³Ð៷.¸ýöÛûe¼¶oß>ù7|ðÁ'ý46²%XóÜüÙ"+áÚ?ó–[nÙ½{÷¦¿‰Ýœdž€ 5>b‚Ž(*iWÒèzypïÐ0xX `e?â°ª‚“ØZn¿ýöÔPWys}ÙþˆØ Áœk`¹âs§'Qû¿tÜÿ‡Ã€OÓ¼Џ¯^,“9»¤*Vez"ÆFÉ–LŒpüó¦›nºé¦›úM®;}B¬î>6Ã׃¤UÕ–‡ØÀ–ÈÀšóäÀ^ ÚåqzBöZ®™@ZFk'3î¶íBŒÅwDÕoÜ¢?ÃÂìk‡n(+ŒY~ã7ÞÿýUU?~iiéÊ•+sy´djSÄN°6õƒn(˨Ou¹ÆFÌÚ¬9çSØVÆkû÷ïï°bŒ[+cÝ3Å ¬-÷ÃlÍÚ‚ä]nÆÇ”]M–›Ù:•e¹ÿþýû÷Ïü‘RÛ±c‡ý²Ë¬?6ÙԨñù ´È6€•êa1q2ˆŠûî»oÒoQ_9CSF—)ÖÀÚz,ó9}KbL±v¯TmtE]æBîu-Š¢(j5R»<1ެœ ó² `9räÈ‘#Iþê ×Ò[GàÄD~ôk`m¹–/EG?Ôˆ`å‚3õº\Њ^XEQìÙ³Ç~Ùå‰qwŸ ›á B–´ª˜@~6’í·„jõt>IçQ¥Ó1ÅX[.€å3°"!,MU¬X9k£Éò`–ÎíG·¡V¤6kÜ ©†“ØH¶X ‘5"û LâÆo¼õÖ[{Ÿ÷íÛ·Ù?¾¥X¦#–±ˆäBjŠEí5ÊУ&ý¶cÇŽÅÅÅÕÕÕÞ—]žs2 ¾ˆ;qd9d`a°¦ïöÛo_^^î}Þ¹sgÚ‡é²`ßPÌdù¶K3ÖÜ|óÍ7ß|óØ|KgMú@2X²¢_1ëcMÐ uqýÙ@{öì9wî\ïs—XnDìòc¢›9ÒXجé;xð`êGá"¼¢T¹œÍàÏ–ÎÀ Ä‘si>u¶ýhÊ,p|ßîÝ»5X!Ì—‰¿,’ærY°…¹¬G—+­ÙŽ[:€åq„P–ï{]^"b ŽæÜAl¬N°º¡,šNY¶ô<£  ɸÍI¶ºÎ¶mÛvìØ±¶¶VÅöíÛS?Î|ù 犖¦XÔVÎ*KD¼Ï7£Êò=nø¾ýû÷ä#Ù¶mÛöíÛ;][ƒ ¬ü0Êá!6B é0QÈ„|͈[o½µ_~+Ól=EïÂÔÏ€éaDTek`é¤ÍÜ 7ÜpÇw¤~ŠQGÎÛrjEܱŽ"!n{É #GfÁ%Œ ,idîäÁå¥Õ¸UóÒ<Ð Õ”¤`a°Lp+g]vtá•¢Œ;eÅ"ªï(£Áòàº!qd=¤~dÁ&B–´¤˜Ò^.DGÄ ¬6‘Ž{C±pR¨wCz¢¤‚Ký`ʧÇÌÇHIÖ `Iã2ЄÀv3XH¦´»"d`ébž ÍejSŒNUŒd`儎(‹ž§,¸eÝP•m9¶äø:´ €…„ÌЉ†ë†U¬> &A %qTýÈ‚MÀ*™c«q«éb7G•±W$µ²À‰ iö؉²ªÕ£•Å0ì (¡å¤ÙE©@d`aC°Ð ¼¡€4leÜuE÷¥l­,¾ö­ª&¸V²ÇÀ„l÷ÀRWL b#ôj$¸f" ´œ6—÷AôJU¬÷Dú¥2ŠÑeN('2 f!¶|)d`a XHÆ•‡à ¥Ëît%| Œ‡“¼™ˆ\»$Ž6Ë‚;SÏ[sÑÜ!ÕÐd؃+’ îìo«,0êÈq5°ŠŠP²¦F³ÑŸw'½P–/DG7ÂÂúgFCaqàGy €…d\ˆ‰B"óu=µ&£'JªbEží†”¢SFHhGEÑ´Zd…ˆXHÈ^3‘ð1€-Ìç}0OÐåãWLÙå°£“JÑicc5lçÈ[o«„Ïn"€…tÂÀPc+~ÐjÜIÞ¹…PT,bÉ”H-ð UØXÍqHEd`¡,$JSk ás[™‹#& Â",e´XÌ=vœ]’©E— FÜÐQG ÉpÈ%Á%úÒ¦j‚» ” ,Q±öFeå¬ÇÞjB7”eãÈÔÀRããW4Ÿ,nÇ–Ç ˆ6°Ž¿þ ¢Ü>ËfeÄ”•ùfôD5¶÷1êòÁGæØrÖ›Œ8r&Jº¡Ž¢½ ¹­.R?Dù»ÏhD5¾f-ÝPTUEÂÇÒ\¶GE7”åŽ&|Œƒ¤+  ì\´¢ˆ;`!àŠe2a‡~1ŒºbXÊךd!Šï³ ÈûÈP“i7vtÐÀ‚ÉÀ"ø!*P,Sš¯ùQ1eFOR‹"……ÀåBY03æ4Š¢ûLê`!ÀbŒÉ3>9.ŽÌ)4a•3Þú\¦ŒÌ±Õp aÜÈ´F= ®HÇß)8D¨Ê-›™(È©•¢ƒ¤XD_€Žž¨ÆW£K÷˜Œ½þŒ[Õ?/…(²‘åÑlhE éÔn!d® ŠëŠ•¹nH*¤0w˜—®¨ŒÖÓZ¾BçEw2€ÑP–«ÉRWí{U\Köè*z5’q5k¹þ,Ì×å¸ù:PT,"¹âh²øî´©ŸEóå€V”DF2ZÀB:v§+„È+ ˜?ŸÉuÅ¢"×)¨ã,/Ð%d`éâ$¨:ßjÌKQG é2°rசfÃY½<ø7(=QM–72ÇVC“eÁÍeØPG¢75:!ø¼{sâ/…¨Hó`»aX S >d¹¶+Yê â݉Vôj¤S¿t‰¹0w6€ NòÊŠß‘FƒåÁŸ;cŽ-&ðæÌ-ªÈ¾F#¥-ÐÀàŠNEàa˜üÉq•w’=&TÕaÓåÔwt ‰»@¥™#„œ Ðå›ŽŽ¨ÇÞÊÆ*š`!—ú+ÞPªX7K³w)PÄ]U¬ß˜EO J£Áò˜–f„ü4ÀBBþìo(MiþBÚOWúð"Í'y¥‘teøÑŽÒan—6ºÄ¹DHV΢bŒþ>Pw 1 *I Œ†Â˜™9cŽ‹tê©Ì$±lÖæ–Xl9Kcš®ÌÕÀ¢)Uñ•FÌ1®Ò¦Ú(m&V›H( ø`žX9ˆE-‹wª4ºaè†j\9Ýc`zAeAn‡#„h €…tjX¼¡ôÑ„â˜è©ªbdµ,ŽæË=wF: »±Êx(‹“ယèÕHÈع…0ÌÖõÔ3° Š ,m~G¢lÛE†D9nZJóiØÎG~š`!»r.é;ªÜ²9Ýc`b”¢SÝOwæÁ°Ê’9¶2°€®¡ê\‘ŽOý`¦^)j\™.Y!%ÍfëP´%tC5e¹ÐÿL/ÆLFrhÇjHýÈCŽ_³–n(*ÆŠ{—¤Ñ`y„‘³Á`¨ËžÈ¦– hÞ¤D#ÑD¯F:õ ,^Qò˜® â2ÐÔK¸³t–ÃÂLP=ZYøÀ\E··Êˆˆ:Wt·êriöÌøäøù:PT¬¦')ø‘~(Ægë0êbbšú!š`!?·#K…"´ùnH9LÙÕØ•3Ý0 ”qÑã.¥ùdE[R0ás`L¶óUÕZºAGÀBJäˆæ€ gin¾ `‰Š®dñ+=´X\ ,n!T̲ˆ]Ue´3W¤|‚–Íâl)º„ÉÑ¥Q+ ô)ˆÎ‡V°’ÏÀªÒ=¦ƒi‚žZÒM¨©Š‘â;ùàì’, !í(Æ6;:Âl7L÷Ÿ‹A²:`ýUU¼¢ä1QÐc7œC`Ê.*Æè*¶°rVccŽœåæR’Éýc«–‘©Ë7£¡6è i¶ƒë7¾ñOúÓÇß¿ÿþýû?þ©O}ê›ßüæLÿRñ÷fñ†’dwº¸…P«+¶ 4EÒ=ĹƣÊâ$¯8›’Lû© T„ç:EÜÑ0ÛÖ÷¿ÿýÇ{ÌþÊc=öä“OÎô/…„0Ýs`JXBKãÜ™²È”]M–Wœ[åŽæ€0rNb ¿u³\_~ùåûï¿ßþÊ}÷Ý÷Ê+¯´ü‘ƒnÛ¶íСC_øÂ^}õÕ™>’‹v³‹ ,Q6 IνŸÅ\OT,ØPg_¤ôCYöBÚQŽ›ÎÐ|ªüíÊ´#›Ù°–––nºé&û+8{öì°ßÿÈ#|ç;ß¹xñâsÏ=÷àƒ~îsŸûéO:Ó'DwPò H«¤ ‹H>芪|7L÷ EÜóC/TäÂŽtD4t+½ùÉ'Ÿ|衇vîÜyøðá/ùË'NœøÊW¾2Êl^_B8qâÄÓO?Ýÿ=/½ôÒùóçû_Úÿd?Ÿ?þ¥—^øŸøSÿ¾VýWlñïÝ!¥è¿bë~éxûôÛ’ÿŠ-ÿªAEÜåþ[ù;Øãfýrÿ ¾ƒÍÀºxé²è¿bË~›4býWð&Bêý+¶üwèéßj"ú¯Ø ßáĉC1ÅÌÌöÚô[n¹åÅ_¼å–[ú¿rúôéxàí·ßåÿò—¿üèG?zéÒ¥öß—¿«:ÿï†ëk½Ï§ÿÁïÞ¾ÿ£iŸcxíŸýÃÿârïó«¿ýwî{ðßIû<ØœåëËô_ö>^ß^ùûÿÉß>pûŸ@=·ôÒ¯ýßܹüþP¸ýþ¤Ø±#í#aSžùÉÿùo|÷_õ>¿}pï‘¿ÿµ¤ƒ1yü÷ö^~VSþW´¸oÚçÁ¦œ¼ðÆ¡?þ“Þçµ2ÜðÕšöy0žW¿ñþÖÏß_lÿåoÿÛ÷>øï¥}lÖÛò_8·ÒûüÎßýÒáÛïMû<ÏìB4³ÍÀºçž{^xáû+/¾øâÝwß=â',•={Yx¬¨¥É¥}¬-Çß~F®¶,®?“æ‹'{ Lʦ~”1ÿ ½ IDAT ãàhv˜Õ(âN´›mëóŸÿüO¦Ú| ~ZST£éx¡)ÔòB‹;B˜ð90GîXµlé,hšm¯þÒ—¾ôÌ3Ï<þøãKKKKKK_ûÚמ}öÙ/~ñ‹ýß`ó5~øáï~÷»§OŸ^YYùÙÏ~öøãõ«_ýú׿>Ó'DbæÀ—R‚$.!ü'šPS$K¿š+geei›Œ×¨*ZNMˆV³\÷îÝûƒüà¹çž;räÈ‘#Gžþù§žzj÷îÝóñãÇ¿õ­o}âŸØµk×C=ôꫯ>ýôÓGé"µõWTÅÊY“/î902°²‹èÃÇtE5%M–Wœ,9 ¬<Ø®G;ê‰-_E±8ë¿àŽ;îøÞ÷¾7ì¿Ú´ÀcÇŽ;vlÖσn ¶o(`þ˜çå ŠÑ­•Y8I4.…À«3¦–DHAö€ËC4Ы‘RtÇ—xCÉ LäØ ç"Ã’}õz¢WÄ^¨©Š‘ˆº8Ì›•Hr« è>SauÌq‘Rtó& ÀÜùtBQ‘ÜuvÃ9ác`"‘ ,iõ]†DU¶ÝP½ °–9BÈ+J·Ýæƒ ,a•³¶õùùȺX-K !DHŽnˆV°”KÕN÷À–å3°*6œUEf|Òh¼ DâÈâB8B˜_’n¨'º¿B )¹[yG)Ðõ2à"D¯Qü;‘ ,me¨uDÇ ÐÅGF,$e†•À J“q¶Ž; XúˆHJb4Ô‹èÛŽÁQOú„ØXtC=‘}8´"€…”ìÜ ¢ˆ»*3Q`Ädã!TÅùAu,•³†~¡‘ ¬¼0jâL=ÚÀBRßÑççë¼R1¿ÓgïÃ`¶') ü!±ˆ®+2 Š,œõ¹ ¢ˆ`)âŽ/´bpEJѯº ‰–ÓFµÓ ø ZTO`Ù¬/ÆÈy%iæ£+j²aätO±¹;¾è†h €…¤lñ™Њzba' $BÊc®$Áe êB-a‡ÔQ6Ÿ•n(.VtCÔÀBJö™(h²#˜'H"õ#ì8k æ¸Y ªŠt?qÁŸ  'j2 ÇBI4ZÀBgPK“›í1QG7”d7"S?E4š>2°r@«å…S½ŠbËW,¤]÷„‚ñ÷™‰‚žÈ }6g‡¢fŠlÓuYd`i õ"îtEI¶8=R’›—Ò QG ]Á-„@"v¦î)0ª2ïOæë@ UŒd`I ¡dµœÁbcU‘@Ò%QG )Ù.ÞPª\»1QÐã' Ä‘3@7TD«Éã¶,uq:ÁtÊnˆXH‰³K@r¶ºDè°ïÏx™êqá+†CQ”Žü•uD$U¹ÆÆ$HÎ¥ÎQK¦ÏWB ö!ɽ>+QoVyìè º‚÷“,ªeŠãÄD^ˆ_iZo¶@ê£ •¡d“ZTw) ,¤äÞI¼¡DùJfãNIpúLSàý©Ž—§¾hŽ`s„PTÅÊ9Ñq‡8š °Vð ²hDIv¡E ,MwŸ©‹v>ƲY’»ÀŽØ‡ n¬ËO`@]…Þ¥¨#€…”|Ž=KgI#„âü] tCI±°© c*i5}‘"îú8»”z¢:楨#€…¤Üõgépá+¦ì‚ìž3—.‰²U“hBEîEJj²w)ІŠBÿÞG3);F+XH)º#„D°$Î.‰ó+gZP’K£ ±hÎ@¤"¤¸ÊHWÌ€ßYMö›=BH7D,$e6šyCip„PŸK# )Èmç‚¥Š ,mõW'S ÉhC I¹ê;¬œ5±»%ŽË@s@%:q®z4½PS¤Ê«銒촔Ò’LG¬˜—¢Rr×L0QÐÌý L$ÑjúÜõg´§ °`æc †š"XâB½ˆ{²'ÁD"óRuôC´!€…”¸í%7L¹A‰hG I¹y¯¨ 0Uäº!-¨É®œiCA!Ø#„Œ†’\+ÝPiÈ@Ø=9º$ê`!%ŸnÏJ’k8ÚPPtŸÉÀ’8¼$Ž6Ë'yÅ…"D2°ôW’¥®×ñ*楨£W#)3Q¨xCéc ¦Ž.Qö¼R¤âÏ ×t°T­7\É™zE„‘ÑŠR L÷2@æ‡8W«…n¨É¥Îq†P­¦Ï¬´è…ŠÊPÒpÙ¡EÅÁB,¤dSµ©;@ª¶"·Óµ–î90¾@Y?ô±ÎRü¼”l’Q͆6¬6‘T |’¼ÐòøùzºçÀì%\¦‰V“Ý] 4¨¢Zô˜Q[:âX¢,¤ä¯~§=Q®ˆ; <‚èz¨L‹U ßr¼Js@_ÔãÊzr¹`!)»EÉ J”»í…‰‚ —€Å„]R¬lê#»žÒÎÇ8¸$ŠXòÜýuôÄ Ð%q­˜æ"%?5 ‚$àR홯«"m@Ñÿ ¸íœtqÕ2°"·cë ¼Zù+¾˜Ò Ž:ƒýJM¶Ù˜(H2­VÀeÎ. QäâÈ4 >Þ¤¢˜Šf€6òF IÙ[#;]ò˜4(r×õÀÒÝ9Pè ¼>õEÞŸúÜ»”ÍЏ ­`!¥È5p%°x¥Šœ>“ç#Ì×Ñ õU¶]ÂçÀ"]1Œ‡!ŽŒ&V›H‹‰Z`®'«ßÕqþ:¡°w)Рšl»U¼Kå•l¬ rqdXh W#)rDõòíűáœwý+g=ö!í'Š<È P=:Á4§³5ÑõІRb¢Ûn%¯AnÙRtšX:éq„PŸÛÐa@Ô亢6¶ÆÑÄj]˜ïécš ÉÞ¥@ª²X ã Ôá—Ýéžp«ôÄ ’¬ˆVC+XH)º[>ÆÇ £ÎßBȆ³&VÎ☮g º ,ZT’?À€(Éõ=âx“¢‰º‚ , búlä‘Xˆ$[‹ÑP’¿ƒF”äjr¦^“«lÁ€(Èç7Ð QG I¹y³=Mßɉ ž "Wi˜S ¢LÐ*Òˆªâ€OÌT&p ¡8Þ¤h¢W#-;e'Ä.늹9:ÝPqdqd d Ú„T·cç€î'ŽûÍÑŠÕ&RbÉ•ª~Hr5°Ò=&x›j‹f>Æ Є¢üŽÍ(TH ?°ãJ^H"Ðdk 0_×d`Ó ÙF£ŠrïO†CQ¶´E\K÷ŸÝŒˆ’˜—¢ ,¤9B¨Ïg~0QÐãï¯c¢ )üæüu`¾®É!¤#jªˆ%ç%0/s´!€…¤(5$ØéÊ©@r¦þ7ÝPS0[:\ˆ¡ŠvSgºa ¶`!-2°²ÂuÅ@ÔpW¨ ©ÏnPyG•»J2ás`6ü‘ð10¦H"$ZÀBR ,@j‘K—ô…b}€&TT2Ó8Ê«ÏßEÃÆª$¿À«U[¤¢^”|ˆéž$n?Óg]tCI‘RtêL«QŠN•}•Ò 5E—EOÔDÃÉãŠ6°Ð 7@dû pìE›¯4L?”T¹J4¢(J[d%”,u¹ƒÌiPG¯FRb™ U[[ô׆§{L gAt¼,PK^t·š$|Œ/ØXŒˆâh?4±ÚDWpË„¨À<]œ+øAcj ¬´Ä…°>£5Eq >~FCORàvl´"€…”ü;‰Tm}LÙ™Vcå,Ë4AZMoÏP›5¦áxµª#¿M°ãJØtÖæŽ2QåªGÓ õ;I§ŠŠ!”gcV‘XšüBèáý‰v°9¢y¡Ö€$W<šn(©21:¡&ÚMž¿îÕD ÷Ø”d–ºŠ(‘Œ6ôj¤dƒVÌõD¹è©Šl«QÄ]ÅwÔ•4›¾X‘•"Xú˜—Jr'y“=:‹’*Mˆ•³>2°$¹ gº¡${Ô%Ò %ÑjúâÏÐáŽ`Ó)ôx™¢Žº‚êÑ@6ÞÁV¥(;¦Ù¾Çh¨)d`É‹nG‡ ,I¡å+H`@D+XHËÝ–î1€-ŒTm}ßQç«Ó‚’*Ž]`K`¥{ 3B )E"ìú|ñ¦ Џ¯G‰@rÔ¢Óçoqeb*¯,Yêê¡ã¡½iÙ•3ï+yËTÇ­á¢;Îê81‘ûþd4EïÓÇ‚B·¢ ,¤ÄŒ=ÔPé‡úl»EV΂86˜_Ãw©$ûþdG' ,u™ãØ Žh W#¥IÕ:„:QXâl×£ýD¹»hx—f€kyEÙÅQQ0 âÈh €…”|©& šLÃþHÕ–™¯‹#+.‹)(;R\P•™—òj²C )¹¼Pf{@zLõDñþÔf÷›iLUÔÀÒWq0 /e`©«‡#ØhG¯FRLð2`R?Ê^)‚\™Iƒ${v‰Xšh5yÑÕm¦8ô ¨p×òjUDmV´bµ‰¤xC©ùé:ÝPSôŒTe_Ÿ4¢&J³f†×©&ú!ÚÀ0!j ˆ3 ö%Ml8«£€`l+£¡,n!”çûK]qLKÑ@¯FRd`é³+g&ì긮X -}®v44Ù“¼´¢&WŽF”D*¤ºØò@ ÂD!$(☬z¡ ›°˜¯kŠ•ÝÏ¡J²SQŠB*ŠîR^:"!XH‰Z™¹a¦ (²[™ŠëÏÔÑj°EÜiPI‘û@õÑ÷Ôq>í`!©’™œIý¨è†’|ÌŠÙ»W‹^¨‰Ô¹,P+3 ˆŠ(âŽ6°Ð¼ 4¹XWŠ 7»£j"‹N\éb4¡$wt‰6ÔÄ-„9°I;ÌK¹nH?D½)ù5o( …@"dˆ`©£VÖv8B˜ƒ@–>:¢$“™ð)ÐU°µZ2À–3ñ+y4›ê˜å€Xa3Môj$Åžs^däÑ E¹†£#êñg^ )r”7#„ò¸C?ÀBÔÀBZD°2Àô@œÛp¦Š¢á´›7Gcj²ùÈ´¡¨HÓå†9ª"6І’"~•†A6Áž gQ¶œ ½P5¿õûȇêµÅè:bàL½"!ÑŠÒâЄ{„7+`!)¶(õÙÅ2IŠüm/LDÙ£.Œìzxyf T¦ˆ;í)ІW›Äðj•d祰ÐÀ4IÎ.å…y‚:z¡¦`—ËtCA>’&”]™F”ä" ˆ‚b¬¨Í*®‡V°L$´| öBf š\±aæë’h5}\šЏkc“Nò¢‰Ò²XéžSÂõg’J»êJ÷˜]O'yõùZ-tIMnZJOÔ‹È\T-ˆV°ÐrVÅŒ]]$K^ K\éZ”ä¯Oà]*P²*N ´#€…¤ìÙ%Æ› 0Î fÕE/TEÐJ-(Ï&ìDT '®^ÅÕJÓjSÔÀBJ¤gg€XúÖÚOUdÃR[à¡>wß½PSåž*VÜ<¨ÎÕ½¢1Ñ@ )…’ ¬¬0iäνР%ꘉãå™X­¥~L/S è ,¤Ä;)v›¤d &ÈLHýµÞpÔ¯U¨•º¡(ÚM\,¢ yÐìÀBJþÐDÂÁt0MPDÏË'Õ‘•Ó#ËfM®á8B(ˆ)MvhRÔÀBJî3©š¨%ÏÍ×Ó=&ávÙQ+î$/¨‰#õò"ûòlÒ ÑÀ4IÙCμ¢rÀ¤Ao3º¡&—E# âÝ™2!õ™P2QHEUŒìè#‚…6°/¨Pk@›=180‘º¡Rr@üJŸ ZÑä[y©:z!`!)[=šW”¾’‰‚ 2°2¨Y+® Áß¡' D°ôq¤^\£Õ艂h4´"€…”J3ÐTÌ4ùÄÆ=±äºb 9^žúlÍoâÈ¢lÃUä$ëáàg8¡ƒ6Ý `:uêÑGÝ·oß¾}û}ôÑ7Þx#õa¶¢yC1×’p]E—(2°Ä…¢`š./R>I^d6ªTHyįЪC¬K—.;vìèÑ£'Ož™êy0~”aŒ‘G–$W+Ýc`"!ÔV†@÷SÇ] Ù¡Kê‰1r„PïO´êPëå—_¾ÿþûí¯Üwß}¯¼òJªçÁ\pvI[dʮϵÝPTdÂ$æz!ïRU¦· I¸…SÔu(€µ´´tÓM7Ù_9pàÀÙ³gS=æÀza¶¤Ãú@À4A¼ Ø#„‘QPÔÀ’ý–NªÇÀØb}&COTGF›°&9qâÄÓO?Ýÿ=/½ôÒùóçû_Úÿd?Ÿ?þ¥—^øŸøSÿͰºâ¿bk‡úTAó_±¥¿ÃÅ‹úŸ«µ5ÑÅVÿ.+¨þ+¶üw0¢î¿bë~{ aªÿŠ­ý*;>·´$ú¯ØÊßÁNi,­ÅÿSÊåþ[ç;œ8qb`(¦˜™Ð]¾[n¹åÅ_¼å–[ú¿rúôéxàí·ßnÿƒ!tè_Myáÿ{â×ÿÕó½Ïñë7ßÿýAÚçÁfÅ".ÿþ—ûÙs割¸m[ÚGÂfýìûÿÛmϾÐûü¯<ø¹ßþ¯Ó>Æðçÿ÷×?û¯ß+ßüä=ù¿›öy°Y1Æ«ø»‹kï¹øÿûra1éaÓ^ü—ÿûÇÿü§½Ï/ßsËÿáñ´Ïƒ1üËÿë¿ù·~øNïó;ûÃüÇiŸ›õîÕ³»¾þGÛÖÞŸ—nÿ£R,2/ó“ÿç¾ç™¿ì}~åÛãßÿiŸã™]ˆ¦CX÷ÜsÏ /¼`åÅ_¼ûî»S=æ ûHRO­V(;ôJÁˆ(ž”ƒAXÒØ«d@ÔCAÈ ¸Ë@Ù—é|@Þ:´Úüüç?ÿÄOØ_yâ‰'yä‘Tσ¹0±„Oñ1½“\ç£A%QC0 ÔÀRÇv@âÏÐÐh3z¢8  `}éK_zæ™güñ¥¥¥¥¥¥¯}íkÏ>ûì¿øÅÔÏ…™bå $Æ] ¹ Ù1žXTÿ&t ñ« ;'.±v‰]ºgÁ˜"—Ô£U‡¦¹{÷îýÁ~ðÜsÏ9räÈ‘#Ï?ÿüSO=µ{÷îÔÏ…Y2ãJ`º.Ȧ Df ªìD!ÝS`îðRºÇÀè|êüá3ú¡$× Y9 "}5Zu«DèwÜñ½ï}/õS`Ž˜àÉÑ sC‹j²íÆŽŽ¢hš^¨‰Ôu±ˆ¡ìH#þvÊÀ–d~™(оZÄLïLŌػ8B(*˜v‹F”WE"Xzèx9`£™LVhM4À@½ƒ‘]Rlù *ÎÔë³ WÑ õÔÛŒž(ˆíp´cš‹”ÜŠy‚"æëàÖð P=:/‘QyÙ¡AEFA}ÌiІR²!f~@~šÀDA³=}D’ÅEza¸[\EÞœ¾Hi ´"€…”|Êo(=µXÉžd`és‘Gr!s@OÔ)É ‚¥-Ñ…<艂]­`!)—Å#ÈÇ;8µ.©4Ý0ác`n¾ÎÄO“Û  ˆ» È²Y_dG'ô>m6‹nˆ&XH*²Ó•6œe1_Ï =1tDAä”g–€N#€…¤ØégRuHƾ?KXšˆ¨#K_t+#º¡ŽfÀ·Ýu°Ðœ>“Ç#ŠË@ðéŠz"å“ô¹Bf´!óR´"€…¤¸fB%?2¸ 4ë #»<ú¡¢`+—1 j²QHDEDÿ³ÀfÚ0ÍEJþÀo(y¤ÑI¢ÕôŸ½E¶Œ`¬(â®È´`§À…ÄÙUj³Š¢À ÚÀBRnha˜Q´¾Êbˆå6œ>¦…)»>VÎ’HIÖÇõgúhµ¬ð&E,$ÅÙ% [膒‚ÛsNø ÀVfߟôC ØòdðþDXH*rÈY[dº®¯´—è…¢\æ]Q½OËÀ¢95qxI\¬ÖR?&Æ,­`!©0ð#€yâ¡<×p°4Ù j`éc‚-‰•:W’ÑPù hÃøŠ¤ìÐÂt]PŒë;]Œ0ªl™VEÃå¥"õCPðkçdÏI¸…3¨ˆn¨DH´"€…”Ê’;œ膢8Í›z¢žh÷álQÔf:$0¥Aã+Rr“=ÞP‚¨•.®'Ò¢ò"+gA6‹»TÙÌâÈ‚beº!ó G°’ Z1_Äô.¥*T’YQÄ]”yй"îtCIn/€^(ÈEÿé…¢lk¤Ä ê`!-Î.isÎ Ÿ°<Ö\¢ˆÿɹŠÑtIM!0/ÍC£¦@U´"€…”Õ£ÅqÎ%T¢Ógkµp;$·* ¤~è‹v2J/M·ª"ŽŒV°’Ýé"€%Ézaž *Úšµ ŸSBOÔ¹þ,+ôCQ”¶ÐF›e†7)š`!%[«…!GQ,8š®ÏtÃ@GÔäS?ÙÈÀÒ‡~þ‚(¨#ŽŒ¦¹HÉ’à %ŽÛ^Tq„è{ö³"R3UÜ¥ Ž6Ëg?ÑŠÒ >Aˆ™¤sk¸(W³–FÔÈÀÒGyAIÜB˜*ñ˳óRšPïO´aš‹”Xh©c••2°€ˆÔÞ`e r»:.°ÓǼ­ %û‚ LØÀÊ»K•ÄÊ97ôDE,œõ¿RÇ®D°ÐŠ’*íO Ó==Œ*™a¾.*°rÎÅwäÑå±rVM wŽŠ"ŽŒv°”½þŒ gE¶VÂÇÀüI^šQXòlßc<”d¯¥¡Šrñ+ú¡2°€ìÀBZìt©£Õô¹82«.In‹’FÔmD:Î@´­X1ÃQD"¤¼( ‰6°Ð¬œQ+îĹÚ`^­‚¢‰w„’ ¶>Þ¥‚xwf€6D;ÆW¤TÚŸ@^W‚h´ ¸|{ZT'óÂ)EÁ´«hU¤~ˆ³«ìŒ‹òXéž]E )¹*}¼¢1QÈAð Rü-„Œì’åqtIm¨ŽÕDBAmV´aš‹”±ë£Ùä…îRÐGÚ·ê³óRŠ$ÉQÙM°ÖúO ë/ HYžÏÀâeªÉ4\UQÄ]½HÎÞ€‰#‹¢ÝЊ’¢Ö€8Ú,œ8Ë€[9Ó ò¨¥˜¤è®å%ެˆ®'/F.B¦¹H) ù v§‹&ÔÜ|=áƒ`|¶êQTlù h´ Ä!Ÿ!"Ò„pñ+&5¨#€…¤ìÊ™.A‘€G8ë’3Ë4¨(Ûn¼Y%QK_Iõhmîü5£¡&W"™nˆXHŠ7TFóuM>‹n(Ég`1²g€ž¨Ç×pg@eZ‘ÔI¼<åqÇÚ1ÍEJQu.ï#ás`:hà )Ê6[EñE‘³Kò|¨ö²D )…°`¾b ÑC¥á™“E,HÁ½IÉÀEÃÉc#&D;XHŠêÑ⢫5î90wi±M¶†`X`d׆~ &+ÑäÏ.‘©'ÚDHz¡&;/¥´š˜æ"%n!:ÀÄ‘Ù÷€‰ñ&#Åw´Ñh ÑŽ’b‹’W IDAT2#Œ7ª(E§ÏçîЈ¢LIAR?$‘¥/ üIÌKEùDHšu°ןi£Í²@ ,yÁÎ-*(ú àPT’%ÎFÿ‰#9"€…î`˜DØ1.+Ýc`jx—J²×GF^­Š"Ù;òü~ÝHŽ—)ê`!%{ !XŠ8ç’WÄùº&ûþ %#»õƒ®¨É4\¤ˆ»"—ú‘î10HäQ‡@õ1E+^ÓHÊß2Áû ˜?—ÉdO_ÜB(ÑP‘ßàeª‰êÑêÈÀÊtЊÒªßá-%Ǥ $| L ”&ÞÁ|]“]9Â9 '*¢z´¼mõhº¡Ûf‘ÑP ‡V°” ±,9qm-õ#`R®ä‹®Ј’õ‘ͪÏU§Ñ÷2ÃÆ*`!)—#Ê+J“Q¶ä½P“/âNOeZ鉂\"$lM±å+(ˆ­&¯dƒVŒ¯è2°´Ñ| K•í|%¨É´k0y̯5qý™<.ҹ㠭`‘”ÏÀ"$˜¯Ëó»•Ì÷DÙhôDAöýI/Ô䊗q„HÁ%’3¢ºƒ ,=Ñít1Õ“TšKëX5‹òGÓ=¦…ž(Ž#„¢ülú¡žHè#d`¡ ã+’"õC–úüû“•Ç›U‘톴 *æ¥âhµ Ø“¼¼LÑD )…ì·.ÈØÑÜ|=áƒ`L±(üÕY°$¹Ûß FCEö(Ý04¢7‹¡9"€…䨱Rr…Û™ìIŠnÏ™);„»…n(ʦ~0-U~„@EH´"€…Ä¢+ÔÇž³{b‚éº&éRÂÁ˜jX¤~¨rµwèŠz(ž”Šïh£ëåÀ­ 鈨#€…äÈÀÒ¢ä‡:2°rC?”d3°è†¢CŠ l¬æ€~ˆ6°XÒÜÅ‘ÌD…õ€&T9¯” ¦ì9a‚­É½Jé†zì¼”qQw) ã+R !ØËŠ–Æy.S€ö‹X¤æŽ`s[Sivt8É«(ºƒŒ† QG ‰U=ge$`å…6”Ýb™5—¨èZ1Ýs`l>‚•ì10ßóhDAôB}´ÚÀBjî¾æìÀ¼…Òn8³pÖkÑc¦~ªÖ[.ä#ëññ+ú¡¤ÀÙ% µ`K[Ð Ñ@ ‰Å–¯Ðy±²—Ò=&aŽS/¢lçsIsã"ÉŒˆ’8t¦»¡ôq8­˜æ"5û’ªØsC¾N‚Oƒd² §Ñ Y€i µž1ÁVL°%vtÄÙÃ\o"Êe`цh`|EJ!¸éA¤Š0öÄD`Æ®'R{';.¹*lر¤Jjìè@ w)d€ ,´"€…Ä¢ ­“¥ÆLï?ªªç}0Y©[›×ñhCA®Ñˆ}hŠnG'áƒ`\t= w°Eܤ\ÍZö+5Q=:3œÎ–D7Ì©âÜÁº¡¦`4!š`!1³b² &F›4Ç(£)Ô¢ÈtC1µ#„)»(j`©#€•»2¢ ¢çé %£!ÚÀBb‘ ,e,•3\b¨ðçwé•¢ÅÙ‚TV劸ӈ‚"ÕH2|~…Rª…?"£Ž³àb¦§Ê!$KP,HýÈ P’)⮩´×ŸSVÇh¨É-é…h €…Ä\o)54Xl+ác`L±ˆÜB$¸KAQu´=XHÌ¥í°Ù¥'ü!¡d ç×ͬœ%¹zÃä#+2sÎ׫ 럙”J2·c3j²=&Dë$f×Zl|éaÉ€+ùA7ԋ莺°rRp‰¼GEÙ(dÂÇÀظJŸÛX¥ Ñ@ ‰‘%Ͷ5°d¹b™tBE6ÝƒÔ Ð 5Ùݺ¡¤P.lü›ÐaÜ•ÉÑŽR Á½£bŨÌ "¬åÄ 2°2`®â¡žàŽ2Á–Ç›T‘iCMv/€I)_‘˜Ë¸gÛD)X°X±¢ª‰TßÏQHqœÅ8 Ž¥=XHŒqFsôØÓg"”}1AHò©4£Û‚d`ÉâZÞŒ° )DÞŸhÃÏR³G¹wI›Þ1×eXì] ŠþìÉ; jò×BïOu‘n¨¯$ŽŒ6°XlàÂÙ ¤~ª5SvI\i"φ‘Kº¡¤P„ÜÎjºgÁ8˜Ãd  @+~>R­ˆ;9v¢Y6‹òX ã©ÕÀbå,ʆôD=¾x4ÝPS(ØLÕF–>{› ,4ÀBb¾ˆ;GÕ°ÊÊ ‡õ46œ™³Kb@ž#§{ L‚ ,u4X8ƒ6°š'ð’’Æ†³¨z ,º¡žÀž³>×n,›…–¯ "…¿^™ž(&¸“2D ‰Å¡_@ ]l8«cåœ:ž<š0 ‘Ý8mìçÈ+]wu3`:uêÑGÝ·oß¾}û}ôÑ7Þx£å7‡†Y?Ò Áå D“åÁìXÀR‹HVn(û!(P2¾ï1 ªqsz¡*Àb¡†Ù°.]ºtìØ±£GžùäLÿRˆ¡ˆ»6–%.r!Ô\܃DHMd`ɳÑFCMÁ].”ðAÐQ³__~ùåûï¿ßþÊ}÷Ý÷Ê+¯´ü‘ƒnÛ¶íСC_øÂ^}õÕ™>º€ ,q4Yl×£ª‰± ”œHÞ‡ºhOòÒ%%•¡¤'iQ ífûó±´´tÓM7Ù_9pàÀÙ³g‡ýþGyä;ßùÎÅ‹Ÿ{î¹|ðsŸûÜOúÓ™>!’‹C>CƒÙéâž]•Ýì*8»$&’t€»-‹´<°££†Ë“´[LýNÿtááÇ¿üå/ïØ±ã+_ùÊŸþ韦}*ÌNÁqgÜCƒeÂôŠø•¤ÆÁè1'yiMA¶ÕÂì¯ùÆLÄÚn=QYJD¶sD¹#„ôAÔMs| FïWöïß_Ë·:sæL-'«ÅïüÎï<ýôÓ›ý«ûNœ8aÿøK/½tþüùþ—ö?ÙÏçÏŸ饗þ'¾Ã,¾ƒ-U¢ÿŠ-üìÑ3ÝÅVÿ¶^¼|Aô_±e¿Ã«ùªá…_]¦õ¯à;81êþ+¶ìwpIW!ˆþ+¶øwxë­·â U­ÅVþk««ý/íg­ÅÿÁ%³ÑÅÖù'NœŠ)f&Ì´^ï±cǾò•¯üÖoýVÿWþìÏþìÿøŸzê©QþøéÓ§ï¼óÎK—.µÿ¶fû¯Àì\¾|yéùÃ]î}ùÞßûOo½õþö?‚Nyù…?½ëÛÿoïó‡v}ô?ÿoÓ>ÆséÄïn_yÿ-zñþþ=Jû<Ø”wWÏÞø‡'ú_†ÿdÛ¶méczýýƒÃ§Îõ>ÿèßý7?ó©ÿ íó`³Î}õ÷v][ë}~ý?ûâÇ?|_ÚçÁþüÝ>ðϾµëúûâöôÇÅÎÒ>6å_<ÿÏþÞOzŸß½uÿmïÒ>ư´ôÖîÿîýťʛ~ÿHû<ÏìB4³Ípþüç?ÿÄOØ_yâ‰'yä‘ÿø·¿ýíÏ~ö³3x.tˆ/âN®¯¿áœì10™hÏ.EÎб—x‰*£ñ´QŠ.¡((m!-ý@&fÀúÒ—¾ôÌ3Ï<þøãKKKKKK_ûÚמ}öÙ/~ñ‹ýß`³Ë~øáï~÷»§OŸ^YYùÙÏ~öøãõ«_ýú׿>Ó'Dr6U›•3†;úÂŒOL¤äGv¨¥ÉÔm¡#j E ÷i³­WÒ%W+რ£fÀÚ»wï~ðƒçž{îÈ‘#GŽyþùçŸzê©Ý»wüÍÇÿÖ·¾õ‰O|b×®]=ôЫ¯¾úôÓO=zt¦Oˆ´B ð°¶ÊÝXÇDA•#Ó%åÌ‚™§3eWDVXÚ¢}‘&|L Ðthµ8ë¿àŽ;îøÞ÷¾7ì¿Ú•Ò±cÇŽ;6ëçA×%UV"9÷ÒlÓ>aÜB¨Íö½¸…PR¨U&€%Cõ¢ÈÀB+ÆWt o)5®Í'ËÎñ˜¯k‹3½ùÀp&õƒn¨+JVƼT_ÉZñóÄÜî2R?t‘€¥X™`8Ô섆ž¨)øf¤# ¢Í²Â›M°œÙéªuÄØXŒ1ÂlÅ&j([–‡è ïЦŠ\îG²§ÀBAJ²:º¡>6ЊR Áït±r–c+E0ÜÈr5À+Jщ‰&ŽL7ÔŪYÏÀJ÷˜ OZdÔGw´#€…ÔÅ2ÔÌf—¿Y ˆ#gÁ¥ ÐŽ’l ¬…„Ï ÔŽ2/•c/M÷˜@pEÜ部#€…Ä"Å´Ñd9 Jó÷·ªGç€)» @5A}eíýIOÔÃByöWšM°š½í…‰‚6FY.€E–—Å[T—½û ÚBd‚-ŠÒ@j쪢ã+s£Y9ˉ¤jçÀ6#SAæÍÉÂ<°#Èu!RS¨ÝåJG”C7rG )…ಘ'iØé:EÜÕØÜUâWy`4”dë¶°¥£©:¦/Ša+< !DXHÍít1QPCõè,øÊ-tC þ ê±X¡dD”TJ™e„^¨)p„­`¡SxK Ø‘n¨Æg`1aR C>CF¨Õâg@”ÖS°"ÝPSinq¥ ÑD ‰EЏ+ó%ÌÒ=&d&ÜX¬'Úùzä Р¹ÈÝPT¨¦/ŠáônÈÀB+XHÌÏxK©¡XflÇ«( ¡ÆU¤f‚ÑP;BHO”Å™zi‘Ë…òB¢‰R ëŠÅ¹,šO•è¤Ù˜#ëfY‘¼œ&Ø’BØÈ-)* @+~>X$MH-ÁRÆIÞ<º¡4_ŠŽ•³¨Bär!e~3•ލ©dqˆ6°š‰`Å‚³Kbb`¢wˆ0ÙS`<ôÂ,¸I:m„°dÅ‚³4j`e 4¬4(š`!5M( ´XØp–Æ-„™°½°¢ª©g`Ñ%ÄŒÐx¢ì7 ¡‰£ê‡4—ªÍt]/#¤~ÉñNÕ|uOšRLŒkë_0ª C>EA i…(-Ž&Ë‚™äEn!”CV&¨ú¡¬Ö i@Mõ ,RŽMÞIøf†‹C>˜#ª( ó1GÞ£y …Å‚‹ìT…Pr¹6»ÎŽŽ&Ž¢,$ÆBm¤~dÁ—ü KÝ0 n4¤Õ¸ Là$¯.?e^*†Ž—l€‚&E,t  !ެ†&ËmªÆnç‹.Q¡à,¯6W›•æÓDÚÀBj®ø/)1´X¢ ¨%-’ú¡Ëd]EnxÕã®4¡Š Eàd€63…‰%È,$fƒVDÙ$Üj™^(Ç•ü ýr8B(Çô¼ªžÆ!ðUg– Ÿ“‰ä7`8XH)„à2°X:Ë¡Xf&l7$KŒ}sFfìº\Ó1ÊqMF?TkGÅðê²G ‰¹mfæ @ \º¤Í.±X7 c;G™Mc EY2ÁVå¶èˆj8Ì‘ [›•õ!ÆWt £ŽVY™0Óu&zêÕ£Ì/!ÔÎïÒ¬b¢ûÌ–Ž*Ž¢,$Æ HÎv¼ªb§KïPaö6£¡G2î¢E!ÅQÍ"qÈg€º…7”˜àM@”#S\Ž‹92yÏ,eä&ë !ÔŠ`%{` #¿-`!¥úuï¼¡ÔØi:ÎÊØpέ— ^§jü•&õé t%-r¹Pìú¢¢<XHÌËd¦ Œ=geìt)£ˆ;Ð%±ˆìèˆ …ÏÀb嬌Nd‰Rã²eüηfƒÖX6+«e`¥{L(ÒzÚÈÀʃi»Š© XH,ºÚ;¼¡”1QÈ+g5þÄDºçÀô0J‹1ÒE•¡t½y©î̃/áμ,¤æJ 0ÔˆñMÆ|]·†k3›“Ü.ŒDHeÑ„þ#X²sÑœÐu1 b8XH)„`SµÉÀ’p'&è†z؜̗ʩçA²t De¾Á膪l;Vq-Ùs “`¡CØõÒC]vhE9v…™® >A…釱¤eÅk§— †&2G ©ÙŸA W<št5ÜžÒ>rß¿ÌzB(mJ2×òê±S–¹º1=‰E^QÊ|aEæëª|Ï£ #HÃf`1*£&¤8Ú,¾ÙX…C ÉÅÌO Z¦2{q$XÂè†ù KTàV“œKÖÅxˆá`!¥‚ÍÀâžT=\B˜n —V™¤ñ€4ÈÀÊB(Bdå,yi\!ºÈò,¤Æm/ʘäÁÞùN'”Ãý­™ {N›[7‡’ÖT[¾BçÑ`ù¡j`!5cOöO°©Ì×UEÛŽtC5¾Éè†9`ÃY¿ ”#„¢Ê²dcUZ + ‘ G ‰‘i/ÍÝ~–î10)ŽLhãìR~hH9îÍIûé²;:Œ‡@rÜNƒXH.i~Ï¢lÛqMÝ0;tC=õ ]QR(‚{ÒÕ¸`Y<²¨ÍаRóJÒìDi‚2S‹.©‡&Ëk-i¶ˆ;¢¬PËÀâíª&´|Mgêá-¦~ly.‹7”ðŒ‰‚ªh÷2ªIçë×®]ëEÁʲܱcÇ„ß Š•}sÒ $j'ê鉒B(9RŸ@ûÉòÝv„C ÉÙVº§ØŒŸÿüçï½÷^ïó‘#G>øÁ¦}ž”Dš ±·NÚ¨?üá«_…Tzè¡ÅEš£`Kv(ù¡Çf`…P’O'+D°”¹žÈI# C¬+˜¯Ø¢1Q¸råÊÅ‹{Ÿ———Ó>LZ±0©L×uM¯fmŒ±2 AUEZå̹ë膺LÈ#h †Œø£®zò©ÊóÀ5D¦‘œÙ*yAÙ"A[~}†|†¿á<Ñt­GPQ óu9Ñg`%|L"Ò÷ĹIQ–¿JN ‡R !ø³KÁ »Dç­jð…¬éݹ´¶¶f¿ÜòÞ¹p+ç„Ï)¢!¥1ª"Ku¯ò¦·±Šüp„© – €ÕØs΂۰œì.2°àÿä ѦjÌ›“ÑPWJ×÷æøv½zõê»ï¾[–eY–;wî¼é¦›æöWçÄ7=Q•½ ”9j`!¹éå~Ì‹;) òÌ3bsí™&èšâáµXsà/}§#Ê C¯4Y[[»råJïó®]»æøX‰o±ˆaÉJ•ÇzáÂ…×^{­÷ùÀ°Æã2wè…yØÚK-4ÀBb~£Rã EÖ:àì’°á+çÍâáüÙ—ÝP˜Ï„´ÿåÂ… ?ýéO{Ÿo¼ñÆ£GÎñ±¶¨_üâ—/_î}¾í¶ÛöìÙ³Á + ¡1ÑÂÕÕUó×ní¹åì­&tD]¼EÑ‚ºDdÀ&€µŽ®ìLX?‚#„)•‡¡Û9 :ó÷Þ{ï---õ>ïß¿ã–m2šHZL³±º²²²þ·ÒÍÇåöãØÒÉ5qG‡¨Œ×¬%ЬœeÙ® ¤kXty°ÿ'Ó u¹U³kH;èÕ8›½n˜DÈ<„Ü¡ì9Ž`vôdèÿ×eÁ¾E«jmøoÄVD ‰Ù•³ÊÕ!°Œ-þÏÏPœjwÛs0ÅfHÈg}Ô Io.˜‚Émz ÷¿‡X¢Bb¢Û…ÈÀš>º¡.z†#€…ÄlÐJe¼f-±Ž£Ky˜ÞQPŽ&`7'™¯ë¾CÖüÙÿŸk‰¥Eð¢Ê ¡K¦–œ0àä¸nȨ‡XHÌît…±ÞP1Æþä2„°°°0'Ž ,dÆvÃé!d±=¼„rÇÕ·ó7QÐ8²0Gõ°³ dŽR›xžwîܹ9_ÏD«/„'²3Ù4X P<: Á•¢sÿ‰ ¬ùÛlÐо®X5Ë õ:2°Ô¸¢tEU~c•Q,$f' ã ØóŸÙ³>UÑž&Ÿì'ºËX/¿üòÙ³g{Ÿï½÷Þ|àiŸgZ\™ùº°¡‘HXó·ùÿÏ™ ä „ý=vsû« `MÿÇåÁÞ¥@o@ ,t‰HKw-ñÎ;ïôfH«««‡Ú¶mۤߑA%Ó»5¼ËEܯ]»Ö_!Ø¥BQ/¼ðB/¶µ¸¸x÷Ýw8p Áófuuueeeqq1„P–eY–Áä{Ä@ŸÔ54LáÅùÛì@MÂ5°t…"¤šÙt6€µººúÚk¯õ>/..~ô£Mû<íè|¹Hs—$ÀBjn§«(ŠbiiiÇŽ»víñÌ9œcÔÍÀzíµ×®]»Öûü|` ,äÁE=²=BØè'Ž­®®ŽR°9¡·Þz«¿–8|øð]w݃ý·0{WÕ2[¯[1fpÉÝ[o½uêÔ©ÞçƒÞqÇI§¸páÂ~ô£Þç={öl~jA7ÌX5+++o½õVïó¶mÛ:ÀBÜvmàÀBbnŒŽñúõë/¾øbUU‹‹‹{÷î½ûî»·oßÞþæÀêòú|Cöáí…Ícc’žwkx¾G[®³+‡N=sÓ€|6¤®ר²ZÒvjM¬ååå«W¯ö?§}˜¢QB{ÓYoîh ´uÙyÍñÖÖÖ:[_Uw×–3õy Þ.j`!53ºì<õÆ›ÿâÿ8´t½ÿ+«»vnÿØÇÛ¿Áü3°Z¾ì8;AŸJ+’Ö›‡éÕ¬ír„×>L-€%týÓëên?±Â¯æÿ:†C K°\ëø2B1X#ª‰ØTëÂ… /¼ðBïó¾}û>ùÉONùáÐþHw¹ƒ´,Pí—Ÿ zã™óÐ‰Ä IDATsLKGîòÝ-Μ9óÞ{ï}ìc˜/ÖµU±} ŒÀ"+ÁǯæôN­MÉ:;tvêÁëüb¶´GQ#Ÿ‚uíM\[mýïEÑ8œ?ëÁµËëóvµ'ßTÍ;›÷‰î2ÿ|´šÚrK1«ªª®fj1 ‰í…d`åH4€uþüù·ß~û…^¸_ÒµÂ:f`ùRtÓ{,ÌWª¦S9BØü²slþ#"#2°Øµ}·<{ÿµKÛu5ÞÕÝw½YݸôÞûÿyuãVsd]XX˜öc®‹­ã]V›‘o*«ekðÎýHw9Â;,ã£Ë+‡¦®å­`j첫ö_æ~„ð7Þøå/Ùû|ë­·Þzë­c|“sçÎõþ÷G?úѽ÷Þ»{÷nû_»ö“Ü2´ñxqc‘$«ËÃP—‡õ 5r°©z»kkko¾ùfïsY–‡žÍC!%XHla÷ßzíà®~ø¯{_ÞqîƒVÊ~+nòaáXW¯^}ýõ×{ŸwîÜ9•«uòÚ“o*€5tµOêG~&û‰îòVí°"î]Îkjžæˆ•©@O7ÌÑü»Õµk×zu‹¢¸~ýzûohmmíÒ¥K½ÏW¯^ýñ|ï½÷®×OìÞ¹¤–ÿWGËÀ2ÿœ©<R(Cšf°¦&ß €¦MýÈ-//¿öÚk½Ï °²Dd‰…«õŸÃÕ²ªì±ç±XýÏËËËïüÊ{ï½×ø£ãÈIXµÕ¾ùWÛ¾Ìÿ¨›Þ$¯ËÁ a¬ÚÊ¡SÏÜÔ<í(ôB›0´tôü3[ÎÓèâÅ‹µÚ(ܵs»°è†9!d`yj—HµÊ¸ݰ6xuapÁÔ‘…ô«õ«åZQîXÿoÕD¬É§àþuÈ×M+€Õûrq±ùö`Ò *Ú4û­QĽååЩgnjæ­¤¸ós5ÿ ¬aÑ^ëµ×^;uêTo,8räÈí·ßnÿkïü Õò¯èB§›ða´X †ÊjÑš±¿Ïµk×ú?Ø;wîl?UÚåV—«±·ÒU}À£ö&_]]ݾ}ûtž A ém3¬•r­²/ªЏÏ9€U›U¬®®žó™Ïìܹ³å77{Ј3´‹/öLíÙ³çÎ;ïëaÛty_ Ùr·òn®–ý’V–`!½ZV4÷mÇÕMg`­­­]»víwÞ)ŠâòåËÃ~ÛØšwùõËlEqéÒ¥={öLå/šºæduuuÛ¶m£üÙfÖ4Ÿ É•v¦g÷–Ås—þüç??yòdïówÜñ‘|¤¹ì~«r®Ï‡ñýfþGGÉÀ²i¼ÍŽáÂ…Úïoy9táE1i–Ëû ˆ»ªP„h«`Mðƒ¹©ñX×®][ZZê}ÞTfýè:;¬ĆNbËW­&9n°ÞâšËÀ²§™Â³ÆæºôÊ•+ýý(ûë£'þ×ÕòsçΩ°Š¢XYY/€efZöŸOM=UîÇx²¥qgψf`ÙUMAÞ v]fxª]º”öá°¿Î. jýëòåËÍyÞXGu…¦u,{SUÞ°Fù[ìœÑæbg‡õUáÇ m*d:|Á2e×®]»zõjïóŽ;víÚ5£¿M°Xa[tX“!6ê©Ü´9í#÷ÒÒRg/¼h>ùòòòˆ/ÜÚŸÝx€4l§ ãÏMcŒÝª=+Õ3Ÿ:uªÿ¹_NÈNÅšßÿÜíåFeºa¨\dþE”GÉÀê*ý«Y«ù{ºVkâ–ý=D°T…"Á¾cÇÿV›Ê1 `u¡·¶ðGO”ÜÂÑÿÜÜ,ï¼óN?[â¶ÛnûØÇ>6£¿M°žÍÀZ]pGG)âÞ<[1ÓVûÈ}îܹ©äyÍÂÀ ¬ÿìÐ#„îèR§ç4háJ~L<ÐüëÎL·ãXkkk6oô¶ÛnëÕ½%+Ú›[»øîÁH|ÖGâ ¬Ñk`õÔú×ÀÁ¥ãX-‹ÿQÞc¾VWÞ{جÐÿŸž †°Mý„=z¶ŒeÓ"v áØÕ¿Ñ%þŽóM sËÀjÙ²²²Òß=ݶm[í2ëµ×^{ë­·zŸï¼óÎC‡Íãù† €…ôÊʪ‹¢¨B\³åxÖÆ9B8lpʹý›¬®®^ºtiïÞ½“ÿESלٌÀj›Î3¡‹Æï&ÍŒ.¬K{Zªu$€Uû²Àjf` ¸…Ð^Ɔ³.›åÿKo!¬ªÊNÙGyÂ1j`­®®®¬¬,,,”eB°·L]Ëÿ«½ÜÒ²l;&ï–X’……X[;e³uëÆ`Õ2°f±‡*v„A0ãä[ ¬a£äµkתªZ[[[[[Û·o_ûÀ‘Üõë×û¬;v´°–——ûo›ä•Å`¡«…å…÷{ÅꢙÔNv aÍTÂ.ŽÜçÏŸïfkŠXk`±rÖå3µ§™Õ™nK¶ýaŒñwÞ9{öì¯ÿú¯ÏÿñF9B蚌^˜…ZV‹¸×†Qr4Z"ÅÃþEo¿ýößüÍßô>:tèãÿøÏ=ö†,Ûb1PÄ]UB÷ì’µÙcwÍß0F«÷÷N=Ϋu„ÐnÂÑ u¹œÖÍ\.4vVïwVUUUUÿÎÐ7ß|óí·ßî}>tèÐm·ÝÖÿýÃöAŸ{î¹þ_zçw^¹r¥÷ùÆoà°Äv„þßRËM>}út¦zþüùË—/E±{÷îîD²F?ƒÜ©Sÿ°Xo¹¸V¿º oÅþTúXo½õV¯óEqóÍ7' `m8r'K3‹ ,÷ÿU?t¹‰Âøí8Ï#„KKK/¿ürïóî»ï¾öß?0;¬Ygªÿ;/]ºô×ý×ýZÔ³î×úØ(G]‹Ñ e¹´ÿŸÒf` üëjÃÇÊÊJ¯äÎ;¾xúÅÓgöœ+Šâà¥õË2xŒ‹§®ýÿÕÿ?ç$oB1q³AŸ©!,f3TMr„ðìÙ³KKK‹‹‹!„o¼ñÆoœöÓµ"+ q3¬ñ2°j3«~Êíˆ'åûií¯ë/Z{Ÿ{_~èCêNkØ?¼‰ , n±²uÜ×{H-«¹–+63²Î¡VÑá ¬æëfô5°òæÎ  ™4Ÿa’‰# K’Õ¡®]»Öÿ¼cÇŽa«ÊÚœs³SÐQjfM’õÞ{ï½ù曽Ϸß~ûœXœ Ð5öIÞñj`5ó¶¶oß^Œ|áOÿ?ÕFÆ¥SëÄæúŽ0ªþ·(Š•EÓ—†¿,ZXÃãŽ!üñÜ[Q‡î½÷ÞY'›ù?d´ & ²Fhº÷Þ{ïÂ… ½Ï XóÌÀÎn1ðçÛ¶mÅXµIýë–——û_nß¾}*]uà)Ý^à ö`ƒ¢våL7TÕ’ö1ÿ[Àš?fµŸóa«‚ËkWÝo[X]¬¶ûžöË i¡ ,FžÊ!…PøXÕtЏ‘õ /ôÿÔ'?ùÉaÇØÇËÀZ^^~çwNŸ>}çwÍ[žmS=Ñ®ççµn§ÿå!ø4‚ñ2°šªÀj雪nÞñVobÜþ; `EQ‹Õúâ²™$‡áóÝþçÑXöw^¸pá•W^éE‹n¸á†{î¹gÄGÝp;^¯Ž1ž?Þþ-s`\šeç1,œu¹®?kkký*ÅðòTX£]r? «ù­ú¿^›…ØÚ_ýÕ_½ûÏÿøÇ§r—ðÀVí›XïIVbXßÈéÔ-„Å IíÐVU `­Ýð«ßØL¹²¿sàÉ…îÔÀáoçaBÅ4n!ÜlŸm/âÞòÇ7ÀŠ1¾ûî»§OŸ>{ölïû_¿~ý­·Þ*ŠbaaaqqñÀ>Û¦z¢ `õžíâÅ‹ýéÄÞ½{§ë‘;SOOTåãÈ›ø‘¯Ö°R¿-¬Z@§·3J+ù~Öè'lFÉÀ:sæLÿìÂÀ—É´ÀB'l3X#°úi”Ipío—/_¾zõýyvÿÃ(fÀjILÃòòrÿÜõöíÛwïÞ=ð{Žø¨½CÑöW×À‚¬ gë½ê6ý/‡ý|¦ÊÀïáÀ J1$€5ì¯ëýú•+Wú÷KìÚµ«WžoSÎ!šÖ\öÇéˆyCÚq’½‡±5Xµß0l ~µºn¿\.G F¼smnX½ÎÕþ6úæ—\¦*!–S¸…pSAŸæ‹½fôê®íóºëׯ÷kGö\¾|ùäÉ“½Ï;wîüÌg>³áß>vVïÙÞ}÷Ýþßxûí·O=€EÏËŘ×+O^«R‡tàž¢ý sÎÀ:uêT ûáx×®]›ý£¿@F)â~æÌ™þ‘á îí ,$ö~wSË!4EÜka”Þ绸Ãþ.Û-ûךE±ººº²²2,g²fÑ{¼Sûkq³Îž=ûñ½ÏúЇzùe#~ò“Ÿô¯Ìøßø½{÷¶Ï \¼”3ãX¼ÅVƒ*†÷².g`µpG9Bhkô4'4'Ož<}útïWîºë®Ã‡üï¨?Œý²ù`c®ã1y6øÖ¥–äÁÙÙpW¶Vé£ïjt¬•…z¶7©1*7· ¬ ·s6Π±Ÿ )ëHÞ¤M}ÆÈÏêÿú¦XͿȎt#Žì°6»ù4ÐË/¿Üò{î¹§7¿víÚÅ‹é}9¿Öêêê…Þ°ÚÓ*WWWìüµÅ•Ÿí§ÿåá 7í½~C1ÕÖéÓ§ûù û÷ï#€5Ý ¬¹3$€…NÀîXfà¯ô `EqýúõXXµHßµx½*âÕâúòÂêöj±? |Ôåååþ»µ÷¡ù0d`å&ý¢gÄ–VVïO53/~¹óÜŸ^yægûOÆ?²ô¡«Ûúãââb1h„ž|ÌñáÀ¼•®_jŽQ ¾†pžqáaÅ&2°â5÷ÛêW| ` üÙž[kÃo¾ñßîÔGVŠ[ÊÑlSXcÿø5WÂíkãæ÷±ëíX£÷ĵµ5ûêhN)Ç^â.--õ_A«««½ ü/ùË×~öúrX5-Ö¹²‚ÝÅÙÄŸkþPõBFÿS3ôÛS zÿÕŽŒïì>ÿâÁ“ý/·W‹½ÖÀ{Qì÷)˲q;wîÜ믿Þë2{÷îýµ_ûµÚo¶ݰ]¥v£÷îͰfZꋎN°¬åÅÁ·NÀ²ÿ©Àºzõêž={FyÔ Gî.d`Ù‡"üËŽØ?’m­ÖV8´rHI£98Ã3ä$q_Ð÷QÕÕuæ}ùÇ—õå—GeW7ÝÌ'dVVæ—™Õù]Ï÷¼ÏkûwI5< pž·+pQUU Ã`ô"°Tð¡Ã ¬Èò!ê¡ÐÊyà–$IªÕj@Ót&“)•Jý=Ðx }%}OðBái5 ûR-Àâ!<à|¡Xu¸»u«Ï„ÀJ @`1ÞÛC`aõD (»,„Žã|¯ÈtÅñسç~*Ó×§H`9Ž£±DÇî± ÝåµJÉdùHÀ‰ùšFÂ~,è/K÷ð´Lܽ@BÆúáܶàkê©&°ð‘ñ ¬ƒÈûQ`µÛí€} „<°’yóÑYe^¬{÷îÀÜÜÜôô4ÚÓk¬¬R¾ýzHØèuE Ñ)FãáÇhÏÐÐÐÓ"°ž<„Зþ"YÎ9´ (:à2¨ë:ÊG¶/'²Ø^*°’:yxÑc¼þ\Bã{‡@p |chƒê—ÀŠ×†@÷©ŸQPáÓU`<Ö>Ágí­-sk ó¶ý#*ÛF¿‡ÑØþ“(°Íb¸¿>Xa£ÑˆÌ…BžÞh4>þøc˜œœB Ã0¯½öZ@‰JÞ¤ÊúZ´ŸæÚ« ‘ ˲8ŽK¤G¾éVèïØKoÎ8x{{{aaí=sæÌÞ󓇢ð~‰‹htÆ”x5«‹€ÚptÇèÓ+BÃk÷ZýóöP¶EÛ¼ìµm¿ }2q>zxF!„ÙV«uõêU´Í0ÌR¹:Ò) Éyòü¦Å Lõà’‰É²lØ÷ ,Û¶Ûí6þÿâ(°666Z•­ãø³“ÔÃà Št÷_}X_¸ ³³û-e_¤Ïs ! ö–>Xa»Ý&õ#Ðkì©ýJ>ž‰Òg7DÉŸ;©‰Ÿ;LBO`Ňîú °@å¼éX w žÊ²üæß0æÉýÙk §BNï~^–eÉé³mÛdX Ž>ü–eS”÷Ù²ÕgaŒúé³T`õYF ž/--¡·ß~;Ì…9Ž£ª*¶ Ë]¿~õë–e‘†ôãgèÙè€ü1L`õ½\– -ÈA^ÈĽ—‹|Ð11 ¬~‚ç÷…ý†öš0ãýR” vSD`Y–õ±v§LåÉg‰I«®\1Öž ¬õü®Á˜s»£“„G¾g¼ù,BEYYY!S‘™F-ËÚÌ×MÚ XøNbÊ´ƒ㳪 !ÜSeš&Š6 —öäxB«V«µ›uL`%}ááMQ¤Ž•rœâ?lXí\f0p$U,Ñç_ëUξXÏÑĽŸ@`iš`¯ðí=‰kww·×ŠZ§ÓQY]eýMSB`Z «ý›¸Û¡¼ÒпCè”°r‚È…O!…Tõ¥1†M;´MAc8x­¹¹À¯ ó™q(âûæ@!ÏBEîŒlÓÕœ¼‡„ÀJpôÁZ޼Π-‡¢º­†eðУŒ­èÕ¹Fòʦiš¦É²{׈~zîTÚ~:å‡i&Òÿdilp=<æºý´àø"o8Áá„7PH·ƒôn¯!2ù¶Ä(°>ëIXøf:œ× g Aê~Ä>î–mý½|é·…·Ã…„5Y°Ï ÌžXK¥ŠÎXakÓÞÙµ=ê!™:b{±ÑOXƒLÓ¼qã†(ŠäN’ÀRX½žê´ùêÖläucÚÿp!Ù±ÆX{*°ÂxqB-˲Éü3ðô]ÿ|füBWÚvÒ—~ñ~P”ΰٳ¯Dò¼LÜãÇf¸PÀpªŸB ÕjEîGv9áý²,?~üX×õ|>?66ÖÿíA`5Äàè%ÁAßk6½BFö{b¤ ü+‘zAe@ÈÁ•ÕÓºQË3ƒoè ï<Îlïô$°Â!ºau EY]]å8. éÀãp´~¤â,Fÿñ,¼0+Á €Ë!¬@ÛB#ù>X1!„¸%ŠìàUU%…K½ðŒXû"°"mÈ–Å—·Â¿dõ#ˆé’Éòñ‡œ¼³¢-ÜN¾„÷ôR`õI`…{¾„À )°¼nx²Y¾?¸¶ñ(ä–óhÓÚÙµZ¤$²ÿ‡bcÎÙÙÙÑQ¯ÀRYc+Ût(g3[/jÑä¨nŒÒC{­m׉çL*åá…÷·›Ü”­÷ßEÛŒ,Oln’ÇñKüýã X–eÙ@XIú³CŒAçì•—TFzë†LÇüÙ‡þ›¿„g ÊÒñIBkéöÍኢlÊÉ«©×6ŽW«UI’,Ëš››#]fÂó§®À:˜´ešfä=ȲŒ"$IŠ!°"/C·$Qƒd\zTàËôM`íKß÷àÁƒZ­&‚ (&F/ ÅÍE^˲,<ù ;¸#(œI`…»Ôn 6³u“¶q¢³øBÐu}Ï|‹Fc}}=¼?I!F -?$V‚¬EXŒåÐD»eE/Ø>‰Vd[ö ¬g­ÀÚÓ“¼56„°V/ì/³m‚¬ãõ”ê_ü{á¿úïñ ¼¬˜ÂgA`……–ñz‘ tÉ2¡À" ,äã?¥>€¦Ý.PH?!„’$áÕ³ðšU¼k¥Xu(Þ?v(Áä~sáo±«»%âÄÄ=ú0ÃûÛÍ®v¬Õï¢m`6t¨uÇõ«¢Æ&é§û¿Æýû÷ëõ:øßÏV«E¾›yWµžßÍW'ðþƒ)°ú !<ì ,‹öJ œDuˆÑ. ¯çwþ¯±[ÿìõ‹m7ÍÿðgÔÔ,ÞC¿ú*_€' !l ÊvÎe¨QLœ,Ëhî*IR¼MòÓ"°ÖÖÖvvvPtBüÝF"Fív»WoÞ+À¯E¡ñ-• L?Ǽÿµt»,çz½rµZMQ”€¬‰,'R…·Ã„Ž;¦œÛ#«x…Ѳ°—Ë`¬ ¾mofw§Znü²¦i¤ÆêI,äzä@ ªz • ‡®‰»×W™´í]—åÖêþ ¬=C#;xܘ¦Y©TPkBQÔÔÔTøºñøìX–…< ÀX…MÜc.·§ËoâžÌœ+Ê–ÏéFT$ã/þ=} }ÌT*þµ)Š¢,Ð66RÝŽŸ¦iË”Kbh(À˜²%™z}bwôTZËçáÉ~'÷¬˜ñ ,1ñÄ›±éA%Ç[,茹XÞL›B…ª@ÃnÂY²Eß[ 6‘ÝüžËæÈL!–J;¾gPYÃd,ÞbeG-ù°,Ë¢| ¬‡EòhL• IDAT hÀæþø[Î܆³õ¡›n4ÖÆjqglß¹wnxçŠÔ+¯Ã“)°ÈqšìÏ.˜X>;«Õj!¦û…8ŽCêYlʹ>¶Ä›\ZçSÖҞєN'5HèõâE2 µɸôh ï?£`øxâÑ7ÏK’ôÞ{ï˲<Ï¿ñÆ ªj$u…B¹ ²­¶MIgÌJ¶ygh-²X¥ëã¯ÀÚÈÕq‡²Vô,tÛ8a¸‹ìßÇ=žÀŠœfFÙ¿…ôÓEB`%x!2q÷,Û0Ðw‘TËÁBãc¤UU½ÿ>Úf&@`=/V§Ó‘e™¢(–eq >7&0Bhìe⾫¬d¥ëhÀšùè••B³sf©«¾{Óº{m—Ê¡S¬·F{nŽ„X¼mäЀÔxT,EØ?@`õR`¡ýd ÂŒ!‚E%Sɺíêøã”áúÊ5ì–ã8á\i‘·D¶§üIJ¬>øm7E¹.F 5tÊLƒ ±9´K[bøÈ‡,Õ—uEÔ½[8Ø~ù"UY­V=z„?’¯9­dšfWL´“j«¬!š®äpÏ,„å˜~½ŠIÛ㽡1!„áJ¯"sÚrÑãpgšƒ( £W­WUϽûTi=!eÛ¶M% ¬#‚W_}Õ²¬F£!ØÜíãÂíã|yiöL½þúåñW?ú±¨D„i+K©W^‡Þƒ«jµzïÞ=´=88ˆò; bœfÒ¶Æ‚åÖÁÏŒÀŠ)gÏÞV–eòôJ¶¹Pvƒ /;‹¿Ký KH4›ÍH+~lï8NÀò5Á¡†ÏÄ=”\¨Èo7ÓiˆR-ÕÉênx Y_zñ³d9ñõ˗χ¶ÿxè{åÀK3€¶)›vTØh+ðq=_ÃÛ›¹ºEÙL·O!ŒT`Å<yç½,wM7Jyd¢ÀJð¹ãДC¡‹²I,°ã‘÷E`áü‘ƒo¼3àÇ0wïg4?€XYYÙÚÚ¢iš¦éññqd…³'µµµµººÚër1w!Ôh(/ö/^ÕëGîqà ›uX¡ŽM®ä_¾2v÷¿þ÷µÁæ¾õƒû0ùÉ/àë߈ô éñËb‘ô¾:k>Ö;ª³Cךù]ò«ŒÎÀA`9D€á®é£¡ÇREQ1´ràþQòÐ^w¾T¬Fî74Æ ˆ’³V_êñ/ ¨ñãï~á6Ú¦êlc:f-dd}‰5t 5ÕúÁw}ådsTéð)ÕªïEŠÌ<ë9¢:P°‘Û=^w©é=X¬ð΃…V3­£Ëx¿hrÇôáÈSÈßMÓ´~2´<…BßzNB`b‹E4¹åMïµÑXÃPÜHy‹aÏ^<ûñaF[yŒšà^ ,]×=sÃ.qT`Ѿú%óº ¸V`ºÙÆÔ÷O`Ź'ˆ\+ÔÈ£æ!-Qñµ6“­rN›Íf`å8þ–¼¨ ­‡¾×¬ßhqò%YÉW`3_«ùÑÆîî.ô•Å 5/»é¶ÓcIHÊãˆ`¬À ô¡¾””½™ó4Ñmmå-÷ÂÞ$ú$°TUí5º@ûåDN3QÈäBŽž +Á‹Îfpßc“ü•î*°ú !„Ø‘¨mÛhb©pz`Z¸ÉJ÷•M8a“û5MÃcßp p$âë³$I’ä.ÜáU¦x˶í€u_à˜˜»Ò9_#åP Ó&oE{î;„$­¨dÈ~ˆ1Ö*SôŸÿƒüþ‡ú³Ö r'à‚AŸêCŸõä ¬&/ÿ¤| :ŸÙqñÄŽë[jY_¹Úšh-d¶äÉbÄ;ã(Û ¾Kë‰ rÏæ_nÐ4mYÖ„QÐ"i¼7“¶”=ÓîåR4…buÖ$ÍNûi ¼˜`¦OþÝT §Aëù×d }d})ò+iu9w1‚ÀŠY® ¿Ú*4ÈÃÖóõ0Õkì0À ïRà\~?&î¶mkšÖáÔÕbpÍŒ”t<#$V‚ç ,,š­aJHæ ·ãØ,„û—Áý\£7U…F/ ßCXÖ´Z¨aë)*°úA ¥qwB&¸‰W`ÕÙöÿÝùÞN~Gõ¬.ž&ÒQ¹&îÄÁIäÒaGÚkÝõO…Õ⬰ٜišä™÷I‹›´l1ƒν~îÊÏbº5k{+r¿$Iªª–Ë®›ü“‡¬¦ë)·A©#`Zõ)J³_"a2–IÛe'Ö‘o¤ËÆ-¥:µ<FGGóùüŸÅÓŒ&@#£!BVDTÅÃò6Þ¾"-i \äÕôœô Ñh/Oõï…óC™´%ùEam^qº½yV­V[\\d&°,¼/«ši^[Âû‹jvXÊGÞ0†K`.-‰ë°Õ ¿– =,˲¤lXÎÖ:Ìì'„Ðq¤¯ß3„oo‰õ_Hyß  ÁH§0Ò)Àx»TPÓO…À ùp`ûXmX´¸øB¤v´t_°w}…Ä_Fœîà–ì©¡” ^|m¨ÝÇ CÓ´«W¯¢m‡‚µ¢·³™­“ªw{©ÀŠDCÌÐâ åPãG;î@MgL¤hF*0<Æ÷£³¦ÄEÄåÉœ °"¹ª>o8>@Øqœ=MÜ v°^Ü G •ôXçI“5Å#!°¸Ã(Ð* <KQ”H®ª ÿ8¶Éý‹ƒ[ˆÀŠA€•d!ä ,¨€pkleHÎEšG’ïa@…M¦¶'f`ú+_i®®.=~ ¬i`‹—Z`ÛÐ]5­T*‹‹‹H´¸²²²²²årSÉûõ`Žœж3Ôðjû[ÿÈPÔ•k×6 c¿˜¾÷Ÿß?SñÈÜáááJ¥u(Ôw<KëI`m˜!)ÿúî Üh,—ª>‹±Ýg²¬Du˜!ž;JHµ“iJ´âzÔtÖ búé _¤OŸ£†GÉ#Ãç’•lgûÎè‚ÊØQ~Oì¦:»Qìܦ“}î¤1>ÎDÌ5Xw„¶ † ¬^öŠ¢DZe‘@¿€ÆŒik¹šÌiiCˆq«uXÄo•˜¸vt=°"Bã&¤ÀÂ{œ­ èÏĘJ¥ÈƒÊ ¨9$N«eÚý¤ØCÁÏ"„ТìZ¦-Z\<µ`,gU‚à›¸xæ›ßÙÙÙyôà—ß?q íÌi©ßZ8 {úr¡k°ab‹"–²" ¤÷l)}¦É¸ôÐÂÙgˆùÆ®vȯ4ƨ¥Úˆ6?v4Æ+”‘!„‘hò^'5[– 6åÌe§Ü×{@Éb«–vï„$‹ñö®Ht£Ž÷þJ]ªw_ ,UU———ÑD[„ÉÉI|Å˜Ç „…ë`/¢ a=_mãÙÖ½„ÀJðœAz“ç57¼åÙacFXV5ÝúxâQ¯«äÕtIÍ^ž\tB­`AKÓÅ[¬`rk€EÙVÍb¸6I ­ækˆÀŠiò¡ ‘r“¶”ƒTe9×”{Ãësµ‘“µqdæ‡æÂˆÑÑ DNñ–AèØ Ú ÈD¯H ¿NMX2s>´ÀXxO¯7§%Ê*c, n½bi%I"{¸€‹´¡ÿKk²œÁ œ®mÛzu›€»wïnmEDjšv–éø§ TD%hÛ¬ÕÍÁ”Jƒ˜¢5¦šåáN˜…>M ÎûyY-økàíͬG`vJÇafp¢YæÆ]í˜A›ZH•d!<¼ (J4â¬k£K¯¯/ªr§®ëHa¤¤2˜À²>|€˜X+0YÝ"Þ½‰v¹-(¤›hð3ÍÁûƒðdXª®î¤f÷T`á†I`)#øëN/ŽÉ¶mUUS©TÌ]¡_àq©êȇr–·_ÞšFKY‘ÙTºaâžx`rDd!Œ !˲LÓÔHVe Â7½XàùuÆ 4â:kTÒqåó;£mQÙ&sTF‡'H þI5¹¿–éX”½•m8”oÁÕ¶íÇ£m†a ­_P¼o©LX–õ.Üzªúû¯FŽu(7ê´Á²€aú¼gÇq½a‚Ïjë7¹Ñö ¥uÌ?ÆéÜC]€­2º>±µb¦cæ|‹#­D0 Ýv;ÓG¢=½U™}ìvX³L^u TZ«×Ýôk•özÞ.´¥‰zœ™)8>þ1$©bRò8¹!^ŽI„¡æE–ånŽìL&ƒ ¬ø¢¦iáw0@§·¨œ^Owä(uÖSBB`%xÎ ‡ƒxìnÑ„«P`ÝY‹¹Êµñ%RÀI¢ ¸¡@y=UíömA‰$°p×¢¬"7óu؈U`FØ‘V¥ëŸÒì·nxJ"À›P“¬S­ŒæÞ¡¸%²›Ë››áË1µF~3º•)ªk¼8Bб'8ÚH‘“çR-+-=¨¶¨ ,5 Ú⺹Ý¡œÉt÷x}c X­Vt4Ó,Ý2~XüäÍú<Þc…’ÀÈ.a70]+_˜ÛéE`õ™öÅà=Cn† °dYÞÞî&g¤Ò¿s´UàÓ<ÒkÓ“Í2ÖŠŒ¶üHxäC _¡ÿ5ëðênºýx raã¹۪ݘZ¦ª ú¢ßÀ¨ï‹Aã]Ü¡Œtpm2OXsõ‘sÛS«ùZ jï;ònM®õ¯ÀjE*°ºa¶ý(°@’¤xË4Mà‘?~áaiûìöíPªªf³#rw9 !LX‡.E("Q†»H˲,ƒtAäQÃnšÖþ¶Ðj3Dª¯Öè$>ž<Í]}¯qHiåT3ÁÞ·Ø‹›Ç)€åÍOÇ] Ùž>9\T2 toµt'çx:PMÓ2¡:P'XN* ÃðËÚ4²ž4i[gL¨€ÀÓd ™¥‹mÀqœÆ.U‚>¢¢P|“—‚¤“þðƒü;î½2'=¾ùÅk«½¿ït牋·E€YˆM… ‹‘áq˜< @ðšï€m0¦§EÎIeÓDkÀ#°ØƒX$5F~ß„s "Ç.rO=ŠÀ”r;ÝhÊõünB`%8ÊÀóC-…îYÄØ¯W!©Àª¦[äÒq1Ñ …îjvNKá–¢-(ñốK=2¯™´ÍÚ4Êÿ™Æ¸ ?ˉUãÛ—zå: ZÍF¹³‹ÎÂÙkbŠÜï$°º-Áá‚?„PŒÉ]Ë×À¢í©{cà)A•¶IVצ#Äɼ†­£–’Îê®äÛª¸ª«^z Ã0Â3Õøþøo*ï-g+'S£ÈB&îd B»T†î4zËÓV¿ŸÝ´ÓÑW?±;Êv¥&Çc=8g8Rrss³vÿGœe˜´% ÊW?qÛÎfÏTÖ³ÙfV–ñÓýÚ¦²TrÇ YÍ*hì–4¿N6GÉ€ýCìíµT¬:K…ê+›³”CáLy-A^-Ôàá¨þæu_iz½†×a"#ÍÉHátçË8ô°TÈ"ÀÚC«À ’[!, àÜÖtØ¿Ö{"QÌçó‹åõnjp•3,Õ ôõòÀŠT`uº‰É¡L”©­®®š¦ÉqÇq¥R‰ç½_Û4ÍzºÓ<û9Öf• ±F%Óí{X]¬Dut@Ó4EQŒC36âÍmÚ1«r®ÀwW&¬÷ß"Àã®wo‹¨M᪨¤Ñ¾‚æuÄOK> ë¼6²»3O×è‹+Ön†ð¬£39èŽóS†€ë—ÂédF-Ǹ€ué=ª4ŽaL†Êê-Q‡¦¶ow*ïìH0·‘H±ŽY<ÉOwïÞm6›,˲,;;;[,À¶Ûß½ÛÇašÉ`,©«´ j¬Uº6º„>†=°"WmõŒ»W²ôÅ);Ndö@„Š¥Ö†je%7Üñ„¥eFXÅÚÌüî¨G`åv_ÞšŽ,ÿ©àÅ"°>ýôÓ?ù“?ùó?ÿóf³™ÄA|N@*°h›âLVgMR=XFùòaYÜYΊò;»nÝM‡"¶%œÈ‰·8Šˆ<^ßÉjàwZdzn…,Ë+-9ª¥Ûí* ä,PðeµA¨wK®ÝIüÆÌ Y– Ï£k»K`ͯõ¥ì80ÒR»¯ÀŠHM¶Ê¹®økXÚÆ« …~×*¼ H›žDHæ´˜˜\ø„[ø-úU4ÝI·¯L>ܳ|‰S1°„T2ÞŠ®S݆½ì3îÌ1]FÇ> ¯ÀÃòöÀ&°" &XNy†üqH«ši]~ÜëÒ¬MÊ9 ª¨fLŽç ݽ]Y¢²9ÇqÖÿòÍOzýÔ¼üyâÉ ¼x˜Lœ3ÈBL`ÝZ{igr¥X5×ó»‚É’™òŽsï~!óÊJahÛ  $¯‹œ¸¢¨¢µ …rAI3×RC@±ÀCR!£ P–r¤½ˆ`r/U'cž¨\.Ï Ì|×À–ƶm‡ ¬€– ݕΚj”´Ý%°_{í5TOc,þ¿¼¼Œ§ çÏŸÇYMÑòòFÎóžh—Y‹ÆjÇ–¨ +²p˲,ÊöÛ 'õðЃ¦i˲‹“énÈmèºBR¶P܉Pð!p˜ÛÚ‹Àò”D±(uc3çø$êIþx x³Ð°š–¢( ÃÐ4¨m­Áu# -†¡EºÝh† ° n’mÆnÅô“}ùÚ ÷X‹uq2zwR-ˆ?]`|×l6qŒùðð0"°óÙΘž>ºÙ¨17T;øA z:§‹”ã’×kX”Í8t¼ zxÃŽ·m»Úõ‰Â2ŒåÀÅ­ãó;£›™ÓÂú†¬.޵K8ßbS”#Þž^,ë÷ÿ÷ï÷~ïç?ÿù¹sçž÷½$øŒp”H™¼Îš&éÕ#OߦXÿ@ºýj]ûkqÚ«>àöʳÁ^Džÿ+€Ù½J{R®¨(J?"ËÉG“9 çj9ñŒ ,QnÕ÷0qH¬Ž É.+?ÚV\g÷"Ý….06Í[¬¿°×¨O¢••üÎlc®‡æÒѧÂ@%í±Ÿt½QÑ@Õt ¯í”µÖ0äÉoI˶m\Ñhšþ«Ú»*oÀr¡úÊæ o±`2{(°¨Áa X¢ÁáÔ*«ã<ñN–8²ø;o˜¼àX(O\½^½#¦„ý#¯bˆ¬:cØ´SÛ7GWÚ¢‚)›GÛ¤·4ÆN‘ýîÛÙôå À"ÒEÒÁä J‡÷ÂÕ³º»D1Ú.=Ø‚®ü _;ŸÖˆMÓ4M“sl5-Ë¢CéíÉ*Œ&'·GV<¼¬.J¼ŠêpêÝáup€·˜ÔÔ¹sçâ3£Ë²¬(J¯x ´½‘÷Æã­’J8]¢N9†À2‹:lËÿ âáX]Ï&5à ,œ~—LD«¹™5õtè寋­\3Þ\c@u;M2óziŸ„Àr Ýü‡UÓ-lñÖ¤]«ùÑG¡‚àµ*k°²WG,ŽG#|ô_2>úa)šéÛÍ'±· 0¢,äiˆ?â åÞ qe2gLJ©Æ·¬nf’ùÚ(r±QUµÙlÀr±*û×H2º š\-Ý+ü%9Mœl¹ë"###Õj­Ö8ŽSI7k™ÎXÍ<û¨;Ö‚Ö.qÑ’’¡*e ¨ýqNÏê^ê­^«¶ýXŽã`s/8|2öHau$¤"»×È6*«‹¼ÅIy¬Ö$S=u¼XÖíÛ·Ÿ÷-$ø¬ °D“kØQV C­³m˜Ý|ÇŒƒ•õ^y»ÃKÄ<¸ægTg|§Û^PTû‹_¨¶j¼Â,+xe¾ ¦ÆÛ4M‹ÅÝÝ]Á>3xÚ¦NÕÆ`+³õÚm7R2ÝiF:‹aQ ,r’àh«!RßOª#„»Ãë §«œ¾“ŽH!†Ìù¬^ ,®^<œ IDAT± þšbÒöÍÑå…M<ž¡êôÎ8g±8Çh»Ýt#6ÆõëÝ`ª,óË™»hÓ¢í¥bådmzd!%Xôð( ,Æ¡‘>lÊQE{õ9Ù š)YçxlÃcwÚ4Àû?{e#º­8 þêЂ¢(ÊÁâ‘pØPYãöÈ*,«ø°­L#&B­NaiÙ GX¤‹\,ÍyVááÀg3“Í2pºvnyƒÚ•ínxGA…‰ÆBÌCåj›ìÖÊÉõ³áÖÖQKÍk4M D/YŸ!4?Y.ì6ÏrÖ¦w4O97FÜÕãüÃtúQz||<æ6dYn·}ÍT€À’9­ÑMÿD90Ö*Öˆf­½eЖ/÷YbEwøºEÁŸˆ0L`᮪Y,¯Ïúd@¢,•+î ¯k‘š¢2·ã4.ÎmO·‹ë†ð‡Yoƒ5&ëLUÉú¸6suÔí‚¿§îð*i€et ,ÄV§õžCGÚ¦PþÓzžéuÌ‘TÄà Ò÷ŠØ”e9°`éb¡cóçã_^½zõ'C?mvƒÐãÁ< (¼òJ­V[[[€¿?y-`³XR3œÉVRr¦2anÏ íÁ×_ŸÉå Õj}òÉ'ë…ÝKÓ÷Î/j¥ ¬áuƒ ¤ÒGÎ2¯eu±Wš ²ò,]hÛv›W"Na5_‹ °R£VšSVrx‹LZ÷L|0¼XV‚Ï!Bñ®;fWN쯫(µö‹I` T6–¥èim$E¶ ˜±ž[Óqë­ÊßþgÍG–——·s?›½ƒöÔôo<8KQÔüüüÒO†b›NPv[Ã’’ÏÀµ¹ÔÅ;×QÉ)EqB©R}w¥À"mM1¤L¾ ¾ž©¨fÆÚE±¶90Ú.˹a)V ²ëã%Á{Ù–&¦mš¦mUU!kÊåÉ«þÜöåÜrËÏ«é!9¿¼¼\.—óù<øûïOó‹d´àÂà&ZŽkñÁ8­99¹;2 iºë…VÏ «E(œ+R…Ö÷€ûƒëa†aWl›¼—býÊßJK—†nÝÃ{¶…æÀHÚàiÇ[…¬×ëžhœ²ïºâPÚ¡RumSÍrVõòHð R&#ß–¶Èc.(°{;Úîæ¼jŨÞuo–èÕ¸¬îÎG¥"íPÓí!Ö¦ P¯{pû˜O€ìúÑÆc`ÞGs}8@K¥1ÒuÝ¡@â|„QAM›Œ%sÁ>ôÚøÒN³¯æåryÛ•”Ìh§HcšæÎÎN`¹½™«ãß´¬ä‹Ëki|@–Iu>±À8@´ O$"\.UÛ†6båq,<ba]L/ÍŸ%KÈ7j˜Àât i1‚¹ž‰,„VÈKnPÊaÁ;ÂÜî°è_D¤li¯• RlµZ åŽÌGˆôÀªø[¡\X$:¼š‘½wßìXE ‚2zª5ÇÛ9]”9ýáøæ»_È@ÚàgCP*•8Ž#SÄlfëáùsVqÊHš¢‡é-C:ÎÍÎC‚£…€>¿ÒáŲnìª`úDÖ@q1dàKØÑXe 2‰ö‰ÚêþÂ0(ëayÛ!ºã¼îµ XeŒÖAój jA'GrÕ¤,!KpwJ¬F>oŒ oTɶmS Må8¹du¬>,šëZ”½Ðg*œöáÔÂV®AQW¨3ÔÅcSÍ26ŒF÷YÔ2™L¦ÜNgy´I›è"-¡Ÿ •à9#BÈ€Åî…°ÁK¬SÛ^Ó³öÆiv'¸º1Œ ´2xü±PÞÀZÓP…¬œ&JùÇøÒM%­ÚÀ:½ò^~4Mc=¦¢(Ö¤%*ÿKëϾi¿Õ-Ú(XÚèd5r‡2µEŠ­f‚ëx8$d@(×òÌ`Óʾå3ƒº3„‚œ9‡á\²¸uÄ@Z•#\\?6$çmÚy\ÚŽ™6åÀ׿‘]±X<>4ó}åäb: °ŠRSÙ´ävŠÖÿž5­ $*¤à%eíÕsÝ8m^ãÔ4kÓµï>JMNÒ4͵Û• Œ5«®Ï<"o[Ø€áP²š¼D@RÙt·ÇE$6Ìî=(oæ´”EÙxôÃÚôÅÍãèªdš»!ýy=%é„iôØ­e_%µ~ëÛ5²¶¹Iþ2¥ 6îÝÃvÀwϵQÅ£ Z¦!¸ Ú7O—”Ldär‚C„Œ.Ô»R ;ÃqÙu#±›1m†¡- (ÓMA„¾XDa×嵘 kp¾9æîo=«ˆ€l«Ñ$^{Ã0dV³»Ý1g3綦§›ƒ'kã7G—”·Èœ!^’–îÜr¨7WOL7ImXš¦Õëu4«We“vo@ư‡ÂêcņÚ~Ú*é=\‹P`-w–aç¢q,’À C'2ÏòºÎä…OG51œùdª5xrglÏ[ G¼ê¬-¯®®ÖëÁ´?½€Ûƶøëˆ¾¨úN§y¼BQ¡U6Û$Isƒ¸îÿ‹_ü¢ý˜‘ª*DMû‡¥ü‰ÚX‡WÿîTõ»o»óöoÝ; êèèÐÐÐÒÍ›øà_Ì,¬æ}u¾²tf¬íf^*•J3¯¾Úçó&xaá¹$à½Ò’_€ßvÊôªG`ù”øT*b^åtüjò{aãXLk>Ö)bk ’<ºXh#«‹´C)‚Ç…Q]«Y_âv>vÀy«k‰C;Ô¹Ê8ðV­q2ã>ïHgy¤ÓP&f@/:åCãúëÂK¶m“®—ç·¦E“Û®l£b TÐÒ¯IÛ;™¶™ACGPmÊ!“¢¾±~2§‰'Ož\€³½Ü`lt •ࢇËÛCu9f²®Z”Ýá”ém“³ÜoÍtöø·ÿõåË—¥Ò§Hœyåìöê&¾ûÉ £•ð(óµÑW7gÿæìGiÅþÒ-·óή¸žÖÕjuñÑâêt#›Ë™¦Yr#AJJ†µ™fîê”ù§ì÷¾”>9(çꢄG!'×¼vG›„îoÅ[lºk¬kSNK”KJ6ÐHuÄà8;×]Qá·YD`€àŸøt¹Q‰äRvoÇ“$hâЂã8A,Ëʘ¾¿ïh§ˆ–i›*;…*7}%ó'Ð4ýÌ×víæeÍ —zX dë?̓çqÕÛr¡€ôYËÎÝk@šð­;q?þÜh(™l®<ˆ ,’ÝÃîÎ%ä#R!’À2ùžÕge*7êË £Gž§;Çq¤úšàlÆ`,pü?)Z~RíŸ%NVÇP®ÏƒAâTƒÅíÈœN›êM`a–ã7qÇ!„pQ?™Wy4xÆVƒè}t]Ç~ÏPPÓ'kî4þÂÆ±W¹S7µ›¹F¯^‡r>šzÐHIœÕs”k5¨ÕUÆ®ŸöŠ:¶%L¬,Ào¶5ÌPóòÇ`3Ë™ñ™ Á¢,Ë -2Q\R д“Tp hþ…½˜Ô¦àÕ#¤À Cš¸“#®±v±¨f¥¾¬E2“€4#Æ. ¬Àr¤å‹7bâï„wÍú?š<ŸêŽðY–=UÍiïÔU ÛqŸÎ0Ƨ «À€¢œ‘ nƒ²+J%% „S?dUñK_ú’ã8ktõ~™=÷°›´±í{"òG6¢¼2¶èßá5 • +ffffff`é¾oaó¥m/¿Ø$7RµÜék^Keõ™´ ºì3MÓÀ?Ï~k¹¾^I7Ð[¢³¦ÁXH`0q¿ Ös‡’ÉyîW ƒ:àTTÖ$Œ’êY& KáˆÑMèi« ¿ñ«h# ¡ây>ÀIq6ktG䄇Ob{†äüH§96Ž!ÑT16”‡`¯,„«ãH[ÖbÈAÿikf›ÞpœLÛ#°¤³¯æËƒõzô–Â1¹\®X,®®®’^¹³­á¼¶TelÕåj3í†ívKD/–Ѽ~‡¢¨){„ÚÒÇZ¥ŸÌÝêõãQÆ‘H­ñ³0„¶uÖÄctÚ¦¦*Òìâm˜]$ÏèÀBéÓ0eÛ¶ÉXl¢À:Z@]@8aBÀ&2Fe2,–CÒ–e«ŠÍ5Φi:Žƒj í>Óži Bð'I0"m¶À¡àþà†ášÕÅ©fˆ6ïìáÆµ'°O#§ý´M¥»–Õ@ÌjY]”$)0¾ÕB‘àÿ3%«8GŽoÛûÔ‹Àb‹çÓÀ0ŒE`áŒj(~0€%ÞÉq\?¤ ~ñ`² ¥wbi³«À¢:-èŒîvUP`Y¶ýÐX]67.ò3x'^¯¢iZ„.%´„“,…Õ·³ ÈÉö·•…šh.@ÚR&77MÓ̉JvËýå5'|O ÏmÂIxº¥aüÑýÑ¥K—ð17oÞDȯÈíf³y“ª&%<ëHþºéTLšx+ÎÓñÙRF`MÍÀþ ,†a|V(~ £¨dÎmO…÷‹ÝØæSœ”rë” ›'~zsî'×Nx÷Üí‡ß¾Ô ýkóRüæ¥öW׿~yÇýøóVsȹÂv«M>9Un¤$5mló™êÄœç8NÅãüDµè5謲Ûhxs’ZÍ[ù×¢¬tÀ ⹿QI ORÂ@;s¦:þ½º5;$ç)Šš˜˜--ñ¯[§çvG¦›ƒg+SÇv‡À1P@+N,żµ|*KL>qa§ÓÁaqd"Âç5“ÿ$^F‹i ¤z!)OÛÁ®Í¡œõáôúìÉó³ï~!ƒþýäõìÕ³#—_žº—.]Êår¹\®T* ‚088ȲlÀ²"ln‡F6 ä ð"¼QI ý—J¥Êå2Ã0gC} zÇ7f;µa[.sÚnÖë+7ÿ÷ßµÞ—¿òó‰¥üopí6·óqýÎ÷îþøÿ¨\ûk±òé;W$ôï7/«ä‘æÏ~4úðîÄÒÂÌ£»lw=Éd¹ÎÛï|˜h~áí¥ù³øßÆKÈKóg[_üò‡™¥ù³—^ûîÛY÷ß—2ï½1ôèäy“u Ö4ôm/󯪪½aÐíï†äü«[³gªlTؤ Çá@^O§{ë¸UÐ_sggÇ -*$xîoTR“”€Þ!9w¦:3‹AÈ4'F¡ºmomÞ¿”£¹4š““¹qI¯Œ^Ú"rõ¨Å+¶m“ˆ»ÚJ¶y}téÆèrøß/¦îW2MèΊ—œÍÙµ¾r³ÄÀàøà¼ÀÒåöõåøÛwv^~màŸþ ˲Þÿ}|Ê­‘ÕÛëÿÝÿ¾Sn¹•ÓüçÿYúÔK·oß&½÷Ä›o¾¹¶¶†RQÀ­‘•Û=s9<úù'ï¶Þºù”»¡š¥!ã?ùƒñññÇ/--áý¹\.ìovvöرc?ûÙÏ®Œ..–}‰ ¾þðÜ×>¸Q¨»ujéõ·Oþ£Œ¶?úè£ ]]ïÖÖ7WO Ggà8nrròñãǸœ§VŠžtôtuâþà†kØSÍò—VN¡í…òÆÕq÷)fêCÿâïëƒÛÑê­û¦_þÝÿ"°óêÕ«±wŠÛwþ£÷Ügßž91õŸþaü $xÁqýúuì/±•kàä9#ÂW{fíñsóW~–kº…˜¿ÿ¯ôщ«W¯’|2þ(;’o6›–iÕSN öµGg‡¥ ¡¡ ‘|Ù­áU”®x‹ýƒÚo¾òÒyüíûï¿æ±—'ÃÁïiCø^HÕ—™kËü«?s}0L†^þâìvêMѽ½”ÁÏ6|‹X&m-–·ÐA9pjg¢62ñêo~óV†a´E$~9õ`ÉßÉR¤,Af5Öb¾¼|zX*ü幬€'¦ÿøö—¼þ‘‘—^z)þB ^|Üûãs|É,|çëç¾ø@Q”>úˆ†[c Ì^±6–æHÇØèY‡úuö9I³5 XöÆe ‰ 2zJ•àED¸‘K¾ävØ\F )°PM€.±ƒXa,5•^š?û‹éû«bÉÈ Ü“ jZ|à ÊÏœ9“–åêòòNºI„ñæê\Æ~|<ÈÉ’8V¶×æ “ñäTžü[MŸßš!ÿêé¯þèòOîåÖ—*¢VÀÅÍã^elj½PTÚî>¾;D¢™±–ë;ÓvXNÄ‘Bo¯Ÿ‡ ¢(B·¯Á°)g+ל©5_DCVÛB0`¼~Ú©èCèä‹i†ðËY ¦àÕW_Ý6ÕEÇG`Ý]ùB¾ˆ ¬TÝÓÿ†!ù²"zSš¦:”ÉVXcíâ+[3CRÑÇ™LFQÜÔ¨œñ¸èNà;‚W>™Ô¬¨fRŠ7p_>7é´[³ËÝ#"^̲,S°Èˆ—dMõ€|ÍH‡îWmį “ ,êêe¦TžØô”†@Á®ºâŽªP©tFòn#óö75µ¶åõ•ß{I>½$c‹5t˲hšÆýÚv¦áOÛµ<§NŸ4§‹I°¨¯„Cïr„ Çùöʪt±éí~uU‰V‚# ’BâL–Æ&B;‚Àª‰íã„ǹR8BHžC`e‰Ê,B ƒ’ò;óCCCpÒ¾öòǶ , )ªi”'¥Ã«(Î?­ YCìpªÌ{ƒiÖfÙjk`h„aȧK‚h¹IgLÚ~0°ùRË£·;Ä|&£‹è§$oøtú$™ˆpùÝÿs¦xbpiÿÈ:c5RÒHC§ä×OZbÕûëä¤Ùpâ;pè®A>o vðÈ”ß ˜1"BÃB-à}N¼S¨î0 sþüy]×K¥¢\Q$Ñv¦¹™‹K´”2¹Èà;'†½>ú:ø¥@˜3’[ ûòöô¹Ê4@#öA×õ’’))0X X¯9”³›ŠÈY³+ê)°HbÿqØÁó<96E êËKgÒz°‡º°qLå ÖfË›•nb vú™Ïß:ùb–¦!4W Xè…, Ãjü•»ši­ NtÞé†;»¶mÛ0MÄö"aÈak´]Dé)€s•i v&''MÁ¡ñ*KXDÖņHXiQöntò×ÿå›ß‡ewÞNkcqdâžT¼#_G¬Dº+ô™ˆ¹u• 9÷NQ²Gî_!¯ÿìwîü6ÚÆËÃ[ù^Ú-îd{ Ãh ÊF—ØZ)î 㛳‰‰ýäIôÿ¬%2ø#•1tÖ$§H Èx·³Ü1–aE`‘°(Å:ÀûG#I'x4`ñÞŸÕÖÜæ:œ‘QQŠ£ráÉ˹®äd~L=c,%–À"ÜY–EÖW–eåóù=©Ø€E"°rºH;”,P%ü…¢@ ò’÷PùÒ„^óõ”YSTD¯·b gZ@{´PÂÏ–?jméoxh­‡ ¬BWAÓ41ÍŒsÌ g¢â]´uúåÒðHµZUŤ­-qã;D6ÒÏå˵ÔÝNÂ<È!/¥ÒCÔޫë2¯Moy^A½¦š‘ (Цé>XiÍëVEQ tCøRçì¹Ùs°û‹×¯_€°0ä«ËgµV …‚Ül€ €#H%ZÀÐ ¤†Á›‚œVsn¤ÕÕñÇ%5;h¸Ø>ënV8ò†ËLáÆ€0Øt‡ì3—úÖwF¤žIpd®Aý+° ɲlFöª•,xö“)ºÎš6Ét'L¶Ëèq¨¾Ê©êxJçã ,Ñä÷$°†„œô’'Ÿšµ ý¨ùÂË¿gÏžÍçód\9"—9½!Êf7KÊä±åÇ>¬uQ©²^ˆ¢(ËÁt"aö Æ:îH¸™–+™íPÃRáñ„ùî2ÀZô‰Ý1@ˆäzìj¡†s}äµ®¢ Š š' eSŒŒ]1šÅÁ‰(éÓŒ€«Ï;ùr}Æ4Ííls7åvñ÷¦Ì7\jRÍ]p (Ã0TNÇÕDtxòõXœÍŒvйúX«D†ñ˲¹\X¢Éq6ƒR´¥²†hrå´k¸É2ÝŽØbY¶PdEO\Éä…eYcù=Ü“)ô¡ùšñQVÐ1н´¿‡mè³ÀW¾¹Óþ«Û4'–—À,î¼³í.IÊùcš‘J¥ŽCÑ÷uBq߀¹5obo̸Î4Eçô6Œ»=¼6ÜÉS ¸Âíœû?Þ*AT§¶'5$çÏT'жƚxí'£}ô‡»yóæË/¿ÜÏé ^LXDoât; 0‚,ÙÑʤ‹wXddNònY–mÛ妢É4¤ƒûÀÀÀÙ³žäa˜øäžNêí·ßF—ªdÁ£zUQå:ߥÞtŽÊå‡M_o›ÖyY ÆÞ¦›¥EÃÕl„+¼Äiäû­JJ³Ó†0_Ûp/$7†AÑ2«ó!†¨;iͽºÉræ;ßdÆÆj·oW*‹²0×" ,óó@`%\Õç9sÎZßÍów ‹R¾h ¢})°ÐÁä)i³çâ©" X@ŒãK%wF„!&ßͶæÀ¯ _xÔzÄ0L©T"-«FFFÖ×£}7pS811¡ëºmÛc0¸ n À'¾ñà<åPàOA˜%²Kª…"ôÈ·˜àóŒxË'–´Ê!dz¢ –e³ƒ÷©~ IDATQ ,”z‰¼P%ݼ5² =2ù²œ ÜY #-oIˆðÀFàMv®>‚J›+E$jÀã8Nµê¶NèN’:$K!]i%^«ÆXe9‡¤+Ò²ZHR!DXñ˜¢G¸]vºRMîÿ=ûË﹯Ówîœ-Ž¢¨áááímo6øÃùõ.‹ôÎ×ñ«8}ú4ö¹soæôéjµJæ÷@`¢,–eò1\¦ØÑ7š§ÛíöV¶ñ³cîBȃÅd9ä Ïš†õîß ZºžiÞx§íŽžs[ ¸@AÒÕõ ¿Uß7¶•µ‚t¢–O äþ|»ÆqœA„cüFGSXwŸ’?emƦì¯}ìÖJÎfçWâƒÕt¶È²œHwÇâ²,߸qLÓ4 £.JOßä#ÁsÙŒ³6ÅGe›´’fD¢!HÛ¹&ʱ@*°>3Loð£÷Р™êj¾f}‡t6­ë-öRSi»äØS•Ó<k¡¼ñ``À7 €´!Õ,D Èyž—zgH€¼–"ãôS‡ŒxJJ¶!J½ŒíHwè6JÏÂv'Ág ›#êŽî ƒ‡Ù6(ŽÊšÞëÁtCy‹ÇÕòëŒéPåPˆ[Í×dÞ¥S›žß½5ì‚’î±ñ~ ,ŒS0­ Dv[UiÔVq†ˆV†Íq|i]¨ŠD[ÔU¤;Ck´Có6ƒ£C «Ï܆ñO~ŒH®@·sG¹w»ÇœŽy<R®X(¡û1-‰Œ,P˜árZ{§T>^,+Áçd'GÓtÉúVSB ,”ÂsŠ °¬Ñ‰pQ{­lD«Ä›ݵÈ%Á›,9=Ž$°pk…„£¨e9U'Gó“§&IQU5ò>ÇÆÆzXø&çççц¢Q×ÚÞ8»!HÊ›'wÆ@"¬à:yq _ž&’%çÃþXàg³d> ~B%^Cc‰pß_ Yž“o C/+>ãМÅRá ž14bfYvüt0µ"LLLLL¸-L«ÕªÕjÇ ‚€|²u9L`¥ žr(4tÐX};íõåeÉe â®`å¢êøÄë¢î „Ó•J¥ct ¯¦pÆ®FJíÇ ,™¡"!=K¨T9|ET_¡RdA¾½è”!9OÛ”M;еv¾PÚu…ÈÖO,À¯ø.Õ 1fC/DD]-ž]$¿&C/-¯šÎRÅ‹Þ4†3ܵ4]×±k¤ÂêõTÇçÌ“(°?ï¶`rX¿ ³Û;Øíay÷Œíby}ö$¬v$Â)b¾6ÊÙL-Õ©d#fwÀ鮉D6›EE°h{¡¼yfI›¨î#¼±4GÙnŸKÓtNó5MNÔk>Þ*¡Ý‘ ¬}]ýüÎ1™ÓV{ùôZa÷£©…ÈÃ"X…BÐ?Á!ƒàU1ZwëN@e0ÖBq©¥Àйy‚x÷‘‹¦iÊÑvW€1D“WLõîÐúRÑ[9Vo X”-Šb&“A 6ØáB­Ážá>½¬3ÔlóÿoïÞ£ã8ëÃÿ?3³³÷»´’,ù"Û²Çq|Á †ÄÉ7 åR(ß=-iKh(?z½¥M{ÚÓÂá8ÉéIóãRà@=%ihý5¤H‚s…H‚ï¶|“-K»+io¿?FšÍÌÎήvµ»£÷ë/yvwö‘<ÏÌ3Ÿù<Ÿ'Xí6'žþ¯)_Q`MGlŠá„ |Âp-ÌßÛ¬b$‰ç‡Ž,ÚRY´~ýëj{íkF>Õ— …„áoâ+)gR¾uãó­R&æF4!/:ÏØW}>_\ŽNj`ÍNû߇ÿ¥P( žšäµ-|{±ËÏwÝ¢â}ë®ê²°$!ÂÅ€ž$¢3¦!‚Á õÜdºÏ×SÆôSŒ$IŠ¢lÚ´éìÙ³¦•MUUÅbƺÑ;×lR×¾rvëÁâ måc!ÄóG×\èý¶«›îû×¾âémG'BÕ'Z'õ{àƒ©Óú 11ö•åØl(Tôg2EQΟ?¯…ç*•ŠñZ’æyWÏk €%„q+P£ˆ»¿èSKJA) !JryV)Kª5€u&d“ó¬[=™¶¶pÑ”FÇ ¬@AÕ:€¿¤šÊv*åjèÙašx<~íµ×·˜FäÖ»z©"… ~­È]Eˆ“ñêµ<“¯_ËÚ°€°™J(r5÷ŽZ,ã4s“d2©'I%g"zë¥ô¸þ³ˆ !Ɖ@YÕ§AI‹—_°-båÀ2œÚeθŚ©”åT>¢¯¤yª?˜r*-ÝI…XBW§ûç†ÿˆ“±ó!$J·{‹9€Uòé¬Y¥ö¬‚\:œ:£_ ³±D6–Büç%OM:×5‡Ö®šJ>½êàoúKÖøÊJð—Û¬Û×®]{äÈëv!‰ï]–ýå†ÙÝÛâ¾4Ñ78dx:«W¥p •Ÿ52°úöp(tÅñeQQ*òêÉ´´Ú>dfz~C ,oÕƒM^x(bºžŠ\x:óÛ§³¿•*âfý‚$ÉþùXBÁ§OœQ Á¢ÿ<þ\ÆPõ¼"6Ÿ]› ¥ò‘­[·ú}þgÇŸ55Æt6¨{³Yë ‘ÏùüBÌߦ ¼pdÀðj.–«p¤˜óIEEò•*B¹\®ÌÍ c–ê4-w¡ABϹÞx¢°åˆ‹¸Sš_pFÿ›¨åLRÑX*,x•)€•#“†EÿÄLÿŸ1¾ñT‘‹§| ½Ý4t…BÚÀää¤1‡kpppÍš5Ú9Ât üÖVÄÀr˜B(jœ¹´/ReppÐ8•Ckç¶mÛVN±†’rìºÂîUG£n~Z "•Òk^˜NËyèµoM;O­}ñÄ«_ÿÂxtþió®™ÍçæOCßÝ6­U Büßÿ½"XTµ=¦víŠ&“ú%¥R©üä'?Ѷû|¾Ô†MµÚ^ÑPK-*bá:«VcI§öC¨à/(óÙ ³j!XRMÑÊRå|¸:³`ËÙaya  gò3¹„µ…î3°ôì0Ég `éln颺XBˆH! ¯Ò ¯ ¤9•‹ØîÄÄt>œM¾6¸W[>Yןsµ,zB­V ° `)ŠÇõ£.9S}r<1q<±èž6:Èäú£ µè3N­ÕVæ5>bÑ+°~©í¡n¬k|›ÞNí‡\B`R.±Ï«è<-€ WS9ü…ùþk<ƒŒ_bÑÒƒn¡{Ÿùá!C¬Ã©3¹Tô—Œ5ÎËR%ë[\E.˜]5•ÌÕ¸ó¬õ<¦Ö•BRD ½<\¾o_,:3ˆª%%•”R5„-Dt.¸z²O" e2™ÙÙÙJ¥¢(ÊKgéKy !Öï×Jj\LgFº­$IýÙ˜V£*ç›;œªÖúØp~Pˆ20]óÁL£X¡PhzzZ’B©ÈÑ9›EW…e^XÞ  ÅVÏ0 Ï,,]â+U¤…€NI–ü 7\Bˆ`I½(æÇŸsjQÌŠÃþE·`›J«7¥×çr¹ÙÙÙL&c;˵UXŠ,ûDÈRèx^!–n¢ÕQÍ¥XváÌf…c–VߪVÛv¾XMÍ'RÑÆ Äñãǵ€)iÔ$3Ì%+•Šoã–ù_máo¢–}gR†z#SL!„G™ÖÙËη¢fSñdt¡·›®—###kÖ¬B<þøãÆ’"¡P(›¦†‡‡…Ùlvrrrp*¡edL„¦õì’ð좧FÁ`ÐZ‡Òá>ßÚ6Ó¹Ïï÷k¯ÖZØ¢Öð@QÝ~zíU¿Õ¶ŒG/è)!„¿ä /Ôß1]ÑÃá°¢(«.&õ÷ŸŒ_ÐX3¾‚½RË‹* šþ¼’$mݺU‰Dž|òI½´6z—õª\kB±¸Ž{¤²èÁ¬¢,Š …‹}‘Sç3aÓ}øDhZŸÙ-wžÕ_Z¿~ýÁSõšfWã˜e`™ßæ+/)€U·–ÐÆ–ôʾ™˜¤sÖ›:of&±7²÷ÆÿÇ͛ыâñøÚµk}>ß‘#GŒ=EUUS…© 6D"‘J¥bL}2°¬&"Óѹjo Í)„Æ bÑ`–5€e{Édãÿ›™Ÿ/ÿìúÊö#›õ÷'U©%9#R#ÊÀô™êp? ÅãqÓC ZLÑÀƒ'Ÿó×LöLå#þŠZ}²=°J W/mÖ ¬²TÑ.£t<±d`U{Ê¡ä™óÁù»Ü‚\œ Ì•’T¾²2Ì !*Bœe§æCŸÓSêö¶\ûC_ÉþbT+€¥(JLO•²?Ü^üJY[IûG°èÝ‹—Îø…ƒƒƒC—^ª¿ûÜ£þ¶ÿö|%PRCg†­I’¢sA½F•"d­Èú¥§Wo?e“€o½®™¶\vÙeBˆ_üâÂŽ,ËÀ¢4·øLØ6€e;…pÿþýzålô"Ù¥ÎÕ`-T+÷F”%YÒW¾BJÕ;8-ëhøŒq'ÿ·ïú±¡jýSÛ !Æw½jËï¼Þ¸åìSOižXóÒÁäéŸÿOìÆµ­Æ-†)„òéTõïÌN‹Å†&H¹A gÊÀÚ蜾ò…±£Ç.„gl’«M¦©T–>t¶–ßÓöûý[¶lBœÆ2Ì’$ëBuXÆS’©=úEÚtçPëýÆÏ ½œ:u!hóÄ 9Sʘš$IR,[5~ZÒ¶œ‰\Ôî(ò†G‚ÆûÛf¤Óó¹â ¼¡±)„‹X‹îC^!D°`XÆ7',yàgÃ†ÒæÙê„UUC¡šá¢"î§Ë™Þk­(} aûXƈ.=]24”eZžÞ …6nÜ(„8qℱ§(Š¢(Š1€‹Åô“°!Ët»ÈÙðÔÀT5¥ÈXºNÿ 㮡XÖål3°2¹¸¾ĉô샯”â?¿í›Vçï·wœ½4ý|áð¡gªYØá5k8Pëôûýú|üÁÍ›•ð¢¿ÆÄOäj—‘Î fgçà ýÉ´"ŽÏI’öxß_ÅbÁç«æ^e‹rI–"Õþµ¾½ÂZKÿÙ¸xY-ç‚SzkÊŸ7½ªÅ¿²5VÝõÙ-5+œX’S¯BøÊò¾Ã—èk­˜3JdyÛ)›5L„åq”î'6\ôçbs¡Ëì¢W¶­5…b±˜y]µÚ³|>Ÿi‰Ùðqa3GÒv !ƒÒ^ç TÇHêìü‘ñ‚8ç+ž_XR@)TÏ¿ŧÚñcNòS}žR‘¯˜Þ2Ö¿èÈ·íe­ÊÀ’e¹yz›}ÉW93*¬¬b@r6 1ÿGÐXóÕë•ê-[¨è¿||ÝeO=æÜ6Ýdz ×?hÚF …‚¢())vPTXýÙXf!Ó¿¯¯o“jîõÕ ¬’r&Yýû„òÙB¡@ ”J¥´’" ¦}éÕÃoúÉ–ô3ëfJùƒùâKrE!ä²´åÜðÙДqïËE²‰ÉDßú…ŽQ«ú†C«ÖÆWݲjl$“É!±@~2W*•´ݶ7‰*‡ ,=€Uë¾Ôv‡Ú]ªˆÝÇ×?²ñÖÄ­„á9¼uÏñx”5æ}-,ë¬@Ûš¶‡ºs–±Èkr&ª•ä¨K¹YmWiýùŒÈoý çXs¿>¢°r¾ŠI’¤ªªÀZÈŒ–ç|" U®T²Ó“‰d¿þ¿pÞîé<Àá¡j™dkÞД?_TJs5¦"ª5–8¬uô*ŠògÑÿ¿äÔÙó¡ì ™c¦7Hñª#›Ó†k«µ›×ø=Ì£ªÛËÒ¾#[}%EÛšN§+•J¹\ÖBÞ>Ÿ/7Ol·>ï1/Qâ÷ë=KUUs«FhÞ6 ½Î4œÝ/§Ã“zâk&ox†*-cRÕp8œÊWG§á¬jHÃÏd㯜Y”F$„ðù|ÖÙ0­ª%Ër.žñWÛ¾:œ ϪƒäŠH)ñ|кɋ… ,ãüÁ`Á¿p.1Q3mÊäȆKK;7ožOˆÎÏ(OMW× [~`Ãùùh×¶¾mqÙœè­ÿM|åE¬@nznvÖô(zé`¡óB¡õÈŽD"³³³RxÃm=;ç›ïÆ¿û› ¿MŸúUÿümÛŽñuÚB-j ¬Z,ÛSù=e¹_IúçW‡ˆ D¯:qw¨eû]úS)‡˜½uc,Ónb3¹øî.²/÷-ÊMækf`iB O¥_ì;iû¥BˆX½ ,xLÓXqáÀ2Ü$kkØ›Æ%û X‘HÄ!úl-*¯—ê4ÑïÒUËMˆZiÙÂZOª3¹øVË’R™éêྉÖððp¹\>{ö¬u:3<ÃÀª["]“œ‰˜X¾²¢% •¤ò‰Xu¦¹ñé´v?iú Û65ïiÝÕÀBd²ñó!§…VOöJª6kÒ´Cç®ê¯uZŽç ÁáÕ/Ž‹Çív°èbôo×Ç7nÜW¾xé¡_ýʸ=gøÙ¡S+™·Å^ó£ñ¹ü-ŒÖBˆÓIE ` !ÊgN‹ cµ¾¨9°Ð¥ôé|tQK®žS´§.¦á¬ÏçÓïèLi :7S3™ŒCUò¦W!´ý.c ,ë­×x]2™ÔXB¹"ÅgÃÕ§Á•EéÖÖ=kíÌ&lÇdŠ¢ôõõEsuæEê(xƒsK,¾®§óÑt>*Ëò5¡Ýù‰gíXóX¥êµ×ºâ¯¾™"‹J†j·î§ !Ô²OˆêܨMçV­?ŸB¨%_J‰¿òê+%I*ÍøenÑú}¾¥ÕÀ ƒûöí3mltW °ê&{Â3šÏÀÊ/JUˆÌúsq=€U2<‚ŽÏ†„ÃÃÃ7nÔŽCkLÊ!€ÕtÖ@6±ṏ¢(~¿_©WßY‘3Ù„BUUSˆ¶å¬h4:55¥Ö>€åW„˜?ïÍå¦ÅB«"‰ÉÐüí€ñ¶ºVf zˆé0Kå#ƹH&á¹€)€%„8Ά.úËRe¢Á(§ÏnMÛ#? iˉÚETm¹`ÕêìFÖâw¶|>ßÚµkµ¯Ó³OXrYºîàeRE(%Y­øÔ²âWýccc/­cJ ,oðBERK!„RªÌÍe%ɯ=l(È¥ûNê°DEô窗¼Šá°I&“²ÒùÈé…t-}€™ ÄfƒnîE'2°ŒßÕ§,ÊÀrc²oàâšôëÃWMM;-èÜY–ý~¿õ)©s–V]äLÊ·ê\QqqíF5³¾‰`¡K… ¯¦gªs÷·³ÃÈP{êbÊI¶}"ípl»ÑçóéÓ€m9g`ÙžÜL!t>)X™Bl‰|5€› )e§]í璉eÛÜp8¼gãž~¬ÿÁ™?¸˜r¬„µî•¡ÆªFÏ?2íÇøCÈ0M)ç3_ /fõç]çB¡éЭµ ¡°<µNäéüüÙ#õkü˜XóºÊ«ôu‚…ýÙù¼èƒj E±½ÁhhBçX9!-/©›UëºcZˆ0:4––Ó… ¡é¤"è{¶ÆÈ®wÖh—Ë–¿ä»||]"‘ˆÇãGÇÅ”õ“Œ¹È—À²¾šÉdŒ,Û)„EµÚòÙÙ)!D±8ç?óó’\þ?æ?»ùXµ’DžžW÷9D:ž˜˜/L3”OÆgBƒ‹B±¡©á‹©‰ÐtQqWÒØ.ªk{ä›Îí`¹ÉÀr9>”$I[žÂèÚk¯Õž™™éë›/ܬ¿Ž±Â€"èóÇÕ¨)`Üܳ(tY–g’š[X6QõÏßòœ‰N+'¦f#~ã°tñÝ\,K墧#æÅgµIµ¶× ëFë£\çÆ74ŸÆº[S+%'Ž5À:½uç‡âW‡¥`V¶/ïÜN]0´°Üd`}û†Ø7_ýþ¡Úí,t)CVõru>8m¬8«Í2GL5•µÜÄγ]HÕºg]Ý–ñ|$ËòÎ;…Åb±R©§@Z?èp¾‹ÇãÆ‡WÉÙÈa1¿8Ž©Ú¥µÁÎç_íù˜ñÑ4¬BQã£5€ez¿¶Å9€,ú¥…¬„Yß\EZ”­0ªÖ 1=âVUÕT-Ë!Ë¿¸nHÀ0[PoÞ¨oxÔ7üøùÇs9cµÍoºµv ³v+ ÕíŒÆÖ]/žQ7ËøOãϱBHŸ4!„ˆÌS3Q¥"s¯„'µ„G‡¸ð3°œ×`0h­€¹}ûöH$255•Íf­¸Z›å÷ûGFFÒ鴶䙢(/¿ür¡PÐÖlÑ“£‹þê>‹39!ÄÌ…ß\õ좸›Q…¬ÞW÷ì:88˜Ífggg%IÊd2cCO 4¾A«ãnœ±›ÉÆûs±9_ñåTµbi°¤šª7Ú°Ló[5M_š`¹ÉÒZ¢`0h¬ÝaÍÍ´¶ÍÚ*žâxƒ¢(S~%º0 mnfJ,,t*º(•™ŽË†™æߢaê† & …_‹¦ýM%ý~ÿà y>Ñæ ,k…x]­Ö˜ºzjhÛÓÛÚ~J‹Æ¦³Ó±|(XR…5P^½®_I:´Ä¹º`0xñ¢9öWkš‘v5)õ—/ˆU«V !þ_ç½/,t)ŸÏ§­fžóŠê¬¯ „(Ê嬿ZJ `—5::ªE‹µø‹¶±¡U“ɤÖñè 0Åãñt:J¥Œë­ÔÍÀB¤R©Z»5qX„B!ý–ø’3ל®õNë–Zù úû‰„ËÖääd"‘pxz…C¸DØÝ:°æ—Ì+K…1zE3¾9½*VÅPY‘2ä‰èS LEjj¶mñ ?h)îS럦6/]­]{«Q5°l_‚Ç4%*"9>»°¸gt6 —¥T>rְܧ\‘6L h?;”h´½E¬UËýBM0Ô³­u~¿ßçó¥R)í*iý çÃÞ9ŸÑÔ†x<®=¢×·hÕåLJ†}–frår9qʼhïbtÌžW÷Š (ÊðððÁƒS©T8=2ðÜÐᢡzºVÇ}öùZûÜ}õÕ7|·-æê.¼ëðªÂvõÀZ¬½{÷:ï­…`¡{…Ãam5ëÔLD£Öþ²*,£Õþ~›Â°.o_µ3ŽÃ ÜÆ=lß¾=•JÙîªn ¬ZœÓ2mÛ[b—MªÀ:vì˜V¦Äº"²Ñ‘#G¶oß^·è~EvD³XBõó¬Z IDATˆ`Á¯?dÎXYÿŒ¾6Š¿è ªÕ²ŒsšŒ ²ÔlÛâA¿m–íïh»·¥0íÊï÷ !B¡ÐYÂ8µšgB ¬Ë9Ëtóf:ªwžÍ©sBٗȇ„ý¹˜1€5r1]]³v«¡ ,÷S5ÑhÔ:>6¥?[­I¦â¦CWÊêß'rø·Ï>ô… G.8¼Ÿø•Ô½"Ȳ<<<|èС‘‘‘\.§–”µ2çÃÓSêŒ6gpF)¤rÅÔ–œoöhô쫎lžUŠz)Rmþl&gsX:Oæµ6Øï÷«ªjƒÁ™™Û7×úežu*€åÅ ´×ɲ\ðU¿¹ü”,!f|sƒzåAiËÙálB.îƒ,ÃÔ¸ý½À5?ÿ™qc Èd2¶_m=ðœï"­Ù­ ` C­d[¦åSTUÕï…—žÕħ–,t/½»&gÂÆGXµ¬Èeó܇Z\®¡(Êš5k¬„­dY¶”é¯Z7:?Ö4š%,cýF›¤…k½?“É\sÍ5n’Ã(xFs,Y–Ãáp¥RÑ®£ÖPA½°p|©o|ÝdF)Ég"§ ECÒ3QɲgQ;€e)ân `U›ÚÙV0Ô ÌÍÍýú׿¶¾¿é ¬nF }œXη }¹Xßâ½¥³Qa¸jÒvžBèpÛ\w~_­U5±X,£QÎ…êõ6À²f`9¼¹ÊpûíñÛê€$OîÞ(„H磹 ó7QÓ)ûû"ô7,¿ß¿fÍš¾¾>-04vnð|>z8yötd¾p²q©ÁølXBãWÕ½§6o<;.Â…@j|~nT<·NØÑ4:…PQ”x[ˆ„§¢õT†t>ºc|B6„„Œ«ê¬Ç‰ÃAëf9#ã?UUm(€Uë%ý¶wppPŸ¦£õAÛ@’qŸÆ&­ZµÊÍÌ_á®VŸZ°Ð½ônŸ±‰(ùK6êZLƒþZ}/‘Hh+¤,‘›)„î?X7ËM“le럮¿¿ppÐçóiq1ëšèð<ç»ÇZS…¯|å+­{«°ŠÕõ`êôÁäik’BÒRKûaË–-úàÀ˜¯ažBhÈÀ’*ÕS„õ—j÷%¹Ö=¼ÏçÛ¸qc©T𙙝®‚ÜÂ)„Ý0°@«8O!l´*G&›Øzf$‹ÅÙé™lu~MÓXÖè’CXÍú$IëÎÆ©µÖG2¶ˆÆ¦•%ÚÀ Ô¼y84šÞù¦!Ž;vèŵÎ7è nXBˆ 6èAÞÔL41™òçõ–ÑàtµÇùý~uF5Ö|”e9‰¤ÓéZ,‡l#Ûë9]___­ ÄØØX&“™žžžšš±}@;<<¬=J¥Ò… .\¨†qÛ7Pl"€ÅEÐdY.¨Õ“yùOŸNRó¹‘ɹ׌Ï_/²¾¡©ß!â“ú;%ŸÍ]¡õ8q¸y¬;…°nV„ÃAXëÄ¢Í×÷oÊMVUÕ¡ê‹$I;wîÌçóÙl6›Í {µ#«º,t/½Û$fíXÅùSO£,‡ í–-[ZÒ-›`-=Ëï÷ k@—MJ&“uÛ k.«ý6.D(„ýkwí}Y"sÛ Xþ’jœoìfÞPû2°ŒÂ´y¡PÈf³ÚuUUzDFÖÊÑt––"„Èårzá`I½||Ý%ÉK.Î\íg}q[cK …À‰Õ–éòäf ¡s–Þ ç_G_eÅ8›Éö*lìMúôví2W,}>ßôô|™¡º×ÙD"qÕUW !lŸôÔüÔØö—rÓù™¼)¤"DrðrÛß½®îh­hr&ÓkZ !B¡P&“9~üxfºz³°´Ñ—©¯%“É;v·˜n&Ýg`µ6Iªnjv«ÔMO®•†Ì ÔŠ.îïl¸ËÀr8´êÖÀ’/&Ø’VÝò5,‡O9w|—¥MÕfºaäI ÝKÏÀò••H!8­Î_õ—çÞFk`-Ü8‡çÕΖž%Ëò®]»„¹\î™gžqÞ³5@Ðt‚g´)€Õ7ÕÆô%¹òRêdY®!úr±9_qÊŸB¥@Ÿ”È‹jI¬FXj¹z*0À–³D$±ÖÐií%ÙzËÝ4X+–s–u®ŸÃ _ÀÖcXÎâÖùŽ+ XÕŠ#÷õõi¥y$I²} m=æk3VÜßH»yô¥½bdô !ÄøøøáÇs¹œþRŸoþ¢IËc\f`Yý—¯Óÿ988xiäÒ'.<‘5Ô™6NÒØ°l»žñÊå>«µ1&7+#µ„› ,Û¬4¥PV›º%±;f–À²~|Ïž=zÕ×#GŽ˜^mb ¡›VC;tóª›1d04°ºábG ݢ Ÿ ›XF¦Æb±ZÏ„ÛÁáyu£¬ûYSΔžpn¬ "jœnZÀ‚gXo_ÿ´^×Ý< ­T*ÉÙHr¡NíÐTòÙ¡C—ž^½f²¿,•OnËþTúÅZß oqéͺ]ÛtTg¦ã×¼t¾Ue§áµ$I±XlrrQ™’–g`µjÏ·4Ý0Œ@ûXïHõ4+ç A:-*¤ßÝiOS…7nœ˜˜Ð*O›:š›)„úHZ’$­TG¥R)‹ÎM2•dÖX‰DÂyÁ{Ù°l“ó}Hû2A4CCCápøÀúý¯Ggô˜†XG¾ö’©[ÕÊÀ‹s¬êxrxž¡(J$Y»v­vhíè®K2°ôYœµ²ÒÐÓJÉ‘§·Í?-˜O›2fûrQc%G=/ºfÔvo¦à¯û)„¶§=ƒØúþZq~ÉÍBÛíÎük`ißk-wC#€…î¥=>Ò1‰|èÄâI?z…f7We—3øZ¥é ,S]­ôO2™¬ý › ,í‡QŽ®…Sá­ÍÀ–Áe X5•\5µsþë*ò¤W_|ő⸢Ôù.ëžÿ –Tc‘í»´ö[ÏËÀZâÅž ¬ËÀjôZ¦½_ž¡Õ³Bø|¾-[¶<ûì³ÂÒѬ‡®õ0ÓKáH’´wï^÷íÙ·o_©T* ÅbÑT¤Öù·°mžÆxÊZ† },3†álXtL°œ2qù,AïqÆ.XÖ¡£ûç>Ÿ/h ග˥½—ÎvÏ~¿_»Ûׂ¦À½Ï3ÑÑìªùŠNOîxñDùŒñÕWÞœ»8¿ÚÀ¥—^j¬\n«îãØZ/54›¸îGZžU÷¹‘ÃyÌMg‰F£§NjôSíF ]M/Κ˜3wl­Æ¾ŒQWiI+‰lÙ²ÅÍGŒk0U+‰Ö®ï«³>xo:üùçŸgÑbohyË4¸ŒD"Ú2FÆ7¬÷¬÷<+?ÛОë^DwïÞ]ë’o-ƒÕÚV K­7Àê†ZÅxä¸L¹²2^ Œ—Ët:­M$tÈÀ2¨Ö¥\v›¸Ð8G ôÇ<ËP"@’$m½6¿ß¯ªª1–×î¯Æ2Ñ.^årÙ¸n¬ÆaE#íd:2kM!õ®C»e›ÖgmÆ2O!L§Ó[·n­ÕíŸ J=Àx\m†OˆE¬>Ãj nž¾3yE#«Ö=¼ëöÓº/iáfço©õ7ñµZKyº¶{´ÜXèjÁ`P+ÎšÉÆµ:z ¹?BÄãñ.5¶¤–û„¶¦’iMd`-%ýJ[[ àÀRE^\ž¼î£Wëà2‹0ÒßÐèCÝ&‹éôÛN÷{kHû¦¶04†.çpwêžq˜n Øñ ¬žÐ%Ãz´ƒ¶§ñÖÑeK–e­û¯ªªÚâeú÷,÷5°¼‘¥ªj£Ë¹pYôŒE±ž|%)G.æŸÖ¯‘«¯´ÈNC{Ž­6zÔû{Ý®d `9´ÇT´qddÄyç:I’@>Ÿ·nwþà3°„±XL¿õî’þE ]Í:Ú6Yº3€Õô*„ÍåV‡>µ2°ÜÔÀ¢‚;„» ,ýç&XÚBÛ7˜²–ÜŒ‰ºIÝN—N§c±Øììl|Aݯs)„Xº–°ê>™0 ¾ý~ÿž={Œ[EÙ¸qãÜÜÜììl¡P°N(€B–eý”µœ‹Æ`yÈŽK˜ÕºE"kwíºǵinÅbÑxMtžBØX=àM#ç.¹ÁÆÒÿgóùü®ÉÑ)ÿŒ"‹];º'¾/ìfõ[Û½‰z­¢(z¯;ÐÒÖ 2ž\&=5Úq®¸âŠJ¥ò‹_üâüùón¾«¡Æ8ˆÅbgÎÌ ë’þÅ%]-‹™¦o˜Ãá°›ûçå·ÌXáp8 iO ôuXÝ<’Òž±ëÞ¥d`íß¿ÿꫯnúãè¦cÕzä;ËY~¦†B!íˆUUU+„¬½dKÿ¹Kž›ÀBW …B###ÇŽÓ·¬Zµjlllnnnnn®koÞš`E"‘í‘‚>î©khhhhhÈ´ÑM ,±x:ØR2°(x†›)„úÏnYc©’$íÝ»×ù«—ÀrÓ¶ö »;•ÕµgE,E— áWCOZb+ Æb1m&¯óè®é"îÊÀ2M‡\~¶º¡3cõ˜ær:h]®1ªk.€Õ\'uS"ÆåÜg`ŒŒhϛݔëZ°ÐíFGGO:¥Â}>Ÿ6%Þ}|gù5]Ľ¿¿¿¿¿¿%mÐÂúCûZ 0ä¦Dƒ¬æj`¹ùj——…–ßò°WÀ2Xb«¯¯¯¯¯ÏÍõD ,ŸÏ§?…êøe¨…ùÎè*ÆcØ8A¯¹»•†"GÆ7¸ `ÿ鲈{KXuùh4Z,µŸ§§§ÙÜ.û‹ªª›7on°™íE ÝNUÕÑÑÑ_|QûgO”–hºVË›¡Ÿ§j¤vîÜY.—K¥R¥Rq³Œ+<¯nkõêÕÚÏn†ÚÂLÚ3êå™BØ>ªªê'«%¶„U ³œó›L§âþþ~m ’©à£­Z…°­W@mÎTûöß>.BW©õ¿Ù\ËØY `¹éJ¦îÐÖ ¬º£t“±±1ýçÿøÇz0ËÍg»VÄ€‘‘‘'NhÉ™=Àjz ak¹©¨ÕªÂí”ðŒº‰Ó@ ¡ÃÆ}kppppp°Ö«¶–8…°}6mÚ´iÓ¦–ìŠ"î@ájèI e`­Y³&™L6÷E M!ìTVW¡–Wµ6€ÕP䨉)„µ¾Ëdpp0N»l†­¥,»©(Š1€Õ»A{ H’466öì³Ïv|¦½K]À’e¹T*i?·û$Å@Á3|>ßÎ;[¸C7 b6­k§¶SÂÕГœX.‹6¸¡/\hýëžk=ÏÐVõiº ½Å6ŠG7ô€Z£¸žžB¨M5¨»CK `9쪇ÀBoH§Óýýý.\艶¦k`µ7ºh‚$I©Tª…;\ʵ¶®-[¶è¥=<˜Ëåô—Vf‹ž-çÀ‹‹6,eÈw饗:¼ê2Ë3—?7˜VïUí›BX·HE£¬`0¨ªª,ËŠ¢ø|¾å\´¡³M[äˉzÆØØØsÏ=×éV¸Ò%XL5B7hëõ2ÇãqíçãÇX=1ÝØ ¦@gÕ `ɲ¬×™nß™Ùe–g.nÀò*Û['ŸÏ×\ÿj¨ƒŒŽŽ®]»Vkƒ›ƒJ’¤eKú#KÑ«íÆ  …FGG;Ý Wº$€µœõÉÉɶî½kÙøxµˆÃ’É ÖnÃÕГœ‹¸‹ÚÉP­å¥ªj"‘ˆ-hSºí_žnè¶ýÈå ?Î{«À’eY›ë×…£,‡1a]¦qþv.­ =< ÑÏÒ%«nß¾]ØîõbŽ9²}ûö¶~z”CQky5€E , ‡p5ô$S”Äz|ÕUW-s3ÄâK@8Þ½{÷2´¡Ûذè†`;Šknþ 0ŸªT*=¢¸” ÔR‚_]¥‡ÿÿ€®Õ%X‘HdÙ¾‹jéTVOPŒ˜Bô®†žÔ%ôÚº(J²}¨C7ôÓáÉdR©TÓ·66lذaC+ÚÕad` X@;˜Ö£ 2°‚1…p‰ÈÀ€Î2MÖë†f.B¦Õ{—qç÷û·nÝê™qÝR´°Vïönª¶ðê½4Шe{blú"Ïd`™° !,³. `™ÎÿœðÅrUÃò3þonذ;)ÍR2°<3…°WÛ t¹•ÀÚ¿§›€.EÖ9 8zwðxWCOê’ÙFV¶º¡èÿ³ápxhh¨³éKÉ¢2~¶§Þ|@ tœé)YOŸ&ÜX¶åcÑs`-SÂÕГº°–ç–.Åb±µk×j?G£Qíº¡裸±±1F;ºVÕÀêé?), -Œ'ÏÜHMèÔ*„ž™BH :kpp0—J¥r¹‡;Õ 2°¬¢Ñ¨·‚—hG{:îëëët[ºH«V!ìé¸GÆ÷@·ñÌ9X"2°–ˆU ³‚Á`0ìt+8ÿc‘eY’$o,ØBd` j`m²Ò2°žþùN7]ª#,I’<ÓïªàSÄè6\ Ñ>d`¹D7ôI’†‡‡c±X§Ò]Zµ aOGÀ{¸é@7[i,½`Ò‘–—:SÂÕíC–KtCoX¿~}§›ÐuÈÀ°€61ž¼t/]K"‘ètÐ¥ˆÚ÷E^êtάž‚ÞÃÕíC–KtCoèàŠŸ]«U5°zúB h ¯&ƒ"k‰œ«à÷ôàXÀ gzr¹2§RÄh ЏšŽ°<³¡F’¤J¥¢ÿl|IQ”r¹Ü‰F–•g(4M–åR©¤ÿìþƒÑhtÏž=ÚÏ=ý —ûj -¼š RËþýû;Ýt)2°–ÎáiËK]…«!ÚGQ”ЂnX±kÑ áaM—²R%¶ ·¡iËÄSϨîáá{i[W_}u§›€.µl¬x<¾mÛ6íç@ ЦoéˆT*¥§Y™þž###ãããú?y&tWC´O"‘Ø»wo§[Ñè†ð0fùÀÚb¥°€Z–­fS hÓÎ;ëòË/¯õR<F£ÓÓÓËÙ,?¦ÀÚ‚ YÊŠ¿pcõêÕããã±X,&“ÉN7m‘L&µyŠ¢øýþN7§¸‘Úb¥­C¹Ô²lSW¬U«VíÚµkll쥗^¢* ÐY\ Ž£ÂölÙ²sçÎ;wnß¾= uº9P]بw—gºP¥Rá¦+ÖÜÜÜc=¦ÿsïÞ½+ór ¬í Ñx?1è8¢WXÉÈÀ°t°mD ÀÒÀГ““nºÔ²­Bº!ÐqtC ã膀‡ÀÐGŽétÐ¥$IZikt Ýè8º!ÐqtCÀüPþœ"îÐÍ^xáý,}É%—(ŠÒÙöh“ö…h¼ú!€Ðq¬B€Š€Ø¿§›¬ttC ãè†@ÇÑ óÂä;¦tS°BÀ@W#€ žþùN7Xéè†@ÇÑ Ž£F @ ¬]»¶ÓMV:º!ÐqtC ã膀‡y¡ü9EÜ:Ž"îX¡` «ÀÐû÷ïït€•ŽntÝè8º!àa^¨E ,€Ž£V(Xèj°´å€Ž£G7:Žnx˜ªGQ  ã¨€Šº,-099Ùé&+Ýè8º!ÐqtCÀÃ`h#GŽtº ÀJG7:ŽntÝð0/”?§ˆ;@ÇQÄ+,t5XZ`ÿþýn°ÒÑ Ž£G7<Ì Õ£¨ÐqÔÀÀ E ]€xþùç;Ý`¥£G7:Žnx,-°víÚN7Xéè†@ÇÑ Ž£æ…òçqè8Џ`…"€€®F @ ìß¿¿ÓMV:º!ÐqtC ã膀‡y¡z5°:ŽXX¡` «ÀД:ŽntÝè8º!àa^¨E ,€Ž£V(Xèj°´Àääd§›¬ttC ãè†@ÇÑ #€ Ž9Òé&+Ýè8º!ÐqtCÀüPþœ"îGw¬P°ÐÕ`hýû÷wº ÀJG7:ŽntÝð0/T¢@ÇQ @WûØÇ>Öé&+Ýè8º!ÐqtCÀÃÚž»ôÔSO}ùË_þæ7¿999Y÷»$I2mqÓ<2°€Ž£G7:ŽntÝè¸ÎÀzÇ;Þ100ðØc¹|e±¶¶ ÝoùâÓn‚pÍꈲG7:ŽntÝè8º!Ðq=œ,E×°†††TU]µjÕÿñÿêW¿êtsÐaÝÀzó›ßüï|gjjêÉ'Ÿ¼âŠ+®½öÚgžy¦Ó@'uW ,“/|á ÷ßÿ÷¿ÿýº{^B»Ðm 4µ2€e $YwÛDëÔ©S7nœžžnAãЛ|-ÜWËcl¬€îªeòíoûª«®êt+ÐI­ÌÀj‚q^á 7Üpë­·^}õÕ}}}ÇŽûÖ·¾uçwþà?èl ÐYmÏÀ’˜~¶úû¿ÿûo~ó›—]vY8Þ·o߯~õ«ýû÷ïÞ½»Ý-@7[¾U€&tu ,€º,t5Xèj°ÐÕ` «y!€uäÈ‘·½ímñx<¿ímo;zôh§[x–ûîöè£þáþa&“I${÷î½ï¾û–³€‡5wÕß´i“$Iín°4Ô Ëåò]wݵmÛ¶`0xÙe—Ý{ï½ËÖNÀÃÜwÃR©ô¹Ï}î¯xE2™L$»wïþÜç>W*•–³µÀŠòÔSO½’¼] àIDAT÷½ïM&“-yö|kzzúúë¯ß½{÷áÇ>¼{÷în¸!—Ëuº]€5ÔÝ®½öÚ3gÎÜwß}'Ož¼ë®»>ö±}ùË_^æÞÓÜU¯R©¼óïüøÇ?¾<¼­ÑnøÞ÷¾÷¹çžûÿø‹/Þ}÷Ýwß}÷r¶𤆺á‡?üá¯ýëwÞyçÑ£G=zçwþë¿þë‡?üáen3°r¼ãïxì±ÇZ¾g©R©´|§ËéÎ;ïòìù ¬xàæ›o6n¹ùæ›ï¿ÿþNµ𰆺Ûí·ßnLcz/°tM\õžyæ™/}éKŸûÜçÚÜ4`¥h¨~ñ‹_|ÿûß¿,íV†ºa0´n …Bmi€vêùÖ/ùË;v·\~ùå/¼ðB§ÚxØRºÛC=tÙe—µ§]À Òh7Ìçó7ß|óW¿úÕX,ÖþÖ+BCÝð§?ýéôôôµ×^‡c±Øk^óšvL©Vš†ºáûÞ÷¾·¿ýí?þñ§¦¦¦¦¦}ôÑ?øƒ?øÀ>°,-ÐJ=?•Àï÷g³YUUõ-…B!ÎÎÎv°U€'5ÝÝ&&&^ýêWéK_Ú·o_›Ûx\£ÝðÖ[oþ‡øíŸL!–®¡n £Ñèí·ßþ¦7½IñÀÜvÛm÷ÝwßÕW_½|-<§¡nX©TÞúÖ·ºñÆÿýßÿ…M€vc !€sêÔ©·¼å-_øÂˆ^Ëìþûïÿå/ùw÷wn°r•ËåÏ|æ3·ÜrK&“Éd2ïz×»>ýéOë1eËàöÛoê©§¾ûÝïNLLLLL|÷»ß}ê©§î¸ãŽN· @Ãz>€•J¥&&&Œ[Î;—N§;ÕÀÚènÇÝë^÷ÿø×]w]›[¬ uÃ|ä#_ÿú×EY–¦+ECݰ¯¯O˽ÒýÞïýÞO<ÑÆö+@CÝð _øÂÝwß}ã7¦R©T*uã7Þ}÷Ý”†zQϰ¶mÛöì³Ï·<÷Üs—^zi§ÚxX£ÝíĉoxÃî¸ãŽn¸¡ý­V„†ºáË/¿<::*!ô4§¡n¸mÛ¶ei°²4Ô ?¾gÏã–={ö?~¼íÐ=ÀzÓ›Þôµ¯}͸åk_ûÚ›ßüæNµ𰆺ÛéÓ§_ÿú×êSŸºþúë—¥uÀŠÐP7¬Xè—£­€G5Ô ßò–·<øàƒÆ-ßûÞ÷®¸âŠ6¶Xê†k×®=pà€qËO<±fÍš6¶@{ô|1ש©©;v¼ûÝï¾õÖ[…Ÿÿüç¿úÕ¯>û쳑H¤ÓM¼¦nw3VéÛ½{÷m·Ýöö·¿½cͼ¨¡nhEw`éê†3337ÜpßÿùŸÿîïþ®â{ßûÞ_ýÕ_}ç;ßaf=° uÃþçþÌg>s×]wíÛ·¯R©üèG?úÀ>ð·û·ï{ßû:ö +EÜÍb±ØøÃ'Ÿ|rݺuëÖ­ûùÏþðýڡ¡îöôÓOßtÓMÒb.\Xæ6ÃU踆ºa0ü·û·ÿú¯ÿÚ¼yóêÕ«¿øÅ/Þ{ï½D¯€%j¨¾ÿýï¿ýöÛ?ùÉO®_¿~Æ ŸúÔ§>ûÙϽÚÇZ¼¢Uõ+x €®ÖóXð6Xèj°ÐÕ` «À@W#€€®F ]º,t5Xèj°ÐÕ` «À@W#€€®F ]º,€¥’$©Ý_qôèÑP(tË-·Ô}çŸþ韆B¡cÇŽµ»IËFªT*n@/‘$óʺ¥åÞõ®w=þøãO>ùd8v~g.—Û³gÏUW]õ¥/}©­MX6°³ á*“3gά^½úxík_ëæý=ôÐ[Þò–'N¤Óév· `0… ÚlAiq£öC.—{Ï{Þ“N§ûûûÿæoþ¦R©äóù[o½µ¯¯/™L~à(‹úÞ~ô£]yå•Á`pttô+_ùJ­/ýæ7¿yå•W£WSSS·ÝvÛ¦M›Âáp"‘øßùï}ï{ú«oxÃvíÚõ­o}«µ¿;@§Àh€–{UY`}ÃûÞ÷¾W¿úÕ/¿üòÏ~ö³G}ô³Ÿýì{ßûÞ+¯¼òÅ_üùÏþóŸÿüóŸÿ¼öÎ_ÿú׿ÿû¿ÿñ§OŸþö·¿ý‰O|âþçl¿ô‘G¹é¦›Œ[ÞùÎw‹Åÿþïÿžœœô¡»îºËø†?ú£?úáØ’_ ã˜BЇX’$ýÓ?ýÓ?øAmûO~ò“×¾öµŸüä'õ-=öØûßÿþ§Ÿ~ZqóÍ7ïØ±ã#ùˆöÒý÷ßÿÅ/~ñ?ÿó?­ß¸nݺïÿû[·nÕ·Äb±ãÇÇãñZ|á…ÞøÆ7uêT,Ó·¼ò•¯Ü±cÇG?úÑ‘‘ÛF^¼xqÕªUÙlv©¿-@` !@+#JZ†”iËÅ‹µŸ=ºyóf½œV:>yò¤Ëo¹çž{Μ9366¶uëÖ[n¹åþûïç©$ð0X­¤twØ¢‰Çã'Nœ¨”J%Ûw ˜2³Ö¯_ÿÝï~÷Â… ÷ÜsÏ«^õªO|âï~÷»o8vìØÀÀÀ~€.B  1Á`pnnnéû¹îºëî¿ÿ~7ïܵk×#uÍ5×|ãß8vìX±X¿ãŽ;®¹æãî¹çžë¯¿~‰-è°ó™Ï|æ¶Ûn µæº´mÛ¶|ðÞ{ï]¿~}&“ùÄ'>ñ—ù—¶ï¼é¦›~ö³Ÿ=üðÃú–üã÷ÝwßÎ;c±Ø¾}ûJ¥Ò·¾õ-ýÕüà¸é¦›–Ò<€îÁ*„=àÏþìÏüñ'Ÿ|2 9¿3—Ë]qÅ{÷îýÊW¾²í÷[Ûª­ZÚÖ­¢XEE”  !I8d rl6»I6{Íï “aw>“Ífwv6ûz>ø#3;;óÉ›dßùÜ Çq”¥‰tb0@ D0@ D0@ D0@ D0@ D0@ D@è°Çãyî¹çæÌ™“ššš’’2{öìçž{Îãñ„üAÑKò;þüç?ß·oßSO=5kÖ,Žã8ðàƒÖÖÖ>óÌ3!@”bB¾prrruuõ¸qã„3§Nºä’KºººBû €èú&hƒÁà2>>>äˆ^¡OÀ?þñW®\ùÅ_Øl6›Í¶k×®+Vüä'? ùƒ¢j^¯÷æ›o?âæ›oöz½òïbY6RòDÉ ý ¬?ÿùÏß|óÍ{ï½·páBBÈÎ;ö³Ÿ=ùä“¿úÕ¯dÞåñx¸P÷F ú~ú‘‘‘àÐ 24ˆ Ã0áºsÈ#>~üø—_~ùꫯÎ|þùçßÿþ÷ëëëåÊÿ{ D†‘‘àÐ 24ˆ Mø"úûêõúŽŽ£Ñ(œ±Ûíééé}}}råÀÿ="CƒÈÈ@phD†&|‘ ý ¬¼¼¼ýû÷‹ÏìÝ»wìØ±!@ô }þùϾfÍš?ü°³³Ób±lÚ´iÍš5¿øÅ/Bþ €è–šõÆŸ|òÉÚÚZBÈäÉ“ùË_®X±br õƒ‘¡Add 84ˆ "CM}ÀÁÁÿ= "CƒÈÈ@phD†&šú€!´¾÷½ïEº*…ÈÈ@phDFyjù“|€ ¡ 0¢ D°ÚY­ÖHA¥M,D†¹ ...++káÂ…?þø™3g"].ð…¬v‘.‚J!22š‰ ¿ÖOOÏÑ£GÿøÇ?Úl¶Y³fmܸ1÷écs“sk¥ÍÜäÎMœn®ºÞñyUwu½ÃéVlHÊjú„AX!!ùqzðàÁÒÒÒÏ?ÿ¼¨¨(ˆ·ÉÖJ[y¥½¬Ä¸´$)¸;4´¸^Ûf±Ø=üaª‘]SfÊËÔE¤<„Á›9sæ/~ñ‹'Ÿ|R8söìÙx ))iüøñ=ôÃá ª¿B#¶üÅaâprëEÙ—Òi÷¬/·8œ#­’¦–z'jÀ!Aû8=zôè7ÞXWWÇŽ7î±Ç»í¶ÛΟ?ÿðÃO˜0áÿ÷io§],‰¯qäê rõA”¿Õê>xB"ÁÏœhÈL f ]s“ÓÜäTa X-i ˜¦¢¢bþüù‘.…!22šXˆ íãÔáp¤¥¥õôôø¿d±XJJJÌf³ÌÛ%/–Ä'à¡<¼€©€B‚öqÚÓÓ“‘‘ÑÝÝMq8O<ñÄo¼ÑØØØÛÛKaYÖívK¾]æbI¨(˜o¢Î©S§rssù¯yä‘ÚÚÚ7ß|sÒ¤I‰‰‰‡#>>žöÆ!],(ÈÕ—ðN®á\›¸˜’jdo»*Õ f„¶:‡@$`€±iÓ¦«¯¾šÿzãÆ_ýõ˜1cøÃúúz™7éâá3è™Õe¦WË-r°ÉÈÞYj .ûª°ÚÕÔÔGºj„ÈÈ@phb62UUUO?ýôÎ;ùÃÞÞ^ƒÁ ¼úòË/ _ §Ó©×´Ë\,©07Ž”Âܸ K›—©{xeFmc_‡Í“–ÄNÉ‹ÓkƒÏ¾Ã/O˜ «]^^^¤‹ RˆŒ ‡&¦"ãñxºººŽ9²iÓ¦W_}õù矟:u*ÿÒu×]÷óŸÿü/ù‹F£Y¿~ý©S§„wlÙ²åÆodYvЋ%Ýû+¦×2—L0 ~]BRžpÀ<`µKII‰tT ‘‘àÐÄHdøY¼ “'Oþõ¯m48°|ùrá‚gžy†RTT4yòä#GŽˆ+µùË_z衸¸8a°ÌÅ0j{ŒQРBX `DAV»ŠŠŠHA¥ "ê¡–†_4A€ ¡ `DAˆ$`µC— "#Á¡Ad@=ÔÒóŠ>`€À1 ³bÅŠ·ÞzËÿ¥+Vlܸ1èOÔ@>cê}Àp‘}ûöù/JuêÔ©Ó§OG¢80dHÀQéÞ{ï}úé§}N>õÔS÷Ýw_DÊC¥–f„˜jЫÕ#‹ç "#Á¡1‘a¦££cêÔ©µµµ©©©üÉÎÎÎ9sæ9rÄ`0Ÿ¨~øáþð‡ššBHqqñ£>zà 7÷9tèÐÚµkwíÚÛm·ýõ¯MLLÞ»sçεk×VWWggg?úè£?øÁ„§Ëb{OžàêëBþ]™P¨?1È÷b?à˜ÕØØ››· ‘‘àÐŒ¤È˜L¦[n¹åÅ_|衇ø3/¼ðÂÊ•+ãâ¶ýÙ³gÏ]wÝõÌ3Ï”––rW^^~çwnݺuîܹ„³Ù¼dÉ’_ÿú×üòÎo¾ùæÝwß-¼÷رcßþö·ÿþ÷¿ßpà µµµ+W®,((64”ÇÕ×y¶Âov˜Xr 6‡Zꨎÿ̬­­---­¯¯×ét.—kâĉcÆŒ>Qo¹å–ÒÒÒûï¿_xã³Ï>»cÇŽÿþ÷¿„;ï¼sÒ¤I>ú¨ðêc=öûßÿžïêÕ«g̘ñ«_ýŠéý÷ßñÅ?úè#À'¶ç³Õ•€_Ç^s]pïÅ ,ð5eÊ”éÓ§oذòæ›oÎ;w̘1â ¾ùæ›o¼Q|榛nÚ¿?ÿõ¶mÛî¸ãñ««W¯¾Þ½{÷M7Ý$.X° ªª*äßB,SK½5`€À Ÿ™Ÿ|òÉ#`µ«¨¨˜?~¤K¡FˆŒ ‡fäEféÒ¥¿üå/~øa¯×Ëg_±¬¬¬ÖÖÖ±cÇ gZ[[³³³ù¯GÕÔÔ4aÂáÕ¦¦&áëäääêêꜜœ J¥?Q…}®jƒ&hµa!„ÈÈ@phF^d†ùéOúÄO<ðÀþ¯Îž=ûÃ?ŸùàƒfÏžÍ]ZZúÆoˆ_}ýõ×…¯-ZôþûÈÐ5`€èvï½÷Þ{ï½’/­]»vÙ²e©©©¥¥¥„mÛ¶ýîw¿ûøãþáQ=öØüùóSRRV¬XAyë­·Ž?.¼÷±Ç+--_¶l™Á`سgÏ“O>É‚PKÏ+ú€'ÿ™)~uÓ¦Müã:D™>}úÿüÏÿˆ‡VUWW¯]»¶¢¢Â`0,_¾üé§ŸÏ>xðào~󛊊 ·Û=oÞ¼ßþö·×\sÍ OaÂ÷ͪ%ˆ1õß9$555#fÚbh!22D† ÓbW^^^¤‹ RˆŒ ‡‘õ}bgÆÿ¤N§óÎîÿ.Ô€@m¢i’AŸ~úé}ûöw7s“³®©Ïçdan\A®>¸¨AØGA{½Þgžy†_¨%uM}å•vß³% ¢ZØû€7oÞœ••Å/ü„Âܸ²#Ÿn rõe%ƲcanÜ o1***"]•Bdd 84ˆ "£¼°÷¼.^¼øž{î¹ýöÛ)‡l#ûÖJ[y¥½¬Ä¸´$)Ô ŠÖQÐ555uuuË—/äbFʺuëÄ—ÕÔÔX­VáPü’øk«ÕÊo~éÿî€;à¸î€;øßaݺu’iˆ„MxkÀwß}waaá#<2x9Põ‰Êðùóçß{ï½ýèGá{D,@Ç "#Á¡Adhå…±ü‡?ü¡±±ñ…^¨¨€úDÓ<`žËåzþùçËËËÃt€¨®&èwÞygÚ´iÓ¦M Óý¢Z¸ðßþö·ŸýìgaºyLâ1DF‚CƒÈÐ 2Ê WÞ³gÏ 7ܦ›Ç”ÆÆÆHA¥ "CƒÈ(O-[ `¨PTNC$`€@V;ÌŽ§Add 84ˆ "£<ôP¡`DAˆ%à­•6þŸ¹É鲨ˆx§-Cdd 84ˆ "£¼p­=$|Æ-¯´÷—‚\}$ ¤&yyy‘.‚J!22D†‘Qž*p]S!¤ WÏçÝÂܸH—HERRR"]•Bdd 84ˆ "£à‚\ýÒ’¤¥%I|ZåÅU[É |®ajjj"]•Bdd 84ˆ "£à;vœ={öÃ?äçÌ™³eËÉ+3RYÚù3mÞ,J¡c†‘‘àÐ 24ˆŒòB_~ñÅxà@®,ȉ3}spª‘-ÈÁ "áBŸ€¿úê+»Ý¾pá„„„¤¤¤%K–|ùå—’WôÌê2Sª(›ŒìêR“AÏ„¼TªúÜÜÜ|Ï=÷Üu×] õõõßùÎw¾õ­oÑzò2u¯Ì˜Q` „ÿæÃÇ0n\¶ža˜Çœòøã¯[·NüÞšš«Õ*666J~mµZÅ ‹ËÜAü’økõÜA¸2ª¿‹pÜÁ'>Qú]„é’?6Q÷]„ãV«5âePç¶mÛñ2DöëÖ­c¤° ý>Ãz½þÅ_¼ë®»„3/½ôÒk¯½¶cÇÚ[¶VÚ®›üɾ®¥%I™òJ{Y‰‘?ãsà™‘¡¦¦¦¸¸8Ò¥P#DF‚CƒÈÐ 24 úDÉ ý ¬ôôôeË–‰ÏÜxã?ùÉO‚»¿×‚¹ÉɽµÒFbl™IüJÐ 22D†‘Q^èpQQQï&Þk_í™Â/þ ½BŸ€o¹å–-[¶¬^½Z8³yóæ¹sçw7a¯Ÿ“’[D‹Ð'àüà×\s !äúë¯'„lÞ¼yíÚµ7n înÂîF>b'WTT`~ž$DF‚CƒÈÐ 2Ê ý(hƒÁðÎ;ï”——Oš4i̘1/¾øâ[o½µhÑ¢?(FàW‚‘‘àÐ 24ˆŒò²RNNÎ믿Ž;Œ ‘ß8ÃÜB âT”€Y·“³Z½¬¡Åõƶ*³ƒRevüiC[c«+ü¥‹ñsCdd 84ˆ "£\ÚVÁÍnô @QA&¤®è:áëtg{IwµøUq—¶…ð®ªîØé€@ Øž’->,ëÜeà.jR*¾’[k4Äîð ‡#¬W˜¶‘ 22D†‘Qž*0Ï£íïèMôv_ÕµWü’PñõßB81^ãõ#©W³ãi "CƒÈ(OE øtáUÂ×WÙö¤xºø¯SlAÎÀöGâ-„g^’(y7Zo1€¨(7N¼ŠIJæ¿ÖqîRë„“‘]]j2è/ÚY¯e²LZBH–I›&=›Ö[  *JÀ­ž½æzápvw̎͢‡VfägédÞ%Ù+ìSiŽj蘡Add 84ˆ "£<%`BˆfÎ<&+‡ÿš!ÜÜÆOõZFþ-þ½Â’•æè…ŽDF‚CƒÈÐ 2ÊSW& {íÍ‘©Íì=:øêh>½ÂƒVš"Ne ˜ͤ©š‰S„CÏ–÷ˆÛ=è»Ä½ÂƒVš"Nu ˜Â^+§éoRæ:Î{¾ÜÙòD–ÕjtT ‘‘àÐ 24ˆŒòÔ˜€™Ìì¦qs…CÏçå\Wìþd466Fº*…ÈÈ@phDFyjLÀ„“S—tkâûœ}žò"ZœH*..ŽtT ‘‘àÐ 24ˆŒòT”€ÍMέ•¶­•6s“Ó¥ÿ4eð’÷`%×PÁ²„–*pan!ÄÜä,¯´—WÚëšú!{gÚSú§$Žsoþ/áFÈòΪHÀ¹zBHY‰‘ÿÇçc/£91ãFÂôiæšN{¿ù:’¥ŒÌާAdd 84ˆ "£<éu#biÉÀ®À|%¸3=_S4Ó{èÒ³õCMÑ bˆ—~ÿ…Ùñ4ˆŒ ‡‘¡Ad”§Š° öºo]ÿª\·Í³ckdËjOÀLj{ÕáÐóÕN®õ\ËjOÀ„vÁ5Lª©ÿÀãq°1¦FcÕÔ ¾glBdd 84ˆ "£¼(HÀD§g¯¿U8âNÖy«*#X…åååEº*…ÈÈ@phDFyÑ€ ÑÍÐL.=oÒº,’RRR"]•Bdd 84ˆ "£¼èHÀ„vÙr¢½0Ën›pt[dË0Q“€™´Qì‚ÑX¹õ_u6E°<Ã5 ˜Â.,eFeò_3w“¥œ‰ÑX˜OƒÈÈ@phDFyÑ”€‰VË.[.qžËiØÁâ(³ãi "CƒÈ(OE+aâdb!gZƹ#üá¸êOväLuÆ%ò«WD‹¨ªR×Ô÷ofQ£çã<½q;7 û7D‹(KÀ…¹q—]–{fÚ"áLIOÍíù-#¸ŒŽDF‚CƒÈÐ 2Êc8uŒcb˜‹J²µÒV^i/+1Šwhàñ¸žû3×Ò? º71mß5?=Þ™›œ¹z~o¥ÂÜ8þ € ù¤§PÞYU ØÜää“ÍMN!›J¦RîLƒë…§ˆ×ËîJž÷qÊ"ñÔä¡$bHê±&| X]ƒ°êšúÊ+íÂ!Ÿ†I ñO{̘|ö²«<_í䯲íM˜=ÇfÊ.f£´OIúI• êJÀ…¹q¤DꤶìFoí!ÎÒNa8ïÜc›t÷=HX6„%WÄeJVV«KÄIBdd 84ˆ "£¼° ÂbüøÆ‚\ýÒ’$ŸÔJ§^ÏÞt›pÄ;ëÙ½sø…—„´PªˆT•hT@dd 84ˆ "£¼p‚æ.¦§h&MÓ\2G8ô|¶…ë8¦gEJqqq¤‹ RˆŒ ‡‘¡Ad”eÓü±Ën% ‰ý.§çý·cj·`ˆRQŸ€™Ä$íu7 ‡ÞºZïþ=,@ •€³³³u:]NNÎwÜQ[[¦§ð4³.ÕLÝoâ¬a}¢’0;ž‘‘àÐ 24ˆŒòÂ’€oºé¦7Úl¶}ûöÍ;wáÂ…ô]þC·†Y·nøÇ¢¦¦Æjµ ‡ý/1 {óJ0þÙÑÛ÷ß×kjj|/“¹ƒß×V«U%wVHêï"w˜?~ÄË Ú;HþØDÝwŽ;ÌŸ??âePçÄ¢÷»ÎÖ­['™†HØ(±ÇóÏ?ÿþûïòÉ'råöLgÏW»<›ßµËïÐ̾l87$ƒ.È#]øâP¢øÖ[oU qƒw3¾P8tôîHjˆ€F‰¬Ðj— £]~Ñ_X+ÃÑëyÿ-%žf´6"@dd 84ˆ "£<%VÂzûí·¯¼òJĘÒÙÒ<½Ëzöا™5wÐ7ÒV~}‡.///ÒEP)DF‚CƒÈÐ 2Ê }¾æškî»ï¾ùóç§§§Ÿ9sæÍ7ß|ê©§¶nÝòIb/_è=\Å2ó‡îÍïè &1Ƀ¬¯F[ùY °8 "#Á¡Adhå…¾ ú·¿ýío¼1}úô„„„«®ºª¶¶¶¢¢böìÙ!4†ÑÞ²Šètý‡Ž^Ïoú¦Âܸ²cY‰QX{²¬Ä¨’0ŒH¡¯/^¼xñâÅ!¿màê©}SJ k¶ð‡Þ£5ÕïîLœw¹ÌJÎÂv [+müî ü°gÿvi€ˆú•°üÕ5õ½l)nÐÎŒûf󙺖i80;ž‘‘àÐ 24ˆŒòF`.Ì[27¹éêU.¶¿ÊkàúfW¿C¼ÞÈ,8Š à‘‘àÐ 24ˆŒòÔµpH\hON:Ôzí¤ƒð'ãÎôìþœ¿˜PÆ<Õ {€X0°àì¸K¹Ú#“uü¡gÛfMá&;WzÌ3ñöìts-7!¤Åâvº9½6Œ ’@¬MÐæ¿i×¹ô ý‡n·û׈Ç#9æÙgØsC‹ë‰ mUf!¤ÊìøÓ†¶ÆVW$¾tÌP!22D†‘QžkA"‹mò+9ß1ºqúžÿ'Ù«ËØÒeâ ÄK=ógÏ2~s¢·ÓîßÍdd\‘aУ C¢{-èÈjË™¦™1иìÙõ)×xRþ-v·Oö%„Xìó9ÌJ€Ðù ˜¢½ñÛLJjÿ×ë~{=qôÊ\ßÓ+ýÇN[§oVNL$`ŸÀ.ÿ.¹°­#giw¿÷¦Ìå ñÒíÌ©¬äù°ïg bˆŒ ‡‘¡Ad” ˜MÁ$öŠ«…CÞý{h§µ&£o®M5²9˜§ÔØØ¨üC£"#Á¡AdhåÅJ&„°e72¹c„C÷æwlm’WjY²ºÌ”*ÊÁ&#»ºÔ‘XÅÅÅÊ?4* 22D†‘Q^ %`¢ÕjW~Ä]¨Å:E{7h9·äµy™º‡WfÌ(0BfZ™‘Ÿ¥“¼ #y!Lz†ö†åîwßà]Í×r;ä[’ëµL–IKÉ2iO·ºh‹gÉìñ@K5`B!š9óij’®°ïKo®ô]üâYþÿØ. ³ãi "CƒÈ(/¶jÀ<íM·¹Or–vBÃqS¿y[0‰I–ÛŒº07Ž_¨ÒÜää÷+ä+¾ ,Òi "CƒÈ(/æjÀ„bˆ×Þ¾†hú¿w]ŸÝýö«ÄëõYüYü~‡à¥%IÂê•âC€¡ŠÉL3v{ÍõÂ!w²®ãƒÍ*YübAŒ&`B»°´#k¢p˜¸ï³Œ¶Âa§Ý³¾ÜâVÁÊW555‘.‚J!22D†‘Q^ì&`Â0GçÜÖÅûw{Çû©žµ`,vO‡]z’’’òòò"]•Bdd 84ˆ "£¼NÀ„8ã7¤‹cúƒàu¬:ÿ>Ë T{i‹B+)%EntX,Cdd 84ˆ "£¼˜NÀ„“qy'§-óœg˺v ‡´E¡†iÄ&`™!Í>&. “Ö`»Êöõ´Þã„T#›fŒÅiZ €‘™€Z\ƒiÈÐró*¯±¿B†ã–w|4^o[]jÒF`÷#_˜OƒÈÈ@phDFy#0;œÜúm‹} +ò®ñÚ IDAT—ÒìpÔƒ}3ô=×ßIØþ|›àuü¨û½ü4… . ³ãi "CƒÈ(o&`ó¹¾N»ïü!‹Ýc>׿l¤d†þWM wͲ74Ÿu¿¿!ü…€5p[§ôì]á<-C×»²uô@g°÷À¾ÑõÔ=ƒ†c&àŒTéž[á¼L†®}k‹6C83±fËø¾Ó¡*˜¹É¹µÒæÿÏÜä”y:fh "CƒÈ(oŽò-ȉ3YËÅuÜT#[Ó¿q‚L†>ãÒ¿–±üçç_Ѻ„ÆëùNû¦Nen%„ {ë~K%‰JˆÌšÒ蘡Add 84ˆ "£¼X6è™Õe¦Tã@–5ÙÕ¥&ƒ¾R/Ÿ¡}Þ%dèv­éHÉm„é¿Øè±_yä­Ïöu óÁÂܸ²cY‰QØÑ?T`K%P›˜€ !y™º‡WfÌ(0BfZ™‘Ÿ¥^4C·gOéš½Xx5¿ïì}úÃÏ”ØR #° š§×2Y&-!$ˤÕk}´â3ô†UfÇŒÃÊE©>׌ºùFwW“÷ÄQþptýžüâ|wæ_î&÷ð¿­˜¹É)Ycj·Z­X"N"#Á¡AdhåÌp ä34Ñh´+V3¦¹À®Íï¼ùReàûò=¾þÿ†ÚŽÝØØ8¤ëc"#Á¡AdhåÅn\B¢võ½$ÎÀ1Ï·NoLw[øCÿÅ=|„ªÇ·¸¸xð‹b"#Á¡Adhå!Ëa2³µßþ®0 +ÁëXݶÑàuð‡âÅ=ü¡ÇdŒØ>`1ÉîØk¢ši—°KnðlÛÌfºÛWu¼ÿjúm^FCø)Åù¡-,Ä„˜¨KvÇÞË.,µÎ'õÖ—Ywò_Ó¦‡fÇÓ 22D†‘Q^L$`¾;6ø¾X†I\qǹøáÄBÛž9Ý5âÅ=³ãi "CƒÈ(/¼ ¸¹¹yâĉ ámíùþ×áôÅõìw~d×% gn±l¹{Z»0u`H˜€9Ž[³fÍïÿûð=BIc&¤¿÷CÛßkÎrÞô-¯rç[#[*ˆRaLÀO=õTVVÖªU«Â÷…éóÇsG.Ôz{{ܯ<ÏuÛÂúКšš°Þ?z!22D†‘Q^¸FA"SºöÎÝ…<íõºß^Ϭ£]ßÖé›}åÏó0;ž‘‘àÐ 24ˆŒòBŸ€9?ÂÉ?+‚øZå-iÕ%«8Í…ê¾ÛÕ·þŤÎviñ+S’t´XÏÔ&&6cјçÜ£¦Vt|Èp!Dãt\òÕúí¦ïblhq½¶Íb±{!UfÇ©fWR¼ÆÖëßG™õ,@mbb-h|åuk¥M<éH8 x»ßƒ EûÆ\#¼¤wØîn۠鱯¿}yÖnÃ0)‰õ]“‘]]j’…ŽDF‚CƒÈÐ 2Ê ×஡ á03ñ¤^s“³ W_«çÇ9ó£‘ !v ¦‘J½¤õSÏ—;„+;’sŸI^é`|k·«ËR«ÌŽ*³cFaå¢ÔAç@…oôl‚öYƒOÃâ1 sãü×Ç Ã^µŠ½îfÎnóVUò‡i]M«û6¾’q»“щ/³Ø¼Y&-!$ˤEöˆY#0KæWñL_¾Nú3Œvùî»÷D-b|ßé;ο·~Ô·=Ì@SF*{¦ÍK¹ÄŠ˜€iùÕ©ÐcYíw·>ûlêùSü‰Ióªö÷Þu‹—hÈ…!WgÚ\ßÒjµb‰8IˆŒ ‡‘¡Ad”‹ƒ°ÂK§¯™wçY}¶p¢¨÷øòŽ- árå_Ãü!22D†‘QÞ¬‡ƒän „ÒmìÖ^ɸý]o$ØÚø3³»k’R&®üN¾ÅÅÅÃ*úÈ…ÈÈ@phDFy±’€‡º‘é]Db³#ž]“pðÊ»®Üóo®³ƒ?3ñì×ìŽRº,¨âÀH ØgAŒ†–¶5e¦¼LÝ oÈ œöéZ2}£ÃxÅšû™—þÎÙºø—<Ÿ— Ë^s]Ðߌ#?;œÜúmñ.vÏúrËö ’8-NÀ~™žýÁ·~”òÖs:W/gûÇD£!IWð‡B˶˜Ï.LX£U"#Á¡AdhåÀ…8|np¼ô±Åÿü÷¯3å†ÿAw\ÙyÉÿJð:„“õÓJÿi+¡- Èz   ,Ä<¹=ˆòCù Únƒ 9•«î±lÐ9ûëÁŽl[˜â"¤ThÙöY´kàžRUdBÙ«¢ÈÈOÀ´½†B¾-Ó÷ôrgõÙ5—¯ž½çÒןM¯µ~~œXP²”Ï£üJÔü¶Äâ÷ú þPB€¢ÚÈŸ\g2úæÚpìADËè ñ !Äš–§»ë~7ðЉ5[ÄkGK*Ì›™×Ãoù@)ÈÕó;@ sÕÌ‘¡¦¦&ÒEP/‡‘¡Ad”7ò°AϬ.3¥‡¶Qh™>ÍØßÌP¯}àÒïzØ £¯9γ彣ÿÙ,³ SA®þ¦+G--IðÒ’$á0ÆåååEºê…àÐ 24ˆŒòF~&„äeê^™1£À@™Q`xheF~Öæ ÉO/Öhˆd¦×^8Q×Ô÷ö©Ì—ÓnoÏPp¤Ü½}‹Ì#°8 "#Á¡Adhåü>`ž^Ë„|"ÉéůÌذ£S¼Û`íéþñφ\>ŸXüÕ«ZwÅwüÑí¬ÇMÈ•„>1)$õˆ•r2Ó‹i™^4™¸˜›z¿ëÕÿGúússÞñ]7»Ü-Ò£®(ëm@ôЉ&èp M:2Ÿ hÏ%&‚î{?&†xáÌåöý“ª7æè}†\MÉìR ˜_§ÚÿŸLOs”ª¨¨ˆtÔ Á¡Adhå¡$¹éÅaÆæë¾ÿ€ë•žnþÌèú=𝼷~g+!³’JŠÈPöRŒ™KXµG‚CƒÈÐ 2ÊC’Ìôâ3m^BˆÅæáwLòß@IH„Ì豺þÌýÒ³ÂzÑÞ{ݽ=šÉߺ`’‹{t$¨ pøIG–‹[¡ùéÅgÚ\„›gß±^á%ñJâš(“™­ýþÝ/>«ï½ƒk]ÒîØ®¿9È‚]ȸ´Å=@ ФA§§%±ü¢>ÿük¢Lföþ÷´kM·j«ûaÛt΂Ž:DF‚CƒÈÐ 2ÊC 8xüôbŸIG«¦$6Àª§ÓÍ5ôwd~÷Ço¥ô´ò'Ç8Ï¥Vü›+~34ˆŒ ‡‘¡Ad”‡ð° zqC‹ë‰ mUf‡5þÍtÇÙø1ÂKFk³û…'¹ó­!+.¨p$ñ“‰…Žä^áŸi·ŸNؤ‰³t¸^|ÚÙpJXoËéVÅö‘0LHÀ‘ä?™¸O£1mEӨɧºí®=ã8t˜RevüiC[c«Kárª“ÕjtÔ Á¡Adhå!G’ä¤a7£-/¼ýkã,áŒÎëZÝþÎ¥ÝÉ…õ¶NÔƒIccc¤‹ ^ "CƒÈ(ƒ°"‰6™8>Ýdº6kŒi\ívþŒ†óÞlùÄèéÞž|¥ÅîÙøEgfÊÀÿxnqì(..ŽtÔ Á¡Adhå!Gm21¿ƒáɩ׸“Lö½§!^BÃq¥Ö]iîÎ÷L×<á¸èF#n•+€MБ$9™xÕâÔö®þ!W®K.ýϨ[]ÌÀßIsº«¿w~Ã¥ã‰x½hÿ¹Åâ}1n @…€CFØA¼öä [ øìU¼rqê†íUf!¤ÊìxÿK[}Ò„g~§[3°mC£á–£/¥vBø…®|ª¿ÂÔ&2¢ÇmaÝ "CƒÈ( 8dø]Ê+íB.¯´²‰‚0™8=YûæöNq‹´µÛ£×ë;MyÿÈZÓ¦MxO[sÉŽŒë;ã7Ÿ©MdäŽÛº2D†‘Qú€CFØÁ÷dÀ:ìnÿ-»z<«ËR«Ìº4«ï±¿›aí©¨sö|¿íÍcgo#%—‹¯—Ù'±(ßxa ¬€CFØ!h=½Ò•T‹Í›eÒViâ,üÁ¢ÆÍÞƒûøó:Î=}ß¡-»‘0ýëpÉ퓘/ù D@L4A‹»c}zjU%!^z1Ka¶’—Õj¿ý]öê²×8γëÓ¦¼ðéžvþû:}^úû¢MyŠ^555‘.‚z!84ˆ "£¼˜¨‹÷¨§m ¨iF­ÿ¬¤äFØâB†-]Ƥg8ßÛ ñö_9ªéȤ¶ç_µ¼C›*yg~ŸÄp–=òòò"]õBphDFy1‘€‡ß;« -KV—™^-·¸&#{§h‹CföeÏ'UüÇèéÿÃ"ÛÕúã–—?Ÿ´"~êdk·÷ð)‡½×+“h—’’é"¨‚CƒÈÐ 2Ê‹‰<üÞYæ&'?ÂYܲM†½(•ü‡bÖ´¼ç2×ÜßûnRç9þL‚×qݱ׵7³ ¯v^™,ÜäÒ) µ§µ§>wˆÍõ³T"ô xÏž=ÿú׿>ûì³³gÏŽ5jÚ´i÷ÝwßòåËCþ È7k“¶l¾Åa§6ùÀ‚{®>ù·æþ Ãy=½ËnÐß²J¸IC‹S\Ôêk„ˆ¡OÀ?ýéO׬Y³víÚñãÇÛíöÊÊʇ~¸ººúñÇù³"H²Y›„¡e»¢¢Bf~ž‡Õio_ãÉã.ÿáúQ{«÷»ÎIœ±’qQù¿„ö6‰|db‚CƒÈÐ 2Ê }Þ»w¯ðuZZZYYYAAAIIÉKÀáhÖ–$ù+qÑJ“¢_°ä€5eâ×oÇsýë~pm-³w¾p,e!³„¢òc¿ rõ…¹quM}ü?ážQ×"  "CƒÈ(O‰>`NDz#mL5´¸^»°ÖU•ÙÑÐÒ¶¦ÌÔž3¥<û{÷vo2v5ó—i]Žï¶ÿ·ñÈy2ûf¢¹h¾™Oûy?´H((¼ó€­Vë®]»n¿ýöûî»/¬Š´•&ÝÒ®5í_t¯fÎ<á%†ãò}îú÷3\×E[mæÆ••ËJŒò;:@ø„+3 Ã0LjjêÂ… “’’Ö­[à[|¬[·N¼DxMMÕ:KÄ/‰¿¶Z­âI媽?vúŸï†R _Búúú¶UÔþóÝÃâUD6~Ñ)¹Òd‡ÝMñjt{2óØeß&¢&î”ÙõìŸ¼Ç näêsãNÍ›èp¢£J¨þFK$+**"^ÕÞA¥èý.Âq‡ŠŠŠˆ—Awxå•W"^†ÈÞaݺu’iˆ„ Ãqa\£¿µµõ³Ï>{ðÁï¹çžßýîwrå`Â[uÚZióo .+1BÊ+íÂÜjÒ˜¸ãgúÊJŒKK’!\C}÷k/é{»®`˜ÆI ^è™·¤$™¿F(€ð.ð¾ôÞ>àÌÌÌU«Vegg¯Y³F>Ç&Ú !ÂØ(ÿ Z­îƒ'|gô¿e,™ü û=±cäÞúþS—wlç½úgz¾CÒ-@„)1«¤¤¤µµUEÚPj!û_àpr çÚ|–«L5²iFßÿJg\â+é+¾—V3ñð'ÄÓýXgSÎög½©+5—ÌÙ·0aõ±¨} J$àÝ»wO™2EHV«U¼DœAÏø/W¹rqêîÃÝ„‹»öt_CK‡1Ç0;ãKìWæLÛûvœ£¿9Zër¸ßzES\{í /¡}íCphDFy¡OÀK—.½ÿþû/¿ür“ÉÔÚÚZ^^þè£þóŸÿ ùƒbDcccqq±øŒÏr•W%nØÞ)ÌJ:vÚépz…‹ÍMN3ÉHLÿþ}î-é-Ç…óÞ}»]§ÌIÓ¿MHr ÅIå•oQÕz þ‘‚CƒÈÐ 2Ê }ßòŽ;ž}öÙ;wZ­ÖŒŒŒ+®¸bíÚµ—]vÙ åˆÉAXþø<矢üó?~jñ,ã7'z}ÆEÇë™Ë‹µ¢©×V»÷ȩޙ­{–v}ÎréÙËj·$-L¼zÑÒ¹ƒ¤aÚx± FoaäD‘h„µhÑ¢E‹…ü¶1b¨;'vØÝþ³’zܸl]Q¾?t8¹?¿Ýfsp_$_VoÈ¿½ýý wÿ’Æã^Öù™å«nò&Y®õIr=KLZLì†E†ºsbO¯ôßem’ßÿµù\Ÿ¤Ï곟Íúþ2ë¶¹ö*ábSKëïÿ«½i…ÌÈ,ÿõ,Q$`uñö\QQQK]£Õgö‘ #u º­ó¢*²S£{×tý1CáòŽâ½f4õö¸ßzEs¸Jû­$!1¢F|H3ÖŽ—àÐ 24ˆŒò€ÕNþW"ͨ5YÿYI9•fq2ŽŸt&;{Eûæ } ÂIï¡¶:óÑ9ËëãÇwØà(#LþvÞZi bè“dÏqíi‡›Ñžœºxâ¢Yîwÿõœ®÷ÖrŸ4–vuµv!L•ÙÑÐÒ¶¦Ìø}fC]t>_ò€‘ 8ÊøLþé_-ËoíŽ@Èô3còt?~Èóå×¶4ÞþÄ©éë-=÷ñ$}õ{é×µh3øäYã|œäl(™ó#š Õ®¢¢B|X˜WVbôù–É?,Ë.X²ÿêûNësŧógÒüÒRëN=ç²Ø=vw€÷ãgCùœô™²<$>‘1‡‘¡Ad”‡°ÚùÌŽt áв§ä<ŸµzͨڂšµîþG°œ÷ê®Ý³»«·¦\ÝÜ1›Pæù/•5il\•Ù!lÖä?eyH°n€ ‡‘¡Ad”‡ Tü+Ž0Rfin›Þ÷þ;Ó{j…W“=öÛ:6›{jÞO]ZeN组ó2uÂÒKe’¦mîpKNYˆHÀÐÏg„ó¹v÷kf U™§šYï˜åUGn´lKö ¤ÕGÃOZ^Ú™tù.nÞúr˃+2„­äJ„‹ÍÓÜá¦MYˆèV»A;føÐâAÑÂaà|–Èø¿7Û^ú¤CÃC¾G<~{Ÿ“âíîÅ3—üו,¯´/žeüæD¯ÿ$]«ËR«ÌŽ*³cz¢åŠ“ï;ísAsrþ™9Ël©ã¶„§Eâ ,.!€j…/=¡ :ê º…°ôÌ%2°³B‡ÝHö%„Xl^~æ’67çÅîï÷½É²Íèé.ÈîjÈúüж¤,²³FñS@ 8êÑÆE $34í¬ÐÓèw©ì™6/¹° b ™Zg˜°ØZq¹}?Ëõ§p†ãfušî8~fÒ‚Óçíß$`µ³Z­Ã\"Î?CóÒuM}|U¸«7 ê/?g÷L›‹\´ bÜG©×|8ëæîí¶ÂÅ:süÑO'œÝÇ.¹ÁÌM“¼¡ÿ<%^an\ »> ?2#‚CƒÈÐ 2ÊCV»ÆÆÆâââÐÞÓ§Qº¹]b1¤VÃk7u›añb–£§ä,z@ÛpÂóÑ»\K“p ×eu¿ûÆ¥IMqW2—ϸÂx±Æp%$ŽÈŒ "CƒÈ(O-CŸ0KIþUOk·÷ð)‡½÷¢%2rÒµþÛ û ¡òQåõzç³Ñ5Ÿ&z{}Úb*h(^úÞIß?±ù\ë3:l˜û„ aA(Iv;¯LöO·òÛ KÐhÎN˜÷æùÂï%îÏ«ÿЏ¶ûͲ˜3¿x~LæÔÓÅe=IÂy¾+šOÀ ± úÉìÍ0TÁ\´tÌ ×T¿¼ék•†ë¯X3—Ûr$·õ¨¦h&»ôF&m^¨ŽÑ+<ÌŽäÞ`H€Õ®¢¢B k´± ¢¹;þ­¤k+âf^Û¹£°ïÔÀ ç=tÀ{´š{…fa“<Ð(M[½R²W˜ÌÞB’›¨ŠJ~lT‘¡Ad”‡¬v*ù•pDñz–Z–!„œÕgÿ;sU£ai×çcûÆgdzç OåöÒ+õ)óaˆÔê•iIl‡Íc±y¶VÚ„·òS>2´/‡´CTHn¢**ù±Q!D†‘Q0„¶Ü‡¸å¶¡Å%^>ºN4ÂÙlÈÿ‡aMaß©ë,ŸåºZnávyv>ý’‰ŸÁ9–äö¯[ɯ¦É½ïX¯ÙçÁ¢Š©,…·Ñ‘’› 0dÐmNný6‹xE­î^¯†!^ÑàÁº¸q¯þpíäSš]ŸpíÂyÖãºÂ^éÙVå隯¹ê&)YxI²n½S6cP»šššHAšÏ&¿èô_ÏÒË‘DÃÀϘÉÈÞYš7÷2ÝÏÿG{óJ&Õ$¾˜u»<_îpýåq÷ =üIÉø¯U5@phDFy¨«]^^^¤‹ MÜ+,³ùÒ‰gÏ»|f7–Õ̽B3û²ó;¾Ð|±Íèèß%n—÷ë/æivëã‹Üök¡6™1Ï!¹‰Æm©öÇ&âDFyHÀj‘Åá$Ç<“‹³‹O¯p«Õ}ð„ÃÿVÙiZ·‡#R³›ÍóÍÓìÙ—v¼ºë«$Ñ6ÃŒ×3§»šû´ÆÝt »` 3&ßÿÎâÈølf,?Š6æÙ3›œ·÷&*85iDFyHÀ ‘n}‰o ä?ú‰çpr çÚ,·B‹—–xî¹¾N»‡0ÚÝÆ’½‰³Jº«Øö˜ÜVá†ã¼‡«¼‡«4ã'¦å\Áp9’÷ñüÕÐÒ¶¦Ì”—©£}¿’ýÊV»wïÑ[¯w87!Ñ 8 A@V;fÇËìW8¤ÖTñö õøRd¤²>g< »?±ø›ÄéÅ=µ l{F;›Å¯æ8[sjßµÿqwéUé‹TìÿfþüùýÕè‹õ:¹í.n–m–¼‰Åî1Ÿë+Ê7ð‡ÒmÎCÙíXÉnc,ª@ƒÈÐ 2ÊCV;~%ÝQ8pCZϲ 'Îdd-~™#LuÂÔê„©…}§ví)tœ¿jtÛÈî-ÎÊÏ.Ÿs×q¾­3^òæ“ÆÄy¼\€3—ÄuqßózŸù?SüœßíXÉnc|’Ò 24ˆŒò€!bü[­ãõš^ç@;p]ܸºŒq9ÎÖ«ì_Ïè>¢!/gŸç«]ž=_ÌÊ-¬ë›Yk(à˜‹òýüâ„3m®‡ýëâþçù¤ë³R‡ÓÍ}y¸›6n ÝÆ † áÈPjŸVë†õå>÷9§Ï|;~,å IDATíÆO“¯ºÒ¶oNwu'šòÄqñgO¬&'Z´_%Í90ݩѿÁ_’m¿ùYzaàôåÓýëâüMd¾Á¡þÂz[ †¬vÑÛ1#½|4ñmq·ZOcl”&„thS?4•~šº`®íÀ•Ý•Éâ©Ã„d¹Ûn¶|²ÔúùþÄKj3fßP:Q<øK²í7^Ïô:9ÒŸ;]Kç&mÝg |™äà/Ÿq[½?6á†ÈÐ 2Ê }Þµk×sÏ=·}ûv§Ó9uêÔGyäæ›oùSbGôþJÈŒí¢½Å¿Q:5‘õx9a|r/·+yÞ¡œyN;£ùz'w¶Qüöx¯c¾mï|û>æÃïÜ+4žqI„†ßü,ýîÃ=â¶îN»§|Ÿíg·ŽÚô¥Uf™x¶ñ±3ŽAÇmIÒ”å EïM¸!24ˆŒòBŸ€.\¸hÑ¢M›6Íš5ëðáÃ?üáÏŸ?÷Ýw‡üA rÁíòJÝÜáö™ÝôÝRS\V™3—k<éùj§÷pñˆr!Çq'ëÜ'ëæéXÃô®³—Y(¡Û~Àëó\‹ÝsºÍ)3‚̧ÁùØiéÅ¿Äã¶ü ÚjM›ì¤†Å= ´BŸ€|ðÁ'žx‚aBÈܹsׯ_ë­·"Cà|†RËÌnbòÆkóÆs¶.ï½=;?st‰ïçê™ïÚKöîm®ÉI¸b>›PÄŸ—óLáßàìpú¦pm<—äMü[­i“€FžÐ'à?ÿùÏâÃÂÂÂÓ§O‡ü)±ÃjµFÅq ¹ šäì&!2LR2»`Éž¸9Í_î/cjLí§ljߞÝ{Ž|¶ñr݇º¸"­õòÔBé5o3RÙ3mÒiUr¢°?ùq[Ì6ÕîOÑòc£óƒ !¤­yaëö_Ÿ{nÍùwŠ{j9w¼žq8½ÛH”„G¢^zµÛ&å$„Ì(0<´2#?K'ÉëÉ›ôXÏÐþ/‰‘úß”ü±QÏOuïP\\ñ2¨óâ·Dïw1œ;¬[·N2 ‘°a¸‹ëB¨¥¥eÅŠëÖ­[´hÑàå`ÂXP'™¥ùútY‰Q¨ÿm­´ùœŸ—yJºÛ2×~pNOÑÓ-ySkè›0ídzQGÖ$Žéÿ“ÔbótØ™mÛí×3glaæPÚ dª4m—‡#¯^‰å´¢‚Z~ÑM#ž‰bƒFFhéšg¸xÓCÆg<3¯¿··Ç[{È{è ÷øÿL,èNÊlÏ™b˜^æ­=ÄÕâl]þ×'8m ûsö{Íi}Î ÃøÖ™ÅÙ“‰Fºjë3RÚjóú“ßs‰ÒÐâú׿æ—–PvŽeø…¢Ad”§–žWôà ©ƒ“ÏjCZ1#ðu›ûqw¶Ñ{´Æ{ô×Ò4H5…“5…S˜‚ÉLªÉÿûò¹Ü Ìü,j6•\KkÐq[AÀd'ˆèž¸Õ:À3\·yÃ0còÙ1ùlé²»N·î­¾ÒÐ8ª½ž8¥ªÝ=ÝÞêo¼ÕßB˜ô ¦`²¦`’fÂD’(Ù~.¹&M »K¼kèÙtо‡ #­WXþ]y™º‡WfȬÛLãHHÝcœ\²`é¬oC}ýUºSµ9®6"õG4×ÞÆµ·y÷V†arF?qü„‰šqÄ/¾ŒŸ7•eÒZ†@vöD6¢ê3Ú\¾x @V;tÌ _ÐËi ¬g@æã]4ú‰Ó¼Âݹ£ªz¯¼l¬û欳šºZ¯ùé‘Z}šã¸¦3ž¦3äËD£arÇhÆOdÆhò'øáªA'Ò{M1hϺ?á2~3æ‚\}TÌwÂ/ "£<$`µÃ¯„?Õñï$Xev˜›ÚÂÙz½„¯OkY&¬)›“·‚åΞöÖõš{Nj¼RV¯—;Óè9ÓH¾øŒc˜ž¤Ì¬ø±3ݹͧ&˜›Rüw§ „˜s|:t{$–útÜŸM…TÊçÿ‰/óo”VíÿMÔýB)Ö×u‘€!Êø$9õ ñu8¹õÛ.ÚÑÞ{Qrí´{Ö—[\‘a›ÏŽÍg]{ºÑÞ^sÜÔfNhªKïnfˆD5Ãq‰]-ÓºZ¦BÚI'›r2nlOÖ¸sIyßt$OG.4‹s[‹S©ÇK>ûFbÕLŸFiÕþ_Œ$èkÁÔ2ö£ !Š ñ>Üš¶“ ÉE¬¶VÚ*öž¿elë æŒ·þ8×Ú,Ùaì£[ïÈÌ׿;©Ë±™ÆkX{RiLÜñ3·Š×kz/t$‹;•å ÿ’»b›Oeº¢eÕ¶óÇ4ABHANœÉÈú/P%?Ä7˜ }æ’ÿÚÉ ¬—ãì½ÔÁPþã¶jI~¼jµ}9ãÿñ…±Ó4ƒ1q™îóyަ±®³ã\M£úÎKŽáêŸÛ©=kKÌ·B>%Î]qLÎh.kLbWZ®+ÝíΖ|W¯(ã:œÞx=syQbCK6ÍÏÒu¸[f¸5C§›S ùÔŸüðìhÙ¤XŸ D0D“!/P¥,ÿµ;!2Kyññ*¼…#L‹6£Å˜±Ì „¸¾1ÎscúšÆ:Ïq6%{¤Ú~Î>®¡ž4Ô_JÈ¥„xZ4-ºÌ³ú¬&]Ö9}ö9m¦S#Qïurã²uZ–½ÂÅã âÿ‹x=3yLÜÎêG[íÞ# ~"–’äm¶ bÞsD(Öç¬v˜ï#誔á¿v‡ÌRA|¼ÒÞâ`âêâÆÕÅã“<ö»Š»ÆöãΞöžm”^úã–óæ:›sÍü!G‹ÎtN;ªE—Ù¬Õ¬Íl×™¼DCiîp‹«•âÿ‹ì4ms‡ûëÚ™ R¿Ѹ-ùvþ*ˆ‘MiµnY•àà£FyHÀj‡_ A,P¥NA|¼øÉkc§RrÇ͘Cq8¹ÿS—ÔyfŒ³y´³9ÇÙœèí•y/C¸4WG𫣍÷8ÆÃhZu£Zµé–Yn’6J—QcNmhqñÕJþÿbl†î’ ý]¿|µ2)Qsð„ÃçæòõûŒÛ’oWà¡‚ÙŽVëAÿàìs1è5§š]gÚ\’o >j”‡ ´™K2o ¢K[ò-’„Tm>××Ðg$ñSÅOáϤxºr-£-¹®æ\gKŠGb#E1–óæ8[sœ­¤ç(ÆÍ°mºôóÿe;Úã6e¸M]¦¤øü,=_E6ÆkrÓt‰o&²õ{ùÌ´]aÈ]…¶ÕzÐ?8üû\âõL¯Ó»ý€ï»„¥ÐÄV[—6ø@ É™Kæ\§p¸µÒF.þX ¢KÛÿ-©‰¬ÇÛ¿à¥@œÅý’•M¶Æ'ŸÈ&z{sœÍ£]-H«É~n”§“áð¬å<ý)ùè‘BB–âifÛ¿I툕ͦi´£ÚަŸIJ'D"ˆ+ñ´v]þ¥!-Š)y±Óç[+½„V«[²Š¼ñ‹ÎÌ”‹>ÅO Ç|Ü@þàp¹¹9“âŸr4w¸³Ó´¹£tVûÀ2þzÿ¥ÐQã˜2ð¬v555˜œü÷\&Ò¶A ¢KÛÿ-ÍnŸ,~Å„ƒ>“?´Õº[_g_g¿“’Dtœ;Óu>ÛÕziš5®ý\BWK’ü.B!,çÉt·gºÛ§§ZH·&±Mg:¯M;¯Mkך:tiî”tqý^² è™MÎ[‡¶(¦­‘À¿=|ð DO´Õ:ˆì@Š×5õ hîp7w¸ !ãfnŽË¥S r/’tÑ8«rí5ÊCV»¼¼¼Hâ?sI¦z'D—¶Ï[üSro÷ÀS$RR«aˆµ»ÿdR¼fZ¾!Ũ¹ðz*!…LnÜ‘¦¾òJû —°ãØŽÊ/ê3]ç³ÜmY®vc)™’èíNìë×wfàT3aþšäJÏ`Ò3˜´Q—hLI…ÉG»ŒGZY>€V»wïÑaà´1^sÙÔÉE1iõo$¾;þ&’ BfN4غ½’O ¤Õ:¸ìl‹ù„¨¡Åµ´$©¼ÒÆß¤¹Ãípö1Ú5ÊCV;,çCX—PÚuÕ#èmƒà“’õ¢ZCwNº–Vóæƒ,Ĺö<Û›5º:-U˜õ›àud¹Úò5Kóº5í縶®Ë`Q9»Øm\C=!$tBJéÖÄ{ìiIö¬¯[â9Or‡.µƒMµ²Iö^2袘þ$Û„Šæ¨d­ÃÁuvûv½ëò”M_Z‰TM4 cAt`’×}~Šø¥9Ä=vÏÆ]âåJéÒö7‚?jT»<80Dq=ƒÖ®;‚ùõÚ°£SXW’P–­¦5tÓjÞÒ+qŠÖÃêÑ:ÓÇÝX:KŸÕ_Í:Z×¹u‹9ÓÕžánåj嶤»;´\@ëcB½½Är–XÎÎô2š.ÖhaSlodd:“çÚH}†Ù]ßàe©µBˆø%Pì½ÞíâɇN:’þ{wG}æü™™ÙYï«íÄIœ—sRB ¸„4M¡…’”@—†¦\Ñ¥ñýq¨´Ôk¯HôÒŠ êªQ¤œÄA«¦=Á%E oM ¹$ G^0&!@œÄ/±'~Ù÷ÝÙy¹?6LÆ»3ë±½»3¶¿ñÇz¼ÌþöñdŸßÛÃ|¬q”»o þú•+Vw¢vŒMbã‘©,7*Þ,›u9µ+글aš)î‘#Wn¡`‡éÄi*ùÅÜ$5æ˜m[=¡ŽnÓ ‘±ÈRÁMóÒEáD]SO¢Q?Â6I|¥1™¸Ä\\ä‰ÖÉ#¾ÔcZÙ «©9‘côiO˜¨…ˆFˆÚé:†I°þa.<ê ŸШ'4ú¹íÖF G˜@ÐêÛƒQ<¥DÜMKÅŽó™ÖfqÓíág^¹RâNÔæ‚±‰®n²Êë‡:RÆUFÆëÁfÍÒ'™mò×óÔ‡ÉË Øí°:¾€Þ#7"c™*¬¿˜§ÆâÚ‚D”ú„èVý´vnšÉ¸üÔºó<_’¡8‹wt‹; _¾$šOµWŸÆFÔûW*_Y˜¢¡+¹ÁËg?¼ÊŒÔ+#ÍdPÖ £iA%T‹¥‹W½K¹w‰ˆÈã¹£&¸ŠeÅ$3¾°$ÔÀ‰~!Æs̵O¼Ñ„"z"J¤Õ½–¾µ³`l«›¬òú'½Ù1»s®û[p”8‰©ð*Ï´ÃÙØ2éaò²sK c€Y¨:CSùšvžY¢ì±ÍÊ ’¬éÝÅuˆóôÿE/­ÁhZH×Ë£µòh­•Gëä‘:%P“LY?R¬ç‚QO0Æ¢žPœ D¹@œ Ƹ@’­Q¶àùÿø¥ÐW[ýùÇ݃¹âqôÅó®}‚Û©Rð—*ÞO[ØÛZjô=·ók±Œe˜‹k~° ©cãTú$3›Í ¾tM ã_êÞ/„PŒ`¦©Î,-›7ÍT²'ßæÍº±£{E“wEÓ˜ês»òmzACa¢\(Ê…È»ˆˆ|^6U‰È£)óÙ˜˜­UbµòhDŽÕ*£µr,¨&ØñV*›ªQ3ùécſ҈Irþ8Wã‚ Öãq6 }T{t ,‰AÉT<üƒw†­zàÉÞ8±é`¤±Ò”q~™ $›N©Û°:øÆ±¸é$;Ó“ó3½$¦iÎ.ž 7õMÙô%×å… 0Õ%Í[ ë9ÛÎx¶å\˜±¼3ÔÞ™iïÌ´,ó·6×ï~s´à œ¦„”xD‰Öʱù\üÖyÙ@.¦Œh±QÊ”Úe³†´€’(‰4xí¨á•%†—ÿ:>Ъˆl6ÔÝ”]C¨aa˜©ñ“?8ÏoÞŸiì46ÝN«`d½Hþÿ¾\b ÙtJÝç—‰Æ#¥Obõ‡è,øÙé9J“S<nÒ›²å‡‰èð©dS_öo‘€ÝnÆ Ì”"SBÙƒ3n·s‹\pk²t¾00œ+î€í½,ë˜{/Ë>)xŽÂp#žÈˆ'rÞKDôvšùR‹ßÃqJΛŽz3ñEÞä\OŠbQ-6ªÅ¢Êð%ã¬íYÙÅ-'dGÙÑ"J“ž¦õ±ëf¢Ÿ3|‚óÇ8Š­I±b†õ©bMsï5ê'_ ãþƒßßÔâ×wë\ÒøoÿÙGã O ìwtK²¦×4¼ëócoªÕ¼-½“vA=ß?”+~Âç®ó*ªVzû gÃó#ïözZ–„±¹¹³O:כⳉ+=ã—F›ƒ™…Þ´–ˆÉ£Q1—É ¿ššÐ<íÒ-'ȹSƒˆ†Í0¾4ëÿ§F® èû‚æmy™e^Tx1Ç‹£9áŠÄûBþ@­_öx‰èÂ@nÌüçÏ{\ î/ \VT-‘¶¼i®²Ô˜*Èâ¦{}«ùE6™¹úƒ>ÖX»ºxÜjÃðò®®F€ê)øÜïìlY"ê}§ùì[¼«†ÞI«‘y?ÙÚ•¾öÎ YlaU¨jÌàô‰4G4—|s?’‰d"†ôÕSDäU¥…bêá;^JR2¡%”J*ÉD÷¨’HÔ1)Ÿœb“/SÁiª_KúÕ$ «ÃDD¢@‰ÿaHôåxq0#do†õ¦YQbx‰Ò¬¸¼/¬ªAòz%Nxó`Ö“õ!ÇòÆMštÎWa7Óºíú¶9·àÎVÿÅ+¹üW½9aOñã…CàfJ O°ÛE£Ñ¼EÜT 2%¸38Å+eiõÝRùÇ¦ÃÆŸ­¦{8|ÜŸÇó[KšŽÕ™O› Në£rÁ¼Ù,+œ“„³|m˲« éê— ¿B~""Q`)›*I¿’ò«)Ÿšñ)é-½¬NUS‰\,f2‚”¬QÓö7›0M£tŠO§šþöÐÕk–è_Æþ&Íxsœ!Ab… ã•X^f<ÆxÛ¯4Öè»’b$ó¢ÂòЇW<>Yð*œ°¤)¸tñ8K× Ô˜2µ ˉt*‘Ví¿¢¢©m¦sž‰¨o8§Õ-듳¡â_|JʧDDµcºÆ†DÃräˆó ‡g<¼˜öÔŽ’ÄðYÖ+3\–õÊÄæX!±Ä¯^$O<Ÿã|ûÄ™[Ê2qË¿“]S²Sº Rä7¾îêÏ•(‡¥ï§•šæº+BDúÂ-Ó“”®Õ= HÀnçÂQ—@dJpgp¬VÊ6Íôý. ˜-oº=¤·6‹Åë” úNÇždüZdcïIÓ/iI[2Ÿ×_·¸pB^–²a„ÂD põëçr†qÖ‘ðÙô¨UK<~Qàå e2Z&E™ eÒZ:E™´–IS&C™”–ÉP:}õdrÇYqšFé”FDIÃ1¢¹düÖa0Lò‰«¢ûK™ár ¯r|VãXžçDžˆ„÷jä8âù|Ú&‡¼Äq$x‰ãF²üÑ3šÄßÄPò´oÏyöBGÎHñ´šfE"òúøe‹!?+ó¢Æ\ uAQ©Î¾Ë icjL}!øÆ{…««Ë;"^‘|âĉçŸþÅ_ŒF£˜Û y6wT.-ß±©÷%=m¾ðwŠcuãî=igÛ «;~]ñgzÁ*£¨Ä¾ÝÉ.k¬mn²÷Á¯ª”IwuÇ.öÄxøðáo¼±ç€éÈÎŽÊã*(‡eõ´)ŽÕYÕpÔ“¥/VIº±žïÊ™~¦;\=–¥ÿ™„úf'…ˆæ‘ŸH%ÊÒúU+QY_t40,¿`xw |ÒC_®i¨‘ßúûPwOüú¹ê—W%§e3$˔͔ǥžî8ÉY^•½Z¶†¤°'ÇÊY’\”¿m‘$†$[=!qj""¢Û[üeϾT¡|êÔ©æTúIDATJœvvÂvV™Üœq³š£Â¦Û)—Hêö#cUÃ1ÏΗ «$­’FŸÕI¤±3ŒÊRìËd༰»u°e‰xëç|úÜãs|¿?2¼ôººaÏ‚No½rª°lá˜=¨Ÿ}éòhdÌû½º.–'ʤ5YîîM]èK\èIÅ£™9Aš'JûÓ<É¢’á5™×r<)5çãÊÉI¼*×0¯J¬*‹jÖ£É|ùÖz•W…v«ìöö·×ÀF³DÁþS¿±·LÂ$˜Ÿ(˜‹;îëšN(V¢FY˜nLa‡±avJMט‘ííSB5þJÐrœ¦ðjÎC ¯å<šÂöÕü’yI)2e³¤ªr:ÝþijäJ"âg³ñCšOÉ2¤‰j†ˆxÊÍ ‘g®nMšËi²LD”.šÞeƒ÷©gQŒf‚ U&¶£ô­êäØé ÷u‹ïøƒ>våb1Sv©Ò;>Ú™|nUŒA<é´p;Í‹¥”¶ ‘üîß êùþ!"†ÏOžÒ½5ì]"\ûfMª§»2ñœJa""¶Î|—+Þªg%›Ífäç^é‹%eŸš!"†4Q»:S$"ªåå{oõó¬JO=kçLBaù-1f¶oß~èÐ!ý9ÑhTÿÑø+ããh4ÚÑÑaú+œgÀœ:CgŸôçÃW~¿¯Sßã¿^9¥ãN¥ zRÔ(zœÊ»XÖèݰ:°¢axÃê@þ¿ ÃzBŠF£o:󯱸Ûï'ôé`o¿ŸxãXü­CgŒï¢û“w{hnk³HD ÉǷ4üÓWÃ÷¬®]®6z/ܳ:xÏê`s£PÑ¿ÅÿŒÉ¤ù~Ÿôfß<–Ðÿ{÷LÊ8·\Õˆ5¤²Ú×vw­(0–‘ôzßë8ùû–¨‘ú‹Âü‹Âü^aÁ`ms'?ï¬wÉǾæß GÒ¡Gv>.Þöení“{Sv  Úí:::ܹ¤ÄqˆL î Žé>ÆS쀵Y¨XW®ÈXíÉl|;vú±«ÀNï1EÆ~éâüºg«ý/õâ’Dä÷±É¢EYãö‹7Ô|Üsu¸º¡ÖóA§ÉíÚ 7Wò{iqì8{wäß¾W}Èò³µAÎX‹B?IåÒº ÝnÑ¢EN7Á¥™Üœ²Ì0*`³P±®\‘·>£eÛª^ãÏæäó‚ÈŒ[ºØ'0iI=prœ= õâ’­Íâ¦Ûÿ~åJAKŒYœˆ¢IõÔ…Œ¾+um€»ûÖà[ÇãúVY£ ó>¿ú„áÑ8{w¼»¡˜<£óýW´y’©Ã0LcªÂTe•(õ39“˜§–o¼±^áp\ ®Ý#6ÎᣉkGj=±¤’1»Eîºt­ 8¿´¤³Oú¸7«OϾ¾I|÷£”áäâýÔÆ½Ö4×OR¹ô„ 0óMbò¹ñ1­^@c+Hk8M»VRɪ¸dÁŠä‚–L®ÞbéÚ‚S„.h˜¤‚íÊ×+¨[ð±_¼¡&ì¿6ÙIVèÈ©TÚpoO)‘wÓR±ã¼yqÉüf,©”hIAß¾¡åJlYIÀ Ã?Æ îä¸sG7@dJ@p¬ÌÎÈlf:LnŒŒiݪOz²Æ§º2Nö &ÑËEqÉ7ŽÅßû8­Wý3mIÁîß§º2¦ xy“08,ë¦deZæ·tü¢  B&:mgâô;íÉWÿ÷¥M§…Ûo‰63A4L’iQ©씚°Z\¢¸äD›A®Ṳ̀B€` ;¥&¬V7=ø•Hy‡c+±Ó™K¸h',0eÜàŒ™+ˆŒcdòɵà K‡ó÷¦ÃÓô-¨ÊتÎ>ÉtDZ…°¦·Œ¼b À=l..{ivv«4Œ@õädÍX¯°e‰x¦'#+š>ˆ«Ï¨šÐꦉ²³ãØô… …Îöeõ7L·fœè& “3‰y[Ó°ÛE£Ñp8ìt+Ü‘)Á±‚ÈX)ˆÌ¸wÏì{ÓêpËÈ+Æ€­¸³¬ 2% 8V+ˆŒ•麴}HÀàB•KOX†à$` »ö °‚È”€àXAd¬ 2Õç–‘WŒ€ a `FAp°Ûutt8Ý—BdJ@p¬ 2V™êCv»E‹9Ý—BdJ@p¬ 2V™êsËÔ'LÂÂ$,€ ÀHÀn‡ÕñV™+ˆŒD¦úÜ2òŠ1`p!ŒÌ(HÀ@v; ÌXAdJ@p¬ 2V™êsËÈ+Æ€À…0 0£ 8 Øí¢Ñ¨ÓMp)D¦Ç "c‘©>$`·ëîîvº .…È”€àXAd¬ 2Õç–©O˜„.„IX3 0€€Ý«ã­ 2% 8V+ˆLõ¹eäcÀàBž½¶oßît\ ‘)Á±‚ÈXAdªÏ-÷¸¶‚ÈXAdJ@p¬ 2V+Ó츻»{óæÍ¡P( mÞ¼¹§§§¯0}•?'‰uëÖ­Zµª«««««kÕªUëׯO¥Re!€é«üwÖO?ýôñãÇÿð‡?èG¾óï¬Y³fÛ¶m¥ÚÞ ˆŒD¦Ç "c‘±2º _}õÕ¶¶6ã‘¶¶¶½{÷–ý…¦¯ò'àS§Nµ¶¶Ü|óͧOŸ.û L_忳!™Lò<¯Éår@ ›Í–jÔ·eQ¡.hO%N: {€Y¥ü]еµµÃÃÃÆ#CCCuuue!€é«ü ¸¥¥¥½½Ýxäƒ>X¹reÙ_`ú*¾ÿþûwïÞm<²{÷î7–ý…¦¯òOŠÇã­­­?üð#ûìöíÛŸþy§UU“ˆÀ,¿f¶mÛvË-·¼þúë‰DâÃ?üÉO~òä“O>ñÄå9»æ;wîܲe‹ñÈ–-[žyæ§Ú㈉Á%;7@(4{A@ ~ü㫪ªÿØÞÞÞÜÜì`{ªo¢À5SììÙ³‘H¤,§rÅ𫯾ÚÖÖf<ÒÖÖ¶wï^§Úã Ò~ùË_;Q—-[6ÛF»©ãyžã¸²œÊ øÔ©S­­­Æ#7ß|óéÓ§j#&„ùóçó<¿`Á‚-[¶œ9s¦Â „™×ŒÑk¯½vã7:Ý 'Ù‰®]4Í¢çK •AYˆçyI’ŒG$IÁ©ö8b¢AظqãÁƒÓétOOÏÓO?ÝÐÐpòäÉÊ7Ó\r;ËNpÍ ]ýõtº!ޱ\3yƤy÷Ýw˲\žÓ–å,S„¬M9»víºçž{*Юi X›Tfó5300pÇw8pÀé†8fr˜Í׌¦i—.]zñÅö³Ÿ•å„®øäjhh0éïïŸ?¾Síqă000à÷û+Юi X›Tfí5ÓÛÛÛÚÚú׿þÕé†8fÒ˜µ×ŒÑšššÊr*WŒ·´´´··|ðÁ+W®tª=Ž˜b´Ù·<¦hv^3}}}_ÿú×wîܹ~ýz§Û〈D`v^3V¯^=88X–S¹"ßÿý»wï6Ù½{÷Æj#¦„—^zéöÛo¯@»`Æš…×Ìààà½÷Þû‹_übݺuN·ÅSŒÀ,¼fŠ9rdÅŠå9WY(‹-]ºtÇŽÃÃÃÃÃÃO>ùdsss"‘pº]U5nŒ¬uëÖ½üòËýýý’$;wnÇŽsæÌ9~ü¸ wžK.cg™×L[n¹åü£Ó­pÒ¸À5S`Æ {öì¹té’$I½½½¿ùÍo.\¸oß¾²œÜ-Ÿ\çÏŸß´iS0 ƒ›6mºpá‚Ó-r@é ÿaìß¿ÿ¨¯¯÷x< .ܺuë™3gªÞ^‡¹ö e5•®™¦áqº]Õ3npÍ8pàÀ7¿ùÍ|,X°yóæ£G–ë䌆>}€ªsÅ0Àlƒ à$` 8 ÀHÀ@p0€€€ à$` 8 ÀHÀ@p0À´Ä0ŒÓM€)A˜nf$`€iIÓ4§›S‚ àvùÛ_æ3ƃù©Tê»ßýn]]Ýœ9s{ì1MÓÒéô#Sü„ï}ï{·Ýv[ggçÑ£G<ø«_ýêÑG]³fͧŸ~zìØ±cÇŽíÚµ+ÿÌ?þø[ßúÖøÃÁÁÁ—^ziÇŽï¼óN5ß ètd¸ÃþSÕ0 óÌ3ÏlÛ¶-üÈ‘#6lxê©§ô#‡þþ÷¿òäI"jkkkmmýÑ~”ÿÕÞ½{Ÿ{üå/Õ{'ð$`€i tîéé¹îºëòÇc±X8.8ÒÔÔF‰hÙ²e¯½öÚòåËó¿¹é¦›z{{«÷Nà3HÀÓ@鬪ªqš´é‘ü“½^¯$IÆó°,«(Je[f0 0í/R²Z¶ …úúú4d_§ L¢(ܹNÎ]wݵwïÞ©Ÿ¦ `hnnÞ·oßÔïVŸx≟ÿüç¿ûÝ†’Éäþýûï»ï¾²´& cÀÓÀ믿¾mÛ¶sçÎ)Š¢ý<Е>òþûï?þøã‡’eyíÚµ?ýéOׯ__­÷× 8]Ð@p0€€€ à$`ü?æž½ aaÏIEND®B`‚gsl-2.7.1/doc/images/fit-wlinear2.png0000644016036000116100000003524413510457027014265 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœíÝy@TõþÿñƒÊ¢„ij¦Âs×ÔpÃ%•®à–i.€’;j~ÕÊíºÄLàV¡âš^Á- K1•4@Á-Ì.¨(.i.Aç÷÷Çå¢ÁçÌ9gæùø+NÌ9o=μ泜ÏÇB¯× À¸ªÈ]æˆ@02 € € `d@ ÀÈ€@02 € € ª‰~F ‹çZZZ>yòDôk Râðóû®^½:))Iô  ^RïüìÙ³¦M›~ýõ×...’^‘| xïÞ½õë×'}(Nò^½zõÌ™3¥¾ *£—ÒÙ³gòóóËüÍjÕÄ ò$ŠHic/((hÚ´i†„kAA^âÑhTž……ä“ î”*˜ámÒh4Z­¶èG???F#_9yá£=âœYºÛçÎfÍš¥¥¥½òÊ+e×a~ÿÕˆÛ¤Ü)Uà6©‚t·IÂ1àààà÷ßßôÀÜHÀùùù7ndúàyÊïy6©ZÖÛ¶m;pà€¡uУÜ&µàN©‚9ß&ýÙÕ×D󀿢”ï *ú6dθMjÁRs¾M*ú³«¯ “äçç'w 0wJ¸MfN)ßATômPIF-󰤋'¥Ä P º 0)02 € € `d@ `ljyXRJyú–ç€À|¨è3Ÿç€0)0@Å4E1*êÜVJ'€Šº#•$Ñg¾§¥ `:Ø J €Æ'QG±ºr])¿tAˆ.hL  € `d@ ÀcSÑzUÒ!€ƦÕj¥8­ºr])Oßò0˜–¢hðW$mÀãÑétNNN‚ 899ét:¹Ë)ͳgÏ>üðCéÎ_MºSP\DD„¯¯oNNŽ ¾¾¾^^^r×õOŸ>4iÒÅ‹¥»-`€‘,^¼¸0} åä䈻}‚Xg{òäɨQ£þøãýû÷‹rÂRÊÔ'&a€É³±±ÉËË+~ÄÚÚ:77W®z^èÑ£GÆ ³²²Ú¹s§µµ5“°ªçààP∽½½,•ü•ìììAƒÕ©Sg÷îÝÖÖÖ’^‹‰V«µµµ-úÑÖÖÖßß_ÆzJ¸{÷nïÞ½[´hV­šäs¤`€‘xyy;::ZZZ:::{zzÊ]Ôܺu«OŸ>}ûö]·n………®¨”‘WÆ€r¹zõª››ÛСC—/_^â1 €$~ÿý÷=zL›6íùô• 06å,Ú|þüùwÞyÇÏÏoÖ¬YF¾4 06…lÆpâĉ>}ú¬\¹rüøñRÔS:¥Œ¼2 æC ›1>|ØÓÓóŸÿü§‡‡‡Xç,ZÀ³³wïÞQ£F…‡‡—ž¾’"€æ%""b„ ÑÑÑ}ûö•± 6c›¸K@—˦M›<ئM¹j(DŒM¢YÐeæúŠ+‚ƒƒ9Ò¤I) (¥L}b@:z½~îܹû÷ï?pà@ƒ ¡tñD `âž>}:eÊ”³gÏÆÆÆÖ­[Wîrþƒ˜²¼¼¼Ñ£Gß¿ÿàÁƒvvvr—ó_Ì‚˜¬Âí---÷íÛ§¨ô`€©ºwïž››[Ó¦MwìØaii)w9%IÀÏž=[»vm«V­lllZ·nýÍ7ßHqþJFFF×®]ÝÝÝׯ__¥Š[›’Ô4mÚ´³gÏ~ÿý÷<ؾ}ûöíÛ¥¸ @¥¤ÞŒá·ß~ëÕ«—¯¯¯rv}xžø³«cccW®\]¾:x ̆èŸù:nÑ¢E™™™ãÇß°aòeËÆŽ[ù3KOâŸ×ÓÓsìØ±ýúõ+_0˜ q?ó#""&M𔓓Stò9sæ¬X±B”“«i3†cÇŽegg÷êÕ«Fvvvnnnñññ¢_€B‹/.J_Aôzý·ß~+c=?€ÿøã__ß±cÇ^¹råÒ¥K^^^ï¾ûn\\\™/´x%wß”àÚµk%Ždff–÷$æ…1$R/ ~ËÚÊÊ*$$¤xÏûÖ­[ÃÂÂbccK«ƒ.h0FÄöUÓ¦MÓÓÓ‹iÒ¤I‰#¦¦1à œ;w®øZ_þù§££cñþÔAÊO¯×0 &&æÙ³g…Glmm7oÞìéé)ÊùÕ4ܪU+ÑÏ Àóž>>EGöîÝëââ"ú…æ,;;ûý÷߯^½ú¾}ûlll&Nœ(wEå#~O˜0¡oß¾‚ ôïß_„½{÷Ι3'22Rô ÌÖíÛ·û÷ïïââ²nݺªU«Ê]NEˆßmcc³k×®¼ñÆööö!!!ß|óMïÞ½E¿À<]ºt©{÷îܸq£JÓWbVÅ0 `ˆ_ýuÀ€óçÏŸ:uª.']<±0@5~þùç‘#G®]»vĈr×RYJÜ `Ú*öðwß}çééié+ÀãÓjµå}Éúõëÿïÿþoß¾}={öü«ßQ×â‰Jye ÌG¹>óõz½V«Ý±cÇþýûÅ:­˜£§OŸN›6íÔ©SÇŽ«W¯žÜ刉(T^^ž··wVVÖ¡C‡ìììä.GdŒJ*±5Xc«E§¡ÌÓÞ¿ßÍÍ­zõê?þø£é¥¯À0 tâî\d 7nxxx¼ýöÛ«V­ªRÅж¢¥ªi7¤Š!€…RSSû÷ïÿÑGÍš5KîZ˜„0Ç6lØ—_~©Š*ƒ1`€RìÙ³gðàÁÛ¶m3ùôhbýúõË–-‹‰‰iß¾½Üµ YáR:îÈ‘#Mš4‘»#!€rzòäɤI“ÒÓÓ?^§N¹Ë1 ›ìììáÃ‡ÛØØüôÓO5jÔ»£b 4Ò=|ãÆ=z¼ñÆ»wï%}ÙŒ¡"x”I¢Ïç_ýuÀ€ãÆ15ÙŒ€Ò:tÈËË+((hÔ¨Qr×"º FõÏþsôèÑß~û­9§¯@ `L+V¬ ‰mÞ¼¹ÜµÈŒ”ÆÏÏO”óLŸ>=%%%!!¡~ýú¢œ³±J5¥L}b˜°ììì‘#GZZZ†‡‡«ëq#éâ‰1`€´nÞ¼Ù«W¯† îÚµK]é+) ¡³gÏvéÒeÔ¨Q›7o®VqÏÿâï •Ÿ~úiôèÑ«V­òòò’»Å¡ Ä–-[ÆŒ³k×.Ò÷…`0FcQŒº–N4œ^¯×h4+V¬8zôh=ä.G¡”2÷˜YÐÌ©~îåææŽ7.33sÏž=uëÖ•»œÊb4@åj¦ß¾}ûí·ß¶´´<|ø°ñÓW]= Jùþeªßà¯h4U†áŸÏéééýû÷÷ððX½zµ………Ô…=O]›1(%ö`P&?Ÿ† ¦Õj'Ožl„ª^H]ÌcH€ÊŠŒŒüðÃCCCÝÝÝå®E5`@¥8pàÍ7ß”»5a 4¥ìpðäÉ“ &„……8qB®ô-þd— ªyXJye Ôåþýûï¿ÿþË/¿fkk+w9Rá1$€‚\ºtÉÕÕµuëÖ»ví2áô• x1Nçäädeeåää¤Ó銎'$$tïÞ}úôéAAAUª#Ä_ÈCᣕ¾¾¾ùùù¾¾¾ááá‚ „…… :444tÚ´irרnJye €¹Qøçž³³óÅ‹K9rä×_Ý¢E ¹ 32âS£ðÏ=›¼¼¼âGªT©Ò¥K—ï¾ûîÕW_•«*ã#€ÀÔ(üs¯iÓ¦éééżôÒKþù§\%É‚YУÒjµÅ§7[YY…„„˜[úJŠy”²À…xyyö6¿úê«[·nõôô”»(“ÂR” …Ï‚áúõëÖÖÖ‚ ܺuKîZL (éÉ“'¾¾¾§NŠ‹‹kܸ±Üå˜&ð?îÝ»7lذW^y%!!¡Fr—c²üWZZZ·nÝÚ¶mY˜¾ «V/IfWnIQ\™WQøt|0ðññùüóÏ}||ä®E)¤‹'©º ISP—uëÖ-]ºt×®]Ý»w—»³À0˜»‚‚‚?þ8666>>ÞÉÉIîrÌcÀ …<†tÿþ}ww÷´´´¸¸8Òט¤ à×^{ÍÒÒ²AƒÞÞÞ.\è* F…ÛüiµÚÛü_zzz·nÝZµjµwïÞ—_~YÆJÌ$|øðºuëŽ=š••U¿~ý>}ú,\¸°Y³feÔÁ0HãéÓ§ .ܽ{wTTTË–-Ëûr3ÿ|VÓR”}úôéÓ§è§TÀ½{÷FU¥J•ÄÄÄÚµkWà lÆ ¥|¯1óoX …ýë_ï¾ûnÏž=ׯ__­kW„ºgAŒïûï¿ïÑ£ÇÂ… ƒƒƒI_â–€©Ñëõþþþ›7oŽŽŽîÔ©“ÜåàÅh€<$ZÝ";;{øðáû÷ïOLL$}•L)#¯Œ07R|î]¼xqÈ!o¾ùfHHHõêÕÅ=¹yb P†#GŽôèÑcôèÑaaa¤¯ò1 ¦ 000000""¢W¯^r׃ÐuËÍÍ;v¬N§KHH"}Íy'IÀ Q¸ÈÌÌìÑ£GAAA\\œ££cåOø<6cˆR¦>1 ÊëÈ‘#^^^3f̘7ožtW1óÏg5-E š^¯ÿòË/W¯^ѳgO¹ËAEÀ 2ÙÙÙ&LÈÈÈ8~üøó» C-5IOOïÖ­›µµõÏ?ÿ,]új4‹ÿO`–4”Ò³oæc `ˆ~øa„ Ÿ}öÙäÉ“å®Å\0 fM¯×þùç6lسgO—.]ä."  €êï/µ°°0½þÒû÷ï80&&&))éùô5ù?¾©RJÇ/]ÐD¡¢FcHXž={vèС}ûö]·n¥¥¥ôuáH÷/J)ÿRUôž d*ú01¤Ô¯¿þzæÌ™kÖ¬9r¤qªB lÆæ¥  `þüù‹/>xð áéKÿ³Š(嫢о´P2}˜”Rê­[·FŽiggV«V-QÎ‰Š¡ eeyÅÅŽõÖ[½{÷ŽŠŠ*WúB]`&Eá}°e.p2bĈ͛7ûùùU©ÂG´)SJgÝ&ÌÜÇ'Nœ˜žž¾k×.''§Š„ÏRÑÑ ¦ìÂ… ]ºt±¶¶Ž‹‹«pú &Ño>”ò]‰omÌVxxøÌ™3W¬X1~üx¹kAI,E &(//oîܹû÷ï?|øp›6mä.FE€<®]»6|øðúõëŸ8q‚ÙÎfˆ1`Alllç· òÝwß‘¾æ‰`Rþ’ Ïž=Óh4>>>ß|óͼyó ŸG‚RÊÔ'&a…Â?LþüóOooï‚‚‚ˆˆˆúõëË]ÊÆcH zIII;wnÑ¢ELL é $§×냂‚ú÷ï$Ý®‚ÊïG¥ôÕ(¼×€Z(ðÃ$++kܸqׯ_ß¹sgãÆ%½–ÿøjG4DiKA}úÄÄÄ(0}…bA ‚`üÇ Q1¶;õz½»»ûرc½¼¼Ê¼ -` ôøñãY³fÅÆÆFDDtìØQîrÊfäÇ Í*[À«V­ª_¿>ߨԹsç\\\rss“““U‘¾‚4ÃêˆT“°NŸ>½yóæÄÄD‰Î’ ;wî_|1f̹ki’$€?~ìãã³mÛ6;;;)ÎÒÉÊÊòõõMOOÿå—_š6m*w90Y’tAüñÇÇïÒ¥K¹^eñ"t§&Loð_~ù¥mÛ¶ ¤¯Y)±DLé®(þØrTTT```lllÕªUÿs F°™„˜!)Þøž…Tø˜ï–-[¶nÝêîî.nUP/éâIüó:;;:t¨qãÆÿ½ àE¤xãWìœW®\=z´ÍöíÛ6l(nIP55Í‚¾xñ¢££c‰ö»Ô y¨°ÈÈH—¾}ûÆÄľ0ñ'a=ÿMÖ-ezøðáìÙ³=Ó¾}{¹ËÏ«»!¼;ö?~¼0t“““M#}ãn‡ŒJ"€ÈF¬¶Zñù«†œöéÓ§+V¬6lX```ppp5D)(¥tÓM À8®\¹âããcii¹}ûöFÉ]ŽÈø,š&a@™t:“““•••“““N§3Úu###»téÒ¿ÿ˜^úB]Ø€±EDDøúúî—‘‘áëëkaaáåå%éEïß¿?uêÔÔÔÔ˜˜˜¶mÛJz-É;¬ŽrQJgÝ&€ùpvv¾xñb‰#iiiÒ]ñðáÃãÆsww_µj#¾(5-ÄQ10`>lllòòòб¶¶ÎÍÍ•âZyyy~~~¡¡¡›7o0`€—€ic €éppp(qÄÞÞ^Š ¥¦¦véÒ%--íܹs¤/”†`lZ­ÖÖÖ¶èG[[[q/ñìÙ³/¿ü²wïÞ3gÎܽ{w:uÄ=?PyLÂ`l^^^z½~Ñ¢EŽŽŽžžž"ž?##cܸqOž™={vÑžl@…IO´€˜ˆ[·nMž<9##ã§Ÿ~j×®Üåe` €)عsg»víÞ|óÍ“'Ošsú²ƒŠ(¥ã—.hÀ ‰²uOVVÖܹs:´}ûvWWW1êR1>KEÇcHLPåÓ÷ÀmÚ´áÌ™3¤/Ô…1`ª”={ö옘˜íÛ·÷îÝ[îr€r£ @}Ž9Ò®]»üüü3gÎH—¾Åw9´°°`xâRÊhã ñøñc­V¶aÆwß}WîrA£ÑhµÚ¢ýüüø® "Ö‚áøñãcÇŽmÛ¶íÆYÜ ÆÁsÀÌZnn®ŸŸ_XXØúõëß{ï=¹ËD@Pº“'O~ðÁ-[¶¨_¿þæÍ›5jdÌÂJàÊœ±3RPPзoß3füøãò¦/ Æ€(˹sçÆW¯^½ääd{{{¹Ë¤B €RŽøöíÛwòäÉ?þø#é ÓF0ªâËK Åæ7¥¦¦víÚ566699yòäÉ…ÿW!üüüä.&H)3 ˜ã˜­üüü+V¬Y³fÙ²eãÇWTô,ÄÀ4>}züøñ 4HII¡Ïf….hò(løöë×oÊ”)?üðé sC € ¾ 6LIIá)#˜'ZÀŒêñãÇsçÎõðð˜;wîÞ½{I_˜-À_}Cܸ¸¸:dddœ={vÔ¨QbÔ¨•Ræ3 0mýÒ¥Kááá®®®r—#2­V;yò䜜œÂmmmýýýå- ¦„0ƒ”Ø”¾   ((è­·ÞêСCrr²é¥¯ ^^^ÁÁÁŽŽŽ–––ŽŽŽÁÁÁžžžrÓ¡”‘WÆ€III™2eJ56mÚÔ¼ys¹Ë$Ä0EÈÊÊš>}úÀgÍšõóÏ?“¾@…À µsçÎV­Zåç秦¦zyyÉ] n0€2èt:‡ªU«Ž3fâĉÁÁÁµk×–»(£b3HA)#¯ŒÊ´cÇŽ &3fÌó=™™™²”˜ñxÆŒíÛ·ß¿vvö¯¿þ:wîÜ€€€OP¬gÏžn#X«V­sçÎ5nܸÄ/° cô«\¼xñ­·Þºÿ~iuÐÃ(À‰'¦M›V«V­uëÖµhÑB„ððð«AmÞ¼ÙÜÖ£Ðh4ÌÃ2[jê‚~ž¥¥eÕªUp!v÷îÝI“& :ô“O>9tèPaú ÅVƒÁlWƒ"}!i8++ëèÑ£#GŽœ:uª¤Paz½>44´U«VUªT9þüó3œ½½½/_¾,ÂåË—½½½å¨0A’Í®¶°(úïwÞygß¾}¥7‚é‚dqúôéiÓ¦åççoذÁÅÅ¥”ßäM ó¤¾.h½^¯×ëoݺžššºdÉ’2_bñ"ôü¹wïÞ‡~èáá1iÒ¤ÄÄÄÒÓWxn3ÀÄh4šÆtW4ÆWÚØØØ>øàêÕ«¥ÕÁ—kÀXôz}XXؼyóÞyç•+WÖ­[WîŠå’.žŒ±ð[o½uûöm#\@™RRR¦OŸ^PPÕ©S'¹ËÌ—1fA'$$°e »;wîLž>>’Žl™&£@ âwmÇÆÆ®[·îÈ‘#YYYõêÕëÖ­Ûœ9s:wî\FŒÒ8rä9 _«MIDATÈŒ3êÔ©³fÍšÖ­[Ë]Ž*ñeÎØŒ@¹effΙ3çĉC‡•»ãÊœ©ï1$2zôè‘F£éСC‹-Ο?Oú D¦&::ºU«VÉÉÉIII~~~Õ«Wå´Œƒâ"€Ó‘œœÜ£GF]¸€³X´Z­ˆgS…¢•A`] ˆN) ±•qãÆ F#KÿòË/üqÕªU]]]_`Îè‚ä'búذ¾zõª··÷¤I“H_À”(¥ÝI æé¯þåß¿ßßß?,,ìã?þè£lllŒ_0`>òòò›7oþèÑ£ÔÔÔüã¤/`’˜B (…^¯ßµk×üùó_ýõƒ¶iÓFîŠHˆääççWø111óçÏ·µµ ëÖ­›¼U0¥Œ¼2 ³•’’2oÞ¼k×®-[¶lÈ!r—à0 ˜ ÌÌL__ßþýû8ðܹs¤/`V`ÀP">†tïÞ½ùóç·oß¾víÚiii3gÎdM+ÀÜÀ@Ùt:“““V«urrÒét•9UNNÎÒ¥K›7ož}þüùåË—ÛÙÙ‰U'áK7P†ˆˆ__ßœœA222|}}-,,¼¼¼Ê{žüüümÛ¶}öÙgݺu‹oÚ´©ÅP ¥L}bËÙÙùâÅ‹%ޤ¥¥~†Âç‹.\ظqãåË—wìØQìH…IX€l®]»VâHff¦á/‰‰qqqùâ‹/6mÚôÓO?I—¾ Ù7€`  %ŽØÛÛòÂ'NôíÛwÖ¬YóæÍ;qâDŸ>}ŠÿßÂqåjÕªU~\¹F£ÑC GeÐjµ¶¶¶E?ÚÚÚúûû—þ’óçÏ1bĈ#GŽ|¸bÅŠ-Z\»v-11qõêÕ¯¾úªá/÷òò vtt´´´ttt öôô±¼¢M–(–Rв‚Zdgg¯_¿>00ÐÝÝýÓO?uvv–»"’.žXŠ0Ô‚ lmm׬YãááqìØ±&MšÈ]#€²eggõÕWË–->|øÑ£G›5k&wET1` 4|øÉ“'-Z´˜?þ!CÊ®ƒ0**==}ÕªU_ýõûï¿ÿÉ'Ÿ¨}1 Š¢¦p¯^½þüóÏ={öܼysíÚµfË–-¢_!%%ÅÇǧsçÎÕªU;wî\pp0é @-ÄàÙ³g:tÈÕÕµF...¡¡¡Ë—/ý*0gÏž=ûþûï{öì9|øðÎ;gff5lØP‡€哼ã÷Ñ£Gµk×ÎËË+£º ÍU¹–ŒÈËË ´³³›3gÎСC«V­ZùÓšÞP€XT¼ÇîÝ»—.]šœœ\F|^˜+oý½{÷6mÚ´nݺŽ;Ξ=»W¯^¢œÖT™ù‘𯀋»wïÞÂ… W¯^mÈ/[¼ˆ97bP(==}úôéM›6½xñâÁƒ£££ËL_(¯f‘îŠð­[·Þ{ï½7öèÑÃß׿,;ÑŸ2\rrr᫪U«ž9s櫯¾jÙ²e™¯ÒétNNN‚ 899ét:éË` 4Í cHÂK¾ðz•wíÚµvíÚ>>·oß¶´´,:(VRzyy;::ZZZ:::{zzVþ´ :vC‚A Ÿí©Zµj…ŸíÉËË íÔ©“§§gÛ¶m¯^½ºmÛ6)’ÒÛÛûòåËOž<¹|ù²···(çÑ)eê“°”,""bÒ¤I999…?ÚÚÚ†„„xyyøò«W¯nÚ´iëÖ­íÛ·Ÿ>}º‡‡G•*|ó *^ŠÒ@°’=?cÙÙÙ9--­ôW={öìÀ7nŒ÷ññ™:ujÓ¦M¥,ħ֥(ažŸ±œ™™YÊïÿûßÿ jÚ´é¢E‹ påÊ••+WþUúJ´´k¨P8¥´;i+YÓ¦MK<ÛÓ¤I“G %$$lܸñ‡~2dÈÔ©S]\\Ê<¹D·žQDA r*óÙž‡†„„´oß~ìØ±­[·NKKÛºu«!é fKü…8`z¼¼¼ôzý¢E‹®_¿Þ¨Q£€€€¢Ë'OžÜ²eKdd¤››ÛÊ•+ß~ûmI7“¡”n:: E¡Ñh´ZmÑ~~~ …feeétº-[¶deeM˜0aüøñ¯½öZÅNE4%£ )¾– ÁD$F?nÜ8''§£G~þùçiii ,¨@úír(‚X»ß9Q`eSJ+öŠèÄý+½{÷nXXØG}Ô¼yó‰'~ðÁuëÖëä XjÚŒ¦D¯×ÇÆÆnÙ²eß¾}ƒ á·ß~“»(0JiwÒ]%ÿJ/_¾º}ûöš5kNœ8qôèѵjÕâ607´€Qn~~~xUnnntttHHHJJÊûï¿Ú½{wÑk0 K6Åg ‰5 ©PáÆ K—.5|ã½^7a„† †††N™2åæÍ›ÁÁÁÝ»wgfHA)=ŠfÞ·)⿼'ܸq#,,쫯¾ªZµêÈ‘#Çÿ·¿ýM”JÀ°ƒ‰ñoàÆ =úöÛoCCCSRRFŒ1vìØN:‰R˜Æ€M\ÅÆk_¨ôž={väÈ‘ÐÐШ¨(WW׉'<ØÆÆF¬« ¤”v§™·€EôW'œ?^§ÓíØ±£N:>>>žžžõë×—«HP VÂ2Y…¦¬¬¬ Ÿ0Uº'Ô¨Q£k×®;vtwwúôé?ü’’2kÖ,ÒäE´œ"""|}} 'LeddøúúZXX”2aÊ…',X°àúõëVVVUªT±²² ìÙ³g•*|ߥPJǯyvA8aÊp?ŽŽŽŽˆˆˆmР¿¿ÿÀ†c´i²±±ÉËË+~ÄÚÚ:77·¼çÉÏÏÿé§Ÿ"""öîÝÛ¹sgOOÏ!C†ÔªUË ÿJ@\Ì‚6M%&LÙÛÛþr½^¾k×®¦M›zyy¾úê«b— ,'­V;yòäâ‹føûûò¤¤¤ÈÈÈo¾ùæå—_öôôLLLttt”°P€Ø`9N˜Z´hQff¦ƒƒC@@€§§g)¿_˜»‘‘‘Õ«W>|ø?üкuk£U Ób "ݺÍÞÞÞ—/_~úôéåË—½½½Ÿÿ½^Ÿ˜˜8gÎ''§>ø zõêÑÑÑçÏŸ×jµÏ§/ë6€Z(e꓊&aIQê ÏYÔÞµ±±>|øˆ#h1 KAD\6òyÏž=;~üøîÝ»¿ýöÛÂÜýþûïÛ´i#ݲPJ»SE-`)XXX:tèÛo¿ýî»ïêÔ©3lذaÆÑÞÙ±¥"ˆ»ld‰ñÚ1cÆØÛÛÿüóÏgÏžõóó#}À´Ñm(—¼qãFtttbbbÍš5»víúî»ï4¨\OÔN)¿Êï‚®ü²‘çÎûþû¢.]ºäáá1xð`www;;;±+ˆ†¥(åW±e#Ÿ>}zìØ±½{÷îÙ³'//ïïÿûÀÝÝÝ---¥, fA˯\ËF>zôèСC{÷ªS§ÎðáÃu:]‡ ‡{PJ»Sù-àðððËFnÞ¼¹ÄÂU¿ÿþû?þ¸oß¾'NtïÞ}ðàÁƒ jذ¡õD@´"ètºâËF.\õèÑ£Ÿþ¹0wóóó=<<<<<ÜÜÜ^zé%¹ëT¬ …¥¦¦¦ÆÄÄìß¿ÿøñã;v,Ì]VÌð"dee&&ÆÍÍíäÉ“çÏŸ·³³ëׯ_õêÕÙæ ¥4æäjVfggÇÅÅÅÆÆÆÆÆ^¸p¡sçÎ}úôyçw:tèP¥ ßNÀÜ1 ZL?NNNŽ?xðà±cÇš7oîæææææÖ½{wãÔP¸² Μ9sðàÁ¡ëêêZ½zué® P5¸"ž>>ÅøøøDEE‰~!ÔKüNMMm×®]ñ#mÛ¶=þ¼è@½ÄoY[YYåääXZZÉÏÏ饗òòòJ«ÃÂBÜ2…D]ÐÕ¤8i00+âwA×®]ûÞ½{Åܽ{÷•W^ýB¨—øܪU«3gÎ?röìÙ–-[Š~!ÔKü8p`hhhñ#¡¡¡ƒýB¨—ø“°>|Ø®]»‰'N:U„ 6lÛ¶íÌ™3¶¶¶â^õ¿lggwøðᤤ¤Æ7nÜøäÉ“‡"}(ŽuXÛ ÀÈ€@02 €RøêիÆ «Y³fÍš5‡ –™™)wEæ®\wÄâ9F«/”’’2mÚ´Zµjq/” \·ƒw“¢=ztäÈ‘õêÕ{ùå—»té²gÏO®ˆÎÎÎîÓ§O‡®\¹råÊ•:ôíÛ÷Ñ£Gr×e¾*pGôÿËh¥â…ÆŒóꫯÆÇÇË]¡ü·ƒw“rôêÕëÏ?ÿܳgÏÍ›7×®]«Ñh¶lÙ"ÖɱǪU«’““wìØQtdôèÑ:uš1c†ŒU™³òÞ EüCÂó¸5ŠbÈíà–)Êœ9s>ÿüó¢~ˆ³gÏ:4==]”“+¢íããSüˆOTT”\õ€;‚ |ñÅÅGœE!UD§¦¦¶k×®ø‘¶mÛž?^®zP;òÚk¯YZZ6hÐÀÛÛûÂ… ˜2ÞMеoß¾Ö­[‹u6Eðýû÷_yå•âGêÔ©sïÞ=¹êAyïÈàÁƒ###>|˜””äââÒ«W¯Ó§OK_&`‚x7)Ö½{÷.\¸zõj±N¨ˆÁ++«œœKKË¢#ùùù/½ôR^^žŒU™³JÞ‘7FEEíß¿_²a(¥·ƒw“BܺukĈ¦wïÞbS-àÚµk—h]ݽ{·D ÆTÉ;2tèи¸8 êÌï&%¸~ýz¿~ý>ýôSÓWPH·jÕêÌ™3Åœ={¶eË–rÕƒJÞš\€Xx7ÉîÆ+W®ìÛ·¯¸gVD8044´ø‘ÐÐÐÁƒËU*yGvîÜéêê*A]€ÙáÝ$¯Û·o»»»/_¾¼OŸ>âŸ]¯6`¨(8žø”£Ïàý¥!Þ`Š/Eè¡=kÃRˇÐÝ"Âh‘VSÍHÚ•Æú˜½µåËʳš‡w>5»Š²=“†=„B!„B!„B!„B!„B!„B!„B!„Z¤×^„ ´k» Š<šAA>äxΰ§œ SÏqc² #sFÙ)?vùñ„S~Ìß<åo&'ÖC–íÂ@ŸïÜìpžçå‹r9£zX0P¡ÜÃÚB}Lй2ÜQD!„B!\ØB¡•ƒpaC!„VR^Ø(ÔÂF¥?©1$•#PyÕÊå(D  ÛfmÂi_ "-?%jPEF SµªÑ6èO "m³¨ÚÓͨ*£ ­š3)ÊÙíÐÄU"bδB4}yÚ )DD"òT ê Rh#ªù ½F a°Gµ•3ª ¶œýµ‘3L¡¨G@ j|_D‚DÍïÔ”!ñ¾j# ˆh@vDµ"²I-D4 dÇFí*hÚÏ–ØRÙ±%AUD”M× Š”›ÚOnC¤Å늽öÁ–¡<#…ŽÔ»ß.S?å)ïØx)»4 G}ÍigVòR„‚ÄÑÙ¶j(\€¹¶VÎ0†zR†)4”3 ¡é70P´i¸ùûi¹hæîz¼t›þˆÁ@É ÓYØj!>ÃX6•¿c«€át¯Zœ}„ì åUê -Îë ;_iÓŒ©E›Ý¯ý<#™a Ÿa ÐQ©œ9$f”ΰîÐ_}©œ!”ϰå·5†ÐšË¤dõºP¾°,ñ.+C4¹|ÿ˜ë,lS«Q±½ôìt—©Qµh“!*ÊóªQ¾­P‡ø +@iyÙD3l™±øä˜56U†ŽJY½˜~÷H)cáèBÙ [ì——gèAÁWåŒe@zP¼Q^j éAkÒš]HëSvOZ³)«H ß%– Â*R;ÄgX ª ¨3¬UÔ éÌ(@ÕµBÙŠzk¡ É;¶dê’jH{ÇVS3ýëZM@Æ­ÎПPÐw@uYMÒ„¤øM¹BDP1ƒÂhÑ$)D #òCKŠÈJJœQ· ÈI"’ jÑÛê/Æõ¡Kr "FÛ”!jчnÝ…¨…jïB¼ 刈YDÎLê5ÚQý8J PŒÈ Ù°ô1„ÊÌóëbwHÊ0‡D¥ óˆ  }‹ z"gB~Ñ"@[?ª‘ÒÖÀõÚâ^v'ˆÊ¦YþHïëAJIªÛYkC RKíZÍî2")Öì«F€ ÕšÝYÕΉ*„ÿÒ!„úH |„!„Z96„Vjx„A"@PÃ=¨á=èªjËG:BËG:BËGÚSí̓ŠÈƒ Úȇêµj=¼e!„„;6„Bhå \ØB¡•ƒpaC!„VÂ… !„ ù†‚¼(§ô´XÃ# züÃýCP¿0 Áüxƒú9‡†§Œî ò@P`AÒÿ¹ãÈ:N^çqÿkqœüYÏŸý±ø–gÓ¸Æx#‡±U ÞÌܽäu9Ÿø¼œó~æ>bü?—Ù{ž&Û×ÎsÆ»eËŸê ¸ÿÊ? “ƒ¿gÞc—Û¼Ú¿ø9yFþ ñ³íí$ÞE8'uìÚWš‡ôP@Îà‘€¢Y(~ ¥…гš;m_Í3hÏŸ™û+=ä§^ÎBßk€¾ßÐÌ 3hgW@ŸB~½h†^í]fM¡«o/”´‘€¼ Šwš¡áÞïоðRh´u- øÓ¡€Ž3(ˆš¡8ƒ˜ç ˆm]‹Æf~, ’56mN’ÞH«6I{ͱS(ïþü×þiîµ—ôj_@“‰g‰6JÇQy/ùÒ™Aï.öÙSýZ|dÏçƒI:²/ó‘í<ç#;~ì÷ý­°adoœE„ϵѡ5sm}œÎµ©Õ?ãs-gsmÒ?NNª¨CB!„ô™](œ£ý½ƒ‚|(,¢(è G* !„B!„B!„B!„B!„B¨ú@”FgÄÜLIEND®B`‚gsl-2.7.1/doc/images/gaussfilt.png0000644016036000116100000040730413373111455013762 00000000000000‰PNG  IHDR°èA9ŒbKGDÿÿÿ ½§“ IDATxœìÝw”Õ7ü{«ªswõäQN ²HB „0Y‘ƒˆ$ã}ŸÝÇÏÚï»ësž]vvYã&ˆ(0F"£!#f4ÒäžÎ¡ªî}ÿ¨žššÑh4¡«««ûû9º55Ý¿ît÷¯î½¿K9ç*`w`$„ !@…BBP¡T($„ !@…BBP¡T($„ !@…BBP¡T¨ÒJ?üðÃÛo¿½ªªŠRjw,e®´Â믿¾¡¡áwÞ±;€òG9çvÇ0JK40¢¿Ca2 8_i”>öþfö>&³@9ìààr*×4NÑÉ*¦¨WT>èbUxFáâa³ cCRVå S²{—¬žròWÁ+y&¹ì‘F:T(ŠÔ=ÔÅ¢HwIÔ%># <ãqQQ „I¤®Ç`V¢331e ¥³ŒäÓ-Â9Ïä8!$«pqÆI6ßdŒéi#„dÎ9Q5žS9!$“eú‹{&—™7’7‘œÂ!œ“t.ÿÍ1fÓ»wçx Æä^Šð`‚â,%’òÝ5½s¾ÉB>›éþÃÅÕ” $!!¢±*!^-$B4$܆ MˆÇ•Ÿûã÷äp»=otõå%7%„PB½JqKT©@‰ÇE !· ÒþGóº)¥DêËf½nJ)•Dâ–(¥ÔëF. à`%šw*!”$IÓ4Kã°‘E‰[9LÕ4­4ÓZ¨då†ñË*<«ðœÂ29žÎ±lŽ+Ïæ¸>¤–ÎqEåŠÆ3Y¦hDQy&Çä–U¸ªå‡ï`0ʵºvêeÁ Æx0Æ‚1"ŒhÚh(ÍþÏŠîPºÿâ„—þÇuq߈äS&Ò¸,$dšiR¢UbwãŠrçuSI¤õ¸I$^· az=Tçô¹©>«Öë¡’H½.Áë¦^7õ¸·‹êãœc†7q(AÖmËW¢Ý}T‡ø£…„n †¬Â39–UxVÏë®g–Îñ¬Âr ÏäxVáéËé_U¸>9 Æ29Q ƒ>îᅡεß·D¹'ÛQóy[ý'wll1ܸ.:ïËÌ “á{ì\ylèˆ'tÎiè9‚ç܃–AêÙ¾ùLNáÚÀé³™×O(û­™ŸGð¸ô”’zÝ‚×O/Ý.êsS[𺨞:êWz]Ôë†\á oâP‚¬ë–%ÚÝ‘‚Ó¡[–+=»Ó‡ì29žÉñL–¥s,Ëç{™\þ‚LŽ¥²ÜÆ%pVй$ê !ÄçHßò3J‰¾–Ì-QQ¤%^wþ«¢@D‘ê•WC½n£‘e oâP‚ìb€â@·tt–¥s<•e© Kgy*ËÒY–ê?`él>»3>X;…Ô7¹N©ÛEß}ç3/öy¨@©ÇM%º]Ô%RI$— ùlM¿Àë¦zIL—H\u»¨(8ìƒ/'¼)·}cúý/”ÃÿóSoX]/VÕ UubuX5I¬ Áþ+2iå×÷ðXToÑÉS ç|ïž|3\åúá?¯Ï¸<Å3]Z¤Sëíb½]Z¤Këíd‘.­wø€qMYì]x¼çpÁi›Bé…^õjC9…iL½äé,×sN•ñœÂ«É*Lc$ÛwÁë6žôíE9¥"´³F;Jõ{¿Wð¹û<ÔçüÁïP€Ç)ð&%¨RÂ!§Æ4BüÑB B·´c$™e© KfX*ÃRY–Êr#»Kõ¤³,•)Ý 'r^7u‰Ô-QOßj+=»ë[m•¾3«œn™`©MÙ¿¿™ÞaCÌuQi®{ö$±¡A¬ÖýÔ;üª«V²÷7ç‚àºí*(¿ÿé+i&,ü¶tÑ•Ã?H’§;µˆ>تu4å¾VùÑêĪEÞùßöwШÊÃþÝ’b¬ŒM瘪òœÊ³ WTžSxVåªÊ3 ïË!™ª’¬š±ÏæXVÉl– J‰ß#ø<‚¿?K¤>#ô ¯à÷¯à÷ N»SV*çÕ¤R±Á-” tK‹äT®§yÉ|²ÇõÄ/•Íç~úù’ª§â–ú§–é«•Ü.êuQ[ð¹ó)ŸÇÕþÕýÓ¹ñ«„nÙ¢¶½•ùð@³CÃBèTïq§{ÿÈ“íüZ}è·¤ïW'žq¶¸ä|BˆöêZíÍ×òQ*Ýt»pÈá#Ø8KnÎn{3ýAÏPY«DÅùã;q²Ô0òÇt"+º¥žRf”|&c·žXêÇ}E›x*ËrJ~¾·RJ™¤OÏ =TÏD1ॾÔÑïźGKT«%8ÂáàJºåh1FŒ4/žÖ龬/Í–Ìäó@Ûç’¹%êõ^õö­&ò囂ÏC=.Á×·¾(ÿUw–ÀJwK°¿g¿Ü”ùèseçŒ}6¦’Sîû9ïîÔ[´®Áu׉ä"„UUîÿïhË©ºÖõÃ&n÷¨žþInûÆôûŠ|š4q±ï„…ž£7t„Jª[jŒä gÍK…ûÿMçòsÈ3¶Fº$Ú—+Ò W ú=] ú„ü±O`¼q”Jª[è¬ë–å°í@ ú×ýW»C(!ŠÊ“–ȰDš%ÓFÖלH³”}E5=.ÓR·~'>?›KŸÙ¥ø<Ô[ˆ'6*ËncÉw³ÛÞHp Ù¡óÜGŽgœM{í%#$”J—^“Ï !’$]rµòÀÿ胇<Ò­mX/žsѨ_ t®{ö\÷ìµý­ÌÖýÇ6›Õ}Æ×¼Üpª÷øEÞ¡ÑŒm:BIuKQ ¯ðBÄ~ cDÏóës,•åéÌPԳ̊<ŠÊ£ªMdCf=KÔóàOõåæÔQ‘5æÝtÓMv‡P<åpÿwqì•Ux4©%3,žb±”–L³XšÅS,™f±”–H³âßA§„äWãôM¸êKð¨¿/Ó3ŽãU²fußÛ™ÞË6)\Ýÿ«ubÕ©Þy§x Pßþ_!¾g·òÇ{ Ëß­O>]<ÿÒA×hkÿ¬½÷v¾!®ïÿ?tÊ´1?cšgßÍ|üzfK·Ýÿ«uv¦ï[³¤Éc~ °‘ƈžš³ÄTßzæT–¥2<Ù7¾øáy\4èB~1èd¿ô A¯(ò dÈ/¢¤*€0et8H¡E£Ñp8lw…¡¨Aö‹AŸò !Ÿð ²_ÔGùd¿ˆ½˜aœÞË6=“x%ͳ擔Ðc܇žá[p¤kV{çÊÿÛóe?iHvÝýâ¶šK*©üúžˆç¿eêt×÷þô&'ü“Ü73ïžÛ1è=/@}×Ïï9²€O(eñ4K¤Y¢ox<¥ŸÑb)–H3«·åð{#Q EÙ/TD9 êÌżiˆk(AH‡ƒ„*„~·;¦ÆR,–Ô'yöòÅ-¼±«/‘ûnåbÑSœ¥žJ¬ÿ(÷…ù¤—zNõ·È» N¬²âIµ·7h/¯2šÒµ· GÍ=èw±¦Õ•MñüKÅ“O· :Ò®u¿‘Ùº9óq–çÌçz޾*xN…lg¶0/)Og¹ù(•µüþã ÑÅÚ ú¼ A%@B8$„P‚6mÚtÊ)§Œö»4Fâ)-’ТI-–dúˆ_oB³ºr€^s<C>AOüB~ýެ D,Û+cë–6ú4÷Íc‰—¢,n>y¤kæòÐÕ‚lÑ“òH·ò›ÿ ¹|®%Ì9^ºj¤èÕ'ÿÄ>Û–o¸Ü®þZSgE„n-º"±ö+e·ù¤,¯ž7Ç=Û¢'µ‚ãº% C/:­/AO¤Y4Éâ©|ÒOYX:Õ%QýfeUP ù„ª ˆá€P‹<´`$„ÃABŽ“Î²î˜¦¯èëŽççvvÇTë–óí¿lC¯É)ûŪ  b™?”˜ Ïþ%ùúÛ™Ì']TºÀÚw|'Òq–çê#¿cß|™oú®»Bƒ#]žÇã1å×÷tJo ³“n¾ƒP«¢å„lLoy>µAåý{ÐQBNñY`‰‡º-z^€±ÑO¦û릚êÒ›Ð4ËÞkeQö r@¬ ‰ú}ÏZYª Š"rEp$„ÃAB%Hc$–Ôz“ZoB‹&YoB?Ðz“,žÒ Þa)%úh^XÙ ˆUAö‹á ¨þ!áùFÙóhbM§1Ÿœ!Mº)´´PD„myG]ýŒÑ”.»^8þ„Ñ=Âû›ÕU+ûáÒk„ù',¾¡ìÕ:¯iVÛÌ'ëĪƒKuMµô© ˆs’H³xZ‹&Y,¥E,–ÒôUñ±”–H~a„@IÐ/V…p@ Äêá€X›>zïÔS¿]è'$„ÃAB62ÖõõÄ´hJ‹¥XOL뎩V,ê“Dôìé7;q›ʉÂÕSo½–~‘þ¿gù¾µ4pºÕ{îñXTùõ=$“Î?ïaGI7ü`ôÂÕG϶÷-zôú\wÿ„ÊÖ–+d„½–þÛšäéa=Ëwâ…Eצˆ%Â<¹&jcìŽiV¬]ÔÇkeQí•%c˜±àÏ0H‡ƒ„¬¦1Mj½ -×" -’è;Žk¹‚–\£„ýBU@ Ī`þV¥>ϳ*XBõ¸Á¡J¼n^«ÚñHb͵Ý|r¢XwShé4©`[8 C}âAöyS¾áñ¸~øZU=†Çá‘å7ÿArùš¨ÂÇHׯPAc§Úúh|m»Öm>9I¬¿)tÑT©±ŒM‰wKp„¬ÂõöÆ"|£ÚvaŸËã¢Õ!±:(VŪ XkdQãÆbE°Âá !„BÉ*<׺ãj$®õ&´Þ‹$´ž¸VØIž”_E}^бð]?Àr>°NÉp­M¾©’Áká.œå¦®bÄðñê³Mié·Æ^éDÛ´A[oªSzÍÍÂÑÅØ>^b}5ý7 ±JT¼Ð¿è,߉‚uk/Ç¡d»%”Uãz–‰ç' Z”+ ”„übMH¬ ŠÕ!±* Ö„ÄêX#£6Âá !„ÑRTÞ×ôÿ"q5Ó XMÏúôBgúÄp ¿î²>C—ÖûhbÍv¥Å|²Fߺðp×ô"‘J*ÿsOöí"8m¦ë{?W1˜1ìdX8Ÿ+;‹¿a1óÉYÒäCKÄšâÄPúTÇR¦Eþ Ö·Ú¿ÀKƒ>¡&$Ö„ÄYªÖBbMH”°YŒÂá !„Q5éKüzâZ$®õÄÕžx!o º¥üÔ‘*Óí@=ñâ>€áqB6e>z.ùZ–+æóó=G^<¯˜ûé©Ï<ʶ}˜oH’ëÎÓúñαäíÊoNTUo óO”.½fœ9riž}~¿2­nêºØú¾…ø 0¼žH/C½ -Ò·ZDÏ{âšR¸¥"²_¨‘¥ü@bßÕ!waHH‡ƒ„'Ñ„Ö׺cjO\ëŽi‘¸Ö×âÉÂìÜGõy ùÕBu(?¤:$ú=HûÆ"Ê'^ú$·Ý|2$® žw¬û°bF¾üT}ìFS<{©xÚ’‚<²öúzmÃz£)Ýx›0ûÈ‚<ò}˜ýü©äË –2Ÿ<Ê=kyð‚*a¤{i€Y2ÃŒR½¦²ñ *RJd¿>œ(Ö„ÄZYª ‰µ²ˆ–ma΀„p8H+J*˺cZOL뉫Ý1ÍHÿ RÓS¨q—®*Ø¿` “<±Õ2” Òé–[³Ÿ?•XŸäióÉã=G\87(i^e^6£üúíÕ[tâd×mÿHÄUÔ4åþ_ðö}ù¯ªqÝýÏÄí)̃LŒ%ŸH¬Û–ûÊ|ÒO½WÏ^è9¦˜‘HétK€ñÐ×'êÕzó³“ÔBí¯( TÏke±&$ÕÊb,Ö†DnLW $„ÃABX–T-¿Ì¯;¦õÄŒÜOÍä ðÿZHU@¿÷&õMëkB¢ìÇí7kÅYê©Äúr_˜Oz©gYàÌS½Ç?uÕJöþæ|C\·ý/:©{÷ñ=»•?ÞKXþó xòéâù—ðñGè½lÓÊÄËž3Ÿœï9òšà¹ê+~<•ƒq¢—´Ñ«ôôU.ˆ&5VˆDQß#?–(‹µ!±VƼÓò„„p8H.•eÝQ­+¦vÇ´î˜ÖU»cZ¬…=Jô­fûR¾|ú‡Úжø$·ý±Ä‹1–4Ÿ<Ò5syè‚jA.~µAåýÛ{D¸.xÞÉÞc‹ìOcýõðô52ÝqµP…Ð^¡VëÂR­,ÖÊR]X¬“¥•œ áp– ÆH$a$~jWL뎪]±Ôæ’DZ»ßúY*µMÛ±*JÝòåôæÕÉæ¿ÿÒ¤›BKÅZ[â!Ÿc;¾V6Ež-.9ߢç:¨Vµã‘Äš=j»q†zEà¬3|'Ø^-F"“ã¦ê jOLÓÕq—ÏsK´6,ÕÉb]X¬•%=c¬ bÎiÉAB8$„öÒ鉩]1­³W튪]1½Ê‹:Î%Ô”’p@Ÿ/ÖÈRm~!µ$ã>€£pBþ’üë_Ó3ÎD8ßê¹þ“bÛŸsñ—ö©/<Í>x7ß°`±âè‚!Ú‹É·^I¿kÞ¿þ|ÿ©úO³+$NH,iK쫵w•uQ Õ!=K”êÂb}Xª ‹5! +nl„„p8H‹Æ÷댪½šžþõÄÕq®Š–DªOZ¨•Eý•¾ä÷¦œŽþdbÝ;™¿g$*Þºøx÷6F5¸øguë‡Öÿ̤•ßü‡UåLÇäï¹/НR¸jœYäUðl{fð”§\ç+óÅú 4ôUjçp¢ž%Ö‡Åú*©.,ÕÉb}Æ‹ ápZsÒ›Ð:£jW4ŸvEµîØxwwðy„:Y¬•¥Ú°X×7‹=°ó#XDåÚC‰Ueû Šú©÷vùŠC]¶Œé´××i^Î7(•n¸M˜]Œ•}ñ‰úøF³€ŽÙ—Ê®ßÇþl®>zœûð[B»¨dcT`NH4Ñ_ÁÁøwœõÛõµ¬ÿ+ՆŪ ˆ$±à áøÅS¬£WÏúÔΨÖU»¢ã½$ûóªeýßÊÙÆ=†Ãa»£ ˜Ý2Ësˆ=÷¹²Ó8# »ä«§JÅ à@xû^åþ_-_UEXp’tÉÕE{vuå#¬é£|C’\wþ˜ÖÛü Ù¥îýmìóæõ‡»fÜ&_î¥îâ€WK{%3L¯ñ®W|ÐãéqÍþ’Dªç‡ua©¾J¬K URÐW)-‚„p8HG%“ãÆœO# çÍ¡p@4æ—ëüµ²è–*úÞPSSÓœ9sìŽ`€¢uËKÞ[Ù¢¶gjÅðÝò5 bMž}xÊïÿ‹ïÙ­Óìºû'Äç/Ú³óD\ùõ=$•ßxC˜u˜tËE{öiÓº~}:ÂbƙҤ;å+ƒB1~3xµ(AY…wÇÔî|…­+¦vöª±Ô¸²DŸGÐ?.6Tå³ÄºpÉ,eH‡ƒ„ð@4Fºcjg¯ÚÕ:{õ$p¼Ì!ŸŸ8nÊ+<÷³n-ú›ØSíZqf¢Xwwøš*!dcT:ÞÕ¡ÜûoFSºöVᨹEŽ}´E}î £éúñÿ¥²ýãc=,úëèÓíZ·qf‚Xwwøj[ö‡°®‡”UôA­[Zˆj]Q51¾±Äp@Ô“Ãú*©>,5T‰Õ! {† ápêzZWT눪½ù$pœå^^ÁHùê«Äº°T'K^7r?8 }Z×oökº+|U€úlŒÊÀ¶¼£®~F?fÍ–n¹Ë–0”ßýŠ·6ëÇÒË…cØÆ Ižþmô™j«q¦Fß¾ÚÆ­Aì‚ë‘Ëä¸>ݬ+ªéc]ãÛbZHMhÀ(bC•(£ÞÂáU`B¨1ÒU;zÕŽ^µ=¢vDÔŽ^5«Œý—àuSãÞL> ‹¾ŠYï±ÿj´#]3 _æ)Öj´ƒRW>Êš>Ôm¬é¢½ö¢öÆ«úq‘1oÿ•Ÿê»3|åLi²Q€ãèë;óK“òãü¤ÚP%5VK U’~P+WÜÖ¥<(#æ™ïìUÛ{ÕöˆÚÙ«¶GÔîØØwùZ+‹ï»H!lîWhN¯X eÉÒnù…²ëëU.ô}Ch©hßfƒƒqÎwm7Z¬Ãì „Î:Œô%„|Ç×v…±?uß!_ùpbõ‡ÙÏõ3IžþŸèS?/;Ò5Ó¢'Å«%@ù x…€W˜Öà2ŸŒ%µŽ^Í\É¢gÄÛVgr¼¹CiîPŒ3¢@ëÂbcµT_%5VI ÕRCV$ŽQ9Œ­•Ùa:ËÚ"j{Ú×Úz”öˆÚ{¹OŸG˜P-5ÖHµ!±VÎßY©´*`µ÷³Ÿ>_£‘þ7öÓ½ ® ~§¤v´ãmʯïÉ7<÷ÿûsb׫¡¢äþíÇDÍoèú§ŸÑ*ûËíáO%ÖoÊ|dœ‘¨xsð¢yž#mŒ ʾÁuwLí‰im‘ü˜GO\óçzãsï„êü(b\>``„°˜^_%5ôÍü¬¯B¹°Ü›™­+¯pÒÿÚu¶ï¤K‹m iHÌ4'Ìœm[6Hq¹è”é|×7z‹ïÜN_h[0û½6x^•|1õ¶~FåÚŸâ/\Ã3§x·76€âÀÀuq©•ÅZyÀúÀ¾Ò5ýõð;Güñ8e;Ûr;Ûúçªø¡±Zj¬’kò€al´R°¡-” BuËWˆÿå“Ü7Æ?õÞ!_yˆkJAß Ì4 '̲u¡N’„©3¨øŽ¯éüRL !sݳþ}ìÙ4ÏêgÞË6¥xö»¡K\´Ÿ"ðj %×N$ö­H¤à`1–øMlåµÝ8S'VÝ-_S/VÛÕÁqÎvõg vW”Ñ ³fŸAJv¡aš4áÇá{ªS‹èg¾Ršÿ;úä]ò•!!`ol‡l°Œ}BÐç>dÒ€åˆ]QÕØ÷b„þ9Ï"~º»ÿ¤ùÃc4¹ÎåˆQÄJOU-?ú§W.j‹(cÛüDH^÷¥:¿óIƒÅ7  Ä¡b5” qvË.­×œB¦Iî’¯*ý|€ïÛCÒ©|à m 'N™NÜn’ËBx,Ê»;im½ÝA §N¬úÇðòßÄžnU;ô3Í꾟Gç¼Z€½¼n:¥Þ5¥¾9bNåz¡š¶ˆÚÑ«¶õ¨=±‰¥X,•5&š ”ÔÈÒ„©±JšP#M¬‘ª¥,WSqSFcI­¥KiïÉßhëQÕÑOÿÔWš6V—ç4b€ýuj‘_FWÄÌœ~»|¹#f j›6hëWéÇÂ1ÇIWßlo<õÑß±¯¿Ð¥‹¯N8ÙÞxF"ÉÓ¿>³Sm5ÎT òÿ®º¡ZmŒ ÀR#½êøëGIÄ”zׄ¾ÝéÈr릌–yBK±¶e_ÚÖ£îëVÚ#êöýÓ“{=§ŸX“ýCÙO¨q–üEt…ylð8÷á·„..HM‘"Pû#ûòSýX¼ðrñÄSíÇ ½ùšöêZýX˜;OºòF[é,Wþî³ÜãÌD±îŸªnðS¯Q®á ôi†F‘}=cœfèqÑÆjib­kBµ4±VšXsÀ%fXC8"™o‹(mÝê¾µ-¢ìëQ¡Aíê‰;Ò?¨XYžûmìs6x²÷Øë‚ç Ä!/ŒŒ•àBÝ€e„ß|M8'#¼Ql+uÝ._aÞwdŸÖõ»Ø³wË×8åÀð ÂAI"\çš\×?ÑTQ¹^«fT+Ѳ oîPš;ãLÐ'L¬qéSL'Öº­ß~¼L^¸ZßÓÖ3–½(!5²¨Ïüœˆô 7¡¡[j„=~·ºÏ8s’gîõÁ ô*É÷¶lF?¦­o´73:yñxõðx2λ:J*¼aHD¼%t1'|kösýÌv¥åáøêïÊ—ŽöN^- <¸$:¥Î5¥nðZľujʳ•Dš}ÝšýºµÇ =[±*î²I?Ûá•> —ý™P-M©w•÷.“`#|¾4ÚnÉ y2±îSÓ~ƒG¸f\:ÏY/šlÇׯ15»´†àA˜>‹}•gã;¾rJBH¡„Þº(Å2Ÿ+;õ3å¾x:ñòµÁsGõ8xµ€rå–—«1W4mëQZ:•xê ó9É—3µ.Î2IDh]XœRïêK]µ2¶}‘ÕÉ›3ÍéÒÄÛäË%â°WQnJKj¾¨ŽÎšMúB¶ãká[¥²¾q$$"~_^ö«èãÆN$og>¬äsýß¶70€qÂÀ5XdÿЦé,ë›bªîéTöv+Y¥Ø^Ê*!OÝ0{+óáËéÍF³^¬¾C¾ÒCÝÃ|K)bŒ5÷×>¡¥—š—²ŽYFhðRÏò•¿è]Ñâú™5©7ÂBðdï±ö0È¡h|aæ÷Ì ýo¯ÙaTÊ$!¼ö̪’ÝÙ*S4Ŷ¶PjFÞ-·å¾Z™xÙh†ÿòUrÉï7¸?¾g7Éö-ÃÉ´®ÁÞxöG'N!^ɤ !$•äûhã$»ƒ*!tWøª_õ>–äiB'ä‰ÄKÁw¬û°‘|;^-Ìä€xt@ì*ÓÜ?‡2'„ÂÌ/ª3Og5oœèDúLcs‰Ñ/•]Å×h",^-ì…„ Òý9ùÚ‡ÙÏæl״ƒ8•ªð–ÝF‹Î:ÔÆXÊ\ð†íú†0fc0ã'zKèâY¦ZD[²Ÿ®Nn´1$€QÁÀ5T$„m}ê é÷æ$±þ6ùruü.µ¬y'Qý˜ÖÔÒª’Þ6ƒ6L ÁP¾‘Ió}{l §úv+é_·ùrzó†ôC9 \CEAB`‰¦¦&»Clÿn¹%ûÉšÔF³JݾÊO½E ˼ôw 4£”ÎèÃdŸ5ª þ»ä«d!hœùsò¯[McÑ:¼ZØ !€%¦M›fwƒ ê–_(»‹¿h¬ìòQÏ]òU5‚\üÀ¬0`a©î@h& ذBBHXu§|…‡ºõ&'ü‘øê/”]ækðj `/$„–‡Ãv‡0˜¹[îV÷ýÞTûÑE¥;ä+'K 6…VhJŽï1- œé€„ZF¨°,§³L“&Þ._.QoªDûCì¹=j»q^-¡aà* B€ŠÓ¥õÞ{ÆØŽzSpé¡®©öFU@l×#¡¢u Tv@ÊAëûãÌeùÞ–a/w’Ã]3–‡.4Šexö¾Ø3=,jgLÃÂÀ5T$„•%ÁR÷ÅžŽ±¤qæòÀYó6šÓ¥‰·™j?–îÌù¢::Ó¼Œð«a®t(‰ˆ?/›"5gÞÎ|ørz³!ìÓ| ¢ !°n.BIy7»Íü™»^¬¾S¾ÒØ®Ì0gV”Ñ 3Ëy¡ÎK=wÈWT›v¼\ÜøQö C¨dH,›‹P:ZÔ¶§ëfHüP¾:$l ÉB™4ß×·H’RÁ ;šÑC7ŽYó.¢(6cjA¾+|•Ÿzõ&'dEbm›ÖmoT• !@9KòôãQx¾<‰›ºî”¯¬«‡ÿ.çb;·ÆôcÚ8‘ø–÷ÒªjZ]“o¨ Û³ËÎh¬4I¬¿]¾B¢ùIËžûCì¹LßÞ˜öÂ4¨(HÊ'ü‘øê.­×8suðœéÒDC²šyš¥0ë0#3j »\gêuM½"ð£Ù¦u=_Ím  ¦ù@EAB`‰h4jwdMêÍOLeEO=É3ׯxŠÀÑ uæi®e¶=ýþNóÎ[ ôoDñqî«×ÒïÚ@BB`‰æær«޳-÷õË©þB2³¤ÉÇ´Nµ1žbH§xÛÞü1¥ÂŒClfŒè!¦–]$Wæ³(ç·Î2Z¿ÜøYn‡ñT$„–˜3gŽÝ!@EëÐz¯á$?ÿNß“—w̱öFe5¶ãkÂó?28…øüöÆ36TÓÚú|CÓXËN[ñÜñsŽû¾|YPÈÿÏâ„?_ežç P|˜æ !@¹Érå±çR<£7E"|7ti•²7ª"¸€Ð‘óEuæÉ®å½ŒPW#È·†.Õ›ƒ*!¦ù@EABPnžN¬ß«uÍËKf»¦ÙOјWÜ9t¡ÎœÍ–ý2BÝ®ú͵í™ä«6ÆÓ| ¢ !°*Vƒ]^Oÿí½l“Ñ<Ásô¾ôãòî–<çmù† ÓgÙθЙ³ Í—ñ=»I6ko<–2ºå9þoï9¢ÿ|æ£M™¿Û@±úè£?úÑ, lÄXâøó*ÉßGóSïB—y¨ËÞ¨Š†•ËBÝ€e„;+bÖ(!ÄKÝ?/óRÞT¹öÇØ_âlè Ö)ïùƒPÎ-ÜöÞ{ïݺuëORŸ~D?¦S¦¹nûG{ã)¦¿ç¾ücì9ã}ýp׌»Ã×%g*“u)µ#„k×®]¾|¹ùÌòåËW¯^=äÅ^¯wÿ“>Ÿƒçü@%kjj:øE…ólâU#$„œï?uÿl°Œ»%ÇŒl‚0ÍÁ u‚yáÞ=$“¶7ëìß-s¾Ø÷-£ù¥²kMò¢ÆPI¬M?ýôÓc°íÕܹs?ûì³!/¾ãŽ;®ºêª·ß~;Çãñ·ÞzëŠ+®¸ë®»,À"Ó¦UDQG([²Ÿ¼™Ùj4tÍ<Ïêþ—•q·ä;¾2Žé”éÄã±1˜ÂiÄü1cl×7¶Fc¡!»å²ÀâÃL¥q_Ioþ0ûyƒ¨ Ö&„‘H¤¦¦Æ|¦¶¶¶§§gÈ‹ÿå_þeâĉ§vš^fÑ¢E“'OþéOji„ ‡Ãv‡•bÚþDbѬ·ʗ 9¿®Œ»%Û¹Ý8.ƒ„:¡2v#²[ D¸5tiµ ëMNÈŠÄ‹û´®â†•«ŒçS쯄¶øå/ùᇾð ======/¼ð‡~øßÿýß#ù^:”Ÿýìgæ5ÁMMMÑhÔhš¿d>ŽF£æW<€G(åGØðîˆ?—ãŠÞtQéòeêsÖO1þGHÖ¼‹ºúS z„ô„)F3Öô‘CŠ1?‚,¾'_*ö}PÉòÜbÏmÜü†³~ <‚C¡ººÚöðû?ûÙφLmˆe¬-ÇÒØØ¸mÛ¶ÆÆFãL[[ÛñÇ¿oß¾ý/ž9sæ#³eË–©S§Z€eÊ{p(M¹¯×§Þ1š3¥É—— ÿ-åÚ-ÙNó„‡ÙIÁ™œr]FxÐnyuàœiÒD£¹*¹á3å S‡`ä¬M¿ûÝïnÞ¼ùž{î‰D"‘Häßÿýßß{ï½[o½Õ¸À<öG?úÑ 7ܰvíÚÞÞÞH$²jÕªn¸áþá,À‰:µÈ#ñ5œä§ŽÈBàûò2‰ˆöFes‰Ñ²©(£3oOÏÊ4!<(•~ / ~½É(¶ª[‹ÿ]ãQ®ó)†dmB …6lØðþûïOŸ>}úôé|ðÁ믿 ½âÎ;ïüå/yÏ=÷Ìœ9sÖ¬YÿùŸÿù_ÿõ_wÜq‡¥8ŽÂÕâϧxFoêõ«„½QÙ…÷Fx¤¯xµä¢S§ÛN 3!Bþšwìãɸ½ñØ¥Fߺب›äéãÏ«\³7*(cå:Ÿ`HåPŽEe mÚ´ o'`‘GãkÞËö+»"pÖbß‘|cYvK¶õ=õù§ôcaÖaÒ-wÚOÁ)¿ûomÖ¥«oŽ9ÎÞx näÝò¥Ô¦µ©7æ©Þ㯠žgY\¥Å©Ee*Vù}ì†ñzz‹9\à9j„Ù )Óni^@HËk¾¨nÀn„;ËpÖèÈ»åyþSŽwa4ßÎ|ôNæïÖPA8Æ7Êž’Œæd©áúà6ÆS x9nIo†e„JÈ ¡ 'ˆµÆ™•ÉWv©{m ÊÖBEABà 1–x þ¼Jò림ÔýÝÐ¥ê²7*{ñîNÞÉ7\n:¥¬ê„‡1_.ˆw¶óxÌÞxì5¨Û+\} ö—8KÙ”Ÿ²œOp H,¢’FØñç£,_Sdÿ¡’‘(¿niÞ‰A˜1ËHœÊŠÛC'õíÀÄ9ßµ}Ø«g´ÝrÐÀx‹=”#$„–hnn¶;(+N¼¶]i1šƒSPùuKóJ:³ ç‹ê„²ž5:†n9héìÊ®5É7 @%AB`‰9sæØ”²Ÿ½‘ùÀhí>äÿicxœòë–æá²2Û’Þ̼Œ°ü¶§[·\8óP×T£ùJzsS®Ü~3`£ò›O0 $„%­Kë}2±ÎhÖ‰U7‡.¢}²U2ÞÙÎc}Ú<:iŠ­áXH˜>‹H’~Ì»:úê &á{¡KÃ}ÛorBV$^ìeºO#\ùͧB€Ò¥öP|Ušgõ¦‹Jß- PŸ½Q•ˆ )Ï„:—›Nžf´Êró‰1…à÷B—Š}Ÿd,õH| ÇbB(„ò›O0 $„–@Åj(ˆµÉ7wª­Fó²À’©Ò„1?Z™uË Ëv¾¨Î³F Ò-qr†ig­ÙÏßÍlÿÃT$„–˜6mÚÁ/Ê^­ó…Ô£9CštžÿÔ‚_¥pUoú¨çÖÐ%b^«Ë¦[ò¶½$•Ì7|~:a’­á :ƒ¸Ýú1FxO™d;…ê–¿ºÄKó¿¢,WޝR‰V‡JSNó) !@ y&ùj«Úa4¯ ž['VÙOib¦ù¢Â¬Ù„VFµQ¦ö—Ó,³Z£Ñ Ö\8Ëh6«m«“mŒœ«|æSŒB€RñQö‹M™Œæ)ÞãNðmc<%˼%}…, Ô XFX^»Ê ¿š¿¦ÿÖ”Ã/ F­læSŒBK b5ŒV„ÅžH¬3šƒÆ: ¢Lº%cVRB(”ãn„ï–æquNÈc‰£,Qا('H,ŠÕ0*œðGâk’<­7­†*”òè–|ß’Éÿ¢h Dë' }9¡S¦G?æñïêþzG(x·´ò6ÎR+âkyß–ž0Bû½˜zû+e·ÑT/ÌØ€ù¢‡VÊB Óg-ŽY£0¨6ïgÊŽ¿¦ÿfc<à8e2Ÿ`dØl»Ò²>ÕÿácÐŽj0°%}ÍÕÑ™XF8"ƒvï\•ܸSmµ/p˜ò˜O0BH,›‹0B)žy8¾šõÍg“…Àòà…y•C·dŒíÞa´*ª¢Œnà2¯ wüLH‹º%%ô¦ÐÒ à×›aÇWgxÖŠçp4$„–ÀÍE¡'ëzXT?¦„ÞºH=WtKÞÚL²ý˜†dZ×`o<ÅG'M%^Ÿ~Ì“qÞÙno<ãg]·¬B7šn¯tj‘•‰W,z.çBB`›73[·f?7šgûN:Ò5s˜ëaÀ™³¡ÙÀe„˜5:¼c܇žæo4ßË6ý-û‰ñ€S”Ã| €CB`½Zç_’¯ÍéÒÄ §Ù# X@XyóEutЬQÖe%S¤F£ùTb}»Öcc<àe0Ÿ`äX"Ú”4…«ÇW縢7=Ô}sèb‰ˆ–>©ã»¥¦±æŠ^@¨3gÂl§ã—ZÝ-]Tº%t±›ºôf–çޝR‰fé“8BK477Û”´ç’Ý£ö¯þº6xn£Xcõ“:½[ò½-$—Ói¸ŠÖÖÛ]èÄ)Ä—¯•BRIÞÙfk8ãU„n9Q¬»,°ÄhîV÷­M¾iõ“8BKÌ™3Çî t5å¶¿•Ùj4OòÌ]è9¦ÏëônÉöôgÔ´Ž®âP*Lë_kÊ÷8;Ï/N·<Í;oç(£ùjú½Ï•Ex^p(Çϧ $„EÕËâÆ×“üêÅê+ƒß±3 çà{vÇtÊt#±2Í8fO‹æšà¹5BX?æ„?_c {C‚’åôù£‚„ x8áÄ×$yZoŠD¸9t‘—zìÊ)Ì ¡Pá áäþßükaø©÷æÐEÉW¦±äŠÄ‹Î^ –qú| €QAB` T¬†!­KmúRÙe4/,ž)M.Ú³;»[fÒ¼»3,tâ[£±™0Õ”¶µUµ1˜q*f·<Ô5õ<õÈOsßlHo)Ú³”&$„–@ÅjØß.uïºTÿgߣܳ–ø¾UÌÝ-Yk³QN“6N$n·½ñØÌ ÕµùcMãm­¶F3.Eî–çûO=ÜÕŸN¿ÚТ:»*À8!!(†Ï<^#Lo†„ÀÁ +oWõ±3—N¡“§ se…À2±¡„ÞZ >½©ríøóž³7*(5ΞO0JHŠáéÄËÝZ¾l%dyð|YÚ’³`á –¶bá(T òu¡óŒf§ùsò5ãäèù£…*ߤΠIDAT„ÀMMMv‡%dSæ£÷³ŸÍ%¾ç¸mØTÝÑÝ%F¦öò'„¶tËãÝGœê=Þh¾“ùûÓ_(@EAB`‰iÓ0¥ òÚ´îgMãÓ¤‰N·%çvKñXß¶`’‹6L°5œ’@'M#BþMœwuLÚÞxÆÌ®nyyଉbÑ|:±Þè(H,‡íJ‚FØÃñÕ9®èMuߺX"¢-Á8·[œ4…ˆöüK‹ÛMëóÇœ³½{lfììê–nêº5t‰‹Jz3ͳ$Vs‚}(€‡Ï§-$„z1õV³ºÏh^<»A¬±1‡ÂÂ!™§Îb7Â1˜,5\ê_l4·+-¯¦ß³1(ÎO0H¬²Cm}%µÙh.ðu’g®ñ8×€£SðA-O0U[å(4:&§ûN˜ã>Ôh®M¾¹Gm·1(ÎO0H,ŠÕåÊ£ñ5¬oZ•º:x޽!9µ[rÎö¶-T”1 !tl¡Q{»%%dyðBYèM•hÅW)\µ1$€"CB` T¬†?'_ëÐzôcJÈuÁó­ÏìâÐnÉ{ºH*™ox}´¦nØË+0‰¸\ú1ïðxÌÞxÆÆönü×ûw¡Ø§u­I½a_8ņ„ ð>Í}óNæ#£y†oá1îClŒÇÑ/ ¤ÔÆ`J‹(Ò “ŒoŬÑ1:Ö}ØÉÞcæ_Ó[¾TvÙØÏ©ó)Æ !@%XjEâE£Xá±îÿväpX@8 a@]$„cweà;õbµ~Ì 4¾6Å3ö†6²}à ˜X7+ÙSÉ—c,¡ D¸1t¡QÚÞ^í– [Òìøe„%Ò-=Ô}cp©@òãÏ{6ñª½!BKàæbÅÚœùøÃìçFóBÿi3¤IÃ\_LŽì–Œñ}­F‹NÆáæ!SÖ²›pçm£W:Ýò×”%¾æ{Ù¦­¦¿e€r…„ `º´Þg“¯ÍYÒä³ý'ÛOàíûˆ’ÓiH¦2jÁ@눷¯XQ:Å#=¶†ãxKý‹¦HFóÉĺsd©§¸($„…Á ,±6ózÓC]7„úg Áؘ+ÊЩ3ì ¤TQ*Lšj´°=ý8IT¼%t±1Ç;Å3Å_tÞ¨+Œ[é \BKD£Q»C€b{%ýîWJUËg5Š56Ƴ?'vË 1_t(tª¹®ŒóÂRë–ź¥þEFóseç[™­6Æ`5$„–hnF¹¿ÊÒ¢¶¿˜|ËhåžuŠ÷xã’»¥y+sæsžÌ¸óD vË%¾oîêïlI¾Þ®uÛ€¥XbΜ9v‡Å£ríÑÄ•hz3(øo ^X‚SE×-•oß—?87 æº2¼µ…0fc0cP‚Ý’zch©ŸzõfŽ+ÅWkÄa¿XR¸°B€ñZ•ÚØªvÍkçÈBÐÆxÊß»ÇHohm=ñùí§4Ñp5 Éù†’ãm¶†S&ªùŠàwŒf³ºo} UF*H \X !À¸lWZ^Oo1š'{ç9ÒÆxÊ v !:ÅÙËKÓ‰ž9óMËëRïìT[‡¹ÊI \X !€%P±ºB¤yöáøjNòeëĪ+gÙÒ0×-ùÓÂ)¨(s@Ž^FXÊÝòÚàyÕB~ô•öp|u–çì  àX«+ÄÊÄË=,¿Ô„ºB œñˆ„p„Ì¿(޲˾@Ê\•2ß Ú«u¾˜zËÆxÀ θ'$„÷™²ã­ÌV£9hÚïê ™¾¿}~Z]ck8ŽA'—K?æñ¡¦UM5ýÞWŠcæèÂH8kà`œX7ËI‚¥VÄ×Å–p§tKó® ÂÔé„¢ˆëÈ8Åh9eó §tËAÌ¥8á+k3ê¹>t¶>(Ž#„Ø’~ô/#ëQBo^èí+>œå¹‰µœ`§ƒ9}à`T ¶.õÎNµÕh^<§FÀJ¶¢Èeyg{þ˜RaÒ”a¯†!˜B¾wÑ4ƒ©ubÕ%ÅFs»Ò²!½ÅÆx`œÊ`à`äX««Em[Ÿêÿßwœûð…žclŒ§€J¿[òÖ˜~Lëˆ×goøàƒ'žxâOúÓêêêêêêŸþô§ .üÓŸþ4äÅ7nlmm}ðÁ9ä·Û=þüuë°»+8USS“Ý!Àèdxöáøj£0`­¾,°ÄÞ ®Ô»e2Á#=ùcQ¤&Ûƒ “§š/‹Ë;ÚH.go<Ã+õn9z×Ï­î+C5¨d1@ ²6!\»víòåËÍg–/_¾zõê!/~àî¼óNKã(šiÓ0ÛÍažM¾ÖÃòOõ‘÷ØRÁ•x·°€pÂd"I6ãl^­­Ï3Æ÷í±5šƒ(ñn9~ê]nÚ¨fЦ¦¥ÆÚ„ðÓO?=öØcÍgæÎûÙgŸ yñ»ï¾›H$-Zä÷ûC¡Ð’%KÞyçKðN8>øEP2¶å¾ÚœùØh.ñ}ë0WÎW,ñn9paþþ‹ÉA»–x·›#]3OñÎ3šÓ[>Ëí°1­ò¸†µ a$©©©1Ÿ©­­íééòâ¶¶¶ïÿû7ÞxãîÝ»wìØqÍ5×\tÑEXÔ VK°Ô‰õFs‚X·Ô¿ÈÆx*7 ¨(3>æ’<æ_,Íe% bþ#'ä±Ä‹)ž±7$¹ò¸F m;ÁûÕ¯~uÓM7Õ×××××ß|óÿÏÞÇ7U¥ÿ?ç&iÒl]XÊÚ…U–²‰€ *›È. ‚ˆ ::3îóÇÑ߯èàŒË0:Ž ›Š‚ȾˆŽ‚, ­l²¶¥¥P MÓ$m“Üóû#áö¦”PÚÜœ›ÜÏû_ynnnžÒãmžœí¡Ù³g¿øâ‹õy-­ËË/¿,¯'sss‡ÊŸ’?v8ò¯…p\Wˆû+,r}U.V DxÐ6fç;bƒ+°='Òcô§PÉ„Öò‚0/FŠ˜¾Â®vNµŽHpèh™èü¢bcÌýš½ í$ŒÑŸWˆÑ+¼üòËu–6D1”1¦ÜÕÓÒÒrrrÒÒÒ¤#ÅÅŽ{÷>}ºŽ}r[¶l™››Û´iSéHIIIff¦Ëå ÿ.”*ûS4ÀÖ­[±FYLØ^•³À¹Z ÇšoiŽÛ_œš›%+½àýûËÁ Á˜ðâ߈ ¢¯,cÏ[=óÄï'„Jþ<‹˜UºŠš›eã-wmÞàÙ.…3lú»pÌb—r%²n»uë¶oß>ù‘œœœ®]»^îdE“ˆ¦8þ|OäßÙBÒõ-‡›oà˜ÒÔÜ,C&¶n‹j°±ôšÖ2ø˜1QÅÛÓ«¹Y6Þó-­õÍ¥P>@%”ý‹;zôè… Ê,\¸pìØ±už<~üøZûL¬Y³æºë®S0?аZ³z¨áaÛ8šÒkJèB¬(òue°!/zª{Øv‡êa­Ë Zµ†Ä7½¢WŸ>}zÏž=gÍšõ›ßü†òî»ïîØ±ã?ÿùt‚¼ëóá‡2d!däÈ‘„5kÖ<ÿüó_|ñ…¢€fÕZ÷o‚epš® Ç|4N¾&ÅŠ2‘ ´NIp±n¬+ÃQ+]³Qæ+\Á'kß`êþUÀW|w\Ô¢ìwá6›móæÍ»víÊÈÈÈÈÈØ½{÷¦M›,–º§1˜L¦¥K—~ýõ×:ujÓ¦Íûï¿¿xñâAƒ)š!€Bðå¢ÊÕÚìCæ-¦¾ó‰õ6KÆXÑ))¢­ÑC!=„*2ªÞf9ïïh¨ùšc±ëë)Ç|äâa9,*WE$âëe Oø a"5¾˜2#U°óÍJËØÙÓÞ·_ kŸgqM'^ˆbõÿþTW"ÃþMJᛑ–ó—ý_Ù•,øëè`hûlÒ”(¸l Ä™X]T@…Ö¹ªABÈdëí¨ùb5ãE10b¶j+E˜FÈWS]òxË`)<ê-Øìù‘c>ž:®$(@[ |ÅëÝ5é{%tîoìÎ1 „È×ÀÄ ÝP½£F5âfÓµÝ:Hár÷·EþŽù@˜Cš‚‚@ò=FA=|Ì?ϹÊOÄ@hÌ÷YGðM)šTÛ,C¶¤ÇÂÈ ]hT¥¡j›eÄQBî·Ž´ÐÄ@XëvÀ BEäç«ô³—ÆÕúJþ^ë› Òݺ• Òféó±3ERDÛ´ s.\yA(æUηWi³TF²`›l.…µ,p‚@ÙÙÙ¼S€ÚŽz ¾•MÚ¹ÉÔ«wÂ5ó‰>u6KV\H|¾Àcš’J-6¾ùÄš’JÌ¿ò¨ªbçÎrM§nêl–Ê¹ÎØ­¯±«ÖšÒ *¡Žk‚‚4¢ŠU/¨X-’`I]Ò–¡|S‚€Ð1^4¢(Úȧb]U¸×:"åâBV"8W{™oJP‹¦:®P€&È7þ¢„NµŽ1Q#ß” %ÿ'Uí4B­1SÓÛhiljZÛ¢‚h­ã4!€"°bµªäTÙV¹O ‡&öïdÐbá¡Îf)ï¶°Äh¤ÉWm ÕØC¨Îf©´.†¬›L}¤ð[ϪsÌ´ !€"°bµzTˆîO*ÖIa ]Ó±æ[8æÃ‘›¥|b¥ò}ó "h[Yáéšéšê¡ÆfwZ†6×¥3BV¬q³J¾)€6¡ €8÷™ë«r±"ðX ƒ¶1ªç›HäK_Òæ-ˆãx#ŒZl49%„.è |©aªuŒ@‚CGËDçù¦mv\ƒf¡ €x¶³*wOÕA)e˜©oÅ1¨%d!V”Q¦ªV{C›¡‰¤p{UÎÞêÃó‰f;®A›P("77—w @.ˆŽÏ+6Ha¦¾Õó óáN…ÍR^Ÿ­1P¡ÓUWª°YFÓXó-­õÍ¥ð“ŠuÒˆ€è@A ˆôt|´åŒ¶À¹Úêa5L³´}ÓSa³dØsByòXV ºueTØ,£IOuÛîÆ±WˆîùÎÕŒoN 1šþl œ¤¤$Þ)hÝFÏŽÃޚϾ,ƒÓtM8æ£jk–ÌYÎÁ½@ˆ^OÓZrM'n ­Ó NTc%ŤJ]+—¨­YF_+]³Ñ曥ð€÷ø÷•{8æDó× 5( øÎ¬r}'…] ín1õå˜ԉɆ/Ò–­‰‹ý(Ãh¤M/JdŒâš Ôá¶Äò½p¾tm*öŸç˜h¼ã´!ÄóϯXå#þ@hÌSmchø×¡1^TAòQ£â)ÕJè4ÛX35Âjæë\!ÝÄ úÐq š‚‚@X±š£eîÍ…¾³Rxåö$ÁÊ1õP[³ @ˆïã$ÿçUÛB£jk–¼¤ö»­·Ia¾¯xÿ2 («y9è=ñ­çG)¼ÁÔóZcŽù¨Šºš%cò/±¢Œ¢ùº2…êê!TW³äj€1»¯±«®wÿð«W]Õ;Ä%„?ܬr¡s´@_S]òÝ–a<‚Ëc¥ç‰Û L‰5“Ü@´EÍMVz¹œ|ó˹×:"E°3ÂV¬®¼¸T2D:®ASP@üXT±¾T,<¦„NµŽ1Q#ß”àrB&¶j+-ƒ ŠÐëiZ+)b§ 8æa˜©iŠm´ô?Ã9Ù×Fž i:®ASP(_.FߎªÜÝU¤p„ùÆŽLK ¡ªf2°-Æ‹*.d7B5­+£ªf©] YƒûIá¶Ê}{ªrÌâ BEàËÅ(+Ë—T|-…éú#ÍøÔ¦ªf)_ë’¶Fé®8A¾®Œš¦ªªYªÄóàÖúšAÔŸ¹¾rˆó€ø†‚b#lžs•›·ÛN †‡mw艎oVŽ(²Ó5»áa‰Ñ(ÿ#‹*[hjÑSÝö; 48í³Bt/p®fá_…ŽkЄó6x¶ÿê­éñ˜h’¦kÂ1¸"v¶˜TWS›&¥ðÍG h³Äܿޏ*Xé®éÀ´Ò5c¾Y xW¹›c>ZƒŽkЄŠp8¼SЊ_ñ×÷RØ5¡Ýͦk9æ£fêi– ãE£RÚª©g¡zš¥Ú KÐÙP3óóKצ" Ç| ^¡ PD~>FdEƒ—ùæW¬ö ´ æ­c°Zå娧YŠØ’žA•ëʨ§Yª %ôAÛX3 öëz™o¾s•t»ˆ„ŠÈÎÎæ‚&,so.ô•Â{-·Û+Ç|TN=Í’aKzB¦ª¥ SO³T¡Á>Éz›æûŠ×º·pÌG;Ðq š‚‚bÕAï‰ÿzvIáM¦^}Œ]8æõåó²3§ƒ)0d4ZhkYaaEŽÉ@=õ7f÷5v•¯ÜÛ~õª¥˜cè¸MAA1ÉÍ*:×HËî5Õ%ßiÆ3!¨7VtŠøƒÃÞhJb¶ðÍG;hJ*µØ‚Au;w†k:P_÷ZG¤ öÀcFØÂŠÕ•¬ŠoJq× )(«•öiźR±<ð˜:Õ:ÆDø¦¤~*i–¡1^4ªä£FY*¦ª¤Yª™™š°¦$8?úœ¿l‰k#ß” ž  PV¬VÔöªœ=U¥p¤ù¦Ž ;¼2•4KvJ>¿¸¨Rá4B•4K•ëbÈœxn«Ü'¿4 Bˆ1çüe‹+¾–Ât}Ë‘f| Œ%òeôFWÈ4BlOSÆ›·Ö7—ÂÏ\_9Ä ŽùÄ7t\ƒ¦  €XRkþL5mðl—¯°w§ehš® Ç|b‹š¥x*°à‡XšÖ’$`ægt™-4åâÿ2~?;]Ä5BÔÑ,cE+]³1æ[¤ð ÷Äw•»9æñ!€"ÒÓ13*ò |Åk\ßKaׄvM}8æsÔÐ,C&bà B§ò_WF Í2† KìßÙPÓÍû¥kS‘¿$ÌùW„‚@III¼Sˆ7^æ›ç\å#Áí ¬‚ùAëÊ7§X£†f‰ „Ü©m¡še ¡„>hk¦¦@XëÆ‘‚ŽkЄj}~¯åv»`å˜4 “ï9BùΧø÷ÂÕJ쓬å°ÀW¼Ö½…c>q × )( Ôš*s“©wcŽù@Ã0g9+w½¦µäšŽFÑÖm‰üëÏÎ%•¾ù@ô7vïkì*…_¹·É'WCã¡ã4!€"°bu¹YåBçi1½¦ºä;-Cy&³¸7KVpRzL[µ!:¿\4,ÁH›¥3&p͆³ŒQ÷ZG¤ öÀãZË/\„ŠÀŠÕôiźR±<ðX ÂC¶;LKS6÷f‰ „*Aeÿø¬€ó¨QîÍ2F™©išm%Á™Ôçüe‹]_‡ @P€ªm«Ü·§ê Ž4ߨNßšc>ÐòÚC¾Ö%D™ ›½)¯Ò!¶t4¤Nì'…Û+säwKh t\ƒ¦  õ:ç/[âÚ(…éú–#ÌèLˆY¡£)zù é!TÁB£Ð`ã̓Zë›K¡|<4:®ASP(_.6žHÄy+¥Y1FjxØv‡w­FàÛ,ÙùâqS"MmÊ1£-Zƒ!ð˜9J™“g »ecè©nšu¬ž§ã^œqÍ¿ @­/oµûûcÞSR8Ñ24M—Ê1Ÿ8À·YÊW”Z§Š]$ùÑéh‹VR$ÿÕDî–ÔFŸ6Î|«ôžøÚ³ƒ_:{P€öžüʽM ³:4õá˜4žxò˜ô˜f´ã˜ B„ôš_“ýj  MìßÙP3 x•ë¿'|…ó‰è¸MAAªãÝs«¤QOvÁò€uº“b¼ê ™íù%„„þ D„1Ž:Í6Î*˜¡Ÿˆï—/s1ì0Ùpè¸MAA ‡Ãqå“ .Œ+Ö8Dg ¤„>d»Ã.Xøf86KVádçK‚ m±¢ gBf{iÔ.;}ŠTqÛÂwˈHlZÇJ_œ•ŠåŸV¬ç™Ä„ŠÈÏÇÂ} ôgGNõ)i¾ñC&¿tâ ÇfÉN#,ØåK[·% F^™@ÙB›^\RÅü¼ÁÝ2Rº'´$ۅ⧪ƒ[*æ˜Ä „ŠÈÎÎæBLÊ÷^éú¯v0´eÈ/xñYÊÇ‹ /ª òQ£,Û¨QÜ-#h‚ypº¾….q}]è;Ë1ŸØ…ŽkЄ U¬ú#ç ñB35=d'à6ÄÞ‚ ¤×L#Œþ¨QÜ-£€:Í6Ö*˜¡HÄË—¹Y%߬@%P(+V_#ä㊵Ñ)¡Ólãì‚•oVýf‰-écBÈöôQ_WwËèHlZÇH_É\Ë?©XÇ3!P „U›<;sª•Âæ»²Âœ1Œ1–W3PÈ@A¨Rµ§BœêžÐaPâuRøSÕÁ­•{9æ£fè¸MAAÑ“ï;½Âõ­fé[2ä˜(Š;Ë\Á®`b4Ñ­¸¦—EÛf½!𘕞gŽR¾ù€r&˜‡¤ë[Háb׆BßYŽù¨:®ASP(_.^ªŠUä\é#þ@h¦¦Glãu¸ EQ”›%;qTz,d´#~×j¥×ÓÖm¥ˆåæ›ãnMzª›n›`¢ ÐË|9WT3/߬€/üyP¾\¼Ô¢Šõgüç¥ð^ëˆ&:,ãUQn–Ø’>†ÈGŠÑ]WwË(k¦K™d.…Eþ’¥®o8æÜ¡ €hØV¹ogÕ/Rx«©o_cWŽù@`KúÂ}{zˆ¦ë=ú³¥ðûÊŸvWà˜ ¡ã4!(®Ä_ºÄõµ¶Ò5›hÂ1ˆæ(ee§¢…ŽH’éeg‹‰ÛÅ7PÚ½Öiº&R¸¨býy¿ƒc>jƒŽkЄŠp8ð—5ÈÇüï;—U²ê@h¤†ö ªç›•6E³YÊ'Ò6Òš% RòU£8wK.ŒÔ0ÃVs+v³ÊœËüDä›p‚@ùùù¼SP‹¥®o |ÅR8É2¼…®)Ç|´,šÍ²ö–ô zò}A¢9jwK^Zë›ßa$…'}EkÜßsÌxAA ˆììì+Ÿ¤¹ÕG¿«Ü-…×»Ü`êÉ1‹f³ Ù’;Æù4ÂhnO»%GƒûõLè$…_¹·ôžs¾v ã4!(¥T,Ÿï\Å.†MuÉ÷[GñL¢Æíbç.nn&Bz×l ^hf{Bià1+, ÕU\Óh „LµIì6Ϲ²\¬à›• ã4!(ÂOÄœ+\ÌõD÷ˆm|"5òÍ ¢C¦”f`aÌ Y²ue N¿Ÿc2M¡Óm’[ d„Ís®*ñ—†UCÇ5hвaEEÅàÁƒûôé“—————×§OŸ!C†¸Ýîð¯bŒM:uæÌ™ŠæJ¨dÕï•/­dÁå( Tÿ¨ýN«`æ›D“˜w‚ˆÁÝÌhÓæÔbã›ÔMiB“R‚×Ë ±®††ØË ûD=ÑB7«|Ϲ´šyùfÅ :®AS”-?øàƒ¼ð ))))))/¼ðB¿~ý>üðÃð¯zóÍ7ÓÒÒî¹çEsPTnn.ï8`„,¨X]ì?'™lž¡oÉ1%‹N³dy/ÃhF;鱕i„Ú¼[ªS;}ëñ–ÁRXè;ûIÅZŽù@t([®^½zÊ”)ò#S¦LY¹re˜—ìÝ»÷ƒ>xçwM @iéééW>)îlðlû¹ê4õ¾ÑÔ‹c>PKtš¥x¢fîV”‰9ò_Ë;…wÔæÝRµ†$ö`¬Y`óǪýÿ•í% qIÙ‚pÿþý={†lBÝ£G\î|Ç3eÊ”yóæÙlb±-))‰w ÑvØ{r•ë¿RØVßânËmüÒ:D£Yú|ìTÍ8CšÙAñw„ˆ Ýžþ¸´}ˆr4x·T¹{¬#ZéšIáåKFk:®AS”-KKKSSSåGš4iráÂ…ËÿÌ3ÏÜu×]`5B€S*–è\.^ܺÊBµM4P=߬ úXa>ñ'Ѥdšœþ|PÚ¼1[‚ÇÍΜæšp`¤†ÇìwJÛÆú‰ø¾sY™èä›U”¡ã4EEÛN¬\¹rÿþýþóŸðZZ——_~Y¾HTnn®ÃáBùSòLJCþµ®€+à W¼Âù² ÿ)ÿÒ)׋¢„>l»£©.9¶~ \!"W(Úñƒô˜fuŒÑŸBÓWøáA6Ðuð—˜ü)p…Æ]¡¹.ušmœ´:t¹XñsÙ¾_rbë§hÌHh'aŒþ¸BŒ^áå—_®³´!Š¡LÉÑ iii999iiiÒ‘âââÞ½{Ÿ>]Ç7Ž:tØ´iSFFFMr´^éÕó4€hÚºu«vÖ(û´bÝ–ÊŸ¥ðË Ûoà˜\Nš¥oÁ{â¯Áyú;& ס%Äÿ–Íþ¯V Ù}ô“Tôí4u·Œ-+\ß~åÙ&…ÃL´ ᘀÆ)Wò(ÛCØ­[·}ûöÉääätíڵΓ;–™™Y«Vº Pˆv>ßì¬Ê•Wƒ=: G5¨VŠ7KQóOH–Q!ëÊ(¿=½vî–1gœåÖn 5áÏŽ=U9æ Q¶ =zôÂ… åG.\8vìØ:Of—*š$4Ø)ßùôÍu©Ól؃^»Xq©ô³…6mÎ5h Úº-IÎcÎrvá\øó!^QB²kªK„Œ…kŠü%|³ŠŽZÃG⛲áôéÓ·mÛ6kÖ¬ÒÒÒÒÒÒW^yeÇŽ<òˆtzÿbW`Ûb/óÂZ뀉²…Ìöwø%BÛšéì„â„ Zšø¨íNi…°*VýŸò¥VÅ7«(@Ç5hв¡ÍfÛ¼yó®]»222222vïÞ½iÓ&‹ÅråWĸ¸ÿr‘6׹✿L:Rk¥rP!¥›%;‰-éãDíÍ'”÷wËX×VŸ6I¶‡Ðÿ…ùÎU»OôJ¿AffæòåË/÷løá , ±+î¿\\íþþ—êšOÿCûË÷2uRºYÊ÷1Ç–ô1M¾¤¼ÎWBÜß-ãÀM¦Þ'|E?Tî „ûªÝèÙq["6 ˆ*ÚvbEnõ‘õîšÝÚé[· ☨;w–9˃A‚‘¶lÃ5h¡m&ÑéÙùVî>Ľɖáú–R¸Âµù€WÙ®c¾Ðq š‚‚®Îy¿c¾s5»¸½]°Ì°OÔ߬€;y?’‘Eü}‰em]³17SxÔ(¨ŸêµßiÌP$lžsU©XþU± × )øƒ  ù£ñÄË|ÿq.u±àJ’:"L·MHl|³‚zR´YŠò „/óB7ŸPpÔh¼Þ-ãOª`Ä6^ ÁÅ¢œ¢ëýòe>æç›4 BEäççóNA‹\ëó}ÅR8Ñ2´£!=Ìù *Š6ËBL Œ}4£ôX¾~lÄÅëÝ2.]cÈm¾Y Oø ¿pmä˜D BEdgÇá +ßzvm¯Ì‘¾Ʈƒ¯ã˜\-åš%+w°ÒóÁ@§£mð5AÌ2ÚI‡°â"âq+ôFqy·Œc#Ì7õN¸F ¿«Ü³­rÇ|‚ŽkЄP/'|…_º6Ia+]³¬£9æªÂNÖlUGÛdCÇd 2Í4íâ""Œ‰ù'¸fjA ™jÓB×D:ò™ë«|ßiŽ))× )(àÊÊE×Ê¿ô‘à\M˜aŸ`¤¾Yzˆ/¢6b‹‰&L·Õü ð2ß{å_JsËã:®ASP("žV¬‰ø¡sY™è „¿nÊ7+håš%¶¤K!ÛÓ+VÆÓÝR;Zë›ßo%…DLJåËE‚í£b BEÄÓŠÕË\›õÖ ž¹Ý|£| Ä¥š¥ÇÍÎ^\jˆR!=K‘w¨ Ùž¾0Ÿx«•x—xº[jÊuÆnƒdÓÈzO¬soá˜4 BgoõáMžRx!sŒùŽù€ ‰'ì -[S"ß| R¨ÍNS/ŽðûÅ‚<®é€êÜiÚÁÐV ׺·þR}4Ìù1× )(à²ÎøÏÏw®–Æ¥ ö‡e›P„nIñ¢q…fÉ: 1Béˆ0Ã6!éâV´Œ°¹Î•%þR¾YE:®ASP("77—w UŪß+_Zɪ¡žêfØ'Ú3߬ 1j–"&Æ/A¶¡BaÜ-µÌ.XgØ&è‰.ºYå{Î¥ÕÌË7+¸*(‘žÛû°1Âæ;WŸöŸ“ŽL¶ ÏÔ·â˜4ž"ÍÒ[ÍNŸ’"ùnæBÖ•)8Aüþˆ¿E¬ß-¡½¡Í–ARXè;ûiÅzŽùÀÕBA ˆ¤¤$Þ)4ÊJ×®>$…7šzÝdêÍ1ˆ%š¥˜R*hÓæÔfø[G´I3j¿ØlªCŠÿH‰õ»%B†&ö¿ÖØE wVå®wÿÀ1ŸÆCÇ5h B¨m[徯<Û¤°­>m²e8Ç|@ͰáDÜ“÷ú*·ùĺ)ÖÑ­tͤp•û¿?VýÂ1ŸFBÇ5h BqÈ{òÓŠuRh¬¿±ßm zŽ)š±“5‹ bE™¸D±==Ôƒ‘&®X{ÜWÈ7«CÇ5h BEÄèŠÕÅþóï—é'b 4Pýoìw¦ '"ß,C·" Y(ã¼Î—o1)1z·„K5×¥þÆ~—ž˜ñ2ß»åKâcÑQ€ø†‚@±¸bµ‹yÞ)_ìf•úm\–¾5߬ ‚"Þ,囕S{MiÙëƒÐ­HâÅå…=nVRÙëÇâÝ.§ƒ¡íƒÖ±ÒÞD¢ûò%ÒŸP'„@H]_åN° îp Ç”@ýB7œèpù!–Q*¤gI;Q£N_cבæš"¿Øî½ò/|$òëÓ* × )( 8Ù㘷fýÀM½†%à˜Ä–w\z,`E™ø²ù¦•Œ6ßÒߨ] õæ/е(Ðq š‚‚@±õåb­åà:2î±ÞÎ1PH„›%c¢¬ Ä£qLYWæh˜3 ¶î–P”l£;2¤#Û*÷}íÙÎ1%!€"bèËÅíU9ò £Zèš>f¿SOtS…D¶Y²3§‰Ç Í´y‹^T…¶N'†„ÀcVî`¥ç#xñº[Býé‰îQûÄæºTéÈr׿]Uû9¦—ƒ‚@ÓŽz ä›LXóö»ÍÔÄ1%ˆò¡ƒBf{Bi˜“!¶étBÛšÞl>õa¡‰Ëþ 0BV¬9#Q ã4!€v•øKßs.õ±à\Õ?n¿»™.…oV+B¶¤Ç„ñÓ¡ZèšÔÚˆâوנ)(áp8x§p.æ™Sþy…òG yÀ:º6™ˆk‘m–,/´‡âšrÛÓ«ÿn ÑÑ~Ÿe¤Vˆîw±€Ê  PD~~>ïÂñÿûå_žõ_ŽŒ³ êgìÆ1%ˆ‚6Kvá+¿ø9Þ@[µ‰Ô•A„¶YDìçaçÎ2gy¤®¬ò»%4Þõ¦·'Þ …§ýç>,_.‘cJ ‡‚@ÙÙÙ¼S¸,FÈÇ函yÒ‘L=å­!^E°Y²5KM é™R©q+!¶¬)ûYþñ0ç^5ß-!Rj}çxÀ{üSuoDŽkЄš³ÖýýΪ\)ìhH¿×:‚c>‹°á„…n>±‚´àÒY ?TîýƳ“cJá¡ã4!€¶ì®:°Ö½E ƒ3þ±É\¥ePjCèº2ÞâÞ¥ë–}éÚ´·ú0Ç”Â@Ç5h BE¨sÅê£Þ‚ù«ØÅÐBŸ°OÂ&Ú©fÉœåì|I0Ðé„¶™¹,¨œ|sV\D*=¹¬:ï– „Z;1Â>r®ˆ•(â BE¨pÅêsþ²ÿ`“ m‹T³ élÕVÚ²â\¢™6k|,Šbþ‰ˆ\U…wKPN ]ÓÇìwJÃR¼Ì÷^ùÒ bÄÖ(€@A  M&œ²M&î·ŽjoÀÊÐò‚PÈêÀ1ˆ2š¥Ôæ  ò‰ë±â_ŽÏ=¬ŠcJ—BÇ5h B€øç'âûåËÎøÏKGƘoéoìÎ1%ˆibž|Kúv3(°==D ¦ž·%Â"ɇNumDŽkЄŠÈÍͽòIQÁùعæ°÷¤t¤¯±ë3þÔiQdše¥‡9|L©€‚PKhfM‡0+Ì'^o㯩ž»%DÓx˾ƮR¸¿úØ¢Š¯8æ e(‘žžÎ;… uî­;d›Lt0´}Ð:–rLø‰H³óŽ1øE>MkIÍ¿&Ä jO¢)M‚ÏÇ óž^/ê¹[B4QB¦ZÇdÉ6¢ØZùófÏSÐ,„ŠHJJâ!„ì©:¸Æý6Ó¥ü¡s…HÐ  „16ß¹rOÕAéHk}óß&M2ÑŽYAüÁŠ2 ÝžÓ!’©ñwö{ZêšJG~ª:øqÅšhV„è¸MAAÛ!‹*ÖÿXµ_:’¦K}Ò~¯…&†yÀUcLÌ;.Ev Ô¶íéO4v¡Q€Zl‚ùɤ{›éR¤#Û+s–¸¾ŽZè¸MAA ‡Ã7ZæúfKåÏRØL—òtÒývÁw‡ØÒ˜fÉJЉ;¸³%1%Ò´–‘É bmNôÁéÌQÊÊJ|©¨Ý-!¶$ ¶g’îo¢«Ùìô[Ï®¥®o8¦¯P("??ÿÊ'5Ú ×·=;¥0E°?i¿7Y°Eá­!5¦YŠGI…Œ,"àχ¶éõ´MÍjìÈÁ0熻%Ä¢Áþ”ý¾$Á*ùƳs½ûŽ)Ä%üEPDvv¶Òo±Ö½õ+Ï6)´ –'“îmªKVú}!v5¦YŠûöHi‡k"‘Ä6AÖ äÍãjEán ±«™.åɤI+ÝÿýÚ³Cé÷EÇ5h B€˜´Ù³kµû;)´ æ§“îk¡kÂ1%ˆcì| +¼ØC©Ð½7×t@„ž×ÜåT)]a^r(ј«ËDçŽOÎÈ&BÜdê5É:<y¦]U³æêªÀcšœBÓ³”I âÐájµ[np¶Ùóãç*‘ˆ2Á2d¼e0f /â¾=„±ÀcÚ6“6iÆ7ˆ´ekšÖ2øýâ/{¹¦ÚE ™h:Þ2X:"ñãŠ5=;ëyt\ƒ¦  P„Ãqå•Í!Ë\›–¸6²‹GBï·Žº-q€¢¹fÕ§YBDùxQl?WCÞI(xF=›%ÀÕžxýTkÍXFÈ—®o–»6óÍ @…P("???ü "aŸT¬ýÚ³C:¢§ºéö 7šz…y@c\±YBXÉVT (º¡AÂUïPÂNce®ø’ú4K€†¹ÞÔc†}‚ê¥#<Û?«øŠæUZƒ‚@ÙÙÙažõ1ÿåË~¨¬Oe¦¦§ì÷õN¸FùÔ@»Â7Ë€îÁö©=IÉŒ ÞÐÔ&´MF0`L̽ò¨Ñú4K€ë•Ðù·öÉ&j”Ž|W¹§Ö¼ýK¡ã4!@´¹Yå[åŸþ\}H:b¬O'ÝßÁЖcV¡ûÑ÷ s&@äÃŒÅúPTgCÆÓI÷Ù³tdoõá•^ɪ/÷t\ƒ¦  ˆªr±âMÇ'G½Ò‘¦ºäç’h«Oã˜@;•ÏÎ z½Ð­gØÓê ôèC„‹³¶Š ØÙb¾ùB2ô-ŸMš’*Ø¥#‡½yo:>qŠî:ÏGÇ5h BEÔ¹bõ9ÙßøÎHGZéš=—4¥¹.õÒ“"îŠ ©‡ŒíܘÎâµØ„¬ŽR(æþþ|¬ïÑÑB×äɶÖ7—ŽäùNÿñð‚XÎ1+5@A ˆKW¬.ò—üݱð¬¿f‰…,}ëg“HlÑM ´ë ©3&æÊÇ‹b}Qh Q£{wI»˜Ô ëûCÔ$ ¶g’îo§o-)öŸÿ[ÙüBßÙ0¯ˆ{(¢á„¯ðe—‰NéHvBÇg’î·PôÀ€Zˆ'ްò‹ë(Bçn\Ó&tïE †Àcvá\ͺµ¼Yhâ“I÷uMh'qˆÎ7Ÿ÷ÊOCÇ5hŠâa~~þĉív»ÝnŸ8qbAÁeÿ*|ÿý÷“&MjÖ¬YRRÒ€V¬X¡tnÑ‘[}ä Ç'.摎ô7vÌ~§|!lîÄ}²ñ¢ÝzJ讚Ñ$tì"Eò¦À‘·ßÝרU:âbž·Ÿ¨>.AÇ5hвaEEÅàÁƒûôé“—————×§OŸ!C†¸ÝuÏß½å–[JJJV¬Xqúôé9sæ¼üòË~ø¡¢é('777ð`gÕ/ï•/•/o=8ñºmcu蟇¨“šeü~ñ@Ža¼(4RíµFEñrg†k–ÊÐÝC¶;n6Õ,¤\żï–/ÙSucV¼(û‘ôƒ>0`À /¼’’’’’ò /ôë×ïreÞsÏ=·iÓ¦o¼Ñl6_wÝu .|íµ×M@9ééé„Íž]ó«ü$øIˆ2Ú<ðnËm”P®ÙFšeÄ_·+X¬BûÎQÊ â”pMwiQ"æ,O»Ü™aš%€rB﵎o,ñÿGÎåßWþæUqIÙ‚põêÕS¦L‘™2eÊÊ•+ë<ùõ×_§´æSr‡ÂŒ/P9{RÒ÷÷K\_3\MA ô>ëÈÑæ›ù&Z–”tÙ]æåƒútÙ5Û4Þ t©Y¸?̆„aš%€Ò†'^?Ù:\ú–V$lQÅúå®Íè¸MQöOþþýû{ö ÙÆªG¨Ïkׯ_ß½{weòP–HاëÖ¸·HGôT÷ˆmüM¦Þ³¸¬êjñð/R$ìÐ`òÇâ/{‰Ïæd^n5õf'ŸÇ±Á³ýçÖ'¥ïsâž²aiiijjÈkMš4¹páÂåΗ\¸pá…^xë­·K @)UÌû~ù—[+k¶Þ2Qãïì÷ô1v ó*ŽÄûHuuà1MN¡m3¹¦qBèЙZ/n«ãq‹G0; TªŸ±Ûoìw%К•´¶‰9óœ+åóÿâ˜9sfüøñÿþ÷¿Xϗк¼üòËòUƒsss‡ÊŸ’?v8òq¸®pUW(ñ—ÎvÌß[}X:n&¦Ñçúu6dÄÐO+Äëÿ½ô òá|Þk²ÉÅÑûêü)p…˜¹‚ ”¶l+söÔy…­[·ªú§À´q…î †œÌ¶ fé©«öÏv,8ïwÄÐO+ÄÇ^~ùå:K¢ÊÂnÛHiii999iiiÒ‘âââÞ½{Ÿ>}úr/),,5jÔ?þñ!C†Ôó](Uö§¨§_ªÎu®t³JéH]Òïí÷¦éRü €3»úՈ߈ ¿ÿ#MkÅ7#ˆ,ï¸÷ý‹ƒ} ~…$¹fN‘¿ämÇgÙ¦Á6Áüˆm‚ô­.GÊ•<ÊövëÖmß¾}ò#999]»v½ÜùEEE#FŒxã7ê_ ¨#d­{ë;åKäÕ`}ÚóISQ ‚ʉ9?IÕ m–†j"ˆ¦gÑ”&ÁÀ[-ÄB j­tÍžOšÒB×D:âÝo;}ãÙÉ1+¥)[Ž=záÂ…ò# .;vl'Ÿ={ööÛoíµ×\ç êTɪß/ÿrµû;ùô¾Æ®Ï'MMla^ ~ÙxQ¡×u38D©Ð£f«7ìPê×T—üÇä‡z¯‘ŽˆD\êúæCçò*æå˜€r”-§OŸ¾mÛ¶Y³f•–––––¾òÊ+;vìxä‘G¤äÃao¿ýö?ÿùÏ#GŽT4%€È:ã?ÿ·²y?W’ŽDo|;fFÙôt5OZ`ŽR–w<PŠõE!âBÖ=r¹œµN¸´Yðe¢ 3lÇ[ ²MƒwWxµì£bÿyމ(DñÙw'Ož|úé§7mÚD2dÈ[o½•‘Q3[>¶Î¹’¥¥¥ÉÉÉáßs—œê#óœ+=¬J:bÌØÆ_cÈä—ÀUðÿêÀcšžexôi¾ù@\òþóUv&¸v€~ÜÝB¿›øæPOû«Íu®t1tÄDÚÆôJèÌ1+Ð,åJžx(¥PBô‰„­soYëÞ*&š®oñ¨íÎ&:l² 1Ãû¯¿±Ó…ǺÑwꮿ™o>—üÿýÚ¿qMà1Ílo˜þ$×t®lëÖ­7Ýt!ä‚XþŸò¥y¾šÕ)!·%^‡e% ®úp©X]T .¹˜ç_ŽÏ׸·È«ÁþÆì瓦¢„ÂJÎHÕ !»7×t n ½úJ{™°¼ã¬ìÊÛð¨ !©‚ý¹¤)×›zHO1B6x¶¿ºŒ@LCApu |g^-›{À{\:¢§º»-Ã¦ÙÆ¨^:(ßR@%j5Kù BûN5{ˆDMN¥m3ƒcbîÏògq·•3PýTë˜û¬#u²Í¹ÕG_+›Wä/á˜@¤  ¸ ?VíÝ±àœ¿L:’,ØžIz`pb¿ZgæççG75€+«Õ,åûÑËWþˆ¸¥erBÖÅÝbÂ@Sï§“î· VéÈYÿ…¿•ÍßSucV‚ ^D".wmžë\Q-[uºƒ¡íŸ“j§o}éùÙÙÙQÌ ^äÍ’Êcç/~·­7]{Ôý€Hzô&Bð#+:ÅÎKOán *TgÇuà~–ì~«þйl‰ëk‘ˆQÌ ÂP\™St¿íølƒg»üà¥_Äñ¢»S"Çd îQ‹MhßI ÅÜŸ8&pE—ë¸NlÏ&=0ÐT3ãš²Ù³ë-ǧNÑ­ì" !ÀäûN¿ZöÑaïIéˆê§XGךNK©™Ç%ôìæ\€ˆ5ºw7Áòà ba:®õTwŸu䃡 üêÍŸU6÷¤¯(*ÙD>΄³¥òçÙe .ˆåÒ‘ÁþlÒ7˜z†!¶Z’š¥xü+¿8 Êh:uã–h†Ð­'1Ù…s¬° ðwKˆEŒÙÏ'MMj–/Ëÿáøx[å>ŽY4L<ìà‡}A >æÿÜõÕÖʽòƒ Ómãm‚…WVá[þ™¸;8Z¸v€~½|óð-š+îÞTu7ÒÏ7€FªÝ:—’!"„ 4õžd®':NIAÜÂ>„QU&:ÿáøX^ RB†'^ÿTÒ}¨!æùýâþšï°…/ Q"œ,æì!"ÖᕪgǵU0ÿ>éžá‰×Ën©üùMÇ'±B™Ô"!@m¿zó^)û脯P:b¢ 3ìÇ[ „rL "ÄÃû‰ÇxL-6¡]§ðçDŠ|ù"æ,Oå›ÀåHÓ_‘@„ñ–ÁÓlã¨A:xÌ{êÕ²¹Çe$Ô !@ ó/wm®µVXš®É“§õN¸æª.•››éì+Ð,C·ì#m ¸Ð NKÝân q ¿±ûóIS›ê’¥#e¢óe ׸·ø±#¨>ô½RöáÏv‘ÔŒÏî™ÐéOÉÓZèš^íÕÒÓÓ#š@¤§§“ª*ñÐ~éˆÐûÑCT…¬5úË^âóán ñ¡­>íOÉuMh'ñqûû×ÊæúÎrL àŠP?7x¶¿^¶à´ÿœt00ið1û&jlÀ5“’’®|@t%%%‰rˆ·:ÒäTÚ&ƒoJ 5BûNÔj •ñÈAÜ-A…Öqm¡‰¿³ß3Þ2˜Ê&˜øŠ_)ûh¹k³ø#— @$é¯| @\Ë÷žï\]ä/‘LìØFw1dñÊ @!!ãE{õ%Ób!ºAÈîíßþ} ÷íº\vÃ7^Üqø6¹•®é'ë¤ueD"nðl?è=1Õ:¦µ¾yäÒˆ ô‚v:g—-¨U ^kìò—”é¨!¹]â±ÃR$¼5!£Fæ’ªJŽÉÔ©‘×Ù _Jyt ©·ü`¾¯xº A•P‚FúξV6¯Ö}9I°>n¿{ºm‚™šy}lµ *tdÅÄlð´E+šÖ’o> M´m&Mi |ÞC+¿äš€"ÌÔtŸuäoí“’›t0ðMô«es |g8æP Bбæv\,?~­±Ë_SfôHè‘w©ÿŠÕQ“YQ&=F÷ pC©|5£•N޹(ª{B‡¿¦Ì¨ÕUXè;ûZÙÜå®ÍX€T!hKƒvÁú¸ý®é¶ šÈ17E1G)Ë? (EA ½®“‹G1jBP—ó t>aŸ”„®BP+„ RÇ`þ%ƒ/¥Ìè‘€½¹!ΉûöÜR…¦gÑ”T¾ù€–Ñfi4­U0EöË>®éÔña>Ù ^º¤«ð”ïÌlÇüZû]D BЄ"Ékeó/í|Ì~§Bƒ˜Cjº=º3ù¨Q¿¬qÄ«‹]…w' Vé —ù–»6¿^¶ X¶ñ@”¡ „8èœUöQ¾ï´üx c°WBg…ÞsAUØÙbvº0‚Ý‹k:Dèq­´ë Ë;ÎÊJù棿þúëc=Ö¡C‡ÄÄÄÄÄÄÎ;?ôÐC¼¾Ä¤‘Þù&âŒl+V¬Ù~ðÛíÿôë’½òã'|…¯”}Ù®ÂzþSpÿËÏÏŸ8q¢Ýn·Ûí'N,((s2½DÔòŒo(!žùKþèdòŽA‹rƒêäÿfôXhß™ZlaNˆš’JÛfÆü›Ö…;"dÙ²e#GŽìÝ»÷¦M›G^^ÞÌ™3÷îÝ;pà@Þ©i³Ï>»xñâÊR÷æÇ¿˜n›`ÌÒS²®Âó3Œ²ŠŠŠÁƒ÷éÓ'/////¯OŸ>C† q»Ýa^ÂBE-ÕøFãàŸ’Òxø) ²D"nôì\íþN^ B®5v¹×:¥ hŠx0×÷ÉR¨¿{ŠÐ³/Ç|Ä·úV. ”êzBh‡éÜ :zôèm·Ý¶eË–Ö­[Ë‹¢øÜsϽñƼ‹ 5|& “ƒN§óù|R¿–St-r}õsÕ!ù9ªm¾yXâ4ªû«žÿ|ÿÅÞ|óÍ={ö|òÉ'Ò‘ûï¿¿_¿~¿ÿýïë<_ ¿_Ž”ûñÑCq¨È_2»lA­ŽA›`yÔ>1jƒ‡# ïpeUUþÕK¥ˆ¶É²ûpL@"ô½¶¼X™0æ_±˜ø¼\3Šso¼ñÆSO=U«$„‚ ¯ ûÛßÚl¶¬¬¬?üá•••ãuÏ«©mœÎ?üá;v4›ÍIIIÆ [³fÍŸ’_3Ìûúýþÿû¿ÿËÌÌ4:uú׿þUÏyÛ¶m-Z´xï½÷áwß}ׯ_?“É”™™ùÑGÉ Çó»ßý.--MJéŠï{¹«]¥TEA¤·° –VÿM8ùÚžªRtZ «ðïe R:6»4«K]îßMþ¾n·ûÑGmÚ´©Åb1bÄþýûå'„ÿ1¯xýÆX½zõ”)SäG¦L™²råʾÔG<ÔÙÿ¶ä|Äÿgç÷÷µ:û»Þc½=šƒ¹¹¹ÙÙÙQ{;€Ëñ¯ùÒ¿ý»ÀcFi¨ùÀ;•WýÞôâqݠạ£ø¦Ç:uê´víÚŽ¯°ÝnffæK/½t×]w;wîþçÚµk÷ꫯ’Ë|Ü’N˜0!33óÉ'ŸlÕª•ÓéܶmÛœ9s6lØþ)ù5üïŒ3š6m:mÚ´–-[îÞ½û¡‡š5kÖ¤I“.M^~Á5kÖ<ñÄüñÍ7ßL9|øðM7ÝôÏþsÔ¨Q‡šûì³påÊ•ï¿ÿþÚµk¯zã7ž~úéZ— ó¾á¯VÏ‚püøñÆ {üñÇឪƒsÏ-÷C^›¦k2Ö|˵Æ.u^°–:_”Ò™3g¾øâ‹Òi3gÎi@CDÑû￳¢àÿ4%Õðû?“„~1  ”ªJïÛ³˜£,Ѷ†GŸ!XuêTàU'NœÈÌ̬u©0ïþjõ,322¶nÝÚ¶m[éÈ‚ÃÙõæ7gÔzagCÆDËÐt}‹ZÇëóûºô9vìØÀ‹ŠŠ®øc†¹~D\mAXË¿ÿýï•+W~õÕWaÎAAX˜C±­T,Ÿç\5»l~­jÐLMÓlck-á )þ­›¥j¢»c2ªAP#£I7®fì+Èüc:q¬M›6yy!ƒ/]ªñüã¶mÛ>ûì³’’ƘÇãñûý—\)H¼8ú€òù矗””tèСK—.Ó¦M[¹r¥tÙ0OÕó}k•j)))¥¥—ݧÄëõΞ=ûí·ß–Wƒ„‚‚‚N:IÛ¤¦¦ÊÇ%^Z¬†ßðW«§3gÎ4oÞ\~¤}óÌu÷.¼t½ƒÃÞ¼WË>úÀ¹ì¼?d…‚zþ¾ZµjU+,))©ÏyUí¡RRRjöçÏŸOMM­çË'L˜€mŸ#BÏ;€r³Êõî¾­ÜUkº ŽM}F›Z¹–‚[·nÅV„À+½àÿ¶æKS¡w?¡Ã5h– Bf)tí!È ñmXeè’MíI|‹?ƒ Z½zuçÎá6àýâ‹/vîÜÙ¦M›@xüøqé©äää²²²äädéȉ'¤ÇYYYË—/¯ªª:tèÐÎ;_yå•U«V–Z óT}Þ—"WÑa0fÏž}óÍ7¯^½Z>ÁÌn·çää´lÙòr¯ºô`˜÷ µzJKK;{ö¬¼‡ðìÙ³-Z´¸ÖØ¥£¡í˜·èöÀuÒ΄Œ=Usª Mì?<ñM Wúw“Éû‹ŠŠš5k&…a~Ìz^? CF»uë¶oß¾Ûn»M:’““Óµk×0×¹â5kéÐÊHÔ´®v‡VW1f;jPBìñq[å¾Uî«ÖS] YwY‡µÒ5«ó…Ñ„ÝÀ—å示:˜-ºãš%¨R YêÆÞ-?B*=„RUé_ó¥þÞ‡8gwžzê©¡C‡N˜0A^ÔâñxäcJçÍ›'=îÔ©ÓöíÛGŒ!™;wn­—Æž={öìÙsâĉòª/ÌSáß·¦M›Ö¬Y³aÆ}öÙgÒ}oРA+W®|ì±ÇseID®Ö§OŸÕ«WKs !«V­êÓ§!Ä.X¿fÅâ߸ÚýÝžªƒÒ ^æ[ïþá{ÏO£Ì7ݚطžÿn‹-úË_þ"‡ZŸ ¯ê÷Ҁь£G^¸p¡¼ \¸páØ±cëùò%K–ÜxãáÏiß*¡Á‹¸h†ŒBŒ9è=ñJ釟V¬«U ¦ë[>“tÿ“I÷ª¡àKÜ»KùäÔ©S>Ÿ¯¸¸ø7Þ¬íþ©ú¼oÃŒ=zñâÅ“&MZº4¸ïÎK/½4sæÌ œ?ÞårmÚ´iÔ¨†/i‘«=ÿüóùË_-ZTRRRRR²hÑ¢¿þõ¯üã¥ZèšL·Mx2éÞ¶ú4ù ]̳ĵñÿ•¾?æO“êóïvðàÁ9sæœ9sæÌ™3sæÌyçwþú׿Ö'Èÿ^j™>}ú¶mÛfÍšUZZZZZúÊ+¯ìرã‘G‘N÷:2déÒ¥ÅÅÅ^¯÷ĉ³fÍúßÿýß.yªe(!fäùN¿áøømÇ¢"‰üxŠ`¿Ï:òOÉÓ:jOÂÐ"Û¿n… Y…^×qL žtýÒô,)ô¯Zì0„È™:uêúõëúé§ÁƒÛl¶-ZL˜0¡¨¨(''8^wΜ9„nݺuîÜùÀò¡É“'?ùä“?üprrò Aƒß}÷]éÙ™3g®X±¢W¯^6›màÀ~¿ÿ³Ï>»âS’0ïÛ`7ÜpÃÆŸ}öÙ·Þz+pñuëÖ-^¼8++«Y³f¯¼òÊ3Ï<Óà‹Gäj7ÜpÃܹsßzë­ŒŒŒŒŒŒ·ÞzkÞ¼yýúõ«uZCÖŸ“žn›*„¬ÔzÆ>qZ›Ä'2nºkPø·÷ßß¾}]ºti×®ÝÚµk7nÜØ¡C‡úd¨ÄïEÎf³mÞ¼y×®]Ý»woÚ´©ÖäOÉ /¼°hÑ¢îÝ»›Íæ:thëÖ­Uh¤xXŸ«ŒÆ½R±|{ëÖʽŒ„ü¢Ô0,qÀðÄ TuƒŸ±!ðâûòSñ§Á@¯7üî´ipÑ4KP!y³dgмï¼N.®Z¡»þÝè‰üRP—jæý¶r÷z÷ÖJV-?N íc¼f¢eHªPÇÌ[|NŽØv"4ô8VŪ7zvlðl÷²5Ž"Ühê9Æ|‹]¨ûk$îGRVD€hc'Žz?šC¤m¾o£»e˜ô,š%¨P­féÿzµÿ»Á€RÃŒ§ä݆P&:׺·üP¹÷ÿ³wçM”ùÿÀŸ™É¦½è}P(å¹ähAdTô« ‹²ºêа ºë¢ÀªûEWÐßîªðY\•*§( Ö r-…B[ …¶ôLÓ¤I“Ìñû#%„i)Ó&MÞ¯?v“™É3Ÿ|ú`çÓgžgø›ÿJ.£¤“ç«Æ*¨›–-Áu²Ç@Aè :ºG²­³Ëx¨¡­•cîSgDJBÚü €÷bYëú7…êJÛ;*4\úô2Â0® àÖX­Öuj›§P¡Ò§—¢´p«Éj׆Ðeì¶-ü¯¿4¿‘J¥‹þBõ riDnŠ'BNÓ©ÆÃ ¼¡Å®þÒØ9ê)Q7¯P ½ BgPz†"ë•oM?Ÿ±¶øYÊ)éDÅðߨÆÉ©Þô<z” X?ü‡p¹ù‘Á”ÆWºø%¢P¶8 ÝÜPÛÝÒØhywil¾À¥ã%þ‰8}ì5€73 ÖÚ^o†¤Hc')G ’%º*6 BgPöjá›Ï~o:r¥Õ 4¡Ç*ß­šà¶+Ǹ þh6»ósû[Éà éÔA.Œàöñ'a³¶ØßJ˜G§wa<×ï0þp¤)¯Åªì„ID¦rôy ;­z­î+yðBp™&ÁrÀôË+uïoÔïh] ö—ƾäÿØÃ>ÓQ 8'èØ}»ìoéä¨ÁÐCGÒ )ö·ìî,û€!ô˜ .üñLHHP*•J¥299ùÑGÍÎÎvI0”ØCÄ¢7(n Û·oïÛ·/EQÓŸÖÌ÷¹ûÕ€ÇÊZ>fð[þ¡þËW´ïkúÙ$˜;Fë&¶gÖÇÆÆÊd²ˆˆˆŒŒŒ¬¬,ÆãI†ÑÉh{ÀÈ‘#çÏŸŸ‘‘k0Ž?þ /Ìš5ëµ×^sUH= ·Œ:ãÿž¡“ÊØªšŽ1çµx® !„"Ô@YÂ]Ê1ñÒ(—Ä&.LÖ‚žÁŸ?Ënþ§ý-s÷}Ìè íŒn nÈy·ä~ØÇ}·»ù EI=??ßñSοf{?—n"•J<¤T îUèw»ý¹ Dȳ}m̾Ė·Þ«¡Uw*†MRŽPS-—C€q»³¸Ÿ5¿¡iéSKo\:x áêeë¿Þ!ûlDD„^¯ÏÉÉY·nÝ·ß~ë|—c›NÎûøã-X° <<üøñã>úèêÕ«çÎÛ:xÇwïÞýôÓOòÉ'&L „œ?~ܸqï½÷ÞŒ3 |ðÁ 6Lœ8Ñö© dffΘ1Ã×××Þ”“ó:o­½‹Ø»Ž92cÆŒuëÖeff ‚°oß¾E‹}ûí·#FŒh/ªô¼ñÞ¿=’òû¬Œo½·¯$lŠräXŸÁsïŸ;jÔ([äŸ}öÙš5krrrâââ:“Þö~.¢Óét§OŸ~á…222^ýu'G^°^¾`½Ü1tM’4:IݵÏâ–QgPº'³`ù©éÔ÷¦£u|Cë½ÁLÀ$ÅðqŠ!-þ^$\-µþkí«ä;3™©w»6$€nÂíú‚;òcóüí£G(•Êúúz¹\ÞùhµÚáÇ“Ž BFSVVÖfÝâdW{×{-ÎûÊ+¯¬\¹Ò¾÷믿^¹rå‘#Gœ4¸iÓ¦uëÖeeeEG7_©Ï›7/==ý¹çž³½Ý±cÇ¿ÿýoÛˆEQk×®]²dI‹¦œœ×yk,ï½÷ÞÌÌ̧žzʾeýúõ´-¬ÒfTmbî¸åì^ãO•\më½ú+Ú¨Ë~+û¢üúåÙÊ•+‹ŠŠ6oÞÜá×lÁñçÒæ·s¤“ {ÇfffîÝ»×ù ánãáÝÆÐÃfªÆÏTµ;³Ã9Ü2 ½I߸Ûxø/uë>oü®u5ØOþûæ»Fzp5¨Óé\x4žgwü×^ R}˜‰Ó:üº%¸¡ÎtKfêÝ7–J²u~ü!¸ûµ¸ô¤ض455­\¹2%%E¥RQÕ§OŸË—;5“ššúüóÏ—•µ±Þ‰“]vÎÏûûßÿÞñà;î¸ãÂ… NZ{ûí·÷ìÙsèÐ!{5HÉÉÉ™5k–ýí„ NŸ>m{ï½÷¶nÇÉy·ÖI'Ož¼ûî›þê7kÖ¬'N8Ê‘-oû˜0êõ §¾ydKÕñ+-ŽÑô У_¨ûÇçûêy=!äá‡þþûïí8ùš·Ô§œ| Û•••[·nÍÏÏ_µj•óo á ck!telÕ÷¦£ÇÌù,áZì¢5Dž’©+ñŠ?ëæå奥¥¹: ðXÜáï¹owÚßJ<å¸@{Ð-Á u²[ògsÙÿ|d+™õ= sb»QbbâîÝ»“““[ï²_w-^¼¸  `Íš5IIIjµº©©I©TÚvµ¾6ãyžaÛÆ’’’?ÿùÏß|óMLLÌèÑ£ï¹çžY³fÙêL'»:y^Žãhšn3àÖ_Äb±DDDäææ†‡‡;î’ËåËMOx§išã8û§¤Ri‹¦œœ×yk!T(:ÎqÌÖl6ûùùÙæéµU mæ­ÐRºÏtätÓyŠn9d'¡˜Ñò´qTz¢¬Õjíðk:ù¹t“ƒΟ?¿´´ÔÉ1!ìTËPJ¡ t9£ÐtÂ|îˆ9÷¢õj럄„b†ÉR§«Æ†1.ÀãõuÖ¬&×//è!#%÷=âÚzûŸø³¹Íoä éâ—(_?—FäÉüñ¤¤¤çŸ¾õ.ûuWddäÑ£G£¢šWƒ;{öì€l»JJJüýo<§¸¸8!!Áñ‚Íl6=zô£>JKKs\j¥Í]9¯ó[UÛܾqãÆÕ«WïÚµ+%åÆŸÕ‚ƒƒ[W‰NZs¾ñV[ksWtttvvvß¾}í[®\¹2~üøK—.9oÇÎIÞüb?<óiëeÿlêÏV?>âFÈø2>N¾¦“öÛüvNBíä…½^¯v¾t æv†¤;/aØ\KásÞYK1GÚ˜ ¬¡ÕÃîT ó¡U=€§âv~a¯‰JÍLÿ­KÃè!̬ø‹…¤ÉD!æ&nO–ä¡G]”ÇZ¼xqFFÆìÙ³m«‰´Éd2) ûÛ7Ú_'%%ýüóÏÓ§O·oÙ°aC‹Ëåòôôôôôô9sæDGG;„Nv9?o,X° 88833óÓO?µ¯y;iÒ¤;vüñ¼–íDimèС»vírœC¸sçΡC‡v¾'yk¸T÷€zê]ʱ/ß3ü©‰¼â¦ú§ÞøÝ—¦mzø”åü@i‚„jcÚÞ-ý\D)lrrrËø6ÝNæ=0‡º¢”­ø¼qß‹uï}¨ÿ2ÏRغ fPg® xz†j<ªAñ§óço,.ùͽ”ZãÂxz ¥ñe2o¬/ÊŸ9ÅŸËsa<ž-55uÍš5cÇŽ}çw Íf³^¯/((xë­·ìÇLŸ>}ñâÅ×®]«ªªúûßÿnª²Y²dÉ¢E‹~üñG£ÑX\\ü—¿ü¥¦¦Æ¾w„ [¶l¹zõ*˲׮][»v­mmOç»:sÞ®™9sægŸ}6wîÜmÛ¶Ù¶,_¾|åÊ•›6mª­­mllÜ¿ÿŒ]_ÛV”Ö–.]úòË/oݺµºººººzëÖ­¯¾úê‹/¾Øù:Ì›/­>¶æû†— "(…–Ãï,áb~ÓÿŸ Û–Õ½»Q¿óœµ¤EI'úÏ¥…iÓ¦íØ±£ªªÊjµ–••mܸñ±Çë¦UL½ B¸•\íNã¡—´ëW×o8`:Ö(˜Z@ª¿4ö¾÷­ôô5c:”íêÀ™ŒÜž¯ìïèØDzðˆÎÝÜÐ-uKfÔxª_¬ý-·k1›»!( „ùóçïÝ»÷äÉ““'OÖh4aaa³gÏ.//ÏÍm¾qwݺu„$''Ÿ={ÖqDèÁ|öÙg{ì1ÿI“&)•Ê>øÀ¾wåʕ۷o‹ ^µjÕŸÿüç.7.Jkcƌٰaûï¾ýî»ïnܸqäÈ‘o¡“yû×ÿ¼¼ýì?SW~ê+sŽ"-ïí4 MGÍyÿÐm}UûÁnã¾1}n©ý.{ñÅ7oÞœššªR©FŒ±gÏž¬¬,ÇQhè2O˜}‡9„ÝÍùA›p&h˜¼ÿhù  Æ¿Càv±_nåO\_Ý["‘>ó"âÒˆzšPYn}ÿmÂ5/]ÆŒ™È̘íÚiŠ5^2ëþ.´ƒn n¨ËÝ’Ýö ÿë±æ7R™äwÓñIbF å~1çç4®äjÛ;&ˆñï/M“%¦JãÚ|dt BgPvA-§;c-Ê·Ÿ·^joÄŸâK«GÈŒ’§õ“„õdxÐŒe¹owr?²„P¾~ÒÅ/¹Âùç<Ÿ±ÑòÎÄx}:E12˜)¿Á½£.Q–m:sÜr¶½ G„%K‘Æ”ÅÅо=ž@Aè ÂNêä` !DJIR¤±£åiƒåɘ"à*BMûÙÿ åW7J^H§rUHn…?ù ›µÅq ÕOòÀ|*0ØU!x9û$Ã_-–ö‡!AŒÿ Ybš,1QÚ‹Ðt BgP:WÇ7ä[Šò-ÏYKÌ‚ÅÉ‘Â$Jû*OQPò‹ZãOawo#‡³ ÃdÌÀD)€;°—ûaáùå É=séAÃ\VoráÂ…µk×~ÿý÷eee„~ýú;öÑG7n\Ï#ú;\":‰aûöíÏ<óÌÕ«W !Ýg'S!bÆl-;fÎ/²^á ïäH%ï/‹( ‹¿xªð£>Úºu«N§kIiié’%K¾ûî;BHffæ»ï¾Û·¯­r‚Ðwø×înx"\e¯åZ s-EWØ çÙñ¥Õý¥qƒd‰©²8%ê@‘dgg»ä·)xs»ãsþôqÇm”Éó¨è¸ÛiÝÜÐíwKáÊ%ö³M‚ö¦ùKô’Y~©9óå—_.[¶léÒ¥wÝuWxxx}}ýÁƒß|óÍ_ýÕ%WVÞVÆÇÇòÉ'cÆŒqm]8ì–˜ëyë¥⪨z¡º’ýïFáZ¹ãF:>™¹ÿw”KÞ$))iÏž=‰‰‰Î‹‰‰Y¾|ùý÷ß_SSó /ÄÅÅ­Y³†´sõeß8{ö옘˜gŸ}6""B¯×çää¬[·îÛo¿u¾Ë±M'ç}üñǃ‚‚,X~üøñG}tõêÕsçÎm¼cƒ»wï~úé§?ùä“ &BΟ??nܸ÷Þ{oÆŒ>øà† &NœhûÔ‚ 233g̘áëëkoÊÉy·ÖÞej‹]GŽ™1cƺuë233AØ·oߢE‹¾ýöÛ#F´U~^E=ôÐC£F²EþÙgŸ­Y³&'''..®3ém¯ýÛQÎUçYŠ ,%¬—¹ë³ ÿüòÕo8¶¹ÿšû?Ó'$0F/ê' ×ÔÊÆ ]Qál¡D¾¤P¸Xt›ŠˆŠK c;øG×îgq˨ÞPVrµÙ²kY1{µ‚­æIÇß×—ö(‹ ï/‹UQX¡¾§a²t_XÀmûD0èol¢(fôæ®ß‰DÄ¡[‚¿[²Vî›Ü‘ÃŽƒ”ZÃÜ÷0”*æ‰z9¥RY__/—ßÂ4K­V;|øðââbÒQA¨ÑhÊÊÊÚ¬[œìjÅy_yå••+WÚ÷~ýõ×+W®ítTŽ5*==}ùòå­oIu²Ëþqçç-..¶ gÙhµÚøøøºººÖßÑÖàÛo¿}ìØ±7ªÕ7îNLHHØ»w¯}€T«Õ¦¥¥Ùü¤(ª¤¤$&&¦ESNÎë¼µN„ÑÑÑÙÙÙŽËf–––N˜0áÒ¥KíEÕBg~^­¿HqqñøñãËËË;üšNÚEQßs ,%ç­—m‹”¶.y+÷qÌÊ?”½f{«¤äöÁÃi_Ûp ÂNµì¥”g„!•\m [vÑZv±ÓÀ„%•DÄI£b%‘qÒH ôBu%ûÙÿ eŽéø$æ¾ßQ¾~®Š Àc:-ûùfáÒMÃTd?É\<¨BwïÞœœÜz—ýÊjñâÅkÖ¬IJJR«ÕMMMJ¥Ò^W´¸úâyžaÛÆ’’’?ÿùÏß|óMLLÌèÑ£ï¹çžY³fÙ N'»:y^Žãhšn3àÖ_Äb±DDDäææ†‡‡;î’ËåËMÏâ¢išã8û§¤Ri‹¦œœ×yk, …N§s³5›Í~~~¶yzmFÕBg~^¶¹ˆŽ0™L¾¾¾V«µÃ¯é¤}ÑÙOÚ(˜.Z¯^dˉùíC‡ÓA7æ « Y“Öÿ.ÿÅÖ§ ) Ž“DÍ© ;t¢;"ì÷,ż n‰7–sÕ\M[eû_çë‚ÚQ„„2AqÒÈ8Idœ4*œ ¢Æzþ×_ØŸßô˜Ašf&Nc&ßEzdÅ9GùH.â~>Ä}³ƒpÍë e¥Ö÷ß’Üý=d„kÃs¹I“&íÚµ«Í‚Ðî‹/¾8zôhTT”ííÅ‹í»üýýëëëýýýí[JJJì¯ccc¿úê+³Ù\PPpôèÑU«VíܹӶԊ“]9/!¤E¹âœT*}ë­·&L˜°k×®””ûv__ßÖU¢ã§Zotr^ç­uRhhhUU•ãaUUUXX˜ó¨9Ï›]yy¹ã`yyypð?‘8ùšlߦ ·Œ¶IM)Ód‰i²Ä‡Í)3 a°mÕE¶ìD~Q@rÛÓìyÂ_a+¯°•e!–ÄÑ>2JâK«}(µ†Vih•†RK)×AT\‚KÎë ÂbÌÕ\]9WSÁV—s5\u Wßù+(Y¤$$AÒ7^Ú7NéCc½Aw§Óéüü0Èm17±Û?ãsoúƒ%ÐGòÀ|ª_l·žÝÜP÷vKŠbÆL¤ûƲŸÿŸPwýA…f3»íºàŒäÞ‰BÙ]§v{‹/ÎÈȘ={¶cmÐB‹¡¤7Ú_'%%ýüóÏÓ§ßëØ°aC‹Ëåòôôôôôô9sæDGG;V}Nv9?o,X° 88833óÓO?µOX4iÒŽ;þøÇ?ÞNËv¢´6tèÐ]»v9Î!ܹsçСC;ßB'ó¶uëÖ—_~ÙñmFF†ˆíÛˆ>–5sæÌO6²eê´(IèÅPBÈC;Ï»çá1ªñ—ÙkÅÖ+mެEÉŠ¢lƒŠ,!:Bt¶í*J. Š`‚Ù pIpªñâ«k„ÝÂ,X*¸šr¶º‚«.c«+¸šÄÙE¨0&0V/‰Š•Fb°×)--MKKsuàv„+—oº0%„BÒ3¦è–à†z [R}£¥O/cw|ÆçÞxP!æWkÙåøCŒÛJMM]³fÍØ±c—-[6sæÌ~ýúY,–²²²;wÚ™>}úâÅ‹ÿþ÷¿Ó4½yófÛd6›%K–,Z´hÆ Æ «¨¨øè£gñM˜0áñÇŸ8qbXXXMMͺuëlk{:ßÕ™óvÍÌ™3ûôésÿý÷ÿãÿ¸ï¾û!Ë—/ÏÌÌT*•3gÎT(GŽY»v­ãcn‰(­-]ºtæÌ™þþþ™™™„ï¾ûîÕW_Ý»÷æ¿u2oçÎ[·nÝ<@ùüóÏßÿýììlÛï&øÃÒÓÓW¯^ýä“OB>øàƒcG~ùè_ªUjBO„ ¶ú"{Õ6~XÉÕ:¯GBS±õj±õª}KÚ/\ɇ3Á’à0&HNu0$ë1€÷° lÅõñÃr®ºŠÓÖòõ¬ÀuüÉÎÑÐj ¥ò£}|i?Zíw½Vô¥Õ¾´O›+‰  t†¢¨C¦ Íc}͵Ÿ^hñgf#!LÆ/ö³ÛÊý@ÚÏö÷DàV¬X±bÅ WGÝK¨­Š øÂþâbî`Â:Ї¾ãNfÌD®]n nÈÅÝ’ç¹Ãßó¿ü$è´©PÒñItB •ØŸ èÓ#ÁË࿖К@ˆŽ××rºZ¾¾¶ùÖÂúZ^WÇénçvÓ6I)‰†R;Ž(úÑ>”C½¢ ,--]²dÉwß}GÉÌÌ|÷ÝwŸÎÙŠ¢ž¨~CÜHT”"ˆ füƒhÿ & ˆñ¦ú0~˜õ„[2<–ÅÂ_)ŠÎóg„ªk,•Ñýb©„d:>™Šìø¿fÝ ÝÜ›tK¡®V(>Ïç ÏsO3sDõ ¤â“é„d:!Å›ŸdèÁܤ[Boašj8m5W_Ã××pÚ®¾š×Öq ¼¨…â¿‚_öü‚Ð`0 ¢ö¡|4”/QûP>>ÄÇ—Rû ¥RB#!2™ˆ±CôŽn žË,Xëy½í:Þ ëyýï5³º©[ŠùpŒÛ”ŸŸŸžžî¸eРAgÏžuòáòEþòEBÈÃ'„X Ñrãx"/)p+ž¿cwø{WGÑBÇõË V !„˜Í„ç ˆÉD8–ÜØÎ¶¦8–X,Ý2J'ö§SèØ"Åu€ (*²/Ù—Ü™I,fþb¡PxŽ/,j«o­“Q0Iue§®édrÛˆ"¥TâP(Je#!„4?ƒalÛ©ëÇ;ƒ§ht~‰ƒkI "$è¦mÊßwÛéÜèï2™¬±±Q*½1¬gµZ}||Ìí¯ÝÇíßËØ+_½Îü×gz$FðR”†ŠI°Í ¤ü\NáoÞà†zu·´µ¶Ê¿TÜæ# Ä"_½ÎóoíBAÈœá ÎHï}¨Gp Ï¿e4  ®®.44Ô¾¥¶¶¶Ogú¡SÒ)Ùïý¸{»?@èm¤R"‘B(…’øhšgéh|‰Ú‡Rû/¥ö¡Ô¢Æ£D û ‚`4Fƒ`0½®yn³¾4„F=ÑëÛã.¬VÂZ]+¸fòônj٠œ>}ÚqQ™ÜÜÜÔÔÔ?HÅÄ12º12è>ÕñS¼†’É !D&kž!£PŠ¢h†ÜØ.!„P ¡(B3D.ïÞ°nEQj Qk¨Îon"==}áÂ…O>ù$!äƒ>ظqãéÓ§Õju‡Ÿ€[åFOf×h48vìXtttttôñãÇ÷ïßj ›¸Ñ!ô$7!€ž„‚ÀK¡ ðR(¼ B/…‚ÀKyBAXZZ:gÎ_____ß9sæ\¹rÅÕ7:yòäSO=åïïOQTë½è¥Ðó>\«ÕtKpµµkמ:ujóæÍŽ¿ÊÑ-ÁUZ_RÚ‰Û-{ýá®]»æÍ›ç¸eÞ¼y;vìpU<­¡—‚K¼ýöÛŽ·—$$$8ÞO‚n nB*•2 c{n .têÔ©?üðý÷ßo±ÝܸݲׄùùùéééŽ[ töìYWÅÐz)¸ƒ½{÷8ÐþÝ\N§ÓÙfº>ùä“¶-è–à*&“iÞ¼y7nÔh4-v¡[‚ ………I¥Òððð‡~¸  À¾]ÜnÙëo•ÉdR©Ô¾Åjµúøø˜ÍfFÞ¬õø>z)¸\]]ݘ1c>üðÃñãÇÛ¶ [‚ 9Ž]gffîÝ»×6Hˆn ®òä“OFDD¼òÊ+¶·Ž¿ÊÑ-ÁU~ûÛß>ÿüó#FŒ¨©©Ù¶mÛš5k¾ýöÛÁƒ±»e¯!ç*++ï½÷Þÿ÷ÿþŸ½p-Ûê•••[·nÍÏÏ_µj•«#¯¶cÇŽüüü¿þõ¯®à&;vì?~¼B¡ˆŠŠZ¼xñŠ+^|ñÅî8Q¯/êêê·ÔÖÖöéÓÇUñ´†^ .TVV6mÚ´W_}uÒ¤IŽÛÑ-ÁåBBBzè¡-[¶Ø×¿E·—xî¹ç>ùäû\ÖÐ-ÁMÌž=;;;ÛöZÜnÙë œ>}ÚqKnnnjjª«âh ½\¥¼¼|úôék×®2eJ‹]è–à&†^UUe{n .Q\\Óâioöè–à&g$‰Û-{}A8sæÌÍ›7;nÙ¼yó¬Y³\@kè¥àUUUwÝu×ßþö·É“'·Þ‹n n"'''%%ÅöÝ\Bhž‘ [‚ÛøüóÏÇŽk{-r·lýo wihhˆ]µjU]]]]]Ýo¼o0\x¯Öÿ¬ÐKÁ%† òé§Ÿ¶·Ý\bêÔ©Û·o¯¬¬´X,W¯^ݰaCddä×_mÛ‹n nÂñW9º%¸ÄäÉ“¿øâ‹ŠŠ ‹ÅrñâÅU«V8q¶WÜnÙëG5ÍŽ;}üøñýû÷«ÕjWÇ^§õ}&öeôÐKÁ%~ýõׇzˆºY}}½m/º%¸Ä‹/¾¸yóæÔÔT•J5bĈ={ödeeMŸ>ݶÝܺ%¸ÄK/½´uëÖªTªñãÇdgg:Ô¶WÜnÙë;]ÓëG kPx)„^ !€—BAà¥Px)„^ !€—BAà¥Px)„^ !€—BAà¥Px)„^ !€—BAà¥Px)„^ !€—BAà¥Px)„^ !€—BAà¥Px)‘ Â#GŽ,\¸066V&“EDDddddee9@µ"nÐI” "67räÈùóçgddÄÆÆ †ãÇ¿ð ³fÍzíµ×šÏG‰|Fèšn/ÏŠ‹‹‡®Õj›Ï‡‚À=tûB©TÊ0LwŸnU7„:îðáÃsçÎ}òÉ'·‡……I¥Òððð‡~¸   û'º¥ ´­ãïïçwj4š+VØwÍš5ë‹/¾ÐëõÇŽ1bÄwÞyêÔ©îˆ: t›ÊÊÊ­[·FDD¼öÚkíóÁL›6­Ã¦pÓ)x3Qkµº}‰—ƒΟ?¿´´´Í½•••ñññƒÁy#XŠFDH¦¸Oq!Ÿ"B2E„dŠ ù’).äSDH¦¸º/ŸÝ¾¨Ìðá몪ÚÛ‹^à*Ý^æä䤤¤´·÷óÏ?;vlwÇ­‰\N›6mÇŽUUUV«µ¬¬lãÆ=öØš5kl{§L™²mÛ¶k×®Y­Ö’’’Õ«W¿þúëö½Ð“D¾õàÁƒëׯ?tèN§ 3fÌÒ¥KGeÛ{àÀõë×>|X§Ó…††Nž<ù¥—^JNNî8JÜ‚,$S\ȧ¸O!™"B2Å…|ŠÉò)"$S\Ý—ÏÞñsB’).äS\ȧˆL!™âB>E„dŠ ù’)®^¼¨ ¸'„^gùòå®Á£ ŸâB>E„dŠÉò)"$S\ȧˆÌÞ¢wŒäbļnÑèt:W‡àQOq!Ÿ"B2E„dŠ ùp(½Nii©«Cð(ȧ¸O!™"B2Å…|Š(;;ÛÕ!xäSDHfoÑ;nÅÄ-£àµpË(ˆ !€—BAèup?·¸Oq!Ÿ"B2E„dŠ ùVèò)"$³·èsó0‡ µ¼¼¼´´4WGá9O!™â꾂¨wZ(ÀkaQ B¯“——çê< ò).äSDH¦ˆLq!Ÿî¡×éׯŸ«Cð(ȧ¸O!™"B2Å…|Š+ôˆ ù’Ù[ô޹y˜C^ s@d(¼ B¯ƒû¹Å…|Š ù’)"$S\ȧˆ°B¸O!™½E‡9„­ét:???WGá9O!™âƒé{Gœ¢Ã¢2 2„^37Ä…|Š ù’)"$S\È'€ûè·bâ–Q€Ö²³³Ççê(<ò)"$S\˜CØ;âæ€ÈPzNçê< ò).äSDH¦ˆLq!Ÿî¡×)--uuùò)"$SDH¦¸Oa…q!Ÿ"B2{‹Þ17sÀka!ˆ !€—BAèup?·¸Oq!Ÿ"B2E„dŠ ùVèò)"$³·èsó0‡ µ¼¼¼´´4WGá9O!™âƒé{Gœ¢Ã¢2 2„^'//ÏÕ!xäS\ȧˆL!™âB>Ü B¯Ó¯_?W‡àQOq!Ÿ"B2E„dŠ ùVèò)"$³·¹ |¸V«%„¼óÎ;'NœØ²e‹}ï#<2räÈE‹u%Vðz,Ë^¾|9>>ÞÕô´^¼Ê¨T*eÆöz×®]óæÍsÜ;oÞ¼;vtw à÷s‹ ùò)"$SDH¦¸Oa…q!Ÿ"%™<Ï[­V“ÉÔØØh¬­­Å#ïÅÕ#o:îôéÓ/¼ðBFFÆë¯¿N ÍÍÍ µsíÚµ!C†TTTt%FZÑét˜“)"äSD¢$³¸¸¸´´Ôö:"""999//¯®®nüøñ4í]«cv_A$éŽF)в¿ÎÌÌ\±b…íµV«íÓ§ã‘uuuÝ€ÇCõ".äSD¢$Óqº Á`à8®®®ŽçyƒÁàëë{ûíé¦[FA¡²²rëÖ­ùùù«V­ºý6©¶¬X±Âñ¶“¼¼<ÇdÇ]ޝu:ã6Z@ h- ´€ÐZ@ hÁ [p\~R¯××ÔÔðE„dŠÉò tìØ1ƒÁ`ëããc{2`À€ÛiÙd2]½z511ñvCì)½xQ™áÇWUUÙ^0àôéÓŽ{sssSSS»;p„ßÁâB>Å…|ŠÉ’).äSDŽ# pûO‰’ÌO˜°‡·¿®LuuuEE˲·ÙŽèö‚0'''%%ÅözæÌ™›7ovÜ»yóæY³fuw  Õµ¸OÝ~2A°Z­mî2›Íf³ùv¯­­å8®²²òvñ "„Ó¦MÛ±cGUU•Õj-++Û¸qãc=¶fÍÛÞ?üá999«W¯ÖjµZ­vÕªUGŽY¸p¡¸1@ogµZÜ$y;ƒ„V«Õöñ²²².7â1D._|ñÅÍ›7§¦¦ªTª#FìÙ³'++kúôé¶½æÀÇŽ‹ŽŽŽŽŽ>~üøþýûÕjµ¸1€sxr‹¸Oq!Ÿ"B2E„dŠ ù€Îhq¿h ]n¹¶¶ÖVj666Ö××w¹Ï rA8iÒ¤¬¬¬šš«ÕZ^^¾mÛ¶Q£F9óÕW_544444|õÕWÑÑÑâ²?ËD|Š ù’)"$S\ȧˆ0çM\ȧˆn?™ÝWÖÔÔØ_c°w¬Þ‰UF¼Êµk×Î;×Þ^š¦»öxzžç³³³9޳½¥(j̘12™¬ëöˆ^¼Ê(À­r>Bh{<}šÕjµöj"ByyyÚñ(Àí8/IW'$×ÖÖ¶ØR^^îÍw#¢ ô:¸9^\ȧ¸O!™"B2Å…|Š+ôˆ ùÑí'Ó± ŒŠŠJIIIHH ²oìÚ4BÇ „6f³¹õFï‚Ðëà;âB>Å…|ŠÉ’).äSDX¡G\ȧˆn?™Ža```xxxß¾}פìBÍ©×ëÛ|€aUUUׂôW]”––æê< ò)¢ÛO¦Åb¡x>äÚÿÚJ¥QËGõ£Â#}‚Bišæyž\<½\.ï|›Ž#r¹Ü^ÆÛŒ¶÷BAnFü‹Îõ¿xNn2BHeK¡iÉÜß«Õj½^o;Êd2ÝRA¨Õjí¯£¢¢Š‹‹ííˆx¯ƒ[F½N^^ž«Cð(ȧ¸O!™"B2Å…|x-£ÑxôèÑœœœÃ‡·9X„ÜÜÜ_­~ÿï1ù'š«A;žg?ßTwãöΦ¦¦ÎŸ]Ç…ICCC%’æá1Žã:\ÃÆS¡ ô:ýúõsuùò)"$SDH¦¸Oa…q!Ÿ"j3™F£Ñh4šÍfŽã¬Vkccc‹L&“¾¼,ú࿊+m·ËqáÙßûi«mïn© 4öNÈd2¹\®T*÷v¾)O‚‚Ðëøùù¹:‚|Š ù’)"$S\ȧˆ°B¸Oµ™Ìõ[}}}Ë®•:~ØGc;O35±IÌwвm¡86)ÿÍq­tÎ~£)!D£ÑB Â[jÊ“`!ô„6 B¹\n{˜„P]©úïÚtcذQãw.ýuDdDz:Ánÿ/Bˆ¬ÉQZt56YÄ‚ÐkGQ@Oh±v‹V«­©©áy>(((I%§þ»‘6Þ¨ë‚Ã/ Î1’™ŒB¿ƒ©®ä²ØöF^ºP#bAèµëÊà–Q¯ƒ›ãÅ…|Š ù’)"$S\ȧˆ°B¸Oµ™Ìõ›Õjµ=@‚?—'lú'q¨«"ú Å1BˆL&³md&M#*µíµ„cû^,hjj¡3ñ´XQF£V WK•+”zmAHu2ƒ®EQ½#N€ž¤Óé0'SD^˜O“Éä8J&¢6“yøðaû².vA•W“Χ®ö+¢bKRÛß'$$ôíÛ×öšËùÛó¥íµ@ÓÇÇL>yJgž<ÑØØøË/¿B|µÕ¡Uå!µ•ÄØHƒ CûU‡÷(J"‘Œ?¾ ß´gt_A„B€ÞÊÛª—îæmùljj:yò¤ÕjíŽÆ['Ójµv¦¼×ÿbrºcéc!$„0£ÆS}m¯)ž¸RÜÉ‘=Ûý¢‘— ÓNd‡\¹Ø<Y[xöÄМ}ÊF=˲ݔ 7‡‚Àë°,›››k±Xz挭+·€ÚJÇjP ¨¢þCJãRl ŠR%—Ë5J¥ºñ†aîœjZvÉܹøõz}XÙ¥˜¢üÖ»&ã€S9Rs“wÞ5Š‚Ðë`憸Oq!Ÿ"B2E„dŠ ùp9žçÏœ9c{ `„-&Ê›Œ‰7Wƒ¯ŒŒ±½õ÷÷Ÿ8qâ˜1c†n[ÆŽ<œW6—ˆÖJŸ>Ö™³Óyq§H;w]ÊMÆÔS?7ét·ò…< B¯ƒìˆ ùò)"$SDH¦¸O¡º—÷äóüùóZ­ÖöZ×=UPëd:Ž¿Ñ‚œ÷‹Ôj±½µUƒ5¡QöœÌldZ›6ÐþVzæ—}9GÍg®°×,BÛ÷|6^«ˆ8þÓS¥RɃ ¤~…8Ä~Œ¾^ñÍWüvžè­P]‹ËKòYRRríÚ5û[½^/uý±ïbiLÇÂØ‹ç4:­ýmãè‰5jÇƒí·‰òD(c«.³—ÙŠJ®¶’«ÕñŸaÂk'))+BTSé¯_Oi. Õ”2€ñ ¦‚ÿIH$Æ™¾üÔ—m®š–>ôœJ‘ÌoÐ7È.Ûv).ñ'ÒCG‰˜÷‡‚¼HuuõÙ³g¥R©T*õ÷÷OLLtuD=ª®®îÒ¥KŽ[X–5jµº»Om/FCèåBûvºš|b&9vÓŸŒRzÌœÚrᜥ¤Q8;l IDATh9µÏ  Ž¦*Çå6?J>ã˜ñD²B (BH£`jdMWI¥ýàAÅ–…e7ŠOÓ„LyrêõsÓì=Y6®÷i¨·m`wgIã)ÿ>í} žçóóó}|||}}5ã‚7½nõ:ÝtW€×B>Å…|ŠÉ’).ä\K«ÕòEä=sÞDa±X´Z­ch6›ð†|Úž¾ÐBw¬+Ó"™‚ ز­i¨ª*³og¦Í" %!Dà[P¹7éÔÁ¸3—ü«-„m¯ešPþ´†’÷¹ãkßxÏq.˜ ¦ÅÁwÿdð×7?ë‚c¨ÿfø5’¦\Ë…O ßüµnýJí¿¿æ~*£.%ݘ”È—r¿mïì-Šg³Ù|åÊ•öÓÐ ô޾ãÁôÐe.\¨¬¬dÙ6jŒqãÆI¥ÒžÉU~üñÇÖyP«Õ#GŽìÖó655ýüóÏ„'~ôÓÖØ6R‘}¥O>ÏQBNÓ©Ýúu”¡ÍÏúЪIßhIx”$$Œ dühBŸ8q‚+»2ø—ƒö…C¥ ‘Ø„ÞPÇëª9mWÃ]*ž±õ4u½Œø~„zç8Ÿ6O¡`%O©‹.»MSóž&öo}ä©S§Z R5zôh…Bq‹)¹5ÝWa!x8N×f5H1›ÍÞSšL&{†áyÞVcF–e%’n, l5 õöjBO›uÔ’¿Ëx¨†«'­µéCûŽ,OŽ–DЭv+Š*Ÿ604 ¦yv×6éÓKýÆHT’“:`Ïöj°A£(™¢¦jÛ¼µIÂþ{†òÅ-F‘'„ž·|º±êÞ‡#ÓÒ¡õhª ±±±·”Î8{ölHHHPPè-;BAÎbi{‚!Äl6ûø´=jäy †Cp†eYÛ[Ó§O»+©Ü>£ÑH ½zñÆ–¸~ë—é«ZÉ:]–a’¢J“F<æ?C©R•³UùÖ‹g,…EÖ«<¹1WP¯¦7M÷{úK­­†”š›_ýçÃÓ´48*@ÃøªŠ–Óæ-—ú¦I†ååå111â®ÔzíÚµÊÊÊÊÊÊ>}útëÒG(½Nvv¶—,©Ü3Oq!Ÿ"B2E„dŠ ù‘N§óóósuîŽçy'¡ã.ϧãBFÃqœ½DÔétâ„-’i0$VKpåUû–O5”±7Íá¤xÆ·¼¿ô|Úy­òô᯷E¤j˱P½Êï—ô)ҀЈ¸êz¶¼–½XaÑ5r7š y.øÛ¯ˆ¼L1Ö¿o¸ãÌM·•šätµÜÌúªL”’o’óVšpuÿ+²ˆy¿0´8% NMMÕh4âžT×È”6ýx²ìJ6™š‡(wõùn¤šBJR'ÍJ»~ÞTÓ…ßÕdµ¹ËÀø|2O+éÜÀ/ò¥|ߢ{Ïž—gìäÙË¥!_ûg+¢[ï’0TD $ÐWèËÈ¥”•ŒfÁhæŒ\C#_]Ïv¦Â™<À:c|?,*Ð-ž-qK{=ƒÕj-**b®• øñ©µ»gýk+ÓNdçwêÔ©aÆ©T·#¯ÊÚ®¦d*>B–) —EI ††'ÎߨÍÊÍ!£~íÓp5/æR¹Œm÷9õvc Ç•ë6Ÿ»xJœ'½G[ʨÛÙH«$5’~ƒDi³M(½N¿~ý\‚GA>Å…|ŠÉ’).äSDX¡ÇQAAAUUóÍ }ûöµ½v,ùT*•Ñh”J¥V«µõ^ÏËçÙ³g+++žxúˆÔÜdßÞ¥™uŸÀ±Üþ½Â¥æÅKä&〓ٹ£&åçç§§§··f¦N§ËÏϧiZ"‘¨TªÔÔTû®«ÕÖoŽëÏ]6BˆÔbM:cIÌ'«Â" *¼‘çšÄ¡/ùþ6â7ŠN®Ê©Q ™$Ä¿]ÕWÊ*MV)/P¾þÁ†°ç/ÿA[WWäŸh U<+ å VŽa‰ŸFe+8äá}$ýBnšÝçããCÓ4ÏßTø±Eüêbêë¤Wkµ%Õ¨  M‰ª±Ž8Û4ô‚™º~'çúÓ!ã/Q£šdÊ_kRj iM‘ˆ@iL˜L&¥!Å…|ŠÉ’).äSDV½Ü&Û“îlGK¾¨¨¨K—.…„„”••ÙfdY­Vžçiš&—O­V[YYI‰;÷«þÆ]y¿éŒÙ¾QQ!tl"»m ê˜m—Òhˆ?{ò|ÚÈÊÊʰ°°6›Õétö”šL&Bˆ@Èÿgï½ãã8Ï{ßgêö†À¢wDaI‰¤ØÔ»lInIlÇrì$Ç9É?÷(Ñ'çè$÷&Ž}ìãØ–}bëÆŠâX¶\$YÍj{'ADïeXÛÛìNyﳘ ’‹Ê÷û×Ì;ïξû`°;¿yZÏhâØ•h×p J*;ùš6Ħþ"›z9ÍLì¥`2=ºãiÈP‡†œœœññq“&ï®.*Ô4wwB ªLËÍÍ­«[èQI’555ÉdREAÆÆÆÔGYš'X³8¡_ï™2LĘt5¥š#›ù/ÿ.ê^P0Ú[•e攄ûöíh§‚7$øÂ¢(M‚^Kê5¤AKš d–‰Ö²³í€:vìr~Ïy[ÒŸ"¢·À`0 ƒÁ`D'2jA¨ÞÖjµ&“ijjJQ5ÉdR«Õ.Û:—¡¡!°ú&ã£Ê /'¨ºa‹ÙœÚ'ú“ŸDQj»(d{\!Ûà„Ív-A¨îÌO¢/…ÏtrSAË ]|eÒpê—4w¤w©¦æL©AÈÊÊÒjµò³Q'&&APŽæççPµ˜XõçuV k' 6úŠb%¨Ëâêá‡ÀP>óý'm_ûµ_Ñ„]­?Þè×¹™½•w˜õl…“]Ìg‰¢x?z)Ò5iëøÚ°[ç›·³KX÷ B ƒÁ`0ÌšGE% ®ö ª·5Éd¢(J£Ñ(ã‰Dbý Â@ HI¬èº¬ &,Y=õÛ€ ŒFcz*IÒO~Ž÷N"wÊ-VÚÓÖfËNÔÖj4š¹g…B"¼1ýhÐ21I½lÓBy_ÜÔì Éâ[åJÿiØæ;3÷) §Ó©´és¹\6[ºDÑh¼¹¢©F£1HûTóòò<I’ÅÅÅ Ã<à½Ç¸–Ó‰¶ {ì…OÚþú# Ð%¤GÿËSÜrä ïÉ2º —²çRYvÊb" FBO1".$E§ÅÀ„8=*LxD¯ìEýóS¥ï½×Buî+9pSÆY$XÞv¬¿àø•Û3³`{flÌ ‚™Y°=3®Ð£ vÂ|BC8hY¾‰5@-ue¸žì)» ‡zµ±™Ž|aüì×0·Û-‡È¦¡úÓ_ä_ø$8 %±ªõìd]}Qy¹2%Á£qe v©'/ÀiåÎ{’Ù'Œˆ…C’Å7w ZBsnç®Ón@)eÌî°f;æÎ¼òó󇆆äô¿X,&ŠiEʲ‹rÍÍÅd2)‚¢¨êêj‡Ãa6›ÕžÆ\Êþ¤áîÇõû/%»O2—_¿«ý©C)ßi™;¹¯%zh«CÉN~°“\ü[oHÔ §aüv¯ÉJ…oîS,,o;ðopfÁöÌ,Øž3ƒ`cflÏ ‚+ô(¨A%%IÒMMT õؼ@:/òÎ"²~“&/m:E®{†B!¿ß¯áâCéÊ™äöÝDaq.€Ã1$#ì9ôŸ~ñ’¼«†¢‡ÞíaŸéIt$¼!AœñYIzA*²'„¼1¤Î=èÍ.²ñAë]zÐįüweœ«Þ˜¡˜†eÙììl¥žÚ!|Ó‚PíAÍÉÉ¡(Ên·Ï;“&¨mšºmšº©=>ïØ‹öž”—õSыպ€éÆ*ŽR"zâhZþùKr?Ûü5i^à%·N†áÑ£G_xá…C‡%“ÉÚÚÚgŸ}öñÇWO˜[­wœÇ`0 ƒ¹9p……YB¥T ÿîë ç¦ „\#¢k$«y÷˜%GS$ĺ±§ßÁ.r¦l&a2Ó÷>œÚ¾F Ù°º; å¬¼›=ÔóîoNµ;’1€ò"H’ÌAÉìCìBm<²HË~]óní&¡i — åCE ›3ñùfSPP B5„ùù‹j˜ÃfÁ“–üßÿÄc áÑS‡#?yä´ ÄVÉáOy8A8û"±Äj2.÷îÝ»ÿþ×_}óæÍííí_þò—§§§Ÿyæõ¬1 ƒÁ`0™e–‡F†‡—ÎÐçOÎ;ßtþDVÓN_v¬ÇV„¡PH‹8ÜÃÊuÏàÕ-ð0-Ž7Öíìi·G£@ ô)ÿkÿû¾,wöõ% ÄF¶bvs=[EBZpJO+ÛÞ§Þ¼$’Ûb±P¥•¹iA¨×ë ‚@iµZ«u¾~ób0Ò÷=*¼þ y¯¡/þG'6F›ËE9-R8$EãˆC€@Gh´„ÆB­¤)—²k‚d¸cbÇé•“Ëk¹Î›[ÿ ‘aAøõ¯ý›ßü¦üÔ¡¹¹ùå—_þÄ'>1KbVœ¹‘Y°=3 ¶gÁÆÌ ؘ™Û³Ìò{ø=º¯C="Lt,²s¡ª¶s­Û÷Å ¦…;ׯEB¡Pé@—ÒÈv›·Ï–D|?ÚÅ ãÃüDÝhÿë¯b”ˆ@ã?y#ð¿>›ÑÍúHI¤“³ïslod«M¤~öá'µ§KÚxœÅµKS¼‡ £Ñ Õƒr§Ä›;!I’ƒ!‰\«Ôê5_¸íâÂ)4š’âÛ»‡‹×÷‹ö»úÍ##,“w%ŠÒÝÿØ.û渱¨Öëò­o}K탮¬¬]`>fùÁ¿Á™Û3³`{flÌ ‚™Y°=3ÈñãÇWz «…Y¼Ñl•äöÊ–ÝcO~žþã?Š’iQ¨è¾ *áú°g"‘ ýÓÙé›pêàƒ ª"ã—B‡âg¿zå¯}ßù^è•÷ã§{øá¤Œ0”Oÿvo:`2+$~íW~[(í|£EÊ1×Mîª{¢cû]õ»´›æªÁãÇKm-0#¶Z](Ë1oÙÒŒ0·šèM»eä¨Ñ„@ô£O+ÖÖEÚ+çº.狆z”]fç]&gÁ½õͲ´EeÞ}÷ÝúúúYƒyyy^¯7;;ûÀ÷w·aÆ%]ƒÁ`0Ìz«kµ‡Ðê›,ïiUvyVÓ¾ewÔhÎbY²´”zð⛿’Y|Sæ€7B¦’ ׇ=C¡PÑ@·â¢!òœdÃf@lMôœH\îHÈQ‹×âX“>Ï+òVå{…¿y5Òýäþ˜!+Ôï3òWyùAày~n£¿Ý»vñ?ü–²;™_°ììꦙc)¡ÅbÑéгÂYDnÙ!?%ïöuÜ.{ÑuêÚÎ3É”&G Kí½çFß÷¦Yª? ø|¾çž{î»ßý®zðÑGýÕ¯~‡Ï;×ÜܼwïÞK—.-Ý0 ƒÁ`0ëžd2)ÍTOÑÄ£5­g•hI‘¦e53­&¨{ÈŠjåµÅ’$©{®uâ#ƒvϘ²K|0€"¯Eý­ïû?ÿ¶=Ù-5H$5Ôd~ÎDý®à–ɲíÓ9ÙÊ!m˜kzé÷uïœÏŠÌó¹ œ<Zilˆ&%KÚìq)á"ËÉÌ…ºça‰I½;#ðpø½…ç'}Þ¼þ.e—Þµ Ææg–¥„ç‰'žøÑ~´gÏõøo¼±gÏ­V[XXø—ù—Ï?ÿü³Ï>»˜óñüóÏ«=ûmmmêÐaõ!õv0lkk›÷ÐípåКþ«ç Á`pÅ×°žÎpæÌ™_ú9ƒ2sMŠUryòZÿ«ç |ðÁНŸaAqU·_ …”ºC=õͲUïAnç^å岓PI#\Óv7ôçN*îÁ¤Ãñj‘û9ïÞ‹Ÿ Ió´ˆ c&z`ƒöô~Ý;Oßüì§ÿ¾þ±ûL[ó"¶Þ†]Ó¹ª¨E„,Ý[O¼WÑÙ¢EÔÁŸŠ T/OT© ¯£€Óé•—,…ôzý,÷#˲·bI“É”““ssg8qé2¿ó.e×Ô}-páý7)Q·“4›õÈ'ç X2ˆ¥¨ùér¹zè¡oûÛ\x¦Ç㩨¨ˆDæ{Ô B.ò“¹ÞÖ¬§Ž««lÏÌ‚í™A°136ffÁöÌ Çq…ðx<P4ØUÜß©ŒUnt•¦ÍÍÍJ;áß~ õ§R¶‚YúÿÜf³­{J·ðý†™;ç—µ_¬ çNË“òÃÅh¬§Ê~uäçﵕç³L&Oœ8@iO›s¤oÖËIFjê;s‹yš€ÊÊÊ¢¢"õ±§Sü÷¥vâÒöýQ“¥¨¨¨²²2ƒv.\…BÊniiiYYÙÒ½ÝÂHÉdä›ÿCO‰p”«ù‹g•üU5hÜÅ¿ðMåO6½ã.ç£Oζt‚(óB·ÛýÀ|ç;ß¹®Ü‚b%À¿Á™Û3³`{flÌ ‚™Y°=3ÈZW/™BöšBþ¢tÜ?'ßUR¥ž¦vjQT¶-¾Ia| Ö…=“¼­H‹1ÝR~•ÑÚýºæÇý{ýèܨ¨Ábó=™-«A`YÖ`0¬nˆ=ùGDîUÁ“„$™:[7Ïá¹!£’Äð¦²çË΋š,pµý—‚YQ£·2z‹,;µsÌxöˆixäýyæ ‚ðÛÿTþd1ƒYhܶl‹”ɰ œœœ¼ÿþû¿ño8p`1ó_}õÕ]»vev  ƒÁ`0˜Û ŽãH„*;.*©ƒ<«é­Û ª@;’$Õ…Oˆ’r./É\:·l«]:ÇMv]Qv¿Ãˆf,`§,Ÿ5>ðßõ_KžÜþÁGŒ(¥_µ}ƒþϳ[ WIGuó=¯ÙÆü—ÿæÚ|§3¨ç0_Õq¡îÒ)ÁïS‹¼EÎdÀhY¼±¤9„pu7yXiAúžüt-ñã÷¤Þ®YsÄÞB*[ U×ÍKÞ‰~„÷ßÿßþíß>øàƒó=xðà¯ý뉉 žçÿñÿñþáþéŸþ)³kÀ`0Ìê!$‚\nýuýÂ`0+H</ìÒGf ¢wãVžÑ€V«u:0Ÿ<à¶*ÛÚîvàfw2\[$?üÞËŠ¯iÔÁ´U°`!Ÿ3>ø÷¶?szëÿåWþKýéIðèæOí³ÐÔì5µ œœœŒÆãÃÙùï¼§»¾y–,´MO”¾ýªtæ8HH—Ï‹Ç>RŽúrò#f›¼}[yÀn·Ô4òš,IÂ/~Š&Ç• Rw‡x"݉~*·ÐoÏ%k— –––Ï|æ3³2 €|ô¹çžûùÏ^__¯×ë÷ìÙÓÕÕuüøñ-[¶dv ˜…Qg²bnlÏÌ‚í™AV¡1½^ï±cÇŽ;vüøñµUbzsM³‚öDMNN®Ô»/³:qßžð<Ï»Ç U=Ü<ùÅ~{®¼m2™ªªª¬Vë\5"U×%µ©¦¤À‹-g×®={ø‘{~ß“ïÞa`æý]oû³ÝšÍ‡.Äþõ-o(–ö 24ñù{m{ óï*AÈqÜÅ‹Bˆ ¦ó ûî}‚ºïQ`Òr‹xáw¯&ÿß¿á¿ó«iQšÔêújÓ=Ù—ÚCh0ÔueV\²,«Ë²÷ÖnQü´ÀÅ…ŸþPìhA8s\øÏŸ(¶Jhõµ›†Yþe¯b-¸¨ ƒÁ¬Q¼^o"‘ I’$Ép8<22"“$y×]w-iÙ4 f.~¿¿µµuÛ¶mr~Ô:W耱±1Í/þÍ⟖w­îâ΃r±(///))I&“###³*šøý~ïk¿,îOõ¯'²]mhl\ÎÅß:<^‹ú8~þ+¯ûêSÁ#¹ÌoÞðLÉÓY”eÜËÿúhhÈsU\F¾ùÌ~KAöìæjºººÆÇÇçŽËÅZwÊûÓ™gÌ>‰ ®l»+lÉ’wI’Ü»wïµ&gŠh4 EÑ4MQÔŠÿÊŒŒŒô÷÷çô•÷´©ÇA*uƒâÊÖ=!«Ýf³mÚ´iÞS- š§èƒÁ`0™¢··W)O©ª«I’ÄqÜM4üÅ`n…©©)I’ÚÛÛ·nÝJÍWîoÍÕ DZÎ;T²Ä³åE €Ùl–e+**f½eÙ‰‚ÒÂN!@Ó“u+ìSºQ†…ñŸ†ß˜½õ E Àhyݧé{,„å3á/G$UÆ IÀÁ-Æ{¶š¨ëE ÖÔÔ$ ŸÏ7k<++ {ÎÄ}OLµœ-ék§gZ&¨ªnTÔ ,}¼¨Ìj{Ö“Ýßß?^\©‹EóÇ”qµ‚ªªYí0' ryXÂÆô ƒ¹ÍI&“ŠQÕGc±Ø²¯s[ƒššš€h4Ú×7»Œ>f ó®\HïWÔ$*6¨'(wØsE,Ëò¬Æ›[¨ŒH§.ÕBç‰D¦¦¦nÚçƒÞŸþfॠÑË蓇ÃÊ¡€ÍNš*)ã{¯MÔr•4éÈ?y8ëþæë«A ¢¾¾^-Q´ZmYY™y¦ê‰³ `¢¨¼åŽ»'ó‹xvFï‘d¸°¬mëîñ¢rõÙ–:^tu¢×ëåGŸƒ5®’*Dα;«éß²Ë]œò]¯ˆ ÅÂÛ[’Y°=3 ¶gY ÆT÷ƒšK,³Ûí˶˜[a5s=±Rö J5#·Ûm³ÙÇò/“YÂÇçDfÿ‚yàq6žPŽêt:ueÑY0 C’äDQyÎĨ<"õt ¿—°-ÇWS èííÕh4N§ÓétÞPæXHоþ]Ÿò8Ý}.f¦ž¸!‚è­ÚÒ*}û5¿º”(4”i?±ÇbÖ߀Cˆ¢¨ÆÆÆ––ƒÁàt:³²²Ôº:++K§ÓÅz7n„ª³¬ù’å•í­Wf=„ÛU€Íf‹Ç㈠†ªê'ó‹*º.›^h†ÈÊvmÛ=‘LùW ‚0/{‰QÀ‚ð6¤¸¸øú“0‹Û3³`{fÕ`Ì…Ë3¬!áj0æzb¥ì)»º»»ÍfóZ¿I]Ôo)™´´œRvùÚF6¿À89©×ëEQEqVÙɹ°,²dELVc8 IÒ™ãÔý-é²eäŠD"1888<<œ““SXX¸=ÐÅý4üFPŠÈ»åãü½ç¢ÊÑV[Ãqí`‡ IDAT[Dt•곩Oî±Ô•ÜLЦF£Ù±cǵ’ñ Rþv‚‰'œ;w†Ãá¹j–+dtb±XÜn·¼3ZÚ¶îaœÀ²I™L¦p8íÚ-**ÂBÌr`±XVz ë lÏÌ‚í™AVƒ1„rêÿš`5s=±"öTâEA“ —1ävVƒ=þ±&žz´$‘”îÁ'Àáp8¨‡ÆÇâ)ÅXJ;«™’Y²F£Ñp7QT^ÙqQÏŸ¢>×ö+f õC1I’<Çã1™Lååår’Þ\$~=ò^ü¤fjŒKüVSaÊøºþîYjpS…îÉ»Ì:ÍÍgŠ-Pš%//o``@’$à8ÎçóE"‘yg®õ‡/7Íìo<‚PjÛªÕ Ñh,++[Î…)`AˆÁ`0˜Œ‘H$X–•o$IRÿÔÍe y1ë€`08·ûe(¦ñíÐÚDhUÊ_¤¦>Û–å&û„Ñaa¼39è—fG­gSÖz¦²ŒqÖ0¥VÒ3 ¦r Kz¯0| “.ž!wdRiÇÒð$?6ÅOoHL (É£D¦£tZF!J”„2ž¤c-qŠšÈ³1yvš|µåöª"M)übøµ>~T9-# ?}“3GÒÁ¢¯Ùàˆ´#.ËD=r‡¹±| •Ã0‡cbbBÞu¹\×ÊŠ¼m=„:ŽeÙ…»ïRµqãFrn†á²€¿1 “1ä[¹”_$‘$iÉ<Ïó<¿@z“Af¹xžÇ‚p"ž?EESODŠüp¹Õ÷}ߨfZ Ï怢Š)Ú®©·±(j² ´`¦“¡xôCrÛpkuhõ»“=c‰î±ä„—ŸO$1A˜ÿ Ñ'9äIhOôD*ꨛ®ú(A¦ËtâèO~ÉùÓÏÝŽ˜vvêRµIl&jOƒa×FýÜŽó§  @„>ŸOíN,**bYV£Ñh4šë†ï®c,˵¾‚dòòòôzý²­g¸Êèmn¯œY°=3 ¶gYcz½Þ‘‘¹ñ÷bú;¯'!¾23ËòÛsV?zõ ëÂíW?mmmן´.áðûÊÞ±FíaCÏÂjP ÔÃü,ò΋¶wÚòFï*ª@TêÑ ø¤‹gnziãÉ—ÞóÿÝO=?~Ûwørt|~5¸hH)Z{¡§úmµ¬í¿úi¢ÌïWFúµ%˜ï" ¬ÜWÎz½†ePƒ`6›±‡R’$YYYY\\œ››kµZ×G£—›ãºqòN§syV2/ø‘ØmÇmžlq°=3 ¶gY~c& 9u¤««Ë`0È‚0†úHÐëp ôìgá±XlM¤çá+3³,³=B}}}Šð£iÚl6+­ÕÖº ¼m+/Ö…SOxšø°yžR‚ÝÄVË¡¡>)t)ÙÍ£ÙíòâD¢#g¬Ç>^íͯ˜¬²wwÊãâ‘È-;IŽ!„L&“Édº®3¹Ï•|ÿB¸ß}K…$@P€ôÑĎâÝ#²…ÄC‰m­¨|êª<½qÖñ›œG ­¡r›¿©¶°¸p¹ƒ3 ºººf Úl¶e^ƪÅjµ.pÔd2­HûA,1 “¼^¯¼!ŠâåË—!¬îi³ú&å´œÒîVOQ¹«¨‚פ³YÖŠ‡³v‘+Ǩ;kÛívu¢Ïó+±®Œ±š©Äãñd2ɲ,˲ôóS¯¸ßúôÑ6ÝÌÈÉ]Èú›²SÔT2Å%t~] !ÒÏ¡â(ÑÇ ®ödÿ°0®>§@Š9c?ÚEþMI‰ ¿7qöD»Æ¨vÐét së@"Ý£‰Z"ãóKA’€Ü,¦,—ÉÏf²Í”^Cz§=Cc1žá:Ûf®ÖŠúö6W§†Ë-Ë%šÑTØ Ä>VDš$²…$FœÇ×è6:/Õí¾Óä&9997dÏŒàp8úúú!­· Cmmíò¯dub4)ŠRН¡Î´\Y÷ `AˆÁ`0˜L¡BÐLŽoh=Ã$8e„…‚¡ž¼‘þ¶æ½QSêv ŬQ†††Ôj¢¨‚‚õµºÖ=„«™þþ~%oª¸¸XÎ.¾¼bðíø±SñÖÍcñì@J{|´ÕÀt#[µCÓPË”1Äü÷·:BÓÀV6°•ê÷N‰þÜ¥c\K¥ã0'-ÒÉzížË©Uü‡ï„ï¸[IÇ#‘ˆZF9étGìtgÌž§Ñ‚Å@Õ–hj 5Uì¬"ŸQ_Ôª[µq†Onîø€qÌz-)$9X‚˜Ì/Þ°ÉB¦žk˜Íf¹ ú2CQT~~þèhªàV«mjjÂ)â rƒAÿLˆ¯ÝnŸžž–·)ŠÊÍÍ]¹¥`Axr›7,Ê8Øž™Û3ƒ,³1%IR~êr&F+;.’óU”¡$qCëéÖxšµã!ÄWffYN{ª€Z­¶¡¡Áh4†B¡y'`2ˆ já}‹OüRèÝØ‰“ÜeDÐ=ª¶{-5ÆZ´ñɬ Ä ¡Êö¸aÿúÝG¢ç߉ãèÔeðA³~畸ìˆc¹Xþh¿«´ZýB¹y B0äI^è‰_è‰'…y¼v5Eš»·Ëó¯ê5ŠÇãr=-ù"ÔÆ"u—N1±ùû4,LÀž;\Y1Y€¢(­V+ J §Ó) B†ašššnÛš¢×¢ªªJyüd0|>Ÿœlép8V<» ÂÛ|O“Y°=3 ¶gYfcƒA9ÆðVu\$ÔjP§D‘N&ä=muV^^^XXxƒŸ>Ãèõz›Í …šššä‚™«öâ\ ƒÚ·¬<™ZñxQÀ‚ƒÁ`0Av° ®¦ílZ µï>êÀýýW®˜ë’‡­ÓÎá^WIB(ÞεÈ1KÚ¨°­'A¸jo¸•>2ǹÝn„üäH®…ãóùFFR¡’V«µ´´Tý’J~?ûAü4‡®’L÷œMûÓÄêºò­;®ÕÆýºpIOH±„ÕÔg­ª«èð猰ݸ³Ós0¼€Ü—Î[?79%r3ã œGܲ4ÑT¡ÝUo(ʹfœ¤Z’Tuå‚Z ŠÅÅoÕG*9Ð&‘Ž“rÂìÖ1çö w †¹ÔÛ— ) iš$I˜¹tµZíjPTTD’¤ò•¾j/ÎÕ€Éd …BF£Ñl6¯ôZ° Ä`0L&ðz½$BWå ñ‰ÏR[v€ÁjÞ¸U ›©²‚¡ž‰Âr‘¢"‘„˜¥C-¨NmÂ!£™btt4''G«Õ@"‘˜Õx!ÔÝÝ­ìÚívƒÁ055¥„šÇb1EòH8Â]x/~*,Í4­&*Ü32‚ÐÝý~Á ÉxBò„I¿ŠI1NŠpR "†cR”“â IJ)¼üÔì±mÞh|ËéšcKÉέý®÷Ÿz5"ÝEyæ]6#µ»Á°cƒnV–à\Ôq³EC=Æp@Ùj,ÿÎ~!J¦S9–(ˆ:¥ŒM¯«¨€rVÛÙÙ ¥¥¥¡þþ~yfYYÙ*‰³°Ûí+½„5ƒü÷J”<„·Á`p5W$[s`{flÏ ²œÆŒÇã±X¬p¸×LWïwí×mÙ!o£Í›øùGàâÀðÉ\÷»¨BîT±ÊÁWffYN{®{áêÁår VUUåççËÎÀ&{½^ƒÁàWµÑK$ÑhTcÐçZÞJ³¿l¤¹r4çá£ýÊYµpÎ'éñ É>wbÜ+\+°óZPEÚ÷òOÖŸ¹Ë|€ÑÃÇúÐïé‘ öòv"‘ŠMÕ0D]‰vS¥¶®X»H9¦x¡@áPZ÷ÔÚ^8Aªö˜¬@7»+ ƒvPüŸyyy~¿? J’422Âó¼Á`Xñ’$˜›Àd2­†r22XÞvŒŒŒ444¬ô*ÖØž™eÙSÅx<¾RÍ…–Ó˜^¯WÃÅ ÒM¨ÈšìýÍšF˜-ÔÎ=âL/é‚áÞ‰Âò5!×Ù•¹â,›=EQT꼓$)Wn@“ãLVŽRö]„ºUýÚb•¤i‰¢ÈqB¨««Ëív‡Ãa`’ «oR QÀ‚ð¶ÇsglÏ̲Î쩤‹ˆ¢ØÚÚÚÐРŽüYj–ΘápØï÷+N•Ä™ã¶h8uŒ$éGŸž7XT°ÚÈšRGêyÎÄX$YåµéÖÙ•¹â,›=•‚1E]ô5(SÑÙݺ–ñ3³¬xÅ#¯×k±X"ápYïçpïUÇ‚((v1ZN£Eô±°10…üê8RsTú“ßÎÕi_=`æi²A¨¨ï?ö>œ qê3mŒu—&Æ”Ýw­û•¤;–&ìf*ÇJ—æ±Å&ÇBu7VrÓh4*_Îj_±Íf£ܯ WòŽnÝ隸:DuBôþ&úÑo£‡ò({S`"ô A3DÚó‘¢ÃÂÄ àâ‘øÜ[é¬éË•lÀazR¿kŸvM¬Ci·â'f‘`AxÛïi2 ¶gfYgöT·œ’5á–-[–­ÅÂÒ3 !„&'' Oš.œT%64°y×/¢M6mUa¶gl8^xþŠ³Î®ÌgÙì){µ±HîØ€2H–W“Ûvò¿ù9! @ <õÆ/.|„Åœœœ’’’åY[¦XÙŠGÇuvv–•”ä9’=ÓhT†¬®¥îy„pN;§ÔŽŠ2‰!coé°{÷å˜>‘VÍ\Ù8œ©½«Ã×øúœº Z‰{(ø‘²ë²ïºã6½AKê5Äu›=\¹U†Œ×ë¥iZ°Ûí„ÃAV×J=òÑÎÄLÔ¦N§kTUL,4.N‹×”€ªÑdádÊቈïß÷Yõ„váW­]p9®µÂªhZ‚Á`0넺€H’4<<œ‘“ÏjðµÌÈï>99 Éc‡èxJ÷J¥¹ïÑÅœ¬©G3áÙ# ÏÇ`nY–öw3.)"ËNáOɦm¡w)ÓŒþiªûJ8–¯êµÅ Þp#„ÚÛÛ…D‚yý•«Ô ÍÐO|†þüŸÊ=!ôz=¤Ø–7ònMË•ÂÐ[»ŒÿóKÙïo7ˆT:š ÛÏí;}ÌæuÏzš"¾˜|ß&¤¾ôAxj«+ÅÆn¦n] ÎB åPª¹PûîSŽZ½“Ežäž¡Úç¬ÏìÐÔS7x#½÷’ª1}]ãÞ’‡Ö±\Žkí€!ƒÁ, ñx\š©*®0==ÍqܼóoˆÞÞ^Ç£ì.Üï+™Lº\®ÑÑÑ…§-žP(Á` ¥+ãÓµlv΢NÁ0d]£²gê›k+ FÍÍu L&“æ Ï>™ÖÔ½EßÔìËÎSÆ †z¡h4*»†0‹¡¿¿? Uµ_°N¤ƒ9žùÊ_’ÛîPFôzýˆeúíê–Žœ1‘Hý§Ç5ä[»ŒÿþhIÈœnÌcâ<ý‹}¡SB åÚϰþ}]oñT»2g¼¨B´Ù—4wNÖ&“I®ùA””eéì¾üÑQ¢õ‹¦Çþ)ë/ž6Ü[FpýÊ2…>ºa }3wî_‚µc07½íhkkÃl2¶gfYOöTjî©AUV^³Âbày>‰ôôôX­VF“L&/]º´aÆYÍ-ÚÚÚrrr&&&€,ÇÇÇ«««o±¶ ÇqÊ­yäȇf.å–ß~q€TÓ6áÒyyÛ>éîé쬩«[µÝ´ÖÓ•¹¸ {VWWßèÂó|Áp¯’±F•õ›åmV£é­n°y=rC8hózüÙy@`5×ñ_=LOOŽŽ–w]Îñ¤Õ §Ó{|ªÌY¤ŒD¤Ø[¦Óí¦ÙQ¥´óAj—!‹}§&^×~¸1–ŠÉ$‘t_ðð±ÛpßC–<›xî}é\:(=b²Wn4étKùÉR}ÿÔÝÿ¨»îûäílÏØPu=ÇqÆLèšèš9”\c¤x¥+ÐU@9 GìµWiæRÌ/ J+–ôS`0‹ ÂÛŽâââ•^ºÛ3³¬'{ªY–UDÔøøxYYÙ­<Þ–ž MMMÝÝÝÑh´¥¥¥¶¶Öáp(ÓrssÛÛÛÕ/”§ÝŠ"U¢UIIÔ]:«Œ•gåå/þïºÒP·Z5ázº2—©©©œœù=Æ7aO¯×ëõzoXªý6UCê¾G•ŠG Ãpz£×Q=£g ‡zÖ¢ \æŠGgΜ‘$‰¦éx<^8Ô“¯JÎŒëm[÷Tä§³ˆÛ“ýÿy+õ¬¤éqÃþšú@XúYk`hBÓšõØ8“{Oè(‰RþÜÈ8üæE®B¤èž†f‰$uK)e{jµZµ $«j {òN)I¹cCñÆMêr)Z‚­eÊj™k¶• y½FUT-¥ŠX^Çàr\k2zÛË=elÏ̲žì©„ÅÅÅJå:AÆÇǯñ¢Eá÷û•ÖÖÖééi$©½½}hhH™¾F¥–ÑÑÑkZ r¼(äŽ03îA‘¢§ÊjnìÏGQê¨QÛÔÄää¤:vU±ž®Ìå!«¯ÆYܨ=EQL$.—ëF—aëëT ¼²¬J9$ÿKŽ•V+ÑðZ^¥åÀZa9o¸AˆÅbÇE"›k¸¤¿C9”ÔhÛ·ìâ5ZƒÁ_¾ÿƒÐ/BRZ 2ý€~×ÿ´ýéMÃÙ®øÿúÕÔÐDA6ßñRÎÓuÍ„:Dýµ›âz#,© ”íép8®Š¹ rçe/ß5Ä©¾áCòÂi†O=5Z²i[ÖºêÁjp­€!ƒY‰Äððð¬"+ëuȨÑh,((PvoQö(‚|>ŸúÐàààй3Ò•K©#ÄñC¹îaK`šøY÷Oƒƒƒ7ýî² $rõ(ƒžÂ2K¾“$oì7…U B¯n«+d}ãóù"‘ȼÓ7|¿ßcWÏg ÷){䎫îMåô°¨Éâ·§ýêy#ý‘H§^ åjx«:.*±¸öoÙ•Ðê ‚0 )üíàŠŸSg-—ÒÎç¬Ï<¦ß—ˆ‘/¾í{õpK¦[ÔÝOnä“>‡snß"Û1z÷cSy©HÔ%„2%%%³¢¨-;3S ‹‹‘=ó½îšh.ŸS¶uM°j:’c0€CF1ÌòÐÝÝíõzL&“Ãáp:4½Î¿ÔBƒÁ Óé»ÁGËj‰Ä¼/×p±‚¡Þ¬é “of gI$EÕ5†+7\Çå;-¯× …få.I’dïbö¤K«%)Wqemn¨ŠJu¨E´ñXF*î`Vòc‹‰‰‰ŠŠ $JÉ×àY¼|žN&ämžaõ›šÕGiš&IR’¤±’*ÛtêMÖ”›NpÁ`p•7Æ\)dAÈr± ­gH)ÕB"É®Æ1ƒt:Ý0šø?Á_«ƒ$éw? ßEÙ=šxåã@8vU©úRíÓû,-é‚ÂÎÆ†p°h Ó°&3$Y\NÝ÷ˆ¯åÌÈÑe„óüBiuB]3£ëL—áþ‡y6¡¿[H=¼CÁîÂåd0«‹u~C†™ ŽçÎ,Øž‹a||ÜëõÊÛáp8×××Ë‘EjÖ=9ŽÅÔÝMÓrpšÒÛJ„D"¡ÑhnâÌj÷  )Šý…Ã=¤8»yWj‚$¢+-Æ+-ÎâΪža`pp°©©éFß=ËõiœÃi÷`kµù½ýGÈñ˜?®#4Y¤9²Ò¹•L‘•¼vßE†,­úS§²y'âù×ïa¸"¬›+sIAÉN„|¡z<žòòò¹y¡7jOå!ÈÄÄDyyù"}Ñâé£ÊötQy‰ªá¸ ˲Ç…¬ÙqƒI ‰P®{8¨ZC‚p9+E£QRk[Ï23J½uWВʺœ¶Gþ3øŸI”Îþ˦¬_2=^FHÞ<:r9ªvjâ¡æ;7êåKD.y5YºšvÒ4½{÷nùâV{›—T.`OêŽ=Ðz^ö‹¦=È=&÷Õ¸.üñ•¬ñ@nAîjý¢Ë8¸×Z ÂÛ|O“Y°=¯ Çq}}}³c±Ø… jjjr¯v+­{ÎrÊz½^IÀ‹F£„ ŸÜØrÂZTÖ“É=²É7Õ]ß²Ú}>ß: ½bðTôb{aŸmzrW(UZF"‰7ï ¦tAÒ­G $™KeíÐ4ìÒn²ÆÙg ªë@„ÓDbîœÕÀº¹2—”¡¡¡ââbŠ¢Âá°üì#‘H¹ˆ¿šµ§"xž÷x<ùù×/_„†`<•sˆÂW±an¿y†a8Ž‚˜(,+ën•ó\C½k*p9+E£ÑŠ®ËÆPú[ˆÚŸ®n3tuÀ mò¼u@Biï_[ùEÓczBË%Ñ|èï¹ê¼ÂÉ~jŸÕnNWØ2 J .AÂá°ÙlTç£2 Ã,e¼åöÔ–LÛr,¾T³JáäaæÉ?¸î QÀGõu)»ñ†­·¾Èµ.ǵVÀ‚ƒÁ,-ÝÝÝó&䈢ØÑÑ¡Óén"pqõ£„rSf0 Š ŒÅbêv‹G-5"_{á˜!RO(*d±szƒHÑšDÜ 1ª ,ߨr¢³qGÀž ¯kü)ÑßËôðýˆW  ÀÂÃ¥×ÐZÁNYª˜ê}¿‹y;v¬Y³ñ!ýžê*m@V׉ï¾.o[üÓÉhTñ2aÖ Ãª¯Ò‰‰‰¹‚ðFQÿC¹\®ÅBñô1eÛŸ“–yÖ`³Ù䂽¾Â²ÒþB@RCýÒæÍ7š»R,gÅ#]w»Ã=¬ì’µ Ô’ÔÛÛÛekqª½êw?¢¿‹Â_|Ççñ§(îo6íßdœû¿nµZ''SŠ+øý~µ¤(jãÆÿ\j9¦ IDAT°'AÓ•µ–³©å¡¶‹èÇõƒ @:yfú¬Ff]m}¦–ºúÁå¸Ö Xb0˜%Äëõª«ž”——sçv§›Ds·.¡:ºI„ÊÜla,KÌøÐ4HÚÒz†T‰=Âh,¯·çIªž õõúhHxïwh$•ÁHŠbíå3]Û£ùù IÒ‰'H’dYV£Ñ”×TxHÿ°à\ýü˜_ºJm@±‡¯M÷Vþ°yvÜ( N´M´ïÒ6=nØo R_„#°e!¿O^˜Ù?•L&oÎwŠYYäâ“###N§Sý_?==-Šâ­ôY‘$I]K&_×¹Â!©ý’²ë.,cçó)UTT()Ž‚o\jIµQqŒö‡Ãa|/; ~Â]Ü~AÙ%rré§þ‚¢¨ÑÒàE}ºT ÄgìÖn×4ÿâ;¾*iÐb ¾pŸ­Ø1¿—O-GGG•†=@ÓtccãÊþ]ÅåÜ• ÚX@¤³'¨ý÷/ô‚hDðUòð;E=GåìRkZÏ &gÆÇŸ` uÑ€6 ¿%šûÖ .¤?ÚH¾Á åÅ jó«Y‚Öº8âx§DŸ[˜êF‡ùqÒ™HǸ–ËÉž§ ÷nÓÔɃDu:s\Þ¶y'åvÏ7aœ%eÝ\™K‡,‰„ÛíV<á Âôôô¬àð²g<GèªkÒår-,¥ó'a&¥6n0m9ÎëRÛw)‚0kzbÊí‚ð*AüåK”˜òòI­ùì—@£€ãçŽé[•‰4A=czb[ÉÿøÐŸàÓ¾’\æ ÷e™õ×ô¾Êi„2³Ôà¦M›L¦ë¸ã–^ï.,+ïi“wÅSG©]`Nzª‚xò0Ì|ФF«¬e¯=ƒY)° ¼íÀ÷4™ÛsaÔºHiQ­v”Í„ëÆž³CF i¨_Ÿ_8ï„Å£¬©q몞~uý¹/ÍäjuÇ ­ÞÒ9*¼u)Öïö @JHÛ¸³0ùØØi¹-%‰;û_ûÖö£Ëbã3i Ê&´›z&•‘pnÓÆÉÜmÅÛLÌUwiåthâ(q&Ñv8~aBœVކ¤è‹á×Ú’}Ÿ5> !²ªVš„V¯‡ã¸Ux#¾n®Ì[‡ã8­vžfqŠW°¿¿_’®ª!éñxn%[xîÓ“ÉÉÉÊÊÊk&’ ‚tVí“)‚¸î]8Q\&Øshï‘—ÎAmÝ⹂,ÏÓ ñлä䄲;½mW¡#Î&Ú_~ Œ³óUó“uL9k‹þîdHRiùÍ•ºOï·ÐÔBß9ƒaž¿ª)=EQË£¶§N§.(-è¢ Ï§ö˜6W‡.»J«m3¿ƒ· øQÚZ B ³„¨½¨¾3›%W±±±üüü[ lS@)w3Ah¼“ü«/#ï۵¶lovÞT~q2™äyþFK#ÈŽ†OVv¥Ãáˆ\§¬ “BY-½žÑD¯hKy!T–Œ!¤‹pm¦O}–5¡).~ù-ÿ¿|Ê–¤¯yÆt]XÅ”Ô0%ü`Tâ}rÆWCä:#¹NË.p—¦#4û´Ûöj·žOt¼;æ½Ê¡3‰¶aü+æ'óÊ«I’ºh8ì‚ï`Y8Ž;{ö¬Åb)//7™L²?ÐãñlݺUéç>K €ÏçK&“7í™ûôD’¤‰‰‰¢¢¢yçKO£™¢G"MOåÃL×Á…!¶Ý ï½!o›û:A’`-¤.Ý 7B(ó]ÅÀïÏ…?¸QŸm_“ááæÅ$[­Ö©)UøIÖ××/Ûs¢…í©ÕjŠ/*/ì–G¤ãQ;w3Ïå-ž8 \êGg4ž‚ÒºÕ÷´kIÁjp­aAxôèÑ^xáСCÉd²¶¶öÙgŸ}üñÇÕFFFþê¯þêƒ>€{î¹ç»ßýîµ¾Ð1Ì:@}'§ _‚pjjJ’¤Œ”DK&“©7„ŠÆ…Co¤¢×ødÖ¤;kÒm új7Åb±ºÅAÉæ*é½Â$fúõQ”ðɧ{Ñè•i÷e︟™’rƒ?ûŽ\ádƒÎï?r¹MòOÿòî«¢ïȰ™ d[¸Ü-Öâ%%6}êNúÜÄ‘R×2Ú} Go^Lx'D³fãf͆÷b§ÞP*–o\œþf९šŸtæ:Ùñ±Ôiû î6*º°¶èëëEÑçóù|>³Ù¬´!éíí¯ÑõB“““……‹*Ð?—yã«å~˜ó Šâ‘•=³T h‰@Ò"ž½h·ßÉ}ø¶Ér±x[‹®é6*9—‘‘‘R7ùX)‹’Ôêú7lª5\ÂäC¿!5NõiénY ~ÔQ«A’€Çv™w×/*ßT‚P§Ó9ŽÜÜܹ=ŠV ù‡l¼¸Ò9ÚO  HX<{‚šÓZù¦ÅcéKÑ]R)’ÔŠ‡¼b0ó’aA¸wïÞýû÷¿þúë›7onooÿò—¿<==ýÌ3ÏÈG#‘ȾøÅ/¾øâ‹ðÃþðàÁƒ—.]RÇa–š`0¸ ñÖ.Øž Àó¼â(#IRQjA˜¸ºÍÀJÙS’¤P(FNç<ýˆoEå:Gû‹fRMÔä»y6ZSsC6‘H „LA¿ºÊß±Y¿Ö¼‚dwÈâ§½»ÓàœûR–ßÕï±æ_±–!+Ì"ƒ6B`€8 p ¦ÙL…“µéEkWŸ’AD˜-dÓÖÜPhñn¨‡ô»·h6ü$ô[·˜züCÜ÷‚¯üײì’AÈŒ^û+þO¿ß¯öÛ(‰‚¤$ñm-ñ˜&! få³üÕ“©©)µ ¼!{Î_}­ ëÈ…#ìLp"|OÄg> §¨iÒ@êr(›“r”ÒùÙŠYM2 ­.TRa˜ñüœ=·· ”‹»õÊM¢wÃff=úAè—J}@|ÑôØv¿}çLZ®kYâï±m(ºÄବ¬’’‡Ãa4ÎÓ«fe‘!ϰã…å…C©–9âá÷Éú̈́Ūž)þîU˜ùäYÍDQ¹\¸k™ŒÁ,† ÇB|ýë_ÿè£víÚ¥×ë›››_~ùåo|ãÊÑŸüä';wî|î¹çl6›Íf{î¹ç¶oß.‹C̲122²ÒKXW`{.€:^T§Ó)½ð®”=#‘ˆ$I<ÏŽŽÞúÙd•Ë$¸¢þÎkÍ)è$/[ü9ÀHb¼/ksúMEBR´Ÿ;Æ]üÈÛãûÞ?þí£øÙ°”>•дMÙf†ªnÓªåøñã<Ûðð°ììÇã‘H„MpΡôßÝã, dç" ^J¾¥.Aü¤áî­šZ‚ Ú‡¸7N¤Çµ,ñÕ‡í7¤@¯×———¯”\Øž4MË Ý%U"5óô0^ýwõ—ÔrNêM÷ªª(ú6tföâÄ,ö~ë[ßRïVVVªï®Þ|óÍgŸ}V=áþèþùŸÿù/þâ/2» Ì444¬ôÖØž 0o/>¸Zò<¯î;·Rö SG£££·XN„¥ýíôŒ? 4Zú©?$ô†äËÿJ̤”ØNAÍ;‰œ…òå¢(Þ‘¸’ìïâƒRäN<ŠSŽþzŸIœ¯<ƒ^49i{¡&ÛAeåP¶Êj'­ ‘úÂ÷Ä<¡ŽZCã¹ÃrB Ã'·÷Ÿ0lÙµ1Çã‰9º¼{,!^-Êv„/¤ÔÊã¤ö²‰äÚS‹Ñ0„QG´¤3›)Íe« Y‹ášÙ˜,Á|ÞôH>ýZô|·>â ¢:Ò—€N&{”(œÛE|%Áÿ飣£³„™&­¿xBŸ'ž“Èö¸²Ž¼3VÓ0š[’$ÉMÆå ‹·'ÇqJR"˲’$É}MEQôpÓWÐÀådO?"—Æ}âHØJ=ž(âƒæ…ÆG„ñßF?Ú¦©{@¿;²ë+ªÃf›In¼ŽtúõÐ'¹Ô•"³iZ.—Ëï÷744ÈîÁ’¾vJJ™”g5CÕ ÐR44$¤»í×5Ôm€Ñ)þg”*2,M<ó`VÑ5ÚK¬Z®kON‡y†-«)ík—ÑP¿øîëÔIJm-Âk?Wæ³r&óŠà6„8‡p­°´EeÞ}÷Ýúút*H{{{SS“zBcccGGÇ’®ƒÁ¬³*Ê ›°;€¦I’TŠÈÉõWV¼ ·"EQ©¬¬¼•³%“IsÐçO?£î~¬mééÏÿùR€á×?c¾òW³ WH€yW?ЙÜJ}=t<–s±ZÛ[Ä ‚ ÙH_ŽÏÞ_Z´3¿@OÌSRAÎÆ‰š­#•K{¯Èƒߤs¨ÇUZí4…·o× Òz¡7ÞÒ›âñ{"g•3œ46sÄUü5¨@&Åmçé``°ªâºÍçE@h0DQôħG-ÞóÔ«‘“j÷xÝPb_Kú;çTƒ6hL]|")’J¢« W*ˆ I\9›hoÖÔ=jÜë)®0]9Ÿ:tá4u÷CpÛ„ù‰¢˜H$‰D[[[2™4†9ãi_îHE@ѽöñ^SZ 6°UOîoHüÿÞõ%…Ôß„$á ÷ÙÊòÖa‹Y€»´º€3Ãò¸xò°4ÔOdÙ¥öË0ã—HªoÃ& ¸-!f­°„‚Ðçó=÷Üs?ùÉO”¿ßŸ••¥žc·ÛÕík1ÌzBñ'eŸ=Æ·]Š"rDa±Ùd÷)Ò­”ÌŠ —ËUTTt+™‰D¢¤÷ ¤«qæS;ï’·5U:ë¶Tµ¥‚EÑØ°xôCjß½à“B]ÉÁ~ 39Eñ¹§}àTÄO¹J ñf]%Ó^DyLÀQ“gØ\©Û\¥#QÁO©îã.©²y=_*(®d 3”•6Û8Ž³Û { { QNêw'¥cïÅÔ}9GhN˜¶Íê‚~w²ß<Ñ{z¯¥ {~ÁVM­†`þ5ü ]%iA(õuÁÝ^ÿ“`– Žã”š1EUXLèß~±´T)z:¯0¦7ZhJ72N9pŽô‘’8°a“º9áâQ¾FâLrÒæêfGÝ´æ\çN¯ð¿3ÿta#;]¾õÞ>½Žgµ“““S__Ï#!ŒbnarX˜hOö n¤j¹‰M´_Nö4n..íÕ¦ê6%8ñâbÇnr-”½uù-w¸ÙØ×ž¶tn~°¼ÆKM_ÊRÆò(û—L‘@„cÒ¿¾å «ºÏr¥æ#E× JÛàÝso¾ÿ¥ª-r"·*ï€ †74rú”§ B̪e©¾à<ÏO<ñ£ýhÏž=9!1Ï?ÿ¼::¹­­M}W§>¤ÞƒmmmóºΠì®éO±zÎpüøñ_ê=ƒ|'GŠbMÛYmÛQDîQéì‰òÓ3Bêi½’F ùË_.ÿ§8vì˜:•Q’¤ÁÁÁ[Y×ßk¤û+P<)ûÛÚÚÂáp¼²Ö›[ ½s¨ï7Ϻ¾û·¾ï¿yë|¢c^5˜çv·¦Çöpq Õ>USû÷Ÿ+xæÁ¬øäE ÊvP_¥êO‰Däгq›Rüƒ¤š¶³ ŸŒÇãŠ% Z²Á¯8¢œaº¬êKZ¿ö„ý©»,wÔém:޽v׊±)þ»¿~ûLøÈÑt_8µ%ëÙÊ=#µ Aw–¤ ®aàâ«êª–WÉÖòŸaz:ÝFÒd0D~öµœÊ+º°û¾¾ÚÍî’ªžâª¡ž¨i”TmòÆ˺[Õ'y饗¹çéÊqXÞú»šó.¹™ÙjÑ®Öø×î3Î<.A1T{‡#”c‹´r6Z,uµ׳•éwÿßÖ/|²oç' ó¨«j1%.»ÿx£N‰ú½gbBþ6[ ‹¹gP^uëkP§‰šB~«/Ýt´«¸ª²iéâi&mYGhþÔü”–Ð||ääßöyCé\â›;kõËl‡LA_à Ê35óèO}a^2"Iñ‘§ÜÎRyW©(³Vì‘3œ9sfÅ×°ÏðüóÏÏ+|`É ÔIÞ™Âår=ôÐCßþö·<¨ÏÍÍmmmUw§˜˜Ø¼yóøøøuVI,É:1Ì’rôèQÄ'7^<¡VG »£cÓˆ jkkóòò–y WU!bÇŽê_ýÂó¾kMIåUÚ/}M}tppp ¿}ûÉÚDJ…N[¨oþcçÿ®'ƒY´»à«'Ú+é¯Êk¾òài¨É±›o²kâåË—•è ÛÔx]ëÅŸ´e‡ûLEU•2Yxù_¥îTžŒ@ÑüWÿÚâ,PŸ !ˆ%¤xBò†Äaß9ÂLÎŽÍ˶ÐOÝe©,˜ßÜ–ìûQðÕÿöÓùÞTÖeàSŸt4î½¹O‡É8.—K‘ µÓî¬Kg”Cüæíg³œrDÃ0»þöÞ3¼óÌ÷¾§¢wÁÞ;)J¢$«ZŲ"÷nÇv6öÚ›d“MÙvåä}÷º’svóædÓ‹dÇq÷&Ù’­b›ê…’H‰bï½`ÊûaÀ’I‘”HÎïf0<¸1<ÿçn6x½ÞsçΕkÕÆßâR\…]õÅ=6~€ëˆ÷_Ž÷\Œu2IiqÑë.FJân j×á)òIÊÚýxtÜõÖWT9XP–º§¶¶Ö`˜¼/ܹhÛ‘ÆAÚ&ìT…Ù<çÄ™ÄMÑ×°Y±f½Õj½êȯ ÍÍÍs•ãÚÝÝÝ×—(b\qþ¸Þ‘øÍA J°§þé÷þ7ÎÅ%X€¯ª¨#Kc4÷û÷ݽ£É5µ†2ÙC[µó8ug®jOÇsî\¢,I’õõõ2:Î|ø6{á¬p ƒaÝ«6ªW®éììä÷ †ÚÚÚIN·¤™Ã‹SæSÍ}Èèððð¾ð…_üâÛ¶mK{ªªªêüùó;wîö\¸p¡²²rÎÇ ""r݉F£ ÃdõwMª@ë²çu^ì-©Në<±ð¤®Ûñp788X’"ЦðkSšõ!cÁ¢, —ƒÃg©öNyçhý²JþÔ{q>ÂÍècþØÿÂm)Uø£Ü–…Ù²1›¡äë§5Cåëj´Ré,Õ ÈårAz22ÙÕëÑS žÆãä?¢"Þ«É6Ô ô—T›Ò«à (¤¨BŠ5xYŽdçj¥ÓGt*ØÔ™ti:}ôïÞs­¯’ß¶N-!ÒçŠ5dñ±—óö ‚°³õc¼z…]în„|`yЧ»¬Ž‹V¯ß÷¨äØ1þ.Öëõ‚èt:µZ­*)ó¿I?ÿ!š®°í|ðbnÅäñÆ.Úèˆ÷wÄûûèÆ5Êð2_Üç+N¿;ð¿Á´ótg”\²ÔI㌧Ñ1_ÖBõ@ê%å+$eG¨ó{‡øŠ£9z¦\²öb"†9£õÜpIÅ +çpÂ-„ŒÊƒ~½sTØÞ|˧ÔiA ÀvÙÚ:²4çþ¼ß“ª«ò¤nYÄj¦aO!db±ØÙ³gkkkÃ[v  ƒm0¢Ô„”êRÃำ»[8ryÆ‹Šjp±0Ç‚Ðn·ïÚµëG?úÑD5·ß~û‹/¾˜*_|ñÅ;ï¼snÇ ""r#‰D:žÝ×!ìAÌ™øC_¦÷¼Ê¥àgõwºLÖXl–íªçЉ‚Çì!s¢+Š–©šây-Ç/ Hºú>Nâô›‹$u²MçùQ+Û©Q=ñqI!j³âv+êÎ[“åÙzê°p~¯Þä1_kÔÔ¢¯r¹\ºù~jtk¨íl¥_x»í^¶³ùhp¤Okð•O§O£Qƒ?¶C»ªDöÆç>o0Hƹní>~‹.wBáÁz¼ì”ú"@ÂU[Ôú…ëoß5>yå9" ƒ  /Ÿ.oD¡Âï|Äl6óm$„2ÅÅÅJ¥”JüK_þîg(„e¥ï¾Æåä!† p»Ý¬éçF»è¡Žxÿ =ÊÂä+ßµÑG÷ûeÑ«4#‰"äý­MÒjH”AáDܤ YµQ@¯â–DÙ(]Q/){9øÑéè%ø¸AÑÐEYäA?z¹ªª®n©Eޱ™Ý۞̂ÎÎ-0¼éMþàYw+¶öŽÆ^>äsúhaa&ùø-Ú%Ÿn)•J ƒË•XëŒÇãçÏŸG$®3útÆÔ#Ù”F³¨¨$"²`̱ ܵk×÷¾÷½Ý»'/ðôÓO×ÕÕýð‡?üÚ×¾Ï<óÌñãÇÿûßÏíD®Œè¾Ÿ[D{NE8ÎîiÃãc+ÇRñÔ7A®Ày’~ö'œÏ Àqy]­ö’ráU cOÇ#“ÉøUÞx<ž,~ƒ (ŠòÅ3¢Ñè,Š"1âx£0ú¨Üð©å>ym÷7+ †cÙöÄtj÷ñÓf:ª\!#h2`PD7ÔçëPú¯scí+h‚ì¬\IÄtJ\\Á˜™™™z½>‹Åãq‚ ðGž ~ý#I$a ¶«ýÕR_¢XWåJåL¹+ò$ÿnÍØ{"päbHrq˜ß¼ãº}jS­"Õ •JUh µá :?ƒº ßü'Í#ؼ¥»OŸe~§ó‚PískR“cïzJ°X,i‚Ph:df…o½KñÁüwE©Ø‹Ï¶<±ûóÀ¥!ÂðO’.›Æö“¡;†+FI…PE³¼ü¨jµO-\‡„âd‡ìñÀ‰?Ùò-DyŽ´2ObÖM9óQ ²§T÷Ô%/úÞ·ëàL™´¡51Bcç9*r§t¶aä‹–eù/šˆRFÛ`ò‰-;þx'Î%~…¤ˆä ÅÝŸœ 8dS¾–l#ñ÷_ÐSg/©©©ikk2žøV(<†I$’‰Í3—§‡Pd±0Çÿ²MMM<òHZ¤×ëåŸU©T•J•_\Ô›„=å}±ËñÞ¿÷Îèç‰e~§ó7KVJƒr´¸­Jô‘R(jµZ©TN긖Õ7ô'}kˆÓ){ù•.²?€_I ¢~-ÑY¹í휻ŽSÕ`$ïuýí¯ëo?¨Þø©jÝaõú?f<üCë7öèvŽWƒã ®s(öþqÿ_uüøUÇ‘–p4>¥Â\#­¾{x6ªØ·VÎŽUjRûC—O½y…_Gæª÷w$á Í#ýI›g˜ßÍu ÑÉ_¡ÛÑ[^~þøÌ85hÑãOߦ—N‘½¸˜Ž=)//ÏÏÏŸøT~~~uuuêšD"©¬¬¼îÅ´¯ bcúÅÂ{¯šé˜ŸŸÿöÛoÏ훊ÌaáVdNí9ò¦èX;cV©&oJA‹J¹üb¤7‘jŸÑ|v& Àž,˺Ýn†aΞ=[__ïóùP†!cQ<3ã ËÎæÛ1€Ãá(**ºÂ©œ>ú|uº#2‚Œ0™ÌÊÁû÷&slNTIÓêÄ ®ôä¨Üy¤-+ê—‘ñOKvîèü0ÑžãòF:­Îþ F2´Úë‚”U[V¾Ó”Ól‰1Scr&KÓÚmå-§ÕžqJ˜!ȶêÕƒÆzΔ ù/?8hl Ÿ§¥‡ú™3þÀMi¶PÍËË‹­^¾ÃPÙ=¼R~”:oÁŒ;eëfñ¾sÈr¾Óù|`y(0.©lËŽÔc,ˤÉÀ~6x šíŒÜFÊÖ^J(ÀâÁØøž»]˦,J#²ˆž6# æ° QYCðü]Þà‚~ ÝÑn]£–Æ îa™8Ê"gÙ ÎÁ°ˆT®RiŒÞ 3â #¥j` IDATñIg$6ýV£oïIÿŽ•ÊM5 ›DÃd’;:kNfwž)5\JdZžþ°6k—vë&zæª÷w©Åqæáä"gUÕ*Ùƒ47Tþñ~3Í$×¹€õÕòÛש¯Pmxq1}{Äãñ¡¡!aR©ÌÉÉA¤¨¨¨££ðÜÜÜœœ ›}Ê÷¢FlL¿X˜û¢2""""@E4cz˜MÛa|iAtÇnî¹_ñ•nÛÞŠ–V,ÌÐx5Ñh´ùä s÷å5=mØX5É‹22G­ù!¥:‰ƒA¾`}*þ0{¶#r¦+8€öÑ™ƒìú~V€â¡dü'‹"ŸÖ'òôdŒ² -jP–ÖH Hs§OŸæ[àmе玡cÙ&D<¦K™yóDóŠzŠn–ké‘xd2YP"mY¹!§û²%è!9è8He­åõ><±¶=ÑÓ„À‘»7¨‹¬ä«‡}‚cÐ`~ÿ¾»$Krçz•Õ@Q^„Å1y” K·C-˜¡–œMJ§ÈµÃ‡fõu¤&•¡…¥©Ç˜L¦´¹^zø@ädSô2 HàÕj½Ÿ)LÄWwEÛçùµ&¦R´¡áÜÀ@“ ?«Cîñ|ˆŒeÆQ¼sËßݺ¾æ~9j³Ù.]²ÁJJ ÙÙjŽ´µµ1ê ÉíAE€5¸éù‡TŒ{ÿxàØ¥ð®U}±,­œ»B¡ÀìèºþÒî"¬¾­™/7ª °ñÏ>~a£ogtM8 …B4M¯^}•žœ‹þÔx]ÒðX©œx¾xPÈíÄ)•ó“Õ“ÚöÐÍK¶ßàt())‰F£|KÞmÈ÷ÈÎÎfÆb±ÌÓϵˆÈÜ" B‘¹‡9sÚ J¤äªt÷QPlËÈÔÕ4§ï#J ÍÐLÃ}-É,GžHØÒßeèî+®Ê-v8J¥’¢(œ :âñs®áA¼—6 ±mʤ¾ôæ³É qK!!Ôk¨¼m–µy¸uâʹÁ`„àÕ›.Õo(nmJÎÃÆƒÝ´y´¤†æ7çi†¡×ë‡ ýEn¥²¡¡hšö}þ9Š¢©ÕhfAM4ËH¼¸ß3àHz:†¢¿x3ö…5ª›ëˆÑUi$à TwQ'+epÏÞùwí—­XƵ¼»ÈìˆD"D,jéö`›w¤C„àD Gß ÖëH=€Æàù;´ß|ÝéL,š¬¾ÉV¿aºy j§È‚çSÕ ‹bÝ ëv$#T'§0½^/“É0 Óª‘* SScvù™¶è¥>ª}0ʤhC—ŸùÛï'gƒ·¯SWæ%o+þ-€ìHQG‘»¢=‘P·ýLè?«/ s£ë†KQ†a–Œó‡/1jN)’é«S¦×`Öº¡_ÌgŸà==Oöô™ænêxkØæ¡1N÷ˆëíªH{êDâÁ5& `“ Â@϶~w—1¨K¯—‰¡c5Bj-­È€+T@D«Õj4—ËÅW¨cQ¬¿°b ¿ÌÀ1%eïåVÁBÉä`ðûS´¦é!œ©1 ‚Ðjµ‡ßt8¹¹¹B_2˜máDp ¹g£zu™lï‰@û`òsu Ç~òºs§©ÒMüžŠ¾˜,ÊF$(8Ïów¾®~몴œïôH$’•’T†®¾ &[8m}%´ÏφÒö›1ÃfÉJ8B)ðQÒ×sÊîèzOK'üNj&x¿ûƒþχÈL9ÁåRƒX4y»±ÒV»Öm´ä¯Ð˜™™)ôûæQ©TÓY­PËÑ[W«6Õ(öŸ½Jõžit FïÙ¨©-”Êd2Eùž ŽV_Jô¯ëˆVuG/z>-¸´±·< Í:Žz®˜«ŠGápØhr¿=Z¢#;1KD‚*¢9»ªTv×zõ’”‚<³°'A+V¬˜Á,v–y9®E„(EDD®•P($ƒñ '„y™Ó’…«µ“¾Š$ÉÁüRA²—[8ûbÊœô`Ç£R©¦ÓO a;‡¢½£ñžÑØ3á^Ã8æ‹®·+#I÷E !ª7S®Žâ(ªuTÓçîêhVÄQm¹žÀ7Þüæ~]P6ÉìGjkÈ¢j²¸ÜIr­?öå%²Ý®ªÜxY(D±‡¢˜9SZY“(©±>W‡ƒ/ó8ÍÓΚŒŒŒ„<9ÄWn×7÷P¯ê Q‰‰y$ÊîÈ-—hµQ/  {ï@æßŠIK¬kOèðÝŠ­s8 ‘«‚ ȃþĆ¡õkÒsÔ«Á}'¢-iû‹ˆìÛd›*ÈBà$y±±ök8€>ó¸Þ.¢’"SKûµ´?í况U7¸32aBÉ~‹ÅÒÝÝ=ë&or z÷õ¦ÅÇggÚ#BµL˜ýó~OUžôö›Tr¹\pÛ­yæ¡^•ÏÍo>x(ðÃÒ!÷.¸˜É1ƒyúo=ÌIÅ#Š¢†Iu¯ 9^csˆôôf„ÁÕrôþ-šª¼%Þt9WšsDc.DA(""r­ÄS¢%TéIÊ­‘œ"í»H’tꌵNå÷pshþЗ'=Øf³E£Q‹Å2é³.\৆€Ö\~©?ÞÚu¥×•G}ØýnªôãŠ?Ußԟðú}¬ÖÉ¡ìq€¶uÚ§Þ÷æØšÐꤿõšû×÷ëý HŽ,Áókd•D¡ K”¹§?~V¨±Vkæì„5¦¡Üt:]ª „±Â-‹Eh|ìt:##2¯‚°££ƒÿ,~¿Ÿ¢¨ÔÑùð„ÔHóÌä+‡¼mIWa“¤rkô(ÿx]'{¬<«›NÔñÛ9š…›$K¿Eøƒªërr£¸QŽÓfC´ýw7Œ'u§3< ¸¥šLé=q9üN“.F'VŠB¨ìùŒ‡wú>Û8qS´›Ï°´”Ôøå‰K.Ma4…‚À0«y§A=¼U»©FñÊ!ß°+ù#v±j JLÙrJFÐ$IÆãñ®òu'ñÍt~f×ñОMJ,ô2}à»\žYôý Ãá0NÇ5î¤IÏ•$„ÑY…:Í«KewmP§EÛŠˆˆ, Ä{Ù±œ3aæÑž‹%sçLÃ}B)€ZTi§JxãÃ)‡ò“µ Ùæ¦s¼;ñHŽãœNgêä/Š¢\.W÷ÕØF¼yÆð›=žƒMÁ‘ jã˜G\ïT‡“S[›ÿï'ä][›ãÅ—½CSûÕúŽœd´§ÙÍ|çUߺË½Ž ¿Èø×Tߛ٧òu»ºººzzzØöV¶½U8¸§°’kAˆñµU'Eèå-Àë.½^/„À…ÃaAp1ÍD¾Y\œ$I¦zZìvûüyÔrôéÛôw­W ZäÉ C\GÛWˆÝ4¡8€ƒï÷Ó#ó1’+°lïôx8d6ñ†õ©Ïž‰¶þØ÷BªÄ»C¾å?´Oój0D±/ìó¼vØ'¨A ÎôU6o½›©[Í¡ã§"rºþæË›nÔ I’A¬VkêæŒ<„©d‰oßgܹZ‰¡É²,´JõµØÌRMŽR© ©4Ã9É&4[φrìqpàÞ_ø^ q³É$>4Æ… f7þ¹" )FœB¦¨Mp@jsïš§vëÙ¦Õ ˆÈREô.;–s&Ì| ÚR<„€y$æÈÊÙB^(ºMÖJ£ø8®j¸gâ‘'{<š¦Ó¢F9ζûò¼Tú»pÒ0«ôs*«öa Ïc'ÚªÂImc×á¿~@Ç;ý&%çîÔÿÃ{¢þÄK ¾Ø}µ·ÕêG5#J¥rx¬à§4ÎjJJ…˜5ÇkLÄ‘$9å&—Ë%IjŠ /qOÍèHs•\Ù]œ>_"¿«¿¿ŸÏo‚ ¦YÌf ›kÅYä‹û½=L˜\¸Î@{è¸g_ÓWn¿ÿç¿Ä9âý¬ÿïiŸT¡ó"P'eÙÞé±–sÄXÅ`Z*#Ë’¾Ù}‘c®¼dá¦'•weá&~³ßÿó~78®ü’J-Ïp˜!8]v6¾yÃqEÊ‚Œe|Z}X¡2‚t⢠hµZ©TʇRK$’kq›c(ܺZµ¢Höú§¾žÑäòË!½^]o#hå™2I({…Ñ>$¡"€²ðÈÇþŸ<pøèÔ§¼aÔ6v¸ŒÝ®‡FÞæwfÛéí§C¯QÀmÿ™ï¯ßÖ<ªAgV&Ó®Õé3ë 7ËAÇ`ôLG¤¹›Bbð0•\ããEoÂV=¾¢lv'_¼ˆf¹X¡ˆˆÈµ"ÈsJ)B—)‹Æ ˜ ƒlør¼÷r¼§®r0 CdeOB°­ø¤u¿Ù’¦LŒ¤‰sôAj CàjU¾­.ú©=^£/飰ëð_߯ó)QP¡ò\<3·äãÖ™L&“É4q¿\.—Éd©±dYYYÓ÷!Ìúâ4i‚Aðòà8ž­ åáÎ@I…;‘œ¹!pæ’¬”kZ…)œŒ)‘@x(r*3mNYí=‹ Èår¾Q0Ô Œ÷^•åy§³m-ÈXÌ0%““ùE,° ¼{*zQ8FŽH¿ª~ ”H—?Ûyå7µpó Åî5jŠ’ûõF#“ÉRíÉoN|w©TZWWw…ûH"‘èõz—Ë5W‚EaM¹|U©üÃÏ»GCÚöÁXªŸóÝŽª›ïOCÐÜ—>ŒüôÿcegÜ?ñ¾øÍ£ØäÞÎTX–M- ápx¾a$Ê^è¦NµEzFÓ[°V¤TÛ:_"EWÞN"¢ ]DdY æ/;úûû¯÷–¢=alb‘ÒÀŠ’É}ZH¥R/x'tè{ž_ÿ1ðNK¬3©S5à‡ë“é7•=±Ûަ{¨¦ÕIßóiàÿÁ¹ëÄ85èÓûêv=‘óت-udé•ò…*‚ô”T_®n`¦nzTk;+W ÍÙ EVVÖTψT †a™™“·å˜”Y_œƒ]5ÍŒz~\#$I’-I~Ø‚XŸ5n•ߊ„“Qy/?êŠNužþþ~–em¶D׊4•;#A¸<ït¶¹Ixì2g+UÊÆ«AªþWí—5x¼5üÒÁqjPJ"w«îöuj^™óš'Õžr¹<í}ÍfóæÍ›×®]{ÕÌ@«ÕŠ Èôk§†Â­ësžÚ­ÿÁߙުÍ5Ð(Â@•¿¯»E8,×Þq$9H7ëû™ï¯i5W'…MÝ“ê0œW­xÄrÐÚ}ñcÏ÷_´¿6>O’¶4š Fh.–lÖ _ërcÙVšDc.Dá²£¦¦æzaI!Ú“eY†a c¸WØi·æ‚PX¼ÍÔùgÏ8GOõry\¢ŠJ1ioEžÏÞ«H”Ýy2T6šñVeýHXŒá0ðôI ¨å¨šðÊ1F欶°Õ´Ž¸¡IÊ3زò»ÊêJÊ˧9wT(B×ç·dXL-æá>”IªÌ8N ”d²h2ª­¸¸xv¹@1 ƒƒ Ác±Xf¤Êf}q*•J¡\ÏÂÄ‹ $IQTH¥ñi ¯ Ž»Ã»ÿÆG!&•ÙAm{ŸÃh yÆ÷Æÿ£r¢¼ÅbCCC0V”ˆ ˆ4A˜Z÷ª,Ç;=J¥–Ïõfå>™¢õ¨æŸ5±D£ÑO/„Þ;êO•8ÕÒ{6¨µÊI>Sí9QšL¦©ÂDÓ0 z½~šÏÞ9)“  e²<äÌù6VYÕÔMŸƒªÚð¥ŠHBAÝzf䢡j¸"á¸ö°þŸùþúϚǮì'œ(ÿf]Wfª4-šáZû£­}ÑKýT 5°[ÚþA´ õéÉ“›¢7â÷‡ ô_~‚ûbUŽ K‰zá݃ÀqœÝnÏÊʺá2„½Üc)²”\yº2r†J¶F0bÚÖ<¦G5Àì=8Ø”4/†ÂÃ[µ+K¦™'‰ãøôã“)))¹úq׌V«5éå«Véw¯ƒÎáè©SwäŸ~FÆE€dã_>0ôsII¤0‘oéaý?ñþåKÌ­yò¬©ºwN„³ö¦A3\çPì|7u¡;BÅ&üþPh%ÊäuERGš_=*¹Q ²õÒÚu’Z¡*=¨Õj¯×Ž#õ‘b:õ]ÇÞ”² ß”‚¬ žY<3ù{wåf&AÚ³òóKiœ I²¼¼|úŸ+­çžV«eYÖn·Ç%Ò‘”vd©$9çš EQ½^ïp8t:Ý<µœ”TA(“ÉæPâN¡ÎªÇhŽå“½ W̦ѭ÷×í9CÛ‡ ØVo¼"Б;ÿ0´GwhÇŠBÙÆ…Y‡ îA»ÝnµZ¯ÅC¸ aSê‹väiÎ(“9fZTõuB 2,÷ú§¾SmIïŽ!·SW™7Ý>i‚Ðh4¢è òY¦ I’EEE€ P’%)¶æŸö®¬ë8Æ?k‰;î;õ ZBç'¬äãÏÐïïê½ewe-6Ù§™C!ÍC· D»†cCÑhzÖ$F ¾ªT¶ªDfP'ܪC´]7¼Y…y›$S¼ZDDdi" Âe‡ØfníÇ–ÍH„{WÓijPª¿ ß°VR“V¢€ðÅuÇTÎpBêx$¹¿1ù‹®·­1Û¬‡Ä¢˜Ï`r˜³\&«É™••5£r¹A!ÉG£ÑžÌ©˜Êp ‡Ã‘=Ó^ËÅ©Õjqç›.p¼(¤Bp¯Ýlêƒx¸` èПÿõK_;ÝþÐ0 öÒY‰BùtVŸ7xòhsñKá²IU¦7õûòù|'휑‡pÙÝé±(Û‘Œý¨ž& JTþmÍ ˜ÆúÎw$¥µ”Dž¸U_œEÂIµ'†a …"JTž´ÀÒ€V«#ÂV:ƒ£üž5Ás£Ÿî< IMÈÔ^ý¾Æ=h.š©Sa§9… UHP» ¥(=°c°(ƒÑ,~zÔ… `Òâ&nÔ`5nÒb:yü9àö3vÝ5¸<#®+]ÏR©+’5”É ,ã¾Ø=o<åI„ÁÓ²¶üþÙÙgɰ<+HÍ¢1 ¢ \v,¯9Íü#Ú3ë#D,‘‘ çK’N;9"½M¾i‹tßL eO·GŽ] Û<€qž®{Öô¥Û‚‡Wš¥Ì¸*|W€EJÐ}:£OŸÁ`é?n|É郢(ÿåò²A&“q'h¤I™Ê ×ëg×mâZ.NA _ŽeãEa¼ ô£¸võzé±OùM®¯›zþ×kžüFmêÀɺý*oL(à/kFZ¼·äò@´mP–¥Ê¬ÈpHp8ŽãÖ¥2#ár»ÓÙ¶‹0&˜]lÀœ¸¡$ñ õCÌîøŸ>ò¸É”Z• }ê6}¶ñê+/iö\³f Çq±X,/¤'üZËå]å+”~,œð<ßáþ˜mÜý9S/JhiŽŒù×}ØÙx+Ú>±+© =ñÕŠ@jÑGò̤Հ«Ç/ÄÂL”æBÖæ¡¯à L¼‡­+’UåK 3%“:*? 7:’îAW†6Gk¾ú‡_Òô÷÷/ÇœáùA4æbA„"""×D,ËHNµÏ”Iã8À:ií½òm*49½ã8hé¥Î´GZû£43ÉTΪé]Œ$»‰ËÒ:GuÎQY$,GÑ(…Ðq”eYe0¥º7·@SgäµÃ¾¼ã24øS»uFÍ,ç‚H$’«–½qÐh4N§³­fMÍ©O1–¸»]ÖÞñ?P*JTßስé#ÉÑí˜Ý:‹w‰Ñ\ÇP´c(:£W©Xuž¤¦PZœ%™Â¿ÐO|>òÝÉ“3æÒY r‰! ˜9D4æbA„"""×çåë@ò4ÖÉ@ªSÝVI¦9茿ù™¯ß>ù,ýÏl6‡Ãa—ËÕÓÓäô~…BQ\\Ì×i`†¢¨ÞÞ^þ)E'6Ö›F£1‰`† EQv»]x Çñ…)n1}®ñâÄ0L§Ó-|!L„C± 5kªÎQ¼ÉèHæPOæT·¤žÈFÓÑÞèáBgÎzjF**tšq1¢,ËÒ4=ÍNËêNwk4ŒÕõ¨±~3Ûek×`+öŸ>L‹TÜP-¿k½f҈ĩXö”H$:Îív{ æ¶ê†òæ“ÈØ/¡Ñ6ô•Fz³4çói¯•F9MÍv¼]ìÁdÁqùÕ[àX@¢ê0Ute–+“à!‹rÊ# P˜ÍÃøBÌdož@!EÍ:ܤóŒDmT)›ÁwðfèÀ㬈 ÍZ#r¥Ä2ƒN§"""KQ.;rs—i«Ùyb9ÛÓφžs¾ôT»SØsd…òAÅ-ÛdkRëоvØ—šhÄ“¡ÁÊekÊä*yr“››‹aXaaaffæèè¨ÕjM !“Ëår¹Üh4¶¶¶ú|>~'Š¢*•J©T A›¡PH„F£q®šªËåò²²2þq0L„ó/z-\ûÅ™‘‘1ýsÈDA4A¶4lÎÕ߉\­ÀO*Ç­ ^œíþ¨`·)—ÁÑäkãñø4¯ås§³, ­ÉöçŠ%‚sÙæžuÿuÚ¢ÆYÇû6©×”ϸíÒ°§Åbq»Ýà6Y»Vn(n9 Ñ„ãaÙ‚OÁÀÕO¢ŠVœ´²ö®ò€ Àùe`Ób`U"l^EïhÌb–ã@«ÄÔrTF¢$dh0µ€ÆÆÆõ•3Ëq½kÿŒ:½ÉU¯Á¬Z$ œóʲ« 5ŸˆÆ\,ˆ‚pÙ!–{š[–­=Œç—þ—ªÏKÇú\ù•XCé+dÕ©‡l î=HËì«-”n[‘p ¦!ØS&“Lõî2™¬¾¾>‹aÆûëÒËåB˜¹Š8†ÔÍP^ûÅi6›>^pO úåaP¬¿¤Z³iÖx@:ЋÒ3ˆùT1Á›{?yžy´*Ë¥“&êûÇb±iúu—ÏîV;†…Ís%ULC5nßãNOÂÌ5lÑX 3(Þ+°4ìi4…6¡6]†æžGå{ßTø½W}áD,C½,Šõ”Õ {8Ž£(ÊdRÔW¹Dg:áö°þƒð¿Ê½É |_Ff–:½ÎÍ2D0sˆhÌÅ‚(EDDfÌ mû•ÿ•p<°ýtHØéÈ,*‘%%\4νþ©¯©s\g-ƒ»w£¦èM EØT£ØµFEâ 4…T«ÕÇl6Ï_}ÎÂÂBŠ¢X–å8.µG™Èµ#B‚ V­Z5<<ÜÓÓ£R©’~cœP¯ZÓ¥S'Í4Æ´6 m0_0 >ðõm«ß鵞á÷Ô‡[ºƒy§¹ZgH¾Ê:$ Â4ÜAOÌžŒ=_,#NnEƒI¯‘„@n®Sn©SH®^µdY`±XA,Šääåcëé”EBaÒ§@Îåøz2ÑÆ`Xì›ú§IEÿÏ/¹`ÂûšÛÓÕõƒÁÄBÛT5´®…wB»â‰j7å)îA¿Ö`ÉY q¼"""³`áill¼ÞCXR,{NsfÜïý•ÿ¥0Gá ìHqÚ² h‰ÇqšáÞ;ææ]WªTHѸ]çzõUÕàÚS­V€Ù<=µ233 ŠŠŠŠ‹‹gÑÖb¾YÔ§FXZZJ’d~~~~~~eeeª¼G$­‰9Î`›{+”\2¥í êÐå»jÁ”¬ø¿Ë{˜äâ±?øŠ½¼SYÔÆœ&ÀŸÝ{Jû“UOZ°ØhÿEa}¥ü{_4í\­¼v5¸dì©ÕjóòòÒv †œõ›FòJºÊê.×­ë¨\iÏ«7·ztJ^ À0æüIð/6†?ùu%®X„¡3[N 癦 lnnžæhÏD[?‰œ6z’ßcØš£ãE`&ö¹*¢1 ¢ \vˆñÜsË’±gkkëUiŽuþÆÿj”‹ÀšK,ÖÃóJpqÓ?Óyø|(5iТǿu¯±$kZa¢shOµZ­P(–d$ç4YÔ'/Íf³ ù äòôâ%=À*VþOš‡„"·ÀŸ£u=p3Œ)Lj6@$N¼~ oœÖœ{Qs:xƒÌ¯Z?ÅG»eÑ„Ûß/%†l›XQ$ý·3îÛ¬™QË+°”ìÉÁ61 +++Ãq<õÇAõ%kþ—áÉl,¹„ád¼?ö¾pYÅwß+ì$;/«=‰ö*Ó f…žÚöçà{Âo³™Uç $Å¿¬fÅtN²XnDc.DA("²LIíáîñx\.×ÄÎÝ©´Ä:x#ÎÑ ¤¸Û“Û¬yq‰tÀ§ûå[®Qw²Û°¹Vñí{56ÉçÞ­´ðï+2'ð%KK¯Ò&[­V¯\¹2Õ³‘‘‘‘GZÿQý$r"X`+9ìY—œïn œÀ9â òÜ^Ϲ®,cüaöíFÿîoi5]Ñ™ì.x‰¬F¤¾XöÏ¿EgÒŠ9&SRVVf0øÇ………|zsjö²Éd’ËåFR÷¯Ú/U’É­aŽúµï•Ãå’œ7¶7ÇÁ´=„Ó©ÐãgCÏú_q —8Ž`OÛj°±ôŘLn(¯šÎ{-–FÅ£ј‹QŠˆ,Sº»»…ÇÃÃÃ`³Ù¦:¸5ÞóûÀ›4—p Þ{ȯ¤z’E±þܲs£ÖÓzšIŠLûꆻ֫‰…JœHZ<¡È"‚$ÉŠŠŠé”¸à5ayy9ïTä}5¥DÞß«îFÇú}Óó˪!vÌI¨b‚ ¡óüc†åþú‰wß©ôZ¸Ë„Sm‘ÿûŠý³.GhÍAœckº’.)¶¼þ»˜Û¡]Ñe‚ UUUjµZ­Vge%‚lu:ð¬°8%E$ßP?´QZ/¼–öµð'm5Á˜¯[ði=˜»¢2aŽúµÿe7ëö<ªØ­mí6™9b9‘åŒ(—K&sãa‘Ú“¢¨þþ~¾ƒV<w:`·Û¹É&Åíñ¾gü¯ñ¾A¨ì­¾œt#ôT|î,ôK>i(“ýëƒÅY“t“»2‹Ôž7&‹Ú˜‹E˜O_A233×®][PP T÷YA–=®¼]XpKéÆÚdžçŽÐQllƒã`ÿ™às{Ýáè”í µ1'eÐîC÷+‡¼ÍD×ä¤á²¾¨|¬Í #“ß|Gíüùö—ž=1 «­­­¨¨b˜Õj5†a`6›S£Q@Sî¾O±]X°€Œ—Ë’¿¢–Á išïiq-ĸøoý¯ÐÉõ¾m²57Ij°Î6aSTvï"""²¨á²c)enÜ,R{º\.èììä8ndd„oøF½ÞôZ=ôÐo¼¯jÐꤟØžéM¯!;\ád/c <¶CûðV­”œcp‘ÚóÆdQ“ŸIÏÇÓ‚„o’Ö> ¸EØÜ·JóWËcÁ]ŠÓhÊEzy úÛ=._hòù÷¢6f*îs¤%üì{®Ÿ¿álí‹@¬þ(k°ÀÊŽäB[VóÙtdÉØ3‚ Æ ?Õh4©îÁTn‘­ûºú!9’\¤ø¨.ip½c„¤"0='ašºN­åb¿ñ¿*”€j²ø~Åvnt %Âþ #K+®ú.ˇ¥·Zq¹X¡ˆÈr„„¡Phdd$µfºÝnO=¬?>úKÏK1$¡Mú[o$ѱÙŠþU±ÛM6M6iñïÜg¬/žV§o‘`›lÍò-üã€=Y‘œWx.ß”; ’'ÿGÝô¯ßvÙ‘…'"Û»­ä°1·‰pœe¸¦—F˜¦®»ººøaŽú…ï¥öxŸðT ‘ûÕ}( lÛEa§OoRj§ë_,ÉÕŠë…hÌÅ‚(ED–,Ë žÀŽŽŽp8YhÎn·óÞB9áù+…$&Ž —¨{É'‹$—«k7v@²¶^–þéC†XyBäã6ùÆ[e7ñOV&¡Î1bÂ<ß¼[W`IÆ6{‚Ìo÷¸K§?!Íp-¡ÿú›ã¯Ÿx»Gƹ›˜Œ‘h]¢ AEOLKDŒÓR^t•r>"ÓÁ`0LlJ‘Š Óÿ»æËk$Õüfc]R:fŒt#,;Ó4Âh4:::JQ”qýØûçzHx*ÏüºúA¾Ø})ÙmÒgΚX¿WDDdY! Âe‡Ïç»úA"Óf1ÚÓëõ y)‚üã¡išO,tP_ £QIœk¸D}ë5Ïãû|’XÒsrTݰO±AØÌTÿá6\r­?)‹Ñž7,¢1îQlÛ*k€+i×%‚QQŽ3ÚeóÕ;ôµ…I¡¢Øgßsu ›ˆ/FcŽºé=Gýÿû/ö·ýCaYy€ÞpÐÄ/Àªöäç å2¿µ £=gB¡˜Ê=( Aˆ'Uw=®¼DˆÓå2j,Ø^‰Ú‘³ö˜{Fïèp88Ž;êmú‘÷O£ŒSØ_€g}[óEŽbÙ€H< tAÉŒÞBDDdé! ÂeGÿÕ™6‹Ñž|¼è”ÏvwE.ž9ýÉoî:`ûî‹®ÿûŒãñ}¾¢¡q“ãSŠº÷ÕÛ…Í|­g׊¸R1Ù£=oXDc¦ò bçÍÒÕp¢29A×öÄb1C¿E·¾2é$¡bÜ>pŸ¼œtž/.czÌßxòšã³ ¡5nÑ(Ì$o]/Uí>Dã‰~Rë‹r•uó=ÂÅeÏ`ƒtÅÿÒ>i”[NU$¯Ïâ^û³Ò·_ í°¡+¼65M«ÇÕ4·í5ü`„KÆš–yßÒ|QŽH)ŠêèèèÝû.ŒÕ ª´2“y®?ÍâFL{›CDc.I‹ Þh È⧈Ȣàøñã‘Hzã5µ×eîÓ;G‰Ø•RVâ(þ±js£z  À•g8ŠôîÕ«W/çð"‹àµÐþ&û‰üÑŒý¥\úÒ=+ʶò÷ž 8L}ɦÅëÕèuëœ2czm±ã—ÂMTjGÖ”Ë7TËZô7þW/Å’g¾ÒSPõÎqþqL*c¿ù=µØ=ìz@ş]ïlúÓ§ü&ƒ!ÿñ´1(CI„X#©Þ"]•ƒO)Þ<¬_ðh#ÕD£ã–ÖIjUîæ#EGGG[[[kÎ4ª=þÙ¾â*Ý÷ÆyûL"""sÆü "1ÛGDdy‰DÒÔ "è/¹xZ¸zW—4ïí.'‘è¶Œ£ÌJëˆIÔjµ¢¹ñATì$LX{îGe}‰…áÖé|ójI%ì^£’KÐ÷ù…ÿÛÏ›C/ýø-º+WÍmiiá;pWSSÃ÷%_`zFcïôŽN’r&— k+ä7×)”2”x)¸7U 6Hª*Ï%ëŽ83ssÅÛù:#ØöâûÆf‰Ó ín¥¯”Ǹx#ÕÔH5éQu™Ÿ™Í˜^ÊÀÅø†{k¬§á€K üB½_±}›,Y(‹QJ5¦Aœæì<õ¸¦A"""˹„gÏž}î¹ç^zé%ŸÏ7QÅ"ÒDןˆÈB2.^”㬃Ýy-(;eû5@ˆ\Õ")i”¬²ãa·J]eR’1ÈÉəNjˆÌÀ½ŠíGJ»¡¯™ß³ª-òƒ o»•¾²›àæ:…N‰½rÈ£ÿM—¢¿~ÇùÄ­:£fòL†a‡°X:㟶ôRŸÊ2ÛêÕùRKüù¾>ü9Õ$Pˆg=½ é;$ì W óÙpBäªàuëàÀ^þñº‹‘Ã+“ÁÌnÖŒº0ÅëÆ‘Éž4܃[RwÆb1£}X˜‡UZN«#É7ŒYbÌýþã?n2™Ž92ÕÜxæ|"WFŒçž[=SaUGAÛ…45%®,òóò6›Ö_|à»ÿmùú[Š©j0OëݘÛË«A™Lf0`ŽXtö¼‘95UwÓXâïOçg Fâo…¾|Ÿꊤ߸۠S&!Žºéÿ~Õv¦==К‡¢Æ)±`08éaóÁˆ+þ܇î_¼áœ¨õ*ìá­ÚïÜg\Q$ÔàÈÉÃÉg¦ùšúÿ¡O„Œ2¿Foª¬^€‘‹çÀë×pc«çV']å˜Ùú‚,N®.Ü=°*M @45Ú’= ælµèœÀ2©x´0ˆÆ\,̽‡ðâÅ‹W?Häú!ö„™[—=†Ndõh;ÆÝ­ÍE’#µ²Ë¹$‹"ʸtkgus(çò1H]¶QHÑ/¬ÂälL©ÌQ(J¥R.—OôüÏšÅeÏјS¡ÐëmVãhbf¼ª•ê²G©óvÆýÕ}*T‘e$¾u¯ñùÜýöDÿ šE_:è½Ô½g£Z)·–šƒ½0‚Ðd>:8Ý™¸¬Z‘'ÙX­(Ë–¤Ý—TÓ¡…M*ÿ¦úÖ—¶5 ;£å5Y&Ó<Ž{ ñ⼄No3ZtŽD‡Ø¯tä]*ªm¤ÎµÇûbÜ” Q@tE‘Ûœï1¡BBñxœ ˆÔcX¯Gå[D§Ùš-  ô÷÷×ÔÔ\ïQ,Dc.ÄB‘e„ÏçãûLh<Ž‚¶dÜ#“¾¸]ÚT’X‡–0Ć‚!ÿ¸T¢ûämfµ+ˆ,b0 óå ‚°¾ƒzóf%ƒ!ñÿÏû§¯ªïÏÅ-*9úw^=ìkêLê½s]‘Îáè=5+Š’5uXFãܦàgBq:] 晉Ûש 3'‰<mù[ðCáR„ü†úa3f¹ô™!’(¦Êb¸yû­ó8t‘iãÉ+!×|vÅm÷®P—ÑÓEöÑ#£ŒÓÃø).Æ«F™˜1 71—C1wòRä8Îív›ÍãŠÐ¨zÚ…UΚSX¿J¡P,ÐGZ<ˆf¹X¸‚Ðb±¸\.£Ñ¸mÛ¶ÿøÿ(//_ø1ˆˆ,OB¡ñXYó)d,R”%‰_Þ¯é“x8‹V¶®<ÓY¡“KË( ÕïC; ¥R1¹Hd)À”Ä›Žñ("lE_¬¥PnÖ÷cß ÷Ê·m•­!pä±Úb+ùÎQ¿ ¾‚ö/{.öÊîݨ–IP˜2‰DhšÆñyù{í޽|Èë ¤7,°·¬R–åL[x”:ÿ×àܘ³Ÿ@ð¯©ÈÃ3@váŒpX´¨TªPÎǰEfJ$» ~îAÇ ‡ØöKhE Ž`eD^1I§ûX,vÔs4mgº dYcO›°…Ö­²XÒcJEDD–' =·»óÎ;_ýõ@ pêÔ©†††-[¶œ;wnǰÌinn¾úA"ÓfqÙ“÷]ä·_Hö–@—v5ˆpˆî̆öËU©jP)CÿñNÃ÷J¥ó^*cqÙóG4æP¨ÕNS–°¹ýr2cæ˜×B?ãÕÏ`]¥üÛ÷ :õåg;"?zÅqè\(Fs›¸ð+/áp&^©­Ëð‡Ù·>÷=ûž+M ZôøS»õ߸Û0•ü$râ/Á÷Ù15ˆöª{ˈ|à\ù`¯p$»bÍd'˜Ä‹óÊr¹Ó’-l²M'¯|<ß>m§Û=®©}üÂY’J\« †«ÖÍÅHEDD– -÷ìÙ³iÓ&©Tšýíoûûßÿþw¿ûÝé¼™Œïÿû©‰éÍÍͩ٫©O¥>öù|©EËí ¹¹¹×} su¿ßÝÇ››{ÝÇ0ý3„B!ÓfHySÆÉ‚ä4‚lº)ÜW)Xôø®*—^ 'Îë§HCßÈ–\gnöEý)æé .—Ë™™¬Ž[ØáÙ + …æXç<øÌsº¹¹ÙkïüBµ{u~E’7K0¾Üÿ_³7à|[NóçÏÀÅ‹›šš†‡‡SÇpüøñ@ 0£OÑ3èynOÏ_²¹Nó«åè†âàS;ÉŠÜÉïMà­Ð7BŸ/B}Ru—ï¤ßdžlP®ÖaÅ ö]ŒŽŽ^ãn´+jnÏ ‘H™¹ÂStk3ŒEöN¬dÆ*’—k‰–ÕÂñ(Âm®Uî\­’‹§-·ˆÈôˆF£GYyìY8ñ„Ývï…U–¿?sãB@+ñ‚‚2.TÒá/qÓig“´Eé7+CzYE8«ÕZRRòÙgŸñÿ\f³¹°°P*•ÀÉ“'q_¹r啇7⊷Åì^Úæ¦{Gciÿ[j©÷fNNNêtæ˜?ß;MŽ"üiÕ=µd)¿é³Ûd¿û)D¶½jUéýˆnúûû»ººVýX¸>ñ;@×nšêøãÇ žj¹\.¬¬æåå74æ¿G#HçÎ{*7ߨÓOzÑ/Ñ=me}¥ÎÌrG–ZOìÀÏôÈ>=¤RdZ$Ž÷xô==†r:i8Ÿ¢UÚ€ðg³ÙG^^^NNN8æ8ntttbú–/ÄtÄÚcmQ_(=KPÀ ÆÞªM­Ãq\ooo,+..æ÷8ïÿÞê£G„c¤ù5õƒBúÃ0®ý{³ÇÔ`\"ugæ¦U¤¹ŽðËöÌܼ®KüæÔÑ+ÂX,&<ÎÌÌìêêâ'œGï}K8À«7q†ŒyµˆˆÈbå: Â×^{mÆ ×w "‹›Í‰D&–Õöx<:îzê㸉¡áÁ~k§°yp•|Àœø@]&òäfþqi¶¤H;ª‘„r-% "²tQ*•ü„á8àlÃt_>¯à_49ñnøÓ8—ð2Ûš1Ô¥·•º2 被r7VË?»úìB(·¬É°ˆ3¬pöÁ™þ°’,ÐH£J‚R’1oïÔh4 ‹^nï‘(ôTõ‡˜Ag¼Ïï·Çav’Q¦ UbÛë•k+d:îîŽD" à Èd²¬¬¬3ÑÖ¿÷¦ú9Õ¨òê‡rSºÒ9úz-IçáHv)“Ík<’ÈŒàÛ:2ss»[×çÈÛÕ†•M<˜¦i†I¬ `f0AȇŒ2Ÿàz»„ã‡sŠ”’yOYD,¨ ܾ}û×¾öµ7 †ÁÁÁ—_~ùç?ÿù¾}ûr "K T8æ#€^¯O}ª»»»¶¶vÁ–ºo@{Æãq›Í–¶Ÿ8ø¡ÐƒÞ«Â>Z›ðþ!!¥ôèv°ºÙÍuŠ,#árq×ËûzÚsñ"óÊ(•JDê1Zôcõý}Ÿ~bøÒÓ ·ÈÖÕ%/÷¶ÿÿìÝitçy'úç­ª®Þw}_‚àNŠ;iR’mY^dÚqÇr6ÇŽ3ã“ÌÌõŸ«s'ÉLrî½9“ÉÉ2VâD¶eK²-ÑZ¨Z¸‰âN‚+Hû¾4zïêꪺªQ]l€XÈ@ñü>UUWWþ*xúÝÄíü›¾RÔÛ?ß[¿Ï²é3[ü»ÖعØ)ËJn)¥(ÌÁ ]çíí[I€Ìô¯]‡y«,2íZc__oÉ)UÚ°‹+×^±»¢tè_ °þÿèúÍÖs×í}Ú’Ól IDATð6'fÚ”Òœi¨¼Ö¾´>œ³³X,f³Y˜(,õô«åãÌX^¹rEÛæyÞf³±,«–ˆ©TJèê GÞÔNýE>ì|ommm¸X-¦QÐ/õ_1jÛjÏ™gžyæïÿþï¿óï„B¡@ °ÿþãÇ75Íð¯Z<Çïà‘‘u#ë Âñññp8œJ¥–¬ ÌÃ<»ººâñxNA(·_·ôÜÑvívê裴ÉùÉc{š v·ÚÝöÌD‹>Ÿo¹§ÊÃ< Üú—Vi¡ýöõÐà€»¤ŠYÿŸ¹¿q*yù—‘#Q’ë(â‰3&Î4™ªwZÖ?Òh p}£QÛHÌ1³Ç«…>ozÒ-ERÄac&o'_9d*”Éfqã9ÒPf®+ã Ý\‘‡-pÏöË:‰(Déð·õ¤”»Æ7nàW=í|ÒJî*öÂwnûtËôÕ¬M¼ÚGqÉàÃ9'—Ë5:::PUŸ-o]WFIQIΙÁ`PÝ6›Í„‡Ã¡v tÃG¯C:óTˆ&þVó ÄŒ-„÷¦MÇ…†iô ÂY†îß¿ÿþýÔ?­@ÃÙYòr²ººº •J­ØÅvãñx?˲wõM§¥7~©ÓQj:ßhPHå­ßz¼±Ðs×?„%þë¡¥g³Ù è¤,6ul-#¥“G¸¿ö õ°Ý²Ö7`9?}£ ?Åek-à†ØuCìâí\ Ê]>éÝ#T5Úc‰ÎÜ´ž`,W­—mÍæê{U†lNÞµöIGózÑlÉœ†îÁív/÷-<<0L£Xæ1„݇h4ªM¡¦/ÕæA¸{xýJsûömEQÒét,s82kLK'>PÆ2mª2C~ù)—B¬ íü“]›pÜZ™¬V+( Ó_YWÓž™+Üqý’”8ÈZmÙóD¥y´¬a¼¸Ã?|³` ÁÝõÏKФAÚ{´½t,wêÑ»>KNnŽ]Þ»ä<§\›Î;ÖŠ¬‰g%¯Ë\ì·V™ª¦€×Ä,d)¨˜’ø8yùhòüˆo"ç%_ÜñxtóæÊÕ@„Û·o©eCꕟYdžµ3»[eB Âü£#€ª×åOÔmþúee —”VèÏÔ·´$b%§¦~ùoE3-w9ZÝ0>µö&þçFé-õ:„hÙé<1(­¿(ˆ¢¨Íµ­6ÂÒ„y•g0Ï LÒV¼QB“âûÙ‘º'Z-}E¬–ZþCýÞ|«ó*O£Ã0gÇó<˲0\V-r™6“˜Š|ôžþ4õßNf›FKŸ¼¹igÿª:S¦?6#+Ÿý8öülböjPÏ›žüìÄ‘ÿ2ð÷¿Ç¾±¿¢}Kɯìvl_m+ñÏ· ËÑO„¶¿üNüÏ_ÄÞ‘îª9‰]?XýèVe8uýúu”eyddE:r.žÑNúã…™þ‡KÜ)Î99N†a`¢°$iË|»G%ý«@ºkÚT*ʼn©Úë7~üžãöu˜^ ò<÷åßîhZ§;€-„¡,l!\q‚‘ú‚Âá°ÕjÕšai ÂüÉSQ”Û·³“ˆ†B¡²²2YÁ¡0 $j!oîp@5Sö]ÿç—çFg•?y>0Ì9Y­Öh4*±ÜPe]ÅêAóÙ“°çØ2ÝÎEQÔÎgdR>áû­–/Ž’Éó#7¼z¬ºï®E %–\ª3w”óã.Ö"Êî¨\;ªëM9’w ¦0¥ÅªÛWKznÝj¬»Qäj¬[e"3ü:ŽF£Œ›”#cR°79Ô- ’±Q˜œñg! © µVXÒ¼övA Øy'pä5ùæ5íü„ÍѾ&»ÒÌ7áÃ9'†aG8V¹ÓغúâÇêqe°_:v„Ý÷¸vfüâÙ×Λ„äô‹È,;é-ôüÆ7ä@‰tì˜zeYŽÃ?ÿî g<¢Ã4 üL8ÖšU‘H$h̓ ë?³¢ i“ @8N¦”S?9²cø†vðõ]Θ…8eûw}_å»·‰PQ B¬¨+íºÅʰ‰xê?áŸþ¶zÎô/˜Aô >ö«“¿ëOðÓ«­¿Þé;îjéû`£‘•†>qÓä¦I“”­ ùTªåÊõѾöít\l0[«™ð,a@Rä„”HJÑÂ=Úó…TMn½ãiN1îhd|œ¤M¦XûåÚXÔ’ˆYãQý¢i}ýö´)ÛL„ÆóÛíV¿è We–Ç”Ž¼ ’Ä~êÓÊP¿täðªWrÞH\îñ‚’A—/ì-Yv o±ëclœ0a˜F!2˜œæA‡ÃúæAX‘c%IºsçŽþÈdTüñK·³ó-íÈRþã5VNf¿I>ëbVè¤;é©Ã@4ñÕ Z#!ܼ*Ÿ>ÁlÝ w·€IL)¯ÿ"}ùœþ h¶ ìØãÙ³j[¢»-xsÂØì»d†Ü¬äoVò¯ívìºß{!aKf«³ÂIéwßõ¸7·;®UóŠÖ{ݹ‹X_óXášÓ•Ý]ÖXD=è™ý=j5¸vkbª"`“Q¾Ò†@gÓZÏøˆIdYzÿ°ôþáÞãõs}ŽY»)ÚÑ1Ù›) #‘ˆþ¿/„¡ø `Å …BÆôIQ”éa$Ñ7ÂÒ„y’goo¯þ§Ž‹¦³½å¿Ý÷¢YÎLä'Ÿq­½õM­µËt›sË“<朴‚zkVyƇ¡Ìôýé×Á¦²}ozjÊ~NLú»Ê»oi+ø©& í-›jš[ø²5|}àŠ%•JÅùÔ¤9¶%-ξäа<‘f¥ˆ•9¼ÍñÑû¾ó±O‹›u‹ÚW §¿ýêd!÷áûÅFsfU˜™…øŽMÞ–G¤êâÓ×R'>dÓâ½Nž.ìñ·¯Ù"X¬úƒKß<ˆç|è BÑÄw4¯kj;Cî1—»Â0}ÕU¿óŒÙ N§S{)‰ègÞÆeB9° \qzzzŒ»Hh8žÞT–åœÅ'–² œ1OI’FFFJJrW‹Z<Ú2ù“=•ûÇŽV¥úµƒ¯ìuŽ¹Ùæ‘²UéÊ%[¤ñ>úùÌ7æœô¡BHûš-ë?yŸU+@I’¿ ÏÖ˜,@ˆ%óŒ 3ò]“y( Ó]×Ò_Y„hå×ë¶¥x[Ê×̸7:7†•ð¹sç¦TÔ”Œó)ÅÉ$÷;¹y|ÕG7Ö]dåìß÷e£é¯¿:ø!i«7_®µÜ¨æ%†s±ö"Î'Ž$ÜI›'i÷&žPxu¬ÇtóMIçÙó[a˜°Ë;(,¯U!„è׈Zú ÎùÈ,O/&“IÅñ¢²«øU×ÎqÉDΙaÿNÓº¤ÇW7õŸ2§ Ô/Ø‹-„³Ãaoa˜FáŠcèßÁú1r³EQ–efA3¸ß¯ó¡£££  `ÉJ¯d23ÒH­k"»¢§µW¯ÔšO¶Z‹£žÖ‘*OéœÊ–“¡ŸÏ|ƒaÎI]ŠP“´Úï4­o¸v´bi°¯ôïMÚ7×lŽº¼ÀqœÖS\\La†aLJƒby«ÈC*œõöz°CêË©6ÿ%×/Œ €®<³¤”-×’[®%BâWÊku•š{Ç¢¦ô„9Ñçšãgš>Da¶~©©'þÂîáá`0ȉ"! ±œÌ°Q—Gb³¿ñKKKûû³_-}Aˆç<¹\®x<¾víÚO>ùD–å¯ðü–}[{oA×m«Mt¸n•Õ ŠÀª«ô¬V+˲’$€(Š‘HD{ [g‡ E¦Q`AˆŒD+{€ã8­+×t©TjçHH¥R¢(Þ¾}»¹¹yi>Qm8M¦¹“=•Öd쫯kÝŠ‚.ö§»)ËöžF¢€ú*BxžgF–³#úFJ*Ò&Sý•³¦{÷ÃLs¦¾êÆÁÊ:™É´Ï¹Ýn25öÏçóé[c€a«Õª­žª5Ýð<_½qóeŽï‹„Ê»ÚýÃ}9ýD‰¢Ø#!{$=Õ÷þ)DÞíÕ%+gÌSûÛ+‹õööVUU-ê=$“ÉŽ ØÙ¼³#vV;~¹ÞüÑzkóhyyدñz½‹z'ÎÐÏg¾Á0çC?¯ ”—— ©Í)I‹¥nõìW`F?ÇBBš››9ŽËü Æ0»öqn7û¹/Ÿ;~Œ4'â|J`¥tšåÒ&>îtGœeÚ×L9ýûý~µ ´Z­ÕÕÕ×§zúý~µ4eÙå\‰Î…Ò„Ó¿ÂPå|ß7cAèt:—ë[£À(Â0 Bd’$i}®†áyÞår©¿kjj‡þwáò.E¨ÿôîîî@ °¨ýW»‡…ö±^Ÿ ¾­ œp±/<æ*‰ùZ‡+µ3±¿(B9r ‚‚»Ý~óæMuW¹Çÿú‘‡.—ëÁ{444˜L¦ÎÎΪª*õ uBHQUuGZšå],Ë644‚N§sŠŸÏ×ÝÝ ¥¥¥………7oÞTo¸¬¬ìo- «ÕªÎ5:Ë99-„3¶ê K4#,`(Â0b)¦aDˆ ýB³ÙLq¹\&!éñx***àî/G—· Ô¯!IR{{ûâ}V*­>ÏÈ y4tÌ›žTÊ ù·'<,±ÿ¾óKe¥Ù¿ÿ°çB9ô!!Äét–––ÎøŠVõ™Íæµk×jÇiýoU]]ÝÒÒR]]­)..ž½Ô¬ªª*))©®®®¯¯ÏyÉívsÇ0Lqq1˲~¿¬Vëìà Q>›³–ËùRÀd2MŸP B„ÐtX®8mmmË} ÷Iß_TýÎ- ?~oõ±·”‹g@’ô¿ §/W¸HfÌ3çÓÇÇÇÇÆÆé OÆIijx§n‰Ö[ûŠÌ_“”ûKëêêÔ¸l6[þÏ6nÜç3a˜óáp8*++K§puuuÓÏÔÚ[êëë½^oaa¡ºKñ{–¢¢"}w>žçµOQéûX,õ»°B¼^¯ßïWÿa O̓øpÞ­g2!Äãñ¬Zµ*ge£éÿÂOï5Š!Bh:,WœÊÊʹOÊKú‚Ðb±@2Áÿê§\Z$Ãé_üDüžµ]Ο[²ÂóœþéÓO{@²,_ëN]‹À“¡w]gÑÃ;œŸ mÙT±X–mnnVÿ€ ~Ô÷ùÌCæ|¨k0455555566ªÝn÷ônÞêŸã§¨¨jkk !D·$ýbP'€Ñjcÿêêêfo?ôù|ÚÛÕʰ¤¤d‘îs¡ðá¼Çï÷¯ZµjçÎ6l()))..ÖŸ0½ Ìé5j6›óÿkÁewüøñå¾…‡†iX®8Æí4xWAÈóéÿMÑŽ(áÿÁ[î©iâ—¬ œž§(ŠúeÍTÁ`P[ò‹–öŽÞ? @ƒÐQ“ìÕŽ¿tÀù˜mÏgj÷jM n·»¢¢Â¡qŸÏ<„a>µIMOC+m6[ii©ÝnW‰ÇãÑÿMo·ÛÕ6­.Eaa¡6Ã0«W¯^Ô[]|8ïƒ×ë]»vmII‰Ö0¨Vø ÃØl¶‚‚‚éå´bóà|àŒGa˜F‘/¿š“~ ¡ïüÇrû Ë.Wv\oÛ´ –u ጽUeYƒ?è‹M(DQO¾¥¼Vmv6mþœswÎÉ555Ô+R„bEEEê¤,*–em6[YY™¾<«®®ÖOn¼HJKKoݺ¥nÛl6§Ó‡§œ.§?aþO2ŒÊn·ïرc–F¿œB¬ÃB3ÂBdZ ¡IHš/fÇ˯_ÛvGÝ£ Ëòì³±-ž{ _¤;Œð\{¢{œ€Û±ò©¥‡ç÷ÔüŽã‰éç3 “ó×!Bh‡CÿÇ´Éd²Ûí555úsxž×ϳHÔYaÔm»Ýît:Àƒ,t&³wµÙlú~ÅØBˆš„+ŽqûskaÁÈLõÉ$.7÷í?c›µÓ*;®©KÓH8=O}A¨†4>>~¯)ì*“^9Å?üèØ'ÚñË ¶/7|ÃD ÜòoÜç3a˜Hß'S“É4½Ëåƒ/81'ŽãÔþ«f³™ã8·Û][[»ØºØðá¤h–z†Y¿~ýúõë×­[×ÒÒ‚ß#ÌÎxD†iþÃ݃öçEQ]* ‡³}´˜ûˆÓÅxB¾u\¡ ÏØðdA •J͸ ]ÓóÔ¢EEEê§R©H$òà_Ð*/}J²b4^\ÌÄ"±$½fŸ‡1öï{ƒ>Ÿù Ã|@%%%ÇY,«Õº¨K‰Î©´´t``Àf³Á´… NŠfŸ¡»‰.ÎxD†iØBˆŒAk4'ãÎÐDæ(!LëF åULS‹vr`°–oaN ¡~Õ/*½Fß?½Ñ#(|RØõÖc&´ãÝ…oãƒ_!¤2›ÍåååêRõÓ§ëXJN§Óår-Á7\Ȉ°ä£ ó¤Ã4 ,‘1dû‹õÁTÇKRYC<™iؽi'{LJY·‚Ðl6ë'’™˜˜˜é p£G8|&¬”Üù^ÓØxùH¦yP!0Y²çGèaUVV¦¶"„BtaA¸âtä†6Åè]ýE×nÔ¶IE5qg–U`Ói÷ÄH>Œ!äy^ßB‹ÅdáÐDú'G&P„­Êþ‘ÇOÇ´—Æ Ëvçòöj£Â Ïg~Â0)Zö0‹ŠŠ¦ïÚ—=O„B,WƒŽÜP[­±ˆ=Êbf͆ì„0Í­Úžtð^³}Ò5=ÏœB“ɤ5ÜɲÇïïƒÆÅ|mX]Ó…yR„a„ÈÔ‚Ð59®!º¥&TLu½bÉÌ¿gJ ÐÛµôK±ëû©ò9ÕOÒd"¥åÓÏdVg‡zdž†††ûÞròœ± ¼ïÂá`ú¿>‘d±ù¢¸ú‚zÐ*ÈÛ®&´s«[Ö¬QWK»ûÏ7F|>ó†I†IæIÓ¢ ó¤Ã4 ,WœÖÖÖ¹OÊ3™æÁP¶y”UÂLË‚1õÍÀdžjk,Ò¦']$9yæte ×fµ2Sw•L&Õuêç4‘þùõ‰XRNµ\Hµœ×Žïº”2§2̓¢Ù­iày¾¶¶öá@hÄç3oa˜a˜tažá0-º0OŠ0L£ÀGȦ dª¦õU™Í¤¼JééT÷ÜÁÑ¡¡¡šššÅ¿Ç } ¡U‘Ó?}N¾v™ø +J«ú JÒ,ÑhÔãñÌ~ÞQñß߆bRªõŒØÔ¦7§˜GÏg?b ¼Öb·@ii)vÁB!„B …!2µ•Ï©o!¬¼gÇÔ6HZA81Ú·L¡{b¤èÔ{r4Êøhùøh1˵¯Ù,,‰Åb³„'¯Å§IØr"]uK;n’Øß:å³&Õ]‰e‡Ëk Bæ,2B!„Ê]FW#öçN&“¬$eW $„¹wAHêµmOp4™Ljë@,†œ<Õ‚Ð;6´æÂIè_â¤tÃÕsæd|–ye¢ ùGoy4$‚˜Üþ¾¾4˦}]-í}Ú‘ÑÒ*ÑÄ[­Vj?L0âó™·0LŠ0Lº0Oа{]˜'E¦Q`A¸â±?w2™t„'ˆ’8G ŠÀf¿×ÉLe p&uÛœˆ[ñE]¡>'OAˆ¢TߺSw«gJ‹Mmgâ‘Èô—€Ó7âóâè•®¤b‰'÷½)•d']°ƒuïÕ5ýIGdR;¿¿¢–ÉE5F|>ó†I†IæIÎÐCæI†iØe@2™ôOΫ¿(gb*kä;íêž{bDý‹J„¢n[lªä#„ÝûIéã£êghÂwálÞ¬WçPêõ#]Ã)=ãÉï)¶ìd¤¬gÏfS‚”õdN–$mxÈZB-ÎÐCæI†iX¢|§(J2™mµ pV¤®²á¨~æÏE•J¥HZ¬¼s];Âl|„}ìIPe2(_Ï”sÅÝ·’Ý–ªY†½ÂÑ˱[ý™6ÌtU‡°ñ8°’v…J®øsL„G­ñ¨gtP;>PÕ n¶|¤¯[ù†o³O{Æ ¤û¶öTÄå {üÀó<;ÓòÆe¸ç3Ÿa˜a˜taž!”?è„ßøÆ7ŠŠŠNœ81ý¥h4ºÿþ7vwwwwwoܸñÀñx|ú™hñTVV.÷-,L2™4‰)³¶$=Ë’¢’ÙßBÊ«žW·MBRY¼ÛÓç)$%½Ú.»cq{$†ƒé˃̩êGµ—<Ãw‚¯„㲺+ÛÉý¯¥ë²M‹pÀºõ]_í¼yGQ“˜*ÌvĨªW7¾æAÃ=Ÿù ää ó¤gè¡ ó¤Ã4 ú]F¯^½z¯—~øÃnÛ¶í™gžQwŸyæ™ëׯ?÷ÜsßûÞ÷¨ßº·Û½Ü·°0ÉdÒ¦ë/J%ÀÍõÜ2ŒTZÁuej3®¿¶<²H·§ÏSi¿¦5JœéCÛ¶›¯Œ÷ަ¤LÝ×\f¾P+t«;OL~ð¿Õ2aÒeÝ©MÇ>Û¯ÕD¸ß²f‡e]:ŽD"PÜ×ÉÊ™–CÙé•VÙÌfžçý~ÿ"ý\ËÅpÏg>Ã0)Â0éÂ<)ÂzèÂ<)Â0bIg}íµ×ž~úiý‘§Ÿ~úСCKyÈp‰„Cß_´dŽþ¢Ùq†üÈà,'RÄ_¹ mŸ3·¼}%Ý5¬Uƒozö+éøY,ŽlH¶‰OÛè«ÁBÖûçîoî°¬ƒ©E,IÒ7<šv}jמ=<òȆ ð[v„B!ô –´ ¼zõêºuëôGÖ®]{íÚµ¥¼d8ÉdÒÍ®cCJ+æó.¶¶^Û¶Ñ¿­iÂC–¾nm÷Œcýôsúùâ ö5Úî£Â»rÕ ý Ì«þ«ç*¹buW§h Û”šZ9Ãla7o§}ï!„Bh…ZÒ‚0 ú|>ý¿ß?11q¯óÑb0\îd2©o!dæšQFÅW×ËSÓYâQ9¼XK£ªy^¸8õÂûDÉ´™ ûøì@G·m,7ïYkß\>n­‘§¦ñDÄ—ê6£Ç”­äÛìÚz%¨ùô'±OZ¬X·÷4n(ª#…w]\„Âá~sbjBÎÄìØ·?Eþ0Üó™Ï0LŠ0Lº0OŠpì]˜'E¦Q,i ¡×ëÍiÏi3¼2“gŸ}Vÿ-c[[[(”mÒ¿¤ß…Búo,ð y~ÓøHv_ðü<¯ñd'\‘»:ã§8}#þ7?½Ø‘¬z½éÌ™"1Éu¾ÿë颯ís³ñÛ²ÑÞu•t¾]éÐ..Ég~&GBþêQåÓ·ÖùŽX,–óA¢ ”wÝÔÞÎlzäÄ¥ËÔ ¼^¯€WÀ+÷ Ú =†þ)òç n·{Ùï᡹BOOϲ߃¯ðì³ÏÎXøÀ¢!Š¢,Ö¥IîÅ÷ïßÿýïÿñÇ׎¼óÎ;ý×}äÈ‘…^ ­7ü/572odí&Ó×¾9Ï7v¾õzÙ±wÔm)PjýÞ÷)ÞU(&½ôaèFofhßS‡·Æ.ªÛ£Å]wìܹS~DŽ¿=|!•1øÙcŸ=•iöT¹´õS1§ÛjµnÛ¶Mÿ®¾_½Xtnj†1ý§ïÃ6­(B!„šÓâDKÚBøä“O>ÿüóú#Ï?ÿü¾ð…¥¼¤ÿ*"ÿI’dµ]¦l^3ʨä²J˜ú6…m^–væfâo^ÕªAV‘×$²sÃŒ—›Ífýùm©[ÿmòkÕ ¼¿Ùvpê6Q”ºë牢$“IIÊ®Jñ˜¿í¬¶'®^·ªAc=Ÿyää óD¡ü±¤á·¾õ­“'OþÕ_ýU0 ƒù—yêÔ©?üÃ?\Ê{@ƹ‘N§íý£ó[sX§+nsdvdYîî|ðû Ǥ½üù“ÉTöš±Ã&g–yó¤¯H+E%ýRì¿–cÙS˜¦ñ꾆ì˜Fgx²¬«]Q”x<®L¿û;UĦY<ñà÷ŸÿŒõ|æ9 “" “.Ì“"¬®éÂ<)Â0‚~A¨ïçšÓçÕét¾ÿþûgΜ©ªªªªª:{öì‘#Gìv;õ{@t2i‹MÁ#„™ç"„`6›Ãºa„Jç­YNž“$Ç—bÿãç£Wº’úãu¥üW½·µÝ±¢2…a, t¦ûÿbò‡ï'Îè[÷ý ç§o­k- ú‹ÇÙ r*;® ÷kÃå+ä3'´W{kWñÞy¶E!´¢`uMæI†iõ+ÎÞ·µººú•W^¡þ¡èa% õ›äÌZ¢ÍÎ[mó¯Ùl÷÷w©»rçmö~oc<,=ÿn°oTÔä9òÄ#Žr¾ûÙUíàXq9˜Ì¦×⎟”!»,= ̶]kDÈ”¸w׺ÇGLi@ÃÕs“^/žÛ¯¥_z¦þWJØÃU M&ÓýÞ>B!„B3£_¢< …´É `h@Û¼ jMæy>ä)Ðv•þH À›gyËŒ.ßI¾ôQ(!ÈúƒÕÅüo}Ê âäÈ»§AÌŠ‚Õvûâ|êg¶#Ýñ!ýù¬ç÷_¬3•݈߰„2¡h¶Ü\÷Èêó'EF–|GßNúR©ìm3Ìíæõ&‹e¡·mP{>ó†I†Iæ‰BùcIÇ¢|ÐÓӳܷ°CýÚfÊW0Ë‰Ó™Íæ”ْІJÒB‡Fâòóïÿý ¾´™™ƒ»ÝòE›ðöj/—wúFߪ¿Ð Ùjì¶lüçêLåP^^®Ÿ88ä-¼½z#è§ÖWƒ·Vo { sf©yˆìùÌo&E&]˜'E8L‹.Ì“" Ó(°…pÅimm]î[XftXÛ– ‹ô^“ÉÄ0LÈ[`Z×^é¼ «æó^Y¯ÆŸ‰ä4 ¶ÖX¾²Çí°2L&#ÃCMÁQíÕ·7¦.•ßÖŸïfßp<¹†¯ÓŽ8ŽÒÒÒþþl¡¯oîJ U·¯’iÝ­;›ÖŽWÏóó¹í‡€±žÏ<‡aR„aÒ…yR„ôèÂ<)Â0 B”Ç…Ñö䢒ÏJƒÔžêîJŒÉ““R„!Œ™˜¼Œ«”-Œ:S¡…#ìJ½r<Ü?v׈A–!ŸßîÜÕj×Úò}C}djˆãÏt©2®ËZ¾ñiÇçLî¸Çššš‘‘qª£©Óé µl8_XRÑÕ^8ÔKdLwZ¸zÏj†=Òˆwê‹IŠt]›ñ´`Dzù£ÐaôÜÝÕ …'_ÚéúÞSújÆÆÆ”HÈ59¦9ߘ©Ù*•À<ßÚwjPUZZêpd7Úl6—Ë¥n Vû˜Ý ‚ý¹VN ¡žÏü‡aR„aÒ…yR …æ> ÍæI†iØB¸â¨?·2˜hs¸]SáÉ䥗bïÎ^êÝ*7Óêö‰k/÷•t=nÝVÉe: *Ÿ\‹ÿúã° ÞÕ.H66ZŸÜærÙføÞäÜØ•Tú ™zGw17æáX™Ù4^÷ͦƒ,3G×TBHccãùóçÀf³é§™ ‡ÃêFJ7»ÌÊi!4Ðó™ÿ0LŠ0Lº0OŠzzzpL&E˜'E¦Q`Aˆò—¾ Œ:Ý>ŽK)⢿¾ ÜÈ9ÓÍ8Öò å\Àϸ ®ÃÒx_zø¦ØT„[•üζ„zfcWòUáÚYáZ£©j¯eSTÿ«#×{rkËR¿é©]®Ú’Úå:Óý¯E^+¼ó_ÞžÔžk²Äœô5lªY7g5˜¹g·»¨¨httÔjµB8ŽK§Ó Šb<·Ùlú‚på´"„Züƒ›.Ì“" Ó(° DùKÈ®èsyVüÇЯ:ÓýúsʹÀm{×ðõfè¡™éÕ‹‡û]½ ©­yec’+&‡íL»ØÝ.v3‚•õÕ°±Zv¢nîÀûæ&s÷õD%})ÕþAòL‡Ø%ãéòÑL«£ÌÑÝp ³Êb¶/`*Ôúúúx<Î0 ¸\®‰‰ õx8¶Ùl+³Ë(B!„ZJX®8mmm†øÂF‰„•H¦ó¤Ì°ãnþuáÅQ9¨ÀÓAû=–3–‚*ØU\µÔq ¹BA ŠÒÔ:³:³Î»lNÈõ×ÄúkD°˜ÆJ×¹*w–•8³)FaâJrBu§o¦º¯‰‚’wô‘« m;XPX¯€ÊÊJµº›'³ÙÜÔÔ¤nç„EEEjƒ!Bôã'nFy> ää óD¡üáŠSYY¹Ü·0/JvÙâˆËõAíõˆœ­ÁʹÀ9¿\Äú漎Ûí ùŠÔ‚6÷rgVOû8s2Uvç Ü9žûÞˆ›n&³û«7€Ùl.)™yaŒYhÓÉh‡sú‹ê>ÜŒò|†I†IæIÑñãÇqL&E˜'E¦Qà,£+ŽÛí^î[˜¥/[^¯"æl5ØlªùÏîo̧„©Ÿ7ähG*o&mï|‰»ÝLR÷Ó“l¿irG§¬7[ü;ö0 ³ÐæÁú‚0ööf»Ë®œeÀ8ϧ!`˜a˜tažáÜtaža˜F-„(O)Ù‚ðviöøóª?p~‰ƒyMÜN§“a˜^sIk6KØ¥XÙ˜8Þ®\Þj¯,ZßÛ q%9祼ŒkƒyUk¢Æuáí ³f=gwTWW—––ÎòÞ9™L&›ÍÇ@Q”¾¾ì’8€!„B-,Qž’u-„=̺V¾~AÕ ÜÏ T †Ì•|UK"³|ƒÐ9ÀšËm¿³k“Õ¼E¥'=xKìíO÷K£a9WŠ¢X‹X˹¢*®´ÉTYÁ•€žÁ[¾Ñíú̆-PUUõà?²ËåR B=BHAAÁƒ_!„B¡é° \q ÑŸ[ N@,ªn'y2ìã ÑTõG΃ó¯'"Ò¡“á+I3ܶÔha‹x§tÿg65XÕ¡y j®´š›W¹q••$u[vºNö íªi˜ÿ6‹ºº:EQ†‡‡µ#Ç­^½Úï÷S¹¾!âù4 “" “.Ì“"œ¡‡.Ì“" Ó(° \q ñ;X?£Lo‘I!à‘ßö4‘y=±² ^о}6š–²kÍß´ÔiÛ‰Þº åÞ³“ÎÆÖq=ûA-ëwíÞ}?W™ Ïó«W¯.))¹yóf"‘°Ùl­­­6›Öõ ÁϧQ`˜a˜tažá =taža˜F!ÊG©¾mz–žb'±_ˆî°¬óyo÷°øê‰Pψ˜sœ8M¡I¯;eùÆUµ·ç‚H¡IÇè¶kÞ¼}¡W˜“×ëݺuëàà` à8ü?!„Ðlp†º0OŠ0L£À?7QÞQ†».j 8ôsÛ{‹}st›TÚî$?¸^ Vó®ã†ºn„Å"wgfñ ùÆ•û(…³sJ¦Õ1îözJÊz…ù`¦¬lQ®ŒB!„.;±â?~|¹oaÇç¼ÃÙÕ9®¼4â½­ìjwòÿ{yìßß æTƒ+óÛû=ÿáKþæ·ßïf× ”o]ƒ©•ß í¼¶­m#äi,˜'E&E&]˜'Bå,Wœ<¹1&Më{Ç’Ê´ÂÅ,Lu¼L&ÓŒçOD¤çOüëáàÀxnÃàÚZËŸÿFá¦F«:T°ªª*êòŠfKæeA;o-èÞ”án43ã‹Bˆ´ªò>OÃÁ<)Â0)Â0éÂ<)Âêš.Ì“" Ó(°Ë(Ê#2(ÿyµº'ªI8ýŒL`Ƴí‰_ ¥ÒŠþ !°ªÂ¼g­½±ü®õÜÝn7o6÷we>îú¦¡y·wþ´¶òY‹³œŒB-¬®éÂ<)Â0 B”GÞMœº“îßߓҎD=™¢+§ TÞ9y÷lT_ ê­mryf~°½^ï„® Tn´Áç¿d^“*’$žÿDkR)­¬±ÛçóF„B!„òv]qB¡ÐrßÂ̆¥ñ×ãGY©ïÍ„“ÞBuCßeT’áÅ&ß¹»¬-áÿóW ¿~Às¯j|>_ÈW$±™”Ðd÷Ñ÷E1·¯étccc·Þzƒ‰ÇÔÝ4g •© Bämž…yR„aR„aÒ…y"„PþÀ‚pÅééé™û¤%§€ò|ôuQIW§mB¦ÐM|ÜåQ·µBATþåðÄ™› í½K¾º×ýÝ/ú‹}s´xû|>…ãÆ‹²SË0W.vuuÍò–x<~æÌ™¶¶6ÇíìòƒãÅåu«VB _ó4.Ì“" “" “.Ì“"¦EæI†iDQ”¹ÏZn„ã>Ñ}{?qæ¥Ø;ðéObŸ;™C8^Rq£e³º½gÏ–eã‚üϯOôfÛôìæ÷>ã­)æçùAgÏže»;ZΟPwÓ,wnßç6mÛ~¯õßûûûÛÛÛ91µåØ[Œ,©…ßþCgËÚ…ÿ”!„BÝÅ+ˆ°…-¿q)t(þ¡ºÝ¨@ô¨„µü§×îª ÜÜ÷žòÏ¿µ×¨·055×('¥=Ã÷:?™L@áPŸV ‚¯À¹ºuþŸˆB!„PÞ‚-¿ŸÆÞ”˜E¥vP7€Ð_¤nX­ÖhBþ§×&úDzÕ`e‘é?~É_à^ØÄH>ŸO!d4P®)ê ƒ3ž/ú;µ#ì¦móœ‡!„B¡<‡ናoý¹?Ú®¥î¨Ûu}";Õ—´9K¦§« úþjL_ Ö—ñü¿ÃºàØår±,;ZZ¥ñŒ˜„äíÛ·gl…O&“ÎPÐ gö†Ù´MB¾åit˜'E&E&]˜'E8C]˜'E¦Q`A¸âäÕš01%ñ‹ØmwO«m}™æÁˆøéQ˜ˆHÚKõeü|ÖÇs÷ÓLÇ0ŒÇã‰9\q§[=B¥¸¿3ŽO??™Lº²o_µ†8]úò*χæI†I†IæIÎÐCæI†iX¢åôrô݈œYËÁžf›ÛÃÚK…Åi™½4TòÑ-oBµã«*Ì÷] ª|>ŸÝn·ìܧ)éï"²‹ÅrÎTEŠÇ †ú´#Ìæí÷ý¹!„u­­8¬&Ì“" Ó(paz´l®‹ŸmÚîÓÝ•DP·SfK§µêbwY,eÒ¿eë*ÛWö¸Ùû#”””°étꃷ@À$$ý#‰²²œ3A(èf¥´ºKÜ^¦¡ù>!„B¡|‚-„+N[[ÛÜ'->QI¿=¬ Úó ŽÕWÆ´W¯¹›OöVë«A–Ïow}m߃Vƒ`2™X–³™Ýðˆv°¤ïN"‘È93—õÜÒv™MÛ€Éýø<Éó¡yR„aR„aÒ…y"„PþÀ‚pÅ©¬¬\î[x#~lTÊLìIØÝ^ªtf×~xŸÝªŸà%àå¾÷TÁ¾uvº÷ÀlÛ­ÍêšgûrNPÚΛñÌ6Ë1Ì0è%Oò|h`ža˜a˜tažá =taža˜FáŠãv»—û ?=ònâ”¶Û0Q²ªc¦&ùì6—r>u›Ø·ÎþŸ¾RP^hšáB†˜º&m·ìêyYÊN]ŠÂŸ9©íÅW‡súEò!χ æI†I†IæIÎÐCæI†iX¢¥––Ò?¿.Afž»lÝÔ]XÒ}[;á¼}­ºa5‰ßyÒóùí.Ž]¬uÿ˜=´m×ä¸p.[¦Ê×ÛLÁL/V…Ô¦‹t!„B-,ÑR;4t¤KÔv· ÖU\¹ÅÊ™¦¹c¿lk¿-v a°¾Ìº¨7ÃÔ5Eʲk2GÞ„”Êd0ýÊÏ´ãcEe\aÑ¢Þ B!„BK Âg¹úsK’$Šâ„þˆ¿¨,™ôÃigÙD·vämÏ^ᛠƶWôy]æ%¸±É­{d&³þ!‰FÄý{e /ý¿@<³ …BHu£Åb™ñíØ?ž.Ì“" “" “.Ì“"œ¡‡.Ì“" Ó(ˆ¢(sŸEñóHnß¿ùÜ!K}ŸˆºáááT*uÈ}òJ*Ó;”“¸¢·?û­Ž_úÓ™Ùeúø’WsMa¯Ï€²²²ÆÆÆÅ¾±žžžô;¯•wÞ¼× Ýu«ûjšvïÞÍq¸L B¡ü …pL&E˜'E&]‹W-C ¡r·¥¿´,FGGG.hÕ ˜.m9Øý¾V *„\¨ÞñÔ¦ˆZ €Õº¸ýEµOé«nŠÛ]3¾:QTÚWÝÈqVƒ!„òþÁMæI†iØe-I’ú'OùohGرâ/œhHÞÑŽô×ù*åH(»¡Íf[‚{³Z­˶mÝ,(Îy)awÞjÙ„˜ÍKÑy!„B¡%†ኳ,#7ÆÇÇÏ–t¬¨î™Ýûž{gä´vBÈãï_½R©”vpÉ BH³ÜõõÛjšX–TÕ ì¾º~{šåà^GÂІyR„aR„aÒ…y"„PþX†1„@`||¼  `ÿþý?øÁV­Z5ŸwaçRC;tëÃÞ3ÚîÚ«~ÿÂYfjå Áb½´õS"W+Ã0{öì™>èt1œ8qB+D·×ÕXJJÁÄ÷ööÞ¾éàº4£B¡…:~ü8®öFæI†I×Ã3†ð _øÂË/¿‰DΜ9³eË–½{÷^¼xqî·!# Šá#ÎKÚnI—û—.jÕ Är××nË©Àjµ.M5wVL8Ý`â@íà,-„!„Ð2Â?¸éÂ<)Â0b© ÂC‡íÞ½Ûb±”——ÿéŸþé³Ï>ûýï>o$3yöÙgõÝNÚÚÚB¡¶«I¿ …ôÓàâõ Aþ›îC).ÓþÆ‹äwß7Ë™]…›k6Ë»ÝwEqÉ~ }í§]-kÕ‚Ðèÿ-ð x¼^¯€WÀ+àð y~…gŸ}vÆÂÍ2wÅ®««‹F£³Ÿ†]F)ZÊ)€¯v%Ÿï<j=¦ùÚË–}ÙUï4­¬¨­¨¨€ÞÞ^ý{«ªªjkk—æ>»ºº:;;ÕíÊÊʺº:8uêT"‘PnÙ²ÅápÌø^œR™.Ì“" “" “.Ì!„êáé2š˼¥×ÓÓ³Ÿ"Éð⇡çŽu‡›Oi×^º« WÖ VÔ€ßﯨ¨¨¬¬ÔOæ¹43ʨô]Fc±H’”L&Õ#„Ynfiò\90OŠ0LŠ0Lº0OŠô- èÁaža˜F±Ì-o÷w÷Æo¼ýöÛ³Ÿ†-„Æ"ÉÊßlëŽ'÷½!ùFÕƒ&ý¿²'bê®ètOþÆï¶w÷p·sçN†a@Q”p8<444<<¼~ýz—k浩‹Åb§Og¦<åy~çΑHäìÙ³ê«ÕºmÛ¶¥¹„B!„¦[¼‚ˆ[Œ‹ÞËþøÿx×®]~¿¿¯¯ïg?ûÙßþíßÎY "c‘dåßßž¼Ú×\ЪAø­ãf­T™<ð¤'P Ý=^¯W­€âv»Ýnw}}ý’Í(6›eYI’ •J ‚ ¶ª¦oD!„Bèá°¤]FŸyæ™^xaÍš56›m÷îÝ7nÜ8~üøÆ—òТ’øÉ{“W»“RÑ@ªé²v¼qijþZŸ¶;T^ÃW×Úívžç ¦_‡eY­J\„ýÁH$¢ŸQ B„B!ô°ZÒ‚pÿþý¿úÕ¯ÆÆÆDQìëë{þù盚š–ò,fnàåB—ï$sBØzH¦QÛ&šŸ:&pé̪ôiÎÔ[Û¬`>ŸÏçó-Òý,ˆÓéÔ¶Ãáðü[±<]˜'E&E&]˜'Eú٠уÃ<)Â0b™'•AKo¡k‚píÚµ[·nuuu Ïræ¯O†O߈Q„­)–L Q`ïíÊ’¾ìü½µ«d‹U]È¡²²’çù…ÿôéÇ+F"‘ù„¸Æ]˜'E&E&]˜'E8C]˜'E¦Q,éBdD£££ZȲl ˜ñ´wÎF^Ž@jõE)0 o­Xu‘§–¡wº‡*êì6›:D0zcæ´ªã a®)FB¡åÕÚںܷðPÁ<)Â0[ÑÆÇǵmI’R©ÔôsN\‰¿}6RI¯¸ê¢v¼B,\×WTÔߥaö<*’?u Æjµr\æû‘t:­Mâd±X–r4#B!„BK ÿÒ]qÚÚÚær:žœœÔÑ϶¢jï^=Ù¶|¤ t1Ž=Ãk*ºn±òTk›Ûk~d—Çã¹×"ïˈ¢o$ÔÌY».(O4'Ì“" “" “.Ì!„ò„+NeeåüOž˜˜§z{ª‰Ä]'D¤Ÿ¼7)Ëœ(l?¢ð™öC˜?t>ešHúîh'3{–-))ÉÃB¸»×¨fÎ[]PžhN˜'E&E&]˜'E8C]˜'E¦QàÂÇívÏÿä±±±œ#ú‚P•çÞœˆ%e¶“ÝAí¥¯Ø­öÎë¬6Ïåf7o€Âœ"3OÜ_A¸ <Ñœ0OŠ0LŠ0Lº0OŠp†º0OŠ0L£À‚Í ˲¬@¨Ò„¿<¦@l¾˜.ëÒŽ?b^³ßº%<:R¢oܵ8°,˲ì¢Þÿýñx<Ó¿´Æ¿ZB!„ÐC B4ƒ±±±¾¾¾_ÒÆ~r#~®=REgªå¼vBWü;ŽÏ€üÉqNÌô •Ì~ˎŽéÆó|]]ÝrßB!„BKÇÀc¯^½zôèÑcÇŽ;v¬¿¿¹oÇ0æÓŸ[¿ _µ…ph"ýÊñ0HþaaËQíU;±~ÛyÐD8EËÅÓÙ ®Ù¼ùî;_aÿxº0OŠ0LŠ0Lº0OŠp†º0OŠ0L£0p a(Ò‹‹D"Ë{32Ÿþܳ„’$%’ ïGÄ´¢8CÉï“ù¯Àö;®¯°Nc™¶Ä4ËÉ›ó½yð¾aÿxº0OŠ0LŠ0Lº0OŠp†º0OŠ0L£0jA(‚ Ún4]Æ›yÈȲœL&ÕmBHKK ÇqíííZgÑç#ýc¢b‰'w¿æÌð´ãó ¦J€dB:ú®vÁ¡ŠÚwI„BheÀ±îtaža˜FaÔ‚0 éwc±˜¢(„废‡I<×/Ë^XP ôvUw\›L‰Q¿‡+=Ù/'&w¾'Û² ³Ÿ·íÝjnQ·¥ãïC<ÓÆ˜æLÕ•6Ûÿ!„B¡9u aNA(ËrÎúxè^æ=ÝïÇ IDAT¹‘í/ª(U7Å¿þøÏë½z¡æÖ•Ö3=þÉËŸžü€l8"{³+Rì´¬–éÿ£DÂÒ‰µ—ú«ˆÍÎqFýêaN8†.Ì“" “" “.Ì!„ò‡Q Âp8œs{ÎÓœ#7Ô‚‘妫gýWÎ)‘»¢6Éé½áSÿõÍ‹;ÚDQ ÅT÷uÇg3/˲ôÒóÊô#Í–ÁÊzÛCÝ<ˆ#aèÂ<)Â0)Â0éÂ<)Âêš.Ì“" Ó( Yʲ<½ü›e´ ñxœM§W_8Q04óÊàH*¿ù^ø;¯NVY[Úׯ^W[h¥Ã¯ÊwÚµÓzª›$–}¸ B„BhauMæI†i†ìȉDdYÎ9ˆ-„´Äb±Ú›ÝÁlP0[ aÕµîd¥ÐéHeçòiîJ5öö VðCåñ¾d¼¦¯S>ý*(ä-.«&„”——/åý#„B!„æÉaÎB„ó …f™ôI–e[×­¢Á^í) pßüãÓÖŸÙÛä-Áýç£ÎÄÍbfÖVJ—wµ—wµ€¾F,Ö›­[†)ìvû"ý,ù`ö<ÑBaža˜a˜taž!”? ÙetÆ‚0™L¦Ó饿Ãééé™åÕÄÈpíµ Ú. ”š¾ýg‚Ý{èæá‘S&xëÇÚßQ>Û*ó2ËÞX·MäÍ ÃÔÔÔP»õ¼4{žh¡0OŠ0LŠ0Lº0OŠp˜]˜'E¦Qm|FHö>eY>~ü¸¶$=˲ÚöÆñÇ{î™:o©Û Ëòòç$Pú™žc¥/+æ©Å ØÙÓ´ùZ¨²«KæNî*:Ý7Ö„|EP^^ÞÐа”÷B!„ÐÃG_Ñe¼.£Á`P«Íf³ÛíQw£Ñ(„B¾qE« ´iGQ ´}"x,ðŠV À溲°¨¢ üɧÈåsñ“G9Q`Ŕ̰âŽ}]…eZ®Ïç[êŸ!„B!4oÆ+ÇÆ²“˜Íf­ ĉF„”LŠ¿~IëCòø¥-;Jê"/)öìøÌÏšwÕï8ŒWUU9¼>ØûØPqåÀÀ€¢x}>ý‚V«u)„B!„Ђl ¡¢(9¡~Iƒd29Ó›Ð]îÕŸ{àåŸ2¡Iu[!¤³iÅaû‡^NÚ³·ˆë¾èÜ»fÍšŠŠŠªª*õ`vQB&''A˜Ú#‹e‘~ŠüýãéÂ<)Â0)Â0éÂ<)šqbtß0OŠ0L£0XA‡S©”ºÍqœÇã1›³³›h/¡Y̸&L¸·»°ýж;X^uº%í3ui=¡ª?)y†©¯¯g˜ÌÃc·Ûµ–@EQ´ÎÍ<Ïkç<Äpº0OŠ0LŠ0Lº0OŠp†º0OŠ0L£0ØßëúæAŸÏÇ0 ÏóÚ,ï›xø#gFfŠfKxÓöá–ø™t›v;Yð§E_aîñÀ̸ô<öE!„[kkërßÂCó¤Ã4 „………SbÒÔ|#vÞvöth»Ò¾OÇZ-1µ#LÌõDô©bç=ûθÒàJè/ŠB!„¡© E1«Û è3X2 Ãq™©qEEqÙîÏ ÚÚÚîÚWáµ_ÀT!w{Ç·7ý4ö¦ö:,¥—>ûéÖÂY®9cA¸BZsóDó¤ää óD¡üa¤‚0gúJ­Äa„ RYY©ß•.œæ‡´Ý྽ÿùeZ‘¦^f­?úõ­•Kf¹æJî2š“'z@˜'E&E&]˜'E8C]˜'E¦QiÙ mQgh¢ñü1ñ£7He-©¬qÈD[n Â9ݵTc2‘>üªVêMJ_lèIÙE&Ìgwï,ª®)æaV3„+¤Ë(.}IæI†I†IæIÎÐCæI†iF*‰„ILUݾZÔßEeò\>WÛ#›vÅí.À‚p.Á`¼^¯º›~çuÏTÓ2˾ñXA—”m-äo¬õM4|î1ל—å8Îl6k N¨VH !B!„BÆe¤.£B8ÜrîX ¿+§ó"›Z.œä“qÈ©IPŽp8|õêUµó­Ò×#Ÿ9¡½tquÉ™Âam—¬4]Ýôå]. ?[gQMÎ0B–eõóý „B!„òq BY.øðM{4<ã‹|2ÑrácNLa áì¢Ñ¨(Š—/_N Bú•@–3ǶŸîËÎÇÃDÜæÓ{Z«­­5óíö™Óktå4bÿxº0OŠ0LŠ0Lº0OŠp†º0OŠ0L£0LA˜~íeÇP¿¶«¸ßü]fÃíˆ-®¾} ÂÙE£QˆÇã#¿ú¹2”íúóvqªû0Iñ–[‰ùË»æî,ªÉi!\!ûÇÓ†yR„aR„aÒ…yR„3ôÐ…yR„a…aÆʧ³#n¯÷»ÿ™1›™–õéTJ¾zI=^Ô߀––eºÇ¼#I˲ڮ,ËjgQ[,ì»z^;~¹Ñu¹vê«…˜?ù‰:?·Ûå²³0o+¶…!„ZF8C]˜'E¦Q …PéêÐï V{Ç–½ŒºÔÃp¿ñ´RP¤¾D>\›~Êõë×õ»±XLQ¢(õWÏ3S)%,ÜÏd[óøkëÙᲪ€iûê&ÅŠm!D!„Bȸò¾ T”ô¿Ôö$Ž»¶~»ÉãÍžÀ™ÈOi{öà˜|ñÌRÞ`ÞatttddD;¢ö-ë¾å µƒ??àˆY2ÓÆ°Ã¥¦ëY¾ºÇMæ5•L–ÉdÒÏ"³rZq$ ]˜'E&E&]˜'Bå¼/ ážþŽ¶Ý¾zSÜîÌi}â›Z&eÚ®ôîëaÅ‹Åbpûöít:­‰F£¶X¤âN¶Ù°­Þz¡Ñ¬n3 »ù“} Ý­ö¿é>>qÕªU-SVN' CæI†I†IæIV×taža˜F±ÔaOOÏÁƒ].—Ëå:xð`ooïœo!ND›ÖôÖ4M•ÂL­Oý-e&3àM MJgNÒ¾qãQ BA:;;3G"‘ú«ç˜©™Ecög:2g+„ÿd/IYœVæ±MÎûûD¿ß_4…ã 3<!„2.¬®éÂ<)Â0bI Âh4ºÿþ7vwwwwwoܸñÀñx|>ïظ£§f•º=CwDo¨¼FÛ“?zÄ•>ݨl$ç•óú΢/pD­™Àtm;V ŸÛ6ß…B!„BF·¤áøÃmÛ¶=óÌ3^¯×ëõ>óÌ3[·n}î¹çæóÞ×\_ ô;B‘§„<Ï÷Õ4JS3j*‘°tj¥7R«-„ (ÊÍ›7“}=e·®j¯^j°\hÌô¼eGKøë *`ÚÜ´RÆþÑ …–û*˜'E&E&]˜'Bå%-_{íµ§Ÿ~Zäé§Ÿ>tèÐ|ÞÛm¹èù°æê+-§ÿM~ý”ЖT²m€<Ï‹&ó`EvD:ö$´î܈ôM¯ÑHDxùÇŒ,©»1 óâ©~¡‚Ù|z/(„eààn76.TOOÏrßÂCó¤ää ó¤‡iÑ…yR„aQ–p‘†@ pùòå@  Ú°aÃàààìo$„|{ô/rš·™_½Çº±†+ëìììêê2¥ÅÇÞâ¤Ì*ì®ýÁ-»ø) “÷3èГJ¥NœÈ®Ü访–]xðßžpŸoÊ4ZN>ÊTÀc›ŸÙrŸ£B!„B‹‡Å*Ü–tæ`0èóýÿíÝyXW¾7ðS½Ñ Ý@Ól"‚¨ QQŒÆ}AÃhŒK2Y Nœ˜EG‰ÞÌÄ™÷Æ`£¹¹3:‰f™dnǘŒ'.‰KT0·€âެ²É"Ðt7½ÕûGaÙénŠn(––ïç™ç>Ý眪:õµrퟵ©m[üýýëêê:¶6mþ±%ïÇ–¼Q¿ñ²Xš“H\3 à3Àòã±ëV¡AÞúÜ¡PÙö*ï¶§…fsøÝL!¢½ØjPtsS †¨E‰£½ ô%pÒŒykBBYÔÀú ¹ÑËq@‘¹|‡èÐ÷ÑyUÞ ·D›îV€Äb‰¸~‘f±X˜›.\¸À¶ÛžÎ¾pá‚í ¶]¶Ÿ{ÿjjjدý‹®Š[ Ìg“ˆújJëi@A³Ê+/"PONóýñd¶ízÃ^` XÖ€5` XÖ€5` XCŸZÃúõë)gH—ñ˜KF¯]»VUUe2™ä>UAM§Z.ÔZœÜ’Þ¯ÉoþŸ!§N±-—F>T¯iÝ¢X,î#À½~ýzYY!ÄK¯‹ÿñ{÷àÁß>äM!4%ûaŽ 6²`¢jâ0EÏMÖ³eeeõ‘ƒª{ O!L!L~!O544ôwÿväÉ#„ɯ®»d´[ÏÆÅÅåææÚ¶äååÅÆÆº²ì Aƒzè¡aÃ†ÅøFΓOÙà÷»Uª'‡KÙËåÊúÆ7ô×°-їωÞd2}âuì#Fà ¯°Õ`£·àPBká'¾6Œ©GEËP v~Óð yòaòaò yòOèáòäÂôÝZÎ;7==ݶ%==}Þ¼y...üüü!¡â$Q¿Sýú5ßçG{ µ- Íú£)VëÝ=“´"®Ý;«Õj;µ‚)¥úæÀÊR¶qïCÊ1E4úJòGBBÔ¢_OÅ¿ÜxªáÇ÷ôî+È“GÓStkAøüóÏŸ}:<<<<<üÌ™3‡V(\º^ñóïêÿüEÕÞµz«co„¨_ŠìÉqeƒ¼,b¦åÀ8E…FÄt鬼¹‘8œ!4™LW¯^íø.õJ­§uÚ€Š{gê>(· (BˆäÚpa]€J.xé•BØc³¼_ØÞ@ ‡ !®çæòäòäÂäÂäòäžÐÃ/äÉ#„é)ºê…÷ü¢¨_ÌS×b=–Û|ê²®ÉÙGRjL454Ä`4h C||ü±–³*÷¿¼³Î¿ÑÂ<8éJäÛ55lKlllPPP—îH7¸UÝlþûßB UÌ×c£ä_OU†ëÿqÀcx¿À}¦¡¡÷dòyòaòË® âsÍžX2,V:ï¦!û¢®°Ò踈Z)|bªot¨„ùúcÃϪ÷®üªÖG{¯†¬ p=6ÞJµJ>>>ñññ]³Ý$ï¦!ëÀÅe·Ò™¯4Eþ¼TÓìã¦~I)÷ìÜ cº® ô˜KF Ô¨hÙÊùþÿõ˜&a°L$üÅ °º&ˇ{k¿>ÞÀ¼ÎþAåÃêG|°PÓ¤¸·ËšŠ’¡?ÿ(´´>“¦¡¡Áî-…„&äà™¦ôïêÇÔŸeó#½j|„¿öž‰jypAÈ ÕˆŸœæûÚâÀ£¼™'Ð0hBN^ÒýÏÎÛ  RÐoXýˆ¿/hð¾·×¾µUqg³Ä¦ÖsŒúþ‰fƒõ³ƒõßÑ*,ÚáúËlûñòÁâðqÒlãÎ ~!O~!O!L!L~!O€ÞÃ/uÊ`¤¿;ÓtüB³Ýð¸éØÈ¦Ûå R]®ÿ…義¬7³½z…2Ô„©L(N˜0A(ô¤7¶çvk`n§œÑ5³ñÓ^í'üŸß¾¦~1H¨îÑ @WÉÊÊÂÛÞx„pºicFõöõe·Q²(-“²Ô41_iŠ* ¥œ®§¤¤¤ËçÚ— O~!O!L!L~!O€>‚¦iš¦u:ÝåË—7nÜØÔÔ4jÔ¨]»v¹²,EáÚÝäþ¼‡ÐQ£Îúï  víBMaÒù?ÔNÌÓÝìëŸ?z 'NœØ³˜±XÉÕÒ–Ëņ«e-µÇ5;Aé',Ôÿ¼#þrkAx#Lvkè¬ ¿€xÀq€®æôüÏ?ÿœ˜˜øÃ?ÄÅÅu`ñ¾ ÷v–J.xv¶ßÒ‡ý”Ò_äh©ÑÏúj²ÿùA÷®UÝ©¸vÁjµÖÔÔtûL[UÔš¾9Ùøçÿ«údÝÉK:§ÕàÈ(ÙŸ ˜:B‘Gå¿~ï Š·ûY2™“ëEzÊÈ‘#׬Y³yóf¶åÖ­[+W®T*•‘‘‘¯¾úªÁ` wO²r†NòŒÊ›Ç‚¸Q«ß±ÿFI£¿ÁtïØ²øWY&x雚A¥F¶ñêð:vDwžd3[è¢JÓµ²–K%-µmÞÇ(QñѲ Ãä¡1!¤ÂRóãÁÍs³[ ÂFoÉÅESTtttXXX7MÀF[?à/_¾üÈ#ܸqƒù‘ššúøã×ÔÔ¬]»vàÀ›6mjkñ¶·åÎ;õõõ<íüüü|}};¶,^;Áç<«««}üN]Ö>¯Õê[ŸËb *Ž>øû·ýïž‹3 E'G&M›7M,ñµi§*êÌ ×ÊZJªMfK›»)RƒúKF ” ‹ðbo‰¤ ý×ÚÏ–|œëÛÔº#7ÇV… &„ >\£Ñ8®ï„áòäòäÂäÂäòè Úúo0ÔjµN§s쪯¯3fLAAÇâN·¥°°°¨¨È½yw¥ˆˆˆÈÈÈŽ-‹‚°KæÙb¢O\h>q¡™) -!%QWY+¾[••ËÔé¡Ï èç=0D2(Tì/æñæV}‹õ§«úœK:»÷%Ú‘y FFI‡EJ†H$"Цéêêj“Éd4-Kqÿº›çþóì¾Öǵ™E‚³e‰ ! ÞÞÞüÍÀUmý€×étÍÍÍ„ƒÁðöÛogdd”””èõzBˆP(džìè¸8Çà¶  tEמûêå¼ÄÔÌxï©#¹†Ÿ®êŠ*ë%Ó¾žvðÉCÌ€~úº)uû¾i™ÇŠÅâž}>*€£={öL:•ù¼k×®S§NõïߟùzóæMŽÝÌðóóëÔ\ùÖÛæÃ@AxDD à5„LÙj®©úVs÷JÎ…Õß—†ök2uÑv™›‡GJ÷÷òõn§Šc ÂüÀÒz©vþ¹f¶«Þ?P1 bHX˜P(”H$m­áÂ… Ççeæ@'ß'&&¿'@Ÿ•››û·¿ýíØ±cÌW½^/•Þ{ÔÿöíÛÙÏR©Ôh4Úþ¦åÜ__ß?Ä¥ïè+¯p˯üfœž5Ò|·4S,·üK$oâ}C~Já¯T®{&pY’úÁ!òv«ABsÁt¢é²¦Ì¿Ñ2âF ÛU­R©|}}•J¥——W[k0`/“òäòäÂäÂäòèS,K}}}vvöþð‡ÄÄÄ>ø`èСLWRRÒêÕ«+++«««ÿò—¿ØÞïµoß>‹åÞ«×8Cgôé‡ÊphÖér¼3élÛ²¼Ú"Ÿ"«í41­+i1Ñú«®ÅJa^‘Â>ÿS&˜Ì´ÙJ[,´ÑLkõÖ†f«Î`UÊ> aÿñ‘Òþn?¥æÒ¥K¥5·Fçê$-‹Ž6Mù¹õÂfoÕÏNÌÃþtûþ@‰Dâãã3dÈ3f,[¶,44”SWW—’’²ÿ~«Õº`Á‚wß}W©T2?û8’’róæM‹Å´p î ð”јçÉ“Ùçÿ3 ¼õšL³|¼ 4F;jÔ z°è:wîÜŸÓ%>5 ½þ·½L­±\]2`äÈ‘½óÒdè°®+ˆpÉh›ÔjÿŠèIz¯ÖË8EòØ¡Êì° Š.™Lm¾5¾«óº^âSC™§c«A£TVFá¸RÀ Â6©Õj³DV8t ÛpÇ2ûdÕwaç.¼Ð#SºÞRr.°€"´Ð“rï½m¢<,ÊJQĵ‚0++«ëfØ!O~!O!L!L~!O€Þ—Œ¶Éd2eggÓ4yõç~¥…lû'øÜà³\òX´&¢;çÓ`Õn¬ÿ¤ÖBÆ\Ñ/Ùßú²D‹HtfâÃf‘X$Mš4©;§Ý—Œö±XìííM)ŽÞì­bÛŸø¾Q`Ò¿oúª¸¹¼Û&c¤Mï7~ÉTƒ„É?ß;=X2€y=®·  ä¢V« !V¡ðú°« 5+oýô÷z‘áoÚ»£&¤ ½½é›bsë#O#*Ìæ»]¤"¬õeô(À-(¹°OìlöV•FŲíq…-ãò z¡qsã—L7»z;µß7^a¿>üÓ½GÚÜÑëåÞÌg BܹÁ/äÉ/äÉ#„É#„É/ä Ð{  äâãã#¶>eÔ8æ!*"Šíš\ëÛdi!¦÷vž4ävݾÕeý`8Ã~ «“)jb¿V†G³Ÿ],'NœÈãôyò yòaòaò yöŸ}öÙèÑ£•J¥Z­ž?þáÇ{zF„ؼ¹®ûׯï¦Ú³gOXXEQݰ-7Ñ 3áVRR²hÑ"•J¥R©-ZTZZÊ1˜rÐm󼿡 ä"|||˜ÏÁ!!¢EÏIkÑ%k±>u¨‘¢i ±¦kÿóïæÃ4áÿ.ÏCúS{uÇØ¯ ³táI‰ÀÚº!* H8h¨D"Q*•x!¸bãÆ~øá|PUUuâÄ ‘H4sæÌÇý ïä„_yå•;wÒ4íÏtìZ­vúôéñññÅÅÅÅÅÅñññ3fÌÐét‹Ð¿ÔmS½¿á)£í(--½qã†D"y衇(Š²äœ°ìÝÅöîHTý8LÆ|Ž“D-õžç-óµéou˜”~ IDATY¿¨)Ùô‚Ø)J z¦E8w‘pü¾6}DhhèÑ£GcbbØ–õëׯ_¿¾›§áøߟ|n­Í•ÁœžP(4›ÍÝS»8ÕüMÙ²eËÙ³g¿øâ ¶å™gž;vlJJŠÓñ=;Û‡§Œöæ´[pp0ó_¯ðÁ‰‚ÈAlï‚cM~æs¾±àÍ;ŸÜ0qév‘•Ð»š¿·­½(ñråãa…µl5H$^ÂQc;°ò†††ÎÏXÈ“_È“G“G“_ȳÇݹs§_¿~¶-¶Õ EQ:î…^P«ÕfíÚµ4MëõúåË—ûûûûúú®ZµÊl6³ã÷îÝ;nÜ8…B¡P(Æ÷í·ßÚ®¹­^旕㵋eÆ ^^^111Û¶m³]Û±cÇÆŽ+•J#"">ùäÛ®‹/&%%) F³|ùrîM܃oݺµråJ¥Rùꫯ Ž ;숢(«Õ*l—刎¢(½^¿jÕª   Ž²Ý­3š/¾ø¢F£Q(IIIùùù¶¸wqï:fïÞ½K–,±mY²dIff&›W  l‡···D" nýNQÂ…OÓb óMj¤“¿o¦îëõÖÆ¿6üßW͇Lô½ÿ/YWWçÖß|:Ú°­ñ_‡õ?±-^”d…ꉓ:¤ôÞl#Ç©¬{TRRÒ¥ -È“_È“G“G“_ȳÇ%$$ØUSv~÷»ß=ôÐC999Çÿë_ÿºbÅŠ±cÇ^¿~ýÌ™3gΜyÿý÷™‘999Ï>ûlJJJQQQaaáÊ•+“““OŸ>Ýn/s®ÃñÚ¿+VèõúC‡ÕÕÕ}üñÇ[¶lÙ¹s'ÓuõêÕÇ{lÍš5ÕÕÕ_~ùå›o¾ùÃ?0]3gÎ|øá‡ .^¼³lÙ²¶ö®ÝÁ&L=ztEEÅÑ£G‹‹‹ßxã Ž ;ìÈvqW¢cÿ®_¿Îq^È•­/[¶,66öâÅ‹?üðŒ3nÞ¼÷“’#p×÷®còóóGŒaÛòÀ\ºt‰c‘àà`±X²xñâ+W®pŒd”žiê=ÿ+(7v6µ.à'^{öqYYYÿþým[ ' Üû׋Ãÿ=ìÿ^ ô{L1s„$†RTTT\\Ðî¶.odh÷×[Ù9%]éóä@QhíÕËÊÿûÜÍA¼êTp¿6VЦK—.-\¸P.—Ïš5+..nòäÉááál/EQï¼ó{ÙÞÉ“'gÍšµqãF¶%;;{åÊ•çÏŸ'„,X° 11qÅŠìâÛ¶m;zôè×_Ýn¯ÓKF×­[—––ƶìÛ·/---''‡²dÉ’#F¼òÊ+LWffæG}ÄœUKNNމ‰Y·n»`jjjZZšÓn ®¯¯3fLAAÓ s vd·x»álÞ¼yÍš5›seªE¥¥¥ÙîlZZÚ7ÒÓÓI{»»wssš›D"inn‹Ål‹Édòööniiqº’G}ô÷¿ÿ}BBBMMÍW_}µiÓ¦ƒŽ9’c»Ï4}wFË1 ›Íã={Œ²cËv]AÔÝ…–ã±Òû¯o¦iÚ~Ú4]»e£²¶ªõ›XtâÙÉ_{çÛM1Fž$Ÿ@_×WUUQmWXÚª´Ô|£;~®å²m£Ÿ@µBõë0Q!¤î_Ÿ{_8Ë´CT/ÿ©ó»}“Ùl>vìØñãÇóóó=:f̘Ï?ÿœ¹$Š¢¨ÒÒRöGKcc£]KXXsTxxxVVVXX»æ’’’É“'µÛë´ ,((8p ÛR__UWWG‰ŽŽÞ¿ÿ AƒØ®áÇ—••B‚ƒƒOžø 33óÀcPº´æî/;°Å^x éÕS9ö})¼ûŸRôücŸ·|Wc¹c7RcT…×h4h$fÑ€¢¢¢l{­„¾b*|»×)»âÄ–J¥ÊËË qìÒh4ååå¶gº˜3`NqÞµkשS§ØÓ¡¶·Û9rk°vÃá®]ߺãÎÚÞÇĸ[{×KFãâârssg͚ŶäååÅÆÆr¬§ÝuÚ‰îçEƸ¸¾îÝϥ׆w3„äççw-d€oýíÀòÖ;ã­ç~ùø=1sÎdiüW͇ò¿¸Àš¦èz™¶^¦½A*³›/r¬9BÔo±÷¯˜ËDuUUU~§²Øµ¡a*ŸÏó yò yòaòaò yö¸”””-[¶…B¶¥¼¼\©ìȉ‹øøø½{÷ÚÞ÷Í7ßÄÇÇ»Ò+•JF£D"qq[Ó¦MËÌÌ|饗»322^{í5¶Åöen ¶;Ÿ¶}ûvö³ã„9·‹;W¸¸u»ÍÈÈpñµ“ní]N^Í;7==ݶ LOOŸ7ož‹‹ùå—&LàÕOÕÏÕ¬Ïê‚088¸¶¶V£ÑLŸ>}ݺuC† éþ9tž\.W*•7PÞ©“éZÏD[Ž$ eÈøÉ«TOšoÔý˜k¼æú ëû QL)Âþ s¹vÙ…<¿¢ì°¦A±÷"Wè=¶nÝš••õúë¯O›6¢¨3gάY³fÕªUXÕþð‡¹sçúúú&&&B¾ÿþû×_}ÿþý®ôFEEíÛ·ï‘G±-M9¤¦¦&&&Êd²¹sçJ¥ÒœœœÍ›73•IMM8q¢Ï¯ýkBÈÎ;¯]»Æ±ŽÁIII«W¯þË_þ"ÒÓÓ™;úÚš0Çàvq‡ã ·~ùòå­[·2;ûå—_¾÷Þ{YYYNGvlýöüóÏ1bãÆË—/'„¼ÿþû999ÿûßÙ¶IΘ1cùòå'Nô÷÷/++Û±cÇ–-[<Èï”ú(º{Í›7ïøñãz½¾´´tË–-çÏŸow©îŸ§+JKK9òã¾Ñ¦¾ÒòÿV±ÿÓ~™^RXhµZiš¾T~mÛ…ôWK7¿x{C[ÿ[]ó¿Ÿ7í½b,²ÒV»MܼyóÈ‘#meW~ûR¯^½Ú» ÷‰ììì¥K—†‡‡‹D"¥R9~üøO?ý”íuüÝÅݲ{÷î„„™L&“É233mGrô2OˆaŠ«¶6d×xþüù¤¤$¥R)“ɦM›vèÐ!¶‹¹øP.—«Õê矾¹¹™ã$ÇàÚÚÚÅ‹«Õj__ߥK—655±]Žæ̽#í†ãʯ_Ž­Û~ÐjµÏ=÷œŸŸŸ\.Ÿ={v^^÷V:¶wSXX8þ|¥R©T*çÏŸ_TTät&4M>|xÁ‚þþþ"‘(44499ùÊ•+üN¦—뺂¨‡ ­÷ßöìÙík«šMMM=qâ;,//ïÎ;ìWÛ.ÛÏwîܱý/¡Ãk0?üðÑ#GNïþZ·nµmMX·é5í©lÚba9rdÿ±ƒgÿýAþ?ÿzùÓM×ÿþöÕü-ûö‹».Þ¾j¡­mÍ!??ÿè¡CÚ7þÀ®9ÿ‹í·nÝêÌ^°Kñ•C_3ÆÓ÷¢÷¬aïÞ½=>‡ûf ìJ“×…Oï´½¬±­­¸òt Ò+Ÿ2ÊÈÏϯ®®&„øÕV É;%°X~Ñ-Wh}ýkåÊ;êÀf•ol\œX,ÎË˳Zï=rÆÛÛ;!!¡­õŸ={V|ãʼSÌW³H|frÒ¨±vì*FCCƒOÇoA;È“_È“G“G“_È ÛôÚ_Ñà.|ʨ+3öô4$$„)ëýƒòÆL’wJªo¾×­köÖ5{NòMb‰ ¥Q6íá#F\½zU§k}²¨ÝÓ“íètºÁ·ŠØ¯5!aV¡H¡PtfÎø;˜_È“_È“G“G“_È ÷hó9³ÝÕ§õf~~~ìÛcš•>¹N« êï´Æ›ŒÂ‡MMSݸeôþ{:EQ!!!ÅÅÅJ¥R­Vûûûßð×”TÜêW|]SY&²˜íÆÓÍMæÝ;„õµ"©Ùl&„Ð4m6›¾gF§Óß*b¯»mòQ7{«‚½½»v— ÏèÖsMÿýßÿ‘‘1lØ0¹\>iÒ¤+W®dee¹õº•^¨ÿþ=ôÐèÑ£###U*•F£Ñ˽ †Žúiêܼ ‰7‡Ž¬ 5‹~QïY~ønà•\¶ÒkëªQCCC°Íõ¢U¡„ÎÜ=ÈpñAÃà"äÉ/äÉ#„É#„É/ä Ð{xÆm¦t;lssóO?ýd×(²˜×Uú^Î%6µ_YDLqt!däÈ‘~~~Ž«ªÞ³Ë÷ô æ³I,9;éa‹@[/ú”®+ˆp7Ï …T*µk4 EƇ¦‰—½L÷.øì_|]S}‹´u†Ðlö¾x–ýV3p°E ¤(Ê—Œ@÷úì³ÏFÍÜ 3þüÇ÷ôŒùåí»ymünÚ©={ö„……QÕ ÛrqÝ0999Ë–-‹ŒŒ”H$ýúõ›9sæ×_݃󹟠 äŸF£ql”ËåTh˜øù—)¥ªµ‰¦£óÏʵ N BëϧEúÖ'‘Z„Båô‡%‰L&cÞ… Ð=6nÜøá‡~ðÁUUU'Nœ‰D3gÎìþiôl5Òœð+¯¼²sçNæ5q|MÉ£¥¤¤Œ5êÀZ­öâÅ‹¯¾úê† 8^Ù®CAÈ?ÇF™LF¡‚D‹—Që³|„ËмŸÌMö£MF˱ïØoUý"¼ƒ"##y9=ˆ;7ø…<ù…vìX¹\÷ÕW_áWx7(**?~|OÏ¢ùé§Ÿ~÷»ß º®–ùL UQC$IHHHHHHç§7qâÄίXÈ“_È“G“G“_Èӳܹs§_¿~¶-ëׯg?S¥Óé^xáµZ­ÑhÖ®]KÓ´^¯_¾|¹¿¿¿¯¯ïªU«˜'«3öîÝ;nÜ8…B¡P(Æ÷í·ßÚ®¹­^ælu;Þb±lذ!""ÂËË+&&fÛ¶m¶k;vìØØ±c¥RiDDÄ'Ÿ|bÛuñ⍤$…B¡Ñh–/_ξ Ú)îÁ·nÝZ¹r¥R©ŒŒŒ|õÕW Ç„vDQ”Õj¶ËrDGQ”^¯_µjUPPÇ™Év·Îüi¾øâ‹F¡P$%%åççÛàÜŽã‹X,Æ¥s¼ðŒ‡µxÐCeXÕÕÕׯ_g.U(cÇŽµíÕîL—äa¿ 'ÏΞÇ|¦o•˜>ÜL¬VækEØÀÛc&Ú¾º ÛL:uÁ‚/¿ü²Ó^Š¢ž}öÙ)S¦<ú裵µµÉÉÉ‹-ÊÏÏŸZWW—œœüÔSO¥¤¤BrrræÌ™³uëÖÄÄDš¦¿ûî»”””ƒ&$$´Ûëøk¢¨^xA£Ñ,]º4$$äÌ™3¿ýío7nÜøÄOB®^½:qâÄwß}wΜ9W®\yòÉ'?ýôÓ©S§B &L˜ð§?ý‰¹cÇŽÓ§OïØ±Ãé¯ÍvGDD¤¦¦>þøã555k×®8pà¦M›œN˜c°Ó`mo7œ¥K—&&&Ι3G¥R9]¡+S¥(ê©§žzðÁ™Ý¹sç¦M›Nž<9pàÀvwkï:©¡¡!77wíÚµ3gÎüóŸÿÌ1òš©øš©¸+æÐ11âðqxÇ–íº‚È3 -O, !f³¹   ¼¼< `ذa¶]õõÆßQ5Ô±-‚±Di®|rÇ–EAèótª®®N¯×‡††Ú6 †³?ùÓQq‹ÍÉt©Œ˜ŒÄbaòG>tGÉ×|ðâ !O~!O!L!L~!Oc6›;vüøñüüü£GŽ3æóÏ?&„PUZZÚ¿fdcc£]KXXXCC!$<<<+++,,Œ]sIIÉäÉ“‹ŠŠÚíuZ0'¯õõõQQQuuu„èèèýû÷4ˆí>|xYY!$88˜=ëÅ(((ˆŽŽvúk“{°Á`xûí·322JJJôz=!D(2—È:N˜c°#»ÅÛ §°°0""ÂéªÚݺmAhiAAÁ¤I“ÊËËöÚîÖÞuRuuõáÇÿûß¿øâ‹¯¿þ:ÇH„.­Ù# -.²Z­ÇŽS6Ô=Ÿ-6›œŽ©p=n4!$666((ˆ¯M_¸paøðá|­ '¿'&&¿§G3 /¿ürUUÕž={ÈÝ»ÝlÏÛ8ma~ÈI¥Ò††///¶«¥¥ÅÇLJ¹ÙŒ»×iAh±X]#3ÌËËËîAîÀb±BD"‘V«µ}O˜^¯—ËåNmr^½zõ•+W6mÚ£P( ƒL&c‹+»r vd·x»áF±XìtUínݶ Ôëõv;«R©L&i/p·öŽGýÍo~SRRÂ1¡+D]±Rh—@ ‰DM>~¦Ä?ée°¿•¹6bÐÍÈ¡Ìgæ ¥|ÁßÁüBžüBž=z´R©T«ÕóçÏ?|øpOψBø}´ž[k놧úíÙ³',,Œ¢¨nØ–‹›èñgž;wnÅŠ¾¾¾NgRRR²hÑ"•J¥R©-ZTZZÚý3¼/¡ ìI£G6lXTTTHHHpp0ÛZWW—œœüÔSO1'jrrræÌ™³uëÖÄÄDš¦¿ûî»”””ƒ&$$´Ûëô á /¼ Ñh–.]ræÌ™ßþö·7n|â‰'!W¯^8qâ»ï¾;gΜ+W®<ù䓟~úéÔ©S !&LøÓŸþČܱcÇéÓ§wìØáô÷d»ƒ#""RSSüñšššµk×8pÓ¦MN'Ì1Øi°¶‹·ÎÒ¥KçÌ™£R©Úú£lwªE=õÔS>ø ³³;wîÜ´iÓÉ“'Ønàní]'9f”——ĶTVVŽ5ª¢¢‚c=ÖÂëôÍ]1ÃŽ¡F "upÙ.+ˆ<£ÐBAÈ£¬¬¬‰'öô,îÈ“_È“G“G“_ȳ·¹téÒÂ… årù¬Y³âââ&OžÎöRõÎ;ï°æ>>v-aaa „ðð𬬬°°0vÍ%%%“'O.**j·×iAXPPÀœ¼bÔ××GEEÕÕÕB¢££÷ïß?hÐ ¶køðáeee„àà`ö¬£   ::ÚéïIîÁƒáí·ßÎÈÈ())Ñëõäî½N'Ì1Ø‘Ýâí†SXXátUínݶ ´‹´  `Ò¤IåååN{mwkï: ¡#„ž1OOg0^~ù媪ª={ö»w»ÙžðqÚÂüT“J¥ ^^^lWKK‹s³w¯Ó‚Ðb±»Ff˜———Ñh´í‹…"‰´Z­T*e»ôz½\.wú{’{ðêÕ«¯\¹²iÓ¦˜˜…Ba0d2[\Ù­c°#»ÅÛ Çh4r?‚Þ•©2÷"Úí¬J¥2™L¤½ÀÝÚ»Nâë’Q„®À‹éà©TúÖ[oÙ]5j7¦­ ƒ‚‚ª««mOsUWW³ïÖâîuÊ®8±¥R©òòòØ79ÛÒh4ååå¶gº˜3`NqÞµkשS§ØÓ¡7oÞ䘭[ƒí´N»/$sqëŽ;À~åÜ­½ëä%£Žââârssg͚ŶäååÅÆÆr/E Œ’`]ÝÓSpaŸÓÐÐàããÓÓ³¸ O~!O!L!L~!ÏÞ&%%eË–-B¡m)//W*•XU||üÞ½{mo„ûæ›oâãã]é•J¥F£Q"‘¸¸­iÓ¦eff¾ôÒKŽ]‰‰‰¯½öÛbûº·ÛOÛ¾};ûÙqƒÛÅŽ+\ܺÝÎfdd¸øÚI·öŽ÷sYsçÎMOO·-ÓÓÓç͛ǽ” réèC\úÚxÊ<=B^^^OOᾂ<ù…uê”+½qqq»wï6›Í²m¼xñbHHÈgŸ}VSS£Õj:ô«_ýŠéº~ýzPPлï¾[YYYYYùÎ;ï<ýôÓmýžäüôÓO/^¼¸¢¢¢ªªêÿ÷{ì1¶Ëqƒ9vÄ•p\ù1̱uÛO?ý4»³ï¾ûnPPÐõë×9¶âJ¼s\scccddä›o¾YWWWWW·aƨ¨(­VÛEè…º0í.Z/¿Pt‘ììì¥K—†‡‡‹D"¥R9~üøO?ý”íu« ¤iz÷îÝ 2™L&“%$$dffÚŽäèežܨlkCvçÏŸOJJR*•2™lÚ´i‡b»˜Ë år¹Z­~þùç›››9~Or ®­­]¼x±Z­öõõ]ºtiSSÛå8aŽÁÜ;Òn8®üæØºí­VûÜsÏùùùÉåòÙ³gÛþ wàní]ÇpŸ¾*,,œ?¾R©T*•óçÏ/**âwë½\×Džñ°oÞ¼îœ0ºõ¡2MMM#FŒX¶lÙòåË !ï¿ÿþöíÛsss EÍÚÂÿBê.»Ï„¥RyäȑӧO‡‡‡‡‡‡Ÿ9sæðáèzž ÐGuë=„Ð{  è£PôQ(ú(„} B€>Ê3 Â’’’E‹©T*•JµhÑ¢ÒÒÒžž‘'¡Øö"Ûv;wnÅŠ¾¾¾vÑ1¸D¼v¸Ãıê–ãÇ?ñÄ>>>ãÆÛ³gÝœ®k7LœnÉÉÉY¶lYdd¤D"éׯßÌ™3¿þúkÛ88]×n˜88;¬²²rРAn%†<Ûâ4LœîêLbÉÓ B­V;}úôøøøââââââøøø3fètºžž—'¡‰mG¶®HNN ÌÎÎvìâñ:â“cÕuS¦L¹}ûöž={***¶nݺ~ýúüãl/N·p‡ÉÀÁ麔””Q£F8p@«Õ^¼xñÕW_ݰaCjj*Ó‹ƒÓ-Üa2ppvMÓ¿ùÍoÒÒÒlqpvŒÓ0Ù.œnéXbÍ“îõ6oÞ¼xñbÛ–Å‹¿óÎ;=5Ãñ§ŒlÝâ˜$w€ˆ—ƒÓÃǪ[~ÿûß[­VöknnnTTû§[¸Ã¤qpvÚ7|}}™Ï88;É6LgGýõ¯MNN¦ ÎŽq¦ãW[Ó©'ÖÉ<=  œ6mÚÁƒm[<8}úôžšÇá8¶­[“äñrp· D˜íjnn–H$ìWœa&ƒ³ÓŠ‹‹ýýý™Ï88;É6Lg‡œ?~È!ô/ÄÁÙm…éøÕÂtªÃ‰u2O(+++m[***‚ƒƒ{j>‡$‰‚ƒƒŸ~úéË—/³]ÈÖ-Žÿ•rˆx9´UâXí°¯¾ú*>>žýŠƒ³3ì¤qpvÂ;wŽ;6nܸ×^{iÁÁÙaŽaÒ88ݧÓé†þã?2_mÿ>ÂÁé.Ž0iœîëpbÌÓ B±Xl4m[ŒF£Ý¿Ý‡yóæ?~\¯×—––nÙ²%00ðüùóL²u‹c à âåഠıÚaµµµƒ>~ü8Û‚ƒ³Ãäqpvˆíý)‰‰‰f³™iÇÁÙm…IãàtßK/½”––Æ~µýû§»8¤qpº¯Ã‰u2O„}Îûï¿?{ölæ3²u B¹r3ŽUUVVNž<ùÈ‘#¶88;Æi˜Žppº®ªª*##£_¿~o¼ñÓ‚ƒ³ÃÃt„ƒ“Ûž={&Mšd[Q£ ì0î0áàt—ë‰Ýÿ!Î)ó«²²R¡P0Ÿ‘­[pÉ(\)q¬º¢¬¬lĈ‡²kÇÁÙm…é§»Ž9Æ|ÆÁÙI¶a:ÂÁÉ-**ª¨¨È¶—Œvw˜ŽppºËõÄ:™§¼v"...77×¶%///66¶§æãéh›+Om'qˆx; Çj»ÊËË“’’6oÞݱ§[¸Ãt„ƒÓ]'Ož2dóg'Ù†é'7Çs#l#ÁÁé&î0áàt—ë‰u6OÏ$ö ÆÆÆÈÈÈ7ß|³®®®®®nÆ QQQZ­¶§çå¦OŸ¾k×®ŠŠ £ÑxóæÍ7ß|S£Ñœ={–éE¶nqüï…;@ÄËÁ1L«î5jÔŽ;ÚêÅÁéî0qpºkÖ¬Y{ö쩪ª2eeeŸ~úihhè¾}û˜^œnágçÙþ}„ƒ³“lÃÄÁé®Î$ÖÉ<=  ¤iº°°pþüùJ¥R©TΟ?ßîzeàpøðá øûû‹D¢ÐÐÐäää+W®Ø@¶íâþ—0q¬ºËi˜õõõ윮㧻Ž9²páB&±E‹åääØÀÁé:î0qpvžÝ?Pâàì Û0qpº«“‰u&OŠnã/B¸¿yÀ=„ÐPôQ(ú(„} B€> !@…‚ BAÐG¡ è£PôQ(ú(„}ÔÿÖ3Ræ¿õúëIEND®B`‚gsl-2.7.1/doc/images/gaussfilt2.png0000644016036000116100000055523213373111455014050 00000000000000‰PNG  IHDRè°ç»÷§bKGDÿÿÿ ½§“ IDATxœìwxTÅúÇg{K6ɦ÷ž@5¡H“¥ ŠŠ `‹J¼ˆñ¢R~ôKQQ@¼Š¢” AŠ „ÞKh!„ôÞ6u[²}Œ™;œsv³ Ù¸óyxx6çÌ™3óžsv¿óžwÞaY,@ @ mØÝ@ Ð2D¸@ D¸@ D¸@ D¸@ D¸@ D¸@ D¸@ D¸@ D¸@ D¸@ D¸@ D¸@ îÅÅÅS¦L‘J¥R©tÊ”)%%%ÖJšL¦¯¿þ:..ÎÕÕÕÅÅ¥OŸ>_ýµÉdrt @ „GÇ wµZ=bĈ>}úõéÓgäÈ‘Œ…,XðÓO?mÞ¼¹¤¤¤¤¤dóæÍ?üð ÚB@ á±€e±XWûæÍ›ÓÒÒ~þùg´eúôéýúõ›?>½°T*½sçNHHÚRXXØ£G¥Ré¸@ Žõ¸:tèµ×^÷¼öÚk¿ÿþ;ca¡PHß(‰Ò2@ á±Â±Â=##£gÏžø–=zÜ»w±ðœ9s^~ùåsçΩT*•JuöìÙ©S§Î›7Ï¡-$@  *Ãçó5 ÇC[ ƒ“““N§£¶X,“'O>pàÚ2iÒ¤ýû÷³X,ǵ@ @x<°8§×ëñ-z½žÏç3^·n]PPPJJJ]]]]]]JJJPPІ Z< ‡Ãél+@ Ó>Jš†c=îÞÞÞwîÜñööF[*++{÷î]QQA/ºsçÎaÆ¡-§OŸ~ýõ×óóómŸ…Årl/;ˆApˆ5pˆ5(ƒP Á!ÖÀ!Ö @ ‚C¬AÁqqlŒ{·nÝnß¾o¹sçNLL cá²²²øøx|K|||YY™ÛG @ <&8V¸7n×®]ø–]»vM˜0±pPPPZZ¾åêÕ«l@ ð˜àXáþÖ[o]¼xqõêÕõõõõõõ«V­º|ùò›o¾‰ àO,X0sæÌC‡544Ô××8p`æÌ™ .th @ „LJÇ$.\¸ðĉ€‘#G~þùçÁÁÁÿ=ýƒ1@ÉÉÉ›6mºÿ> ::úƒ>˜:uj‹§ ‘UˆApˆ5pˆ5(ƒP Á!ÖÀ!Ö @ ‚C¬AÁqy Mn Ä 8Ä8ĈA(ƒàkàkP Á!Ö à8ƒpQ)@ ÌÌÌÆÆÆàà`În ðøáØwB§0{öìÎnÂ#±±…¤¤¤În£nÌÌÌÔÔÔÿåÔ^äöÀi/k¬Y³&>>~ß¾}íR['Bnbƒ÷'ï¿ÿ¾³›ðA¬C¬AaÚ´iÝ„G Ü 6lHHH8xð`'¶ÇqüöÛoñññ+W®´Q†Ü8íe F0›ÍíR['Bnbƒwð¿K÷îÝ;» ¸A úÿÉ£¢¢"---77×Fr{à´—5Ôj5Àd2µKm¹=pˆ5: "Ü „VðÃ?ÄÅÅ9;;Ëd²I“&ÁtI<·©#ptý£Ñˆþòx²‡%2OŒÇ@èˆp'ìeõêÕÛ·oß¶m[UUÕ¹sç¸\î¨Q£:»Q‚£x²¥­^¯Gÿ:(ÜŸ;Ð)áN ØË×_½k×®~ýú‰ÅânݺíÛ·oéÒ¥h/É„õ8rþüùÎn£nèkR…»=Ãr{à´—5ž˜Pr{àktD¸öÒÐÐàçç‡oY¶lúŒ‡²Ü¾}{ôèщÄÃÃãwÞillD{Y,–ÉdZ¹reHHˆ@ ˆŠŠúꫯð:ËÊÊæÎëììºxñb­VëÀ.ýÏ3xðàÎn£nÿánÛãNnœö²Æãq'·±F‡A„;`/}ûöýî»ïZ,–=zôè‰'æççgddÄÆÆ¾õÖ[x÷Þ{¯©©)55µ®®îÛo¿Ý¼yó¯¿þŠö4(..®¢¢âÔ©SEEEË—/oÿžv¥-‰q'´/$Æ@xÈL‚½lݺuòäÉ?þøãèÑ£»uë6tèÐàà`z±åË—/\¸pΜ9ðϹsç644༽½W¬X??ýôÓ[¶lY±bÅK/½·ÂNNNÛ·o_³f-<}úôéÓ§[Ý1‡1lذaÆuv+mJöΊ×ëõ?üðÇkßÅ Åš5kœ;·wÿË466‡yÜ#""òòò233»téâˆú „N‡wÁ^bbbîÞ½{æÌ™³gÏþþûï ,ˆÿñÇ}||ðb'Nœ $‡ž6mÚ§Ÿ~Šþœ5k¾÷©§žÊÎΆŸµZíúõëwïÞ]\\ÜÔÔàp8ö·ðôéÓš‡þîééé$‹nÎõ¸k4šÄÄD±Xܾ½®®nݺu^^^¯¼ò hÉãNnœv±†V«…w”ƒ„;‰uL¹=pˆ5: "Ü „VÀårGŽ9räH€V«}ÿý÷ßyçàejjj|}}ñ-”?CBBð?ÝÜÜêëëá礤¤û÷ïïÙ³'**J"‘hµZ‘Hdó5•ü¨µ‡NPPPg7áÑ7HçÆ¸;hØ€„=¡2äöÀikÀ8à°P™Žm’Û‡X£Ã Â@h#B¡píÚµôhŠŠŠÐÐP´¥¢¢/Àf[[’œœ|åÊ•€€øg~~~«šDBSZ‹‹‹Kg7áÑ7HçF;èì:`4활Jnœv±L)懗µc<îäöÀ!Öè0ÈäTÁ^æÏŸOù=(//wvv¦9räÞ½{ñ-{öì±óMMMB¡ý¹sçÎ6µ”@h:Òã®ÑhÊËËég·X,í+ R7 $ƽS€îÀaÚúÉN…D "Ü ûÙ²eKß¾}8 P(”JåÉ“'§M›6oÞY°`ARR¥XTTÔ±cÇöïßÒµk×Û·ooÞ¼Y ØsŠ-[¶ºuë}ïÞ=âqw4dÑ í¾Ó¸qã …íb÷îÝ»qãÆ´iÓärp‡ÂÎÎPr{à´‹5ÐØÌ¡¡2ãNnœ­qäÈ™Lö /tL{ž`HŒ;`/8p µ½øÊ©½zõ:~ü8úóøñã(7ã«h£L&ûùçŸw‘•YY4„nvÑ@ðð׃o¥<¸}ûv˜J ÷öuŠC»Ùl†lWþ¸Ü©©©)))cÆŒ?~¼ãÎÒ.Öp¨p·X,ð~ëáþ¸ÜC‹ÖP«Õõõõ•••Óž'âq'ÚŸI“&;wN©TÖÔÔìß¿ÿ7ÞX¸pag7Š@híâq‡úŒ"Ü'Nœ~éÒ%´åÞ½{ðšÉ´—#<î˜nõɈq?{öìÖ­[q{â¬Zµ*<<üÛo¿í°ö”––¦¥¥UUUÑw¡PGd•A÷ê#*3~üøðððÛ·owvC àPÝ„6C„;Ðþ̘1#))) 88xݺu«W¯ž9sfg7Š@hަ–R„{~~~~~>þŽæ %íÐwÐ,ÜŸŒwhdk}‘ËåùùùÕÕÕÖž7Â5.è»ìñ¸O:5<<üâÅ‹­=¯ƒî™6SXX˜ŸŸßbœØÿD¸·D¸íÏ”)S.\¸ T*5Í•+W¦OŸÞÙ-"0C¢T)àyøPt,E¸C)ƒï-((ÀO  áþ¸ÜÐ{m­/í•?Ç~k؈W±'{nnn~~>ZÝÂ~P;ÆãÞ¢A`{Ð-÷dÓ¢5 ð è„¶A„;@øß…D©RÀ òð‚ÏšpW*•øÞ¬¬,¤´íqGÕÚ*óÈÞ3f̘:u*%µ¢5hÛo?ö[ÃánC[Ã~Á Ô*4/Â-6ÃvGŒFc]]Ýà•oÑðþT©Tm«ÿ§Ÿ~Š_»vmÛ’ Â@  <üsæLk'§Zîö?,ãqG.U…ÊÔÕÕÉd²®]»¶¶r:-Ä~»ÙlnÛX´²²Òž;³±&Ü[´F‹ÂÁÃ?á €ŽÂ…;úÉÎΆ¦¥¥¡µ ÚøXÑïF"ÜŸ6mÚ´`ÁÊv6›½iÓ&ôgYYÙܹsCCC/^Œ®=£#mT©T‹/ŽŒŒ‹Å... ‡nq^§óšL¦•+W†„„‚¨¨¨¯¾úÊZmŸ«±±ñí·ß–Éd}ô‘Åbijjz÷ÝwÝÝÝ]]]çÍ›‡¥:thÀ€‰D"‘ 0àÈ‘#ø‰¬í…=b5ƒÊÛî™3gúõë' CBB¾ûî;|×Ý»wÇŽ+‘H<<<Þ}÷]ôÅÑÚ¾£b·oß=z4¬ðwÞillD{[4µµkD t$wøCVÂ*“‘‘‘ššZWW‹‰ÅbÐ’Ç>±µµ úÑHÛžªÕê„„„AƒÙ>/l›=ÞSxÒ¶ wÔ`JŒ;¥#(ßek=îPW=üuo1Æ}ôèÑñññr¹/€ *S_____Ÿ••Õ¾®¥R¹nÝ:Ê—¹5gmEEZÇeYi[ÐìiG&G‡ ®¯¯oí3ˆì`p7™L”‰ðO¸—"ÜmWûÀVÑ/"㠃Å{qqñ”)S¤R©T*2eJII‰Âf³yË–-ݺu …±±±2]÷!IMM;vl‹Å WQQqêÔ©¢¢¢åË—ÛSùÌ™3FcjjªB¡(((xÿý÷·lÙÒâ.;ÏûÞ{ï555ÁßÑo¿ývóæÍÖìoû\sæÌ8p`^^ÞåË—Ïž=»qãÆ÷Þ{¯_¿~999ׯ_¿~ýúÖ­[aÉË—/Ïš5kþüù………sçÎ1cƵk×ZÜ ¿p-ÍØÓ…¬¬¬^xaáÂ…r¹|ïÞ½«V­:}ú4Ü•——7jÔ¨1cÆäååݽ{7**êÍ7ßlÃ%@dgg=zâĉùùù±±±o½õ^À¶©Ûvo@Ì9¦Gæ‚ûOx¤h—Ìz¶Ce žzÜmçqoll„¿—ïqGØ£hÑ`Ãvaû=î°ýYYY555-¦@•aô¸Cán4ÛËãn?vzܯ\¹’––Fq”´èqÏËË›={vFFFrrrJJ ¾Ëž<î0=¼ÅbÑjµYYYÉÉÉí²²iEEERRÒ'Ÿ|‚¶ wVtm÷î»ï†‡‡8p`CÛ¢e`O;29:zEP[[Ûª[åqGWß¶Ç=77î #´*ƽ¼¼|ÇŽŽÖ®\‡Ö®V«GŒ1{öìÿû߀­[·Ž9òÖ­[гBç½÷Þ3™L LOOÿôÓO_zé%‡¶°Ý))) j±Xaa!üàää´}ûöøøø5kÖ´xÔñãÇËÊʤR)@&“7nܸq-î²ó¼ÞÞÞ(Dìé§ŸÞ²eËŠ+íoû\½{÷ž5kÀÍÍmãÆ£G^½zõìÙ³aá 6Ì;ÎkY·nÝÿýßÿM›6 8}úô†††µk×þöÛo-îeÄFV­Z•””ôÊ+¯úõë·yóæýë_Æ ,[¶lΜ9ï¿ÿ>?..î?þphóå nÑjµ+V¬èÒ¥‹X,f±X2™¬¨¨Èžšcbb-ZTVVÖª]Ûç…jñÔSOá/¡ì?×äÉ“ÑçØØXFƒoéÞ½{~~>ü|ãÆñãÇãÇN˜0å ³½—]¸xñâ„ Ю¡C‡"/ËñãÇ_}õUüÀ×^{ÍÚ)ì±ó‰'(-~´ØÎ6ß„¶AT;dŽ÷¸S„;ãȉ†6·ªUwd 4ön/» U×"¨ ;c¨L;zÜÛe&ü–`Ì7jÛã~ñâEX¼"”ËapG—²©©Éþ•MGŒž——HOO߸qã‰'pƒ .úÜ t‰a<úÝ»wÛQ¸Ûö¸ëõúúúúöuE£ç—ænçL %;¼îtᎧƒ¤|‡@lwS£ÑàÏZAAÁŽ;~øáÛm­î°°hÛvÁ±ÂýСC ôÚk¯ýþûwìØ1wî\‡¶§ (-zDGRRÒÅ‹÷ìÙS]] CÀm¼×çÞÿòË/ÕÕÕ]»v={öï¿ÿŽªµ±ËÎ󆄄à…ÝÜܬ­8mû\x|?ôLS¶ G®ªªÊËË ¯ÙÛÛ-s`{/#6ºPRR…FP2™¬¢¢©ñóóäüißQ…¾¾¾øÊŸ6ÚÙª{ƒ@pí²þãäTJÚ8äq§LNeaHåtŒÇÞfÛ…m{Ü<8~üømÛ¶¬ý‹/¶á)`¤Uw£Ñض÷‡•±ãŽÔ[«<î¨P›L&ü'²µwJµ òóóQTúáÇ-ZD gGw&j?ªuä?þHHHX¶lî°‘èña<îÖ4믿þ*“Éàïöõ”29¡EÚ*CÉÛîxµ:îØ±c„Ι3ÇÉÉ _uÖ@yÎH«BeàåèÈ%džÊdddôìÙßÒ£Gk3/]ºô /<ýôÓ×®]ãp8ýû÷_¾|ù AƒÚÂvgøðá‡ŠŽŽ¶Q&99ùÊ•+ðO为º644¸ºº¢-ø:a¡¡¡))):îþýûW®\YµjÕÁƒá½õûï¿§.zöìÙ³gÏ)S¦ãªÑÆ.Ûçm¶Ïe}úô9tèÐ{g¶öì …ŒßSÖ>|øï¿ÿþÎ;ïÐw%$$ìÞ½ŸTôóÏ?Û®ÍvßG޹wïÞ>úmÙ³gí|ÈkÄ|ÄcÊ5ÒÓÓIFHdöqÏËË;tè5ánŒ;îqo[ò“VyÜ‘5Z*C/SWW—šš ?CyŸ´µoÕè¡26²Ê´èqOJJúþûï·mÛ†¾­ wh µZíääd»…ö„Ê´‹Çn¡ ÷V…ÊìÙ³gÏž=»víš1c†µ£`Iø?ô¦566âßû™3gÐaá^SS/l¤=¡2¹¹¹'Ož 9r$eºy4 ý‘Ñ[œ”””››ûÕW_q8kgüé§Ÿ^{íµ©S§ÒçYZî-~—>ääTxqu:ÙlnÑãŽfÐfffÆÅÅAÙ‰»ä` &“I¥R¡!+#¸ «ªª¦OŸîææ¶wïÞ'6T¦U˜Íæ 6Ìž=ÛÓÓÓÓÓóõ×__¿~}‹ó ,&–-[Öñ‹•ÆÄĬY³fРA›7oÎÉÉÑét*•êþýûëׯGeÆŽ»`Á‚ÊÊJ¹\¾aÃ4°páÂùóçŸ;w®±±1//ïã?Æs :ôçŸ.--5•••›6m:th‹»ì9o«°ç\öðá‡~òÉ'»wï®®®®®®Þ½{÷gŸ}–””dÏÞððð?þøÃþ¼¥K—®X±âǬ­­Õh4'Nœxî¹çЮ¯¾újË–-UUUUUU_~ù¥µà~;û¾téÒÍ›7oÛ¶M.—Ëåò­[·¢¥àZ¤½®Ñcþx*ŠôôtÆ]ééé¸ßõð5àÁWÕ†Gª†   X£p·¿ çΣ$ŒƒŸÓÓÓ)É(ÇW½ …¹ÇŒF#ªý` ¨¬µÇšèò_„•Rú¦xÜ­Ù"ÜQ(‰qÀƒ¿÷xíéº"¨ ;,†Ò`ã­¢ßHD¢]”PÔ†   òòr|:¾5;PBeð^Ð=îx¸Âùóç‘pGKfâ5Ðû~ûömúûغ%‹ŠŠðP|0C±å3<ïýû÷A³Ç].—£DéééHÅj4šóçÏã/Kѵ¦ø}srrvKãÏ¥ çÏŸOLLܶmý~@—)--~-`³qK§rûöíÓ§OÖ¿(9)–„ 8Á¿:l? G¯®®ŽñÙ´=9~WÃt@ŒÎ~½^o0`ÐÝóAËã¿ì(ÎÞ~6¾'ñöÏ?ÿLMM…ƒpØB­V»lÙ2$;áØO¥R9vH‹#ñòòª¬¬Ä·TTTøøø0öññq½¹\.‹[<‹£{ÑnÞ¼9}úô€€'‹»víúþûïß¹sî­­­}õÕWe2™««ëìÙ³á·*:vË–-‘‘‘</00pùòå𱄻N:5eÊwww¡PñÑG544´¸ nã¼›â³Æ IDATŒ6´fX{Îe£|KJJJß¾}E"‘H$êÛ·/ ·gïÑ£G###¡ÃÀÎ.ܼysìØ±ÎÎÎ"‘høðá©©©hL».‹e2Ù[o½9¦ï7oÞ5j”H$’Édo¿ý¶\.ö´³µ×ˆ@pø/«Á`híáñññ€yóæ¡J¼½½á.JÂÜ¥K—Â×S , ôì?ÿùª%“6mÚË/¿  iUÃè>Ë#GŽPÊ?~|Ô¨Q«V­‚^½z&¤\¿~^§¯¯¯››[CCƒH$8;;S œ:u nРA‹ÅÅÅoLh'gΜGmß¾n |}}ñb/¾ø"´Oß¾}±±±ŒµÁb›7oF[puu¥”¬®®Ž‰‰‰‰‰i±…½zõ$$$Ðw!û£ä<øW±ÅbA ^âããé‡÷èÑîEpñã?ÂK–,al؇~ËüñÇxæß¯¿þšñ×_=,, Æ7=zT¯×s¹\@dd$^ 9Ïœ9ƒ/Ü1b,Ó©!?÷† ­'Ož´fÏo¾ù0nÜ8ú®7ÂÃ333é{7lØ@±$ÒâžžžÖNg±X¾þúkÀèÑ£é»PÀêôéÓmÔ@-zõÆo0@cB½^–mùæ›oàÞ‰'Â-ÕÕÕŒ/Ïuuu°0Jm²xñb‹Å# ð./^¼¸}û¶ífù7C† ±4?zP—Âä~~~‹­ ¿Ä@³¬o•}ìDZ¡2ݺuƒ’m¹sçNLLŒµÂmLGÒ«W¯Ÿ~úÉÚ^™LF ư`çÎK™¤‹ö6 f0¤cc:ÜÆy-LKQ0n´ó\vn™4iÒ¤I“«²½w̘1¿x‹]èÕ«—µ|øÃ?LNNvh G0cÆŒ¤¤¤ôôt“É»zõjPHxÔ 0Q /ÀìÇ6l@Ù]E¥ÏJ„h4(Ù­åqgÌ*ƒp„Çþ h üúéÐ/4î‹Å`0à3éþlºÇÝžÆ[,–ÔÔÔ+W®Pú‚§DD-´áqÏËË[·n]ÿþýéwÆtHÃUWWO:uذa§Nª«««¯¯§_{ÒA">ûì3‰D‚îŠÖzÜa…'Ožü믿ÐkXF{êõzcƌɓ'3&Œ­ñ¸ x{0Na„ <-7w–¢±(wÑn­xP³–••íÚµëØ±cÿüç?9ÎèÑ£—/_Ni î/§wF;žá~f •aŒ÷€@ÝØmÕf;TG£Ñ úm wºÇ¶?%%eݺu(o7cÞ‚¼¼<¼I;äîÝ»”-”p|Òv¿~ýÐ.\¸SœÛð¸F´?Ñ3Ï<#‰Ž;VPP°f͘YÒ¶ÇýæÍ›ôDÆôT†øY¸œ5k–L&Cág€)T¥UA[(ãû`jjjš?~xx8\ÕçÖ­[p#2ESS“µ¬2îôôÐt»R©Ä3¶Êã×Û‚P„»V«…–7›Íz½ wz:Gàð¬2!!!)))J¥R©T¦¤¤ã{)_^¾¾¾?ÿüs]]V«½xñ"}@ JVVÖŽ;8€¶ìÚµkÇŽ¸0¥0gÎœÆÆFô‹¯n†Ê !H÷¸ÃŸdÇãñ »´”ÇA‚{öìIIIAÓÅ(´ÊãN?„"õpÍŠg¡£ wÊÑ–ëׯÿøã¡¡¡,ëÒ¥K€3gÎÌœ9sÕªU0ç4~%;¥µ6<î6„; Ö‡ŸqùKQçðB ¿¬B¡HJJZµjÞcó§2™ i,kïõl‡ÊXó¸Ã^SÂÇ)@üàÁƒáœT;…;eÀƒÿ‰{U‘bkll¤x[mwÊšAèsii©V«­­­Åo*ÛÂ}õêÕþþþøLhúÈŠ±ýUUUõõõ¸(§„ÊX,¸–áñxàábÜ‹‹‹óóó¡/ wü ¤ÅPxjÂWð¸ qO<ü`C¸ÓS!ç>„ÓétôïÆÇØãN „Ç ÆÙ“€¦¦¦‚‚‚7âÉ“ÉtôèQÀÃJÑ^ÐûKùICw(ÜA³8³ßãNq Cõ†ÞqSh•Ç/@‰ä9{öìŽ;ð ü³ »V«¥KR¤8¿øâ‹Y³fAy=…ðÕAMM ýŠPò¸Sºƒ„;}]U\Ï¡PcóÊ”h@i6~jØ*4¨®®^·nÝ_|ˆ*„¢bU ŒÂ„Gªà}±ap p‡+ܵÁã®×ëé¯& ¸«•ò®@­V§¦¦Fz¨ ¾ïT“555¸·Øv¨ ´[ii)~çÓ#^=î°ñø+5Ê:^ X9œƒ^\\ìëë‹g޲ôLÃÏȹ‰<î¶'§â¡2ð¢S– ØÁ|À ‚jkQ¸«T*|$C•AíaLOI„;¡ut|öúGb b Ä Ο?oí'§±±ñôéÓ‹-ÂWLkZË• E!áÎåra\8ÅŒK=Jxz¤™JJJÛÐÚwtœ|… ÿûßÿNLLăpÿERNa-(<82¡wC1îƒqÎèq÷óóc±XøôMx F£©¯¯§ˆNŠÇ ?ŸÕ‡iÑãŽÊ#//ýb1NÜd •]‹ŽŽ†ÝŒÂ½¢¢‚†Ÿ—k€³gϢϸp§xð`‹Å ÀåB)²ˆµí¦Çß3 w¨ aẺ:ú=î¸Û€Ú¿šÀ…;ò¸Ã?q[5fÌ™LÑñ³hµZä¹§¼¥Á=î©dÍãŽT#ÞMz—­-|kÇ†ÊØîs<¯^½Z&“á—•âqG‰ÉM;ª–"Üúé'˜€U~îܹuëÖ]¾|Ê>{<îôž2Fv¡«À*V__¯ÓévìØñý÷ßS„;ê.Ü!UUU0»¹íïRüÆFwø…€†è¹À…{vvvRRÒçŸއÊXît;h'án4 c¨ ñ¸¡3±!ÜaªAŠ€À]¤ôÉp€BÕk0è¹/¬yÜéÂÝl6S¦ýAPÉO?ýô­·Þ‚Ÿ­ ÷ÖÆ¸C½Ëçóaúgi°ñŒ%6bÜMáŽÛî0[cl­=¡2 gÂ]Ñáž™™ —­µX,° p(Ž?Ñp áçç'‘HÐF|ÈÊ*éìì¬P(P8»Á``´.Ü¡‘«««Ñ e6BeÐQ°GY~†-ÁcÕlÄõÑ{a¿Ç„ÊZ‡µD¹xñâŽ;àmƒ‡ÊÀVámCÃ-x ׯ_w¡g [<¯7ŒE±ñ]Š, W#Æ'§Zît=7Éšp§,Ïìëë špxjÛÂ=!!!>>žˆQ¸3Ƹ766Ö×׳Ùl´Ö2 ¡2„Öb-Úÿ&Ä8ĈA([ûÉ)((€òæ A¿¸øO/}ÁE‡ÃªW­VwñÍë×kß‹ãn¿ýjÍ¢DÕGïÕ.|s_ïȼ¹³{ݽ¶°Gô³!#>räÝãÎàšÕ‰ÅbÁU£Nbìš á^\\l¿Ç¬w.— %#]âP–Ñ †Ê€fuˆ wwk«Áî ©V«…[”±&Üé9ÂéwЬœCe`G¬yÜ)8;;šÊ·±¢“5á¾k×®ðððÅ‹xÜwïÞ Ï‹‡UX •iQ¸ët:(Üq;*ƒ2¥2öqðàÁÄÄDx:ºÇoü̸rz(…»ŸŸ ~ƒ@ánã»]'''‡c0Ð2d-zÜhТÓé¬ wtÉà7•¿¿?hVü°0òô£Cð®]¸p!--qå`€Z­F¶ByÜåååf³Y&“ჇzÜI¨ÌH÷îÝ;» Ä8ĈA(tïÞÝš$E’®¦¦F&“ÍŸ?¦ÿ³æqwqqZËåzJÄú÷žç+ xûUzÍ;@êj«f†Î Ô›LuéWFÊœo‰„µMZ;=î …ÿ­U«ÕuuuG«ÕJ¥RÖŒèêêÚÐÐ`C¸wïÞŠ@€OœV”±““ŒåeÔ‘6„;%Æ ÷û÷ï'$$ Õ¬ У±±r*ãED)}ÐÄ;{<ît­Q((YfŸ„gi•Ç‚‹‹KCCE:Û*ƒì ó…À…BY,–X,n/á~ôèÑìììîÝ»Ó=îl««‡¬§·G¿Ð`_±ÈlÐw1(‡¼8xþxgggõŽÛª‡ ,PEîîîîxî@è ¬ùº(Â1TÓóò\4»W m¶–i0›<6ó^›=>*  _³„Y]ÖÏÏÇàáEî~øá3Ïúàìì 5£ÆÅ½Œ6BeãÐF¤çPðk`T*•máÞÐÐ@I ¸uëerîqGAðôNQrÛ3 w´îáÆ/"++‹Åby{{Ozvl¼¯÷` ßüçÁäž vs5l\Þ]­®üàm6›­Ø£°AYРȮmH«¨ºV^UÝØtèÐ!¹\>þ|º¬ß³gÏž={ð-™™™SeYÒ ¾»Föörg1‹ !—3<$pxH àF¥üš^w\$¬Tkð÷'ãÓÇÖB°$~»¶*T†Ò¼0p wWWW;wîP„;ÂfÀÿᣧ£±áqàqöï3(з¿¿—DL)Ыkå~2¤ÜÒ Õ*,Õp-¥Â$–èt:.— _AðPh4''§ššû…û·ß~‹>ãYeààÊÃÿaH¨ ¡uœ?žd§FkàkP ¡`c&Š2f\þ.Z úõýhpœˆæe×›L§ K ¸‚Oœ)VªÜürrrD\nˆ«ôÈ¿¿¹uø`4DÈ\)G³Ùœ—=†ÆÌzQo¶Üì}½¼J-vºWU}å~vanî¦M›èQOH¸£¦Rºæëë+ Õjucc#”ÔxàLPgðù|ÊäTF+I$<’áÔ©Sf³™Íf#áå”Ë0Ã, ³DÃÏH¸3ÒâäTØBzš À$Ñè¶3$$$==Ýh4â ^R@÷*0ËÐÓAZS™C‡=|ø0úS @§8ã:VR©”.Ü¡)XD¹»Åz¹÷ðõŽìݵ¯¿OÔ Ìž 7.Oˆ Xêj9¸ ÀçyŠE}ýþ+ï*ÕšS…¥×ÿ³S7f00wÀf³C]œûûûÞ¼TúÁÛ=DÂO°VØúøxõ๳Žåí¼•q,¯ÈH›E îiii %áŽ{Ü[*ƒÐjµjµö===Aó²...pô›ŸŸßØØˆ—Âw\÷Cá¯,Ä`0àíá²ÙÂÆE†Nõsqîe£Ut\…‚组 ë?3ùÍîs¬´åâ¡2H¸ìë =tá —ËOž<‰¶0†ÊàÛV}Hˆp!B‡X‡Xƒ1ŽZ­¾pá¾âŒ ¬ wÃí´´7^uu¡”/Uªÿ“S¸åüe_ÿqãÆÝ¨”víš““Ód4fÖÔ5Ftý¾òÇÇÇz¹oy/ѧ¶2ÌYhðÙ¬þþ>ýý} [81P]•gÑȼ2Q®iRéõ*¾^« *É*æ…F…ù[Œ–ºZ–³”¢¶%‰··wQQQUUUhh(ÚŽ/ÀtñâE@ó¸ÃˆdzÛÄb1.Ükjj>þøã5kÖ0zÜã€Ã‘ øÿ˜¾:r;B„;@  ¡¡!))ÉÎÂôP™p7—èkg-urŠj¯gq~È)úì·ƒ"''…¦éß7úûûþùçàÁ¼(û]yíi oÏŸç%Êúg#Bßx*ޟׂó‹€Ù8*4èÁÍú„‘ƒà'ÃÆåbÍ–SÇ_-¯¼PRq¹´ÂÉÉÉËË«¨¨H.—Ó…»Éd2›Í”wJÜ6‰D"‚\œ»¸Ëúù{ò¸²û·J×|öºEýÒÛ¯ú6U[D–·ß{ÍU"Qo‹ù<Áó£þ>òê©~Lqü˸ggò¤Ñð³Ùb)lPÞ«©»UY}®¤Ì ËæaÍãžššzùòezólxÜqß¶@ €é;ñôätp·æq1£É¬0¸Ÿ@°«´‹»Ì["ëéÒcø@tG(róu÷ïëUVhN» ÌfYöÝá|ànѽ8~TŒ¿Ÿäéø ©˜ÇM­é܉I!ÖÚÙf8,VŒ§,Æ“ºÊ ,\-¯JÉÌ=[^™Ý R©Tk×Jˆéù[æßs¸\®Ñhd³Ùf³9ÔÕå™ð É]"†PÞL¹‹„‰}º'öé^¡Öì¹›u4·ðRi…ÁlÎÏÏ÷óósqqAqðÖ<»»R©„£;x9$ |ÑšïŠ^½zM™2….ܵZ­N£ ”:sÙl•^¯Ðê Ç…ÊDDD€fñŠ@“(pá%;îq÷¦øêÒüy³½iÁ08M&óòÊÌšº‚e¹J–““#“ɶoÜ`Q4ä]¾(©«ñ”ˆ(GIxܰ†êko¾’V!ßvýŽ-Æ]$Á7F£‘ËåÚ•áóùžƒýb95¿øx~q]³,Ã=îJ¥2!!±*‡Ïç#ánÃ㎄ãî¸ô‡¡2!®Ò‰1QÃ|ú=0}ó©8Jý³Æ™Æ‚LÀ`cÊÞ~Œfs~½"³¶¡÷è1Ÿ|ñ¥WDÔßïd E•UU111b/Bææ*íåãÙÏß§›§{ÛöM&ó™Ââj™÷g?ÿR®Rd2™P(T©T<OïPXXèêêZWWWР؞–¾=-ý“÷ç7^9?-6º»—¥f_'Éú|0 J¯?]Xz賋'N~÷Ó¥(*öpGã1T^WWW$Üa (@‹ÍbuñpëëëÝÓÛ³—gß þõtðtx¸ÙbÑ°ØÆï¾šàÄ»äéê =î”YÔ(5$£ÇÝU(x¹[Ô¬žÝzË„ I˜T{£Ñx"¿8µ äbIù ç§lûé7´+ðîf憄„°ûœÌ/{oéÚ^>ž aÁ¯õë)¦úìã|½þ=~”^SÅ3ì–‰ ,ôL(j4­VëääDîç©@ßÑaÁ/{ˆü¼ƒYݰ¹ÅzM÷>±è¯ÛUÕ€cÊÅ:BBe­#==$¹CkàkP Á¡ wè Ä· \(HŸñ5êãÓ' ôË-–óZóÔm»:ýº©Óaä<î@(BŒ<î[c`0X2wVÿÁs_žQXXøã×_ýöŦî^žê/2èœMo' ‡eÿœÀ¿‘ðxa†¦÷ƒ¼ßSž~ÕÊŽŠl6À<Ù·nÝBšî¨ïžbÑKÝ¢^Œ‰êïïÓê´ ¶Å24ÈhÿŠaOÕ4i){Ø!ba!‹c*(3wqÚ ÜmxÜQmhâ#E Ù‡þÎN<¤âÝßf½7Óžn¶#_p:+'C^›U[G^s·º®É`ìúÚ¯ÙãâY2€³—w½VW¯Õ•©ÔgЏ \6»ŸŸwßîÞîÏtëêÁ¢®vôÁÊê?ïe*,U»y¤Ýºµ`Á¨Ú"‘ˆÍfx<þZ©gÏžl6ÛÓÓ_‰Œãê¶éòM—oÄûzÏê3¹K„;-bÄ™Ï6>* èêÔŸ.tæ 6Œr·ºVÎaÝãp`ZI<ßÅãN¥0¨I¥R ¹œX©$¼ªäÐËúûû>0 z0ПÍb9‹9?{( }y¢Îb±dNîq³ ÿ.EÂÞ?è!²”þ£KÈà~1N|£Qëõ†™9g*kΖT”5§gwé‚—7üJù»Zà ?Mär|ï¯E¿ï³Ü¼âïü@$ßlJìÓ`ؼ2Lè4*4HÂç‰D"Špç±Ù’†ZÓ¥3¯X?üà- ¹zz{‚š²MÁîý'$¬>-·®xÜ ­æ&@ˆ5pˆ5(ƒàÐ3~¸¹¹Q¢¥}}}a(§J¥ÊÉÉñ®¯ž®‘ TígŠJ7e…÷J¡Ól&ŠÄðx<‰Dµǃ »¨Õj´Æ ÀÞYèY±—÷ÁìüƒÙùšøÅÅ5û÷ïç²ÙÞ±“ØS,v üW&?ñä ³Ùì.ùHÄ!žî.Ž—XÈeJ_#är‚4 ãO;XRv÷>¦ØÞÈ>>>ð¥?%¤®®6±O÷‰ÑáOû3Öi?³Y©Ó‹\]åÚÌ‚ÂFƒ1$$¤oß¾7/_•L$ :[xˆ„æë—Ì×/Ÿ0RñÌ»òš‚e¥ÞPæ,TëõZ@¹_Cõ˜Ž£™0­ mq¹B.—ÏáD…†ˆD¢¸§â| ²øêúc"•:½R§/R¨äšF4iŲS<î8&µª/П˜1e`€/›ÅUm4J>¯^Á÷öí:ôé·'Éu†?oÝÉÊÍ{®Gzá-[¶,˜^"‘ðxõ_ Cø¯cRm‡ô¬YÿIéÕ«WLóÚ1\.)uð Ç w-Íår׬Y={ölÜã…»ÅbQ*•,K&û;æ‰i£Ù\¦R—©þëNŽwþÎ9ZK(,,¬¤¤„e6G»»Åùzˆ ìëIqÈ,J…éÂ)páÔÝwfü™Wt±´Ü©Qejjˆ…B'‹yDhàDW±aÇçÁÅ_ŽfÍŒ*½>WÕ÷ÌX–‡÷’U«oæä†vérîÚµO–­,Y²„+Ö44L˜<ù‡ÿìžùÊ+¿üò‹D"Aq)óæÍ{ê•ÙÛŽŸÛ¹óÀçÿúר¾}VÍŸ;0Ðoh¸óë"à ô£¼÷ ¡›úüXʦٴ-à òî¼{?OóßãM¦¬Úú¬šúüE=—|¼rë(1î~ÎN]<Üúûù$„9³ñE H˜[U¯ÕeT׿Õ+zöëŸ|ôÚîïîž›uØ!QÑÑ€Í>yöÜõ[·ô&s™Jíß5¦ ®þð™suMZÀìÙ³_ºüœ~ßÍÍ ˆÄø†sîÜ9ðà,XJîWWW´%55•Çã544\ Ë~ˆ›áîîš3¯Ãd Ð"‘€âââŽ;š5:¥‘0La0›ädY8o8:.2,!,htXÃDm—Ív‘»HGb-•9U+“>7L©Ó«tzwåÙ—Æ;óùRß["ö’ˆÁ žÓå³~›ƒO“ÅR¥ÖèL&ÀM$dFJx¼.&-¨,0¬û”å,}U¯ê=u<Íîæ)Ö/ÿð%£<‡Q@Ìd-Ë-à oÝÍLîÓÇãáãv@—–<î 9¹*00®âIiLnnîÞ{Ù{ïe³ˆõòH z:Ø¿¯Ÿ=† 'Érß)¤Å£ µMÚ«e•7*å7+«'¼õλ%¡×,|çÖ™SÑN"sa¾%ë®EÑ@?Ü¢R†°Aš.ldH%T®R{ón¹WÛÕ-å~Þ AO"‹ÅR©´¶¶Öl6³X¬ÔÔT­Vˆ^e€æðôìÇÇÇóÍ7555K–,o൓H$R©4¿^ñÏ“–ž¾”÷ç‘s[¿.°{%8@©R}¼ Ø-¾?7²ë”U3C† 9—–®Œî¾ûÊMøÒÆS"šÝ·÷Ê c-5ÿ*ãÌôª¤½ Â@ Ø!Ü{÷î Õð¬ž1«G BÛ fsÒ©K_]¹ÂyE"‘ó¸[î(µ9hCP—«ÕjB …;ŒÆvqqÁE?eùw„H$ŠŠŠ:räü“Û ³;ߪª®Š;ËsÚñÙ’Õ/Nìæ¬OÄ´Ü–ûNüdY©RýùçŸ3æ?”£v\.Ú—t¡¹k×®W_}`ùvœœœP¶ ‡#öõûîVÆw·2øÎà ¿Ã_É+/©ÍÌps¤P° ŸÃñâp@K ¸^!ÿ|ß×Þ‡deeás'èé ñ>àÁ ¯|>Ÿ—‚ô.<„csv)ž­Ÿþ¶ Ù|øðáx^y:ø$ ¼èO±X „;@&“Á?Q#%É«¯¾êéééëë[XXˆŸŸÒjisnº|!síîåÞÍÓ=Þ×;ÆSì"šÇ—vëÉ 1„ø£Xùîõ xFy½ÉäÎöóc÷Œ–-%…æô›uN»Ø9Ã˻Ө[öûæÍæ±c=\Møâá˜6žÇã1n‡ÁèxMè+%88øí·ß¾{÷.]¸Ã¼¢ƒÁ`6ó»÷~5åX€‡{ÑéÙGYòsÂܘ[]¢T]-«Ò¸{n:p8O©ÖëõkŠóú;Ù?zÁSˆÅb‹ÅR­T^2qx –ì[ñYwy1Ì©µþâuû,Òˆp!kÊàkàkP Á±G¸ ôûjìpô›§5[&ýr0£Q°¼à"‘ÈšÇ] °šß,óx<¤¥p{ii)jŒZ­ÎÎÎÎÊʸºº¢ªÐ¢HtD"LváææFŸ¬‰–e>¹+e•_ËG¬ÿ²öÒ¹ [?È·#µÈ­ªêý™¹ûïç¾êM¦“%ª¸^c½ºyx8› ©¿þ²þãÅRg)Ÿï$àI…"///mìäääááA‘†p;ÕhMÆ&ƒÑ`2ûs¹Üû÷ïsÙl'>ÏU( øžbq€³=é^‹Ü•×þz/{ï½ìÂåµ÷U¨5^\.‡ÃÁ…;®§–Ç]¯×§§§/Z´(==7Q¦(ö6xÜ){‘Íáâ 6€g9þ<>tDëæ‚æTƒ ù‚:t×®]h!OÔHww÷o¾ùàããcC¸SÈ­kÈ­kH¹ÿ÷z b÷ÝW^n,*Õ§Wåý{‘2×07S#&rêw«äc_›ýíá?6ìÙ»yÇ·¯¾ø*@€L&C+.á/%zöìééé •+°X¬ PNPè÷òö¹yBTØS¾O…Ñ]ì* HÍÊ“ö{jì‚E{þ¹äHNÜŽ`BÂ}Ĉðý Àž@[.`Â/Lîgg纺:‹/wµJÍîÖóÊõ[³>üô­Y³ •åÕy9B.§É`TéõuMºR¥ ÎÌ0`@fMÝ‚ Ø£Gô˜À4öð\.W&“)•Ê®]»«ØÙmÆÊ5ÿ÷R®/ݰnþ‡…÷'"Dpˆ5pˆ5(ƒàÐ'§Ò…û™?}5a4¯9(¶Éh\_Vwª°$**J.—#GP(D"†ÃáPbÜщðPÜãŽò@®]» µw±X<`À€_|1""býúõ”~!áîääÎ àñj¼ý'þzȉÏ0$È¿›§{¤ÌÕËI,ær͘ÂÛ…ÅÖ¤y fd=¿z&êjE€‚f5‰~æqá;Bñ#9‚,Gñù|‹% ‘Öl6› ”–°È7îÂíÇÿ|åÊ+Vü–r=bĈm)GÍEá…^àñx{šCS–®dH|œ¹ª"Ræ ¾a®.Rgñƒ©-UzýýšúŒêÚK¥å—cs`ª Gé5œ¯Œ¤<îq¿qã¾ú<<66¶k×®ƒÏBøðÂie;…ûàÁƒO:…WŽß cÇŽ ¸¹¹Í˜1•DÝG—ÛÏ: À†p§Ðh0N_ø^½z•”” Ùö|ÇK"ò‰¤¾³€/‹šF•^¯Ôj›–oظ#õ»«W¯^XôéÕuuc¾.’¯¯/£p_²dÉ‹/¾Ho@Hhè¥ÒŠK¥€êª*wkÎŒéŹ9°ˆö§,ùàßìÿc[Âx Ò`Íw»··wll,z<)o3ª««ù|>šnKîðÏÆÆÆüü|˜Ý^k©TZWW¿ŽX,–^¯·4§ƒ4s8e&ËñæQ…²²2@\\ìrAÁßÅp;‡ÃñòòÊÉɉ‰‰ˆD"­Ñ´êüÕãZ³Žö]ÚŽáN š=î‡ÅbÁß6$»uëÚ½{÷×<ƒ¤»]-Ìúý¯®ÐdíP”d w6› Õ < êÜ ¥*.Ü=î°r‘HÔ»wï½{÷¶lÙÂ*H$°ÙPPÂ|pj½ápNÁáæŸs¨Y—,Yò„öîݳgÏÉ}ú×ÝÊ`ì)%ä´ÞãŽzdÍãψ„;üG&,mãëÛ£GT9‡ÃÁ÷Ú†ÏçS„µ««+|qa/””_()Ç÷JxG$ÜñðnÛâÑ›L¥J5|ÄP^ ¾zõêÇ\TTTɾ¾¾wïþ=Ä…;®¹qBBBÐgÁÀòò?WR~7§ïâþáÒe—.]B§ÀïC£Ñ»öì³ÏΟ?_­V³X,¸ ) yÜNNNhå)F{iiixx8lîð¤,K hµZ´è)ÌãÎØ#@ee%À.ú&¤xÜ×®]{ÿþý‘#G¢®±X,·æâ¡òXáÿÙûö¸¨ªõý50Ìp‡ï7ÐL-±ÔÊ4Ó4Ën*v¾§ŽÇú8Ù)Oeá)»~˼œ.žS™ZVú-ïæýЦ¤x¹ß™™ýûãÕ×åÚ—Ù3Ìà@ëùøñ³g³öÚk¿{Íìg=ûYïê0€‡h\\Xr õ¸š>}ú¦M›<‹ Fûßxî~pääç³Z1Ä]nr*<>Å“Sq£ü1-TVÜ5 Z·n̾]µjÕÇŒ'<Z¢¬¸/\¸°S§ND± ­#vw¸TÜh¢î.VÜ¡’ )s÷å¬2)))ÙÙÙ'Nœ3f î‡n IÜCCCÝS›£Ç]Nqáćêv'%%­X±bñâÅðÑÍÍ É½ð* $$äСCóæÍc*”›ò!†N§>|8&a$òĬ)áááÉÉÉb¥ñÉ'ŸÄÄÄBŒF£ øU¨t±pЏ¸8܃Š;Mܱ£2±%Ôz´D~ÄËB+îð¿¤U¦sçÎ÷Þ{oÿþý™Jè³ h\ $q×étvMT‚wBwOμëÆ9_eœ;z¥˜>–VÜC{Ü^®ÕjAƬ2’Š;LìcÎB“Z#2l yÀ!C`žåPØÛÛ[«Õ666šL&eÅ<üaaa111´Î*n3U=q œ6mÚ´iÓ N8»Xƒ$„˜L&q1-ÁÚhq‘šš*™žE¬¸wîÜ“˜‘ààJ™éBGBÅ c¸è¡ÂÇpà@¤8 žžž’ÄÕ}eÅ=>>ø"}ú¤¦¦)â.䈻ýÚy½ƒ÷¤¤$zPäppâÞª€Gƒ Š{¿šR,¶ætf~5+NÓÄ–’ÄÞI¬yÜÃÂÂ@õÕW3fÌ íòÐNoooñÜ5ò€~ýú-Y²$-- \ªXmîHÜ5 í’'×wNg¼úZ¬f•ÁKV¯¸3w¼. qâÉ©ÈÒhñôéÓ,X n3Ó*OOÏ)S¦ :T,Ûûùù%%%EDDà„f1t:$ê>{ö,¡<î´¶Ê$Z¡ 1lèõzP‚é@Ÿ…±Ê(Œ¦AAA 0­ð…^X±bEÿþý³³³³³³=<<ÄT•~-¬®®¦ÓÈÐ'e¦+¶Ê p,Š¡îÖ­[BBÂàÁƒÃ€_*w1õ ¿ ¡g9èžñÄOŒ=÷¨ñ~@äF# ÏÄ.,lÛ#<2cÆ BH^^^]]]ß¾}i‰Z¸+(îDtírVMÜ!žâîéé‰o ä÷Ñ£G£ëÉp:qÏÏÏŸ:uª¿¿¿¿¿ÿÔ©Séì¼ (..îÙ³'~c9lB~~þ­n‚ GƒŒâîææ¨Û»†7]›Ž)òÁÑßÄÇÒ3Zß"7¿Á§ïDJq§—g Å·öƒÁËË+88X¬¸Ã‰DQq×h4½zõJMM}ñÅGŽyüøñõë×CL,Ä=66öî»ïfü @°$w±ÙÚâ.—Ç]ò*è¿â¹`*3†­Òú=ò!¼4N7~üø×_]Üf†‘@³óóóŃ N7a„ &ȵœg‡¹àHÜ%wìðqذaÀV½½½¡3(+î*‡É»ÄšÝ\â£hk42??Ÿ¹õ*=îb« =÷øM¹óÎ;?¾jÕ*BH—.] °Lš¸c…tCñ^òZÈÍDV<ñ”®Jâ¿h9¿œÁSÌ›7ïw–ZŽ/ IDATÞÁý‹-¢‡ wÅ(wˆóÀÃÃcxûí·‹k 2IŠÄ izôèqüøñŸ~úI|ˆcá\â^WW—””Ÿ—————?vìXz>¾$AxüñÇ_{í5§¶­ƒ^šƒGƒŒU¦oêtºÿI¼1Ÿ,Oç}¡üÚZ¤¨Ãi4\ûw*[eÐ(Â(î(»»»GGGcž ±Ê¥Rq‡gsDDMúöí Ñ*Já‹/¾¸eËɜ薑´Êˆ³Ü›©­Ò+/¾ IÅ\ÂL^ñäTä( ×¢+CLMh wîÚÀ¡4â>qâD5Ä#ö¸3"4]ç¾ûîƒ+‚I“bânoæeº€ÔçÁ¤!¦ªtúQ8ÅÀ¦®Ò*c“âNô/¾ø¢¢¢â‘G!7_—¤U¨³ÜÛ¦f±³ÅVâ;*î’¯D˜Bî¼óNº˜}V¢Bqg\C¨¸{yyÁë…VwOOÏ„„ñ W‡Ã¹Ä}ÕªUÇ_´h‘Á`0 ‹-6lØêÕ«•zï½÷BCCé…88888œ Fq‡§Z·à zߘ—pCHëÖ­l |ÙÄ]2«ŒœU†~‘‘‘z½ˆ;=TRqg‹CÀŸzõê%wÕÐòÕ«WõÕWØ~†Bâ¹eðZŽ?Î,ð `wȆ‰í'¢g¿ýONEÖ ÄQÜ™áè‹8žt›q'̦—n…Êé«ˆŠŠºï¾ûÔw›wooo`„^^^K–,9~ü8.Þ‰ã¥W^yeÚ´i šw5Š;1u»'§"ÄŠ»\F«Š;¾ #îêw5¹Dqr*wf0 ~Ý`šgßäT¦¼F£ïì¬Y³***Ö¬YCDùïµZm×®]#""’’’Äc¹³yâÞfp.qß´iÓìÙ³é=³gÏþñÇùí·ß ¿•SÆÁÁÁÁÁ€ñ¸ÃÃ졾=t×i&$´Ü‰{xx8>PmRÜ1«Œ˜¸CºC ´qÅÝÝH** jw…„ð8ÿꫯ@G—$î`yGmžQÜÝÝÝîºë.qåŒÊëOÁGGyÜÁ*Ô Ã«’!îâü‰HÜu:N˜6Ó<[îmC§NúôéÛ4qŸ$î>>>k×®5™L@Cq½!0)A¢@9åþÁœ?~||<¹™¸?üðãGÆÉ©+V¬€«–›œêååã%Iþ(Ζ”z&q¨Ç¹Øýû÷#A‡ GYeè¬2r¤ÙªUfüøñëÖ­#„ÐÓLŒUtŠËäT•••„“ÉÃÏÏ—û…7Tt%â)æâëjÇ5bÅ]¡¹2„"îâAoÛÀ¹Ä½²²’^— ùü%±páÂiÓ¦ >Ü©­êðàD„  < 4ÄŠ»PU10è:1ÒhÜ'Þ`¸í¶Û`>ÃÃÃÃÃÃgÍšEË. 0Џ‡‡‡¿øâ‹t3hŽ_¿~S§NE?:k2™<<<î½÷ÞŠŠ pýJ²¥Ûo¿]µB·mÛ6gΜµk×)âŽf˜É©jª”$îðQüªÈÄ“S" büøñŸ|ò MN+îtUîîî4qGAÝç:`ÿ¨Q£~øárlA*k¹©¢ôiâz9ÐD½^«)Xeˆ»VÅRI;£¸5*33ö8orªÝVlƒU«Œä)èªÔwð&ƺº:BH@@Õ½{÷óçÏ«Œ8P’Š{BB‹/¾‡^kW îÓ*c~üñÇ3gμôÒKv«‘ÂâÅ‹éõÌ322èÔoôŸèíêêꌌ É?ñx ¼^C®&§Z,Tܳ7mÄÜ^5Áš]Šëpà믿¾wïÞ×^{ Ú i•Aí< @£Ñà~ºyP܇º`ÁÌ|ÅàyÙÔÔtîÜ9ƒÁàëëËXelƒÏ£> ;¸ƒOЯ_?8 ®÷äÉ“èq·z/ÄÄ9¨Z O"Ž;ÆÔÛŒÇ}ÿþý ã*B Zj 6¦6ì*ôº õõõiii3gÎ+îØ†¸‹¿›rÄ]²@vv¶øb1G-Ô°xñbI JœÁ™èܹsqq1½§¨¨(,,L²plllnn.½Geóœ}€žúÀ@â;ï¼Ó´â=ãKÏ¿–»™òÀ_ !ï½÷ž¸6H.N9wî܆ J2¨©©)((hjj’+l²²²pÏ“O>Iùßÿý_µ—*BAA´žYûÛß!ÞÞÞ111Ÿ}ö”7o¾ùæ°aÃ!GޱZígŸ}†OÛ¢¢"AàM!ääÉ“‚ |ùå—ôÙl6KÖó÷¿ÿ2oÞ<ܳsçNúÀØkÎp¶Ø£> sX !ß|ó͇~¸víZ,Fçà'„üôÓO Û2„iLÀ1b&[\¾|9üéÃ?¤+Y¸p!^yå•ÿüç?°ŸŸ/BBB”Áš“’’ @}}½ 8€ùç?ÿi5È’øüóÏ¡†ªª*;§óp2dÚ´iYYY¸¹ æÌ™#Â[o½Eqss³X, •ã¨)%%…ù¤ÃŸ6mš À KJJ$+),,„Jôz=½‡C»wï†=O?ý4!:- ¡¡þ·¾k×®âú¯^½Šå=j-`׺è’%KRRR!Ÿ~ú)¬U,¾F0ï¾}û2ûsssᤠ,…ã·eË–1Â7„´´4ñ±4'„|ñÅLßÿÜŒ¼¼}šYØ‘³Ið»/\År¨AFFOr‡àÑ Á£Á€„ãqõõ.ç^û›FãÖ?Ž)SK OF£ÓéŒF£V«EqKî÷Ÿ†ŸŸŸò4'ÆMAùì³ÏhŠl"""V­ZåïïB8T¿oß>,c‡Ç]}úôéÓ'11ñèÑ£pvÚ$C/#%YQwPh³;N ¯ÄÐjµÍÍÍ⻃{$[ÅxíhÐÁt”UFrÎILLŒF£®¬ÚÎ=ë}÷Ý·fÍš¸¯Y³fÒ¤I’…ÅìBãÄöuPDFFÞê&¸x4hðh0à¡ÁxÜGu"×¥AM—®è“¡áïï/GÜ !z½Þh4º»»ãóO q·ŠmÛ¶577ËÔnÌ™3·á‘Ìp¹<î Pð¸ƒe…~ö+dTŒ‹‹›6m½:©¤Ç͆5——W}}½\ê œ¢Š“S™SDFF€+ÞHjV†ÄDEEyyyÁC=î^^^°wɦëžZš‹ìcW½zõJNNž0aÂÂ… q'CÜ###‘¢Ðw5C˜§!Ç¡ñ}ô‘B `@jhh»è&B^xá…^x!''^¤À}ÁJˆLO¶ur*Ðb“É >00ª•#îbÿ½¤ÇëEÈyÜýüüÅ*0ëîî¾>ÉTf•ñññ +**ê˜Ä}îܹqqqo¾ùæ3Ï ³Èœš;Ì{Ï?8x4hðh0à¡Á(î‰7ø‡[Ÿ’‡,^¼¸ªªJŽŽ{zzÖÔÔ ÇÝßßTj  ÔúJ” f2–`:H&»ä<î ¤ÒÏ~ Ò¤IŒæÕ§OŸìììQ£FJq_žˆ»Ü E›)îp"eÅ]ec 0Lý´*·kV"Ó;uêÎ{qèÆŽ«×ëããã•Ï« ¸k4Hšëà*Q®NÜ98888¡&§Zr.ÞH®ñó¿¥írµ­¨¨A¯×«y¨‹YB[zÜU³ÊÐ-TÊ¥dœj† þþþFœUÆ“ShždúE5¾vrŠ;°Ï¸8vÍIؤ¸+Xe<îDõØ nw5}Àªâ.7e6,,,??_üeyì±Ç{ì1•í$Šqƒ±Ê­²°[÷¸w@pÛ.  < x@h â.d_Àn±½o]‹n1˜îáíí­Õjax£R—#îŽò¸#¹iMf:;<î˜3÷@ãU†eíÚµ‹WÁ$"Å×¢r)Å® 2dHBBÞP•SÜ{ì±+VŒ=ZM%â5¼¬ž‘Ø89•¨VÜ/^¼HõVÕ+î¶Ze!·ß~»G(Xe˜2.KÜ]´Y­·íÒàÑ Á£Á€„wË¥‹¸SãÈé}í âîÉÎUºÅÄ}áÂ…“&MÂI“®£¸ÛáqÇC°;Ü>ôáŒq¨©©É•wä´r“Sm‚MVFùÝd•IHH „ÀôõŠ»¤UfÆ «Ï®]»VM{äÐwmÖßÿ}YYÙ”)SBBBnu[888þ@âîçî&\-¾¶ËÍÍ-:öV¶ÉÅ€ÉÎUw,†t!::š^ÖÑ©YeT‰{rr2±ÅãN+îÁÁÁÉÉÉ=zôhMèh,Y²¤¹¹Ù¥–H“´ÊØ9«ŒMèÖ­[BBBŸ>jçŽ{xx˜ÍfñLÊ“Smò¸Z©¸Ûê;² ØN…¯WÜ9lÃk¯½vêÔ©pâÎÁÁÑ–HO;¹¾††&<‚xºWá–ƒNv®¦<’à!C†HpÔäÔÖ(î@"½½½·oß®ò\ ÷ôêÕKýábˆ‰ûÂ… í®ÍI`¬2­œUÆ& 4èøñã¶žÔ©“S !¯¿þúìÙ³­–ÿÓŸþtÿý÷ ½²›óÀwÇ£¥¥…y‚íCuuµK©·<4x4ð€Ðއ‡!׈»[´jÇ€¸{ Æl«Ç}̘1r ƒÑhlhh¸µŠ»U79 ±âÞJ0“S]ŒâÞš_‡(î¶B|£ßxã ¹”ÄöÉ©III/¼ð‚®ÿÈ#¨©ÖáPCÜáÂ]¶7òÉ©.½ZCÜóóóלv < x@hq¡gšîhâ.îv+îIII’zöìYQQñöÛo“[íq·ÊÏèhˆ=î­„ÜJ¢.†¸·æ×Ã!w[!VÜ•a“ân2™vîÜyþüy•åoÔLNåŠ;‡mŽ©©Éî`  < 4,‹¿^¦¹&·Æ-*æ–¶èCÜ=l%îZ­öÔ©Sùùùƒ R(†+ÝØÚB‡d•yî¹ç&Ož)ƒvAÜ»víºbÅ ‡˜ën‰U:˜ú ›6MNm/àŠ;‡ãÑzŃƒƒÃ˜ÍæÝÂñ£†ç“Á¦åEÕãÁ5j”É4âq·ÿûßÿþ÷¿;°ÂvAÜ`eÍÖ£)î.•J¿õè“S¹ÇÝåÐzů)CƒGƒ‹ed×.øÑ-úí“!RÝÃV«ŒJøúúÆÄÄØ!`·%qwê—¥]w­ ȰaÃ’““Û8wœÊÉ ›¬2íå·”/ÀÄáx´ž¸ó5ehðhÐàÑ`ÀBChiIìŠ5‘tâ.¹l8–¸Û ”l[c•Q §~Yn‰ÝJ´& Ë–-s`KTÂVņ…*‰~{ù-ű®Õ<î.Û¹âîràVŽ[‚K³·Ç55Gã 1ع¨x†«w‡LNu´GâÞîàÔÉ©íÀ*ã¢Íú#£õé Û ………F£1""ÂEžaŽÅÎ;³³³“’’ì^ ‘£}!Ü܌ۚÈî·°%. œ˜è"?zØŒ6PÜ  ìí}øáâ€Ä/j–5L:5:::>>Þ™jk¨Ÿœê²#–öýUïh½âž‘‘á¸æ(á¾ûî‹=}útÛœÎ>´Y4ÚlŠÆ§Ÿ~š’’rèÐ!çµç–ƒwnsâN¤º³Ñ-‡C²Ê¨„S¿,íÑãÞî~=¾úê«Ó§OÇÅÅ©,Ÿ0oÞ¼ÄÄD5…ÛK4ÔL ;v¬ ;wîl«FÙ†öô%ùƒ õ÷ÈÈHÇ5G ÍÍÍäú+—E›E£]À¦h@'„»ÜQÁ»®Âï²[·è[×W¸{Œ?þäÉ“ëׯ r Q[NNuê—eôèÑëÖ­k_ßÇöÕZg£½D'žj4š[Ý;Á‰»Ë¡õŠ{›-áÞ.ˆ»+,hߨØXTTäééÙ¥Kë¥ ›¢Ä:dG…+tP[@,×>hµš.]ois\’ÝcðàÁƒnûÆHßæ·âîÔ/Kddd{a~þëA£½DƺíëÝn•q-˜ÍfAH;ñ¸qïØÄÎ!8tèPllìÌ™3ouCløs „˹¸­ ïJ´|š`;@DDlpw8‡x{{''''''ßê†Øv<æè@’Ô.ˆ»Éd"„X,«%ÿà€ÛÚîʼnû 4qwã÷v‚˜˜k);9qçàPŸíÛ·ßêV´ \qw-8„¸·Ù:íBqw…U!ÀMä Äݦhü<î®Ð=\ZqïuëâBpýîi¶ÛûLí< 4x4Ú œ¸»766Ú]I›­ƒ­uq»+¬ !r…@Ù x£ââ³Vº‡2ª««ÓÓÓ³²²œ{‹E(ÌÇOš®ÑÎ=];ëwFMÚÿLí< 4x4Ú œ¸»Ûµ « PºŽMì×!î6[e\¿þúkbbâ‚ èF£qÇŽûöísÔY„¢bº– ²Á]Ë—^jG·L{ÏãÎÁÁ¡ÜãîZ@[B» îÜã®ÜãÎa7$ßk•––Ž7.,,¬¨¨È!g±äfãv±ÎKí-. îÜãÎÁñ£»¢¸«±š•””¤§§Ø}ÒNwW0Þ¹ŽânS4``Æ=î·Ðm˜oìtà­ò.áv‰^íŠè®ß=!Æ >|xÿþý}¢v¶ 6ƒÓ‰{~~þÔ©Sýýýýýý§Nzùòe¹’{÷î}øá‡CBB†þÃ?8»m.|<·&»«Ù—_~™˜˜øöÛoÛ}AÚqwãë(î6EéŠû™3gÒÓÓ[ÓÏWèÊõ9|z‰ŸƒÛ¥ž>Žª¶½Ãõ»!äÑG=tèÐ_ÿúWgŸ¨]D£-ÁBƒG£Íà\â^WW—””Ÿ—————?vìØ††É£G.--ýá‡ŠŠŠ>úè£Å‹¯^½Ú©ÍsA´Y:ÈÖ‹©x¬+É.×É*cœJÜxàÄÄÄììk#GŽ,]ºt×®]Î8W»†$G—”áí†PY.ÔÖÀv©¹Š+î® ç÷U«V >|Ñ¢EƒÁ`0,Z´hذartü…^عsçÈ‘#½½½‡ºfÍš´´4§6ÏáÅ] €v›®OG³»Ò†ÄýÞ{ïÕh46lh›Ó9®c•± NM ]¨Û·oOMMýñÇq.D}}ý¸qãî¿ÿ~§žÅ±ì<&îù7|2ǯ”h¸[šƒƒƒÃUá\â¾iÓ¦Ù³gÓ{fÏž-÷l~ûí·5 ~ìÑ£‡‚¯¦£Â!Š{uu5!ä믿Vˆv{$îÐÚšš›Ž‚hÜZ¸ŽUF}4ZZZ ÁNRÜâ/âœí§‡d,;vìÀ=®Ð=”ÑŠ;•ÁýÈ•bžŸáúÝ£-Á£Á€„F›Á¹?ÐgΜ‰‹‹£÷ 4èìÙ³jŽýå—_ àœv¹.¢¸çççBþ÷ÿ÷?ÿùÏO?ý$Y¦=Ze€äÙJÜ!·®CÜÕG)µ“î/CÜaágÏ—/æ ÝC ÄÝQ·†^zéha1ÏO‚pýîÑ–àÑ`ÀBƒG£Íà\â^YYtS>ààààŠŠ «VTT,Z´èý÷ßwZÓZ‹9sæÄÆÆÒÒCà¬2,((8|ø0‘§æTÜÛlr*´VyXÿÊ+¯¤¦¦ÒÞ:½eÖà:VõÑÀØ6V™¶QÜ‘¸ ‚{\¡{(CÁ*#‚:Us³PTˆŸ¸âNÃõ»G[‚Gƒ 6ƒ+þ@—””L™2eùòåwÜq‡ÊC4RX¼x1Ÿ(##ƒæêX48 IDAT|ôŸèíêêꌌ É?Ñ5äää úkG ’m\9ÕŽ«Ø·oP`*â¸ÛäX.\°¯«WÁÔC>ˆ¹\ iiiK—.Å?9¼ öÕ¦/àX·ª ¶ÖÀw‡·Wp–ŒŒ ¸­âîêØ8TVVÂ|ÑÚŽ€nC¿hª®®>þ<^H+Û æ‘ëìÿj‹¥´¾‘÷ºNx ¼^¯ÁkX¼x±$%΃àLtîܹ¸¸˜ÞSTT¦pHAAA\\ÜŽ;ÔŸÅÙW!‰±cÇB¾ýö[ÇV{ðàA¼5  Ú‡o¿ý*y衇$ Ì™3‡r÷ÝwÛ} \ƒý£>²»›‰ŠçÌ™#WÕÇœœœ¶i’J¼û®]»:¼æ“'O¦¥¥ýòË/¯977‚9sæL‡W.‚ý š:u*!dúôéÎ8™ N=‘±lÙ2BHÿþýéøCQWW×Êú[~Ýf|éYø·ë¹¹„o¾ù¦•urpppüÁá}º_¿~rå¯\¹2a„wß}h±+Cl–uè í¶¹ï߿ߪÏñ¸ ‚°téÒ¥K— ×-VÑöV«wŒ˜ÜûŠ[‡gÝF:t(55uíÚµ*Ë«v¡¶™œ ·ÌÙV¼Üp…îضmÛ#<òùçŸ3û¬2âýv€ž™šÕh"„p« Âuº‡+€Gƒ 6ƒs ï»ï¾5kÖÐ{Ö¬Y3iÒ$ÉÂW¯^?~|ZZZRR’S[å8‰ŠÑ$I½ÍýñÇ×h4Ë—/‡£FB +Ǻ{KKKjjjjjªz×û­Ê*£àqg ÓWXÂyyÜúkê£ÑÆÄ½-=(W耓'O~óÍ7{÷îeö+LN%­¿;‚ äçâ§sõF‰;×é® < 4x4Ú Îýž;wîÁƒß|óÍÊÊÊÊÊÊ%K–>|LÚ4~üø—^ziâĉNmR+‘““³yóæÌÌL'-JWøÕW_©< œ»4綪¸3Ä‹©—ù]0$6^n‘¯[ç)î¶wõpêäTắ‰!îÎ~{#VÜ]窪*f¿²âÞÊ ÊK…úÚkôžyFBÏ*ÃÁÁÁá²p.q÷óóÛµk×±cÇ¢¢¢¢¢¢Ž?¾sçNð¶ŠqòäÉ™3g2î~ñcìÖâûï¿¿ÿþûßyçx^;vÙv¨Ö`0B,X R£…(Ñìͪ\ $Ø!Ľ¸¸øŽ;îHHHPo³±V‰;ã»p¸Žâ®NUÜÅë8Õ*³eË–•+WfeeaýΖöíĤ¬¬ŒéáÎ%îy9¸íÝb±®¸sppp¸0œþ½qãÆšššššš7FEEÑ¥©ž¤?00ÐÙ-´ ååå„––x^¾ôÒK‰‰‰éééêkxùå—ÇwàÀÉ¿Âó–µX,* (£¸gdd ÿVVÜáÿÑ£GGGGÃ~õk®©©Ù¿ÿ‰'òòòTk m VIÅž~«Àp¯Ý»w¯_¿¾´´´õ5ÛJÜÕGƒ¶QÙÑ0eˆ‰»S­2+W®LII9|ø°Ø*ã Ý€uþûßÿâ~e«L+_ãX¨5S5‘Ý-œ¸ß ×é® < 4x4Ú äúé§ŸŽÝºu«³OĽ¹¹™f—.]’?‚EzzúŽ;ä……‡´V«õöö&ª- qŒŒ´*—ÒV™ŠŠ |³a‡âއ8û{«^q§ãi÷,X˜˜¸gÏ»k0 0½ð ӧO?}út+«%RÄý³Ï>[¿~½V §ZeÄë8Vq¯©©Ù±cÇ‘#Gà#ô³Ù,¶Ê´¦{8ôW•Þ–TÜåùr³q[ˉ;×é® < 4x4Ú ä:???''§¤¤ÄÙ'‚T⨸0qžÀXNJG↢úúz5u2V™€€•YeàûRÙˆ‰»C˜¨A€3ÖÕÕÉyN$‰{@@€Ý'=þ|zzºš%ÔÁXeà¥C”l†¸755=ýôÓÓ§O—ó˜©Fëq?sæÌ¸qãp: w±âÞšîáXÈw'NN­¯ʯ¿öqssëÕr;Âuº‡+€Gƒ 6C!îðø¯««sRýùùùAAA}úôAÅ~^Ú¤¸ÃrRºŠ»Éd~OONU™U†þ Þt5ã¹~ÿýw•ÇÚ¼:‹Å"w£îqwÔd†{«vqDZkëç]´k;\>c’TÜ]ôµÃöåË—Ç·nÝ:⫌%7›\7+jºt#:=WÜ9888\äXóˆ{uuueeeii)ãqؤ¸Ã¯¾újXXXff&ý§ßÿÒÞÛ¤¸£¶*99UMVûˆ»Xq¿xñ¢ÊcíÝ09›»Ã³Ê+j=É£wAœ§¸ÃFë‡.mIÜÍf3lÐ]±¼¼ÜnÏwˆ†¤â®/^ Š·¯IV!VÙ«««wìØSGœ¡¸Ó>·èXr½‹râÎÁÁÁá²è ?ÐŽRÜ<;cÆ fmm-!Äd2k¢õŠ{yyyII ãgøç?ÿ™––FqwwW¯¸ã*î¨IÓ 0Ñíôñññôô¤×–w¬UF¥±Ç>Ðïälî’V™Ö¬ á¨4Ž´M¹¾¾ÞÙ!åw9â®>âŒC¶bþüùãÆÃÅJi0Ä[‹çÚ½{w\\œÂ|eH*î‹Ï‹'R¦¦&½Û×$« ã,~Õã ân¹tc¤­áÄ] |M< x@hðh´:È´£÷êêꜜ1G⎊;ý”-((Pÿø¤À /Aúe“âŽÄ§`¢Ûi2™ŒF#MÙÅŠ{kˆ»S³§ÓÄ].,’+§¶fUÇZe€áhí–(î’ÑØ²eËÖ­[™¨¶^qß³gÏŽ;°Š›M®ß2ì9°ÿ­·ÞJNN.,,´;Í%T‹APð¸«é‚ ètºAƒçdÞdš„Ûb*pqolН\ÛÖhÜ¢b'î"ð5ehðh0à¡Á£Ñfè ?ÐŽRÜ¡ñê¡HÜ0Š{ss3 ñÅ_,]º´¨¨ˆÙOÈEwõŠ;Aɘðt(7Òœ 5w1qWcÏX³fMJJŠxyH«¼:’Š{kàX«Œ ‹E=qÏÌÌÔh4={öT(Óz«Œ 3gÎ?~<3E¡õÄ:†äáŒâŽ÷ :ÕÚµkAÂ_Fcee¥M÷Ô±V™êêj<°mˆ»ø‹ép»åRÖ ƒ{Xâ탵ñÉ©.‹BÜ¥¸#Q`ö3Ò8ãq'R\ÿí·ßNMMÍÉÉaöÓž;wnúôéÏ=÷|DžŠ»MVe;“–ö›—´Ê|ôÑG÷ßÿÆåÎkŸâ¾}ûö•+WÚ1UòêØ¡ýïܹsåÊ•rî|GyZèáô­rG1{“«¹5ÄýòåË0–`úp[wÆ*ƒ_7øë¿ÿýï   ?ÿù϶ž™z+'§–••á¶óˆ{„œ&·îׇ\qçàààpqthgwFgwBÈ¥K—V®\¹iÓ&Ü\Aì<¡À¹¹¹ëׯǣĊ»MV“É”˜˜ôÝw߉³Ê0Ä?šL&I«ÌîÝ»7oÞ,·P‘QÜ­.žª@æÄÈÎÎNMM]±b‘WÜKJJÒÓÓ èý4mU6Þ½óÎ;)))r+8Vq‡ õŠ»x‚¶wq40‰'Óí[ïq‡6Ø¡¸3Ä&÷+V¬HMMÍÎÎUy°O655Fœc VÜÕø2Á 0™LNZ!XÙ*ãð<î–¬ó¸ýÀ__X³f áÄ]nÛ¥Á£Á€„F›¡ƒü@;Ö*c•¸3wBȉ'RRRÞzë-ÜCæ@#¤?Ð1‘w1·¶;$œ´ªªJ̺$­2ÐBz=#l0¬íªCCL܉ ‡†MŠ;œââÅ‹)))«W¯Æýtœáº Z;<îp äÆ'vLNMOO_¿~=³ˆ,Ö`6›Ñ*ÓÜÜœ’’òØcÉ­'E+î¿þúëÊ•+;&ÙBrýÚñ~©·Ê mɱÄÝb±`ªGñ_å÷–––ÆÆFÆßE“{úv+€VܱrZqWÿ!//ïĉôõn™—_~9%%E<ÑEФáÇ—”$q7›ÍåååøÒI%ŠößX ø\mCÑĉ;G»€öV7À1hcÅ]Ì€¸ÓûáA(æOôÓ—s¢ÏNlTÜñª«««1o‰J»øH’€Ú¤¸CmAAA ­U°OÈ¢¤¤dåÊ•L#é2’“Õ@Yq·Ã*ƒvjq=äfޱ±qåÊ•„—^ziß¾}‘‘‘ãǧ¢w9çÍ€½½½±3¨Þb†¸3ÆV(/&§¸›L&zþƒXq·ƒ¸# }ùå—Å °Š™3g:tˆÞ£LÜ«««ËËË‚ƒƒ¿üòË‚‚‚¹s熇‡[=4ÉËË‹ˆ¾¤9Å}ùòåÿøÇ?ž|òÉÏ>ûLåEY.œÅíƒ%eäæ~Ë'§rppp¸,:ˆ²Ïqj[¡’¸‹Y é2^½zUn*ž$!kU¦¼¼<''‡þòÓ·’…Xq§¹SÌú’@¡ýàÁƒz½ž^ȶ²²2''ªµIr¦‰û?ü°~ýúêêjIÅ ÄN<Æ£w«Î«¹sç®_¿Þ*qG‰©ÉdÊËË›>}ú¼yóˆh¤×ØØ¸f͘o 6)îrßYñäTš¸×ÖÖæääH®[L¿{‘üaº@¾G._!œ¸ËÀj÷øCGƒ 6C‡ú®««KNNVé(•<’A`™VwÆ*ƒ”³Ê ȱØã®†¸cÜðòò¢¹#±33k%­2ø 4™LrÃhI²eµÁ™ 6LŸ>É òü#66vùòå„“'O?~\Ž}ZUÜé(ׯ!c4ñbÓÒÒbcc¡/ÙAÜaÊZqÇA ÆJ/66vþüù6«’¸‹Ý#ŒÛAAq—d ðŒGúb“UF’¸Cûõz=±¦¸KZeè—ûŽ%î4‹b(Í_™|Þ •U†NóG)))Ùµk×ã?.ZH+&§¢G’¸[µÊÐIÇ¡°‚ÇÈ÷ǯ_¿^î=&m•AkÚ…Pé&Õw•wúv‹¡ìqÇŽýã?¦¤¤üôÓOx UÅ]¥¡N8ÜÃÃi• SUTT`ÄV™ôôtØ€KعsgHHd"²ur* ±[ºÝ¡´D(»ön¶XšºF¡•®²²ÎË'§rppp¸,: q‡g<«ð‰™••¥|,>’‚buÚ+PÌæææsçÎýðè¨)g•A477ÓlÀ¦tb^’ µA%´ œ¨³ÊÐͶ‰¸«ô¸äˆ;¾‚PCÜ%=îP l+¬ Á(î¿þú«ÅbÙºuë²eËhÅÝn»¤UC¤Ò*רÒ*Ã4cÛ¶m)))³fÍš>}ú®]»!ëׯ×h4!!!P¬©©‰Î;„m¨««£ïŽÄÝŠ;T¥ ¸ïÙ³gåÊ•tî«÷wß}÷ùçŸ'„ìß¿?+++==ª!-‹——×ĉ™V­Y³&%%eÏž=Ì!¨¸ãÿzàl ˆCIIIYYTëXâ]‹þ±dœÄí#%eµ&‰ÈsÅÁ×”¡Á£Á€„F›¡þ@£U†PÌÜÜÜË—/[åßrŠ»ƒHKK›2e ¬DÉÎÎÞ±c]R’ÇLž<ù•W^Á­TÜÁÛ Óét:‘RÜiú%©¸Óü.­´´455uñâŸßÅ]1çfNd4q¿ÝŠ;šÂ‰ÔªW¯^ýÇ?þA®‹£'NìÓ§!d÷îÝP૯¾¢iœ}V~ÈYeâÞz« O(ìØ±•+W‚ÇöìÙ“PZúa2™ðŒrÄÝl6«Œ†J{ss³xJ BNq§“ŠšL&¸ºÁ¨ÊÊJœiMãܹsGŽ!„Œ5êÙgŸMLL„\:  f±âþóÏ?¯\¹µstªššÉ c«è8Ð+³‚Ub“U†\'î ˆ…“ŠwËï7ˆûæœË’Ò'  < 4x4Ú çºwïÞ 7wø¿¥¥¥–š€¥|ÞÓÔÐb±XU¾‘b‚Þ†ŠÚæÍ›Ç§<«Œ²gÏžƒâG›wñEÁº÷žžžÀ6Äw«Š;ìôõõÅú¯\¹²téÒ?üKª$îMMM™™™@žh!›‹Î~öÙgÈ_ˆ;К¢IzÜ%Ã8tèP||üÖ­[ÉõðŽ?¾oß¾„Ó§¯yëëëí¶Ê qGjÅ(îvw•Š; q@àÎâ¹à@†¸Ë)îø‡¨ÝU*î0–÷%pkÐÄF/àë w£ÑÈ$c¥Ï¾dÉ:}»dà@ÈÃzˆ$qsbBHuu5ÄG„+W®ÀN±U†Y=—&î ŠûÞ½{Ñ %IÜaÌpþüùœœˆ£¸ …—…’ks÷›-–ÍY¹’k_pâÎÁÁÁá²è8?ÐDJq¯¬¬¾huÝI޾¾^.%"Iw汊`Aä–ɤ“·¸»»ƒâ®fŠ¡˜+ÃôJ½^¯Õj‰YehÅ=88 àš¬HwT¦ƒ<{öl¿~ýFMDñ‡f9rdåÊ•kÖ¬QCÜýüüˆ Å]2,„òòò»îº«°°¦ûžžž0oMCCCë'§Òëj)ONóNúÒ¥¸+{Üp-b¢ÛØÍ¾ýöÛqãÆ½úê«X³ÊBêêêèN2dÈ4¢¨$î*=îäæ –ñZ²dI=°UØøÆÆÆœœà»~žÈ(î ÓÓé‘Q$î¾¾¾ðòŠ.'¥‡Ö»wï¤wÉ•SÏŸ?/¦›:u"òćÿþûï;vìØ¶m}:9ÅP÷±Š;¹ùŽ#À…ßØØ˜——‡Ua²²²bccÿßÿû„"î’Š»Â$ThCFF†£÷ÜÜ\:©<¦f²‰¸+Xeˆµål±ÀüùóçÎ »ÖH£Ñrê8þ÷Éß›››¹â® ú׃ƒGƒ 6ƒÖz‘v½^¯ÑhÈÍRüd|œïÛ·/55õ‘G™0a] ãHIIIOOÿË_þ¢¾’Ä]Y¥ÐLQ=q7›ÍF£ÑÝÝÝÏω !žžžrŠ»Õt@û@õüúë¯OŸ>=nÜ8(PVVJD”Èßß¿¢¢Bޏ‹„µk×BFŽI)--E+³Š;í©Ðjµ˜†…¢ÑhÒÓÓ###CBB˜Õ@¡<*ÁPVVVSSCsheâ^ZZúÔSOBfΜéííYeð(“É„Û Ye,‹Éd–ê–544õ‡c—,YRYY¹aÃz6*¢S§N………bâ‹Cè-tw¥‰{mm-CбšL¦ÆÆÆ¦¦¦mÛ¶åææN™2¥W¯^âfؤ¸Ó}I£ÑÜqÇ!!!gÏž…’ØHlÃÅ‹±|ss³qôêÕëÂ… ’mˆŒŒtqg¦·ÊYeš››q´l“âN_£œâŽ6mÚäëë‹Wa9uœàÀLã¶%;OÐhÖ¬Y#®‡wDddä­n‚ Gƒ 6CÇù–TÜa¾>’™,bµ‰YÄôÌ™3éééôê†V!éJW£¸ÓÑjµ@°¬w ^^^4áÈ)îÍÍÍ6Ye233éd‚H2b>%›ˆ;àèÑ£„\6Ë>Åäj¨?00P÷úõ×_OLLüâ‹/u#$­2pZ­–Q¾•­2H×ŠŠŠÌf3„EAq—ó¸ÑíÆc8vÙ²eË–-“díÄšâŽuqg¦((î4qóÍ7ƒ‚‚f̘‘ššºoß>Éfà©•'§‘âîãã³gÏž±cÇâ´»`è<ž‚ Àœn0ÉÄÄD¹6¨!îj¬2Ò)S¦€1LNq¿Ìq qgæCçlhh,óáw*]жX,f³ù믿×É;~Ö8< x@hðh´:Î4ÃSé”b« lˆI639Ÿr I=ð¬@i Ä]£Ñ477ïÚµkÙ²e¿ýö›äQ@þ¼½½ibPéq·j• ­yþùç5ͳÏ>Ë$A÷÷÷'Rw %@¬%-ûÌ"‘ÊÄÎ"&î0Ç‘~Q€´ÿ00 G/„²Ê q÷òò‚iÁ4”wäa«V­úþûïa[Ç[H_;]³˜¸‹“uŠAwº$=[‘ܼÂNù{ÜÑ‚E[ehvá\¹reÁ‚;vì¸pá‚zÅ!î0»Cò̓Ü"¾ØÇ˜‹E@—kȼ°Ø¡¸3&..ŽPÉâ.ž÷,¶ÊH.ÀD¨P¨!î‚ À˜3gN—.]`¿$q§CÊXeÄÄ!GÜዬ@Üé!¨¸ vXepº0(++ûÓŸþtüøqBˆÁ`€WƘZJœy·åwf4KŸši<¦¦&æ= ”×¢Ù{#)­Û€!å‡N²Sà“S9888\‡¸ëõzúi×JÅžbÅ]CÈèè®3ú÷NŠîà¯Ü¤j£©ª©©ÖØÜiã›==‰Ñè×PßôÒ³„BŸ;‚.\Ùd›<îÝüýf÷ëÙ²n͸Üóçþ4v–64æTÖ),v«(W%—Åba")IÜ¡ û÷ï÷Çÿ÷¿ÿíß¿?Ô)&î(¢×ÕÕõèÑ£¬¬ »A`` |°BeÅ'×€¸Ÿ?~äÈ‘0†¡!IÜûôéãïïôèQÚãNãÁ¾=ÜQn×hÜï×¼÷¨¸‚+îˆýû÷óìÔ < 4x4Ú ®EÜóóóÿú׿nß¾2nܸ÷ß¿[·n*EÑ”žœJn&îV=îLVx:‚´ì¥Õ>:°Ï³Ã÷6¨lR€^ ×BHy)P-–\S0xêÇÇFBLKÿá6x¨ûÉÀ&¥ÉqG¸"///1™óõõ…¿ŠwKSS|Xç¸ÐNñ]ºøÅ¢ü´×ŸÖ-?¬}cø`B©)7åÆäݪ¾‘™egJË3Ë*LuUî7k~Àÿ ¹™¸Ûª¸‹+%É)îP?PƧžzê½÷ÞÛµk Ï€Ô2VñäT«V™-[¶¼üòË:ÎÇÇç‰'ž˜5k–äRMŒÇ·•—ƒöÏŸ?ÿÀ~ø¡8‹Ñhrì®Ñ  Þ5<>¬sT€_\l ±˜‹®–V46…º5cïØ)¿¦ôªXq'w"ãqG¸Òc¶²²2üæªñ¸›››§ô‰ýóÐÁ#»uÑb9u<ÀÀkŽÉîú„Íèß‹T\NþËœ_²sÉÊÝ•{¹ªé&’Šÿì³Ï˜ÓÉYeÞÿý>úÆ$‚ ÀxÏž=üñ Aƒ~øa"•’&îyyyôå ætO‡Ö q§åvF7¨¶¶öàÁƒ0µ”†dV™çŸ>&&fìØ±ŒUà«óø×Ø;ð£[ÿÁšÐ.ôWlòäÉ{öì¡û'îNDhðh0à¡Á£Ñfp!â^WW—””ôä“O‚'ä“O>;vìo¿ý&–$¡×뼪·Êˆw†¸_{: Â#z¿v×íÝüýZsjÑÜl9vÐrâÈë#_Úº»¢±‰ÈwTÜñI¬Ñh ¾¾¾•••^Z­®ºÂr!sHKÃÛÉwô u5Ç¿øâ¡§¶µ]žúÛ»†ßÞ5>¾7¤Ï糧.åÿt!çhaqTT¡&ä!—@*毾¾¾¸@™¸÷îÝ›È(î555‹E§ÓÁºQõõõÙÙÙhä€Ñ—ÜäTÚ*#&î4õ,))ÁÅ2ûöí;kÖ,Iÿ†ÜäTe@{6oÞ\XX¸qãF1 óÖjM'­yàžä˜È`/Ïh6BüaHÙXûâmƒ_¼m°ðÁ’÷õXoiÚtñÒ¹² &;ÝlIâ!Âo­¸Óñ‡3>“²²2õé }‹ ‡ùE<8Ñj|!!>^³õ=¨¯YŽ_)9pùʯy'Š®–6\›AX´h}ØŸ$ÛPZZŠKAnDðbÁåœ={Ú((îÅÅÅÌÆÄĸ»»Óêëë¡[Eâ®Õjé¼®âo“¤â®Óé€îK÷¥cGuõ¿vjâîî>î^róDÞ‰'fddpâÎÁÁÁÑ.àBÄ}ÕªUÇLJî¢E‹233W¯^ýÜsÏ©9œö¸[,:מœUƪâÞÒÒ284äý{F#[¥a2›O_-+¨kÈ)¯´!$ÐS ×Çvî¢Ó†ùúxÈ<ÿªŒ&C·Ès— ¯\!„y{Æü˜Ù¥fó“ýzLŽé¶xÏ¡U'~·JÜñÒ:GëµwEu}¸“O°!¶sbo·c{ZŽí¹Ïaƒ !ÄlÃ:  к¹ í48´ÓÂáñåMu:Ëo}b-(¡ÅEbÍ*Ó·oß7ß|sêÔ©tâ9âîïïÎiIÅî2ÍÒÊËË‘úTUUÑ5+XeÄ$Oná[¨\ޏã¹h»2` /ÅM›6ÁGBˆ›F“ÝmÆ€^Sz÷ðÝýóÃý%Ò/Š¡„8ƒܘoŒq¹¦öLS‹åô /“óëÞ½;¹™‘ïØ±n–JÅfŸ„²²2ñäÔÌÌÌ}ûöõéÓ'00B7 sð;ÉwÄŸ;At6ÿ¹k4·E„ݶpxü=B}¼kM¦†æñ@WޏƒÁFl•y"®ßœ!nmäM§Îäfë^¯‡»l0àKĉ;‡ËÂ…ˆû¦M›RSSé=³gÏ^ºt©Jâ®×ë1‡½Öi]]qoll4›ÍôCý¦<îM‹†ô}86Òífû¸ÉlÞx.û?™{ó fsçΙÕ‡ž••U^Vè©ðÔûétƒ69¦GóçÏú?ÿóÉ7?àQ};Mê³àÎáAn7NgðÔpÏ])ñƒ~l¸Áüª««ããã=<<Î;‡ÄÝ[CØwbÏîzF{áiÙ« (­o¼RWWPSWRß`ww÷‡î»oÛÖ­Á^ž]ü|ºøyie{K°—gpmÅÚ'6¶´4®þHß[L/Mh8ÑhÒIZeôz}rrò!CöìÙC Ðë‚=ÜÝkªû‡ûëu^Z77_‡›F ×wíÚÕs~΃ÁrìÚ÷Gu)õ÷"„xäf%uïæíç奋 ð¯1kŒ&:•gqq1”Ð6Yeèí‹/¦§§3“t±~û÷êêjhdnnngƒaBèûô˜Ø#º“·—šäÐÍ߯›?iùö‹Ç ­w®¬"«²ª¼¡©¤¾¡ªÉø@èS1‘Á:­¾ùZ|.]ºiii›7o~÷Ýwå<î•••&“‰!î•••8¥ã°}ûö¿üå/<òÈÞ½{ËŠ‹^»ëöç‡Çkoæˆ!Mý˜z®®qÒc³¸»iºøú ï<6ºÛˆnáìøö:‚½<ƒ½<-džòíÔkâ}Q]ýá‚âKÍ–ÀF‰$­---Ì€ª¸øÚ‹#|pòäIBH ·W—šŠ5ܓԽ[܈üìNݺànnA^žA^žÝHöysöù´áƒÉðÁ!¹UÕÊ«<¶þhîÒUãëGôúˆÊ«s† ôÔ‡x{ÝSWv`û©y³Â|}=õ„²á‹ü¿`ÀHîÉ'§"¸m—<m"îgΜA‰0hÐ X„E°ôã°½N‡ITh)½¶¶9ãq'„Ô××ûûûÿío1bÄ„ ày¦!$¶®ªù½7föˆ¢Ïe4›?=~úëÜ+¿eçàN1Ïóóó /++«l2V6 !U²._%„d•\m±Xàm8t„¦W¿ÚÚ:x¿_[]íQUþì°ÁOuë¥wׯ«b !Br*ª,:7–¬ú,·ªæbEUãÍ$Æ`0Œ}où#óàžÈ¿>ÁAýC‚† íl[ö½´Z’›eÎÍ2B<½Ì†àO¸ëJm}I}ƒßùß»W”Ì2 @¯ó×ëüõ:®_d׿åï|žØ×'¡÷5âB9¸íÄÜG¤›¾gëÇÆBZ~X ;>¸køµ?]8õËÌÉ„"ÔÏÿŸÇaŸ)ï÷ñÏ=—Öéë•w¶´à”Ç–OÞþúž; ªªýìíÛX3´Kèé’2///ñô>š$ÑT/###11Ñ`0BÒÒÒÞzë-Sí#îF£±¢àò„Ñ·E„ »½[Oy UÞØ´'¯àPAQfYŦ=ûtÞ>cî¼Ã\S½*íÍâÇkªú…H» !zhÕ7våŸß<ãØüÇÂyYÕµéWöå_ÙWXSúÄBÈéCY~bó…Kß»xàr‘åú¼†¸Ÿ8qâ¶Ûn#qO ybp¿éç´f3Q÷¢ƒ††îÝHæisæiØ9…)®ÏQni"5M$î”ÞÝ’Vážâºú̺&óá}nѱ‚Œâ·&Ü×ç•;o{jp,cvs›óóîÿ;qêþ§vïÞ¾ƒ:nÑ¢EEEEõõõ@ܹâŽàD„<m"î•••̤®àà`Ém4€~jF•¹æˆÎý /O\IPWW‡Åþêïïÿõ×_¿ýöÛAAA‚ $„wþWò£ŒUÂÍümßÕŠ96åVÕ0ëDJ÷7ß|³ªªjÊ”)0„@§5$¨A § ÒÐyzºÅ%ºõl>´§fó÷>Ú¼M(Ìo)Ì'„ûøzêa/­V·lñ=fó=ÉwˆëAX¡QïåÑmÿ™3[ަ_ªª¹ë¡éû2Ï}³~ÃW_}EùéBŽäbgp~um~uí¶œk9v‚½<—=ûŒÛù³¬ßÑÔè^TðPßž×>þ~<Š;'ŒaJ ùzÞ Ø!a¾×oP}Žî×§<’¢Â]BI—PrìÀPBö?1Ýh6i´éüò«ot!9Åïsúõëççç'Iܬ2¾:>ÁAýB‚úv ê<*}×!ãÓïW¸¢­ÇŠýG6žÏ>~¥Ä|ýµ’6yμ«W¯Œ¹{í…Kÿ\öq?ßûzFßÛ³û‘]½=Ô~Ó žú¡žú¡¡æ' 2 Bóªb¼ü;ûx_­oÀËaŒÔ%%% q$''ïØ±Ãl6…‡‡744 êÜiñèá÷öìΔ½‹eoç¨}Y—ÈõîÊ(î'N$„:töpâÎÁÁÁá²h÷?Ðñññ°(˜ïq3å>÷TÄáÝž0ý-µµµHÜKKKׯ_¿iÓ&TUa~*ÐKË“î>ðäã¨—à„¬ŠªûÖþ¸4ïjnU !½ª1qëErròŒ3ÂÂÂåÆy’Š;<Õõõg;?•~îËÓ™Qº÷úÚø°Î};idøDq]ýº³¶zø½V\ôö§ÿ;èpŸ!+Š«—<¾îì…“E%gÎ_ „ÄÆÆ*LüõôôD¿„$Ê›*Ã#gÿ¸µÛû«ïZ³¡(²G¹Y"Ma;‚ÞÝ=ÚM˜êëqþOÿ2sòC}{‚‘ƒb:E´³¿ªª I!Nô$„hÝ܆v ýëˆÄÿL¾çÔ¼YWŸO9ðäôU÷%/Ol”—±‰H¥z$„T46ý'#óž¯7®ö MÝuàHa1²vFCÁ Lœ81<<<44”r¥¶nå‰ßøvSØ»+ÇýÊ3…nÑÕFÅ¥wn†»F#äfGgž¼ôì“ßM»oZ¿ž¾:1q?yò$“”¢Õj§NJY³fM—.]Žoùy|Så‘§g0¬ýJmÝÏþ¡>r:ãjôFooïýû÷Kæq§QRßð]fÖ³[vÿlmð;ŸöþäË?íp¿÷ÁŸ>÷KVn·ŸœO,Ì×çO‰q;š5ÿ±éãßF$ÎÐ{jßSûöˆºZزñ›æ÷Þøaìð7“F^cí7£²É¸¯¼æ _§{¿ùqàŠÿ½ý©þÍü–~ñþêþŸþç‰_j§Ïv¿ëî²NaYUf™») £Ù\ÚØdö¸ZßÐhmR„§›Û°.aó¾“|Gÿ3é¾ßõËÌÉkÆßÙ;ÿÂÄÑ4koli™ùý/& tcBèÙ&z½¬ü`"7wxø“x»ºº:##CòO´Ÿ×Àkà5ð:p ‹/ÖH8 ɜз¡¡¡§OŸÎ(..2dˆ¤‡˜†F£1^KŽ~5ukNg~wîbò#}òÉ'@5bbbrrrüüüzõêúĉ}ûô™Ð¯×“qý§öíÁL'm2›ÿuàø²ÃéM-æ‡~øÛo¿%„ÜqÇô2ïIII»ví¢zöÙg?üðCØž4iÒ¦M›ðO'Nüù矇zôèÑwß}÷ùçŸgšýÆoàôÜäää;wìÜéw »¿WŒ›µ~  u0äËCGç¼òO 6lÞ¼ù‹/¾øüóÏŸxâ‰|pãÆ„_|qùòå555¥¥¥'Ož¼ûî»%k8pà±cÇ$_ Ö®];cÆ ØÞ¿ÿÖ­[7,ÿøígæÞÓ+¶êôIÕ*/¢Æhª5™ü K®ÖMõ¦æÁRklˆ0úžñ¡¡¡‚ ¬ZõÿÙ;󸨪ÿÿŸ™a`˜†D6QRqa1·©¤å†õIÍú–Ù§E>Z?ÑİE+K?f¥’i¢¥–¥~XrËÌw@@ddùýqò|Ž÷Î\†a–;3ïç<†»œ{îëž™ûºïû>çlBÍŸ?ïòýæÍÖ"B(8¨Çí’7…“›k]e¥ÌÆÚQbÓůNq]ÃWçr³E6‡Žý—¬^½šÑ“=gÎ2Áí Aƒ’““ãââBS&MªÎ>åí1ØÛ#²›çß#„jÆÍ»õ‡ Š~ºrÃ7jÔÑãÇ —,Y²jÕ*z±XÌpÒ?ýô6Í4>>>.\pvvö–Ù÷vqê&³WH¥ÓÆ>ÕÓßOÜÖv2+Ã].ë.··åÌonjm+W¸}õÇ__Hoyôܸÿþ/¾øâàÁƒô–!!!ÿþ÷¿ç?ÿüÄ^Ï÷í3¯ãZ´+•›s¯ü;ýèâeIû÷ï?qâDXXXvvvbbâ|PRR‚§1Â,Y²dîܹu“H$MMMVVVJ¥²µµU„Pþ‰c•çÏ •v•·E]‹šß[~äÄþë…gnWD1`À€?þ˜±Ík¯½öòË/?ñÄ¡¢¢"???‰•¨—³¢»ƒlõ’÷ôòPÞkD--{~ú±ª¾!(´oæñ?¢†ß³²^ûÕWÕM÷+ï5ùúúæääà¹ÌdÖÖA Ç>®Š`Wç^îžîš¿6!\©®ù×ñ³™—®,\¸ÿ(%''/Y²däÈ‘¸W BèØ±cøw{{û7ß|cmm=gΜ®heNÔÕÕÁDîPƒBj0 Cüé¥ÊgggÓ>2''§OŸ>ìÖÖŠjiWZ 3ÝäöK† \2l`U[«ÿ¨!'nÝΫºS]s!ÔØØØÖÔô„‹"ÌÝÅõ¯#èà‡fLf,ì<âÿ%_(*Áÿâ4±Ẍ²#îä3cBSÜc¯Ãˆ;ý9·²zÚ¿Mµã½·_ÍSÞ*¢_Ü7"ÁñüB›>}GÿßëgW„P]îUÜRìííñÑ㸗••Õ××;88¸¸¸0"ît;“J¥666ô¨vlÈì˜øL}||.W׬;uaüŠ”Ñááw nø9È}ä²^^¢Ö’ÂÞð ¥¾¥¥þAKcKkèàÈ7Þý_~óÍŠ?®k}èîî^RR²råÊw¿ZË8Ö©¯ð8!´èÙ9­­­s÷,..þꫯ>úù¿xƒÙ³g·collìK#ÇM]6/”Y[Ël¬·§¦þóŸÿ”J¥o¿ýöòåËñªŒ_~ž;{V «ó>H®¸˜ÛtýJwæpŸÝd+G iiW¶íúN)ôï¡.éÅÑÑ‘SŒ”²šÊ·ŸŒé×mHwoÛ>šNGÐŽPvyÕ_¥e•–Ÿ,-'yÞ[—ÇܼYXXH&ˆ±bu¦Ÿ~ <À‰[¥ ¥ w‰ýï+Æ«ªªýâÿ¹ººÝÊËý~ÍÇG·m èæîÊ(ÄVlÐP“Ò7èÝÞ~'KËN•V\ª¾cWS%inr’ØX‰„2kk;Û'‡ø‘C]¾ýÆ<‰•Š'·ÊÞüïÑÛHX÷ …ŒöC"îˆú"à6éàà0dÈv94---MMMíííR©¿‚Œ5!ôǑëç¿ß»Çø ygœÚÚÛÓoÞúDz•Y—®½·ü¼ððáÇfo‚];BÈÇÇG*•677çTVgWT½äâùDÜx„PCCôgçH¥Ò÷cƯ>qæ_‘ÃÛš›.UýHÙÐÒr®¼ò\ùßß­„ÂP7ç„ôyoÎLeñMå=® B—ªjþs6gsö¥ÑÑèÒ•7nàå8âN§Ê¬$¡P8oÞ<:‡††»|Ô`‚ЀƒGÆ}„ ©©©´qOMM8qb»Y‰Böï¥<<}¢&ó ÃCæH‚®V¡ "Ô´§ÞÙUëoÜêiïy¥¢Š,Ä}mll^œmÜIöb÷’’ô(Ç]¥qÇs.bè4ߢ†{¢q¢qèáÃÛ·½ûÎ;÷¶½š¸äRáÍ/vþòùçqO9»2êcooMø_»öwž »òvvv¤_/®žT*ešI ;NxóÍ7:tæÌ™ÆÆFœšÐóçÿþLv¹}û6ÙkÞ ¡ßûöòª{Íþþþø”UÎRD ž"÷Áƒ/^üè£È8yW"‘ÐÂ6´´4´´ Œœy\º\x÷o+|ÇFúûÍ’‹÷îoŠW`#Z”è#—}·ôÿ{umõo° Ú/œn¿pº¡]Ù¿òΫÃ.”W9õò ùlÝ:±Pè ±qj{0ÜËmààþ½úy¸†¹»Š²OöÕ×lW*oÔÜÍ«ª¹r§&¯ê΄ç_Ì.-[óír¹œô¨&gß~|÷Ýwê”!ôêÕ+11qíÚµtGÛû÷ï³'.ÀíËŽ‡ƒ,®khõZúû‰¥¿ŸÞ7$kÝÚÖ³'…Õ•Œí­Å±þÝcý»#„ЕsC††¡¡aŒmPcb¹ö‹•wÞ=|âÀ›¡=z jæÔqãÆ >|Ĉˆ2îþþþ666x F‚³³3#±¾½½·F2BY‰¹Vð˵‰•(.À7¾w±=üþךEk{ûéŠêŸ¯n?Qîåýtï«7ñ*…B¡®ã ]C¡Ptåʹ\ŽǬªªruu½yó&BÈÏÏ+ßÖÖF_h±X̾š˜¶ööóåU…÷³—§F=3æ©ûןpQøÈe³&NK$‡nmkóìÕû«ý¿()Ë~ôÛžžž~õêUü¯Êwú@pë¥5h@   ¨a0xdÜçÍ›¶jÕ*Ü?lýúõ'OžÜ¸q£F;ÛÚ‰FÄm?Ÿ÷ÓÚ?x.>LŒÄZ½¡¸\]³úÄ™y×Ú•Jtä8½ GÜmllwV†÷ …ýúõ#ÿ26ÆIQwGÇÿ "AßPÿè‰**qîví]ìªi§BwbeÜñà•x¢SFÄ]&“qw2Ò3BH à ~ŒX,V(sçÎ]»vmZZÞkôèÑ999tÎÃèÑ£·lÙÂ8Gìx¼½½±eïи766>xð€ž2=š×†Ý§V$¹»»‡„„УCâ£`7Œ«QRßïâuÕÑí³wÿýú“žíÈS&Äz¸Äz 'K>$9Z߬[ÞÓõì8²^y¯éÒ½¿æ\<}»"¯êN=•tÞ¿­½¬²!Ô³gÏ3gÎÐ{I$2§¦:e...|ðÁwß}GÏàsÿþ}|Q$ éœÍ6îèÑ3*B¨²¥M4}º••Uii)î7âç燯Z[[þMÀÅÊÊŠñ¨Ï€<‰Ußpäzá¯× Bc>ߨèÙsÖ’÷+**–.]ºáL½ Ž#à¤*âÞaw€?ð¨sªL&ËÊÊ:}ú´¯¯¯¯¯ï™3g233ÙñlÄÖÖG‹K¿ol[+ÍÛŸñgõÝûm%¶6µ¶m¿xu쎽ý¿ú>£¢†aù'Ož|¦x*â“““û÷ïO'Ê?õÔStØ 8ð•W^™9s¦:oŠ({ŠO°¾¾žaÜoݺ…«kEº†¸»»‹D"Ü¥GÅGÁ"Ó0ÙÙÙ]ªªùèRAàºÍog#É*]¡ê^óŽ‹W_ú53ì«ï»öÍG7Ë??uáÏ[eõw­¯¯ÿý÷ßBƒ b”@ÏÅ@]Œ–nK¡––|Ê..ÿHëÿ>xðûB;;;|!ð5µ²²Ê«­OÌú£ç—[ŸÚ¾ç‚•mEs"-òkëÖœ<7xëî·ò ÷\ɧ;[ãFH"îô‰ØØØÌž={êÔ©ø_{{{|M­­­mmmUªÑ¡q'´µ·Ÿ)«ØSRñfúÑÙ{¥ä—þ¿Üëó÷gœÛe–4¶´* ü\êé鉨/2=ò£13Œ;ý5okk»ÿþ¶mÛ°ö÷÷'ßMqwuuÅG!]U¢rw|ùð%cL&“É‚‚‚èíñ·†îÆÀ„àQÄ!äçç‡;PjIé.«©M͹\Ðë¿›wÄôðìá:¸{7‰u7¹ wðjjm«jjºQSw¶¬¢Zî´ñ·CÄâGGG÷îÝ›dB#„~üñG@€•D"QqW(Ï?ÿýòòò¾}û>õÔSëׯ§WI$’ääd¥Rùã?Òš´µµihÜѣѓ\\\ðCzt½D"îÌ€›–Ýýû÷‰,øßv¥òðÍ[¿ $›Ò~³Ð<ØË#ÔÍ9PáØ?0 µ¾ÎÉVªjïÝ«i~ÐTŒØÕ-·êΤ×Þ(ª«Ç‡À´û$⎛7ýH,RSSBgÏžý׿þ!‰lmmïÝ»G?l¨±Âîîî‘‘‘ûöíÃÿ’7么$®( ¼„aÜÿ7ÔÌŒ3ÒÓÓÉ7Kåe¥¿A{öìyòÉ'Bݺuc÷’’¼ÐÊÊJ]Ç<Ì(c,>mÜ]\\úôéƒß­8rÜ10‹ ¨Aj0Ah@ ƒÁ/ãÞEˆOÅÎÏÛÛ»©µí—Ë×¹|½_¿~dÄ^^^t`ÞÙÙyÙ²eçÎãÁˆD"çCœ÷ÁƒòÉ'*«„rpppvv®®®F]ޏã~çÎ|掸3Œ;¾åc®.âNœ4coooò‘H„놅Ϸ®®®½½ÝÖÖV(<833ï²`ÁúubEû4‰¸÷ìÙó÷ß¿víøãç‰DÒ½{÷7ÊåòƒnݺµW¯^è‘q§a§Ê „¤RéèÑ£óóó[ZZvïÞjW*\¹¾çB®•Páé6ØÛc€§{tX¨›5î ØÖÞ~_‰dî7Ê+\Ì»r§6¯òN½ìÕw¿¸ìC„P„QgÜq8öµ×^£ßÏ¡zöìÙ¿Ú¸;99UUUiaÜÉÒ>mllššš°&ÖÖÖvvvwîÜ¡ŸgÈ.x8Èkwj¯Ýù[ÿñãÇÿú믑‘‘2™,==!Ô¶é{‘HT‘];BèáÇìÎX’*£2K$""ÝB2™Œw•wq Z²d ‡qÇÆW 8;;GGGËd2<4‘‚ޏwëÖíÀÕÕÕÏ>û,bEÜÙÒ]»v ·F'''†qÇß&bÜÙ³€âîàà@,;C'''Ò}ˆ|•T¾H¡ŸÏ•J%ž>B¡P0:§2"î"à'pMReÈå£ýšššˆàŒÍþcžÆ[::âîêêÊžÈjèС䳟Ÿþ Î¸Klmmñè{UB"ît l㎇N'ÿªŒ¸>|ÇŽøsss3Û¸»»»/Z´(99!„‡sÁÉߌ¡É.Ø¢1^Ðu#ŸE"ÑôéÓ¯_¿žžž¾qãÆ™3g¢Ç-z<âNAJP(B¡žPa¦q… TŒÑɈ¸_½z•w±XŒ"Uªâq©ñØ2ôr:â®2'„ÃGjbÜioDIôOؽ{wrr2®$ÛsãK£…qˆˆHOOÇ]«ÿž!X.'çËþ€Twú<`wÜ8;4îäyL"‘àškqGw¨%`Ý._¾Œ8sÜ5Œ¸³ƒÐtN†·xñâÅ‹«ìIÏhøýI•©®®njj‰Ddš¤;ãN΂ñ¾±ººš4N@ÀPÆq§5h@   ¨a0,%UF.—K$z¢o…B±téÒqãÆáwrïd‡]öB,oÚ´IÝ £tÄdǪ3î [F»r£=wî±àÍÍÍ8DJw™L–””„cçø¤ð¬OŒ cFÄ×S¥q'~T"‘( …BAç‹«Œ¸3Œ;.Ø‚OŸ8?†C A¿Ç'%ýýý…BaII -îÕ«žŽ˜}!È`”Œ€¨Êwzwÿ„WÙÛÛã>´qÇK8"ºÅb1Û¶â¡<Ù‰ÈZw//¯ØØX…BQRRB2I$ ™qÇ¥‰D"Žˆ;žäˆ}8___ürFq'—ÕÖÖ·Oí"îìw©TJ÷àˆ¸‹D"”””O>ù¤ªªJ]ÄÝŠh)är9ýÀ, SRRÔÕ™¨“yðg'''œ3ƒ']Æ¿Nèñˆ»ºY÷ZZZŽ?N~Äb1~戸ãöéãããééyêÔ©7nkamm͈hЃ·  ¨Á¡5 †FÜïß¿_WW' éN2™Œ !ýa´Ž¸‹Åbœ®²1v½ø3¶vvv!!!ô(4 [ÆN•!YȘ¦¦¦¦¦&@Àõ‘Œ—nݺ …ÂÒÒÒææfF˜÷#î666Øà^zêN6îôˆ“¤XÆs )œ.c²—•••]{{;=4 ™a—ý8DÔ`¨D§ÊàaøP'#îˈ.·Í;ÉŠaŽž €Ô“ãŽ:2îô“ t…ÊONoÉ‘ãN?Ò/OHÄ®.×ÈÖÖv̘1S§NÅ_:Í#îÓ§O_¼xqXXzüÛáèèH7$îT…B±xñb|É´ˆ¸[[[ã‹ÎþÞ©„K?î’ˆ;F.—ã#Ò¯­ØéR˜ÒÒÒ#Fàô$ÄzY¤2âþüóÏÏž=ûý÷ßǿ׮]#¿ì3…IËi@ PƒBj 34îUUUíí펎ŽômU.—¯X±‚Þ˜vÒ!bëéwÖH•+bØ î÷Ú´1"^™$ZäææÒ±:Žˆ{CCC\\Ü·ß~KoÐÖÖFoQytÖÖÖëׯ3Vs£2âNGñ¨ŽVVVÿú׿؇P™*ƒßã3ReH¯>ãþÄO¨s{ô^XIz!ãN`Ø,œ´€+@:eÜÑ£l:âŽó‰‰qŒŒŒ§÷ewrч;uêTuuõÂ… ñ¿*#ªkÏ>ûliiéæÍ›Ñ£ Š»ðÚÛÛ“Ó$e$jsDÜiãNwÇôññáN•!H¥ÒÕ«W§¥¥áábš››ÛÚÚ÷W !4cÆŒ”””þýû3ªäääDûxîˆ;]7Òc»Ãˆ;Ibø¢s|ï'‹?àj#„„B¡ƒƒ9Y™L¶k×.:q¯"]b:tˆ~ãAÙ‰õR`¬úÇ?þ‘šš:gÎ’fFž*!ÁÀ´0CãŽgÅ÷rrŸ–ËåcÇŽ>üs^ÒÆ]*•’®¥Œˆ;ÛG‡ŠŸ/¹Ã„´q'oó™ä3ã•qÏÈÈ8yò$ûêÆÄà·WìQJ4O•A>}º¡¡A勬OŸ>}ðF¾þ´xñâ_|ÿKoÃîœJ†a˜'¶q§ !Ï]šwì·Ž9BeÇŽiiiô%è0U!”››[SSƒcÀC‡MKKÃχííí8¨½iÓ¦ï¿ÿžLÖ£aÄ!äììLš%ø/_¾œÔV]=ííí½¼¼ðYã—K8iŠŽ¸ý‰¤¸•jh܉\B¡P.—khÜéä+R`‡ávôöŒˆ;;N*£²nFÜéü¬÷÷Ž@Ô ƒZ:88Щö¶¶¶tqq À¿ñ*F— ÂÁƒÙC¬‘[Už6îyyy$ †”0-ÌиãÜe†‡À}ÕªUÞÞÞØšK$™L†o{þþþÄaoD'f0ŽòÄOÄÇÇÓApW‰¦oüé}Ù÷Ô’’ö!Øg{cpš;Û¸“½^~ùå””œ£‚å …ìC«Kâ_¼xqnn.yF¥q LII¡'Šç8G’;Ä0.´hŒS‹ÅݺuÃŽ“]O¢ñs´¹'ÛOžž qFÜgÍš5kÖ¬öövÜ“R‡w•ÆwvÄKhãnmm{˜± =Žáݸqƒ± 1jÏ<ó YHz‘²GàQÇk¯½Fÿ˱€á6î$£ÆÝ݇ƒ¥(°+O*fΜYVVÆîCÔ ÎÆÎÎŽtàˆ8jqgƒ 1îl§ˆ{’®ŠØÆ©kEx9]IGGÇòòrr¥¸+C }¯‘šwÒ8I½¶CãNïEC¤²2*#îšœ ©Ò{ï½±k×.²JóT1îøª©ÌqŸ:u*þLeÙ!tì àêÕ« ã®.-Gq§{¬úúú’]M"î=zô ûȪÜfQ¡5h@   ¨a0Ìиã¾!Ñ#ˆãK–,ùõ×_oÞ¼9räHôȸ…Bz>ŽwŒP(d'‡¨«z<âN—éææôÖ[o©L•Á3CaïŽG¢>|ø¸qã6lØ€}-·À¯ð‹666$©—cÌiŽl“QqgÀmÜÉ•¢ ã*%Åb±½½=~àY¿~=w݈q'gÁ‚“'OV·½&w6êŒ; ¨ã%"‘û'\yuÇbÏÕµvíÚúúzü|B÷hä†6î$Ç~bDÜ###çÏŸORËèCÐÆÊ矾téÒØØØÂÂBMReèºûøøÐ3sg~kq—Ëå8SECãîåå!•J§Nzýúu•ƾô숻JSþ×_-\¸ð?ÿùþrÜL 3ÌqÇЃ„XYYÑÃ<Ó,\¸ðÝwß5jc9Ç8î„ýû÷çååá„™«¤.ÇbÜ[Bî÷Ü9îØ¸coDâ£ÖÖÖ*o؆‰¸³Ÿ¯hˆq§sÜÕEÜéqÔÁÎq§#ÇŽ]L•a’IÄ9ÄÃ㳩24={öœ?þ„ 8Îȸã M;†qWY ÌÇÊÊÊÉɉ„{UîÕ¡qG‘¾ÈZGÜñŽvvvÇŽËÏÏ8p ccîΩ¸Áw6â®òÑ— q7nÜo¼£Æ=888""ÂßßÿÌ™3ÇŽCê1èåšDÜBb±8<<œcHT¥5h@   ¨a0,"âNÏRÎ`êÔ©$uUeQÍÛÛ›žãI%ôíYeÄlM:4îlÏD§šÑ“&Ò] UQ·Æ]-Ö0U¦oß¾ééé[¶lùþûï»bÜÙ9îÄ8rMµ‹¸ãndTŽˆ;B¨{÷îŒÓUH Û¸q#Ç)p'ÚÚÚÚ€€OOOŽˆ»J?JwùÀ/|üøñëׯã@µJãÞaŽ;B(((èĉ¨ËwŒºï#;U†®.AݤÅl´ˆ¸ …B;;»èèèèèhFµÙ_·¯¾úJ]ý9–kqG sêÊ‘H$¶¶¶øF«a™äÙƒ±=ŽÑ’û=÷¬*»º`aÿþýóóó8 IõT˜ÏRå6vNuttŒÅ}ïÔ¥ÊtêÊÒS:¬§æ«Ð#;…»°sÜÆÑ Tåt’Ï€ƒî+V¬‹ÅøÒp¤Ê0 [Ž; O•{é5âÞ©o(wª [dîˆû«¯¾ªT*ñùâàà––¶{÷nFì€Ã¸sÔŸc¹†w„Pß¾}Ož<¹hÑ"9EDÜ»bÜ5Lké°©TŠ'Ú¼{÷®†eöë×/??ßÆÆ†ŒaŒÝÁ‹†mÜÉ–ôBvº§àNƒÁ`Ë2cÆŒ#Fà·4äbÑ·+w‚a"î!‘HÔÖÖÆ0îä™ 8 #îŒñõ»B÷îÝÛÛÛ§OŸN ¤Jœ7wĽÿþû÷ïG,ã®r/¶J=zôˆŽŽ¦3]L•Q7Œ&îΩì|$f~ÓÃÑÐpŒ*ÃF·wR19ÙFÜiãN‚¸šÃ1Ž»vU·gl4¸x{{3¶gŒ–ÍŽ¸ÓÓžK$²ùлwïNž‡¦Ð—@#Á§3jÔ¨ùóç³Ã„ ãNÛwB§Œ;QƒwFœØÇÇ×A]2™, ÀÏÏãpâë뛜œŒMïlŽ;©žŸŸ½/±}FÜ£¢¢6nÜ8qâD²¤‹w ÷â6î¸ë„NEÜÕ½q¢—33™ XîîîìŸú×5h@   ¨a0ÌÖ¸ë*UF‡wôÈuöa€±}‡w™ŸŸ¯rD‘Î2}úô &`5´N•‹ÅøL§ReÔÍÈ‹ ÁÏÕýRà h¸™Ÿý@.ðµÐSÄ]]I•ñòòš?þ‚ TFÜñ™vx cÇŽ=sæÌªU«Ë¿¨Aj0Ah@ ƒa¶ÆÇ'9îè‘¿éìÃ@g;ž•@cÈ–Æ5îܱRGGGÚãv=U†¨Aì¾¾SepýñH>ŒTRf÷îÝœœüüüBCC;¶cÇŽO¤‹<ùä“è‘]霊cäøûemmOVå^"‘›H²–mRÅbñ”)S¶wÍ¿ž¸ž¡w>÷矾¦¦†ÌT “É6nܸaÃzòêíí––¶}ûví*Æøõ°p@ PƒBj Èqï (]wCFÜð3â®Î¨ …BGGÇššM"îJ‚2pªÌŸþIoɈ¸9r„loøÎøŽã΀mÜI†Mss³ºáVqº¿½½=~ŒQiRçÎ+•JÉdO‚+ ¹ÝÇãá°ý:)Ï©2x~(2³;^èáá¡2«0Ìʸ ‰D‚Ç™Æ÷õÕ«W³g$ÕMÆqׄ®ä¸³+ƒæ¸39r$ž¥H¡PÕÕÕõèÑ£SÐÜYÏ ªqG-X° ººšÎ 0¹Î©ì-5™g×`t%â>vìX¡PH|¶D"á0îVVVmmmw„РAƒ8¦ÁRGg#îŒØøqÇU>p’…ZtéL³J•AÔÝ‹DÜ»wï®…q×SÄ=$$$""ÂÓÓ³S…0ÆOı[Žˆ;c„Ù³gcYÜÝݯ]»VQQ¡×1àT†0i.\¸qãFzÉÉÉ7nÄñEãŽGØì°>ì ˜´ˆ¸3* ¹qW—ãn,°ìΩööö8­…;[ÝÊÊ*::zõêÕãÇÇKðUæ0îˆz@êÊ ´ˆ¸#5S1|ޏcˆÈ*›½H$§ÐE㳨Ѐ4 „Ô0fqGÙÙÙݹsu9f¦+ãÎ蟷lÙ²eË–i]¢îÙÄ[°;#õÂÁÁáðáÃ...:œ¤CÄb1î—©ÎýŒ3FóÒTwww÷Å‹khÚÔMÀ$4ïœ~êÔ)F­ÔÁçˆ;VƒÝ9U$½òÊ+­­­*_bpôÕÆWYÝÌú3îÚEÜÙ9+â®ùC·qGÙÙÙ=xð@‹Ì@˜E…Ô 5€ 4 †Á07ãNni] *ëvT&וÆ{ @ .ØI3`À­ÞYÙA]D¥qwttLIIélQvvvÓ¦Mstt$¸/Š•••T*}úé§½¼¼œœœºhÜñ±ºø¨+Ø©2¡/¾øBÝö_‡ï¿ÿ¾¾¾^]òÞž;UF;üüüÒÓÓ5yå‚aèoZ9­­mMM ¤Ê˜1¼°:„‘*£5ºǽ‹>€Ã¸Ëd².>ZèòȤ?ã®B¡«øÓO?! ¦¬ÿú믿þúküyß¾}ìZ©ƒÏwÌÀ7nÜØ½{w ·ç0îC† áØQw[[ÛØØXÍ·W—*c¬w<äŽR©Ô"Ç#⎠ÇÀ¬1Ûw]EÜ»hííícccG­“Ê Êúà*‡”ÉÍÍíÊẮ-(°‹tݸ³ÕÀ5äΓaÀhNZGÜnܱ¾¾¾óçÏ×4'-èb—²»[/#U†8xúŠ$''?õÔS‹¸ã:tJ<° ÿ=¡_ã¾iÓ¦ÈÈÈ¥K—:99999-]ºtРAêìø[o½•™™9tèP[[Û¦¦¦j7äþÐõˆ;.owM ±qçAÀº,lÙ!:Qƒaܹ7Æm†áÿxò¨Œi¤´Þ?©2¤JtA(~÷ÝwAAA†©Rxxx¿~ý:•²e㳨Ѐ4 „Ô0ú5î¿üòKBB½$!!A]"æG}D2{ôèÁ‘W£w|kç›q×äžmÜyt›*Óut¢F×;OrܵSCWwþwr"ŒéŠ\]]·lÙb˜*:tèüùózósèÐ!¥R9eÊýÕ fQ¡5h@   ¨a0ôkÜóòòÂÂÂè%}ûö½té’&û8p $$¤³GÔÕ¨2H§#ˆë¤&þ¿%ç›q× ÎÎÎ)))xüD ;£Êåò€€oooýURt±s*yŠæqg;xB§œ4ýºÒÚÚZF@ËÙÙ¹¦¦¦Ãkjj–.]ºiÓ¦ÎQ‡£Êð$·=î-:õbÝ(hÑåŽÿÈd²Å‹ …ƒvhÜqpaRŸ~úé§Ÿ~ZUÔ']œL‹YBucæT•9îÀsø8SEEÅäÉ“7lØ€ÖÁ#^{í5¼¤oß¾IIItÒUnnn]]ù—^E®««Ãóà;zii©Ö%°WiWBuu5½ªÃŽ?®ó:h^‰¸±t x¶TÔ1¨¼º©2<Ñ—€v¶vĽS%àˆ»X,¾|ù²±tÀ5oiiÁ%‹ØÐÐ`°:˜D ;wî4zøSý£jºg¡«Ž?nô:ðªöÏ©)ž…®J “ M÷,´(!))I  ¤?”ºƒ]¬››[yy9½MYY™‡‡G!·nÝ ËÈÈèÔqÉgâÒ ;QuU#„V¬XÑÅrºÎ‚ ˆ°Ÿ}ö™±«Ó'ND=óÌ3Æ®ˆîùâ‹/BݺuãÞlÔ¨Q¡Aƒ¦Và?þÀÍïÚµkZì~àÀ„\.×yÅ4'""!´wï^üï7ß|ƒÏhâĉF¬`–èÖ`Óè2âΨ1B(888;;›Þ&''§OŸ>êJ¸}ûöرc׬Y£]t;‚÷΃uãópZ£a“P™*cÒè¤sªqTÀ ÐoªÌ„ RSSé%©©©8"˦²²r̘1)))ÑÑÑZ‘Ìco~£ÊôïßñâÅ8pÈgt;s*¯Ðиã ÌI.‰¿ŒÆ5îŒùÔº8¥ý÷yóæ8qbÕªUµµµµµµÉÉÉ'Ožœ;w.Ù€N3fÌ’%KÆו#šqÄ}ذa)))ýû÷ïp{:yËððmTª¡a“P9$OÐN.Ž*Lj;cT™ÀÀ@üAùxŽ`Ü_¾jЀ @PÃ`è׸Ëd²¬¬¬Ó§Oûúúúúúž9s&33Sݸ(çÏŸŸ>}:#»ÿîÝ»:¢ÇqçÛpš?Šë³:À· ˜t¨F§Reø£vjtѸ{zzΟ?ÆŒZì«+œœœÈÓÔ Aƒ\]]B÷ïß7b­xˆq=ø¨Aj0Ah@ ƒ¡wWêçç·gÏukép—NB_ظ óK•ÑüŒBCCõYà[Ä]‡jhø,Ç爻vjt1±Ä××wãÆZì¨CöïßOÿ+ ÇŽ›ššêææf¬*ñãþzð PƒÔ`‚ЀÃøádÝ‚SetìäOªÌ /¼0bĈ€€cWD#øfÜuˆ¤ÊhG;§ò“·ß~{òäÉýúõ3vE@SÌç6ŒQ(ééé: “óǸ˜ŠkGEDDL:µo߾Ʈˆîã·Pº"$$D‹¹™Àˆðq¦®`ee‹ÒîzQÈ4 =M€á™3gNZZšº±ƒ ÕÐp2]Üfø9¤vj˜eÄcÜ/ Ah@ PƒBj s» ëþDÜ;˰aÃŒ]¡C5zõê•’’âããý6îü윪]’ÏÀ—…BjЀ @PÃ`˜ž+5)))ï¼óŽ¿¿¿±+ð…îÝ»/^¼¸ÃÍ U}Æ]-þþþàÚ-Àais2î体)¾€³ÁÜ^|¡ÜÜ\cWG^ >Ïœªb±xãÆ7n4¿Tø²0Ah@ PƒBj L(˜ÃY躺:cׂ/^êêêúúz¹\nÈãj´  „Ô 5€ 4 ýYSs°¼`Üž ?kjn/¾À,ã&w3æA 5h@  „Ô 5€ 4 †Á0‡ìpÈqx一EÆL0îf¤šÑ€4 „BjЀ @PÃ`˜Cv8ä¸<rÜÀ¢ã&w3¤®®ÎØUà  ¨Áa‚Ѐ4 „Ô0`ÜÍââbcWG€4 „BjЀ @PÃ`˜C·Nèœ ðèœ  w0À¸›!0 ¨Aj0A€ 4  ¨Á¡5 †9d‡CŽ;À ÇèIIIÆ®5h@  „Ô 5€ 4 †ÁÐ{¬º¸¸ø7ÞHOOGÅÅÅ}úé§>>>îU^^uãÆ Mªw  ¨Aj0A€ 4  ¨Á¡5˜jĽ±±1:::<<¼¨¨¨¨¨(<<<&&¦©©‰{/¥R9gΜ+Vèµn`Bè÷ iíÚµgϞݶmY2kÖ¬Aƒ-\¸c¯5kÖ\¸p!55UÃçxÎc‚Ѐ4 „BjЀ @Pƒ©FÜùå—„„zIBB¾}û8v¹pá¦M›¾üòK½V L ý÷¼¼¼°°0zIß¾}/]º¤nûæææ„„„Í›7Ëd2½V L ý¾Ú°¶¶¾wïžX,&KZ[[ííí& BjЀ @  ¨Aj0Ah@ àKãN_3üœáääTSSãîîN–ß¹sG¡P¨ÜýÍ7ßÌÌ̉D=.<äf.sÜ•xIpppvv6½MNNNŸ>}TŸïçç' @‘`Éè·sê„ RSSé%©©©'NT¹±’Y¨×JÿÑog‚†††°°°¹sç¾üòË¡õë×oÞ¼9;;ÛÎÎîïÃs&ïC_Àè7â.“ɲ²²NŸ>íëëëëë{æÌ™ÌÌLâÚÐi€  ßˆ;:Œ;˜`ÜÀã&w0À¸€ `ƽ¸¸8>>^.—Ëåòøøø’’c×H¿œ;wî•W^qttìµÜj˜ŸVG}öÙg]]]"##÷îÝËØÀ¢9yòäܹsýýý­­­½¼¼bccüñGz‹RƒAyyyPPã[ci‚XÐk-M „P{{ûºu낃ƒ%IHHÈÎ;éµ%»mkkk²E©zøðá—_~áèèèààþå—_>|øl`i‚¤§§2D*•*ŠÙ³gWTTÐk-A ý¹¯Nécòƽ±±1:::<<¼¨¨¨¨¨(<<<&&¦©©ÉØõÒ#³gÏvssûã?Ø«¸Õ0K­FŒQUUµwïÞ²²²uëÖ%%%}ýõ×d­¥ ²páÂþýû 8uêþ×ÕÉd………ô’ÂÂB™L†?[š Çß¼y3½ä›o¾ùòË/ñgKSC·î«³ú˜¼q5jÔ¡C‡è%‡ŠŽŽ6V} »ép«a ZÝ»wÏÚÚšü ‚9;;ãÏ«Æùóç{÷î]__¯|ü[c‚pw Tã¹çž;x𠺵(;}ûž|òIò¯ªáêêÊ6înnnø³¥ "•J«ªªè%•••±±±ø³¥©¡[÷ÕY}LÞ¸»¹¹•——ÓKÊÊÊ<<<ŒUCÂn:ÜjX‚V»wï'ÿZ² wïÞ=räHddä»ï¾‹—X¦MMM¡¡¡þù'þ—þÖX  !www+++3f\¾|™¬²@5|}}wïÞ=|øp©Tjoosüøq²Ö¡5jÔ?ü@þµ@5’’’|ôèÑúúúúúú#GŽ 8ðý÷ßÇk-M•Æ]Ãó5?5të¾:«Éw±XÜÒÒB/iii¡c®f »ép«aöZݹs§W¯^G%K,S:...®­­ /·L5,X°bÅ ò/ý­±@A&NœxôèÑææfœ³ëæævþüy¼ÊÕ°±±qvvþöÛo++++++¿ùæggçcÇŽáµ(!''ÇÇǧµµ•,±@5ÚÛÛ'MšDÿœNš4‰dfZš QQQ[·n¥—|ûí·ž¯ù©¡[÷ÕY}L¾s*`***&Ož¼aƨ¨(c×ÅÈàïvEEÅöíÛóòò’““]#£±oß¾¼¼¼%K–»"|aß¾}QQQ‰¤[·n‹-JJJJLL4v¥ŒF{{ûÇü /¸ºººººþóŸÿüðÃß{ï=c×Ëø|öÙg¯¼òŠ•••±+bL>úè£sçÎíÙ³§¦¦¦¦¦fÏž=çÎ[³f±ëe’’’Þ|óÍÔÔÔêêêêêê-[¶¼ýöÛB!xHc ÕÃ0¿W0šÃ¾|–öºŠpëÖ­°°°ŒŒ Ær‹„••åããƒ?[ 7oÞ¤— ËN•aP^^ngg‡?[ ì·ÿ¶¶¶ø³ ‚©ªªR(wîÜ¡Z ~~~¿ÿþ;½ä÷ß÷÷÷ÇŸ-PÇ5ÊÎÎN*•:tçΫ†nÝWgõ1ù§¥àààììlzINNNŸ>}ŒUã­†¹juûöí±cÇ®Y³&&&†±Ê2¡0`@ee%þljäççûùù1†-',PJ*±ÊÕæ^ki‚`6nÜøÌ3Ï( z¡ªQZZ:`ÀzÉ€JKKñg dĈYYYMMMÇwppxòÉ'ñ* TƒAWè¬>&oÜ'L˜ššJ/IMM8q¢±êc\¸Õ0K­*++ÇŒ“’’Í^k‚08qâDïÞ½ñg Tƒ#R‚,RiiiC‡ÅŸ-PÉ“'ÿöÛoô’ýû÷8¶@AB­­­6lxýõ×Ë-PîÝ»Ÿ={–^rêÔ)üÙa°~ýúyóæáÏ FWè´>š¼à3õõõþþþÉÉÉ8 måʕƮ—!`_>n5ÌR«þýûïØ±CÝZKdôèÑ{÷î­¨¨hii¹uëÖ·ß~ëííýÛo¿áµ–¦†Jèo¥ ½k×®²²²–––‚‚‚ääd—³gÏâµ–¦†R©lnn2dÈÖ­[«ªªªªª6oÞìì윕•…×Z  J¥rûöíqqqì卯ºuë|}}þùçÚÚZœãÞ­[·/¾ø¯µ@AÆîܹ–––üüüùóç/X°€¬²45të¾:«Éw¥RYXX8iÒ$™L&“É&MšÄHi5?¸À¸Õ0?­TªQ[[K6°(A²²²¦L™âììleeåééòäIz‹RC%Œ\‹$33sòäɸyx{{Ïž=ûÊ•+ô¥æöíÛ3gÎtrr²±±yòÉ'ýd,PÁƒïß¿_å* T#---22ÒÑÑÑÑÑqðàÁ;wî¤×Zš ?üðCŸ>}¬­­{÷îýé§Ÿ>|ø^k jèÏ}uJºªÀL>Ç,0î`€qŒ;˜`ÜÀã&w0À¸€ ÆL0î`€qŒ;˜`ÜÀã&w0À¸€ ÆL0î`€qŒ;˜`ÜÀã&w0À¸€ ÆL0î`èݸÇÇÇËår¹\_RR¢nË£G>ûì³®®®‘‘‘{÷îel `¡çº_ЯqollŒŽŽ/***** ‰‰ijjR¹ñˆ#ªªªöîÝ[VV¶nݺ¤¤¤¯¿þš±òqôZyà½Úßµkמ={vÛ¶mdɬY³ ´páBöÆo¿ýö‡~Hâè999S¦L¹qãÆÿê*Ðom€·è7âþË/¿$$$ÐKöíÛ§rã>úˆÎ~éÑ£G^ Xú5îyyyaaaô’¾}û^ºtI“}8ÂXèáá!‹===gΜyåÊUø~{mm­B¡ —8;;×ÔÔt¸cMMÍÒ¥K?ýôSzáĉwíÚÕÐÐpúôéŽ1âÂ… :®1ð¥>‹Å---ô’––kkkî½Êˡž••ŽÙúõëŸzê©ë ‰Œ­1`AthPµC¿Ý=ÝÝÝsrrÜÝÝÉ’òòòþýû—••©Û¥´´tüøñŸ|òILL wáÜ›A—VHAjЀ‚RЀ‚Ô €4úSC¿©2ÁÁÁÙÙÙô’œœœ>}ú¨ÛþöíÛcÇŽ]³fM‡®!í°ôkÜ'L˜ššJ/IMM8q¢Ê+++ÇŒ“’’­IáiiiC‡ÕA-€÷è÷½FCCCXXØÜ¹s_~ùe„Ðúõë7oÞœmgg÷÷á©W áááï¼óÎsÏ=§²¨˜˜˜—_~yذaÎÎηnÝÚ±cÇÚµk:Î]xwC)h@ PƒR@ PƒRЀ‚ÆTSed2YVVÖéÓ§}}}}}}Ïœ9“™™I\;ƒóçÏOŸ>]ð8wïÞÅk—.]º}ûö[[Û¨¨¨+W®?~¼C׿ù?Á# ¤ 5h@ HA)h@ HAj@ S¸¦‹\.¿}û¶±kü w â…^0vx¨Aj]^ÐÞÞŽjhhÈÌÌ4v]x4 HAj@ Ã`þï5àÝ š“››jìZŸ¶¶6±XŒJHHغu«±«c| a@ PƒRÐèÏ|š¿©ãÐYZ[[­­­BO<ñÄ¥K—Œ]SrÜŽ¨/7p5BüñGxx¸D"Á ÿšZT[ßgj¢J¼§Ê „Z[[[€ÆÝ¬P²èJi:ô‚/½ôRrrò½{÷p•ÿÀ7Èw“8xÀè€q7ŒeŽéã^¹re̘1"‘Hå¿–<¢˜ Ç7vxñë`Ü1Ð0  ¨A) wó‡Î]inn~íµ×ÜÝÝɆ††wÞy'((ÈÖÖÖÁÁ!..nÿþýd/:åF%/^;v¬‹‹ËË/¿ÜÔÔ¤ò¸> …¤4ò/ÞàÈ‘#ƒ ’H$~~~ß|ó ]»ÂÜÛ?|øpåÊ•~~~666={öüâ‹/èÚÍ™3ÇÓÓÓÆÆ&,,lçΖÉ}Ž Ô‰‰}‘=zôh\à‚ šššZqœBii髯¾*“Éüýýßyçû÷ï««  Æ 3vxyÔ|øð¡qk a@ PƒR0î–Åÿýßÿ 2äúõëä®ÌQaîí_yå•æææŒŒŒšššM›6­]»–¸óâââ!C†ž8q¢¾¾þ?ÿùÏ?üÐa™ž#·˜4×®]=zôÓO?]PP——2oÞGšˆéîî^PP@¯ÂÎ[“Shnn^¾|y¯^½¤R)þþŠD"Fù,[¶L/?"Ú²lÙ²ëlxrrrŒ]^P[[‹/“»»»±ë  a@ PƒRÐ ½™OóF[TÄ]å™Ò÷––<© ¡°°ð_ÿú×Áƒýüü"##'Mš4qâD’àÎ-••Ucc£D"!Kš››mmm•‰¸ÛØØ´´´ÐÅ …BœV«²ÂÜÛãìy•§/‹ëëë‰åÕ°Lîsd ‰˜ŠÆq ‹-ºråÊ|гgO;;»û÷ïK¥R¶Úꀈ»&ÔÕÕáH³…S[[«P(B®®®•••Æ®Žñ†A)h@ HA0iwÚ¸«“âÁƒW®\ù믿¾þúëÐÐPÜ;³Cé<<ÇýâÅ‹žžž[¶l©®®nllÌÈÈ7nG…;»=YXTTäååµ|ùòÂÂÂû÷ïÿù矓&Mê°LîsÔ\L²ËÕ«WÝÝÝׯ__QQQQQñå—_Μ9“û‘…3f̘9sfYYYEEÅG}ôÌ3ÏpïZSQQïDüµ IDATr¹ÜØu01ôwS6æÍ¾¡¡!00påÊ•555555+W® ³i²A5êøñã÷îÝ;uêTXXئM›49ŠåíŒûï¿ÿïìì,‘Hzôè±xñâ»wïâU ÂÓ$©;(’ÜÖÖV¡PÌ›7ïÞ½{5îJ¥òüùócÇŽ•ÉdR©tÔ¨QÜgÔ©íé…………3gÎtuu‹ÅýúõÛ¹sg‡erŸ#1é]Ο?+•J Åüùó+++mll49…;wîÌœ9S¡P8::¾ð `ÜuαcÇŒ]^P^^Ž»½½½±ë øß0ÚÚÚΜ9sîÜ9}ˆÿRPƒRÐèï¦l̼صkמ={–N<˜5kÖ Aƒ.\ÈÞøí·ßþðÃɈ‡999S¦LÁã{p¹¿ÏIOOûí·/\¸`ìŠÀÿ(++óòòBÙÚÚâ‡U€çà<¥R)Ç$qóÌqÿå—_è% êR?úè#zœò=z”””è·~ &MštìØ±úúúêêêŸ~úéÅ_dŒUF‡Ür ÇÝTÀ—¬µµÕØ@XñØyyyaaaô’¾}û^ºtI“}8¢Ÿz€~™={vbbbnnîÇCBBV­Z5kÖ,cW fN59𕽒Øóñ`3âNÆ &8;;×ÔÔt¸cMMÍÒ¥K?ýôS½U ôH||üüQ__ïÞ½¿þú \;¯8~ü¸±«À â΀ÿ ƒ\²¶¶6½ˆÿRPƒRÓ²¢¢bòäÉ6lˆŠŠÒp*’’’èF–››[WWGþ¥WÑŸëêêrssU®‚ (Á J6l˜ÑëÀ‡TFÜMî,tX ?Ï‚÷#GŽèµä;ÂO \°aÃŒ^ž”ààà`ô:¾„¤¤$•&é cvÜtwwÏÉÉqww'KÊËËû÷ï_VV¦n—ÒÒÒñãÇòÉ'111:§t–›7o’iÂÚÛÛ!õ‚ÿTUU¹¹¹!„jkk]°h̳sjpppvv6½$''§OŸ>ê¶¿}ûöرc׬Y£¹k´€´C¶ŒI@\ôO3ƘÆ}„ ©©©ô’ÔÔÔ‰'ªÜ¸²²r̘1)))ÑÑÑ©B¿ý@ PƒR`èXQ{{{VVÖêÕ«O:eÄ*þ7 rɸg¼î:ü—€Â0Ӹϛ7ïĉ«V­ª­­­­­MNN>yòäܹsÉôËÙ1cÆ,Y²dܸqƨ©™P\\lì*ðPƒÔ €FÄ}ÿþý‰‰‰tò´¥Áÿ†A.™¾;§ò_ Cj@ Ã`Lã.“ɲ²²NŸ>íëëëëë{æÌ™ÌÌL;;;•Ÿ?~úôéŒÜÿ»wï¸Î&Mhh¨±«À#@ PƒR`wl -9g†ÿ Ã`©2ü—€Â0sw„ŸŸßž={Ô­¥ïÐÁÀ`0"î`Üù¹:úN•Àˆ˜Þp€¾Qqøð¡ñjttNKŒ»“#Ѐ4 ¤À@Äÿ†ÁŒ;ÿ¥0$ ¤0 FN• ™5@ Æãh¨ÆîÝ»óóóããã{ôè¡ï* h:âþðáCü¯%wþ7 ƒ*Ã) ¨A) DÜД͛7'&&^ºtÉØô¤Ê˜ä± Re€›¤¤¤iÓ¦ååå»"ÚÆMÁÃÌYrØÕrP™*ƒðÈq ÉÈÈØµkWEE…±+¢ `Ü-ˆÜÜ\cWG€4ª®æmÜ¡a` Çÿ†Á"îü—€’ßËLô"ä¸[Ý»w7vx¨A£¡†4îÛ¶mS¦L‘J¥8†‘ãŽ/º¾göá3üo‹¸ëDІ††¶¶6™LfeeÚ>„ÿ Ã`˜&mÜ!ânA888» <Ô ÑP C÷7ÞxcÖ¬Y5558 4 LÀÄ€ÿ Ã`Su"ÅØ±c …ŒCÂÿ†a0LH “~{ ÆMÁWÃ$:?xð™ì«@+¯T*!ÇÿKf/FðZ`Lº¿w4ÅQ 54ÑV3€Vž¤Ê˜è›e Á´:§‚qŒDÜÓÀ ^JêPƒFC5 oÜ _‡†a¤ÊÀ8îüoK•щ÷ïßGfÑ¢øß0 † I9î€i“#Ѐ4ªa0ãÞÒÒb,§ £Ê0àÃ0ب2:‘Âl"îüoĤ€T,ƒw|S7̱•ÀL&¤Ê€†@Ä‹ÀwüŒ»±P9¤‰Þç¸)**0`ÀäÉ“]‘®b°TX#bÒ?hz7îÅÅÅñññr¹\.—ÇÇÇ—””pl|îܹW^yÅÑÑQ °× Xè­Öæ‰ åŸPƒ†o9îF4îÐ00–“*ÓÜÜ|öìÙœœîÍøß0 q×PŠ%K–îØ±CåZœãnwþ7 ƒaBR@ªŒZ£££ÃÃÃ‹ŠŠŠŠŠÂÃÃcbbšššÔm?{öl77·?þøCÝÊÇÑO­ÍÊ?3  ßrܘ* c9S5Œ½ñ¿að-ǽ²²²  àîÝ»*ךÍx¯üo -Z$‘H6lØ ó’MH “UF¿3–mÚ´)22réÒ¥øß¥K—^¾|ù믿^¸p¡ÊíóòòôZº‚ÁÆq'ÆžÏ#ânÒ÷9nÌæeù²ðdwŽ'¢ÖÖV3ÜDill|ðàIäSéüTüòË/ ô’„„„}ûöéõ è ƒYrS1ÑV3@eÄÝ,/‡ÙœßrÜ9Œ»©÷>¿uëVbbâºuëŒ]mÀšãT%ÞR]]÷ì³Ïª\{þüù¸¸¸7ß|SëòMúq]¿Æ=///,,Œ^Ò·oßK—.i] ‡‡‡X,öôôœ9sæ•+Wº\AË¢®®ÎØUà †j,/8ÃGÜ¡a`,'Ç]ÃT}4 ¥R9`À€ÐÐPÄȹSe.\¸ P(FŽÙõi(Ç‘©¿R»}ûöêÕ«7oÞŒLðkN.Ñ¡MMMGŽQ¹¶¢¢"##ãÔ©SZ—ßaĽ¡¡a×®]ÔúúC¿Æ½¶¶V¡PÐKœkjj´+mâĉ»víjhh8}úôÀGŒqáÂ]TÓR(..6vx„ÑÕøúë¯_z饮üôè Õ°„w£7 ž r8H³4îFÜõÑ0ÚÛÛÏž={ñâEŽ®_šÃÝ9µµµµ¶¶Vëû/†Rp<‘p¯‰¶(:„ar¿¸Úú0î:”‚ÛXãÊwå-Y‡÷²’’’iÓ¦½öÚkZB˜Òpûöí‹ŠŠ’H$ݺu[´hQRRRbb¢&;²‡£IIItèÜÜ\úa‘^E®««ËÍÍU¹Šÿ%„††½ü)!44Ô¸uÈÈÈøê«¯.\¸À%G ôd‡z½šgÏžÅÚÛÛ Ü¢È×Ä„ZujjjFFFyy¹ë@ßÒÈp555|ÖA»Î;‡4hÕô.ºªùðáÃ]<‹ãÇãNû'R^[__ßõ³ ßîˆqg—@\ãÍ›7ùÖ4)<44”‡­š£üð†/në€ÿštå,°¶tÒ½Ymm-¢Œ»gÁÇ]y6ëð,’’’TšL¤?”úÄÍÍ­¼¼œ^RVVæááÑ᎚T¬¼¼ÜÎÎN'E€áyæ™gB[·n5vE:““BèÓO?Õ÷È ÊS§NéûXfÀsÏ=‡úî»ïtXæèÛU\\B(>>^‡‡à §OŸF988àX™™™ƒNLLÄÿ’Às~~~× ?qâ.íÅ_d¯ýóÏ?B=zôèú47Ëäädö*’1ûã?¬>:$++ !Ô§OcWDfΜ‰zõÕW].p qttT¹655!®uùb±!´nÝ:uœ9s!äçç§õ!ôg>õqÎÎΦ—äääôéÓG'…+M370¦8L‡%ŒãnŠèc@^帧§§'&&fddè£p¥;§Þ¾}û¯¿þ"ã§= *ƒ×rRUM:§677gdd;vÌ`µÒ ¦øëMÀÕæIfupÿ¦áÊwå;ÛaŽ;þ¦ð³Ïº~û„ ðƒ!55uâĉ:)<--mèС:)ÊBP79ÂÍ›7 Lô7HkŒ>U¯~úù6“û®½ah¾"ºP©*ÇÝX·±#Gެ^½úèÑ£º-¶¤¤¤  @Ã|Yu £¨¨èâÅ‹t XÆ{÷îÑÿ"ƒw6 ¿#š÷ªªª¸¸¸iÓ¦u½V†„Îq7¹_ ýå¸ëP ã®ÉÄ|ž¡I¿Æ}Þ¼y'NœXµjUmmmmmmrròÉ“'çÎK6Ð< (&&f÷îÝååå­­­………«V­zÿý÷?øàýTÜuêÔ©S§z™³ÔX4…U¿p8<`À‘´ÇÛZ]]}Î9çŒ3fË–-ž$˜¼õO±Ú‘èúÓ¶zx¤ŸÏ’fKãžžNôÊ+¯¬ZµjÆŒgœq|“"r&›ànbÜQ<“Œ¥M*ì¼¼¼¤¤äÇ?þ±6?Ú.|¤3îýYGÓRǸ{h)eܱ•Ê5¥H5÷Ãú¦˜ÐÂápL±W\ AåIjž˜¸kK#Ö¯ü‚Ki .0 ºó>Ô¸÷yÃHÀÒÜÓSrTN㎠Lfj4FjLƒ—BàŽïØÑÑáši³a´èÜCàΊ”ògX*Cäç1RÜ=, ;Ÿø9gÜw «¹¿ñ»J©“O>Y~‰ÜŒW ´6w-p×–F:­_Ie\JÃEè•õ!ãÞç #ûŒmN5÷1îXnöôM £ÿ0î˜Zª¥2¬(àÝãîŸ%©Ìç1RÜ=, (aÓtú¨Æý¨yiý¸çääÈ/]ÖŒâ²~E$ƒi»¶4ÒiýjÄr)t÷>Ô¸÷yÃHÀ>c›S¡ö)LÑ É:ú@SÃð¸YQeXQØw»T¦_ñîF‡¹#Îc¤NãîaQØ{¥t&v¸Ž ]g?îZsd›Ü­ ʯÖO숱>'ÀýH´T3î(¨KO¿–£rŠw6áI¬ãÂPŒ]]] ¤-Ž{4õÜÚ»öqL*Ó¯Æ ëW´K¼viÜ•µý¤T*c÷9K—.ÍËË»þúëË@’v¸{lýY㮵IeúÕñXýp.¡úå҄ݰөq?‚ʧí3ƸCíÓg¥¨³€gHÒÆ¥qÇË@ÔÎþMÒ05 ã®R@a$ø¡øˆóÞÔŽàŽÍ©Ješ››+++«ªªË@’v¸{lØÈú¿« ‡#¤H*Ó¯P²–qïóS3úãîR.,…WÖ‡Œ{Ÿ7Œ,ô> ibÜ=wªlÂc/@Sà ã®zDíÞjÜÑ,wå…Ì… ¸[ViŽtàN[NŸ{Œ’’’@ °{÷nÇëS'•ñ°(ì½2É“SÝwSË„ïq«Fší(pOкººÀ3Ï<þïÏwíá)’Êô+G¬eÜûüÔŒ~5b¹”†çs<‹õ pýõ× >ú裴=Ñ+KpO§T&ÕQe¢Ñ(ÛUi;SI@ã®z´1ÞJe윺#©T[[[YYi?…©m|†£Êô«˜üq¿ßÿÁ8^/÷>ø ??ÿ¶ÛnK2'žÀ¤¬í' Œ»éGûimmm~¿ÿÖ[oeß÷sûúõësss/ºè"ü†¡± ̘1cÁ‚ ?¢®!öO©L¿bÜMV___TTT ¤2/¼ðBQQÑž={äO}rß¾}%%%ëׯOÛ½2SXdŒIe¼ k7Éa§bÓO’¼ð¸{Ç]›GÆ}æÌ™yyy‹-r®]*cîG„”Ö¯†9ÈFmmm\×Sà~øðá²²2zäYŸ›'Šk™Ë’xÂá ûVnt¸'h&,ØÏ5î]]] 555ø Ów®_¿¾¸¸¸¼¼<áG`sß¿ÿ¢E‹úÙÕ;ꡚ&j]ÿâÅ‹ý~ÿâŋӜSiP*×sàîNÈ¥Ç`<«®®NÛ½2ÓæÔÛn»-77÷ÙgŸM MíæÔ4¸5&¢Kãnolv{¼Àiܽ•ÊØwàWQ$Ç]Ör?ÁŽF½wŸ%ñwÉ{µdçaQ¸„ƒL©ÆÃlhW}2îiµêêê@ ðâ‹/&™Ž‰qïÏR™)S¦@®è²,ëIöE¦4PtÇLmmmaaáåg?ûY^^ÞÂ… í—»¡Ë|ý„q7•uèö10Óx¯ú”q÷B¥ÙìŒ{bÝ™1îi‹*“6Æ=^©Œ¶$ Üñ®#‹qgE‘À¼1&pï‡Û%©ÑžåíP‚é744444¸”@ÂÀñw¦gUVV–””lÞ¼9fÊ…½WJæ1.K¸#^ê“U—>î{öì™>}úˆ#FŒ1}úô½{÷Z.^·nÝÍ7ß)**zë­·bæ‡uÑñãÇ{˜ Ç¥|èätY£Ÿ0î¦Òè+{’§Ð'fé Uî­Õ¸'`ñ2îÚ>â•TÆ“W³ï°Â_ݣʘ†cV wGÆ—zú›ÑlkÆúõëÀÚµk“L߸+g™»‰q7µaw7âá¨jï•Z/‘@âI2îêsÜçÍ›7yòäY³f5jÔ¨Q³fÍ:ï¼óžzê)Óõ›6mºûî»Ç—ÌC¡Â:::âu”¬eËJ-+++))9pàü/pGE¸ÄµJñ½š¤2InÖV:àÞÜÜ ^x8¯^½º°°Ð&HÏÒ6oÞìóùN?ýô„³á¸° • …¬EBýM㎳‹p8œ"Æ][hŽ$¨·ÏêèèHÛ½2BòŠqÇ>›ÔÜS͸÷¡ÆÝ“vîȸ»÷P(äóù†곘:²e²'Ë\ ÜUZš\ÓA½úê«~¿ÿÿøGbé'Ü\W*ãu—õ9ãn¢üØ—}"sïKà¾xñâk¯½–~síµ×Æu`[†›JãÕ²¶++•]ã®t}Ï"¶ØªU«ü~ÿœ9sä[(³TÆ«¨2J×ñäž˜ä žb™õÚ»ô½dÆÎ¸¤2’qߺukAAÁÍ7ß ƒkÿîܤ”q¯­­ ¸™Ûóg¹Øg5ªŒ'÷ϰTÆe7Y¼Ñ3 ¼eÜí¡‹T]tÌ ÷Ê’0ãÎÞÈ“9‰‡›SÑie¥¬(\€ûáÇÀßÿþw–‡Äw˜çÇ :£ÙÆÒX°`ÁÿøGX²ƒ pµ9áô]:¯}¥År½#ãî¾QØÃ˜,à ®¬’î.ŒûQ©L/khhÈÍͥߌ=Z+òöÐìþÈb¬íJ·Â.HL*£t2÷Ĥ2„qçÎøÍ”)SbJe<Œ*#ûFê€{Œ;=*\-VÖþð‡‚‚‚¥K—ºgÑ41îxjU_wûLª7ãîmT .±Yö!ãFû*:o–6Æ= º…><9Õžþ”)Süq¿ß¿eËü)ƒ${¤2‰1îÚÒñ&2Ü{ƒSLÆÝ­***ü~ÿþðË‹¤Ô踉¥qÝu×Íœ9sãÆ*½À=Þé_bw—QÉØ,½²««+É“.“׸~¥2i3±[n¹¾|衇èì°¢¢‚F2¢?Ágdv+**”®RaQ «³¦¦¥©555A ìA˜wö65S ì-¸766>|˜½…RjëÖ­ð9Pp4ø,Y1ó°oß>ø ûFyy9>Ôñ-bæëÅ”žµo}ÅÍ+W®,))Ù¾}»cTO1îØ±Ãþà()%- §yû÷ïÇÔâ*íOɧPYY º»»Y…&Ÿ®ƒá}$I]9\~ùåcÇŽýä“Oh~TOy[’)M®áÐp+ŒqÇxG©.Äv¸_Hõn*^•$¶gŒ£‡í)¼üòË@`ëÖ­˜9Ͱ§€Î°®®®©©I ¦.I­dSŒ»¶$!ìø­­­1ó€“:Vø}SSÓ§Ÿ~НYZZŠyhll„Ì«0¿ÍòA ¼mq¥Àæ|Y^^Ž‹Û---‰åaÕªUøú1S` $æ[ £ ƒðrgg§¶ØÂ]z¼œœÑáe”X‘úÌC(*))Y¶l{#eè¶Ì?ЃÌ%` ƒwß}·Og*uí;;î¸ã8@¿©©©9þøãcÞW¶ÙÅÿó?ÿƒ•ážH4ýÅ/~¡”ºæškàßââbH_aòäÉJ©»ï¾¾¿ì²Ë”RßúÖ·ÓǸ(óçÏg?A0øãŽ;.® _}õÕòMÿ÷ÿ¾œ;w.|óÜsÏÁ7ï¾ûn4=í´Ó”RßùÎwâzµ;ï¼¼í¶ÛàÃí·ß?½ýöÛðÍîÝ»NŸÙƒ>¨”ºà‚ L¬_¿ÛóÎ IDATú‹_üÂtÍK/½¤”;v,ü UùÔSO¹gãË_þ²Rêþûï·_öûßÿ^)5`À€h4:xð`¥Ô-·ÜF—,Y¢”:ûì³úÓŸ*¥¦Nêþè”Ú?ÿùO(½ýû÷c¬Òk¯½Ö“Ä¿ð…/(¥üñh4 êvìþ'Ÿ|2<ë¯ý«'ÏÒÚ„ ”RË–-ƒï½÷^xhuuuêš ;öØc•Rßþö·Ù÷ßøÆ7 '&æc=†ÃÄC=4zôh¥Ô±ÇëE~m†®ýF4=æ˜c”RS¦LñðA|ð<¨  >,_¾Ü~Ë\ ”zöÙgñ›7Þxî½âŠ+\zûí·Ãõ×]w]4}ÿý÷áßÁƒ'ó.`óçχÔ|>ŸüõÙgŸ…__zé%K"@šþüç?‡‹ßÿý˜Ï=óÌ3•RÓ¦McßÃvÿÉ“'G£Ñ5kÖ(¥rrrà'èz0D‡ªª*z/\¯”ª­­•O„ÀÎ9眘yK‘]wÝu½¦¦&ü233S)5sæÌh4ú³ŸýL)uî¹ç&–>†ÆÞºukGGG}}}{{»éb,Ì>øÀ%qŒýòÚk¯Á7wÜq‡RjôèÑÚëgΜ©­ß”Úo~óÈäÚµkÙO4xÎŽ;´·×××ïܹ³¾¾>wI»ŒøJ©«®ºÊ”<µwïÞ½òWTu~øá‡¦TÊv_2îãÆÛ°aý¦¼¼üì³ÏNéC–ʤhsê+¯¼êêê$ãnz´£áy¥¨–©¨¨ÀDpκ¨2rÆÜ¯¤2tÆŒ{´‡‘bË.—Æ=‰ dœjc¢ÑhL©ÌM7Ý”ŸŸŸp”1“ÑÒ FWlS¤q§±Y¦G*OÁ•–¾Ýo”Œ%#•illôûý¿þõ¯Ù÷ŸC©Œ½±¡ÿ¤|^ÿÔ¸£'ÑþšüæTæ.L#ÝÁäIjÜŠ¥¡5šŒf›Ñðð¯W›S»»»Ÿ|òÉÜÜÜY³f™.ŽWp%[Wá MãHfèpoÊóƒ>˜——÷È#¨žVG›½‡÷ÏTfÚ´iȀ͟?g9)2)òŽëF©YnNõ<ªŒ‹kNçæTÓ€œ®›Sa`Ž«ìŽïþûï÷ûýUUUèq‚Á îØZbÖõæÍ›ËÊÊp}Ù+£¥A-¥›SéˆÞ¯€{ˆ‡óóóÏ;HΪvîÍÍÍ@éX´¨.dÌꨪª:묳’‘ºöÛ8îè?SܽոkŒz·9•¹ —Í© ¸'Uè­tn€aFÛ ”ÊÉиwttTVVVWWã7iÄœµzܓߜjG0ËtÚ¸Žg‚¨FvK‰Ù¯Áç~î6§Þxã+W®œ={6í{ÿý÷¯^½ú†nÀ R!êoŒ;º3LÇU¦³³³°°4.†ÀAmNNŽîlÐò0¤%ªŒ‡›/ÝwöR999øY Üãʤq/..µµµ&àŽ›S£±ÂA&¶üÓhiPÓnNõ¸Óa) ±è[6ÜñYýqooo/++[³fK]Ûw{ ¦QY˸ǬúÖÖÖO?ý´¬¬,fžMÖ‡'§ÚÓGÿIÑXÂá SÜi"2?nNeî¸ïÝÝÝPI2îÜMeÞÕÕÕÐÐÀ1‹îF³ ¥ß˯ãȸ¯\¹2//ï?øL?.àïìѸ»:¦qÄÑŠ‹‹ý~ÿ;ï¼£²¢Fsbzeà¶h4åÐê¨eÜõ6|øð÷Þ{oÍš5§œrÊ)§œ²víÚ¥K—:Ôt=•ü',ÿ÷*ª ¦³jÕªÂÂÂW^y%IànaÜñš¢¢"”‰Û-Ú£ëR½[6~¶KeŸÿü2î}bžÇqÇ8eZÆ=&Ä‘Œ»}EÝnßc³£0i÷p8ì®f3™lîòƒ'À½®®nÞ¼y›6mRnwöR¦˜dIƒvew|”qgºjÇ=&ãî¡mmm-)))))ѦIgªr&öôÓOû|¾ÿüÏÿLìÑô]XËìàžŒ/vÜìnòlc‹™èpwø×Ú*¥hä´%K–,_¾|Ù²eJ©ï~÷»C† Y´hH%ñ˺vß2îè?=îèäOJ©ÓN;ÍçóÑ€ñ.fbÜ—.]ZRRâ8d.H˸Çukœ&Æ`2Ré$~øá¢¢¢xÙ:‹QÅB-G£QÄ*–Ìݤú ÀÝ>¸(ï4îsy=[„±X’0á2…²Ú‚b.ÅÜ]ºüÑ8îýÈ$åìh̰ € ¸' •‘ÝÃ…qŸ={6=3ˆâ{¼}Ê”)øY2îápX™ ˜ËÉ©žhÜ+++oºé¦E‹©¤`¢Àý¬‡wt‹˜OãSãî¹ffíC©g—žšYžËĸ+·ÍCÉ›‰qOàPÂëUÞ0WX3gÎ9r$ÂcfgÜÓ©qÇt´Àý½÷Þc¹­¯¯ÏÍÍÍÍÍÅ—K…)j .À}óæÍùùù?úÑ9À.EŒ;ý …`rkÈÏÏ¿ôÒKÙ÷l?1~fÞɸÛ.íL&fT»XmYUJ½òÊ+gS[°àyLíAv‡ä )f4ÿP4qê-í2wM)ãŽíDv1 }ãRzIÀ”ãn*`Ü™T&®E¶þ|rjKeÒožkÜ‘ d$,•1 UÁLŒû'Ÿ|RRRòÃþþ¥4‰ô_Ê0(º B‹/®©©™6mÚ‰'ž¨½À¸'Ƹ×ÖÖîÝ»÷¤“N3fŒê ’ µ ÍñjÜcÜ]4‚îŒ{:7§bSѦI¼tvIÆv ã«‰qOéæÔA㞀T&uŒ;¦ÙÒÒÒÔÔ¤m."c“Q²ö (ùŒŒŒp8Œ-3&<µ÷Ý»wC„+ŠYéáG[z¡$7™U Dhjj*++c À]«H´X\ÀÝä'[[[ËÊÊ ²¾6qö™5NÏ¥2&§DÛ í¢…{î¹OëK€q—H×sà.³ÍfJŽŒ»·ÀÝÞW­Zõ£ýè¼óΓ@Ÿ>N {=¦V*SVV‚` ÜMÚ­|(¼éUfÁ‚3fÌxæ™gØã”!$jÜ¡]Øüùóóóó~øaúpO`sjòŒ;¶¥æææ?ýéOÿýßÿ}ûí·Ã7Ï>ûlQQQMM Kª?3îŽøµ¶¶¶¬¬¬ªª þ¥Œ»;p×Êp§Œ»Ô¸[âx÷ä;sûC°oè½o¼ñÆ©§ž:cÆ ùP p—îÑθ+Ñ´RYžIJe 6åìÚq×Olæ#/ߨwY­©Ê˜òoê•@[ ¢uîv¦²Šå¨ac–×ÛçB °à¾öïß/’ë™ ,8ãŒ3¾õ­oÙ÷p8üÉ'Ÿüò—¿L^*“0ã^WW×ÐÐÐÕÕeli°ÏpgŒ»{é3_€LR°w»Æ]õ ulwëZZÏØÔÔäȸÇ$§-Åeé&àîxêcÜRWãN…ª”qÇ>O+Ԯ퉹ëËθS¾$æé†ît2š#p…BðYÛxBV© Üâ¨öc« ¥“qgÀ]2î˜^óè£ʵxOÁc=ö“ŸüD.ÒQšeØŽ‹qþùçóóóïºë.ø—jÜMD€%5¼¬³³“ñǸ#ã¾nݺÂÂÂ_|Q¦p‹q·AšõŸgµyƒ/·nÝ*§¬²´Œ;V±qW¢½içRxwù,Y;Ú%µîîî¸wÓlJû“6?©`Üé¸ C‰‰qg™|æ™g(m“bóqÇtRGUp˜ÕÕÕ,KÿûßgΜÉîZ±b¤›wø0gκ½Íθ›6§º,âiwÄ*Ž“¥Ù縛¶È˜Œáò˜Œ;˜;p·L!XÛ‚¾¡îŒ2‡enLyÏž=²½Òo\w&•ùøã¯»î:ªwt‘ÊØû–-[JJJäd1îlâ/ã¾gÏvo4F£Øçé\ÈÜc ¸Â¸[æoô-,͵¾¾þÛßþöäÉ“1)x–éÚ5`û vZJe::: ñÇ\Ù×¾« ‰’îÚ)ô­·Þê÷ûi›Ái’dÜñEðéÈCKhÆ…âu´’’’çž{Å9i±ÎîÜ(ÂVäÕàÝ–ÊàL¹6ý^¿~}QQÑÂ… e ¦Q¶¹¹Ù´éß…#Œ—q§þÛŒŸÁe­­­R*`‰*“~üxÙÚè-Lã>gΜ¢¢"Í Á=ÞµuëÖgŸ}~RºQPv<6r0àþðüöÚkÚrˆ—q7÷ñãÇãgL*‰ p§-$Æ££S#*•¡ešÛ Åô¡mmmo¾ùæG}ôé§ŸÂ7)bÜQÚä(•ihhðûý¿ûÝïìÀݫͩ¬ºÿú׿êññ)»dÜ!ÛR?à¡Tz“laö,wÄq$žp71îŽR¼LwI6+B³Y€;{Á?þñ'œp^AÍ+;ÅLÔºw¥öA4‹TFö}“pî1÷ââ⢢¢;vÀ—+V¬ðûý@€53Y&P¡2ç¡P¨»»{Æ Lm%‡N5îÏ>ûlAAU÷©Þµ¦-Šä¶sJh>©·dùGà~à 7äçç¯^½Z¾—êÝø½ît”ñœqÇQ*Î]7lØ[ò˜ó¬««ƒLìûvÆ]F(ù¦*¹pZ·€“Š£Œ{:Ìĸ»wÖy˜ ÀŽšãNÛAL© MÐθÃI Zw`gÜá²{ï½·°°†”ÜNÁ½…q§¤ }#ÜMª|–¸755ù|¾¬¬¬3fÀ¢¿eT–ïE»;ãn_·¡ež<ãÓ‰ãOü1}VLÆ= 92î€(pwaÜÀ¼yóXOaoä"•yæ™g€ûܧÚ0s;Í|°3îž ¨ìS ¸Û‡ÜqX51îöÔdfðE˜T†¥ƒN@ÏZêK¢î·¿ým~~>žµ‰÷&Üé€/[ˆÖÍÆîÚ»b2î&»v`Ò¸Ï;·°°pÓ¦MìMÓdî°>IŸ …jjj&Nœ8yòdú=«nƸÇî¦V­ˆÃdÍžÈ*ú‘GÉËË£«Ä ˜…–RnŒ»æ´~ÏCàŽÅ"¥2‚_ÆÅJ ÃÄ•sܭΜç¶mÛ0Ê~ØÊ¸kÉMm†±TcnN5•j4Õ.ôI7u”qO¡áh¸—––ÉÀvZ´f™ gIF*ã!p—mQ Üé°GÕ¸Câ´+ÊqB6ñÄ€{¸‡q‡Z© Vkqqñ’%K´ù‘fî’¾òÊ+………}ô»Ýþ-pG¿îœ ?Çœé™ÞùÄm4¦[h÷¸wŠÃ ·v;·ÑRzq÷[n¹Åï÷›$Ë÷Õ"! Ü]wHŠ‘Fèå“dÜ«ªªÞyçØ©,ÕÐ^{íµ_þò—,·hqwxG¯w|¨]*ƒ/ã‡W­Z¶oß^VVFw »l9°8(v,FGÆ]î…paܱ•z¸›¢Êàî,zvO¼K– V(+·P(¤…\ [ÇdÜC½£åX€{4ÕV´¸ïÝ»·²²Rî/Ë,´”꽄žp§™O¸_qÅyyyÛ¶mÃtâ•Ê0ç¶mÛ¶ÌÌÌÓO?Ý”E:w܆΀;®Ï`ß‹q·dX™¥2ZPNÖ -., ÇÉRŠìóÜÝ7§¾ýöÛ………‹/f)°¶«{(Ñ»q׺à9pÇ"•a-ƒâ“TþeR™˜0¡`”¾,EcL0€×¤‚q7M`LqÜelc¨t.`R±÷%K–ø¸¾¾¾¨¨((×[¹reAAÁ¬Y³Tï6Ã@{MʸoÙ²¥¬¬Œ¦tB{êaû$e&¥2Ú±¤[D•‘îÌθ#p§3O¥Ô¡C‡|>ÆG ƒ4«Ú¨2²eR“E¤EB”KÆßÑθ›ÜB¼¶`Á‚K/½”A ;ã^^^þ·¿ý]‰F‹¢®®®°°ð¡‡Ò^£ Œ{*€;ü”$pÿôÓOqS œ7ÆÅ¸K”ÍÁgió†_JIU\R™˜wæH£Êh;¾iL© k!H½‡B!¹è¾ÔùÛw¹šÍ2 ç䔫¬¬„)½tËð¤©lkkk+++cžK³m?€‰ †ec\»’Ö Ã*Òì²òòòÊÊÊÇKànšÛ(¥‚Á`aa!¬Zc‡…kjjÂá°v{ Žªè0±$MŒ;÷˜Œ»¸k_™ñ³ õ)]«c¦õx”«2Õoz,åÀ}Ïž=Ó§O1bĈ#¦OŸŽg_%p±O˜{6Lá MN-&`bÎÅÝ.•¡©i%»Œþ›ãŽˆÈ•R»wï¾ãŽ;è—aAl›†+ Ü-<–©ô˜c¢TÄîÝ»óóó¯ºê*š+HP˸»wy\Ãâ¸Ó‚¥ù¬­­-,,,**RºVTSSSRRúE Ö•n ¤z÷«®º*??_²ûvà~ÓM7áž}HY;C &¥2Z>C2îàÞÐаpá·Þz‹>ˆ!3|qV˜}3¹DÎlé£UïaRÖ‹…qƒÐ0@沪ãbÚjµwZ&nR¨­­-**úóŸÿlJ_«qOxs*^† j£Ê Ià.Á½·¸içqiÜeæÙ5ðýyç‡ß;2î2AO€»‹TF:[6½Ä° ô¡!g©Œ¾(‰°##´RãnL­š^Œ¯¶nݺ¼¼¼¹sçZR/gšößzë­yyy .ÔþŠFÛ¤ý&–ÿT0îös¦áÍÍÍq÷ööö¢¢¢x@‰¬®®V†ÄQ•.)ÃdÜÁyÞ}÷Ý3fÌØ´iž}‰}ßtrª¶…Ø;P¢ lNÕÎ (¾ú,3î­­­S§N4iRUUUUUÕ¤I“.¹ä‰‰Ý/Žö¶¸rØÜË4)—™tdÜ%p·HehC4ñ J´-ºòÈî2÷×^{-ÔÕÕÉ!¿Ù¾}{ccãĉ Fq8¤ýÓ$•qdÜíRx(¦[[[ËÊÊ>ùäYZƦÌ`¨eǤ˜/à R¨w<]™U%z8—Ó Ë(ݪ·T^‘é]^~ùe„Ë ÝÆî(•Y¸paNNθqã6lØ [Jà%€xbݺuW]uÕOúSú Œ¹É€µî´¢¥[Ä>•ã®•Ê Ç/£ÊPîò™"ƶp%Üi!˜ ½Q.ý±Š`Qe’ibܵ€FKeiq0®Œ…uŒ{\RË«Ña‚þj׸[|C!Z¨í¾9•¥ïUÆ…q·¬B`…®Zµêæ›o~á…ð'pk>£Ã=cUïµ;š¾iŒ ¸ÓXa&TjgÜc[`¥ê ÜY!pwdÜ]€» DÂÞ˜â"p§£Œ¥‹¡—–ïK‚¬™É™-cÜ—.]Z\\\SS“q·8S±°5™6§jÇ Ú•bBÿ”Zjû¼yó&Ožî‘ÕxWÏtÄ5µ x#ó^˸ӗ¢»ß º3X‰æ*‘+p7½¾”Ê(¥š››7oÞ\__oaÜå¨ÌšÇž={hu 2cSY6IŽ ÜC,M ®¿þúoûÛðÙ4LÒ¸”–Á5ØœpO’qýõ×ÿô§?)C±laÜC¡P~~~~~¾–ò”@åÞzJTã.;{\w툨eÜqo46?ÙøãeÜMMÎ4wùˆ´…ƒ”Y ÜÙC)Ër…†ZQQñ—¿ü…ž*MY|6'¡ž-3‡;v6ˆzñ IDAT—••Å”ÊТf+çîÀ˰ºº:77Ûžwíi Owp‡½ȸc3–×›ÊJ)ÕÙÙÉ~Æ]™×<•Ž™Â±NHÅ4¦Æ=© ¤fš»šnW±:¦,ÃÚÚZÊú¥ÚR Ü/^|íµ×Òo®½öÚE‹%q¼æ®q71îÌw›wVsi‚.Ó¤ã7»‹5PÔ¸Ãe›6m’½ø€p¨fÈOéáªRžH"‡[Gàn‚쬘×÷H$ÒÖÖfîôF0 Üñö`0“qgÌ+‹Ã¸Ë㎯P__ïóù† ¦¥shR Heèã´M”žd®tZ¬5tÊʬqgõHg/J‡ðטŒ;䳬¬lãÆð“¸[4îp Þî¡T&¾ýöÛÊ0а1†õZ‘H¤¬¬¬¬¬ ‹ÅǘI‰pD"ž_Å/•±0îñJe,t "Œ»\ðQ†©¾)«h²ü©÷@¡œ5î2AO¤2&»65íh4eR,1-OD +TÆ™¥Œ;Ë }x½ñÆ3f̘3gŽdÜá´QŒ\I³Ä*šÊkÃáð{ï½0¶uSù\CC*¶;-Lh,WvàžÆ–d¼Rü©££ƒýŠ›p$pÇ>b‘Ê(rXGwwwÿdܵ]‰*¢Y®&Ožœ››»víZmjž[jû¦M›Î=÷\úÍ„ 6oÞœðÅÇ|VVÖ 'œðÿñ2Ò–ÅÚÛÛ€6E•±3î& î¢q?~üqÇG¡!mˆîRŠnMŒ;ü Œ;æaèСà÷fddÀPÝÕÕ£¾]*ƒ·Óà$ì'»FMwù—•ƒ–qg#Ykk« ¸Ÿ|òÉò{¨áÇ+Q¤HQ¡ˆ ¸»KeìôcÜYRáÞ;„Âd=“Š Ü1'mmm¬ôh‚’q·Heð®;wbj&à.w¶ Á2ìȸã:‘š”qoooÇ<{(•™?þÆ7lØpðàAû ¤õa¢±±‘v¥°•q×b$í¸fbÜ-rfZòÈĸ‡ÃaÐ:Z– ¼µÔ÷†††ÜÜ\úÍèÑ£q‰3Þ‹/¿üòâââ–––5kÖ|õ«_ýú׿ÒgCJ˜1î&®Ôĸ+Ã`’Ê (¹««kÇŽuuuôhC¤-‰‹T†îè—Ù@©L¸‡—`š•2î2⸲òL¸[:ž‹TF2î¬lY'aŒwv{NNŽüœË±ÇË­H0:,±Œ±™ ØhÞLxšùpÇÚ¡çË2~Žw“‡ÂÂG$DGßÈÜ%rÂ7E’ ³IZã/p§Q#áeÀÃ_üû]sssii)Å|&ø·µµŒƒát¢ÑhII‰¸³ ˜¶Ø<ÄÜ)µè ;ÉoN•qÜ%fUVÆ]«¬ Rœ7vwwgžy&ŒûСCñûThܽ•ÊX÷p8,q’#¬p[²dÉ•W^ùè£2Æ©1Y“T†1îl¶Œˆ ‘«v_«h*•AôÌcÜq@§chLàNGRJibš¼1Æ]ÎRêêêèB¨¸k›M¼¥¥…‘ôz;ãÎÞ=§t>P´Šñ0îƒV†ÐpXhÐZ’aÜÝ» ã®Ó޼ÿ~6ýKµIá -ZtÑE 4褓Nºí¶Ûî¾ûîÂÂB÷ÛGŒáóùƒÁÒÒRl»ví‚p"ð ¦@ pûí·SpÆ JôÆ˜á ±)ïÝ»—“¨/Ãv€RŒ¬ÄÒloo¯¨¨À&t$ÞØØHßùH&/#$ØÖÖC5ú5l‹¥¥¥xW[[[”çÅÈŽ‡^µ«««©© Ë• æeaÜà®…ùÁ––ÖWiHÈM–w¦½A*Ž×FàNë‚‘‹ŒqgÞ„½;=[)E uÍ]çþýû±$%p¯¨¨@ž# ÑwÇÏx{4䜞#Ëf}åååø/¼E0|æ™gž~úiè#J©;wVTT@›„†$C/³lKàŽ)€Á±; ¬M%ü;eÜ!ŸwÜqG~~þìÙ³ñ{È椶¶ö¢‹.zúé§©û®­­ÅÊ¢©¾I¢Ùöûý¸aÂNñÎ;ïØ;£ -Çå¯åè®HAN„K§©a}Q‡Œ3OV;!!•QJÕ××WTT¼òÊ+‹-ºçž{ðÌ&h{¬ &- a?UJ1- eÜØŽðšš‰eÑK[#Ú˜Æöeb!€ ¼2ñŒA`À]ëa”@~ÔÏlܸ/À£C!¨2œŸÈENÈ-Íd”íÖWCCCII @ÚaÜèd±,å8SãN‹ú&íwx/¼Pò€•ƒö}s+c*ݰ^QQA3°zõj,ämÛ¶±´]QQA{ê>´R™H$òûßÿ>_vÙe‰…=Œ×R ÜGÅøõÇ3Z=±‹•RÿþïÿNË:¦Á]ƒ ‚£Ñè\€¥â‰'ÊysWW—ßïôÑG>ŒWžyæ™Ê™q§À>tuuá±ÀZàŽ‰cd%6ÂeffŽ?tÁàs³²²è[ÀÚ®¸gee± ÃCGŽibܧL™‚Ðçó±sžñì)ŒÁop­¹««+''ËèJ¥h;|'žx¢~PJehHȃ%ÐêèR†"÷“N: _ PøÈ9f˜mN¥Â̳aÛ'eÁ§L™‚) ùW]]%ÉÞ= ?~À€øúôÝñ³…qD"C† ÁÔX…ž}öÙø/2[~¿ÿúë¯3f ü´oß¾ñãÇC›dëûXhr}‰wL,??>tvvÂÊòý÷߯zjSõÆR]]]´Àg`}hqÁg¬>°3Î8ƒæ$##óŒ¥ %‰ßc¿ÀŸðó¿øE¥Tkk+”üÔÞÞŽuºfÍ;p‡>‹Ù†´Ï)§œ¢¦d*ALA»‚1~üxȧîØ$Ø ²ÔpÜJX*ƒ)0‚Ú6×aÆ!ãm#Ô³óŽ˜Õ;w®^½zË–-ZÆù‡‘#Gb&Mš„? :Ú$æ™iÚO9~¢­}èСZºô_þå_°L¨ŸÄ·À& »˜´‰Ã^…íÛ·Ó©;¾&wX•UÄÇJà>lØ0ôrÍÍÍÀ\(ݺ4zøp8Œç§Â›Ž5 tÆg(aðRÇ7w|YÚM QAE‡Ãa¦DOŽ {̘1¸öŽ©áã¨Ø!Ç øÌXŒñãÇcI*¥N;í4Lá¸ãŽ£)€ë°0î0à‚‚!®ey€ì1r¡  `ÆŒª·_R½¥2ôq¬ÛÊBfÀ=#¸‡¬Ò"‚¾){[[[02db>Ÿ•EG‡˜.ì_ó&;ËíøãÆCÏc·Õ'S Ëklã²êÝMÂáðÔ©SáóóÏ?ŸXØÃx-µÀ"ÊÑoÊËËq¼Oæbe8™Åb4ª7TQªëéàÁƒìÓ¥îPÁ2ToxD;íN2ù/f€j6ØÐȤ2t¬r—ʸ„ƒT=3u †ä³LR–šV*Cu>`Rb¡D½´¶¶jçT‹-ºâŠ+^{í5¥=³ŠÖjÜ¡~e+BÝŽiÍÔ4ÓcÐÍ´9+Â]*#aŠêͿƔʰ ¥ÕŠ+øàƒø múZ{ÂRüpY£ÊÐ/¥Æ= "§ˆdC=z -p×^ ?ÑC´ÝJfXKêÓÄÙ>x%•¹óÎ;O?ýt˜ÖªÞCw •”¸k]«2oN•é0O¢íû&©L¸G ¥UýÑa‚Mbñ¡té…rCŽ–q7e1äLÝ›SMŒ;͆ŠS*c:yJ‘¨2Zá™ ©ÞRV;Òù@QHàöÈ‘#‡ ¦ˆT†wãî許¡ÖUÆäÍì“ÑXè;;;W­Z5mÚ4mÚ´ùóçÓoæÏŸùå—'±RjÁ‚^x¡{f€ë ‡Ã €é,mZàŽ}›îÓw4ãŽMœ®*˜w;˜ƒiËCu ¬?Œ=Z²àx |@àŽÎÎ%¤Òwù,‰;Á´wVÎlS:—§tÀ]Î1”R|ðÁk¯½Æ÷ñvîL=Ù¥ ©zû2Z¡ø¦lMƒe^ :鿇Òn8K@ã®1´ µRÚ/ð3 ¨ÈÈŠ)`N´À,3Uƾ9òÏrîÜ%ãΞŦÓ»¶Š™áOTsÙpÌ–dâðkssóSO=e‘™*pùå—W®\I_V¦ÏÄ-&ÆÝÜåˆ(£Ê@›wö¾Ê0NËpØ×"‘NL9DÉ/5Yþ´kOœ8¿×n_ޏ³Bø ææÔ­[·c, -VÆÞAÛƒ ¸‡tR­kUV;K‡ÎÆ)_&_JnNEÏ#uù4ÛJÜ!t­[£ËÜ{˜ìC‹$z“‰qgQâîàOä0¤zKeèãð)ì¬é¯4Mé| (XŒÚ_ÿú׿úÕ¯”Rƒ ²÷P,Æ]û^Úba¤ 9Ú×dfï˜áÞ›S)p_½zõ믿QÂRg©î7ÞxãÊ•+gÏžÝÐÐÐÐÐpÿý÷¯^½ú†nÀ 芆ýâK.¹ä¥—^:pà@ww÷®]»fÏž}ï½÷±^ކt`VV0î¬yÑT€¥tŒ» v°v€Œ;>Ë…q—YþKé¹΀;äJe,Œ»IãNßBBUpˆZÆ]º°ŽŽŽ­[·–””€0LPÑ-Ž{ÐnáuŒ*ŽiÐñv;ã΀;õeŒqWºXZ¬ÙK±»ºº(Γ3Ÿ$7§ÒâŠÉ¸³EɸKà^SS#O5ŠÉ¸K¶#äææÂ¡°1;mxZàjKÆ~ã ã®zkÄ¡rQta„dCUnŒ{(¢½X;ã¥oçUTlWlVS*£îx—6$“=hÛ˜…q·,ï0â@Û­d†eY1‚F«JwgÜ—,Y2cÆŒGyþeŒ;{:mHôDúƒbjKlÏž=%%%t_˜)ªŒJˆq·D•±¸2šmV\˜ʸËi$õ'J„›Óš–Ž5w–<·³³S;`…{wš½xwí£¸k_ÄÒ騿TšaSƸ?ûì³/¾ø¢R*;;$(E,Œ»?ÐÑÖóí’&‹‹q—|›˜wttlÙ²EÅr’É[jûðáÃß{ï½5kÖœrÊ)§œrÊÚµk—.]JÅCîÏš5ë…^8çœs† rÑE}úé§¥¥¥TtÓ:;;¡Ú233A,E›CWáp8 jwýÀÒ“ŒûóÏ?Ÿ››{õÕW+R»vƵ- Ü%^Ô2îmmm²½²6‘‘‘LT;ãŽ:;;üñ‚‚‚üãª÷DVõöÅÆ™¶^ZZZ´û†!·4ê0- Ü%QÄ€;‡´ÀÝäÁµ_Êw¤ÐSzªéL€q§·Ð>N˸›€;ƒMð™Q&•1 ZàÇ[0> {tccciiiqq1ðдÀp’óhåˆ;ãNY(ú.Æ;w|q*"‡Ä·lÙ(â÷¸ËŠ GóX¤2+V¬øÃþ°fÍz¯e±‰ÒÆ&g)–p’`‹D"XaÁ¸c „B¡o~ó›>Ÿž©92îÔÑÑë=aÜ%- Ü;x0œÃ°Õ9ö:ô]aßu×]Çü¾}û,Óé… н¹ôéô]¤2&Æ=¦T&fTFãA‡-tr,‹‹qÇÏ1;K ž+)0¼8y© Åô'Kƒ·3îô2»TŒw¼eàÀZÆ=;;Ûçó…{Ç µà‡˜<½€JeRĸc9tttÀNÖT÷ÌØ—$g§žzꫯ¾jú•”–‹§NŠ;3ô.Œ»êÖ:¦Æ]¦&û¾}ûZ[[ósî¬À¿Ea1²vÉ`ªªª’A2î ¸¯[·®  àK_úÒÌ™3ã’ÊÐÅDö"tË pg(JšIã®eCáéq1îÚ˜ToD+¡†‰qG³3îJŒð"cüU ܵ¡9ØûjoW½‡Ÿn³Æµ^–TuuõèÑ£iN,Üž2hÜé€D ZxccãìÙ³ß|óÍ… ^qÅtÈd³‘®®®h4*¥2ZÆåÆqWJµµµá–Ù¸w Üa$úŠñãÇS9u(zÿý÷o¾ùfö"XòY ¸ãv¯)ÏvÆKéöÛoÿè£>úè£×_]¦‡,XðÒK/!Å–ã’aÜ›šš¨WA•°îînÀ÷´âq1b{qéa(K]VV†ß;2îIw“T†wœ³ÔLÀjÜÁªªª,½Ò” »T†nঘ ¡¹Ïç£Í2¦TF[æt¾Áú–€q·KeV­Zu×]w}õ«_¥A¨Xƒ,--2eŠ#p‡çbAIÆÝC©LLÆ]ͲéÆÜ¡(²Â¤LÀN :ßq× pAëÉ©&ÆÝÞ1YýÒáø³À¸÷+C••“q‡_©T—m?5ÁVaR*ŽƒZÇèdàžã>xð` ÜÙdTJevìØQRR²jÕªââbÜ„ —ïa$кx-pùtÔ¸[P‘,0»T&^Æ~•°U>BKÍZîMÿ*ƒ“Ò ™\¤2ÕÕÕÅÅÅމ֗„€Œþ4w‰øiRÕÕÕO<ñDaa!Æ”€TÄ0¬FqƒtW–…qïêêjjj’E˸‡„:‚UËØ«˜ýÔÜÜ|xìØ±ô”ÓÔàCssó®]»ÊÊÊ.¹ä’¼¼<%wãO€{\Œ»¼·ººº²²º³L¼“]ãŽÈOò£xK™Iebw-þ *P¶áÞ0ÑP=BɸSš¤ßèœÑ@SSSÂŒ;í¤!ƒÆÝtÈš‹TÆÂ¸k{ÂŒ»¸‡B!ŠËú“S³³³eÊ©Œ]ãþ›ßü†.‰Ðœkws `gÜ!Û¦ÍèôJF½á¿¯¾úêË/¿|×]wÝsÏ=2 0{Y|•SÓ•^iÆ5{æ •ð¨J×t)÷ôÚk¯uÖYx±I*…œ••£6eܵ÷ÌÌLFÒÀ!¥¥¥K–,ùáh™É3ƒ:tèáÇíw¥Ô®]»|ðÁÜÜ\lK6lÀØíJ©¹sçnܸqùòå˜=Æ/`²3 ÕÀý3θ³â¸w*•¡Á1ܧ¿Š0îÌCÉ£yX··¤É:eÜ;;;‹ŠŠêêêB:©Œ‹Æ]Jeð¡´¸$ÇÌxmþ)î¤R–š‡Rv¶ ÜãeÜÿùÏ^tÑEëׯÇ[dã±lNe°Ì4¸Ò êëë—-[FÏŠbŒûsÏ=WXXH ª‡Ga£܈úà˜ÀÎ ±$¡ebIÁZyMM ”6NuâÒ¸ïØ±Ãï÷ƒšÍ™)À½²²òÑGÅõ-ãŽ'›Ð¦Ž‹q§‘:]€;Õ¸{Î{¢›SñÅ]wäGµÂÜq÷= ž´™ˆ9ªÌÇ,jaÿJÆ—ÑÞìWÇptúiX§qÇfçÝ` ðK³§YZ¾|ù’%KPׄ¯”az4îøú׿®„±_¬K*]ùÓªa!Ø‘q ¸C"Z©LXÌ¡ƒÖⳤ”‹2î&L¸óÎ;YÞB¡ÐÛo¿½téR–“ÐPàŽßÓ6ƒ5°/ÛŒN V+¼‰S/}ôÑ––Ùä$ÓľƒP¹.ò€G °æ'q6{YÕ»‘à]ô¨|Ó&ã Dî§7÷ööv:IƶOtVvàþË_þò–[n¡k.Œ»Rjÿþý@àé§ŸÆ]²ÁÃr±‰qdžÕw¸'e´z(pwѸSÆÆp´wf’öÀÄUoïÀºì©*))‘Ïb5Ò;ŽxaaáÚµkC:© =Âa )•Áë)ë$p…BÀIÆãµ3à®…/Ô(èG£¤,Í•ÊHÆÝU GtʸãüðCYAL*îÙË‘<㞤TÆ%ª eܵÏ2IeÂápSSÓÆåœÙDëH] u,f(õ'¬*pg3Iv†®ÒÍK[[[Mbz͹ŠLTÚÚÑÐ4Sµ3îìÝp_¾|yQQr%PÐÙéWJ©ììl”Þ1àßc†%pGY<æ FRü2Ì™3 éÀ¸Cúuuux¯,(8ê•Ê/î#Z 4322âÕ¸Ë+Ý»¶_IÆIeà‰Y*ÑÙØf>¥ÔÖ­[µÀ`P:~ÚθƒTFõDð”ÅåÜé;Ò|´?„zôv 7'&• “e,%€»‰q8p Ïç õ>õ‰ÂEHk¶¶ ÐjÜ-<ÓØ±ca§|ÇP(óÆÊÊJYìÁ`0‰Àã¨KÅËØ¶ø7IÆwj=H( ƒT35 †€ƒq0ø t Å_!5Ü%ã éR ˰dÜ!Ï0PÇ­”:tèPyyy xýõ×ã’Ê455!ã®Ýœêθ›¯˜À.€z‘‰CO‡w‡ÌжñØc)R›&Æ]™Ÿ"ÀŽÌ€;sø\ ÜÑ3оÆÞ½»»ûСC%%%ï½÷^ÃêfwA!`Ÿ ‡Ã‘1îZòÏ+Æ ðă>xúé§?üðÃÔác‹…Iˆ]ãN£˜4îJep—€–ÂÐJeðÞ-[¶È J”15Õ[vBÂÌ™37lØ@I©«Äõš,î{öìQ±€»2 BV¶2¾¾vm‡š¸³æçÜ)eY££Lggç믿N{¡(LÀ}àÀìÌ ”ʰS«©gƒ”Œ;´œ‡ÓõC Üå È^ÿ®]»”¡š¢ÑèÎ;iC:ʸ§ÐØ(e=`Àɸ¯Y³&77÷ /Ä[è8ÍÔð¸åbZW(wm·§#¨ê=ÅÔ2î`Û¶m£À;I—8Ô@"N…Ì@dý¸wé Tv”À"uÕ»§%À¸‡zï‚GVÏ4/‚œdee!1à¸KÆ‚.À}ôèÑÇWº‘û¾}û´ +*h¸@¼— E©Œ¬;:ö[wiOî Ú±ÖdØ\¡µ;2î`Û¶mcù—Œûo¼!³Aw<\{%¨ó·nÝÊ4î¸e³tèÐ!ŸÏ‡`ôÉ'Ÿ<ÿüó}ôQú8*•ÑnNe-¤[œ`€Å’ÆÏFÁ_-ì£Òõ&ճÕ]¥]ZZzÁ[ë'‡ IDATÐïãeÜ©.Ö´âÑÝÝ –ú@&Q½)éO>ùde`Üù¸#æÐjÜYF²víÚíÛ·¿÷Þ{ÚjaR§0 ‡Ãìíjjj è´ÓiS‡•X?®“Swê„7mÚÄ®waÜi½Ð˜NûÛßp¬Tà®eÜÙLv-³–¯Ý/!¡‰qGÓ÷mÛ¶ååå]rÉ%Êà‡åŒW<¼êÝJãeÜ¡#`&¡(¨TF ܱ=0ÆMöMÜÏŠïE;êy¨F :´0îJ©ÊÊJeÊ(¥vìØ¡•ÊPÆ]λRdŸSà.÷¶¶¶†††}ûöiw†ªÝQ»ÒùnÕÓ˜LŒ;îx4DàN@WW¸cy“l òäT¼2{SdpaÜi1B–º»»Ï?ÿüwß}/`},^Æ]:}È ±pd~•Œ\œ‘‘#k¼Œ;+)•ÑW E¸l-ápFåP(”3ˆx¥-“Ø8ì9·j“Ö—lÕaÝ–2åÜ)ã. =‰À]*´Œ;ãPÙ8­”Ú¿?Æ71î»±É}õ«_0`@yy9%Ÿ:¯F O\†o`Ó0„¸•RŒ­ä9ã.w]³{Ý5î,3Ò,Œ;6ËcŽ9FÞéOœ8^ GtðBvàŒ}WÏAf’Ð¥†EÑÞÞ.—_ ñ!C†ø|>¦<ÆÝD¬dÙZ€»q‡}V(ƒdæÂ¸ÓŸ¤ˆÂ2¶Ï´µŒ{˜l(b™Á’ŒW*£”¢[Áp˜0³ì_æXQ ÜÇ———››C¡4³7nÞ¼™ú6ºii/|qw;Ä”.¬¯¯¯¬¬Üºu«2øaGÆÝEãβD™Pã -ÀàÈ¢«ÞÀ.Ià.³*wÚéÕMwÚ6ìÀ–Ô´ó+¥ÔÎ;µR™£Œ»÷¦•ÊhwøÜÔÔ¤îÔL«r.y Æâhw:¿õÖ[þóŸ•è“1¥2t› ÛÕ®îv;°ƒ’qgÜ9»—]L gûöí456pÀ¾Dõ ¦É€;M.Æ•;†ÉèP¤Õ¸+Ü¥2Üå;"ã®”Ú±c‡¼·££Ã¸³òßj’©{’Ë51wð›Rã.;fIw™6N¯[·N«ñ ŒûÅ_|Î9ç(‚«FŽyú駃ÁuëÖ©¢÷СC’qG—²fÍš¢¢"¸þ£>Âc›•§›SfÜáãN£Ê¸÷ï}ï{ùùùååå,“J©ãŽ;ŽÝ…M‹ÙlÙ‘ª÷æTƸãr¹4-ã.wS†³²²Fi!3àNûÅ_ìóùÞ|óMÌ$^ÏÜ>îcÆŒË ç€*êêê€d&»q—ˆÖ2Ÿqî4†›“PDh¡0ìRãn”å>W¶GWí¨?éîîÞ²eKee%n©‡Îr饗Ž7níÚµôÕ0ŸJ'-£YɸËLû8¾#•z¦ZãβDÓ”Œ;´Xɸ£Æ]2îL*#³j׸c&)‡Œ»#pG2QÛàkjj´Œ; €£¥zSaŸqà®eܵw(q„ÄDBX˜ ­™.noo§K?LãNwø)''Ô’qgýsÿþýàehXC0Ä1Z~Z9HeLÀÝ…q¹zhaܵðE>Å´ÌJ+ÐwË8îȸ#p7ù/ºÕRÊ9¨TFË0CÆ]îLà fgÜ™¼¯„ü›nÄw¡.1î&‘ºJšq—~™¾eÜíI…z6¢I@Fe÷?úÑTï]1_ùÊW”R+W®TJx≪·T³¥½xñ⪪*HgÅŠZàžäæT»ÆÝ4³bŒ»L<.Æß«¢¢¢¬¬Œå‹¥1fÌí]ÐæÙI=±WV©ŒÒá|4x©¡fî7nTJeddPpFs+wì€X,PªÜ-ŒûSO=õo|C)ÕÒÒF¸+¥dÐCÕÓËXj¦ ‡Œ9ýQZÌ™¶ü6Ke°=k5îÑh”>$ãf¢uäpàȸ·µµ7ÀÁ¢­­­½½jæ0‰ÀÖLO€»…qW¤Á[Xº9”?û).©Œ‰qƒ>ÛÙÙ Íß Š¼.hÜé+›¤2Ò’UZqÆ]+•‘À;{²©ÑÚžµ>'.QFöã®îÆ=Òs`\jW–¦'Ó)Œˆ¤biÜ=PRÖ¸G£QpwaÜí›SdÈy¹¸K" ÍÜëêêü~?bVGÆùÁ®®®p8ŒS5ÜrYwŠVYÿDDê}ž<+ªqw‘ÊH£ÀÏ0¢–€TF%ĸã@+cÏ1£À=IÆåGõî1¹@ÜM5dÞh„ 6»aFFÆ„ žþy8ï„Nؾ}û¡C‡\ÊùÃîÝ»é¿{÷î¥ _¸¨E5î2îÜ¿¿…qWãn1¶Ú@*dòá‡ÎÉÉYì' ÜC={ÓMŒ{(úÎw¾B[Œ*ƒ¿jA†ê­‘0MÞ”¸‡B¡/}éKJ©ÌÌLÈr½Ê*•Ï.ÀñvÙÙÙp¶ksss}}=ö\H0‹W*#;Ž¥Xì½ÌôÓæÔpžíKF“;AñÞ}ûöioqgܡ࡭ôPa ÜqŒÀfã÷û'Nœ3àN`²÷N*ü¨lÀÚØw=;p—N)®Í©&Æ løðápšH«ž˜(pgRä§âeÜé7t$‚ûõU†‰ãÙ+³gY&ÿtµ?k;ÎQÆ=)£Õƒå®Õ¸³ó†Toa KÓ“ZaêgàŽ;²•U㎯NDËŒšw‹T2cIbŒ»,76»¥î¦­­-ìÝ»þEQ©É´Sðz¸Ù”ÍΕRííí’qÏÌÌ”wpïîî–À2îln/p÷hÜ …NÍ‘q§ŽRõtì—Œ»ûæTö«&‡#u´¹Š¸‡…TšœSÆÝçóÁ£©¸¶$Â+Ÿp Š0îaqÒÀ½¡¡ŽȸC£‚>‰ç&HÁÄ’.Y²dÚ´i1»'Œ;î´)B©ž~úéR*cbÜ¡ Ð×I`±qãÆ7ÞxXgîÔLÀ5îÊŠP-ƒ1öܯ@«L˸ÃgìÂ.wĵ°ÄÚÜÜŒt»;°Áhà&hÞqIe”y¨îrNB ‡úi’qÇò4 ¦AY*‚èTY‰¢ø¦Ø°Ù¼õÖ[óæÍ“9d£ÌF´…ÉF ­Å%•‰D"«W¯Ö²9Z§ä‰Æ \–]*c Ù݇ڴ9ÕE®iÁ‚¼÷Þ{éQÆ]ŽÎøAÆ?0½¯ƒ)–G/N5pÿŒ3îlAĸ³¸¿*½Œ»"" ðªÐ°¨› fZ]8r6¦§'¼9w9sÞѾl„R%“S# ú͘.O˸#p§çÈP™#›9ÀíT*cbÜil`é[©Æ çv»4ʸk1G\Œ»Vã>dÈ‘FõžÊm¬ŽŒ»<®/¦TÆÜ!3ÔcÆ+•ËÎÎÆî2îØpªŸ‘‘AÙAÊ:tÅdÜ#ã Á 0 É3îÊꦘÆ]^–˜Æòô4“ŒK£?A›—1g,À}ùòåøY÷˜R•(ãŽnÖÜï»ï¾Aƒ=ôÐCÌ+*ã6Äq‡ áÈ‘#µ´´pÏ©îT½–™™ sθ€{Lå[\&wºîJ÷ÀHc•¨Í­|œöã~ì±ÇB!wvv¢C¶3îŠT¢vs*E“ZÜ©•Ê0“¨Qnò¡¹ºà‚ Æ'ÓÑ:¥Ä¢Ê˜wEF7íæTK8Hºü¨tá íE‹ cÝPFÁËØh8pà@Y)–U;z;þ†N›ÊQÆ=)3Ie,Œ;½^Ûz,1.cÀ2+//‡ÖF5îÈ…³Î“q×ZwûæÔwß}7;;ûïÿ»|uÙª÷pËœÂOŸ¯¥¥£ÊȈ LþiE0à>hÐ :ž¥¸c4Ií´?ƞыfZWd†¬z3î`tæ¬zwê?ü?»3îÝääà.;{(‚ ¸G;”Ò«¯¾úâ‹/¾ñÆ’qKã΀{ss3„”™0a‚2ltlàz…ŠŸq·˜'Œ;¥r¡©8wmû—¦í ÌG…z6§{ì±ð !J;6$É;¨ÞM(Ã)]´%˜÷˜ÀÝ4Êà³d®´·82î.À]Û§ ë…B!¶ÎVQQ‰DZ[[}>Ÿ%$–yòŒ;úÛm۶͘1ò,wÜåérÊ:Ðã•Ò»ÂË¢îÿßöìÙ3}úô#FŒ1búôé(¢°˜]*CG­¦Ê$•ñdçãzáYÐï¹çói¥2ŒZ¶÷ììlí¢Š?ª 8ÀT[w0mĶ˜H‡[æ$?êθ'&•Ñ2î¸Û‰EœþK³ÑÐÐà¸[€;œTfî&7W__¯=9UõÞœjî”qw—ÊPÆ=^Ó2îcÇŽ…üüüç?ðÁá˘Œ;‰2d]Шǧ!Q #¥2¸8.€ªÑ’[¡îºë®[o½U)ÕÐÐ@—Y1$w¨}íÔ®[ꮫw€ji.À°hû¯~õ+‰ã܃Á ll«·üIJeÀp³š¶Jä—¤TÆÎ¸Ãb#cÜe§~óÍ7é—1îÐ0ìqÜaB8räH”ÊÀY¡“'Oöù|Z}Ü ©a$MS›Sí–pß½{÷ªU«èÊ` _àî²,€ /ÜiÔ/êHµŒ»Ì¡R*‰@€*•q׸335`°éÓ§+7à.«X~#Ù.ô6lU|ذaW_}5JŒpß'“Êœ|òÉ---‘Hdذa´›€!ƒÆw;5 ÜqQzÿþýÅÅÅ|–eòO}8sw4¦­: ÜÑZ[[§N:iÒ¤ªªªªªªI“&]rÉ% f—Êh•jôz­ÃJ‘T†wzJ¸ã ”¢R«q§Œ;6GØe?xð`ÖÙ£åND%¤2t¸ ÜÑ+%)•¡EÇ6%KÆý]³ôg ã^WWÇ8Œx;›«ugÆý /Ä©”]*£½Žý4Ž€ qN%†ñšVê Ãa8^±b†„3õP4h999lM2I÷aÆá´M+•AåÔ»…¼á†.½ôRÕ›q{ÂŒ{kkkeeåLïî"•QJi{0|饗@ž‘mj™`ð^Z4ÉvŒÈ»LÀ}äÍT¼žKe,÷‡z衇Rƶ¨¥K—Ò CQÛwºy) µ¶¶fff>¥2P’#GŽ™–)ç(•Q±÷¸°xÀ}Á‚ÿõ_ÿEŸ¯TæÏþ3€àÜ]Ø´`0ØÞÞ>`À€3Î8&ó”qonn¶hÜ©1䀨©ø£Ê0³÷åË—Ã&oš+ÓæH—¹v*¥ZZZæÍ›G¥ÿÎØ±c,Xpî¹ç—x()î9990²äääÈ麔ʠ‹ˆ‹q—’BmÏ©q—q§!ÚXçÂQì(pÿ?›7oÞäÉ“gÍš5jÔ¨Q£FÍš5ë¼óÎ{ê©§ìw1L†X2îÒLR™w­¸…®Y›¤2EEEÓ¦MSJìܹDÈKý¨ÏçÃqBvĬŸóÏ?öìÙø¸¡C‡fffú|>œqj‹‚ÄÜ|‰èÐC© ­wV ðš.›Sé-û¡C‡\¤2;PŒ¦•eîÔ˜TÃZ+3ãN_?BŽ™Ð2îŒÕVIwê1~ ;ÃØÞ…-åää°œÐ*Œ;Nì»I8H ܳ³³)Õ2î`Ç{,,¡ÒÍ©(•Ð Ë;ZÆ]6B´-[¶äååýú׿6½»ÅMѵÄÖÖV–ø€¢Ñ(•ú˜ö.ピ¸'À¸ã-ÚÙ8Z\RÄ:–6caÜ·oßRʸG"‘h4ŠdXss3͆ pG¨­”jllŒF£999>Ÿ¥2¸‰6F›rN;bå;î¸cúôéìâT3îlK:mÃØmMþ<­öøê$ Nq>|xQQÑ“O>©zoN=|øpbÀ>$Üz衯ýë*–TF)çÇ1µ§¼Ìq¶#ûWccãºuëæÍ›Ç¼Ôεðl#¹9Ϧأʰ MŒq×F%¢Ë5pdÜ#‘H$A?ïU††ƒdÃß Aƒh{> ÜÿÏ/^|íµ×Òo®½öÚE‹Ùï2Ie(ãn–R­qg" „˜ôÆÛåˆ#¾øÅ/ÒÁL Ü%¸0î£GþÙÏ~†¿BwE<¡ d›~X€»)T‹4GÆ1pŽ»wï.,,ÄÃP”`Üqäs׸#ãÅò—¿üåСC¸')•yýõוRàÖµÖÞÞî2²2© DDvdÜgÀ÷Zàþ…/|ÝžpF£² qgÍ@«@ECÆýÕW_¥•.;‹*ƒë-Øõh“fÀ݃† 6hÐ X³bwx È<¼ÏðYð“¸Çà-À½­­ 뎞GˆÙVÄ« ·´Kp*¥T8ÖîLUb«·üÉqsjHlVýh.Rû»ÀY¼ÔÍbiÜ9æ˜ã?^é€{kk+]ÕÑ2îîLU=uRÖð¨Q© ò;¦y†Qr4O€;eÜ]4îTßp—KhÜ¡T‘GÿÜÔÔS|Ks1À$7«˜ŠGê˜òîîîŠŠŠ˜9.ÆêtÿÜkjj˜œVÓ¸ã{•––â¬Ì"•‰É¸'ÜqÙrˆþdóæÍ/½ô’"~)&´ë&AóBb£ã Aƒh~¢Ñ¨';!MvÄ÷††ˆ.„6zôh­¢š´ ¡eÜMÀÝĸß{ï½W^ye"ïÐÛã®îZ© C¨8dJà.]¶ê Üiù€1Æ¥àÜ™G¶0î`“&MºâŠ+”U6˜Æ 'úRŠ£=&M{“ #¾õÖ[ÐqÀØ¿ww·ÏçËÉÉéîîF² ’ÊÊÊ’º pWJ}ñ‹_<ûì³M¿Z–)¨QÆ}äÈ‘]]]‹/†Mohû¨Q£ØéáæÔÄ€;¬×ƒ•ö,ú2‰›5•R'N´‡ƒt”Ê€–R™ŽŽZtq1îcÆŒùÇ?þ¡¬<Ы~ŽúLãž‘‘ÁCLÆ] “ê©;Dç hÜeT9NãÞú:Ú&ÜÙô ó†•u«®º -RLü@L© 4Zh6(•qdܵw­ Ϭ€%Ü™S¢­ÑQãž°TÆÜ!ãF-›F¾ño,Y²DGŽ0¹wg]ꥱ±Ñ¾Ò¨ÔPtõ^w¥ÔþýûåõŒqommÅs¬àû)S¦à0§•ÊhwÉ0Ú'–´¨™™wéKñ¡Ž}! aâZ© ór)%Ýàž˜A%AÅ,_¾ü›ßü¦RêÝwß½ãŽ;TÏ/p¯ªª‚³¯“4ÆõB›`Í·ºº:??¼ öí®®®ŠŠ ºý>deeA\*´²²2­TySª4ÅÔ WPh‡21îåååʰî,):håPà¸1"fç‰y€ríÓÙÙ ƒîP2Û·o—¯‘‘Å+÷èX  ˆá™™9zôh¥¡ž8ÐZ¤bîC† Ñ:)¨Gؽ:xð`‹ž^ZZ Mú²Ë.SJ­^½™<í-8yà p‚‰DØÁ­­­7ÝtS^^~ã!p‡‡J€h‡ȸWTT˜BHA»‚tM£Q攑‘úf°ììlÚfL{ ÆŽ[ZZ K¨82VoРA¥¥¥¸ÃŽê)@6Øœzê©Ê:°aY%À¸gff²ZÃ3&-6sæÌ3fÐoÀàÄoÆ ìô<øîÔ222 1SÆÝ¸ã$Y>θ{ uS/™7hØ<.¿üò‡~øæ›o¶¬2íÛ·¯´´&p‡ƒŠãeÜí{©UÏtöQÆ]‘®ÇìþûïŸ;wî”)SÀ¥K{EEåéÉåh¡žè´Ò222à—•­[·º÷µk×Z.ÀFRZZ õ ­½±±‘Æ1Cƒ·Ã*ƒ:Âr€Ê=묳¾ð…/@¸?-pG5¿ÚÚÚ¸4î`ZÖF2îС0L'CÕ'Ƹ3ïúüóÏïÚµ‹~c_¨LÒŽà>jÔ(Ư>|˜qðÒ ’`Ò¤Io¼ñ†Rê²Ë.{üñÇUoQš´˜1+’4Üá3óeMMMeeeÝ=1±'Œ?žŽåøaüøñÔY\xá…ZÆ™{Ê@€x≬¡çŒ;–úAø žxÚi§)ôRzd¸ 0î4mºB‹Ù» YôÂÔäææJÆ\ðÈ‘#µŒ;o^]]íNö<÷Üs7Ýt“R :pvv6É€;ÛÊfgܳ²²´^^JfôèÑgžy&­JfápxÊ”)P­_þò—•R[¶lÎbТIÆ}àÀ8ë‰vÌ1Ç<òÈ#çw~“0p—ÒkC½÷Ç4\?~ M™2åûßÿþ_þòÕ„”‚ììlî~¿ÿöÛoŸ8q"unl>¼mÛ¶)S¦À,ØMÜl@²(ãŽX wœK°j‚Þ­eÜGŽ)÷ŸÄÜ“ßJ—‘­´Ke233'Nœ¨âîò˜^fP¶ £ÔŒRŠžPKíK_úÒé§Ÿž““îB÷ñãÇC3†VJ·¡YŠ133ÀŒ ä3fŒ‹TF{069äÈsss333ÛÛÛåYתg‰­b`à”ÖB?ýôÓ}ûö!íbÙœÊ:ãI'—ÆLa‰2îШ"Qª1++ <›'ŒûOúS¶*sr•Œ1À}ܸqŒ¶)//·èÀh8O*•¡Ú&Ó^Œ½sŸ˜iE–5,ª zä5îZ© Õ¸£Ï•R­K•s!‚Æ6÷'â‹Kã~õÕWÿä'?‘éÓ\ÈFKK‹|…ÌÌLpÐ{÷îu3¾üå/_|ñŪ‡qÇQ–-¿j÷êÅîÚ†~^jàÀ›7oþíokJ$DÂApß¼y³}sª”:deeA>¥†®‘ªxÍ"•iooÉþRƒ€,.4)s8Hx£òòrÔih7§:”mN5wøM†õ¤S*Cã¸0 f`u„¼.Œ;óBZÆ=æTA©Á€{ÂQeìR™Áƒ3¿aÒ(k±ˆ2ìÆ9pàx~¬Ë¼É Cø+mó,q8ñÚ÷Çk£Ê¨ž63tèÐ!C†ttt@þ©ÆÍ¦¨Ty™ä¥2^±†4¢CL© – ŽwZÈkR ÅœgDfRp&ÆŸUÏ6§þÛ¿ýÛĉß}÷]K*c£Ȧ¹ 7ííí1¥ð1g;t[F¡~D+Άì1;5Ø(±·˜šE*—ÆS“_Æ%•‰W㎉£wÅ1å¨TFoÓ¦M›?>ýfþüù—_~¹ý.¨$îèÈPê¤21AbÖÒÒ"«Öâ(±o3ànѸ;F•¡%ÑûäT¶{LF•qÙœªtÀ{0ìÏ‹ ¸ßwß}<ðþ„³ÿÿÇÞ—‡WUë¯3e$ a L2)ƒµ`ˆ3J£^E,UQ´ÎúÃlQ+Å©uºöR©zik¯©­¥à­-Ô¶q¨ÆMQkåª8€¢"S8¿?¾'ßóåûÖZ{í}¦öûÏádŸµ×^{ ïz×»¾EwÐ vìØ¡Ýœ Õ|à¨6A/^CBd IDAT÷D"¡%î8c_¦NÜ•.@‚z܇ RRRòÉ'ŸÀ@%×@ ?BâŽÕ’VÖ¿Cµ¡H»ÇÝ3äÛÄ‚ šÂAï7n÷§„Ç…ì•w˜9˜\ts* )ú.L€c×,#7#îv«Œ‹Ç]:ƒi&ãæ8î¾6§¦âq÷EÜqxÖ.ÆIw4¿á_iSb‰¯Zµê‘Gªð§Ÿ~*7§RÅ]uˆîÐN©ÇJtÛ ³Êhw:9îœKqß§‹*cïbº.yó¯aÁmN…™’Iqg]îٳ祗^zõÕWá·ðÒéN„‹ÇÝ¿þõ¯=õ ÏðD”¸çååáùJð.˜Ç‰;ôÒv«ŒgT«Œ¯Í©(g&î”* î€}WAA›{„Ä])¥.¾øâçŸ~É’%[·nݺuëm·Ýöâ‹/^tÑEö_QâNÃAÒ"N¸“äÑ"Ia‘ÓqÇúÇwÚ´Ýå^òÀ©¸Ó„®ÖoTÕ™¸744´´´üô§?¥O:qg}MP»9ÆNUCRÜᑸoܸn ºÛ«µÊØ=îyyy©÷vÇ=??håºuë”®†Ô,Š{ºˆûñÇËÄ€d2i"î~÷é³ê Ê“S©âŽ/ÈÇ´··K¡7‰ q‡[˜V·©â°lNu!îlî-Asˆ{"‘`•ÁEq—ï…þ$˜âNHw«Œl­05mà¶w»âŽJ}:JÜY†×­[wùå—kwHðž{î¹úê«©âŽWq§*&›lûÝœêˆ4w|5Pn(ˆš€ª“;q/..~ðÁMgT!´Š;¼kqÇb‡›ÒQïÿø ³¸±4‘}'¯iewâ¾jÕ*e˜U"wÒNÜc7§Ê![*îZ« U(hâZÅÝ´¨‚©É/3·9•ö!82â3†Š»%%%k×®}ùå—«ªªªªªš››ŸyæS;„Ý*ð iñ ÛS°cÛ¶mrÀs'îwʽ,Qeh¼6L>@}æ™göëmU:ÆÖN —••5 ¼*Š;[§Ó*î0"j×=âñ¸_ÅÊÆ ÜIÆŽA¤Ñ*ƒ‘w••¸Ó}~ÈeGŒ¡:d`ÙŽh¬GÅ]Ze\ˆûG±mÛ¶»ï¾¿Ñz܃51€$îÒ*Cwô¸ï#á éb.#îÉdD&\6­©©ihhÀ ?ô?¦~œw–=¹9ÕBÜ1̪‰¸ÓiFZw Z]å:¸rŽãNû:Å]Ú I¡diº(îø Ü­2xŠGZ«Ì|ðÆoàÁ“ðPÜñ[«Œ‹âîˆL(îIÏÍô˜mS5–Õ²¸¸xþüùÚ^—B«¸q·„k„²@hpae%Ëþ6À;š={¶å¯žQe¤U&‘H¸wàH*î« £ ’¨h½F25ù¥TÜ¡¾Á ÐûÉ¡“Lq×–?í–%qw'TWW?ù䓟þùçŸþä“O‚ÕÁf•ÉâÌ UÜçÎ o$°–Øw|4¸ÞNÜ¥ÇÑJ¦¸CjМ¾õ­o=Z«#ÚwÊþiñ¸Ó1Þ…¸ëÕ*î±X ÷wß}×ÑT u °°‡¼¼<í”/˜UFÛ…QÅ.Ð#ÆRTDq§µZ*îAUu&‹)*îrÄŠF£p/~c±Êƒ¸KÅ}çÎÒ*CóÀ¬2ªÃ|‚ÃÞ¬Y³üqv ¨U†eؗ⎿’Šû”)Snºé&¼’Vé·ß~{ûöíH¡âñ8۩좸K¤®¸³ÊHh#ÃÐè)q?ûì³Ç___Ï6aS«Œ¸c†KJJyä‘H$²¯#þ#wf•QJíÙ³‡ „x%¼J‹Ç]Ze¨âž.â` ªyAA¸Ç;Ÿƒû±Teµ„ëí2­²*î&h»¸Mag!î’QøRÜázF²å.mw« :ô<‰;vérÁÄEq7 ô&ÅÝ^ßì'§²Jc –9HŸÚùM2©¸ççç³Ü†q܃#˜UmXÐÌ2§¸Kâ>`ÀÓfp¬%,Ž;‹£‚Æ87ÂQqÇ›*Aܱ‚¾þúëZ>íBÜ)M£ân·ÊÐN¾ÑzÜãñxß¾}óóóèÛ>2‰DB[s´ã¨‹â.³!­2ÚA …[E” ÚËP¶A;hi•‰wlñ4mN•ÁC)d(9‹óKÜ=ߎ§â‰DöìÙ“L&ÑnÚ´ Y#­±”¸³>ˆ;R^öWâNËͲ95Öy›¬ö1q¿øâ‹Ÿ}öÙ3fhõ«_ýª½½NQPJÅãqzR• ª¸3âNS kå¬{¡×PânÙœêi¡„$,Äý'?ùÉ„ Ö¬YsÞyç±¼Yˆ;NM£Çü)¥âñø7¾ñ º’Ù·oßH$ÒÚÚʪ:r;|X:ñ Ä=//²]qO—U&˜D¥:/^Á7žÄëôüyyyÐÝ!¹”Ä]®9k½*îPÇ&Mš ,Ú ƒi2½I^I¿Lt>²­2’¸û\±wÁžúþûïðÁ-)`mŒD"‹-‚œ[+˜â.u;ξdâiWÜYYuR‚ÊkCÊ®ò¯UÜC«LÚ`RÜi-‘œY #î¦ظÓûj‰»¥›¬2&yJkFÊËã®M„*;–?|I=ÇéRܱÁkwÊ5!Ö˜)ªL$­K¹ WøÈýû÷ÇoLŠ»_; ²€¾DööiþwíÚõÝï~N†²wHÇEqgkvÅ0wRóTÜ-2ÏØ5vâ«Édû‡#F0f™„2%Q­âŽ]¿/âÙKÝ*C‰;d€ž®eút#×^{-Ô¥x9lØ0ù[ºÐ_z*óÈ0Ö~­2………vâî ìâðJÜ¥§®§Š»É*ãUF&®UÜí=¶kÂÑÜÝ*÷:å”S–-[Æúj™>ÌQw d&TÜÓèña5œm5Ãk$Ë„—÷ÙgŸíÞ½»ÿþØàMÄ]¦pÑEýâ¿ û/iÊJ©üüüd2 Ä0£‚¶fG"JÜ1òEân I1YehöTçePv´Ê¨ÎD ¿ìׯ_CCÃ=÷Üó—¿ü…¦íõõTÊ‚ðÀÉd×ãho+ˉ»i „cg<÷ ž-÷Áƒ»+îžV•2qgWÒ—H/pWÜÝ7§F"‘Õ«Wÿîw¿“ûR 5ú[­â®ð.v^b*ƒÄ}×®]¸"„›S¥Ç]KÜÁwi•Á6Èâ¸+c ÕUwùº,Þ£G$î‘HäòË/Ÿ‘HŒ5jÆŒçw[vS:»§â‰Dð¡Æ?oÞ}ú@_, ÄÝ*sôÑG766žuÖY¬ ¡Ó‘~ s*\ƒ†…?¹Æ-i_4ݰaƒ2D•aƒzÂԅ¸PÜáµáÏð³;q‡tÒNÜÙDºE¨‰DbÊ”)§žzª,:Ö&:‚h‰;ktš}в[eP¹DÅý•W^Ñ23JÜe#ÅbЧ+ÑÝÛuJ q×*îÊ‹¸kw q‡ýÁÀ#!ç·ÞzëUW]…µ¯¶]³%\žŠ;üʤ¸cúø[ÙÙN™2eéÒ¥§œr ~CWÑøDâBÜwÊEqD"‘H º,ª¸Ã[ÃŒÑA‡¶‚Xg«Ì_ÿú×£Ž:ª©© Skï8Ü1âî^“ímPKÜí\/†ªÇ¡÷ »ÿåO”™¸ÃaØ¥¥¥l½bšˆéé<wVKij¯¿þ:œÂ6jÔ(ÓÃ:ÂÓ*Ã`ÚÀ®9ûì³W­ZõóŸÿü裖9T­2žŠ»"…9sæÌeË–Q*Ï×~ovcd)øOúS}}=ý«‹â.5JöP²”BÅ=€r/))IˆžŽÄPSSƒ•Þ]q7 H˜2w'îÔ Šk óçχYrÅÝÓãnWÜQº(..†jíWq§ÄÝt6›…¸cl]ñ‡”+°r(((€vnQÜñ) ܉;Ze|)î1/»JAqg:‡]qŸ6mÚ¼yó .ù²Ê°žš.†`fä3RÅ'`íâÀp¹–Š­&a¹ÃžWF_©¸sÌ1(÷J»Iq/,,¤rýS`« ¬%“IŒ£Õ‰YuÕw™a$@ÅÅÅÑh"ÖL¼…]q×>š¸Cj4Ú¬Å*CmL_ ‰+q‡G ™§öhwâÎZkLÄq7)î¬-`:0›¥·Æ?IÅæ„xd7K£_g"Ž»…¸ÛÛàúõëUçü{†ƒÄ®ÿˬ2&÷—]q§ƒ82MGÅù÷ä•´¢ºbJ©ÊÊJ¶ Ôd•1•ªçæT™U-qÇϦˆ.›SQqWºr3¯ö{» ’ޤ'N„CT ‡Í©ô¦Zâÿ¥Õ¤¸ÇÅ1s!qŽn¸A)õío*%zÊíÄŠƒÆ÷Áˆ;$‚´•‚YGPïc± “’¸›¦žžŠ;](§djrsjŠVœ¹æåå½úê«[¶l èv;µ²`ÄÖR™õň„]IÜ¥UhV<ßµk—4áÄ;[e <÷çáM3a•qñ¸Ã5’x)1o‘ÄnöohhX¶lÙI'¤ Š;”‰¸³í¬$em”Š»vÏ´œzY´OâÎwܬ iRÜ©f!îÚ–Ê ¸ã`€ƒV>ÿÞ÷¾·aÆùó糟Ûwt¡U†æJy)îXíö³Ÿáf8FÜÙˆ(wm­À¹S2™Ü·o›?àO,ĺtP½FÖ+­2lÕNf/Fâ¸ËÍ©ÔãnRÜåSãŸdTÊϘân¢ÑLß1).Á²ÒEÜŸ}öY¥Ôܹs©âîÇH$~øáÖÖÖ .¸ÀtG-÷B|å+_Y´hDPÁ<¨t+îZ;»2??Ÿ9éýJÎEEEC‡]°`Á¸qãà;q—$G–’ÝäIÜñdh­âŽ›¢ÊhóïIÜi¯BS~å•WV¯^íKq§âû’–wì¾(™a÷4À—U&N<ÍÅ-Z¦ÌÄ=Ñq4]qg„D)EfF¥ìq`•ÁV—H$ªªªúôé# dÛ¶m[·neÁìŠ{$¡ã„v›9µÊHÅ6*IÜUG¿1é° # %î]Á*Xq§UtÔ¨Qo¿ý¶êÜC1B€ÿ¢€'÷!C†<ðÀ2“ZÅßšöÁÙÅÚù¤Eqgqñ$ü*îØ´á á¾wS’~ƒOÕç3 þ m€ýúõ«©©A34Ó–P¯­­¥ÖU$îPKq÷«¸âSƒ„?—N”Ÿ8îHŽi¯‚?±Xeä< 9îe•¡=­x÷ßÿĉ-V;+úYnN¥9±D•¡Š»/Rh¹Æ?Í%ôÐ7ÞèNÜ¥ Ú³gÏòòrÚðÙOìŠû!Cn½õÖ¹sçâ7¸+þJjJÔ^öW ­Ç-Låçç_qÅçž{.½Ò/q2dÈÒ¥Kq/Š_Å=‹i7ŒY®W¤6R¹„ª¢ª#®‹v8Pº!@™ß‰‰;(ßvqJKÜ=wžðJôCªÎ£vh•ɘUFÛ8ñO¼êLÜ™ÇI‰¬svÅÝBÜi îׯßÌ™3ÇŒ£:‹4)*î áqOÑ*CwzŸqãzõêÅ|¦,vèø«‹.º¯ÁóÏh²Ô*ƒwGŽ¥¥ÈÓÿøGúP’»ø"îUUU ßøÆ7Š‹‹qEž"û›SÙ 5M/`Lˆ÷˜ÎãŽ+4e îÁwZtrzLµ¿Ä+dŠû¿þõ¯x<ÛÙ¡¡ÅˆAÅb•qQܱü!©Š;-œ2áâ†iæ¬:W`J÷ás=š››_|ñE­‰»£â^XXˆ¹¢Š;&hQ܉;›ÛÐgWVâ.;ðxDZ¬yîÛ·Ïn•¹ä’K;ì0 q×*îLÌ“Š;^‰V̘Iq‹3nYj{÷îM&“PVÚ¾oa!Д¦¨Îª »Ò…¸———ÓŽÈÓãά2ìF~­2¦cæXúô½àdXKÜÝw`öìÙ§Ÿ~:½» q§ódöÁ/q—6ÅÍ´*²½¶ÔèÈØˆ2wÚX莊;[ìUo6Þ±ÉJ¬2ŽŠ;¥ÐAÙZHÜ3GÅ[>VâÊÊJ“âŽoÚ¤#zwÿLk'Í[<ÿío ÕAµwIšÙ”—fÛ¯ân'îØ$0ôÁµ£2Í¡2(îJ©{ï½÷µ×^;þøãåc´›S÷C=Jžm`O‘¸÷íÛ·±±ñ‘Gÿj·cbfh·’"q‡§6)î²Ì™âÎøÃBKÅÝ”IÆØP± ‰SPÅ ©toÇ0˜ i³ÄŠÂ®¸ïÞ½øñ AƒÀ_ÁÝ1“v« UÜY-Õ*îGy$õ:³&Æwš[™>k•ø¾ 9Сò9ºlµV™w|Y¦Šç®¸ãYÈ”¸³gWnŠ»´ÊøÚœŠ®GÅ]Û0ÿ’4(/«Œ/Åq¥eKrbÃFY`oS ·$‚Z`Å]v\~w‹–õ04È0wíMµƒ‚vsªTÜ•¨ÆÚwÄ?¶YLÁNÜeU‘ûD]ˆ;ÞšrÙñãÇË;VÜi6ìŠ;vt&âNmrÁwLÓ±(îì„Ä=  Ä=&â¸co%N¬2žVwâ£K^^}ý&« móð´äRqg,B*î~=î« }|–•ho¨%îJ©‘#G.X°ÿë²9•ŽðÍ¡?,,,,++£ý‚ìY¨èe!îãÆkmm]ºt©ö¯²ë¡¯˜:‰=‰»¨¨jµÈSq×êUŒ¨ÎÕF«¸›2™ŠâëX½•Ä]*RØjzõêe' ò‘MV˜¨`' H¡:÷`Š{^^RSSƒÉ2¦‹TÕÛ¨.¤$î4ó,ü-SÜ'MšÔØØøï|¾  ¸;w4ˆ+]ec UÜéõXeC³÷„asj2™‡®–¸':6x q§ 2,ôÝi»G»âîéqë6§ÒÔìÛ•NÔg/Bžœ qwŽ ª%îô%2.+—nLÄ][]‰„œÚÑÛIÅ7Ä5—w×f@‰¾E«¸Ã5.ÄIΘWZfŒâæ›oN&“Çwû^Ž8ŽÄ}À€åååùäl“1cÆÈ¢ðKܵkùùù–·)î4eY,Zâ£"ÙÕwÛ,­;ÊT»9Þ $eee[·nEޤ¤¤¸¸=l'8Ò)Ù-zZeäÙ4Zh›§_"á¦À6*a]@ÐÍ©0J™$%FVmψ @«¸³ Ð?iw91JÿdWÜé†eƒ’0–²/Å}úôégžy¦öÐ5€]q/((€<Û‰»is*ðСÉÌ«Îã½–¸' wü†Ž)Ÿ¬¾Q²âU¦wïÞóæÍëׯßí·ßñø•³âÞ«W/ú,±XŒõ˜îá i¸ÒD"ñå—_Rs—»ân"î´£ÿîw¿ÛÚÚ ‘×ìVútÊ™¸KÅ]éˆ;˜¬VU† ï¥tmS)Õ³gO9O #¯d–ùùùØ{»+îн³ÝôM!Ýdò–ö±áC*îR°c0-¼³Ê(¥Þzë-vÇ=z 6ìŸÿü§å¾r^Ä×*î±X¬¨¨¨­­MûhžVv_;q¦¸[y ÷4Àb•¡r/Ìh‘¸Ch?$ñ¦—꩸ãžÄݤ¸³¤qgž]ú¥]qï½÷”RÕÕÕÚ `j©XeXm¦ùñ´Ê(c ÛœÊ6–Ñ.˜•\sÙe—1‚eFKÜMÃÒ©§žz饗jÿ€ž—ŽwÌ¥ÑtÐeL.•ú*aRŒ«Œ§âŽ¥GËæø¦¢¢bÙ²e·Þz«Å*Ã*’Iq·LüwÊ«èÙÆS¦L™7oÞĉ•Ž4¸(î  DvΜ9W_}5ÐåôZe\w¤2ÚõhGÅ=°UÆ=Ž;rY­âŽŸ})îqƒUF鈻é´á •R³gÏVA­2,çí©71³U†ŽÚy8» ¦ÏôÝÒÒRm·©¬Š;ë¢ϦüL2izÚTÌàq·()˜è Ï+™eAA]?‘7Õ li~¨+婸m¥¹²(îò©i?¦ÕÙi%´wy}~~þgœ¡Ý(ß%»ÚÑ1¯‘ýÌ/Oâ.wÜ/×y±<wj‹u>€)›ŠûÁBÜ¡6 ºÉ:MöV´Ä½´´”5Tø¯vs*°ò >¼¹¹yåÊ•´Ïµ+îÔ*ƒp7Í ½Y¶Xä^;wîܼys^^Þël•‰u^iÕòÔÙZ0þU– æ³êHÜñÖ ð¾<7§Òô<òÈd2ùûßÿ¾©©éÌ3ÏÄ8Rqq‰ãnß_¥:ø„íÇŸÈ[ÄüxÜ1T|œxº[eà;âÇ¢¸›œ©r`–97µö_«ŒIq—õǯâþòË/ãÅÔ*sÖYg-[¶ì„NP¢WVÅ¿0`€dÖÀ‘‚¸w:%°(îÔƒ®%îtç¢iÞ‰D(ùsÜœšç'ª nÄ7)îøÙ¢¸Ã­ € E0âŽ5Ý>ZâþÍo~³±±ññÇg« ¬{ÔÊÉÖÛà¢k¬ó¡Nv«Ìo¼¡DNïåIÜKJJh&ß{ï½›nº £Á²›âÛ×ÚBT發r îZ^¥¬ÄÝ®¸Ë/µVZ>X Zâ®-ÿ‚‚Ú–¥â®%îZÅ:<áWøtéƒåqÿý÷'“IˆˆFÅæ/¾ùæ›?ýôÓ›o¾ÿjRÜ•u¢®DçìNÜå|Iéˆ;M`·RÜ7nÜ8kÖ¬ÒÒÒÒÒÒY³f½ÿþû/ޏgjƒ–¸çååaå@â×—âNk6³Ê`úÅÅŵµµ£F¢ÕÑäT¡mž ZLqgu~iQÜßyçd29hÐ ú\Zű OÅ]+ðÈÿâD¹W¯^’Ë"´Ä}Ô¨Q 555óæÍ›1c†²†ƒ¤Ä3_WW§:ûé#+7«Œ#q¯¬¬¤%€}ádR¬÷ÁõÔSÙ¯,VÈH™‰{EEECCðaÃXûeÄ]v³-qg‰XÄHHmÓ¦MJWÂ’¸³>Á¬2}úô),,dÒ/“¸PܵÙf•ѺiÍ—’0Ze¨ªB»œÒ)**¢dŽªowÅNÏðޤâ.‡-„VÎCö¸#Ø *‰ôíÛ—ýUÛÝYÚ»Ì6T'-Ù‹uÞ\GÝe2“1*ÞEqOtØ¡ñû=zÐŽ¨{*î;vì˜6mÚøñãß{ï½÷Þ{oüøñÓ§O?C°‹“áž›•˜k&ȶh‰Žs P/¯´´”½˜~B(ð IDATýú544œ|òÉ9LŠ»VW6Yeè*[êVɽþïÿþO)U]]Í,‹â®•ÆülN• ÄwÞyç°aÃü*îpýرc—-[vå•W*¢¸ËÍ©Zâ pÒ”Ušˆû1ÇS__OãgcõËë„QöMÌÿ–——OŸ>ÐÑ*#e*ö [Ç·(îv« ›!@²~wOù±ÊÈÈk,‡JŒ &»2w_Š;VÈfNq—CtwìF”¸[w­Ç„N_Š)Ž»”Ü|)îZ«Œ_û-·Ü²`Á‚‹.ºˆVãÁƒ×ÖÖR¦°(î¬íh`bOAŸÝ¢¸›VE”¸SYÐä¡y¦¸3« ­™« k€lÂF S¾wþ÷°W4-ÝP@âÇ{ì† ®¿þzú'»U†éð­2rÌ >>Ф%î,4½‹6JÜ¡Jø²Ê؉{à¨2©p1µˆ^#ë$KJ+9Å:ÌBÚ8¤&«Œ–¸Sܱ¶ã•T•ˆv>€©û÷‡zh„ .,/////_¸pá1dz|ùòÔ/ö ª¸³¹W^^6ƒI“&-X°à”SN¡V™éÓ§'“É矞½˜¡C‡666Þ~ûíðòØŠÒwÙiªt[eLŠ;u܉{¼³CN˰¸xÜi&‰K/½ôÚk¯Uº²Bh‰»\.wTÜY~,Ò…Œ*#;;Oâ~Ýu×­Y³fÖ¬Yø ]  Ä]&ňä¡®®ŽZe\ˆ;]S’+Î’¨Î}kŒX--Š»–¸3Å]KÑè¡_–GÜË¥d“U†)îžÄ]*î4rNõY¶+î’XCâ®å÷¬Ò™†Äݤ¸ççç[wL$JöÒuÔQôñéxF÷Ø­2|Sù!î©(î3gÎ\ºtéÈ‘#é(.“¸{ÜMŠ;‚±67¶(îZ;›`ÇÍûk%I²+¼iz­2|ÌTøÊLÜ kjj¨ú«¼wæÏŽu¬kA¥¢m*‡z(ÔœD£Q\”PâÌ*/ ×@\¢Êx*îâ.×½-âæAv¶éRܵšˆÉ*£íó}w|ü¯}ík­­­O=õUÜi¤Š;Kÿ&î«V­š3gýfΜ9+W®Lýb¿È³nNEê\WW·téÒ3Î8ƒZev‘Œw“U† TxqQQvaÒ*sØa‡577?ýôÓôK‹âΪ¯¬ÍȵÄ=¦ó¸³'5)îZVméf̘qÿý÷³Ë7§Ê[ìß¿ŸmNµ+îMMMJ§¸K!IIQQ‘©ØÁ¦ZÅ]»~8ãŒ3n¸á†‹.ºÇ$IÜeæáçrWÿp*¨%îS§NÅ­N¾¬2¬b8*îG«LïÞ½-Š»”˜âþÒK/aþqªÏ²--‹âëØÿê×*“¢âcQÜ!æ`É8Y…Ÿ >»8ôAáû?•Ý*/î‹/¾À§¶ äžqÜ]<îòÙ‡¦€”ÂbMƒœ(BÜ¥§‹‚MZ°,QeŽŠ»ö )¥›ØhÕ}qÒ¸³Ãהޏcìcz_Ú?Xˆ»œYÑWfRýµ3:€]qg´Þ¢¸³'ZâNGn¦j ¤  re"î'C{ì±wß}÷w¾óÌä€Ö¬YóÄO@â”Y*/Å^̱Ө¸÷èуA q×öT€-[¶¨Î,²I$HÜaú!„³Ûi»G-™0Ú„GÞ¨ÎDÄ]q·[eðƒ$î´ƒ¢ó i1’ÄŠ‹±:Ú?Xˆ»œ¤±![éZ™¼‘Šân!î0.ã&¶<.÷É“'Ïœ9“=Z¢ÃHͲG­2°j4yòdxY. Å4AYÏ¥T” «Œ£âN;:­U&.`(³â®­¾w$î2ÿÅÅÅt…¾D& ÀqÜ·nÝÊšDïÞ½[[[ƒ]|Úi§]ýõG}ô§Ÿ~úÄOL™2åøžn‡£âŽß×ÕÕ±£ð«¸cÇdWÜc±XŸ>}Z[[ÙªVÍõTÜYs²w¤¹îw¦í•••µ¶¶bp±ÊÈî‰=¬TÜA̹ I†TjÛÛÛ!,½Ö*# €¯Í©%%%lÓEâ›¶aYw|äC9däÈ‘¿ûÝïTgÅÝ´âÌjäF7ß|ó;ï¼S__ÿÔSOiŸ‘ÉŽÄݤ¸çwóL"<òÈx<c|$)//—‹¼ùùùûöíkoo7-›F" éHÜ™ÇÒ>ËbHaaá¶mÛ”R=zô0Ye”R÷Ýw_kkë!C$‘e·€"ºå–[¶lÙ2fÌ«ŒIq×Þˆ*î'žxbUU¨†×\sÍöíÛKJJ9äð³áyÀ………õõõJ©U«V©Ž«1û÷ï·{Ü¡¢â¡¼JW¼Ø¥|ôÑG÷Þ{¯êLܵ z‰D‚vŒ’¸7^úÕ¯~…—‹šn—’Ä›k;{öì±wpFóŸ¢â7[eŽ8âˆE‹}ÿûßW>­2rsªœ,Å­2ååå~ø!ëÄ(?“mŸÚg÷¥ðÜsÏíß¿VÆ(,s¡TwS ŠÇã@ÜYxu q¿å–[0´›“ÐN8µÊ`q—Š{~~>Œƒiñ¸ãÈë²ê(;[mw§•o˜âƒßcß’——·{÷n¿Š»©WT‚¸Ã•ÕÕÕ555Æ {ñŵiâÁ>ð¼Ø“$:–²sçÎXqO/V®\9iÒ¤‚‚‚ÊÊÊ«¯¾zñâÅ7Þx£Ë#‘ 9¶üæ›o¦›â©âÎ|ì³DáOPçhïF›ššð­E†+ÛÚÚZZZ(=¥,¤­­ _?= ó÷zûí·iN°&µ´´àzn^^^SS¶ à•H$à3Ô¹x<ñïï¾û.æV)+¬÷¤Ä¾c(d£¥¥….¤2;>þÊ¿Çc [ZZè™ MMM8ÆI¢% ÿ…¢†qSÀ’liiÁG ¥ÚÖÖöÙgŸ±ŒÁ¯ZZZ°Ä >þøc¥TII lvïÞMŸ‚VúŒjÀM)7¥Ä³Š5 ÏÏÏ¿üòËï½÷Þââ₎³µ{!&Ožü裞~úéÒ*ƒÙN$mmmØA­¦=”ÃÉ'Ÿ|ùå—oÙ²…uˆwÞy‡f€Zeè³³_a~àmš äóÏ?ÇßÞrË-/¿üòa‡¦”***b3²hÔ xxÙºuë0µW_}Êp×®]ð¤0ßfSkV'ß}÷]z;e îøÊfÏž=uêÔd2‰÷¥M˜ö‘H¤¥¥åk_ûZCCCß¾}a Fгlñx¼©© oºk×.ZÉéÊ$-á‚‚‚ãŽ;®±±qôèѪsÕ…w±páÂ¥K—–––âŸdݼy3桸¸˜E¥Ù£÷°~•ŽX,ýÆÛo¿ý‹_üB)µsçN¼i{{»lYùùùŒMîÙ³G¶Í£>úŽ;î¸ð e PWቀ¸C9  ŒÝÊ@xö™v¼@âÎÄB¸ã§Ÿ~Š?aÍ„öÀØ6á¦ØOÆb±O>ùDé8ôÀñx è'ÿýïã_ñÕHÅ{WÌ¿Iùvٜʼ ŒÿIެ¬Œ-{²ñ ßæ¸qã¾üòK“UÊ_*îlÄijjBâFi놎W*îøk¯½6oÞ¼§žz B.*¡žÄETú¬H! ä» ©7¡iþ A?•n>ö¯ý ŸV×)¤U&//{9)¢ÓPxÇ×^{]¬:ÊFdÕÑGÁg9 ¬_¿þ¨£Ž‚ï)y€ž_Ŷ”wÞy[íFhÿ`QÜÛÛÛaXüíoSJ-^¼xÆ hµ`ÝWAAÁ /¼@ÍNØT /¼ðBø íèì³ÏVC:‰» ÔX^^ÎôõÏ>ûŒÉê_+¥Î8ã Ú]ZL&!ð´Ã[o½•V“âŽàg)’ÁŸàíVVVR«z]]Ö¤C9Ó/++=z4³ÀØÅjM—#1fÿþýiN°ÁŒ=;£üüüºº:L®óæ‘Àñx5¥ÔСC©ü0nÜ8%l¼¤ÇÁ¼å3zôhºøÎ¼§ø[(ü~Ô¨Qð¡  `ôèÑtfUWW‡ÅuÄG`9Ð cx\9¤€ÏþÕ¯~?ã*X[[[YY™<€ ®=z4–CAAÐDi•)..¦OA« } ¦¸8P™­2X Ù¹}4ñxàÊ+¯D .›0â~æ™g^pÁÆ “ë§4€}YY=éƒVÕY¹¬««3Ø7È„­‡‚Õ¼€nü€bÊЫ–––ÖÖÖÂç¹sçâf Ÿ Ír ï_ñ„ ðFÇs *î0`³uHÕÉ‘#G²Â)..–˲>àSŒ3†–*]“¥5Šyè>Eš½ºº:¼iii)=7š0æjuÚ^N‘¶ ãë|èPë!Wuuu±ââbÙ‰f]Jô“Tt„:ƒì¶wïÞT\ÇwA'ЬXúõëç«mBah€qûjh‰ø“xÇà%EEEÚ’d×3⎃‚/”î­*++ƒÿÂϱÚÄãño~ó›ÍÍÍ<ð€êŒH$v/(Ÿ²²²Ã?ÿн SÜóòòjjjh:Ô*Ãt KCÆø}‡z¨ƒ……¸÷ìÙ“ñTZ7 ÙÛÔ:¬TGùÓÅöéÓ‡8uuu8V<˜¶n¨‡Rq‡pðýÊW¾2bĈ“O>Baê ª°Ø3ôïßóÀÊvذaøìø+©X¯^½º¹¹Æ#È-1E˜x=Bk•Áv!‰;m¶P˜¥¯~õ«ìÖ˜aC9äl’¸7nøðá³gÏ>ì°Ã¨?9Cƒ¤…r°aÆ!q§]hqq1¾M q/..†*ª”ŠD"Œa))¥êêêà·=zôÀ^R€n*&“ÉÇ{ ¾‡úð³ŸýLe é$î2PãGñꫯÒk^{í5Ú‰PøºXuV¸=a±Ê$tw-ìV™=z0éˆv:,}J ÊÊÊ`xN¯U™.ëà÷p#H$‘HÐ…*V8¬›6)îîVé"`« NŒc Ž:¬pàŽŒrѾL.Ùƒ¯ÞÑ*£½¯'´f$“U†™X”¹ÐTGÉÈ Ìòé¹9u8iÀeI™ˆ;3Ò~Ö²9•¥F6¬@X ©®®nnn«ÆäÉ“/ºè"Z ±X Æ “U†ViÜœ ]Ê| :OW,ËÄÈP©ânòƒ©ÎƒºöÁÙ½R·Ê˜l¦-•L¨3é¯lÆâ²9•¦C9{Ô€ã^wTÜa*‰DL•A¶;%LÏà–Áµo(O;³Ê0âNß ËªÖ*#-meeeµµµ”AŸÝb•Itì÷ÅM®¬îY¬2¸®‹`ă,1»É*sâ‰'žqÆL=‘÷¥Ð:.ð3&5|øð?üpÚ´iJÀÓ*S]]½téÒ пBhš%nMV¬ó²òc:t HÅ}Ô¨QµµµØR¤UFÛ É²bV6îKâ.S¥TÜã;"@«²'õðÃÿûßÿÆž\ «ŒêÜH]¬2´½H«Œ©vÉŽ{6ú¼¸fΖԲàqϬUfÆŒ+V¬ ß¬X±â´ÓNKýb¥Tcc#Nõ<eçlÇ:¶Ú(¥òH8H;qw©o·²²r̘1ƒ bŠe!¬¥ô´´´ˆ;»ÆBÜ]ÂA"פÿUÄãK*²³,áÅ555ƒ r'î<îŠtF&í~ŽVY’@€òa‰*#ÃA&îT[Âi’‰¸³©—òCÜM•Ç3$“0wífhißÔþ ÅöýФ,íBÅ>Oâ'›SÁ*ƒÖC­ >Ð}ÑhíȲ:wíˆbÚœŠÛµ.OüÖ‘×R…’fÒ“¸{zÜi:Ô½ƒ¿‚ëQIxÅqGÅ(švݱY wdóð˜žÄÉ~˜¾œ»w–ˆ¶4ðÖâ´26%\µÃ4Ï>ûì?ÿùÏ'N”¯>°%_%ˆ{qq1›´Ë‰=}A‹-ºë®»äÓYFCYµÄ]Û]<7§öîÝ{Á‚óæÍ£EŠ·ÀE-O»…¸S Ž¿2u9Fhi´¶ô´ÅeJÄ…¸ËÎ~EW•a3ºÒµ JÜ9VfâN¯±(îô»&‹Ë%u[â~ñÅ?ÿüóK–,ÙºuëÖ­[o»í¶_|‘ΨhÓµ_<}úô'žxbóæÍ{÷î}çw–,Yrë­·þà?p̉¬Ä”Iöf½_ê%—\òꫯ^wÝu&âë8ÂFŽ÷ŠwwÅEÉÔæÊ“¸çfSíñOxñÔ©S7lØðË_þR+)iŸÂSq× Rqg_«¸Ó¢0)rs*+@¸ûôéÓïºë®óÏ?¿«)î,:˜'qg~`µN+ÑØ b«UÜ݉»Vq‡ 0튭ey*î´GfŠ»ÖãÎn§UÜ•R/¼ðBss³)N‹#üÞEqgÄŽ¥sØœª Æç Oâ¾yóæd2YUU%³ÁŽ­PVâ¸þúëW¯^­-"j³ùá¸dɈ¤ä²žÀRÃJ&ôÏl®Xq—á (î–aÂQqÇ£‚PqÇ?õïßòäÉååå&ãéqÇ=|¬Ÿ¡½+;LGût¦ ­ÒuÔÚjoé¢MŠ;¤cªBHÜé+ ½-«Õ«W'“É3Ï<¾‘³V̪TܵwGÅ]¶\FÜe?ì¹X*Ç)©¸k‰»åUÊÏ¶k¥åC¿ÿä“O®¸âŠÔwJ&ÙLæŽ*SRR²víÚk®¹féÒ¥J©éÓ§?óÌ3¦nÎ~ñÂ… xàK/½´­­­ÿþÓ¦Mkjj’«„&ЮûŒìh•‹YÄk “Uˆû—_~I‡±x<þq×fnºvíZ–+üÌôZGânRܡ٘¬2Ì^¢mä¾÷9¤“B*î¬ðá¿Z«L4Í#ñVY~ã¸9lÍÚ ƒ'ØLç?X—슻Åzᨸ{†ƒd]•»âÇ¡‡b²‡#qw±ÊÐõ(킌ꥺÿþAƒmذ!‹ÝvÛmJ7–(a•aŠ;üÉÑ*âúPC¹¦ ¤£â—iwHsïÞ½1«U~ëÎkµ™4w™%ù¼¾w軞Šûé§Ÿ®:v]»? \ƒ’ÄwÖvöîÝ‹›Sµ)Û=îÅ]{“Iq·wVÂ4…¢¢"ø~È!kÖ¬)**zþùç鯔®Zšˆ;Þ‘)î¬xiçF‰;›Ì˜& ˜·ÂÂByÞ‚/ânRܵ¿B« SvÛÛÛÙæTÚá€l¯]Ǔ˒8sðTܵQeäO¨.•–Yeä ½ôÒKwïÞ [6•®šÉ;Êζÿþ………žÄ¾\F0¤$³#,VJðûH$Ò§OqßSFÑ*î8He_qÏ,qWJUWW?ù䓦¿2ŸºåâiÓ¦imj޳O­âîBÜñ³…¸³î×.éO ·oßžŸŸ_PP@© R‹ânÉkNì̸˜ö˜lb͈»6V‰ê† R[[‹R„…¸Ûw-ó¥¸3ù™•Neeecc£ãëPºÝ&« ÆÉëˆÊåËãÎ4`ÊÉXsñ¸Kj‹€Ànùùù»ví’ľm“QºÚˆ€âc¨\–I¥T=à Ef•‘V:ÅÝb•ÑVü«‹â¹Ý¶m[0Ås‹‘F¤UÆrkÖˆ´wºÇC›[ôVý[jÑŽàfJ©%K–œtÒIöLšÄ ZJôŽ.ôóòò B†Ié‹ « ý+J`« ]õ²´SªUÜ=7§ðV™®“℃oA`Åé ª£§£ÄU—`Š;“<Xe`­½½9 ã”Rf°ð»ân9¨!!‹íÛ·O«¸ÃpbWÜY~²¯¸ÇHZìiQÜMù§UF+qi‰;{GrâÇnDáWq¿óÎ;ÙoíŠ;}Ã?¼¾¾žÐfRÜÑ*C=îŽV™Lw|œ©S§þñ„ÏvâN‡(y£ôZeÎ9眣>Zž£)‡Öj°­2žŠ;e%%% î…/΢¸Ïš5køðá°)î&â«©»ví’}¬ê\2¬a•ÜU†}@@¦ÄÝd•ñ$îZSunæð*Äìß¿Ÿõ0ì¿T•pñ¸[H°£ânï¢W¬X±}ûvŒçHÓñTÜiËJ…¸›÷‚‚ŒÞcJ *Ïþýûw-q·Lã-ÕLw­JbI³OŸ>}ô‘Òµhü`sª–¸ËE9Õ¹-hsÈe¹9•*îÝÊ*ÓE ‰;-ñtwö¾éèµaÃv1%îC† immeK«ZŽ®í†´VG»´Ê@"íííì( չД™¸›&О?1)îtW>w Ö*î&‹Å***vïÞm‘.2¤¸çuDa‡dƒ)î}ûö­©©©®®fÙ3)îta´Z‰K{fžIqg÷Õ~‰»ü­©†àXz3gÎÄÓÅI˜—ÒÁÞØd©qÖ’m¼ ª¡…IûC¿VÚŽRQÜÓKÜ{öìIÃEË,ÉçF£TiÃÔ.ºè¢‚‚‚§Ÿ~ÚNÜÙ4X9/ h!w¹Hâ>dÈÇêO{{;&e"îJ©ÒÒR$îøDrÉ—½t6š4iÒ²eË ²>˜~i¿gWÜñ¯.Š;»‰{"‘€…bÖk±Á‚2~j”õô¸[º»â®F§žzªüÒNÜû÷ï¿`Á‚ÒÒR9=6yܵ`mDzÜ]wø!Ý>gWÜñ¯‘HÄ…¸[wÆ”R¥¥¥8Sµì}Ç4ûöí ÄÝ´DÇ;î¸ 6Í™3G â^YYY[[ ±Þµó%­UFV3q·+îÌãZeÒ“U†N”Ó¨¸3«Œ–ÞA¿3Â(9ís⮸k­2wør÷îݦX%ž„2€âò³§UCD³"¥Š‚¶C”­º¥¥¢ÝmÚ´I)õÃþ%Ŷ[pÖÍ2EÅê´‹;ËæÔóÎ;ï¼óΓå`"îÌýŒ‡Hã žC¦–¸K£‘£âÎR£AZÙ•~­2´{•V îppéèÑ£}YeÜ~wimRfâŽý†Eq‡‡u$îØFØ<«½iäƒßž ¦=WTT<õÔS7ß|s‚œ®¬Š»´Êø…\­2½MZ‰D¢½½\ï–:YVVöÉ'Ÿ0 ËLeRqgÄ}èСhAö¥¸ã_µÄ£vJÅݳ€³à.Ðu qÇÇ<òÈ#p»6#7ùä¸xeVÜ-ÄK2þ¯#š/Øgƒ±X âg ZZZ2d•Á"²$Ä…-q—‹ZTqw±µ¸(î‘H¤ÿþï½÷žãŒ¶Ž°ÄÙ碢"س¤ÝœzþùçŸþùìÝ­2L‘y÷CÎ>)aÍ´UF˶©âÎ {[ËMY®ü*îZâ…3~ö\ŽŠ»imùɸqãØ©RÐÝ$ ̼I¢ƒ(í%aÂSÓX rÍQ*ît‹)ÏlQX*ÃûöíÓÆ°Ã]qeÙúÐ IDATWľ‘ázLIeÓ*#ën•‘Ð÷x<D Îú‰F£P1ìV¤ÈðŽ2Gܵ‹¹&â¾råÊÝ»wWWW{*îŽL×ÔF܉»Vqg £ÑèÍ7ß¼k×.<Ë]eXq—VSj´4`3"œègWÜ•YÁû²òDB#!‰»|’¸Ë%VÔãÀ8îT\`CÉYguÖYgíܹb:KÅžâÄÊÄ2ñCà2c*V-슻ġ‡š!« x±”uÀ}ü@Ü!Û‘HDËUüZe<wöÛÁƒ»wœ ²©xT·½Jk•ÑfU«¸ÇüXeä¼¾‘›SµŠ{èqO슻;q×.?±”•üw¿Š»/;ÛœÊÚ-¬Í©XeXLkwJAÜvÅ¢ðx”&Ë=ãš&ˆÃ@~~>Äð¢•9·/âΨƉ'žØ³gÏÑ£G?üðÃx$î.VO¶Íˆ;þkš¤É¤ìVü¹v0Åe"îòç¨BÉd龈{4…Ð`âI)‰D b¸ÄqGa8uân*m¼ŒVlq5j|°(2¦6âYíe-r!îtÎLWèC´E”:q—VS·FKƒî—°Ü~¢m#”Þ î’ã"­2xâþµgÏž°Ö'_4kVX᩸À(û!ú¸à¿Ø…˜UÆea¡´´´¼¼|ëÖ­©Xe´ð[©ÊÊÊR'îÔ­Ž}, ܇Fß{¢sì8ÌÒøñã!"£UÆSqg¯{È!Ï>û¬_Å=]L·½J*î&ஸãOq—Ý×e—]6cÆ Xø¢Š;åK¡âž~X6§*¥úöí;oÞ<6Ji‘v«LZ÷LXe”NÉ@ÚŠIĘ́Î-‡îTæAÑIÜMŠ»<ÞÅîqG`7‡O­áÅJ qF£cƌж=ö~I+Þ ľˆ{cc£Ì˜IqÇo,#¥ qO—U&ËŠ;|ŽD"UUUo¾ù&Í€ËæT$+ÍU›I™OOÅÞ‚šiLÕÞ(»Eå5]©%îTöÓ^C³]ZZÊXkM*[Š;ÖOû«‡î rRqgoЗâŸ)K°+î´F±¹n,+++Û¶m›çìÉCô)XgÅV€±Å±aȤ¸›f€ªªª­[·¦]q§Š#àvŒ¸Ûûmùh°ŒƒÓåäTEˆ;](0ÍíÇ_YYùÁD£ÑŠŠŠhçýÄ–Lš:ÖX †X*Vø/¬ÆÐ—îIÜ튻Ý*㩸6 ÷¦S ”Öù¸§&âß———KЦ…¥Þ(ÁÔ]wílÁBA<wÖQ& Ø/À*Xq§9g{×RQÜi·è®¸Û£Ê ¤â®c‚)îø™9´ò ¡innvIŸBRÃäqWY…Ô2•¨ri´Ê0YHY‰;«“¦Ä‰;»¸ººˆ»œ¿)Ý[Ƨ†t²`•qQÜå¯äÒ»9ÕÙÜèXȘµÊÈG ‹Ýìƒí1¤ÇÝE\Ю„H,[¶ìî»ï†X«ŽV™X,&wÇ"´¿h4êIÜÑ~@ÉJyyyyy9}Þòòr-q7Í3©ˆ3uêÔÖÖVÖðÖTq‡†/ÃAÒu –íÀWUUµnݺüü|#8â^YYYSSƒÏÚ¥{GÅθ#G•ÁòZÅݲý¤“Nz衇`VpÕUW% K}³”¿Ö*ãBÜñYJJJ&L˜ÐÞÞnR"ä ÍŽUÆ^ë¤âZe2i•aÒ©#‚yܵ­.Ów|dˆl`*ãË*ã¹i3‰DŽ<òH*¥Kq75Zڵğ”.ãHÜá²wö\Jg•Q†w « |óÉ'Ÿ˜ò颸Kân*­¼&ËŠ;æý²Ñh*†VÆcIu5«Œü;Q)E·syÂÔFRTÜ-w™‚$îrœ^«Œ)5Zø ,R)Õ¯_?IÅ*óË_þÒ×õMMM?þø®]» Ä»§HÐ*îðó‰'öíÛ·_¿~ï¿ÿ¾òâÁð+AìŠ{"‘¸ãŽ;î¾ûnXŠÇ ž™tTÜaÓ¹£âF_xáËô¦7ÜpùçžÛÖÖ¶bÅ m–´ÅÌ*c_Z¤÷\)î¾'£(ìVw³ÊhûŽáÇ×ÖÖÂŽi)"f̘‘ ´ëhRò„&꨸ÓÂ1YeÜ÷h4Ú£GaÆ!qLÝãΆ=šme¶ÊȲ2.c#ÙÔ%£Ä=€Vd‚Å*ÿB$cÅõÔ”ý+]õ£À¿Â'¯Á±<°ÇÝRÁLVÕ!©Ž³Z•!Æ¢²²2™LnÞ¼Ù/q7­}gHqÖÜž0™€¥'sâHܳ¦¸K«Œ©[£¥á¨¸SàÉS«««—-[6kÖ,%BʘÑ6Uš>#îtï£"œƒö§ÊÚÈ.ÆCì]"_Ñ¡–7RqWbúm'ÁÆ «©©Á½¡Ú…¦4ö¢&ÔÕÕ 8°¦¦*v`âŽCÕüã5kÖŒ1‚I¹Z¸(î´‰õìÙ“m<³ÀSqg7:ÿüóyä‘`i´•|äÈ‘õõõ4⾋➟Ÿ‘àÓ¥¸›6§†V™ôþ9ÕiTÜoºé¦›nºI{ qŸ?þ;ï¼ÓÒÒ™Ù·o{ ©¸»w¦O8Ze<=îз´´<õÔST;´ÊÐ×J õeޏçÖ*O‰D†úÑGÉk,Šûu×]7{ölÔ/%<—)wø wëj1tèІ††É“'[®ÑfÒTµó"”¸Û‡|¿° Q(.hwæq׎¸â.§ÁÙ·Ê8zÜ),Š;l²Ú¹sç¯ýk‹Á]Þ,{ÐëÊ(.ô‡¦…q7Ye\"_Ñ¡–öŸZ9#ïÝ»W¾km»¾ì²Ë.»ì2¥Ô}÷ÝÇ®É&qg0­ª1Èùªœ~¸È‹Œ¸c¶Y²dR–ÿ1ÇÓØØˆçÈÊÊÊÉŠaçývœp §Á AƒÖ¬Yóè£*A±ÚD£Q¨Xbv"åÙ!îr“_0˜ÚˆgÍŒF£ãÇWº)DêVÙšRWÜ#‘ˆ§¸@K¯qßæ‹O«F²d¦NºlÙ²+®¸Â’ˆeö‚ÐZeèù>ÊLÜ/»ì²5kÖ !3 ®ÿüç?Uç`á–Ž]ª’žVù˜öšÌ–”Ñ2 ÖL÷`Š»/»ßÁqâ„`EaOÓ´ZLq7÷ßüæ7ÍÍÍ£G–½¢'q·+îÌãÎÞãÏ~ö3íÓ¥£âN¹©_9nܸÏ>ûìÙgŸU~ˆ{ïÞ½}ÝÅQqך2eOýï|G)!Tgâ®Vñ{Klï?ü0™LZhЧi5Ð/†zíµ×Ò<˜w÷8î&ÿn&¬2ZmIyYeÒ¨Á¢^{{»Iqg§F+òŒ¾w»U¦  à¨£ŽRbþƒKðî¸ýöÛÝ/fŠ;æ=îøj Ãé‚©ÛÁrcD0˜UFn¸ Sq©™µµµþóŸÑM›!{º¬2.Š;- :x;ÞŸö5ÉiäÈ‘#GŽ´'Œ}ûöY¬2vÅng"îcÇŽ¥ÿ5>8•%¾¬2È5å#0Ù±ÊIâÇYLúÌ5“ÀVöÊ”OÅ<úè£[[[M+$i´ÊhÁŠÂž¦ikvYI~czFV\ئ,V™t)îõõõ*(Éñ…÷7^sÍ5kÖ¬QJwÜq÷ÜsÝ|Àð÷¿ÿ}ùòå=öX[[[2™ôu#{8Hw,\¸ðÊ+¯„P0²G`Vü¯}¿‘„]q—ûìVÌ[kk«êìÊÓe\“Ç]‘ÑÔò{÷îe:ŠJ™I(1سŒÑ8sæÌêêj¿š!«L†wíªBŠ¸à‚ âñ8-»ÇÝDÜSñ¸#LBi*Š»/0â.õ9¬G}tï›Å=??¿¼¼üË/¿Üµkœ˜ÈRÃ1Ww¥Ô÷¿ÿý¥K—jKØäqωâ.­2¾ÂAPܸî¸ûUÜ­2 ±X¬²²r„ guý›Kƒu±Ê¤¨¸K« Ìp¨]>kȲâŽÄý'?ùÉ—_~Ù¯_?©d&î~w_išˆ{zw„»U¡µ+îè:†RD"@ec‹§‚\÷;vL›6mîܹ˗/WJ=øàƒÓ§O_·n©O9ÿüóž{î9< Цpx¤Ët Hé%îRq—^¼#,…<ÑZ¦ UÜ,´1ꙢânI™f[uæ7ôÐÏGp$îË—/ß¹sçªU«~ÿûßËl˜`ênì÷ô÷Ÿþô§ìéq7åþ*« "V_ €ÒÍÄb±lä8æ˜cÒxß´÷²²²ÖÖÖ[n¹å{ßûž¶—:wZàn•Qæ‰F£8`³· %§ÎO8ᄲ²2Ü h•ñEÜ(æRrt`¯#ÄýÈ#„ˆ„ Xý*î&«ŒIqw$ŽRq‡,ÑU߬Áq¸”—¥èq?õÔS=ï•iÅÝîÄ=-w„Eq—ƒ~,Û¿¿§âN…N™ÿÌ!—Äý¡‡š0aÂÂ… á¿ .|ã7–/_~å•Wj¯_¿~}à{¥KqWVân²Êø%îÚÚ€°[eâñxyy¹–}¶µµÁ(hQÜiáXwO@ éò¸Shm$î¶9Ì–@{òŽDEE…"Ñ÷STܵVüœéöOwO”i« ÂäpÀ·eÅZe°bÜwß}›6mê"VÉ´,ÓûtwÖF|w* `$ Óô^‘ç²+îxq`¸oN¥¥@qÇʶ´TwÕytÀ.Y¤âqg`ç£!vîÜ©:+î¾6§Bf,Ä]¾kâÎFL¸cˆ;k&¦ÝA &U˯âþ½ï}ïòË/ÇíõŽ÷r„_Å…=ÍTwv€—²Ò}ö½§â©™f}tÒNw–“¢¢"h&™@¶'£«V­š3gýfΜ9+W®ÌĽ¨"qw¬U*âk­2¥¥¥­­­~ø¡üáÆY>åàáh•q|Iܳ©¸ËüМ`i°\ÂDøe0žŠ;%Ņ^¸téRà=pp†ÖÆc·Ê° õŽ’¹§âžŠùÁlnLóãÒK/½ùæ›Ýc´»ß7EÅ&e'î)ZeLm$Eâ>pà@šüK·‡*¥b±ôv{êwSÕ¥¥xsj<?ôÐCUÊÄ]ZeXwÌãîˆ?þ’r‘r]<îÁâ¸#LŠ»ü2`Í$°U&˜â^UUU[[kçYSÜYQØ3Àãné‚RQܵÄ]{e>€‰ýÃd¹TÜׯ_϶Œ3æõ×_ÏÐí0x"³(RÀ±´Ë(lK ü[PPà~ÞÀ2$Ó<û•±qA9°UÆ/q·ÌãÇ?þñöíÛ‡N¿´´@væ„-¯û"îZñÏ_Ä=CV‰3Ï<?˘2j•¡ã7EÖˆ»É*‰DRñ]x´˜–^â^\\ ;óRln¬(üV{ Oâ.Ë<ÊvÅ=uôêÕkÍš5±XìÉ'Ÿ„oLu–ÛPè‚Þ½{_|ñűި¸ü‡˜N{{;}³P =zôؾ}»ò²Ê———§+iĈ*âîi•alÛqèÑrô¬)î¦fâ¸9•­ûѧ:thcc#z\#0q÷;ô»tžiQÜåŸÒ®¸kï¢ÌwDaaaqqñàÁƒ3ÇfsIÜ·nÝ Qc½{÷† ”™žùœ¢â¿e,ÐAAw¿r;æ-˜âîS—ßWVVÖÔÔ`Î(îpe&÷¯|å+òKÌ¡g_âæT–Zº¬2± Çq÷„ô¸§b•‰F£.jS×ÙœJ‰{FïØ*㋸Çb±¢¢¢/¾ø"EÅ!ÅŠŒ¸›V!LÄ=½í"C,ˆßýîwð/»»â^QQñ“Ÿü„Þ>øí½ß|óMö Ö¨Ãuuu ,˜4iËðܹsáТT€ÍÇ¥ÁöêÕ+JÅÝåäT_V™\w¿Š;›Ò_•——‹•,K–L¦±Ñ9Ö%%%²ÓKEq¯­­-))Ù¾}»;q·(î‘H„À„hhh€·–¹Ñ$—V™¬ìPÛ¶mƒÿžp ‘HóXâ---mmmøŽ”~nkkkiiÁ!“þ©¥¥…nºjjjBâ.SÐ&Žy€úôÎ;ïh/Û»w/|lØñ)0¸QSS*ÂòåË7lØpüñÇïp-ë±çS „?IiߥìOASÀnÄ ™^ˆe Lò´çSûâ‹/\ž‚)îx™É*Ÿ7mÚä·,y°§°yófÕQŒ,ùîݻ鯴’ðþýû!RQÖæ~O…ðïÿ;ÀS¸—RFV?éqw)ÖIm ØÑ³ðÁ±$ÀÒ °mâŸÞ{ï=Õù•Ñ<À*»QŠO!GM÷°„ׯ_ŸH$pG>;Ëj[[Ûœ9s,XÚ0mtmmm™hr±È’hÛxq€<¼õÖ[ðJ&•§`¤ JuòäÉK—.=å”S |¨^xÁ^.y())©¯¯Ÿ2e f^¢6…gŸ}¶µµ•†åcžVqßµk—"µm÷îÝ–r2dHmm-„]Æ?1>½#Ž%Æ’M)0¢‰ßË_¥ÞÛ¯[·>$ _)à³` ó€Ÿcûp˜`)(¥?üð—^z©¼¼ÜÔOF"–üÓǬÍCIIÉôéÓU‡^ÖÖÖ†sࢢ"–*‹°<àWŸþù”)Sš››wîÜÑAeÉlAÞ´_¿~›7o¦×lÚ´©¢¢Â%)_÷…xìâ3Ï<“L&á4Ÿë¯¿Þ=) ŠÏ=÷ûþâ‹/†[üóŸÿL&“K—.UJÕ××ûMÿôÓOWJ=üðÃÚ¿þú׿†»üñðaýúõ.Éþõ¯…ßþö·á‡#FŒ€oî¹ç¥T~~¾ö‡‹-RJÅãq÷G€È }úôÿ~ðÁpǦ¦&÷DÜqòÉ'Cú¯¿þºöôÞÁ«I’ÒàB9µã‰'ž€‹ßzë-—ìÁhضm~VQ¥Ôßþö·Ç>ŸzꩵµµJ©åË—»$ž@°ÿ‘#Gâ7(Ë­\¹’]Lç!/¾øâ† >ýôSøÓ¾}ûš››ÿþ÷¿Ûo÷Ío~S)5gÎö=¾Ç?ýéO©>’S§NUJÕÕÕá70Ìz衬b¤¿øÅ/”R'Ndßÿ×ý<øÓO?M¿‡##z÷î-“zà”RýúõÓÞè°Ãc¬(PJ˜?¾ß¤`ŒO2™è<ìh›ØW˜€‹±óæÍó{wü¿ÿ÷ÿ ý;wj/ ¥ñ­o} .þÑ~ìvx°âå—_,Äᇮ”:öØc!AlŒçž{.üu÷îÝ)Þ.IŠâßø†Rª  Àñ‡»wïnmmݱcG2™Ä£E”R[¶l ˆÓ5×\ò C?Ïe—]æ÷‡~Áš V¤={öX~…¿téRøºÜë®».í9|ûí·á^p‹;®ºê*øá† \®wé<çÍ›goïwÝu×öíÛµÂq¼GìOÏ=÷üÉ2n~üñÇôAp\Æê‡€(ï¿ÿ¾Lä_ÿú—Rª´´Ôt„ÊÁΞU&)"¯qį¾ú*²O¥Ôk¯½}P&  œÌjZ¤F/ZF­2Ò!ãøx8‚ÉznZUd†`0ëE£Êh72ÙåZa°˜Xj)zÜMQe²o•S*\¬2Š¸Î”R½zõ‚I^ ³;PtaßçjsªR*//¸œ!’â}ýnNÕn¹¶WTÜSÉ­éd™ÀwLaàÀï¾û.¤SXXX__ïÙî2äq—é›\´4D•1Ý.]¶èé¿òšôšÁØPâþyyyÚœ°!I¾ë¦¯¬YeLÍÄžge“d#Š66NZà²ÁþCÇÁÈ¥ódÕUâºë®óÌlw.U¥_¿~pn1»RZewïÞ­Ý ‚Š»é.Y@.=î3fÌX±b%î+V¬8í´Ó2t;-qìqWVâ·0` %îŽÔÔÔ˜Â*I‡Œß§ðô¸k¯@Ü3áqׂYe,Ø=îñxÜ¥kK—Ç=›qÜíUÚ´9þ„Ä=ˆ¢Êd9$}4[›%ˆ`ß¾}çÍ›7kÖ,™”½’À¸˜¢âΊ"ĽªªjèС†ËÙ!î–#-Ô÷´[eb±XEEEyy¹Ý*“–ÒcCI*Š;Ë•)ªLW¶Ê°fbšœK°Ò»ôÒK›››/¹ä’´ç0kŠ»Kç OÝ÷9~ÂêêjÜ(‘[ZS¹ë¹n»í¶Ûn»-XRŽV™ !°âŽSùZe2ª¸[ˆ»Ô·˜°‘QÅ]m‰cAAÁŽ;¢Ñ(]ʾU³tTÜUÊ,Ê$ÔåPqG«L&/ÄÈ‘#aqV›åGÁÍ‚ÇEê÷Tªt¦­2žk°´4Ò¨¸§Î3Ðä£=w #0¦6”¤NÜ3§¸g¡Õ6GÅÝñÊ‘5ÅÝ¥óì:V™Ýÿ i”<÷ìw¿ªšæM|Ún•ñÕõÃ_2™Ì’ 7bÇÈü(òÈl A0âî>œ`™Kâ_¢mÕ÷l*îÀóèÙé )w“UK)WÄ=zÙ¹ü(稼¦Ó0.¦HܵmÄrS{R)*/Ñhú µ SDÐÒHËæÔtu‰.ýsz`X]Yqw·¬¤m3  ¸gXCüÎÜüúO\:O´<øÊ ó/yHÜ»'ÒHÜ—,YÒÖÖ"%E–­2øÁoM•­ÑÞ­pn0År»gÏž uR7Üc`º@™Ë*qwѱXlß¾}²„/¸à‚-[¶”——ÓiU®6§Ò;fTq>|x}}=„,Ô&›i«Œ¬Òé•$ƒåGù™±¸xÜ3´95‡¥¤mDi¯]O©[eTÇã¤Kq· ž“â½R¤ž²F¥QqÏU‹vŸ0dÍé¾ÀŠ;Ξ‹)Úó·ÚŸó¸ èþOˆH#q—UÛœš!0Å=‰¤~rj¦ÃA*¥úöí»sçÎ )©7_Š;C¦­24B(Å÷¿ÿ}øÐÞÞŽUsEÜXe‚‹—^z饗^*¿Ï¡âÞEˆ{z­2éÃ2í2wÉ@戻¯}–i!îñx|ß¾}éÚœjïŸ3T½3¤¸XV¿V™,(îÅÅÅË–- p£LøÓºÔæÔ¹Üœše°¨2™@Ïž=qïl†n¡„âîÞå ˆ,©ÌyÜ•R|ðAkk«¯íhîðô¸Çb±ÚÚÚÚÚZíimJ© &¬_¿þ‘Gq¹]0»²–a,ƒ¨±Ñhtüøñõõõ¾bn¤ˆX,ÖÚÚºzõjü&£Š» YÞœª*Ã*Fvíˆ#äNíÄ}̘1 &LH%W¬(2!¿ùBFJÏÍ©´4°~¦Î}£K:ٴʰS0·VIÜ¡4Ò2 z6k&]ÐãžH$#Y IDATæÍ›‡Nú‚_wœKç9yòä Ð8àòzÜd(-E</))ùüóϳ©¸»÷ûx8³Ê˜g€ñ2Ëš±'qD"ÍÍÍôvTDaa¡ûá_†df–k °yóæH$‚2|Ö0eÊö%ªŒÊ0q§[u39ÂÍ©=€Éž_ò­½Užp 'œpBй2R–+â.×ñÒOšÞ˜Tj‡R¸ôÏéµÊ>€‰ÁÓ*“ ËíL]Џ†ß‘Υ󬯯¯¯¯–Ÿ¸ºÿ"X8È aõêÕyyyôt®´ƒE Ði¢¥'ÓV™¬XÞÃ=XP÷#î™F$cËr«L÷BDv6§fpþY2™„®!»c‡ éúV™T!«L—’H»U&½­)ËŠ»öäÔLßÚ’_V™œ ·Ä=£V™™3gΜ9Óñb¨-©ødTúÂAfß*Ãnbƒµ¢™ ›8qâĉƒg+(º`÷ÀÈh‹ †h4ÚÞÞn±ÊtåòLº'¯Ò¢Û(î‘H„òç^MÛÚÚàCaa!ˆšŽ½aÞõw,@ÜÇ?tèÐ#F¾iF!KI‰Ý*s€*îRIBI2•ŠãÆ[³fÍ}÷Ý—ý[[ ‹"·ò,oyg ¥µ%ÅŠzà*îX)ÆŸgÈ*“5°fÒý6§º÷,tžPhEEEìû iI]]·1¤Ýfsªêx– &$“Éü㎿ڸq#~Ñ=sŠ{n‡XÐÒð‹ÃÉÿþïÿ¾õÖ[C† |ÓŒB–FN6§fÙ*£ÝœšJÅŒòòòúúúÚÚÚìßÚYro@6‘[ý–FTܳ‹fYPÜ»²ŒÊš‰_«LW~4¿-. 'dé WÜ»îT/íè6Š»R*//oçÎ~°Ñ£GãçòòòÍ›7ûRÜ»™Ç–†_t?#, GŽûmNM¥bt3È¢È-qÏ­@K#Šû¸9‹"ʇçæT,œ®ÜÙ²fRQQá8 ÿío»k×®êêêLå,eøú³Ðy†Š»Êq߸qã5×\³fÍ¥ÔqÇwÏ=÷ 4Ètñßÿþ÷åË—?öØcmmmÉd’ýUv:ò ºqgçB(îŽ)Ù•‰{*È-}Éâñx<ß·o_ö7§æÄãžÛ8î r;eí:æêêê5kÖHöà ^xá‡~è¸Öw«L†<î™ÛœÚ=Öž˜8q"OqÄ™ÎLŠè‚åošì…›SÓ†;vL›6mîܹ˗/WJ=øàƒÓ§O_·n©¿;ÿüóž{î¹Q£Fi/ðÅÔºq¿êª«¶oß^VV8…L÷®o•I]‡@d'žxâ®]»´²âÇÝtrjwj¦ ¹²vEEEmG\qÅiÉŒ‹©:CÕûú믿þúëÿÜd{@¤ëpÙÁÐuZâþûïß±c‡ ‚wP÷Ìö¿=ôЄ .\X^^^^^¾páÂcŽ9H¼ëׯ_¼xq†¦¡Ý‰¸/\¸péÒ¥¥¥¥¾~EGðåqï–V™Ô`ê ¡-U«V™dE\Q9@÷C=´¶¶vàÀøMn`êšEш{®îÞe+†‹°RRRR__?eÊ”´Ü1]Eá²KG‰.[1R‡_Í. E1wîÜ+®¸BŠ;U÷Ìö€«V­š3gýfΜ9+W®ÌèMMèNÄ=èᬪªêÝ»·Ë[eºrQ§~SW~:¿ð[*¬mN½æškš››Ï?ÿ|ü&·0uMÈ¢è V™\Ѹ.[1zè¡d2yÉ%—X®éÛ·ïš5kþçþ'-wLWQ8Zeº8ë²#utµ˜,8¨÷Ì>áúõëÇŽK¿3fÌ믿8ÁŠŠŠÏ>û¬OŸ>Ó¦M»é¦›|× ‰;Åí·ß~ûí·;^\__¿aÃ_†Î®¯¸§‚D"QSS“¢Ãõ€ÆNÜ%B» fÅ=DÚÑ=÷nŒ.èq7!TÜÓ†­[·öêÕ‹~Ó»wïÖÖÖ`©vÚi¿úÕ¯¶oßþòË/}ôÑS¦LY·nûÏÑr@ÔÂ.…¢¢¢šššŠŠ ÷ŸtoâÞ£G 6´´´ä:#9CF‰{¬2Ð?t×›.tâvàÝŽ÷ðç PùG"‘ 6lذá€ÈmŠ8¤‹•+WNš4©   ²²òꫯ^¼xñ7ÞèòCpâΚ5 þ[RR‰D/^LýX---ôìú'ú¹­­Òµ+üUò€Ä® –½æÀ}›éMaõêÕ¾R`Ä=]OŠ{öˈûÎ;1‘÷m¦+ø—þ©½½]‘÷žå§€û~ôÑG9)ÉÇ<-OÑ RÀÿ¦žÕyÈR@«L×,üyÎó¡@ȈÅbŽ)¬^½:‡OQSSSSS“ý’\¼xqD•9$Ó™l¿~ý6oÞL¯Ù´iSEE…KRž×lÞ¼¹¸¸Ø=©§Ÿ~òöå—_zþª[bÛ¶mY»×m·Ý¦”ª««ËÚý"›¥Ñõá·4š››•R. Ð.\¨”ºöÚkÓ›¬ ~úÓŸ*¥N<ñİb dQ@0ßG}4'ùùÚ×¾¦”züñÇsr÷°b ÒUƒVJýæ7¿1]ðßÿýßJ©C9$-·ËºqÅ€‰cÇŽu¼¾E¤—`S¤Sqg9VJqį¾ú*½æµ×^;üðÃÓu;_×ãúûÁ°’¢E*á#ý¢ë[e²Y]~K£ûYepsjX1²(f«LX1é* G{w-wãŠá×ãÞ‹¢K!³ýïŒ3V¬XA¿Y±bÅi§––Ä¿úÕ¯º_;Þº2›ì6ÃÝ:`kôèÑ ãÆKo².㸻 ·ÛC»÷é!B{GXþ]™È^|ñÅcÇŽ]²dÉüùó•R>øà‹/¾¸lÙ2¼ ‰8 çÓ§OŸ?~]]]ïÞ½?øàƒ_þò—?úÑþð‡?¸g&ÜœšM„ñº72ô~Ò›¦#0Ž{Nî~  ·Q&BÑ-÷.‹(ªÌA…ÌŽR%%%k×®}ùå—«ªªªªªš››ŸyæyV-‚šú™ÁáÂ…=öبQ£ŠŠŠ&Mšôæ›o655?Þ=3¨¨´¢Z6ωèúV™n|jFø-î71›6mÚo¼ñÐC…!‹"C+-Žøö·¿ÝØØxÔQGåäîaÅ@¤«(^yå•ÖÖV‹{ö€°ÊtãŠáwâÔ‹¢K!ãí¡ººúÉ'Ÿ4ý5)¶´š®œ6mÚ´iÓRÉI¨¨eóp„®Oìºñ©ÐE`Ê!ÊÊÊÀ é+ìi÷†¬e"ÙÉq› { DºŠÂóðïBñíÆÃoùwã¢èRèÒÙô<î݉jte„÷îÜ*¯!r…î7a Ñ•Zer‹‰'nذ¡   × Ñ q÷l"·Ñ'Bdá€zp"l×!² ŒãžëŒ¤(,,¬©©Éu.BpDýox¤y6ýg]_qÝx~K#———÷ìÙ3CùÉ!Š0yÜÎ^4¬ˆ¬Å!„EvpMd¸wñ. £=î¡Âoi 8°µµ5C™É-Š0yÜ»r»ÎŠÈZQ›SÊ‹";èÒí!½())illìâ]@·A×*"D¿èúòÝ „â"D–q±ØD"‘«Ñ!Bâ"D÷CHÜCd#FŒX¶lÙ€r‘!º"⢭­-k'7nÙ²eUUUÙ¹]d³4º>ÂÒ@„EEq0oN +"kE1pàÀyóæeáF© ¬ˆ°(²ƒƒ±ÿ=h±qãÆ¬Ý«ªªjÞ¼y'œpBÖîèÙ,®°4aQ dQÌÄ=¬ˆ°((ÂÒ@„E‘D,guD"ÝÿC„" ˜}úÎ;µO™2eË–-¿ýío7mÚtÿý÷/^¼xùòåYÎpˆ!B„"Dˆ¹B.§G?úÑ^y啟ÿüçøÍìÙ³9æ˜+¯¼R^|à 7ÜqÇ‘HþûÚk¯qÆo¿ý¶ç]Â) ", а4(ÂÒ@„E‹‚", DXai ¢ èžŠûªU«æÌ™C¿™3gÎÊ•+µßyçÈÚ•R‡vØû￟Ùü…"Dˆ!B„ÑeKâ¾~ýú±cÇÒoÆŒóú믻üö÷¿ÿý¨Q£2“¯!B„"Dˆ!ºr¹®‘——÷Å_$ üfïÞ½=zôؽ{·ý‡­­­Ç{ìC=4iÒ$Ï»„k7ˆ°((ÂÒ K", а4aQP„¥‹‚"ƒ¥‘̉Ğ={è7{öìÉË˳ÿjóæÍ“'O^»v­ã]2Rj!B„ñÿÙ»ó€(ÊÿàϲܷÜ^à}á‘›(¦„€š'dV¨¥©_³2-3ýŠg¦‰šGßÒ<ÐÔ¼IK)Å o<[îK9–ßÍoZ`˜]vw–÷ë/˜™}ö½ûÙgžy *Çõ1ÔÚ `P§õt“&Mrrrœ™åÙÙÙvvv;III>|øÚµk}||x>/jwÐÚã^³ÜÝÝ=&&†½Mlll—.]êÚCjjêСCCBBüüü4ÛV#äÅ©#FŒ e/ õ÷÷¯uãÌÌÌ!C†¬ZµÊ××W+­Ð!B^IPXXØ£G©S§~üñÇ„-[¶ìر#&&ÆÂ¢ºq¬¡ý2™lÞ¼yï¾û®P­À—?{ölΜ9gΜ!„øùù­_¿ÞÍÍYË.ÜÙCä¹¹¹¶¶¶Úi*€€0w@# äwà …;@#€Â @áРphP¸4ú_¸'%%X[[[[[$'' Ý" ºuëÖÌ™3mmmköž; = êÂ… ãÇwtt´±±ñôô##cïÞ½wïÞ]±b…Ð-FXXØÝ»w,X tCtBXX˜———©©i‹-fÏž<þ|¡% ¹\þý÷ßOž<ÙÑÑÑÑÑqÊ”)«W¯^´h‘Ðí؆ fΜihh(tC³fÍš[·n=z4'''''çèÑ£·nÝ º]þòË/CCC_¼xñâÅ‹;w~õÕW(#µN¥/†žá¯æ;+ªÓXŒçÏŸ÷èÑãôéÓ ËÅ™#""¢eË–ôg±EѶmÛgÏž±—•QžžnaaA[...5‡˜››ÓŸÅ–•••egg—Í^(¶(ZµjuöìYö’³g϶nÝšþ,¶4Î;çããcaaaffÖ¯_¿ß~ûMœQ¨·ÄR6=ÿªäîîÃ^Û¥K¡Ú# î(ô2¨ÔÔÔ¡C‡†„„øùù)¬al½zõÊÌ̤?‹-Š'Ož´jÕJaæræ±¥¡ Š5¤JlQ¸»»s¯UÔO?ýôöÛoÛÙÙ±Š-Š”””^½z±—ôêÕ+%%…þ,¶4¼½½#""ŠŠŠJJJ"##mllúöíKW‰-  yùʆ£ç…ûˆ#BCCÙKBCCýýý…j€¸£Ð¿ 233‡ ²jÕ*__ßškÅ–†‚Ë—/wêÔ‰þ,¶(8úNˆøÒPpàÀ~ýúÑŸÅŘ1cþüóOö’'NxxxПŖ!¤¼¼üÇüüóÏ–‹- WW×›7o²—\¿~½eË–ôg±¥¡`Ë–-Ó¦M£?‹<І¼|¥ÃásR ñ*((hݺõŠ+èè´åË—·mÛ¶¨¨Hèvi\Íw–; ý ªgÏžûöí«k­¨Ò""‚®[UUU{÷î4hPÍåb‹bãÆnnn¿ÿþ{nn.ãÞ¢E‹M›6ѵbKcøðá·nÝ*++{òäÉôéÓg̘Á¬Uê-±” GÏ ÷ªªª„„„Ñ£G[YYYYY=Zax«žáþnÆ…žUk¹¹¹ÌâI#""bìØ±ööö†††M›6 ¸zõ*{ñDQ+…ÁâIãÌ™3cÆŒ¡FóæÍ'NœÏÞ@'Nœ¨u•Ø¢8pà€§§§­­­­­mŸ>}~ûí7öZQ¥±ÿþ.]ºwêÔiýúõ•••ìµz…æJ,¥Â‘ÔÕÐz>Æ@? phP¸4(Üî w€F…;@#€Â @áРphP¸4(Üî w€F…;@#€Â @áРphP¸4(Üî w€F…;@#€Â @áРph4^¸'%%X[[[[[$''«¶ñ… ÆïèèhccãééyìØ1…ÇJjÐÈë‚f ÷¢¢"___™L–˜˜˜˜˜(“ÉüüüJJJTØØÛÛ;++ëØ±ciii7n Þ¶m›ÂªþM£/ @›$-p×­[wóæÍ={ö0K&L˜Ð»wïY³f)»ñW_}µzõj¦=66vìØ±?f6–H4ûZ¤Ù÷ãÇOš4‰½dÒ¤Iaaa*l¼fÍöè—víÚqºÐ'š-ÜïÞ½Û£Gö’îݻ߻w¯áŸþøãþýûÛÛÛ?þ|ß¾}ëÖ­ —ÉdÜ-Äi¢ …ˆ‚((ä@!¢ CsQh¶ÇÝÊÊ*""âÆnnnnnnQQQgΜaªv¥6ŽŽŽ~ï½÷$ÿ–——G×íÝ»·k×®æææ^^^ñññ‘‘‘õVí…Ø¿áÛ!QPÈB DÁ@r QPÈÑX{Ü@-P¸CµÉ“' Ý€(äÀ@Œùóç Ý€(äÀ@rбŸÔÀižâââºuë&t+„‡(äÀ@r`h®¼{ÙŠÂÔcÜAm$µ!š¼Ë—º¨·…>œ1cF»víÌÌÌÌÌÌ:vì8eÊ”ÈÈH5>º¾Z¨÷eª°7Mç,’÷„‚Â]ŒªjhÈÞc±räÈ‘aÆõìÙóÌ™3ùùù‰‰‰K—.½}û¶———ÐMÓñÀÐe(Ü¡šx† =~üxîܹçÏŸÿÏþãææfllìää4~üø¨¨¨9sæÒ$ñ„/,äÜ@B’Ò5ÈB DA!-@áÕ˜þQ‰DRZZúÙgŸ9;;3 çÍ›×¾}{sss›Aƒ8q‚y{ÈM­Ž?îééiaaaaaáééùǰŸ·æÓÞ¹= IDATBîܹ3tèP ‡?þ¸¤¤„½ÃóçÏ÷îÝÛÔÔ´U«V¿üòK½{c ™={vóæÍ–„„„0¿¦¤¤|úé§VVV­[·ž7oÞË—/‚ª5½º‚â^ÅÞ'ÇóVVV._¾¼U«V&&&:tØ´iS­/°Þç*))™>}ºƒƒÃ×_]UUUZZúñÇÛÛÛÛÚÚ~öÙgÌ®8Þ;޵uÜ/¡®·•Ôw<ðíÌf111ƒ¦;œ1cFII ûO€»u½Gz¯ÿþB7A'  90…´¡æ¨ Qau½df9!dòäÉ{÷îÍÏÏgÖŽ3fΜ9Ïž=+++ËÎÎ>~üøàÁƒ¹wȸråŠÝ¯¿þš™™™‘‘±{÷î&Mš\¿~ãé?~ììì¼~ýú´´´´´´÷Þ{y¢øøxúk×®µnÝúìÙ³{Sо}û‡r·¹ªªÊÍÍmûöí……… ï¼óÎüùó9^/³#(žr<ïôéÓ,XðèÑ£¢¢¢sçεiÓfÿþýµ6žû¹>üðÃ;väää\×ÓMœ8±C‡‹-b–,^¼xéÒ¥ô‰&MšÔ£G/¿ü’® ûùçŸi_o­{S`ff–——gbb±‚ÜÜÜ^½z=yò¤®×Ë,äJ… žwÑ¢EK—.eÖþùçŸK—.½zõª²ÏµaÆY³fÑ_/_¾}úÉ“'ûí7ºÐÔÔT¡£TL&;~ü8{Éï¿ÿ.“É82hР½{÷²—ìÙ³‡ùÙÇÇ',,LéÖÿcöìÙ!!!OŸ>娦´´”Ý»cÇæç:\¹r…½ñöíÛ^kPõ®â~^p?Üï÷Úz o+÷ñP+î×îççwàÀö’}ûöñl§zß#%hè Ac!ÂêzÉ„³×ÐËËk÷îÝÉÉÉåååiii ,:t(]åîî~ôèÑŠŠŠºžñÒ¥KMš4¡sdffþúë¯vvv×®]ãxºG9;;ÿðÃtÒ 6°'ý¸sçNÓ¦MwîÜùâÅ‹¢¢¢Ó§O6ŒûÕ)عs§‹‹KHHÈÇ_¾|YPPpÿþýï¾ûŽyøû￘–––‘‘±fÍš·ß~›Yµoß¾víÚ]¸p¡¸¸øñãÇóçÏŸ>}:³–#(ŽU|ž·Ö—V×ëåó\;a–p¿wÜkkÜ/ãmå>Txí}š{o5EGGO˜0¡E‹FFFæææ;wþüóÏ™ k²³³íììlmm'Ož\XXÈÞóÆÛ·ooddÔ²eË%K–ÐYÏë ŠcópŽçUªpçó\;a/áxï¸×Ö<0ê} u½­Uõ*¼öèèèš™™ÙÙÙMŸ>=33ÓÄÄ„O;•}ôÉÅ‹…n‚N@r` 904÷q ºK3ˆðâT¨éï¿ÿþꫯnß¾-tC ÑÓ\y‰1î F£G¾xñbAAÁ‹/Ž9òÑGqOÿ 8±÷7£Ç@œ>WYYÙµk×Ï>ûl„ B7 ôzÜAã"##…n‚N@”ÞçpéÒ¥‚‚‚âââk×®qTízˆ‚Br` 9hØû›Ñãj„wQCáРp‡jùùùB7A'  90QPÈB DA!-@áÕ’’’„n‚N@r` ¢ …ˆ‚BZ öK3qq*¨.N5 ÷¤¤¤€€kkkkk뀀€äädÕ6¾páÂøñãmll<==;¦ù¶h…{QQ‘¯¯¯L&KLLLLL”Éd~~~%%%*lìíí••uìØ±´´´7oÛ¶M‹/Eྠr Q0…(äÀ@rÐ!Gx¯[·îæÍ›{öìa–L˜0¡wïÞ³fÍRv㯾újõêÕ‰„®Š;vìãÇëmƸ€éç÷ãÇOš4‰½dÒ¤Iaaa*l¼fͦj'„´k׎{Ô @ã"dá~÷îÝ=z°—tïÞýÞ½{ ßøäÉ“]»vUW;'dáž››kggÇ^booŸ““ÓÀsrr‚‚‚Ö¯_¯Æ¦ŠA\\œÐMÐ ÈB DA îÚµk÷îÝ1¶àør` 9h¾M™‘‘1f̘üÑËË‹çC$µ f_cǾ{ûçüü|öQÛ¸öàêê*xtaÈ ‡ÿL£h쯢!{رcDzeËîÞ½·cÇŽFú*Ô¸WWWÁÛ  {@ÌÏMš4¼ º°æ\kI4FÈK3ccc™%ééé={öLKKSmã”””áǯ]»ÖÏÏgpq*·Q£Fýþûï]ºt¹wï^÷îÝcbb„n€NÓÏ‹SÝÝÝ>bcc»té¢ÚÆ©©©C‡ á_µ·—/_þý÷ßááá666±±±¸ô@(Bî#FŒ e/ õ÷÷WaãÌÌÌ!C†¬ZµÊ××WC­¡K—.•––vïÞ½E‹´[$<<\èFˆ”…û´iÓ._¾¼råÊÜÜÜÜÜÜ+V\½zuêÔ©ÌìABÜ2dÁ‚Æ ÓökÐ#¸o…(äÀygΜ!„Ð’½mÛ¶…»è r` 9hÀ#¼Ÿ={6gÎæƒaýúõnnnÌZ…B×z@nn®­­-w0Æ€ƒÏ¹sçNœ81|øðtêÔÉÕÕ511Qèvè.Í•—b/[Q¸ppppÈÎÎNIIiÖ¬™\.·µµ-,,ÌÊÊrppºi:J?/N]–šššmgg׬Y3BˆA÷îÝ !˜X@(Ü¡†¦QÈB 1GA'3îÖ­ý522²gÏž„èèh!›%41lÈ((ä †B7tEÿþý…n‚N@r`ˆ9 …½ÿþ< ¢ïqó!Á†ˆ‚BZ€w¨Ýýû÷ !îîîÌ’:B?~,X›D …;ÔîáÇ„Ž;2KÚ´iCyòä‰`m1îP-??_è&èä@!†˜£ ch/;!$??¿Y³fæææYYY‚6MHb>$ØQPÈA P¸Cµ¤¤$¡› …¢"///++Ë‚N)CIJJ’H$­Zµ"„<}úTÈÆ J´‡„äÀ@rбÏbŽyÜjuíÚ5OOÏž={Þºu‹½Üßßÿøñ㇠ªmº ó¸€VÑîÌ8F»v톹…;Ô‚–æíÛ·WXÞºukBHbb¢m7îP ÷M …¢‚–ænnnÌ…««+÷`VÑ QPÈA Ä>ÂcÜjåããsîܹ¿ÿþ{àÀìåÑÑÑ2™¬[·n±±±Bµ @—aŒ;hUÍwŠ.ÁPí{3zÜjª¬¬433«¨¨())155UXkmm]XX˜——gcc#HótzÜAãâââ„n‚N@r`ˆ3ŠÔÔÔòòò¦M›²«v& :Ì]´îâ<$jB DA!-@áÕè'1  90ÄųgÏHq2L"/ÜÅyHÔ„ˆ‚BZ€Âªá”7…(äÀgtÒ…a& ZЋvbq5!¢ ƒ pE)))„-ZÔº¶yóæÌ6 5(Ü@QZZ!¤iÓ¦µ®¥…ûóçϵÚ&ÑCáÕpß 9PÈ!Î(RSS !Íš5c/d¢y»8‰šQPÈA Ä>"¦ƒ¨éÍ7ß¼xñâÙ³g PsíÝ»w»víÚ±cÇøøx­7 @×a:HОZ{Ü* î ˆŽq¯«p·µµµ´´,..ÎÏÏ×n»D …;TÃÐ4 9PÈ!Â(òòòJJJ,-----ÙËÙQК^œÃÜExHÔ 90…´@ì#¼1Æ@Áýû÷»téÒ¡C‡Ôµ¯¯ïÙ³gÿúë¯Aƒi³mºcÜ@K¸ç‚¤h{zzº–Ú(Ü@C¯@­‹³³3!$##CKmîÀÀEfr C„QÔÕãÎŽBÌ…»‰Z!¢ ƒh¼pOJJ °¶¶¶¶¶HNNVyã[·nÍœ9ÓÖÖV"‘Ô|¬¤5¿}—””$ttr C„QÔU¸³£ …»8‡Êˆð¨r` 9hf ÷¢¢"___™L–˜˜˜˜˜(“ÉüüüJJJTÛxâĉNNN—.]ªëéªþMý¯G¯uëÖMè&èä@!†£¨kwv...D¬=î"<$j…ˆ‚BZ`¨Ñ½oݺÕÓÓ3((ˆþtÿþýmÛ¶Íš5K…ïÞ½«ÑÖáwqª˜‡ÊE³=îÇŸ4i{ɤI“¾1h÷mS)1•Šf ÷»wïöèу½¤{÷î÷îÝkøÆµrqq122jÚ´i```||¼ 3Ü7Br`ˆ0 ZŽ×ìqgGáääd``ðâÅ‹ŠŠ ­6Nˆð¨r` 9hfo?dll\\\lddÄ,)//·´´|õêUC6®uZûQ£FÍ;×ÃÃãÅ‹‡úöÛoÃÃÃ_{í5îâLlùùù¶¶¶–––………Ü[:;;gff¦¥¥Ññî@áLõ óòò255mÑ¢ÅìÙ³ƒƒƒçÏŸÏç5§£‘H$ÁÁÁì/ŽqqqìIŽØ«Ø?çççÇÅÅÕº {À°ì¡Qì[·µµ­w ÃÜuêU`Øö€=haÁÁÁµ–‘Dc4ÛßìììKÿ¹Sééé={ö¤W>©¼1Ÿï1mÛ¶-**âÞ =îl.\ðööîß¿ÿÅ‹¹·W¦R(Ü´ …;TËÏϺ :9PÈ!ª(¸{ÜkFAïÓ$¶‹SEuHp@ DA!-@áÕ’’’„n‚N@r`ˆ* î¹ kF!ÎwQQPÈA P¸Cµnݺ Ý€(äÀUÜCejF!ÎÂ]T‡äÀ@rÐîP §è2îPî<·§…»ØÆ¸…;TÃ}(ä@!†¨¢àîq¯…¥¥¥¹¹yIIIQQ‘Ƨ3DuHp@ DA!-ûí‡p&†……­Â-,,x>¤uëÖÏž={úôiëÖ­5Ú6€Æ7`Í*,,,))177ç_µ“®d¥Wµ€F¡pBþ)¾éÔìüÑq5(Ü´…;T‹‹‹º :9PÈ!ž(hñÍ1¥L­QÐíéàx‘Ï!Á 90…´…;Tsuuº :9PÈ!ž(êíq¯5 •Ï!Á 90…´…;T³±±º :9PÈ!ž(謎=îµFA wQõ¸‹çà†ˆ‚BZ€Âá1T¦Vã 5(Ü€zÍi:"ã îP ÷M …≢Þ÷Z£ Û‹êæ©â9$¸!¢ ƒˆýöC¸åççñ÷ß8ÿ£RRRZ´háââ’––¦¹¶4"¸hVzz:!ÄÅÅE©G9;;deeUVVj¦]P …;òÏpeoÀdhhèààPYY‰aªah…(äÀI¹¹¹R©ÔÞÞ¾®mꊂvÒ‹g¨ŒH‰z!¢ ƒ\¸'%%X[[[[[$''«¼ñ­[·fΜikk+‘H4ÜjýÔ¿¡› …"‰"33S.—;::Ôù¹PW´p§#mÄ@$‡D½QPÈA „,Ü‹ŠŠ|}}e2Ybbbbb¢L&óóó+))Qmã‰':99]ºtI[ÍЪ“¡š6mJÄT¸ÅPÀçÞºu«§§gPPý5((èþýûÛ¶m›5k– ß½{W;ÍÐ? )ÜÅ6T@(Bö¸?~|Ò¤Iì%“&M køÆ ‚üü|¡› …"‰‚Oá^W´pÏTî"9$ê…ˆ‚BZ dá~÷îÝ=z°—tïÞýÞ½{ ßT””$ttr C$QÔ{÷%RwbëqÉ!Q/äÀ@rÐ! ÷ÜÜ\;;;ö{{ûœœœ†o *èÖ­›ÐMÐ ÈB ‘DÁg÷º¢ cÜÅS¸‹ä¨r` 9h¦ƒ$’Ú³g5Š‹‹cŸb¯bÿœŸŸWë*ì{À°]ÞÃÇ «Ç]©=ÐÂ=11QðW=`Øö Í=×ZFÑÔYùpvvŽe©LOOïÙ³g­Ý6ü7Vê6³š»'-@#2hРӧO‡‡‡>xð`•wbmm]XX˜““Ó¤I5¶  ÑÑÏ0€.høP‚aÂ@ìxÎãÎ …;€¦¡p‡jšF! 90ô> ¹\ž-‘H¸·äŽ‚îb¸>Uï žQPÈA Ä>ÂcÜ@ä²²²œœœìíí_¼xÑý|óÍ7«V­Z¶lÙÂ… ÕÕ6€ÆcÜ@#xÞ6µ^* i(ÜDçmSëEg„|þü¹ÚµAáÕòóó…n‚N@r`è}ü¯LåŽB<=îzHð„ˆ‚BZ€Âª%%% Ý€(äÀÐû(èP>sArG!žÂ]ï žQPÈA Ä~i&.N‘ûòË/CBB¾ûî»yóæ5d?r¹ÜÄĤ²²²´´ÔÄÄD]Íhtpq*hÀ‘ö—7„AÓ¦M«ªªÄ0#$€ P¸ˆÜÒ¬Y³†ïJ<£eªᾠr Cï£HKK#ü ÷z£ÉÄ2zHð„ˆ‚BZ öÞã"gnn^ZZZXXhiiÙÀ]Í;wíÚµ«V­úúë¯ÕÒ6€ÆcÜ@ýrssKKK­­­^µBZ·nMIHHhø® &îâ¥Æî„V­ZîƒÂªÅÅŠ݀(äÀÐï(øp'<¢I»~ü!¢ ƒ p‡j®®®B7A'  90ô; z!)Ϲ ë¢uëÖ‰$11Q.—«¡qºJ¿ þQPÈA P¸C5¡› …ú*Cgƒ©W½Q˜™™999•••é÷Tîú}Hð‡ˆ‚BZ€Â@¼h…­®1î„6mÚŒ– wñJNN&¼{Üùh×®!äÑ£GêÚ!0P¸C5Ü7Br`èwt¨ Ï1î|¢hß¾=Ñ÷Â]¿ þQPÈA 4^¸'%%X[[[[[ÐÞÕ6æ^+©A#¯Gõïß_è&èä@!†~G¡TáÎ'Š:B>|ØÀ†é2ý>$øC DA!-Ðlá^TTäëë+“Ée2™ŸŸ_II‰ óÙUÕ¿iô¥4vååå/^¼J¥ÎÎÎêÚ§zÜ„¢©;²RëÖ­»yóæž={˜%&LèÝ»÷¬Y³”ݸÞ]©v`2Ç IDATwYÍÝ“@Ç={ö¬uëÖ-Z´à>ª”¢¢"kkkSSÓ¢¢"ŒÆ1Ò\y©ÙÿªÇŸ4i{ɤI“ÂÂÂTØX©] 04Br`èqtJžãd¿(,--›6mZZZªÆ/ºF ¥ ¢ ƒh¶p¿{÷n=ØKºwï~ïÞ=6æ³+##£¦M›ÆÇǫሠ†¦QÈB =Ž‚ÖÖüï™Â3ŠŽ;Bîß¿¯rÃtœJA DA!-Ðláž››kggÇ^booŸ““£ÂÆõîÊßßÿàÁƒ………7nÜððððöö¾}û¶z^€>¢…{Ë–-Õ»ÛÎ;Bê꣕éÏݰ0///SSÓ-ZÌž=;88xþüù|Xs:‰DÌ>ã—ŸŸÏüÊ^Åþ9???..®ÖUØö€=`º¶‡ëׯ“&qWchá~öìYí¼ ì{À°¡ö\kI4F³—f:;;ÇÆÆ²ç+HOOïÙ³gZZš²+µ+BHFFFÛ¶m‹ŠŠ¸[ˆ‹Sùùù¸Y1Aÿ@ =Ž" àÈ‘#|ûí·ùlÏ3Šˆˆ??¿~ýúéë€W=>$”‚ˆ‚BŒÆzqª»»{LL {Illl—.]TØX©]BPŽ++))Iè&èä@!†Gñüùs¢ÌÅ©<£ ÿ™õx¨ŒJA DA!-Ðlá>bĈÐÐPö’ÐÐP6VjW„ôë×OÅv‹R·nÝ„n‚N@r`èq´pç?Æg...ŽŽŽ¹¹¹Ïž=S¹mºL ¥ ¢ ƒh¶pŸ6mÚåË—W®\™›››››»bÅŠ«W¯N:•Ù€= ˆ{cîµ~~~‡JOO///OHHX¹rå²e˾ýö[¾:€Æ«¼¼<==ÝÐаiÓ¦jßù믿N¹yó¦Ú÷ fš-Ü­¬¬"""nÜ¸áæææææuæÌ 6æ^´wïÞ®]»š››{yyÅÇÇGFFÊd2¾:€Æ+))I.—7oÞ\*•ª}焨¨(µï@ÌÄ~i&.NeDFFbV‚þúÅ™3gèíí}îÜ9žáÅï¿ÿ>jÔ(??¿Ó§O«ÞD]¥¯‡„²QPÈ¡¹òRìe+ w§_~ùeêÔ©|ðÁÎ;Õ¾óÔÔÔæÍ›ÛØØdggk¢G@—5ÖYe@7Ñ+G[µj¥‰7kÖ¬mÛ¶ùùù¸€¡p£„„BHëÖ­5´oooBÈùóç5´BáÕØ÷ 3ä@!†¾F¡B»RQ 0€Â}#¢¯‡„²QPÈA P¸C5WWW¡› …ú… …»RQÐÂýüùóåååJ5L÷éë!¡,äÀ@rб_š‰‹S@„JJJ,--‹‹‹5wñ¨»»û½{÷Ο?ÿæ›ojè)t.NµyôèQUUU›6m4:åË[o½E ×ÜSˆ wÑyøð!!¤cÇŽ}–áÇBöïß›jªEFF Ý€(äÀÐË( ݺuëÔ©S5úDÁÁÁK–,ñ÷÷ ÓèèŒqodRSSKJJ„n@ãVRRyóæM¡¢‡´3T†2sæL ‹ãÇ_¾|YÓÏ ÷P¸«Ù;wüüüZ´haiiÙ²e˃ Ý"€FéèÑ£mÛ¶õòòòððxçwž>}*t‹ôŠjCeTàääôÉ'ŸTUUùûûß¹sGÓO ßP¸«SxxxŸ>}"""LMM Ÿ?>~üøŸþYèvñ‚¡ir „ÍáÏ?ÿ|çwÒÓÓÝÝÝÍÌÌ<Ø·o_:ï¸öéß!‘‘‘‘››Û¤Iggg¥¨ZË–-5jTvvö!C®]»¦ÂtþªA DA!m¨75&páÂ333BȤI“òòò***V¯^-‘H Nœ8¡®gÐ{999...„ TUU=þÜÏÏÒ«W¯ŠŠ ¡[§襢}ûöÕÚ3–––Òû1Œ3&22RkO  }š+°Ñã®ÉÉÉcÇŽ---1cÆÎ;mll¤RéW_}µdɹ\>qâÄ´´4¡ÛÐ8|òÉ'éééÞÞÞË—/'„4oÞüÈ‘#nnnQQQ6lºuúàþýû„N:iíMMMÃÃÃçÏŸoll|ôèÑþýû5êÞ½{Zk€~@á®~øá‹/†ºiÓ&‰DÂ,_¸pá°aÃrss¿þúk›ÐX9rdß¾}–––¿üò ó§dmm½eËBÈÒ¥K³²²m >ˆ'Ú-Ü !ÆÆÆß~ûmBBÂÂ… -,,~ÿýw™L¶zõj¹\®Íf4j(ÜÕ`ß¾}ŽŽŽ»wïV¸ ¡D"Ù¸q£©©éž={"""„j!ùùùB7A' J gÍšEùî»ïÚ¶mË^5lذaÆåçç¯\¹RË­Ò¿C‚vuwîÜYÙ6< —eË–=}úô?ÿùOYYÙ×_=`À€ôôôîVËôïP r` 9h ÷†*,,œ;w.!dÕªUööö57hÓ¦ÍÂ… «ªª>ùä]î[JJJº :9P‚äðÍ7ߤ¤¤ôéÓgÆŒ5×®ZµJ"‘üüóÏ™™™Úl•þÑÑÑ„×^{MÙª+ ''§ÿýïüñGÓ¦M/^¼øÆo$''«eÏÚ¡‡„jQPÈA Ä~û¡†Ï´råJOOÏK—.ÔþE¨¼¼¼S§NOŸ>=tèP@@@Cž@_ÅÆÆöìÙÓÐÐ0**ª[·nµn3f̘cÇŽ-Y²ä¿ÿý¯–›§7’““]]]taÐÑ‹/FŒqíÚµ®]»^¿~^ßz¯¢¢âîÝ»fffZ˜”V¸“ŽÊÊÊúá‡!ëÖ­««j'„}ùå—„µk×j¯qÊÿû_¹\>sæÌºªvBÈ'Ÿ|B Õ‘‡èèè 6üðÃwïÞº-|ݺu‹"“É„n!„888œ:uªsçÎwîÜY´h‘ÐÍ»råÊ{ï½çââòÚk¯uìØÑÅÅåã?FW½44[McÑÀè ™#FÔ»eqqq“&M!7oÞlÈ3p+++{òäÉÓ§OËËË…n‹®^½*‘H,,,ÒÓÓ96«¬¬lÙ²%!äÂ… Zk[]-™>}:ûéСCŸ>}*l«øX¼x1!ä믿º!ÿ/**ÊÐÐÐÐÐðÎ;B·¥¡***Ξ=»qãÆäåå Ý]”’’üöÛo¿ùæ›W¯^º9 U»wï666¦ÿ3Û¶mëàà@666ž2eÊ©S§^½z%tÕCs6 wÕÈÈȰ°°H$$N:ehhHùüóÏãããéÂØØØÀÀ@fbGGÇÍ›7WVVj¥½„Â]S’ìœ9s!þþþ<·—H$–––ùùù*?©ºÈårúIIyyyeddÝ(P]rrrß¾}é»Ù¬Y³æÍ›ÓŸ%ÉÚµk…n]=öîÝKÿ_óé¡|ò䉹¹¹€Ý™ááá‰ÄÐÐðôéÓtIVV–§§'!¤ÿþ/_¾ªaõª¬¬¤§þ’““…nË¿deeÙÚÚBNž<)t[Ttüøq:FßÕÕuÚ´iÞÞÞtüd=ŠŠŠ„nN8pàãu̘1¿þúëܹsé¯!!!B7M=.\¸ðúë¯Óÿ½S¦LILLºQº"33“Þª™NסàáÇAAAÌ8Éž={îÙ³§¬¬Lûídäääœ;w.66Vµ‡£pו“MMM533“H$ÑÑÑüEïøã?ªö¤jD'Ý355ýàƒh‘×¾}ûgÏž Ý.±+**ÊÎΖËåJ=êÂ… M›6¥ÃñãÇéÂ,]ºÔÀÀ@"‘ú¨¸¸˜.¼ÿ>½ðÎßß7ý½qㆹ¹¹ÂNhh¨D"‘J¥÷T'UQQ±dÉÚmìààÀÜ$ÁÖÖ·N§&OžLñññáîM?räÓñÔ±cÇsçÎi­… ¹\¾qãFúM>>/^¼PX»nÝ:Ú™­³C8èЗ^½zñ?7º}ûvBˆŸŸŸFV—5kÖB^{íµšWܼyÓÈÈÈÀÀ@ð!øuÙºu+!äwÞº!µ(--¥ß?Uß%”òòrz¾kôèÑ ßºãããé(Þ÷Þ{O̵{jjj³fÍè…Uóçϧ_&¹¯oÑeåååcÇŽ%„ÑÿÛ?5j!D*•þúë¯B·‘—ØØØï¿ÿþ»ï¾Û¾}{RR’÷%‘HLLL>|XïÆ¥¥¥Û¶m£_z¥RéÒ¥K•íÌj )S¦Ð’]&“ÑaMš4¹víšR;Aá®)ª%›••EG·+ÕÝ^UUõêÕ+:ùüùó*<¯Z”””Ð~ÁÿýïÌÂüü|z7–aÆ•–– Õ6] òy1Õ¼xñâí·ßfø¤ÿ&(‡O?ý4%%¥ÖÇæçç?žŽ‡Y°`A­W£ÊåòBÞ}÷]¥¦®]»fhhh``péÒ%þÊËË355•J¥©©©škƒEYY=?PW/§²cÇŽºùwôþûïB6nܨÚÃ5}T¬^½š4†‘î 9lÞ¼™–žÙÙÙ57¾zõ*ý£þæ›o´Õ@-á<гdÞÞÞ5?”••yyyB ÐHG6O:•ÖvgΜa/—ËåôZpCCCý2_UUõòåË~ø¡gÏž„E*•Μ9SÙëÅë:$†J™;w.ÿ]•••-\¸Ž7›9s¦RÍhˆo¿ý–Žt:räHUUUvvö˜1c!...J0Dá®)ª%K§-ã3™LMôs]Ù®z5¢Ÿ1={öTøyëÖ-Ú34dÈq^UCióœCtt´››!ÄÚÚzÉ’%W®\),,¬ªªJLLܺuk¯^½è?PKKËE‹±»Ìårùo¿ýæêêJ{øðaŽgIHH°´´$„(uÎQ 9TTTÐ ¥þ›S£GnHªv»wï&„¸»»×ÕôêÕ+wwwBÈ_|¡…¶)¥²²’þóéôª•¦ŠììlSSSƒ„„>Q±sxùò%ý.G?ækuöìYCCC‰D¢g£&xǧçýêêSÏÈÈ ]Zjìž——÷àÁƒü188xÁ‚111êÝUUåÙÌ̬®rèìsÍ›7ÏÉÉQû³7Üo¿ýF`úÝã£>š;wî˜1cèU¤R©”NÔËsoµW®\!„XYYeee)Û¼?ÿüÓÔÔTÇF­þúë/ƒ°°0fayy9íÿòööæÞ …»¦¨lnn.½ˆJµ1y©©©ÆÆÆR©Tåtxn­¥Þ;wœœœ!Çg®U}ñâEddäü`ggײeËîÝ»/\¸°  @»m×7¿üò ]ÁÓÓ³®ƒ!::š¹c—¹¹yÿþýgΜHKvBˆ‡‡Çƒê}®¥K—Bú÷ï¯îÑ [¶l!„¸¹¹1c‚ùûõ×_é¿Q ´‹ ½ÛèŽ;8¶¹~ý:=pãÆ mµ‹—k×®BÚ¶m+tC¸Lœ8‘ð›_HGlÚ´‰â.nV­ZEÏ¡éñ$3µzõê=»~ýzŽÍhqoiiÙð˦Ÿ>}ºjÕªñãÇûøø˜˜˜³²²7nœR§ø8œ={V*•r_GT^^Þ¯_?BÈäÉ“Õò¤ê"—ËéìXô>|ø0ûÂúØØØ©S§Òq˜ï¿ÿ~C®¥Ýí*ÿQ:tˆNpìØ1•ÛÀsýÒ²eËVeeeѱ^kÖ¬á¹7îõKLL;v¬•••••ÕØ±cyÏR!Ù… B|}}•ocµ &BæÏŸ¯òTvîÜ9úÉ]×ɘ˜GGGBˆ©©éÈ‘#½½½é¨ëšøá‡FzfSXr¹|ùòå4ÆÉ“'×; IddäÈ‘#éô ŒæÍ›ÿüóÏ<¿ýЮVÝ=üâÅ {{ûº¾CÖ+??ŸŽ–ÑælH—.]"„4mÚ´Þ·Œ~z{{kyh&7zªð“O>º!\"##iÈÂN(ÁÓ«W¯êín§ärù[o½Eñ÷÷ש£BÓèÿºŽ;ÖûWC;)<==ù\Û£àÌ™3ãÇ—ÉdÌ…”T*uss:tè¢E‹¦OŸN?ݨ)S¦4ðÜrAA=eZoIúàÁ:›½®LG|öÙg„ccãÍ›7×uL†‡‡Ó^ï½÷žjÏ'‘H¬¬¬jHƪ`bbRïZCÐcµÖë—ªªªN:E{О}”l¯¦Ð«¨òFŒAÙºu«[Åí£>âù•;//–*ÏÅùòåËÍ›7ûûûwîÜÙÏÏ/22Rµý°Ñ©Öþú믆ïJ£ºvíJÑå©»ví"„tïÞÏßcRRýøXºt©Ú¦ ’““éyňˆˆz7ÎÈÈhÕª!äÓO?å¹ÿ’’’Õ«Wӆݧ>a„]»výõ×_5/ƒIJJZ´hßføðá ¹b˜Þ›ÅÃÃÏÝîèÈévíÚéÈHÔ%K–кððpî-oܸaccCTÈ‹þÛlø\[ôöóFFFÌÌiê•M_æÙ³gëÚ†öºŽ?žÏQ¸×#$$$00½$00pÆ õ>PÙdé„>>>ʵ¯:|™ûÔ!#66vÙ²eþþþƒ Ú¸q£Ê½5r¹œÎ²Us­ÂÈŸ‡8p <<¼®—ÇŽ£S@8;;+{‘® ÊËËsrrÒÒÒN:uøðḸ¸š3¨¨…¦g%£=666GÕè)(..¦ã xŽt×h'Ož¤3 ðçS—mÛ¶B† ¦Æ†ÕŠFQTTdee%‘Hx¶ù÷ß—H$¦¦¦?VöSRR˜Ù Ÿ|òICzj=zD±µµmHO¶væì£ƒO  …çR “ƒL&#õ b;qâíáÂ]—Õ{<ÐOãÆã¹Ãèèhcccž=Ó»víbßonÙ²e×®]ã95ÍíÛ·éWë ðl›‚Ë—/K¥RCCÃÛ·oWñˆ¢¼¼œ^ý¢ “ÖÓ~©TzèÐ!>ÛïÙ³‡ö6Ö{…òòòÌÍÍ =z¤zsÿAÏdZZZjâZ:»ÑàÁƒ9¶IJJ¢gNø4…{=|||¾5†‡‡óÍ¢T²Ìle ¿Es±÷ŸAEEÅâÅ‹é5"ŒqãÆ©ÖIpýúuBˆ«««ºNÔæää 4ˆboo¯ìLIü]¾|ùÝwߥ=U š7oîçç'“ɼhÑ¢³gÏ&&&êì™hzá‹T*¤×“Žt9r¤öŸš-++‹~Ü*̃®¬ÌÌL######íÌtIGÕ¿ñÆüòá‡Ò¯J/_¾¤_ìÛ´izãÆÅ‹Ó;û4ä‚ו+WB&Nœ¨ò´¦  ÀÊÊŠ¢ìŒZFGõ8;;+uË­Ÿþ™{›8qbͻ󤦦~ÿý÷ï¾ûîĉ,XpöìY¯h”Ëå yö[·n˜˜˜(uV–öL·jÕŠc\AA‰Ò»wïãÇ«Ð}îÜ9©T*•JUï^ZZÚ±cGžçß'Ož$„ØÙÙåææ*ûŒj´cÇzÊw×®]üEon­ìDôB¦†œYU0iÒ$BHçÎÕ;`!55•Nxýúuî-é=pø\®€Â½NNN ß³ÓÒÒ\\\ê} RÉnܸ‘òú믫¥.¤£M8F­TTTÐ1R©ô£>Ú¾}{hh(À§Úç7Ïÿ,$¯^½¢SÕZXXð9ª¬72ß[lmmß|óÍ‘#G¶oßž=m¢''§E‹i¨K^e‰‰‰´§æ…/Ú‘••E§ìP¡XèQ­–©ßFŽIùá‡ÔÒ0nC† !„lÙ²…ÿCÒÒÒè¬Rf>þøcZµ³g`8uê”±±1iÀ^ô²ÚÆ2«ÉÌ™3ÕþÏJíhí¨Â;²ÿ~:€„Ò©S§‘#G~ñÅëׯ7n}—¼öÚkšøïª ¤¤äÉ“'ׯ_ ýôÓO]\\h#;vì¸xñâZÏÓróññ!„|ùå—J=ª¼¼ÜÃÃÒµk×Z¿6„‡‡Ó+­¬¬”*=kúæ›o!:tPvT=}`×®]•½M2ÍDÀ‰A###é1Æžš¨¨(z†A©9aûôéCÙ¿¿’ͬSii)½Öù믿V×>«þÏ3vìØz·|üø±©©i½F(Üëadd¤pþ·¬¬ÌØØ¸ÞòO¶¨¨ˆv·«ëºæëׯÓ3éuyŸ7o!ÄÚÚš¹­zUUUdd¤‘‘‘D"á†U p-//§=‹fffûöíSãžé7 ‰D2gΜ§OŸ*¬•Ëåñññááá—.]:xð`PPÐÌ™3ûõëGoªL155íÛ·ïðáÃ?ÿüó+Vœ9s†?GzzúáÇW­ZµuëÖ#GŽ4¼Ó«²²’öX 6LÀ+zé;5gΡpðàABˆ¥¥eÍ7T „ôêÕ«á»â–œœ,•JMLL”½¾Š˜133ã9À†N7ijjzëÖ-…U‡¦_bU¸õrLL !¤I“&:2¾¶^±±±„›¢¢"¡ÛR»äädcccCCCÕîS?~üx¦|gH¥Ò±cÇîØ±cçÎ_~ùe×®]éhlCCÃY³f5|.¯òòòóçÏÏŸ?¿o߾ݺuëÛ·oçÎ_ýõž={Öl !„ù"!‘Hø\IÏ ƒ+Tè]ÎÈÈ £JúõëǾV­¸¸8((ˆž¯èÙ³g||¼²{VðòåK:>^©¯ˆ7nÜ044”J¥W®\Qöéç¾™™YÍ“-ZM§Pí#à“O>!Ê |JLL”H$–––*\mÌáÚµkô+„º¦íºsçŽT*566æ9ž‡v­ZµŠ{3îõhHá^«Å‹³‡jÅÆÆÒ+9úôé#—ËÙ«Ø?çå屿Œ*ì=¿)]E¿äõèу¹´…ÙÃo¿ýFoÍܪ‰Ùm‰»»»Rmxøð!ý d>¹^󫲯¢ªªª²²’ΫMùì³Ïrrr”݃ÂϹ¹¹ôâECCÃÝ»w+»‡‹/¾õÖ[ÌõµlVVV;w0`ÀÌ™37mÚ´cÇŽ5kÖ„‡‡8p`ÇŽsæÌñóóc&[d888LŸ>ùïÃóU°“üá‡!...ô<€ {P-I…=lß¾]"‘XXXdddpï¡!ÇC]mxþü9ýØ`ú­˜Cii)SÁÜZI^¼x‘Ž2b߈ÿè¾ÝÝÝŸ={ÆÝ†Û·oÓ!1ìóÑìÍ~úé'Bˆ¹¹ùýû÷•jýkš5kVßÍ‹/ªý˜¬kýû÷'¬©úÕõn>þüþýû×®]c5R!Zļÿþû ÉáæÍ›±±±üî»ïFŒ±jÕªçÏŸ+ìáåË—'N¤ÿÍz÷îýǨ–CiiéêÕ«éìRµ’H$...2™lܸqK–,Ù¿BBBEEÅ©S§fΜIçÒnß¾ýŸþYïñ””D¯óÛ´iŸjîáùóçôÿp÷îÝׯ_àÀ7ÒN©Tº|ùrv×UCއ›7oÒQõ›7o泇ððp:HæË/¿doö×_ñl_úÁðÉç«à³‡Ó§OÓ€£Fbß’ÿâããMLL¤Ré£Gêj;‡ºO³ÿ?ЩñÝÜܘå†$I«—€€ž{8tè!¤U«V/^¤÷تU•fèIᮋ n IDATé¡2Ì…}êí®ÎÎΦW‹~öÙgìåGŽ¡³ÏÖz†i »'¾^ß}÷!d„ mtÝ6mÚDÿ¹?¾ÞKX¸BŒŒŒ2³DFFFddäÑ£G¿ÿþûÙ³g÷îÝ›y|ØØØôíÛwîܹ|ð=ÙG0`½A’²é-4= -þþþ„¯¾úŠÿCrrr~úé§   ;w6ddáðáÉòc¾¹Ñ{ª÷´©¹\ÞºukBˆjS¹åææÒ^½Q£FqlVPPÐ¥KBÈôéÓ96£çL<<<ø_cš˜˜¨ C¤”uäÈBHÛ¶m2ïuñâÅuëÖ3†}©ŒƒƒŸ j•““Cÿ™Ô<1¢!111t|H÷îÝU¸ ÖÉ“'íììè ïÔ©Ó_|qòäÉÛ·o_¼x1666*****Š{fÕÛ·o·mÛ–bhh8wî\î6ЉÇŒ£l;ÙèœÍš5ã3ºrúôéô]P¹ùÉ“'FFFR©´ág ø»pá\:vìØ†œv£½<§”¥'ùy^ÿª”ÒÒRzN¦áÓjß¾}›vfñ¼¬¹ªªª²²²}ûö„öMšjBá^M_œJ¿8jb*½K—.Ñý£>ŠŠŠJHH˜7oí\áH¯3>|8ÿ'¢ÝWµªª*""‚V¨ÝºuSùT ½·«¡¡!÷_…jrrr®\¹ròäÉ5kÖ̘1cÒ¤Io½õÖÀÇ7iÒ¤‰'þøã111 £YN:E¿b9’ÏÌ_ ÆŽK”9èQ7oÞ¤§/y^pèÐ!æ#Ÿ~¼íÞ½[…ç=qâ!ÄÖÖ–ÿÿG>èäªMš4Qí;gÏž%„¸ººª<Æ)11‘–ŒuÍ%RYYIg·ìÒ¥ ÷<¶ùùùtÊ<þºÐ˹Tž†Y(•••íÚµkàÿÑ£Gé½oNNN;v¤E0!ä?ÿù o+½€rРA*7L)))tt¯Âjõ:pà½Ç믿Þ;9TTTü÷¿ÿ¥#UÜÜܘÓ\ ÂÂÂ!VVV ¿•Rqqñÿþ÷¿3fŒ7.00pÏž= ÿWSee%½älôèÑÜ[ÆÄÄÐ1ô”—Êhõ?eÊ”†ì„§‚‚‚E‹Ñ2ã½÷Þk`€wîÜ¡en½ƒ/^¼HqqqÑÐ ®^½j```ddDgõQÙ;ï¼C”;Dk·Þz‹cîõX»vmÍé ùL¶È'Ùââb: û¥9rDá‚$ƒ•+Wr<äÅ‹fff4.^ÔËËKb¬[VVÖÒ¥Ke2™L&Ú‰ Åš5k¸¶ÐùX|3ºiÓ¦¦h}á¾ h¼²ÿþÑ£G4mÚôÓO?Õ¦‘>++‹'î5¼Ÿ ‡`oo¿yóf!‡Çóüb666ÚÏ3˧òððžá!--›–çÍ›g`ᙿ%´‘——ÇWË:­?uúôiá ÓÓÓsÅŠå}Σ££¹ÿ€N¢<›^`` ö1¢Ý»wsÓÆæÍ›5,L!bàe§Šüüüž={rÂýúõ;|øpnnnvvöâÅ‹ùËáµ×^«r‹jóZZžžžåÝ(àIÄ5jTæÇI×? ®×¾þúëú”µñññ‘‘‘#FŒ íÓ§°ˆl—.] Y2RÏ‚êááQæKæ=â¶BÃïºHxöì߃ÒûãͳW 6LÇòL‰º *îš%$$ôë×ÏÍÍÍÍÍ­_¿~÷ïß׿Q“MMMå¾zÌâbRÜC@ËûPü#ÝL§9ž4*))á¥7ˆ(""B}ùº2ñÒh:t0ÅýP-IçÀÓ˜xzzj9»ïïï_ñ«äJã)nf̘QÞ|+P&“©O€¸mÛ6™Lfgg§eEóÆüïÜðÊTRRÒ´iS’\'77—ûÝŠÕ¯_¿¼ÛýUl¬yˆyðùùùõìÙ³E‹¶¶¶Ddgg·víZíÏ£P(Þ|óM"ªS§NyWùùùÜK$88Xï)Æý–Ð/X¦e·À’’’9sæp³ÏÌ™35NÙvìØ1îE åÕ¸B¡àε7nÔæxSà‰‰œœ¤Wϸzõ*E4i’ÑËP\\¼hÑ"¾eADü1fï½÷ž±>oŒÇÿ¼üòËê­~¼r–]y׺þi¤¤¤ðE©S±ýý÷ß“&Mâ~e*ZµjµfÍ£/lFD‹-RßÅ9ðŒpÐ;4&&†ß=nï߸qƒè·^÷ª[·ny F¨¸›ŠÆd?úè#Ò4ªÌ\øÿÇÞ½{5ÉcDÔokš”B¡X±báòõõÕ8sSTT/‡a¬9žL¤{÷î¤ÝäÄÅÅÅÜܮ댹àìÙ³<£V™Ó3Ÿ?ž'…(o‘?G_£F sá ³2›´C'Ï¢X³fÍ2+j<à&ØêÕ«ÏŸ?ÿÂ… GåRùøøHtx(..æknI[¸p!lb}úôÑcŒãóçÏùß§Ï?ÿü#Þ•––öõ×_swŽúõ매¤«ðïÉ“'Ü(®q"óìììò½‹iÓ¦i©¼aÞÂK›±ã{÷îåë.õÜÕ·úúú–wÙÍ·ûôécºv”””©S§†„„ð—I×®]uš2¡²IMM忚ÀÀ@ñÈÑýû÷sGãÞ8]³f _{ë:É,+..þé§Ÿüýý…/Ÿ®]».^¼xÿþý[¶l1]︨¨(þþ/s T~~>¯X¢Ó2½ñЧµk×ÖuåV4nÜ8½ŸšÛûË«ƒ¡ân*ÒÉž?Þ 2SãU‹5^Ô&$$p•Å,ÿix9@gggõ¡åË—Qƒ *gûßßhݺµÊ$7oÞä¯ÝAƒ•×T£P(¸£|XX˜ts7½4hÐÀÔã+øÞý˜1cT¶_¿~ÝÏψĵœüüü^½zQ锣ež“ç¢0nÕG¡PÅD=zdkkëää$½<ßWæR­xr¹œç°sppøá‡Ô¿û®_¿Îíš=zô0c'íñ,1ÒÓz¤¤¤pKa¥]«2??Ÿ{˜ˆïx&''óÔ‡½zõ’¾ÒKKKãk-‰J /¶'^ŽÀtnÞ¼éàà`cc#\æææÎŸ?Ÿï懆†ª7k•””ª·»çççsk–NX*XQQÑÌ™3Åø­wïÞ•öƒ§+áÏ´-–””Ä´mÛöÚµkú=˘1cø…Dóç¶mÛøæxe¨§ææævèÐëîâ‰5âââx6…ˆˆˆ*×Ѽ2ÈÉÉQéVçììüÅ_½Ã‰R©LHHà{›ëׯ×ò!iii<„Œ?®Û·o7Ë»ÌsºÛØØ¨LêRXXÈÓ^™bÈò$$$¸¸¸Èd²Ó§Oks|QQwXøâ‹/ yÞÔÔT;;;{{û2ïô¢ân*Ér{ä /¼P¾£ËÃ.åý?cܬ¨qihñF§P(¸Ÿ=½üòËBÕJ.—/[¶Œ;bëz«Ë´É!66ÖÆÆÆÁÁAb"^=ܧO£–ÎÈxÆ™Löî»ïÆÆÆîÙ³‡¿ôÒKÚÌYÉ3–”ùuYPPÀÍ“º®y®·E‹ñÙ‰'.Y²D˜zذas,~òÉ'Däîî®Ò_eÞ¼yÜÐ[WÊÈÈØ¼yóĉyY1ýî¼käßxÁ]'''õOZVVÿîÔ©“! ‹vìØ‘VË< ''‡?Q?ÿü³¹rP‘™™Ù©S'"²µµ ÿî»ï¦OŸÎÓÎôèÑ£þsU’ŒN¡P8pàÓO?={öÏ?ÿ¬Í-½£à±Î»wïÖxðÞ½{yw//¯/¿ü²¦‰“0uêT"êÖ­›ø’FXo®‚/'øk¼U«VÒÓé2žÎµI“&†ß çþ6eÎaˆŠ»©”—lLL wÚ“¾sjv[·n•¾'•ŸŸïââbcccÜɳõ³cÇ^úŽˆ:wî}:·8H´dggó×uíÚUãࢠžžÎ7]¿ûî;ÞË·=5~ë]nn.Ï8<`ÀééÅΟ?ïèè(“ÉŒ2+·)´k×N}*î¦Rf²‰‰‰),,üõ×_yJéªKÏÃåË—:T¿~ýž={ò°eÀŸ†Àz¢ˆŸ?þ™3gjÔ¨ ëLÖ”ƒ4ä 0VYYYÿýwTTÔóçÏ›4iÒ´iÓ† ¶oßž+£•_eøHüý÷߯ {üø1ÕªUËÑÑ111‘wµhÑbÿþýâ¿e£èܹóÉ“'þùgüÆd2SU°Qq—¯^½úÀµjÕzûí·Åm‡UÂ_|1kÖ¬üöÛoâícÇŽýùçŸçÎËóc€)\¸paÚ´iÇŽ¶|üñÇ<½+T°ŒŒŒ¯¿þzË–-IIIDäååÕ©S§ÐÐÐ?üPe2£Ø¼yóСCÛµkwþüya#*î¦bºd+RJJJ£FŠŠŠ®_¿Î3sQqq1¯%våÊ•V­Z™·„–M©T®^½úøñã¶¶¶½zõ4h¹K`íxb·&Mš¨,va\ÏŸ?¯W¯ÞÓ§O=úÊ+¯ðFTÜMÅ2*îD4nܸիW>|ýúõ¼eÛ¶mƒ jÙ²åÕ«WÍZ4‹µ`Á‚O?ý´K—.ÑÑѼÅtÕ˪Ñk 4š9s¦ƒƒÃ¦M›._¾LD%%%¼ÄÀ”)S´}zðàÁ›7oFWÐÌÝÝ}çÎ!!!J¥ÒÛÛ{Û¶m¨µ˜š­­íÆ«U«¶eË–~øÁtO„Š»Eiß¾ý™3gž={–––ööÛoëôX«íš¦90ä @DÁCDÁ¬<‡€€®²ÏŸ?ßtÏb9EôcI]eÀŒ¾ÿþûN:µmÛ}ÜMw0"ôq°j¨¸Ãÿdgg›»•r`ÈA€(ˆ‚!†ˆ‚!‡ €Š;üORR’¹‹P) †ˆB€(r`ÈA€(r¨ÖÞÃ}ÜÀˆÐÇÀª¡âP âÿcåë&CD!@ 90ä @ 9Tkïá>î`Dèã&7oÞ>Þ/ r0mÅ=33ÓËËK¼¥Fz¬ñT}ûöݹsgnnî¹s炃ƒ»vízéÒ%ã¼ ³Sš’½½½\.o‘Ëåz¬Ó©”Jå÷ßÿꫯj,¡¹ãK£± ª;#QX§Sjä`YLÛǽwïÞ7noÙ¸qcß¾}õ8X§SÑŽ;:wî¬g¹*Óθ™››8zôèñãÇÑ÷ß¿nݺ˗/»ººþïéEó\J,½7<<|üøñ]ºt©Q£ÆÃ‡·mÛ¶lÙ²ƒ™îÕTÓ¶¸»¹¹9räܹsþþþþþþçÏŸŠŠjí:,½wöìÙ[·nmÕª•‹‹Khhh|||LL jí`1°Æ@`Úw0 TܪTܪTܪTܪTܪk¯¸'%%EDD¸»»»»»GDD~üX¼×²s0]=J§d¬ºâž——”˜˜˜˜˜žŸŸoîr™ÄСC}||Nœ8¡¾K: K©k×®Ož<Ù³gOJJÊŠ+æÍ›÷Ë/¿{­'Љ'¶mÛöÀyyyW¯^1cÆÂ… çÎË{­'1¥R9|øðÏ>ûL¼ÑÚ¢Pþ›°ÝÚr˜0aB\\ÜÞ½{srr6lذaÃa—õD¡T³lÙ²·Þz‹÷ZOD4yòäM›6-[¶ìÁƒ>>©©©â-)))µjÕ2Wy*†úN:ËNi×®]AAA¯ÖEVVÖñãÇ;tèðÿ÷¼ÅÚrÈÏÏoݺõ©S§øWñ߈UEAD¾¾¾vvvµjÕ4hÐ7„]V•ƒ¿¿ÿ®]»^~ùeggçjÕª…‡‡ÇÄÄ{­* ±nݺýúë¯Â¯V•üyó^zé¥þù''''''çøñãÁÁÁ ,à½ÖE™w-_©%å`Üz”®ÉXuÅÝÞÞ^.—‹·Èårqû«ERÿÀIç`Á)¥§§7kÖìŸþ¶X[â^s=zô(..æí֖øqã>ûì3áWñ߈UEÑ·oßþù§  €{ñúøøÄÆÆò.«ÊÁÑѱFk×®MKKKKK[³fM5¢££y¯UE!ˆ‹‹«W¯^QQ‘°ÅªrP(ýúõaöë×Oèui=Q„††nذA¼eíÚµZ¾RKÊÁ¸õ(]“±êÁ©`Í?~Ü¿ÿ~ø!44ÔÜe1þxüøñÖ­[¯]»¶hÑ"s—È "##¯]»öÉ'Ÿ˜» æêäääçç7yòäyóæÍš5ËÜ…2…Bñõ×_9ÒÛÛÛÛÛ{Ô¨Q_~ùåœ9sÌ].súöÛo'L˜`gggÇW_}uñâÅÝ»wgdddddìÞ½ûâÅ‹K—.5w¹*Ú¼yó>þøã7>}úôéÓ§ëׯŸ>}º j’K¯‹ aI7n´§þ¦[Ïí-ÁÇ>¬²Ý £9r¤^½zü³Uåиqãû÷ï‹·µv•Q‘ššêêêÊ?[UµjÕRïàââÂ?[UìÉ“'^^^éééâV•Cƒ Ž=*Þrôèц òÏVűcǺuëæêêêììܹsçíÛ·[aÆ­G隌U_'µlÙòòåËâ-qqq-Z´0WyÌE:ËK)99ùõ×__ºtixx¸Ê.k‹B¬}ûöiiiüf1sB IDAT³Uåp÷îÝ ¨L^.ü`UQ¨PŠ:SYU-[¶”Þk=Q°Õ«W¿ùæ›^^^âV•ãGÚ·o/ÞÒ¾}ûGñÏVE×®]9’———ŸŸS½zõŽ;ò.«ÊA…!¯]×d¬ºâÞ»wï7Š·lܸ±oß¾æ*¹Hç`a)¥¥¥½öÚkK–, SßkUQ¨8yòdóæÍùg«ÊA¢5…¬, ;vìèܹ3ÿlU9ôïßÿ¯¿þoùã?‚ƒƒùg«Š‚ˆŠŠŠ~øá‡I“&©l·ªêׯáÂñ–³gÏÖ«W¶ª(T|ÿý÷cƌ៭9C^»ÎÉhsSÀRåää4lØpÑ¢EÜkmáÂ…7ÎËË3w¹LKýM—ÎÁÂRjÛ¶í¶mÛÊÛk=QôìÙsÏž=?–Ëå>\»vmݺuÿúë/Þk=9”Iü7b=Q„……íܹ3%%E.—ß»woÑ¢E5kÖ¼páﵞ”JeAAA§N6lØðäÉ“'Ož¬[·®FGŽá½V…R©Üºuk=Ô·[U+V¬ð÷÷ß»woff&÷q÷óó[¹r%ﵪ(Þxã‹/Êåò»wïŽ;vܸqÂ.ëÉÁ¸õ(]“±êŠ»R©LHHèׯŸ›››››[¿~ýTººZéË6é,)¥2sÈḬ̀’(Ž92`À€5jØÙÙÕ®];""âôéÓâ¬$‡2©|)[IQQQýû÷çDݺu‡/>ÀJr`ÉÉɃöôôtttìØ±£Êx«Šâ¥—^úã?ÊÜeU9ìØ±£C‡/½ôÒöíÛÅ{­'Š_ýµE‹Í›7_¾|yII‰x¯eç`ºz”NÉÈÊ+ TVÝÇ ª@Å  @Å  @Å  @Å  @Å  @Å  @Å  @Å  @Å  @Å  @Å  @Å  @Å  @Å  @Å  @Å  @Å  @Å  @Å  @Å  @Å  @Å  @Å  @Å  @Å  0yÅ=)))""ÂÝÝÝÝÝ=""âÁƒz,½÷âÅ‹&LðððÉdêg–©1Ê«¨¦­¸çåå………%&&&&&…‡‡çççëq°ÆS :ÔÇÇçĉåFùoÆ}¥&%3ivÙ²e.\ؼy³°eÈ!!!!'NÔõ`íO%“•ñ¢ÊÜPU˜¶Å}ß¾}Æ o6lXdd¤ët* cÚŠûµk×Å[Ú´isýúu=ÖéTeªU«–½½}íÚµ¯ýÌδ÷ÌÌL///ñ–5jdddèq°N§R×·oß;wæææž;w.88¸k×®—.]Òöe˜Ò”ìííår¹x‹\.wppÐã`íO¥Í‹úþûï_}õU‡ÙÚÚšûý€*Fc%S?v&-´§§gFF†¯¯¯°%==]¥á\˃u:•F ˜>}ºÆÃJJJ”V?¤ãzr`È!„RÈB)ä@¡”é¦7mW™–-[^¾|Y¼%..®E‹z¬Ó©4§ ªÓVÜ{÷î½qãFñ–7öíÛWƒu:•F;vìèܹ³~¨x¦½£‘››8zôèñãÇÑ÷ß¿nݺ˗/»ººþïéE·T¤Öxªÿÿ’ÔnÓ„‡‡?¾K—.5jÔxøðá¶mÛ–-[vðàÁ   éòãŽ!„RÈ!BD„J!B¥!„R¦ËÁ´-înnnGŽ9w¿¿¿¿ÿùó磢¢Ô«ÚÚ¬ñT²R*?ÑìÙ³·nÝÚªU+—ÐÐÐøøø˜˜µv€ÊFRpáH¡r`È!„RÈB)ä@¡TUmq£@Å49r¤¹‹P) †!B(5kÖ,sÁüC„Lw4¤àŽH¸råJëÖ­Í] 3C 9B(eº $*¦RPq ;dýúõíÚµsssóòòêׯ_TT”¹K¤ÊtkŒ™âü·nÝ7n\“&Mœ›5k6jÔ¨˜˜#>…öL]%aÜ—©ÇÙªÖG,*î–oñâÅ?þøã?üðøñãèèh;;»îÝ»›»PUØï¿ÿÞ«W¯¶mÛFEEegg'&&~öÙg—.] 5wÑ,j±êÐDŠet•©[·îÑ£G›6m*l™7oÞ¼yóÌW¢2˜:jcÿÎ;={öŒŽŽ®[·®x»B¡˜6mÚÒ¥K   ²Þ/ã~B*áŸv%,h#&&¦K—.æ.…™!†!”BWÐ_VVV:uÄ[TjíÇ qrrjРÁš5kÄ»‡^»vmGGÇÀÀÀíÛ· »öíÛסCWWWWW×:üùçŸÂ.™LVRR²pá 8::6mÚtåÊ•âÓ^½zõõ×_wuu­Y³æøñãóóó%Ê/ýD}ô‘¯¯¯¸Vúüå½ÞòÎ&¶téÒÉ“'«ÔÚ‰ÈÆÆF\kôèч~èææÖ°aÃ3f<þ\x õs sssg̘àââR½zõ=züñÇw‰Ï)ñ¼Òôsåçç;ÖËË«fÍš3gÎT*•ãǯQ£†‡‡ÇG}T\\,œJ⽓Ø[æ2jD$ý$>ÆÚÞ´ÌùòåË={öäŽ7.??_Ø«1êòÞ#¨¢PG!„P 9B¨J(ŸeäÓµk×åË——·7>>¾fÍš[·nÍÎÎ>sæLÆ =Ê»ëÔ©3þü{÷î=þüäÉ“ýúõã]§NòòòÚ²eKZZÚãÇ7mÚäééyöìYÞKDcÇŽýä“Onß¾——wìØ±Fýú민÷Î;¾¾¾Ë—/OIIIIIYºté»ï¾[^ÔŸhäÈ‘\xá!Òç—x½ežME@@À­[·¤W*•þþþk×®ÍÍÍMHHxûí·gÍš%<…úÁÂÆþýûO™2åþýûr¹<==}ß¾}={öÔ¸K|N‰ç•xGTH?׈#Ö­[—‘‘qûöí:|õÕW#FŒX»vmzz:oùöÛoù`é÷Nã;«ž’ÄKx[uú¼i“óÍ›7}||V®\™šššššºbÅŠAƒ {5F­Ógª"Ó}¥ãæ¬˸y}ýúõ¸¸¸ôìÙ³eË–/¿ü²¿¿¿°wذaü1ÿùÓO?qÛçÈ‘#ëÔ©³hÑ"õsöïß¿G&L¶¬\¹òèÑ£¿ýöÉd²9sæ|öÙgÂÞ¿þúë³Ï>;}ú4 :´iÓ¦sæÌöÎ;÷³Ï>+3jO´téÒ)S¦ˆ"}~‰×[æÙT8;;gee9::J£"33³}ûöwïÞ¥r>QÂF77·G¹»»«ŸDbWyŸR•ç•xGtz®o¿ývâĉüëÉ“'{öì¹xñbaˉ'>üðÃØØXÒôÞi|g•j]e$^‚ÄÛªÓçM›œܺukñ\Å .œ3gïÕ)jŸ ÇŽ;vì˜ô1é•W^yå•WÌ] €JÇ„H]X‹É§¨¨èðáß~úiDD„——WÏž=SRRxWãÆÅMÈuëÖåŸk×®]^ërýúõ“’’Ä[ýýýùg"º{÷®xoFF†§§'ÿìë뫲÷Î;åE­ñ‰T"}~‰×[æÙT899ˆ·¨ÿ5ÌŸ?¿Y³fÎÎμÝÖÖV8XýœÂÆ1cÆ<|øPý‰]Z>¯Ä;¢Ós=xð@ø5;;[}‹»»;ÿ,ýÞi|gÕŸZâ%H¼­:}Þ´ÉÙ××÷Þ½{â]\óÖ¦œº~6TÌ;×$ÿô5wî\e¶xqqqæ.‚ù!†”¡¡ÅÝ,,£Å]ÅóçÏ'Mšôøñã={ö‘£££\.`ccSRRBDööö999B CÌÉÉ);;[Üð\XXX½zuî°ËÝ|mlþ5‚BÓÎÎ.//ÏÉÉIØUPPàââRfÔŸH.—ÛÛÛ‹"}~‰×[æÙTüñÇÍš5Sß%¼ÀÉ“'ÇÇÇþùçM›6uuu}þü¹³³³²´9Våe* ®ºQBBÂÔ©S8РAƒ:ôëׯoß¾ÜyZb—–Ï+ñލ~.…B!îí]æ>­ô{§ñU)›ôKx[uú¼i“³ô ¥Ë©ÓgCZÜ+¡ìììêÕ«›»f†r „P -îæa©ùddd¸¹¹ñÏ5kÖLNN.ó°Zµjißâž””$Ñ\ªüwƒ¥!-îŸHúü¯W›·{̘1_}õ•ôÃëÔ©#n„¾víš°ËÃÃ#33³¼²±çÏŸ_ºtiõêÕÁÁÁ£FÒ¸K›ç•~GÊ$ý\'¶H¿wº¾³Ò/AâmÕéóƤ_»Æw‰rêú@Udº¯tÌ*cù&NœÈM‚ääd777þ¹[·n‘‘‘e>ðµ×^[¿~}™»‚‚‚öíÛ'Þ²wïÞ   mÊÓ£G­[·Š·lÞ¼¹¼ƒõx"éóK¼^mLžÿüsÞ{õêÕÚµk¯_¿þéÓ§yyy‡îÕ«ïf•IHHxþüù©S§„YeNœ8áééÉS‚¤¥¥mÙ²ÅËËëÌ™3Â3–Y þáöíÛ¾¾¾ß}÷OÊñí·ßŠ'åP¡ÇIŸ_âõjùv¯_¿¾V­ZK—.½uëÖóçÏsrrnܸñÅ_4hÐàÁƒSRR?~üÕW_½ùæ›Â®mÛ¶5iÒäŸþyöìÙ;wfÍš5vìXaohhè¦M›oÚ¼ö›7oúúú~ÿý÷?~üøñªU«¬eÔº¾GæUTTTTTdîRT=¦ûJ¯tÿ**•Jø¯T'Nœ9r¤¿¿¿››[ǎ׮]+> 66öõ×_wsssvvîÖ­ÛáÇ…] ƒööö¶··ñÅ·oß.ìÚ½{wpp°³³³³³spppdd¤°Kc5‘§Ávqqñòò3f̳gÏ$¢Öõ‰4ž¿¼×«ýÛ;dÈ???{{{—^xaÒ¤IˆœôôôÁƒ{yyyxxŒ9277W|æ+VØÛÛ׫Woþüù<ë9ï:zôhDDD5œœœš4i2sæÌ¬¬,»„‡K<¯NwmžKâ$â-ïôÞýû÷ØÚÚjÿ$>ÆÚÞ´|í±±±Ý»wwvvöòò;vlZZ𣣣6åÔõ=2¯5kÖÆÆÆš» •Ztt´¹‹`~!%B(eº¯t |iD98ŒëСCÓ§O¿té’¹ bLJ¥²U«Vׯ_wrr:þ|Ë–-Í]"€*+§Týúõ‹ŽŽÎÉÉyúôéï¿ÿþÞ{ïIOÿ_ýùçŸ×¯_'¢çÏŸ/Y²ÄÜÅ"TÜt5tèÐY³fùùùùûûñÅ‹/>|¸¹ ed»wï&¢ &ØÛÛÿúë¯OŸ>5w‰wÐ$&&ÆÜE¨CDäëë{âĉœœœgÏž9sfÈ!æ.‘ñEGGѨQ£BBBŠ‹‹y5\1|r „P 9B0=ôá–‚>î`…RRRêÔ©ãîîž‘‘1iÒ¤U«V}ùå—Ó§O7w¹ªôq€ ÂÍí:u²µµ}ñʼnȆÞTQ¨¸À¿ÄÅÅQHH*î•*î Avv¶¹‹P) †È B¸zõ*ñ­Zµ²µµ½uë–ÊZ¶‚–!„RÈ‚é¡â$%%™»•r`Ȭ „k×®Q«V­ˆÈÙÙ¹nݺÅÅÅ<cñ!h 9B(…!˜_JÁàT°6nnn666yyyDôÊ+¯?~üСCÝ»w7wéª N€ŠpãÆ’’’¦M›r­ˆ5jDD÷îÝ3k¹ÀÜ÷¤¤¤ˆˆwwwww÷ˆˆ•[±:,½÷âÅ‹&LðððÉd&y%áÖ­[DÔ¼ysaKÆ ‰(!!Ále"2oÅ=///,,,(((111111(((<<>>'Nœ¨ˆfY°˜C 9¥‡pçÎ" ¶”Yq·ì´‡!”B„LÏœ}¸—-[váÂ…Í›7 [† 2qâD]ÖþT:õ:Bw°6#FŒØ°aÃ/¿üòÞ{ïñ–“'OvîÜ988øìÙ³æ-@•`™}Ü÷íÛ7lØ0ñ–aÆEFFêq°N§€òp‹{“&M„-õë×'¢‡š­L@Dæ­¸_»v—ö´iÓæúõëz¬Ó© <êw___›´´´’’ó• ÌZqÏÌÌôòòo©Q£FFF†ët*ÐÉ•+WÌ]„J90ä@BnnîãÇ]\\êÔ©#l´··÷òò*))yúô©°Ñ‚CÐ r „P 9B0=L©¬,óæÍ¿¸råŠx©0ñ.ñÏÙÙÙâtU9CýúõÍ^†ÊpäÀ? *í:RÕ_E™g8pà5jÔH&“‰wyxxQjjªð(¡r¾ŠŠ<r Ñ£J¿ ä`”3¨ü¨¢¯Bû3Œ5ªÌŠ"™Œ9_úúúÆÅÅùúú [RSSÛ¶m›’’¢ëÁÚŸ ƒSʳ{÷îôéÓgïÞ½âí={ö=zôháq'!éƒ5ž ô†År`È,:„ò*îܱ¼.¼Ö 9B(…!˜ž9+înnnGŽ9w¿¿¿¿ÿùó磢¢\]]õ8Xã©ÄÃ*`è€%éÒ¥‹¹‹P) †È¢CоÅÝ‚CÐ r „P 9B0= ¾”‚Á©`UªW¯ž“““žž®2ÁîÑ£GúvízìØ13  Ê°ÌÁ©Pydddää主»«ÔÚ‰ÈÛÛ›ˆÄó¸@ÅCÅ4@5†r Ë !!!ˆ6l¨¾«FD”žž.l±Ôt…!”B„L]A¤ « X]»v½õÖ[ýúõÛ½{·Ê®¢¢"GGG;;»ÂÂB †®2`ZåL%"{{{ww÷¢¢"ñÊ‚PÁPq"É®2TÚ[ÝÜÌwÐ l 90ä@–‚D‹;Õ¬Y“DÝÜ-5]!B¥!ÓCÅ4HJJ2w*äÀYnÚTÜ…wK AWÈB)ä@Áô0øR §€õ¨V­Ú³gϲ³³ÝÝÝÕ÷>|ãÆëׯ>|xÅ—   ÁàT0¡ôôôgÏžyxx”Yk'µw¨x¨¸=xð€ˆêׯ_ÞêS¹@CÅ4Àb 90ä@WÜýüüÊ;@¥ÅÝ"CÐr „P 9B0=TÜAƒ.]º˜»•r`È,4R&ÑâîååED™™™ü«E† ä@¡r „`z¨¸ÀÿZÜëÕ«WÞžžžD”‘‘Qqe€CÅ´mqGÅÀŒPq ®\¹bî"T È!²Ð>|H’}ÜU*î‚!„RÈ‚é¡âH´ÀYäÀYhÜâîïï_Þ*}Ü-2= B¥!ÓÃCR°Xƒ’’ggç’’’‚‚‡òstt”Ëå………Ç`SIMM-**òõõ•®‘{xx¨Ñ**îÖŽûÉHL)Ã0>À¼Pq °˜C 9%† q.H&®¸[^úA„J!B¦‡Š;h€År`È,1®¸kU&Ÿjy!è9B(…!˜*îÖNw¨x¨¸X;®¸KLâΰx*€y¡â ¿C 9%†˜˜H’“¸3®¸sWË A?ÈB)ä@Áô0O¹ÌãÖ fÍšééé©©©¾¾¾‡-_¾|Ê”)“&MZ¾|y…•  ÊÁ<î`Ïž=KOOwrròññ‘>ÒÝ݈²³³+¤\  w«Æýdêׯ/“ɤ¬^½:¡â`>¨¸ƒø'ÍCdq!hÙÁþ]q·°ô†!”B„LÏä÷¤¤¤ˆˆwwwww÷ˆˆž»@¿ƒ Ù+ScÄ×hÙxIE@ 9Å…À/G׊»…… 7ä@¡r „`z¦­¸çåå………%&&&&&…‡‡çççëq°!{™òßLúÂ-IëÖ­Í]„J90ä@Âýû÷I÷Š»…… 7ä@¡r „`z¦­¸ÿüóÏ:t˜={¶§§§§§çìÙ³CBB~ùå=6d/”çîÝ»DÔ¨Q#G¢;€y™¶â¾oß¾aƉ· 6,22Rƒ Ù å¹wï¡âP˜¶â~íÚµÀÀ@ñ–6mÚ\¿~]ƒ ÙËjÕªeoo_»víÁƒÇÇÇëõ‚¬S`È!²¸´¯¸;999::ÊåòçÏŸ[XzC„J!B¦gÚ†ž={foo/l)**ªV­Zaa¡®²—ˆþóŸÿL›6-88øéÓ§»víúüóÏ<øâ‹/J— 0€eËÊÊòôô¬V­Znn®6ÇûøøÆš!†ˆÈÕÕµS§NüÿéäÉ“§Nòðð0w¡tÆ-î:MâΪW¯ž••U·n]ªêÁ_!„RÈ‚é¡ÅÝJ©WÜ«W¯Þ¸qãÂÂB‰UT€ˆ&Mš”””Ô±cÇ–-[ÆÇÇ3ÆÜ%Ò‡~-î$šXÆøeI¨¸[)î*Ó¦MñFþ•w@™’““8ààà¹wï^77·]»výõ×_æ.—närùÝ»wmllt},&–0TÜ­ÑÓ§OSRRÜÜÜxÍT7Àsc¼‹)0äÀæM›Š‹‹ûöíëííݨQ£¹sçÑ¢E‹Ì].Ý\»v­¨¨¨iÓ¦ÎÎκ>–+îgΜ1A¹ªüEB(…!˜*îFSRR’˜˜¸cÇŽõë×Wòa[ܦ޺uk™L&Þ^f‹;S`È!^§lĈüëûï¿ïààpæÌ™ÌÌLsKG/^$¢   =ëææFD„TV„J!B¦‡Š»q|þùçžžž 48pàÈ‘#[´hQ§NéÓ§WÎÿåeö“¶\¾|Ù e¨ ®\¹råÊ•š5köìÙ“·T«V­sçÎ%%%¼¢YUaxÅ=77×ÈeMPq7”B¡˜2eÊ'Ÿ|’››[·nÝ.]º¼ýöÛ¾¾¾)))_ýu—.]xQñJEhqWÙÞ¨Q£êÕ«'''§¥¥™£\VA©T~óÍ7o½õV‹-V­ZeîâT^J¥2::úÔ©S=R*•æ.ÎÿDFFQDD„xæ¥W_}•ˆöïßo¶béŽ+îâ aµ‡Š;€¹ ân,_¾ÜÑÑq÷îÝ>ŒŽŽÞ¾}{jjêÙ³g[·n}ýúõvíÚU¶Î Ü‹]½Å]&“½øâ‹D«r0+‡ÿþ÷¿Ó¦MÛµk×7>üðÃéÓ§å´¦b>™™™mÛ¶}ùå—;uêäçç÷å—_VÀ“jƒ›ÕUfbéÓ§íÛ·¯¤¤Ä<ÅÒQ~~~ll¬­­­!-îwîÜ1v¹ª$|CB(…!˜*îú+..9rä½{÷4h°{÷î~ýú‰÷Ÿ8qbРAÏŸ?çw²²²ÌUNÂÊ)­ZµRß«^q¯_¿~…•­23J.\øòË/íííW®\¹zõj‡¯¿þzÉ’%†Ÿ¹Â÷óPPP ¾1++kРA—/_®S§Npp°ÍìÙ³W®\iÄçÕϳgÏN:ekk;`Àñö-Z4kÖìéÓ§UeTVtttaaa»víô›~ž+î66ø÷A„oH"B¥‰BxþüùéÓ§÷ìÙ“’’bÞ"Y|ó꩸¸xàÀQQQ¾¾¾gΜyýõ×Õqss[·n]HHÈýû÷G]ñ…,Srrò³gÏ|||ÊüŸÍ·ÎÅwž³Œ’Ãÿû_¥R9eÊ”>ø`ìØ±›7o¶±±ùä“OvìØaøÉ+†Qr())™;w®§§§‹‹‹——×»ï¾ûþûïóÍ7«W¯îÞ½»ŸŸß<==Oœ8qöìÙÅ‹+Š>úÈìÈ?.—ËÛ·o¯þÛÿüóOs”Kgœd÷îÝõ{8Ï*#—ËY¦* ß„J!…°páÂŽ;öïß¿aƇ2o©,ŠÊ'‘Ïøñã‰ÈËËëìÙ³Ò'IHHàÿs—/_6võqôèQ"êܹs™{¹ÊÞ¼yó .•58{ö,U¯^=##Cظ|ùr"rvvÞ¾}»ËV‘RRR:uêÄß?vve,Þ,“ÉÂÂÂâãã…‡|òÉ'DôöÛo›±ØJ¥òƒ> ¢¹sçªïâKÁÁÁ^() ž»ýèÑ£úaëÖ­DôÎ;ïµ\`9²²²¸ß¡C"ruu}üø±¹ U¡LWÁF‹»>nݺµzõjGGÇ¿þú+88Xúà  >œˆV¯^mÄ2( ýxëÖ-"jÚ´i™{_xá{{ûÛ·o—Ù‡Á\222>øàƒ€€€¦M›öéÓ§rÎÕ£ÑW_}EDãÆóôô6Nš4é£>*((2dH%_úêØ±cK–,Ù¶m›!'Q*•Ç?yò¤ŸŸ_TTTQQÑýû÷gÏž½páÂáÇ÷èÑcÆ >ŒŠŠjÖ¬™ð¨ &ØÙÙíÙ³'##Ãàס?^e©W¯^ê»:uêäààk¬õDKJJŽ;öÝwßM:Õ¸ƒdNžzôh-ÏsõêU"rssËÎÎ6¼T/^ mÒ¤Éúõëõxø´iÓˆèóÏ?/-[Ñùóçù×èèh= j¼Ì½¹¹¹ 6$¢3fTl¹´Å[x Q™L¶råJ=N’íççGD7nÔõ±ßÿ=õë×OçU!—ËO:•ŸŸ¯Ó£Ö¯_OD (ïîÏcH…X™™ÉÕÁ~øá‡6662™,&&Æð3Ëåò5jÑÕ«Wõ>É… ˆèÅ_4¼øÀŒ¥*Ó;wFŒáíímggn”n wóPÏýÚµkÜááîÝ»:ª¨¨¨V­ZDtúôi½Ë“””äèèhccséÒ%¥RùöÛoÑ´iÓt*†ƒƒƒDsã¾}ûˆ¨{÷îz—ÓX E»víˆhÁ‚âí~ø!õèÑÃ\Ó/F[»vmé ëï¿ÿÎív­[·ÎÍÍÕûé.^¼Ø¾}{;;»ÀÀÀµk×Þ­¨}ûöâûEo¼ñ†7xܳ««ë­[·ô+ÆË/¿LDúõS9‰Ð½á×_ÕòÒ-FYYY\+((0¤„›6m"¢zõê%%%ñ–gÏžqÿùçCάT*ÿóŸÿÑÂ… 9Ijj*÷2°0UݨQ£ˆè½÷Þ¶ðýÌ¡C‡š±T•ÓñãÇ/^ü÷ß›» PøÛòСCÂ^ñÍ×׷⻹J8tè³³³¸#îˆ#ŒurTÜÍC=wfªßU#/µ3~üx½ËÃ=¡ß}÷]þ•g)ñõõ-..Öò ·oß&"‰cî߿ϧå_Íxo‹oSøùù©\fdddð\–†\éÊ.\HDcÆŒÑxä“'O¸k`ïÞ½µ[UÎP§Nñ7QóæÍ )<ßôðññáw!::úüùóÜè.žG£¡C‡ÑäÉ“õ.ÉÏ?ÿlàÛßÿMDÞÞÞÙÙÙK—.%¢Zµjis”ÍWìBeÆË ?~\ï*•J^é—_~oäF÷Áƒræë×¯ÛØØ8;;ëq·DìÙ³gDäèèhÈIªº{÷îÙÛÛÛÙÙ‰¯ýîÞ½Ëõk«¡J|Ã$''sOQ6iÒ¤Š,X«Ì]A*ÌîÝ»e2YµjÕT:Ÿ4nÜØ(­ÆrëÖ-n)8p`||ü7\\\ˆèÌ™3F9?*î†JLL0`€›››››Û€„¦,i*¹?}úÔÉÉÉÆÆF׿vÆs†Ô¬YS.—ëñðGñ³ß¸qCØÈÓº9rDË“üñÇ«> …‚«Å©©©z”ÓXär9÷¨^µj•ú^îO^%»tîÜ™ˆöìÙ£ÍÁ·oßæ^ÈóæÍÓõ‰òóó»víJD]»vMOOß´iS£F¸zª÷íûaÆ©†‡ŠJôQ‘‘‘áäädkkkH/ ŒŒ ;;;½oGðz K–,Q*• …‚ç)ÓfÜ'wƒéÔ©“ôa|/Èöl^ÂÉÇÇG¥Ùþþýû2™ÌÕÕÕæüÁƒÑ„ ô>S(¶¶¶DTiÇRW€Ù³g—Ù¸þùçŸÑk¯½f–RU6r¹œm{{{9ÒÑÑ‘ˆ~ÿýws— Lˆg èÓ§Êvžö#*..æ;Éo¾ù¦p€{øôíÛ×(OŠ»Arss7n¼páÂŒŒŒŒŒŒ… <{öLãUrçu×ßxã ½KÂ5QýæX¼x1½õÖ[â\}ÿý÷µ< ·2j¼cÀ_µâû\[©›4iRæ‘´´´š5kjYë2/¡º©}çìÇóxÄO?ýT§çâ~Ø~~~<à-EEEáááD4qâDÝÊ­T*•J¹\ΓWÞ¼yS¼}×®]DÔ¥K-ÏóÃ?QÏž=õ(ƒXÇŽõþ º{÷®L&sqqIOOç-|+Œ ’0kÖ,"š5k–ôa¼Ö«¯¾ªGñ˜={¶ú.î6¦ßk¿|ùr¯^½xwbb¢ÞÅðµ½N·\,III O ~wåéÓ§ü÷ž™™i–²U*ü‡_¯^=nZµjßòÍÊÊ2wÑ ’““³nݺQ£F………-Z´hûöíx»ÜÖ³|ùr•í§OŸænŠ•á‚Ÿ§íRù(¦¥¥¹¸¸Èd²ëׯþ¨¸déÒ¥*·˜¬Í/âÜKJJ¸ñò¯¿þÒ»$\Õ¾ž-ÆU•VÛ+W®‘——Waa¡6'áŠÆ×>aÂ"úæ›oô(§Q<|øÐÕÕU&“I¬)“ÉÎ;WaÓ2g±íÛ·QXX˜NZ¹r%/NôÓO?iùpÍLe©/î\^³fM= ðàA*k,cvv6Ï­$T‚¥ñ”á[¶lѵ*>ýôS½/B¾øâ "2dˆ°E¡PpǤÈÈHéÇò=“?ÿüSú°äädîD¤ß¦„„î}Qæ-ÁùóçÑØ±cu=íÅ‹y*O[[ÛéÓ§ëQ0u\m5Ê5@UÄKä6iÒ¤Ì;~¼$­ƒ1,@qq1ÿÓV—š9uÝ¡R¹zõ*Ï‘¢Ò#Ñj¯cUp_Í2ç­â¹1Œ5g®Þ233}||ˆhÇŽ*»x•=í'û–€Š»AºuëvðàAñ–ƒjS‘çÎý­5jdÈÐ ^H% @צ¦¦rçÔ¼¼<•]< DË9ȈèÀÒ‡ýôÓOD4hÐ ¥R©±i$##ãÆÆqÂý¡Un/¨›4i…„„˜´Ã̹s碢¢FÍË[µj¥S'"žk‚»gèdݺuDdcc£Í܋׮]ãeqTò2î{ýõ×_ëZV1gÎa‹ðyàÚ‰6«?}ú”Gm8!ŒR©ŒŽŽ&¢–-[êñØõ¿^ë?ÿùÄóóómmm…×.ñGÁK›é7ú‚¯«Ë«Ó\ºt‰{Ñè4øáìÙ³ü/ê­·Þzò䉥*S‹-Êûßl úôéCD_|ñ…²¬rã¥Ê)ó/b÷îÝüÿNü‰½uë_š·+¦Þ²³³ùo¼mÛ¶‹/^½zõôéÓ¹Ïj÷îÝŸ>}jDæëë[æ?å%K–ÑÀ+¾`b}ôw(U/äíÛ·¹®eø[‰Š»A|||T¾#RRRjÕª¥ñBî …‚«>úM_-(..æE€µìd/àÿ½{÷VßÅ]*µø¨T*ëÖ­KD÷îÝ“>ŒÛhùCbÖÅ»wïöéÓ‡'1ôññùðÃr ìĉ2™ÌÉÉIc9óòòøâÞð òË?sæL™L&4«ðÏÁÁÁÚÏùÊmNúÝøê«¯8 éE²³³¹"õî»ï–ùuÉ£…tCS¡PðF\xá £P(|Ý(ÑY‹×-iݺµÏ…Š»A ©¸—iîܹâ?θ¸8ñBñ.ñÏYYYqqqË—/ç/}íÏ••Åí7wïÞ7lðar¹œëOwîÜ‘.¯wؤI“2S)C«V­„Ìê¯B©TFDDp7nû<|ø0Ï0þ|mr(¯ Û¶m£Òµ~´<÷«á†ð3f?~<666%%%??ÿðáÃ;vì¸xñ¢–eÈÈÈ:thÛ¶m…öõW^yEèÙ̇>}ÚÎÎÎÆÆfíÚµ“\³f õïß_ׄ3dffrJž.Zý ü_ÐÇÇGÜ]OýuóæMnrÞ¿¿–eà¡Ï%>O4T¯^=îeQ9_ÅþýûUf.ç+ºcÇŽ¥ Ü"™ªrN‰¿o+>‡•+WòŸÃýû÷Ë;ƒ°¼ô¦M›´)ÃÈ‘#Ë«+*MÃ**îv•¹zõ*×x´‡''…¬[·®öÙ»w/…††–wW,469sX\A‘ÀK´Î;·Ì½¼þbµjÕ’““…{öìÑo1W1žñwÙ²e:=ꫯ¾âKb®®®üç'“É 4nܸ6mÚDDD„‡‡O™2eäÈ‘}ûöíÔ©ÓÇÜ«W/___777îW@D~~~üñÿkï¼Ã£(×þo i¤C …„z(hèE¨¯ W€ã+ç (H•*ñDš DE@Ž  EDñ ¡Ê!$@ BH/$¤¶ûþqÿvã–ÙÙÙ–ì~?pmffgŸý2;s?÷sC¾“ýë_DÔ»wo£cÓÖLgóo¿ýÆ·tÝÌUUU]»v%E3µ`_µn²¿!¸§ˆ?†½Ëýúõ9 çO›tÁ‹sæÌ"úË_þbÒ»8”(%%Ew·ÇjݺµÞ:­šàéõ49“UbÚ ÃÑD=ôÑ#ù‹uuWUUqÙŽ;¤C:<[–’á`c222úôéؾ}{‹g®sÜ”ÑË/''G¡PøúúZ6BÉT’““Ù œššzéÒ%ö­¼úê«6øhN)1ôTâé„ERm»Û### •dÕô<^ºt©Ç&‘ÌÌL~PÆÅÅ-[¶lÿþýkÖ¬a;><<Üü˜êêjŽBé?šÍ? óãL¥²²’~öîÝ+~äôéÓ‰ÈÔªnZÀp7 3“Sy:e©V½¤°»8¯¾ú*½ù曆`—¡ÑrUŠ7ÞxCʇ²wøðáºÆëíÛ·#""ˆèý÷ß×ÚÅÍ\e?Î;Ç?im‡«««wíÚõ·¿ý­G½{÷nÓ¦ Ç£÷îÝ›»*H¤k×®±±±º-„:ÔÖÖò¢ÑV;"ùõ&ÁÑ...Z…Y8¦GRìþ?íÚµ«”O,))ái˜ÖÚºP‡ªª*6j5Þ ]ØñfÁ^’ £%½¤É7ˆÈßßßJÑÑÑd hÌÉ“'I'V|5œ×$´¨T*¥RÉ)æzcá´àh£•©Ø­e½¼m¾ðÌÌù±8.\à r !!!Â%&óáH€þóŸš-†.öÎÚ1š¨¸¸˜=š°Ã-[¶pøßÎ;-ûYZ"p†   CQõ™™™\›Uv%–üüü¹sçvëÖmĈ¶)ÅÈ‹Ì"A *•ŠWÔ###eÇF¥¶¶vóæÍ‹-Òªf”7np1¨øøxám!//} #FŒ0sžyìØ1)ÓZÎ4§@Ÿ‘qþ .°ë”:t¨µ+ Þºu‹Ë󋯼)•J®9cÁœ+&??ÿüùó/^äv"R(³fÍ’Ò‘F¥Råææò¥;dÈÝ·deeq¢ÚK/½dÎ Ù9h´9.»6Äóy¬§Ô [¢¡¡nçΓýq0ÜÍ¢¢¢¢C‡+V¬Ð4`êÔ©“HŸ"â&½š¸m‹À!+ {—••q¯u‘ßg]]—Qá¤Oa(›8æ®åJá3†‡8+ËÔjÓééélSvèÐAÊÝ)..æ8‘E7¾=M:ÕRÊ%fÙÀ·21¬hæÌ™âv¶Ög­ŽrôèQþ_ÓkGrжmÛÊëlˆ?þ˜ÔAÿRà*¨"^Æüü|®è¢ÕgJ¥RÅÄÄÑL!g0KlîÍž<‰F°R©ŒŒŒ·Ÿ}öY²rO#%fÛ€ÚÚZþE<ýôÓ_CCCCBB‚Ƽ{衇Þ~ûmsŠmó”,44TÊ”ŒC°L-ßi)vïÞÍYûW®\nW*•<ï ¦EYŠŠ ///ñ51.?bjƒ •JuïÞ=.¯4bĈï¾ûŽ µñôÌÔrmÒáØQ)åç¹ÉTß¾}-øé:tÐ\É¡¡¡3fÌàÀ§|Ш³©´´”ïc4TÎ%55µE‹ …Â' ×6:iÉÍÍuwwwww7'ªÖT222ˆÈÏÏObm¥yóæ|ŠÃÝ\nÞ¼ïëëëëë/²²/„$Ý»w·ì·¬¬Œ¯Z)o:t¨øaì[Òô¹Ð »(nß¾-qœ|á ŸÍuuuQ]¿Ð5 IDAT-R-!==ÝÓÓ“L©ûQ\\ÌÓýGyDâMSà“O>!¢‘#G:€—J,˜³_UUÕ¹sg®¿Éφ½{÷šäÎçÆ1½zõ2z$w&:uê”øalGê à’8£³¤ÃKLRr T*UMM åâuyyJ#lϤR×$öóó35“ÒR Ñqê¹0]D¶! Í3339;öæÍ›Òl* ¯–5`+°gÏžº÷ê;wΟ?_Ó1§wïÞÒÓ´ài€t¯DçΉÈzë"ðÔQoÜÚÚZöv{zznß¾ÝâÍ FŸY¥¥¥ÒŸƒŸxâ "zàØ;wîÜüùó902<<ܽêëë9#YÊ2Euu5G(%''[äÓ‡Êß®mÛ¶?þ87ƾté{÷Û·o¿qãFC‚óçÏs(`—.]ÄM|þQ{yyéFŠJ'/yI©‚ÊQµ¶¼°Dú ‡ýÈëÂÀp·¥¥¥|£7šÇ ž˜JYëçjF]þ¼ /R£°¼¼œ“Òí¼Ã‡Q=4[ØÓÙ­[7q*'n·jÕJŠ^YYÉO‘ÁƒÛ>[E:º…ŠËÊÊØ"äÛ¨¹¹¹5d(“I¥¥¥%%%ÿû¿ÿ»mÛ68÷ïßç'ø `NNùúúêþGëêÀFªnŠEUUßÇÅ‹ÐË ªªÊÍÍÍÍÍMŠï„ï¿>ø øa·nÝâÿM®AÄpj–5¯­ãÎp§Ö­[e×õ“O>)~˜ŽöññÑÚË¿&kGhlڴɲ«Ifµ,DÚ ß»wïã?æéhDD„¼Î¼Ô®•!r1ðÝÛPŠ¿[·n}þùç—/_.£·&žÊÐ{ïÞ½ËvL«V­ …5ž={ö›o¾‘øéÊÊʸÑúõë¾ËèR˜.Ÿ}öÿ²´‚W=:xð`žf/Z´èøñã§NÒ{g–? ¥Øp¬ÿ¨-Ò¹B¥ž.†……éÄyyy|I³‡qÍš5Âùaa᫯¾ÊSšèèh)>;ö_´iÓæÆ¦Ž“ë´oß^J·ôôtn aWǬûøøH÷ñ×ÕÕq2•Ñzdž€án IZp•@½U¥µ`·ÞjBØ“*âäà[¹I¥skjj¼½½]\\؇QRR éFÔJ%žoÕªÕÈ‘#§M›vòäÉÆÆÆõë×?üðÃñññ;vŒŠŠzüñÇW®\É-~Z·n-ãNaKô¶|úé§É@äÉÖ­[É@Ï,û¹Îâ©“|}Ž;Vw—®?àëë«õ˜Ü¶mIË’‡ÎKiÄsÚyóæ=’+]<þøãügcc#/Oëv6ÚNX¥RõêÕËèªqMM ¯ƒ;vÌè …p ÝìpŽd 4µA•©$%%‘„ÞÆ¶áܹsDd4Þ·¨¨ˆM|"zçwL²‰5 €µbùD.†Qÿþý¥Ê… &MšäêêJjž{î9S=\ÈÕh¹Ž– ùé§Ÿ„Û¿úê«ñãÇskÏž=W®\i´8F¾½ÄÄÄH™T¯ZµÊ¤é_YY(êýYUWWó YC‹-fÍšÕ·oßgžyfáÂ…Ÿþ¹¼XšiÓ¦‘´Z1¬CiiiË–- …ùîî½èââ¢7u^¥R544|õÕW\,ˆ\]]gÏž=þü1cƸ»»³ ,X¿¿¾¾ž»‚tïÞÝT—Oæ'Nœ(åö¨R'BØàRUUÅ“ISsrør’—†¡‚án/ˆÈJ>àÒÒRn¢.>Ýüí·ßˆ(88ØhÿžføøøŠêá'ºxkw]¸ $Ï^øµHdˆ»wïraG §—‡~øÚµk& ¬‰œœÌ¾]Ïôĉ©é•ÝP©TW®\1zQñ KJ‰I†½wûÛß„¹RÁ¦M›Ì®8GJ†7§vH X*..æxY>øàÁƒDÔ¡C.O•zyJ|æÆ¿J)U µÐ´„zô+**8ÎÛ}xšIŽº÷îÝãe‰qPÇŽÓÂÍ›7oÕªU\«OŸ>†º<ê¢T*95ËèlðæÍ›Ã† #"77·/¿üòúõëo¾ù&W "…B¡IU(RŒM†Äè S‹#ó„D$,^©Tž8qâ…^4hPŸ>}„óÆËËKJn¢úúzž-he ˆÃ9Bf.|eeeqöšÑ»h}}ý¾}ûÆŒãææ¦ù²nnn<òˆ°X¾***¸æì¢E‹LzãŒ3È”œ«Û·o·lÙRÊ…j&ôÛ³gOSS­8èKŠƒU/0ÜíƒõtW©TÏ<ó « ÂÙÏ=÷œ”²wÐÐ*/úK|¶i())áp½™3gº¸¸¸»»Kw!444üúë¯?üðÃo¼Á’°°°åË—'$$ddd\»víÓO?9räÖ­[­T±Î(•JÔzÔÔÔð*›•Ò¿Ì„WW …`Ö××óÒŠôÁggg»»»»¹¹iœî\mÝÏÏÏJ©Æ¼ at"jÈKjˆ5kÖQëÖ­Ïœ9Ã*Én|]TTÄ!¼"Vi||<™RY_ƒR©äÜqaÈfôïß_ÞLÃ$~þùg"4h9'á–ºD R5KœÔÔTnm’3õË/¿ÔD½KÌræJº«âp&¨”ÈœÚÚZnýöì³ÏjlÄóçÏs´zË–-%–ÏãRŒ‹566rË^"ÒÌBCC?ú裟þùþýûëÖ­›1c†‹‹‹‹‹‹ÑÙ/ÿê###%ÞÒ•J%g7I™–”””°¡ÿüç?>>>S¦LÙ´iÓ²eË88^¡P˜ô‹ã(‹îÝ»K‹J¥úí·ß EË–-ÍiUË…àLòI§¥¥½ù曋/NJJÒMµ—È™3g\\\<<JJ–³!öìÙÃS;^š÷÷÷—— Á“5d+++ßyçnmf4¤ªªŠ­FS^ÙO?pà@ñÃ4Å^"##µ‚L*++Ù€óððЊiÑ —Ø—¦aݺuÞÞÞžžžÏ?ÿüt¯y®—êççwþüy£mR^:/ŽÎpษ‹<7nÜÎ"Ö¬Y#q¢É2neœQ*½j­çÏŸgëÙªYæ†àKNb»F•JUSSãîîîêêj’§¦¦¦†Ž7n”5Lãð¼T¤°8<òmÙ²EÆ{a¸Û«î*uDCýAŠŠŠ8{CâJ.Ç Z›ã '&͆™'N¼øâ‹ñññ"‰_΀¡6+UUU¼*trò±ìØ8kÃ1Ázcì¸5ô 2¤CZZWjÕªÕ_ÿúW" 7ÇÛdö˜Šw!á0J“*f–––véÒÅ××wâĉ†ÇÅ0ià’PÝ»w×ÕYÓÆò½÷Þ“>6-¸–T÷îÝ—-[ÆKê6»ä¸ÞNÇŽå½½±±‘Wá6lØ T*Ÿzê)"êׯŸÑ˜@-þøã^Q‘7ùQ©S«G-~Ûßz£ÕÅ/†ÊÊJ£MÊTêKÅPyu¥R9wî\>@ü<………ÞÞÞ …¤¸•JõLjäE(•J^ñ÷÷×zñóÏ?WUUq¤™IÍóO£Åï޽˷YóKµ¼ûª&%@«²²’3ì%6L^ ¼*(Ï}SUUÅ%/mÓæV—ììl¾¥H¬ÇÏÎß•x{d8[& À¥XÛpg‚¡Ò°;vì S2ÓOœ8AD111º»”J%ÿÅ+ây¼÷Þ{|ƒfûŒ£üüü •º·;"µÀ•J%§ ˸ÓíØ±ÃÇLJ}Õ®®®ÖŽ\dŸHACCÇü˜šAQ^^n‘¥ÛúúzS89W*•k×®ålj™!°\pÑÊ1°*lýÈ{{jj*EEE±¥~÷î]¾ M­ºdÉ‘[¨Š‹‹Ù•.¾RÁËòRVx1Jd†¦T*9ÙZäü£G&¢ùóç‹|Ö|@Öɉ¯««cÛÝÍÍí­·ÞÒ‹¾ÿþûRÖ´¨®®æ‰xN1ä‘GL·J¥’+£G6ºÌQÎòBÂjjj8gTÊ:‰\Ý%::ZbÑqk°aÃ"êÔ©“”Ðp>XÞ/‘ךz÷îmñ'æ+¯¼"c•FHyy97%^G[ wû`mÃýÚµkìDÑëgš2e ™Ò`õÞ½{®®®îîîº?õÛ·o›ó”âTWWsRà‘#Gêêê¸Õ…Œp¶„xºnuS£TµP*•‹-êÖ­› :½s—ÈèÉ“'IBÿm«ÂÖL‡¸‚ruu5{—Ùº2Eâþýû›7ož;wîçŸnËÎeUUUDäéé)ïíìõD?yò¤›››¡âª†àb2 #!üt‰tÿã?\\\¼¼¼ôÖß4ÊþýûI´¢§…‡‡‹å£"k°ÜL~ÿþý2Æi”ÆÆÆE‹qƧV(Nzz:û†~üñGSOË¿‘']}}=ß`Oœ8!gÜ:dee±ÿÞhÍJ¶)¥”¶Ô Çp-i¯#òôô_N´6 ìõ—(òÜsÏÉ^ñ+..æêÞ½û?üPRR’mþŒåðáÃ...nnnæt?U©ƒñddüÃp·Ö6ÜUê4A]ߤR©äÉzFF†ô³qAÝx.CkêíH‡oÐd# cÇŽV1Ÿ~øƒ´¶/X°€$ô¬Ç6É Ü /""ÂÐÜsÞÌïb&õõõ=ô{—?ûì3Ž—õ÷÷·FwÃõ+äõÄe—§VÆ'Ÿ|’ˆ¶mÛ&ñ$çÏŸ'¢ÐÐP3—G®]»&R_¥R-\¸ˆ&Ož,ïüuuu|37Ô׆Ó*¤Äys‰$C©®\H;((Èh÷s8|øp‹-\]]5ÉëÅÅÅlXË[óálÝ{‘®ïÔµkW™#ÖÇîÝ»‰(,,LÄ@¬ªªâ¸#Ù >ËË˹o†nIYCÔÔÔDDDÑêÕ«å}¨á’¾z—ñµàºÕ²#RîܹÃõs5„„„Œ;¶oß¾C‡ýꫯL=aii)_“R~Vâ|ñÅ$!šNîöÁ†;gNèöãgRTT”Ig›5k髃ñöÛoÑ+¯¼"c„&Å«90â:ñ š£D$öº·#UUU\Th¬ÔÕÕq‘‘†©MçzP*•¬¹¡¤F.u·oß>‹´I"äææ²íÎxxxȨoÐa«ŒÕíúúzŽŽÐêãÈ%}¤¯¶sqÀ—^zÉÔè‘0o½õ–î®û÷ïse-C%¥\ Ü"`Μ9º»Ø½êïïo´q½Jn({dúôé†>ŲL:•Íôêêê#GŽp®Å!CäerWWWûúú* Ce¬¸î‚©E¸ÅQ*•œ÷%RôV$±Áº/.ÅÇÇK<ÿ |ðÁ¦PËáþýû\T¼…vQQ‘B¡ðööæi¼¼gDEEÅÊ•+{õêÈë!B¦OŸnRÑX®^=hÐ óe,((puuõôô”¾àöÍ7ß°/ÏÌ6 w1l`¸s_¤ÀÀ@­y?‡ôÍž=Û¤³ñÔP·z{t$f™yüþûïÆ suu]²d‰½Ç" ΗVFÛ»w/™×äÙÆ<ûì³D´råJÝ]555\B»)d444$%%uêÔ)::Zv•‰¦G¥Ë(yñ믿Q—.]´¶kªzK|Örr¿©eªõ’’’BD~~~º šœÌêÕ« ÝÐìÅ­[·¸p“H¼Ç’™Ú°I:iii±±±<–<ÌéàY‹c¸@Ä™Iuu5ç³Âp·¶1ÜùšÖÃúñlj¨S§N2ÛµkGDšbìÇj×®e† nåÍÅz9-500°‰Gç Ñ”¤ÐõÄpp‚ ì20g€ã­eT˜åˆ½óCŽ~Ñu'›s¤DÒÓÓ9írùòåš.\pqqñöö–ØÅ]®!6`ÀÍ]½®®î/ù‹ŒYÁ§Ÿ~Ê“MCÖ#GŽp*SËÌ›ÃÍ›7ß}÷ÝŠŠ óOU__ÏÝZé^•••ìÔ—å,…uëÖñ£¶´´Tk×´5ÔìÂ$ÒÒÒØ,>½)**bÛ÷ßoþ‡Z–büøñ†`U‡ŸŸÏd[´h±aÑ#/^¼È3 z*+**¤·@æü1^³Ô´€á.†m ÷ššŽèÒÔŒãª[Âç‡t8ûM<À¦N*oxæ?±‡Ô!77—{ª'$$pÉs£õøšš_«û\7”ömššv!..Ž ·¡+Ÿè —èGW*•¼&)Å7/Í›7»¹¹) ¶ êëë‡nÔW*ñb¨¨¨à™þÎ;ïQ·nÝLMðU*•¼>зoߌŒŒÜÜ\[’÷Ȱæÿ"8:T«ãç—÷íÛ×Jݵëëë¹çÀ…ZÇ物i©†t`‰¸˜'´=ö˜IŸhrrr¸|­ÞH÷û÷ïsŒ–&ÜJ·Çòòò™3g* …B‘˜˜¨÷˜ÆÆFžEX¼&×–Y»v­Ñ#ÿñÑâÅ‹a¸ÛÛî*õ=ËÛÛûìÙ³ÅÅżÎ"ÞhÃß|ó ý¹€ ê%%%É›Œ¥p‡ÄQuؾ};/yså,£]0šš¼¸¬5/½qãX)l©©‰`8†ÄÔKCCƒ§§§B¡0ä©åñ×ÿû_^E´xßÚµk98uúôé=öµjÕJ¼ý…ô‹ƒª===ÓÓÓ¿ýö[…B!¯pê;w:vìHú÷ïoÇ =ówîÜa§¦æTÙÙÙÝ.ži&·oßæejM‡ÁÒÒRÖvéÒ¥¦žÍ—/_æÀCåÀO:¥P(<<<äõ¶6l†Ž7Nw÷-éÝ»·f‹Uoü1yyy:tHw/ÏôBCC->yؾ};I+ÍÇ>#.FlÙ1h€á.†Í ÷ÆÆFž‘sIǸ¸8y§º{÷.§Âðs±¬¬¬E‹nnnºK0;wîä€<饚 Ö¶m[¡ÕÂ7w›Åû:'|ËÚ´i“Iïºzõ*Gu:ÀP¡-S‘ͶmÛ¸©-GŽ™YZ ^å u½!õÒÉÏÏî¹çÂÂÂ<==}||l“jm¸¹D\\œR©¬««?~<=ýôÓÖþ\žPùùù;vìÓO?å¤çØØXy¥N Á_ç‰'žÐ»wèСDôæ›oZð-H~~>O«tS¹ š-«îrw*…B1yòä .hlô}ûö¹¸¸¸ººšÙØA/ìQ_„aŸ‘¿¿}}= wû`3Ã]¥RÕ××s EEE™ÓþwàÀ¤NKç:¬²§ÀIøùçŸSSSE»4eøAûÝwßi¶°3xûöív•ÃÃ+ÂÒ;Ä1ûöí#Ñ^†\ ×ÏÏOÄÏÍ}—,'#dÓ¦M-[¶|ùå—%V±NUU;äZ·nýá‡Z*Äüʦ@aa!œ2e ÇSy{{›ó(”‡§jˆŒŒ´x›¼¼<a×.[µj»íšòÿ#OÔugËœ6*#dN6J¥òÝwßåR3Lûöí¹¼¼u‰L˜0þ\‡M—åË—“:ó†»}°¥á®R©”JåöíÛ7nÜhR½R]„¥$yµWFÓ/š üØ;v,ÿ™‘‘áîîîææÖ A:0ìi{ûí·Mz?ØÄ£Æ¹|­Þªê*•*55•,ÑwI뵡-**ºqã†e½¹Ã÷߯YŽèܹó‘#Gló¹555sæÌqss9räŽ;¬ÔÁŠóͺuë&,pèÐ!öKiPjG¸ÌŽ———pJ“››ËM…Íotj*7nܘ:uj—.]¸2)½õÖ[Ö«Ï•a(r Gúq wû`cÃÝRpð€¿¿??Y=<<Ì™ 4†;ö:0MP‡ÂÂB^Ä亖œ49sæLë}bÁöp‹)Eî„Lš4‰ˆÄ‹Ù;vŒõ:¤çÏŸODóçÏ7m¸VƒÊ¢"¤¥¥½üòË/½ô’íÝÏæF‹ëPSSÃETcbb8+==S–-Û^ÊJpayŽ)×J)¶ñ/¢±±ñòå˧N²jÃ`•JUYYÉI†êÕ=z”} · ÃÝ>4SÃ]¥®ÔFD...Z}Åp<^xáKe«ÝhB!0ŸÏ>ûLƉ«¤‰§j ºŸ8qBkWUU×à:þ¼É#ÀÞdffráK!Ç·êò‘¥ÈÎÎö÷÷'uÛ™²²2n*ìµµµ999;w¶÷@°ééésçÎýûßÿîêê:mÚ4~.ëqðàÁ'Ÿ|rôèÑ”ø–üüüÐÐÐàààââbñ#¯_¿ÞµkWŸ¼¼¼–-[òÆÆÆÆîÝ»_¿~}×®]ðG`¦M›¶e˶Ž|||.\¸ÀÉâÎ@cccÇŽ³³³øáNÅÑ0zôèC‡-\¸û35 HxÜ‹Xí—.]2ÿ$t`š¬½zõ:~üøÌ™3Ÿþyk[íMV[RTTD&zܹ¤¸»éÒ¥Ë!C*++¹K(³wïÞëׯwêÔ‰+ë5p1DPã :üûßÿ~å•WÜÝÝ=<<¾ùæ]«ÝEpuu}饗ˆ(!!A¸ý÷ß?|ø°——wì¶60ܸ'€ t ˆ@DDì¸wïžô·H‰“ѰdÉ…B±téÒ´´4"*))á´Ô 4©¸\ Ô8ƒnnn«W¯¾{÷nFFÆ£>ª{€c‹0gΜ6mÚü÷¿ÿåjfÌêÕ«•JåÓO?m›MîÀœŒ "WÃ0Éã~ýúu"ÒT\gäÈ‘Ï?ÿ|MMÍO<±qãÆQ£Fåææ4ˆ;Ã7p1DPã<:xyyiõîÕàØ"øøø¬_¿^¡P,\¸Sª:´qãFwwwö,ØîLÆÏÏLô¸ßºu‹ˆ:tè ñøuëÖ=þøã³gϾpáBçΓ’’š”»àlŒ?~É’%O=õÔÚµkŸyæ•JµlÙ²^½zÙfÍ8ùÒ4ëäT°555ÞÞÞžžž555ßÒ¯_¿sçÎ>}ZS¯Ö(µµµ³fͪ¬¬ìß¿ÿäɓ۴i#w¼`”JåĉwïÞÍŽ7nïÞ½Z¹UHNv#%%ÅÞCh@:D "¢_~ùÅÝÝýþýûuuußÂw®Ñ.­[·îÙ³çµ×^kšV;.‚j 9‡..._ýõªU« °lÙ²;wÚ²Ž™Õ=ÊÙÙÙóçÏ?rä5ê£>j×®¼ƒÍÙ««©”/;"((¨¬¬¬¸¸XJJVMM»»{MM‹ |FG¦¹zÜ+++GŒ“•••••W]]-ã`sö2Z­§¬úÅÀá1)Ì=++K¥REFFÂjÙX÷úùçŸ÷ïßñâÅ‹/îÛ·ï¦M›dlÎ^Ǥæ©YYYDÔ¾}{« ëî˜2eŠpË”)Söïß/ã`sösp†x5)@:D "¢””ö¸K4ܳ³³Ék<ãb ˆ :D°>Ö5ܯ\¹Ò»woá–^½zeddÈ8Øœ½LÛ¶mÝÝÝCCC'Mš”™™)ë 9#ƒ¶÷šÐˆˆhðàÁìÙÖGIDATq—*㨆;.‚j Aëc]ý¬¬,((H¸%88¸´´TÆÁæì%¢±cÇîÞ½ûÞ½{©©©±±±Ã† ûõ×_å~-¦Å¸çää‘HqFq–$¡ýû÷2ÄÓÓ3""bÞ¼y .”òF…>„‹A—.]*//×ü)Ü%|]^^~éÒ%½»pœgÀšÝØãž––&å ¼Î©1ܛηÀpœg}†iÓ¦é5ÉjX²Zp |Ú6mÚ¤§§ ‹ïæçç÷éÓ'//O÷í⛳W—‚‚‚N:UVVýF¨?S^^îØŒ%è@ˆˆÊËË>úè£?üPJ¯ï®]»^»v-##£{÷î6žÍÀÅ@A t ˆ ¦y”ƒÔ-¶}ñâEá1ééé=zôÐûvñƒÍÙ«w¨’¾PG¦èÀ@‚DD”mRU™Û·oQDD„u‡esp1DP"Xë†ÊŒ3&11Q¸%11qìØ±26g¯.»ví4häïáÔôìÙÓÞCh@:D "¢ž={JON-))©®®à·8¸"¨¬u ÷3fœ>}zåÊ•eeeeee+V¬8{öìôéÓ5£kÄ6go\\Üž={òóóëëëoÞ¼¹råÊeË–½óÎ;VýîàØHONew;2SÀL¬k¸ûúú&''§¦¦FEEEEE?þèÑ£>>>26gïâÅ‹wìØñÀx{{2$333%%%&&ƪß6Ü…é\†`Ã=<<Üêc‡É—b 9•ˆRRRP–• ƒè@ˆˆRRR***FýÄO|ÿý÷âÿûßÿž5kÖ´iÓ6oÞl›áÙ \ Ô@‚jšGr*pHð d "ÑàÁƒ¹v„{nn.9bf*áb "ˆ :D°>0ÜÈ! €ˆîÞ½kôÈ;wîQhh¨ÕÇ wr $¢²²2£G²Ç=,,Ìêc‡†;0‚°C˜3è@ˆˆ.]º$ÝãΆ»C&§âb ˆ :D°>0Ü"##í=„&t` A""ŠŒŒôöööð𨮮®­­?Ø=î¸"¨¬ª¦ˆª2 B›6m BBB S__ïéé©P(jkk]]]m9<° ¨* É!%Z&??_©T¶iÓV;˜ w2‘b¸;pœ ØîÀ)))öB“:0Ð ©Eb¸çåå‘ãÖ‚ÄÅ@A t ˆ`}`¸# ™è@ˆÔ"ÀpÇÅ@A t ˆ`}`¸ w°%0ÜȆ;ØîÀˆWc "‘Z"*//9Ò± w\ Ô@‚Ö†;0âÕèÀ@‚DdJŒ{~~>µmÛÖ6³1¸"¨¬ w2A9H°%0ÜÈĨá®T*‹ŠŠ E›6ml8.pL`¸#ˆG¯:ЈH-‚Qý¸¸¸¡¡!88ØÝÝÝvƒ³!¸"¨¬ w`„ììl{¡Iè@ˆÔ"5Ü93ÕQÜ A5Ð ‚õQ¨T*{¡é¢P@0HnnnxxxXXØ;wôðŸÿüç±Ç9rä‘#Gl<6°Ö3 áq £÷‚‚"B€;XîdâíííááQ]]][[«÷Ç® 6†;0š)0ЈH ‚¸ÓÝá=î¸"¨¬b¸Å@Œ;ˆÓ­[·«W¯fffvíÚUwïäÉ“·oß¾mÛ¶)S¦Ø~l`ã )"îqG¨ Xîäãä¡2`K`¸#\ºtÉÞCh@:D "R<îl¸ãb ˆ :D°>0Ü"##í=„&t` A"ˆ b¸×ÖÖ»¹¹µnÝÚ¦ƒ³!¸"¨¬ w`{¡Iè@ˆ"QYY™î1yyy*•ªmÛ¶®®®6œ ÁÅ@A t ˆ`}ìl¸gggO˜0ÁÏÏÏÏÏo„ 999²ß›––6gΜ€€…Ba•oNIpp0ëîâvª¶8(ö4Ü+++GŒ“•••••W]]-ã`£§šö4ܯ\¹Ò»woá–^½zeddÈ8ؤS°*ã´w°%ö4ÜËÊÊ‚‚‚„[‚ƒƒKKKelÒ©X ‘P™¼¼]s€0ºFü`£§²†|93ЈèÏ"è­™MD‘‘‘6˜ÁÅ@A t ˆ`}ìi¸ûúú&''§¦¦FEEEEE?þèÑ£>>>26z*aº€ R ~úèÀ@‚DôgBCCI]µ]í[·È <î¸"¨¬›}?¾}ûöûöí3´W+®_ü`“N¤Ó³gO{¡Iè@ˆþ,îZÅœÄ㎋ ‚è@Áú $³àJíZ÷›7oQûöíí2$pH`¸0 ½¡2\ĽsçÎö8"0Ü„}œèÀ@‚Dôgt=îÙÙÙ …¢C‡vœ ÁÅ@A t ˆ`}Ð`H 4`£TTTøûû{{{WUUñ–7ntîܹ]»vÈT8!ŽÐ€ €CâççײeËêêjM%¸ßÿ'–†;sÑŠ–¹qãuêÔÉžc‡†;0Â¥K—ì=„&t` A"ҫǰ½NΔ™Š‹ ‚è@ÁúÀpFpø2Ì t ˆ@D:"tíÚ•ˆ®^½ÊþöÛoDÔ½{wÛÌÆàb ˆ :D°>0Üüýýí=„&t` A"ÒAËp¿rå õèÑÃö³1¸"¨¬ wæÒ­[7"ÊÌÌ$¢ŠŠŠ;wîxzz:|-H°10ܘ‹ÐpÏÈÈP©Tݺusuuµ÷¸À¡€áŒ€f t` A"Ò!,,ÌÏϯ¨¨¨¨¨èòåËäî„‹ˆ ‚è@Áú ÁhÀ‰‹‹KNNÞ»wïž={vîÜùé§Ÿ¾øâ‹öØ4`Ф>|8;vìØ±cD4jÔ({ x”Å€Ç$rêÔ©Áƒûûû———GFFfeeÙ{D`àqvñj t` A"Ò'Blllhhhyy9=õÔSö”ÀÅ@A t ˆ`}àQwÎ… yä‘îÝ»?~ÜÓÓÓÞÃû`=†©0ÜÀ$Nœ8ѹsçððp{ì wûØbÜÝàˆUè@ˆ ‚è@A t ˆ`}`¸#dggÛ{MèÀ@‚DÔ@‚j AëƒP1*L¡2850ÜhÀpF@3:0Ð A5Ð ‚è@Áú †[ ĸ“@Œ;° öB“:0Ð A5Ð ‚è@ÁúXÝ£œ=þü#GŽѨQ£>úè£víÚÉ;X|oZZÚ¦M›vìØQ^^®û¥ …Ö)_w‚j "DP"¨Ô4W{eeåˆ#bbb²²²²²²bbbââ⪫«elôT“'O 9uꔡÁ¨þŒe¿)Vź£5kÖüòË/Û·o×lyæ™gúöí;wî\S–~*½³ySL "¨ t ˆ@DA t ˆ :DPÓ\=î˜2eŠpË”)Söïß/ã`“N€ƒa]ÃýÊ•+½{÷néÕ«WFF†ŒƒM:•^Ú¶mëîî:iÒ¤ÌÌLéoÀîX×p/++ n .--•q°I§ÒeìØ±»wï¾wï^jjjllì°aÃ~ýõW©_»£²&îîîuuuÂ-uuu-Z´q°ôSIùRëׯì±ÇŒfïÿÐü0jdÊÃÍ‚C–\d«700°´´´M›6ší%%%ZŽs â›t*£Œ?~Á‚Fƒíš– •ÑõUGGG_¼xQxLzzz=ô¾]ü`“N%e¨òÞ€]°nŒû˜1c…[ÇŽ+ã`“Ne”]»v 4HÞ{°=Ö-·yïÞ½Þ½{OŸ>ý…^ ¢õë×oÙ²åâÅ‹>>>ÿïãu.Å6zªÿÿ•tjgÆÅŽð ƒ¾}ûöÎ;׬Yóã?ÆÄÄXï»`A¬ëq÷õõMNNNMMŠŠŠŠŠ:þüÑ£GuMm)=•BÖk"Z¼xñŽ;xàooï!C†dff¦¤¤ÀjÍ4¸ `];À"Àp Ã€f wš0ÜhÀp Ã]Œììì &øùùùùùM˜0!''ÇÞ#² iiisæÌ ÐT¾".‚ÃHtòäɧŸ~ºuëÖþþþýû÷ÿöÛoµpΞ=;}úô:´hÑ",,läÈ‘{÷îà "h‘ŸŸß¥K­Ÿ†“è ÐA¸×ID "¥R¹víÚèèhOOÏx ))I¸×tн E‹-48ƒDÔØØ¸nݺ‡z( Àßß?&&fݺušœD‡#GŽ 8ÐËË+((hòäɽ,‚õŒ%“dánÊÊÊ#FÄÄÄdeeeeeÅÄÄÄÅÅUWWÛ{\–gòäÉ!!!§NÒÝ%.‚#I4lذ¢¢¢o¿ý6//oíÚµ ›6mÒìuæÎÛ§OŸÃ‡WVV^¾|ùõ×__¾|ù¿þõ/Þë$"Q©TÏ>ûìÒ¥K…JÕŸÑlw*æÌ™“žžþÝwßUTTlÛ¶mÛ¶mš]N¢ƒJ‡5kÖ<õÔS¼×ID ¢yóæ}ùå—kÖ¬ÉÉÉÉÉÉY³fÍÖ­[çÍ›Ç{D‡£GNœ8qÆŒÙÙÙW¯^>|ø¸qãjkky¯c‹`%cÉdYt€ùðÃ'Mš$Ü2iÒ¤?þØ^㱺׃¸Ž$Ñk¯½¦T*5^¼x±S§Nš?G-~ÿý÷€€~í„"¬^½zòäɪ?ÿ4œG‘„󈜜|ø?þ(Üòã?Ž1Â^㱺ע¸,QUUU‹-4:­YYYÁÁÁüÚÙD¸páB·nÝ***Tþi8"†»óˆ0qâÄÇÚë<:Ù¿ÿ€4:­[·Ö5ÜCBBøµ“èàååUTT$ÜRXX8räH~í$"XÖX2Uî ÉÏÏnÉËËkÛ¶­½Æct¯EqX¢={öÄÄÄhþtBîÞ½{âĉþýû¿ù曼ũD¨®®îÙ³ç™3gøOáOÃyt ¢6mÚ¸¹¹µmÛöïÿûo¿ý¦Ùå<"DEEíÙ³gèС^^^-[¶Œ‹‹KIIÑìu„ >ü믿Öüé<"$$$ôë×ïäÉ“'Nœˆ]¶lïuôÈ`YcÉTY`¸ÄÝݽ®®N¸¥®®Nè…uð­¡  `ÇŽW®\Y±b…½GdköïßåÊ•E‹Ù{ vfÿþýC† ñôôŒˆˆ˜7o^BBÂÂ… í=([£T*W­Z5uêÔÖ­[·nÝzÚ´iï¿ÿþ’%Kì=.»ññÇÏ™3ÇÍÍÍÞ±|ðAZZÚ¾}ûJKKKKK÷íÛ—––öá‡Ú{\6%!!áÕW_MLL,.....Þºuë‚ \\`LÚY“ §ÀaÖt¤£{=8ɲ—†Û·o÷îÝû§Ÿ~ÒÚîl:hHNNn×®¿v:uêtëÖ-árÊP-òóó}||øµóˆÐ¶m[ÝÀooo~í<:0EEEAAA%%%ÂÎ#Bûöí;&ÜrìØ±:ðkçÑáøñãÇ÷ñññòò4hPRR’³‰`YcÉTY0I2HttôÅ‹…[ÒÓÓ{ôèa¯ñØqL¢ÜÜÜÿùŸÿùðÃãââ´v9•B~øáÂÂB~í<"ܸq£}ûöZõË5/œG-T‚0*ç!::Z|¯“èÀlܸñ¯ýkPPp£óˆpç·~X¸åᇾsç¿v† –œœ\YYY]]’’âïï?`ÀÞå<"haÎ7Uî3fLbb¢pKbbâØ±cí5» .‚#ITXXøøã¿ûî»#FŒÐÝë<:hqúôénݺñkçAÄ¿BΤƒ»ví4h¿vÆwèÐ!á–ƒÆÆÆòkçшêëë7lØðüCk»óˆùË/¿·œ;w®]»vüÚytÐbýúõ3fÌà×N+‚9_ÜdY¤, 8':tX±bG³-_¾¼S§N•••ö—ѽÄEp$‰úôé³sçNC{D‡G}ôÛo¿-((¨««»}ûö_|~èÐ!Þë$"èEøÓpFŒ±{÷î¼¼¼ººº?þøcÅŠ­Zµúå—_x¯“ˆ R©jjj¸mÛ¶¢¢¢¢¢¢-[¶'''ó^çÑA¥RíØ±cÔ¨QºÛG„µk×FEE}÷Ýweeeãñé§Ÿò^çÑaôèÑiiiuuu7nܘ9sæìÙ³5»œDËK¦ÊÃ]Œ›7oÆÇÇûúúúúúÆÇÇk…½: â3:qF"½"”••ip’““Çìææ:a„³gÏ pô¢u›vŽ=:nÜ8¾ÂÃÃ'Ožœ™™)<ÀD`rss'Mšèáá1`À­çÑ¡_¿~Ô»ËyDصkWÿþýúõë—””$Üë$:|ýõ×=zôhÑ¢E·nÝ>úè£ÆÆFá^ÁzÆ’I²( Ðt@Œ;Íî4`¸Ð €á@3†;Íî4`¸Ð €á@3†;Íî4`¸Ð €á@3àÿÚ[;9««îêIEND®B`‚gsl-2.7.1/doc/images/histogram.png0000644016036000116100000002243613373111455013755 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœíÝl[Õ÷qûvliL“Ðf6›” XØPU›XG2iÀâŒbkën,-j·UüÓ´桵B°% hÑÒJ¦ÿ°Nj³‹Æ4)ÙÄ(«–¸Ôž’ñÇ`8QݪƒHÔÈóGöø¹sÇv|Ï9÷œ÷ë¯ôÞ›ëokû~z¿çøØ;77çbýÙ`" `$ €€@ `$ €€@ `$ €€@‚Úð‰'víÚµzõj¯×[â°3gÎ\{íµÇLLLD£QŸÏçóù¢ÑèäädÍË@µà­[·®]»öرc%Ž™››Û¶mÛc=fß833ÓÞÞ …2™L&“ …B³³³5¯é¼Î}°×»èÉ{{{Ož<™H$ìÇôõõ%“ÉC‡åÛ²eËúõëwïÞíP…È"a øäɓطo_Áv˲b±˜}K,X‚ˆà?ü0‹ Ô××ì ƒö-mmmããã«@Ñ-è;wúýþGydá1+W®úè£Úž€yÝ© à‡zhhh袋.*º·¡¡!—Ë577ç·œ={¶±±qÉÓ~ôÑGÎÝÇ£j%fáA.ž5ñ¼¨©ôGj—Cèð›o¾¹nÝ:¯ÇãÉÿÐÚÚšJ¥ìǧÓé––‘ †Ðž[ ¿Ñãñtvv& ûñ‰D¢««Kd…ˆ!çsÀE™žžƒÝÝÝ;wîôx<û÷ïH¥RuuuË ˆÇó¢,ž5ñ¼¨É¹ç¥öwÀ ÛËe6Ðëë뇇‡GFF@ Z2}p#þÃÅÕÄó¢,ž5ñ¼¨ÉMwÀ`I0œò³ŸýLv (®³³Sv (‚·Œitèxз8„4Z!€€Œ“Ífe—€Ì“L&e—€IX,ŽIXh…@0N¿ì0 Àâ@+0À€q,Ë’]0O8–]&a°8&a  `À8,Ĩ@‡ÑSÆ€a ­ÀH@Æa P£§ŒÂ0Z!€€Œ“Ífe—€Ì“L&e—€IX,ŽIXh…@0 q*Ðaô”1`€C@+0À€q,Ë’]0O8–]&a°8&a  `À8,Ĩ@‡ÑSÆ€a ­ÀH@Æa P£§Œâ¦1à'NìÚµkõêÕ^¯·`×+¯¼r×]w­Y³æÒK/ݰaÃÑ£G ˜˜˜ˆF£>ŸÏçóE£ÑÉÉÉš—hÌk#»K¨}oݺuíڵǎ[¸kãÆï½÷ÞÑ£GOŸ>ýÌ3ÏÄãñƒæ÷ÎÌÌ´··‡B¡L&“ÉdB¡PGGÇììlÍ+4677GCp›· oÛ~øá'žx"ÿót:}Çwüë_ÿšÿc___2™`¦ü{¡ô›"›Íúý~u.æ¦t O>ù¤½3vÍ5ר›Ì–eÅb1ûñ±XlppP\}€¦ ZÓÉdRvE¤Î‚~ùå—¯»îºüÇÆÆ‚Á ý€¶¶¶ññqáu²·¦#‘ˆÜbx· ír¹Ü—¾ô¥ÜtÓMó[V®\yîܹ+Vä¹páªU«ÎŸ?¿œ̱X ºÌÖ4€…4iAç½óÎ;›6mzî¹çòé»LÞbâñxMNÐ^</%Î=¢„;àS§N}ãßøÕ¯~ÕÑÑaßÞÜÜœN§›››ó[Μ9sýõן>}ººLSæpÿŽ;¤U ¸Š>wÀÙlöÖ[oííí-H_ÇÓÚÚšJ¥ì[ÒétKK‹Àê#¾€ „ð»ï¾{Ë-·<þøãííí ÷vvv& û–D"ÑÕÕ%ª:ÄÚ‚…B?þñï¾ûî¢ÇOOOƒÁîîî;wz<žýû÷ ¤R©ºººJ0“°€šsS Ú>p]0ˆýúë¯ßsÏ=ãÛï¿ÿþüÞúúúááá‘‘‘@ FGG‡††–L_•²,Kv ø2@#eÞ³P>ç"F‡è"€y´ šsS ,‰@0N¿ì0 h„1` æ@+0À€qT Ã€ÃZÀ<Æ€šc ­ÀH@ÆÉf³ùŸ ¾1€00`œd2iÿ#£Â€:ÌÈ`^ 0¯ŠIXó[x‹aZ!€€ŒÃB€ tøaø ˜Wþ°}ÚsÑ1àü•¾¹ Î\ñßP cÀjlnn®ôe¥ê‹Î’gà!€‚ŒcY–ìÀ€yÂá°ìÀ€yü~¿ìx.–]€Š-\º™IO€ëp ¸R~¦1Ñ ¸ ‡…8è°„ qÀ4 k]gcÉ…8Šž¡àWªxs•øâÀXˆ­ÀH@Æa Pƒ4 5Á4ŒÂ0 €V`$ €ãd³YÙ% €ó$“IÙ%`àBL„aZ!€€ŒÃB€ t¤a¨ ¦) 8ÿÍÁŒÕa @•HA@M0\,»…b§Y–%àQ”Æ0 ‘âp8,ì±,†Œã÷ûe—€4 …|€[p è`nnŽÙ΀»À€qXˆPAíøÄ‰»víZ½zuÑžØÄÄD4õù|>Ÿ/NNN–¿@ù¼^ïb}é;v.ÀBµà­[·®]»öرc wÍÌÌ´··‡B¡L&“ÉdB¡PGGÇììl9{T„¦4 8׊[¸|W___2™‡ÛÑ‚”å¦4X €0`˲d—€Ì‡e—€Ìã÷ûe—€@ .–]ÑúûûÛÅwÂèðIy>ï·Sg!Ž%è(³$oLè‚…8Ð -h¥ä›ÒUÜÌÿ.÷Á@QÜÆ)1¼ÐÜÜ\Õ Jô%è0HÃPÜNý1àÅj«âkwqî5L Ä>Á˜L@ g9í\š!€ãd³YÙ% €ó$“IÙ%` J‰ ML”ÅBh…YЀºD®Ì¼äcU½"Çr–ò4Æ0 ´üÄé¦WÑ…8–œ¡]õnæ~Eé0<à \¡Š1àªGj.(²Š3îÂB€ûèºò_YÔ-hÀAZv_èŠ"€ãX–%»´ yëå:Ý㠇Ξ@9¸dZ¬GíhïÚï÷;tfå#€€@0NÑ…8¦ÃGãù€?Ô¤Âr žpâ ']—+–D €dZ.W,‰ŒÃ0 Fe[‚š\=R+l ˜Ab(ιW&wÀH@ ³ …ˆù¦¿l6+àQª–ÿG # ½q (DÌ|àd2éôC,Ñ À€q"‘ˆìÀÈ@  ‡…8èðÉw>¿5¹z¹ ‰ qü"  q  „ðǼoß¾p8¼zõêK/½4 íÛ·ïã?Î011F}>ŸÏç‹F£“““"Ë„ñz½bÖÜ(ʲ,Y Ohßÿý/¼ðB__ßäääääd__ßo~ó›ûï¿~ïÌÌL{{{(Êd2™L& uttÌÎΊ¬Cîð…ÃaY Oè4ŸÏ—N§×­[—ßòöÛo·µµ}ðÁ§¯¯/™L:t(¿wË–-ëׯ߽{wéÓ2YjrõT)&aó4™„uÉ%—,ÜøéOzþ˲b±˜}W,Qb àïÿûwß}÷_ÿú×ééééééW^yåÎ;ïüá8¿wll, ÚokkY!bý6¤G}ôäÉ“_ùÊWò[n¿ýöžžžùŸ§¦¦íÇ755år9‘&`!@B|òÉ'N9r$—Ëår¹#GŽœ8q¢··wùgöÇ—f`IöWìZʲcÇÙ%ʉÇãE£Ä¹G:Í᪫®øêW¿šßò—¿üåÞ{ï}ë­·<Osss:nnnÎï=sæÌõ×_úôéÒ§e²äZlž‘«§J1 ˜§É$¬S§NÝpà ö-7ÜpéS§ænmmM¥Rö½étº¥¥E\}ˆ"4€?ÿùÏ|øßÿþ÷Ï}îsó?wvv& ûÞD"ÑÕÕ%®>À »¨ ¨@ôBÛ¶m³,ëý÷ߟšš:zôè¶mÛxàù½Û·oíµ×öîÝ;55555µgÏžãÇwww‹¬0CcÀrW\Gô(ËáÇ{{{ßxã ÇóÅ/~ñÁ¼óÎ;ó{ß~ûíx`hhÈãñttt<õÔS@`És2V¹®è€%ÿõ†Rœ{)êðç ¹àŠÈÿãä&€¡2M&aPA6›•]‚ÇCËÆ#€ãÌ…  '‰È. € 0À€qø2@:Lôçã ‹!UtÀbÿh| jâcHhEè÷ëEó¸ŒcY–Üè-0P8–]ZÐ@­©ßbõûý²KÀ0àV9°$ `À8,Ĩ@‡ºó}È¥år꜋…8Ð ³ ²äüpõ'5Ä0`YcÀKNgö8Œ¢Ã( cEËEã©n<3 —s/EZдbïcáP-hº¡• W €ãd³YÙ%  ,E¿–f2™”]B5ô{"`8iÖÒŒD"²K¨’fO G  €0`¾ŒP gÇŽ²KÀ,h ¦X͸†òÿ˜L¼‚–¸j‰¨¨!æxþùçŸþùü®™™™öööP(”Éd2™L(êèè˜\! ´X‡“Î'ç„õç?ÿùÔ©S–eÍÿ1ÿáÈï=pàÀ† zzzæÿØÓÓóÏþóàÁƒ»wïY$ =âT ô¸¿¿ÿ?øÁb{-ËŠÅbö-±XlppÐùº³h°£ЀÐþÛßþ633³qãÆÏ|æ3õõõ_ûÚ׎;–ß;66 íÇ·µµ‹¬€+04  à3gÎÜwß}ßùÎw2™Ì[o½õíoû›ßü櫯¾:¿wjjª±±Ñ~|SSS.—Y!b àO>ùä—¿üåw¿ûÝ5kÖ¬Y³æÞ{ï}â‰'yä‘åŸÙ[L<_þ™ýäçaÈ‹ÇãE£Ä¹GôŠìä\~ùåÿøÇ?.»ì²ü–÷Þ{oݺuçÎóx<ÍÍÍétº¹¹9¿÷Ì™3×_ýéÓ§KŸÖëú·€fò¯Ÿ‚*ÝîÜ/ÖüÌÙlöŠ+®pWÍË93°ν„Þ·¶¶–Þ›J¥ì[ÒétKK‹ÃEÆñûý²K 6€7mÚdÿÜ‘Çãy饗n¼ñÆùŸ;;;‰„}o"‘èêêWP!æâ¨šÐÏï{ßëèèðx<·Ýv›Çãy饗~øáÇÏïݾ}{0Ü»wïÎ;=Ïþýû?þë_ÿZd…@Eò­NÙ…p¡wÀ—\rÉï~÷»?ýéO_øÂ®¼òÊþþþ_|ñæ›ožß[__?<<<22ÀèèèÐÐP]]È ° &)0ÕËaà$,ÓÎ ,‡&“°À< `À8Œ* €ãhðe €`$ €€Œ“Ífe—€Ì“L&e—@ìR”€Dö# _Ÿ!‰È.wÀ0ÉÜÜœáÑ @0Ђ†¡Lþ #âTÀ0ÌelGš…8ÀH@  Dz,Ù% €ó„ÃaÙ% €óøý~Ù% €@â* Çò†/ÄQôI4óá‹;` z\¦Yˆ#¿‹±‹±@0Ђ†[å‰ÜÁ O1‚;`¸Ñ[Ç€yIÀE`À8Œ* €€@0N6›•]F2|®l2™”]F2|®l$‘]Xˆºaäñb€Ê¸††¸Ú–¦ñBXê*#€ã° ZÐÐ\Ež Ÿ ZÖ‰;`è¯ü>$Kð€00`˲d—€4`žp8,»ÝлF¸Œã÷ûe— !¢•"€€@0Ž9 q*#€ã° fAp«JNYÎṉ̃BÍq À­ªX8¥Šã‰^8„ŒÃ0 i|æÌ™k¯½¶ #411F}>ŸÏç‹F£“““²Ê4Æ0 9<77·mÛ¶Ç{̾qff¦½½= e2™L& …:::fgg¥TÀ(^¯—¯â€`r¸¯¯¯¹¹ùž{î±o>.°:ÀÉdRv ÚâNåÀ>øà·¾õ­ 6,Ü555ÕØØhßÒÔÔ”ËåD•˜"‰È.€Ø…8ÇÆÆž}öY‘ €‚„Þ?ôÐC/¼ðÂE]TtoCCCÁýîÙ³g î‰ã-&/¿f”ƈ=Äãñ¢QâÜ# à7ß|sݺu±ü­­­©TÊ~|:nii)çÌsÅÀb0âå:,Ä,Ç‹F‰s(4€‹þÅò?tvv& ûñ‰D¢««Kd…€ XˆPBKQnß¾ýµ×^Û»wïÔÔÔÔÔÔž={Ž?ÞÝÝ-».ðxþw¨Kv-ÐB\__?<<<22ÀèèèÐÐP]]ìºà¿ø”jHò×¼”×­[wäÈYņ°,Kv d04SÃïOÍŸŠŽš ‡Ã²K R z¨aŽèuˆßï—]hAC¨ö¨KœX¦…/§‚- ‘`ù¸†hÎÍ#e†j™XˆcI _K ÿÈ‹ ËDÆa!@´ ¡:z}´Ä0TG¯€–`À8Œ* €á2,Æ»|Œ»ËPk‰†ûД†xÙë‡@fAC)}3šu‹Éf³²KÀ0Dß@£e·˜d2)»0`žH$"»´ aãÄBÍ%úÀEWØ o °Œ Jàÿɶíb'\ì±hC'¼˜±0 q* €á¬BP+.Ä!ýÅS°Œ kÀCÃEhM£jÒ_Éÿ1•J]}õÕù?ööönÞ¼Ù~üæÍ›Ÿ~úé%O+øo!žgA–>ráñ¿¸Ø%~±ôUÿ¢sg¦$άΙUø» jÎý ½~òÉ'íÝËk®¹ÆÞd¶,+‹ÙÅbƒƒƒâês‰‚¶0WsúÌåBY2'a½üòË×]w]þcccÁ`Ð~@[[Ûøø¸ðº\ ÿÿ2  Œ+Åé÷2— eI à\.×ÓÓóÔSOå·LMM566ÚijjÊårÂK4Ç0 9üÎ;ïlÚ´é¹çž»é¦›jrÂ…Sv½^o<¯ÉÉ1 Ÿ…CZµjY»n°,çQBŸ:uêë_ÿú£>zóÍ7Û·744Üïž={¶àžx1EÇ· àÚ¢‹hiaºVovwu¿ãñxÑ(qîEp6›½õÖ[{{{;:: vµ¶¶¦R)û–t:ÝÒÒ"°:ÀÙlVv Äð»ï¾{Ë-·<þøãííí ÷vvv& û–D"ÑÕÕ%ª:ùjØñXx5‚à´d2)»H°dg•«„`Bø–[nùéOzÛm·Ý»}ûö×^{mïÞ½SSSSSS{öì9~üxww·È ¥s®óã¢Fœ‰Dd— ò—…Å®îêk@h¿þúë÷ÜsOÁÿÂÞÿýù½õõõÃÃÃ###@ ŒŽŽ ÕÕÕ‰¬1„~á’ÿ·Z·nÝ‘#GÄ(Áû¿_oº°;Ííò2ñmH€qXˆå(:’Uº‰ŠÀ€qXˆPÐ4ŠbÚ!•qrwÀJ`ò!eqr Dz,Ù% m<šK ‡Ã²K€¶ª¸¤ØÅ¡[í‚ÝŠàØt4— ä÷ûe—UqUp!RðBG -èÿª´" g(¡à:ìºË2wÀÿ_¥=š·p)â€6 ®Ãîº,À€qXˆP-èÚ«Õt»Å¾/l9ç€y5¿˜puªwÀŽà[(Ήn-¨ŠÀ€qT`n翸ĮÅXæ#Ò¨\ŒCŠ2/€Þbz¬]é#VÁÜö,Þ-qî+·Ü5Cj«Ì  ý"\Ý5Sü/VÁè@fA/͉EDkÕßPsS(.›ÍÊ.ú(çjVþÏé¹ÙJ]3¹^šss—fzÚ¨B2™”]´²ä…¨ü+•ÓJ]3 `À8‘HDv ´kA/¹èÂþF½‘‚3«ÐÓ(óoÁlµ²ÌëIE¿>p‰k¬/nÞWÚ ©¨7RôHzeÖ B©ô rmÉÃÜxeÓ0€”ÆB€ t`ç>OíÆ^ÇB€¬%’t`çÚ­nìu#exNç@YºÍ‚V j¨É²,Ù%J{•æØAË_ÎpB8–]  ‰g0Žßï—]]ZК5{5ûë€ —8jÐçX§6¯N( Â%N…ô `eb!@p-Iù(7P)‫‰Y7CÀ£Àµ¤BO´'àb+à!`$Ð~ÀWQÇIDATdô’è yŒ*0è˜þ001`@0ê0¥ p;͹Œ“Ífe—TC³‘D0N2™”]3X³®°L‘HDv Ì`Z=À¨†ŒÃB€ `À8,Ĩ€†Sâñ¸ìPOšx^L£VOLLD£QŸÏçóù¢Ñèää¤ìŠP½Ÿÿüç²K@q<5jây1B<33ÓÞÞ …2™L&“ …B³³³²ë ö àlذ¡§§§¡¡¡¡¡¡§§gýúõ”]µ§P[–‹Åì[b±Øàà ¬zpŽB<66 í[ÚÚÚÆÇÇeÕ€s à©©©ÆÆFû–¦¦¦\.'«œãUg™Æ•+Wž;wnÅŠù-.\XµjÕùóçKÿ"K=œãPP*ô}À ¹\®¹¹9¿åìÙ³÷ÄE©óʤP ºµµ5•JÙ·¤Óé––Yõà…¸³³3‘HØ·$‰®®.Yõà…Æ€§§§ƒÁ`ww÷Î;=ÏþýûR©T]]ìÒ¨1…î€ëë뇇‡GFF@ "}ZRès(t €9`$ €€@ `$pGŸ8qb×®]«W¯.ú½ ÑhÔçóù|¾h4:99Yþ^Ô–wû^ž ð,¨ƒ÷‹"dEŒ;xëÖ­k×®=vìØÂ]333ííí¡P(“Éd2™P(ÔÑÑ1;;[Î^8aîå·ó\¨€gA5¼_T -bæ\eaÁ½½½›7o¶oÙ¼yóÓO?]Î^Ô\‰WÏ… x”ÂûE5‚#ÆwÀ%X–‹Åì[b±Øàà`9{!Ï… xÜ‚gJŽFŒëxll, Ú·´µµ—³Nøìg?»bÅŠË/¿|óæÍo¼ñF~;Ï… xTÃûEqŽFŒëxjjª±±Ñ¾¥©©)—Ë•³5×ÕÕuøðáééé‘‘‘o¼qãÆ'OžœßÅs¡ž¥ð~QŸ£sqMJæå{/W^yåý÷ßÿ©O}ê'?ùÉÿøG¹Ujâýb8å‘¿˜†††‚ÿnœ={6ÿ_’Ò{±åøàª«®Ú³gO.—Ëår¿øÅ/®¾úê™™™rö¢¶ÚÛÛ>|úôéÿüç?o½õÖž={.»ì²d29¿—çB< êàý¢ ÁãŽ.ý_‡ÿûß·ß~{}}}}}ýí·ßþöÛoÛ·ô^ÔÐÐÐЦM›ššš.¾øâ+®¸bëÖ­o¼ñ†ýž ð,(‚÷‹:dEŒw±ÇÎqý0nD  €0ÀH@  €0ÀH@  €0ü_"¹šÜe/«IEND®B`‚gsl-2.7.1/doc/images/histogram2d.png0000644016036000116100000003711513373111455014203 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœíÝy|TÕáÿÿsgÏJBÅ„] ‰€hk©D«(E–0.°+…~\ú¥?Fʧ?Q@?¿ªh?”þ 1¢µnà‚Y\X"$$$#Yg¿ß?.\.3“ÉB&w2ózþ59sî½gN–wιçÞ+ɲ,@÷2èÝb €`t@ Àè€@0: €Ð €`t@ Àè€@0: €Ð €`t@ ÀˆtÒV«533s„ >úè?üàW§ ×åûìò½µÓÆ  ô^‡6 Gk»§tég s`ô²,˲ÜÜÜ|àÀ¥K—644Œ=zýúõÚIwþiŽøÏÿüÏuëÖ)½§w[Ú%BúíüEÍAXI=å71K’‚ü”~õÕW×]wÝ|““s>ûéÂú]µm2'B =}rþý!=!Í@„cŒé²Ë.[¼xñòåË•/ÕŒihhxðÁ‡ß«W¯ë®»î­·ÞR+¨³ÙêV---÷Ýw_fffÐ™çæææßüæ7½{÷NHH˜4iÒ¾}ûÔ·‚¦šz” ÇR«•””Œ?>!!!!!aüøñ›6mÒîÁëõ>þøãÙÙÙV«uذaÏ=÷\ˆ~½+ŸÏg0Z àÖúJœ;ßÜÜ|Ï=÷¤¥¥õîÝû¡‡’e¹¥¥eþüùééé)))÷ÝwŸÇãi³Oü;vìw¿û]RRÒÀ|ðA‡ÃÑZ¿ !>üðÃqãÆÙl¶ììì¿þõ¯ÚýìÝ»wÒ¤I ½{÷ž?~sssˆ¾ ÜÏwß}—››ëóùüjú|¾‘#Gnݺ5ÄÑC|§‚~½Ø%‘­µŸÒýû÷<دδiÓ/^\VVær¹jkkKJJ~ñ‹_´¶!Ä]wÝõÆoœ:u*ðpBˆÛn»måÊ•••••••+W®ÌÌÌqâÄk¯½–ššºcǵÚ=÷ܳdÉ’ï¿ÿ¾±±ñƒ>4hÐÿþïÿíл Ñuíï+!ÄwÞ¹fÍšºººï¿ÿ~üøñË–-»óÎ;_~ùåÚÚZ¥ä™gžéhŸdee½üòË GŽ™9sæÿøÇÖöðÍ7ßôîÝ[ù}þùç|ÿý÷•·<˜™™©~ƒ–/_~Ûm·µö‘[ÛÏŒ3^yå¿ÊkÖ¬¹òÊ+C=ôw*°!z1‹F¤kíOjKKK\\œ_ÄÄDmš†Þbùòå­UB<öØcÚ·}ôÑÛo¿=D«ÚÀS§N]½zµö­U«VMŸ>]­öðÃkßÝ´iÓW\ô…ÞUkTµ§¯„j¾Ê²¼}ûö„„mɶmÛ.»ì²‡ Ñ'ŠºººAƒµVçöÛoê©§Ô/7nÜxã7*¯çÌ™ã÷ ú¯ÿú¯ÖŽÒÚ~¾øâ‹ììl§Ó©¾åp8²²²6mÚúè¡¿SÍÑÛˆY0"]kR›ššâããýêŒ7nÞ¼y?üðC{ö#„8räHkÕ„êxWqðàÁ~ýú…hU{ø¢‹.:zô¨ö­òòò¬¬¬ÖZWW—ššx¬6wÕZ#Uíé+!DEE…Z~êÔ©À’äää‡ ì“–––G}tøðáqqqÊ<œÑhlmƒþî»ïÔ/ëêê.¸àåµvBBqðàÁÖ>rˆýäçç¯\¹R}kÅŠ£Gns«Ðß©Àf„èmÄ,‘®µ?©ûöí2dˆ_ÇO:Õf³]|ñÅwÞyçÆ}>_kûB¸\®Ö'„hiiѾÕÜÜl2™ZÛ›×ëmO[­V‡Ã¡}ËápX­Vµš×ëmm[?¡wbCE{úJ¡†(iípAûä÷¿ÿýõ×_¿k×®ÆÆFY–[ZZBìÁb±ø53 Ê[F£1ðÔÚG±Ÿ÷Þ{/##£¡¡A–åúúúŒŒŒüãmnú;ØŒ½˜E#Òµö'õ‰'ž˜;wnÐ:‡ã«¯¾úË_þ2vìØ»ï¾»µý´9b 1NII±Ûí~ïvn|ôèQí8D“ü„ÞUˆ µB÷U{:M-igŸôïß_;†V–¶µ¶óÞ½{?~ûlUUUUUÕ³Ï>›™™ùý÷ß+ïþío2dÈG}ÔÔÔtðàÁ?þñ÷Üsºmˆcmß¾=55UYº\]]ýú믧¥¥}þùçíi’ŸÐ» ±a›}%:5Ý'ê‹Y³fÍž=»²²òĉË–-ûÕ¯~¢ßöîÝÛ¯_¿W^yåäÉ“›7oV—A}ÿý÷™™™ê7è™gž™5kVk9Ä~dYöz½Ã† ëÝ»÷ AƒÚyôÐß©À¢·³`D:õŸE‹Å’‘‘qõÕWú-fQÿð½ÿþû3fÌHOO·ÙlC† y衇~üñGå­wÞygèСF£1DºÈçfOccãüǤ¦¦ÆÇÇ_ýõ¥¥¥Úš«V­:t¨Ùl0`À£>ª\ÛžcmذaìØ±qqqqqqcÇŽ-..znï59|êVûº›œzn×é.|]%ß’ sôm~4~";®ë4ºî|Ð{F×uZøº.JN'ÈÁèÝ(±K{å.Wñ"(Σ3yä½›ÐSÑu磧ô^Ð5Ìí¼ŠW™yÔÏ’`ëØ)ô†=¥ëbJLOJ0' vlY»ùGåõOGÆoÛÛ¬¼žsmÊè!q!6lížm¦27릠 ÇPÖ0 !⬆¼¡qêkuÙ³he^Z{õQY•K)´7x—¾QýÊ»ö¥oTÛ½‡krø>ÞÛ¸!"SÐÐÅü.í ¼Š·µ«ßÕGJ¡_*§ž;†Vw¥|éóˆd0t=í•»Wñ¶–©AoÊá—ÊMߣN!Ä%YluWBˆ ¹ ×^žÈÍ:z ºr6·Oª)p¤«Lkm*;]ò¯W;ݲÂj–¸%CÏ?ËM }{º‰væyÁÍéuõ^íH7ÄJ+5•¿­hQÒWátËeU®ÑCâ–Ì꣌‰Í¦pݵá@@7ÑÎâ0Å›Ÿ6(%V³a`_Ë‘ªPWú†mwú¶Òè0t¥Ð+­Î^Dä:ÃÊ ‹YÚ¼³Ñé–!ÎÌw^:Ð’’hlíJß&‡¯ô°£äÓz§ûìuMjÜrwèÈÓ'A9 Z;#koô.[wzl³˜ÙÛl’”iO^ÿÁ)¿ýXLÒƒ·ž>x3Ëeëkœ®³ÁÌ&áö5nµ„hó!sÀÐc$Ø ƒúY÷Ÿþµ˜¤éW÷r¸e›YR/"3,NaoôªÃÜŸ^÷Þ—MB—çô$¶rŠWy~ƒ²Ï}emúZÌ’Ë}μ·zŰÍjÈL5©vw_ u0t±Àé_¿éâûgfÄ[ Ús´çÜoÒ-\Úì7‰í·O¡¹çÕøKâ~riÂêµçl"ŸžÊöyåç6ÖªÇe.:rÀÐÅ´ë°¾­pʲP¢Wy×om³Å,ýnjúéfu%s¼U^.ì·O£Q²š%§[¶Y ×]ž”p…±z¾Ùå9ç¸Ü¦#rÀÐÅÔeS6‹áÍOÎF¯B¤ªk›•‹‘ºµvlxYQà>­éWzdS×om}Y–nnÓqbz‹°„‰2½Üäð­ÿðìÒ*›ÕðËñI¹ƒlñVƒ½ÑûÿþoµÛsú­Öî­¡=q{zŸNŸº\+èê*uC!„2&–eÁm::EXГ(ãÑcµney”6zO×…$IÊyZõ± ªÀç&)I|é@›v¹VàM+ýN«cbnÓ` {ƒ÷ùâZ—[6›Ä½7§õO3kß-;ár™šþåUI)ç®Òžñ]µá¤öú"¿Ç/}£Z»Ú‹3ô LG@X¨Yèöˆu§çš•K‰š¾ì¾«YBØ,†‹/´úm«œÁBXÌ’2M}zé–âÌð:Þjð‹[qæy…Bg|##`‹À[biç‡ç\›ªŒeä£:ÌMïeô¿¾¨•C(û¦%•«d+\"]L¯Bb€®åwFÖïVÚ»SÂ{æFСïTx,í2«G²¤›V×:\²r?¬öìíÄ",ˆt÷ßhíÒ õÆUB‹I =Wì·õ(V³$$átÉV‹tÙà8uº[É`.:Š|0t6@©Ëñ6饷í.·l1K §¥§täîTêQ´Ïuøü@³ò:ÎjX0%­¶ÞËEG‘ot uå”:úT—\©ul† {›_~Ç®¬Ž¾oZz¿sWGÝ*èQlƒÅ$ißš›°hFzm½wP?Ò·ˆé“ œе´çk[{ `èçµç1‚êQJ;Ô}XLÒo'§½ðv ìZáK þE€.£^ $f¤Õ:e­Ö¶ z”á¬êÕJ §§×5zÛÜ‘ƒsÀ—!)RœÐž­‚òÛ•Íbhÿ¶Ð]LÏÁ2 ¬¯ ßVç¿-‚ _RÄtÀ€Ð8 @T!€Ð €`t@ Àè€@0: €Ð €`t@ Àè€@0: €Ð €`t@ Àè€@0: €ÐAäðÑ£Gg̘‘œœœœœ}úÆÕ’©S§þóŸÿ”$)ôQ˜‚„sSвlÙ²]»vmذ¡®®®®®nÆ »víZ¾|y{¶•‚),, s“‘¥°°0h"„ïˆ:ÌÌÌ,--ÍÌÌTKªªªF]YYXyàÀkÖ¬ùùÏ®–|ðÁwß}÷áÇC…0 ´˜çääìÙ³G[RZZ:bĈ •;6fÌmɘ1cŽ;Æöp~"4€'Ož\TT¤-)**š2eJÐÊ]tÑÎ;µ%;vì0`@ÛÀù‰Ðž7oÞ'Ÿ|²téR»Ýn·ÛŸxâ‰Ï>ûlîܹjí¼ü¢E‹î¸ãŽ’’’üÑn·oܸñŽ;îX¼x±  ]"÷$hYYÙâÅ‹·lÙ"„ÈÏÏ_¹reVV–ú®ß¤üúõë—/_þÍ7ß!†þ‡?üaæÌ™m‚sÀ€Ð—1@0 ´˜[„@t#€Ð €`t@ Àè€@0: €Ð €`t@ Àè€@0: €Ð €`t@ Àè€@0: €Ð €`t@ Àè€@0: €Ð €`t@ Àè€@0: €Ð €`t@ Àè€@0: €Ð €`t@ Àè€@0: €Ð €`t¹|ôèÑ3f$'''''Ϙ1£¢¢"DeŸÏ·jÕªœœ›Í6räÈuëÖu[;è„ àÆÆÆ‰'æåå•—————çåååçç777·VÁ‚¥¥¥o¾ùf}}ý«¯¾úꫯvgkè(I–e½ÛÄŠ+vîܹvíZµdΜ9ãÆ[¸pa`å÷ßùòå%%%=Š$EèÇDˆð%E„Ž€KJJ ´%ÅÅÅA+¿ð ¿ûÝﺥ]t à}ûö5J[’››»ÿþ •?ýôÓÆÆÆ &ÄÇÇ'%%]{íµÛ·oï–fÐIÀv»=--M[’žž^WW´rUUÕo~ó›;ï¼³¼¼üðáófͺùæ›·mÛÖ-- 3"4€;Äçó=õÔSwÝuWFFFFFÆÝwßýä“O>üðÃíÙV ¦°°0ÌMD– ‰¾#Fè*¤ÌÌÌÒÒÒÌÌLµ¤ªªjôèÑ••••ûõë÷õ×_÷îÝ[-©©©ÉÎÎnjj }aB‹¹EX999{öìÑ–”––Ž1¢µÊÝÒ(ºL„ðäÉ“‹ŠŠ´%EEES¦L ZyÚ´io¿ý¶¶ä­·Þ;vlÛÀù‰Ð9؆††Q£FÍ;wþüùBˆçŸ~Íš5{öìIHHP*hçG~~þo~ó›o¼QñÖ[oÝÿýëׯ¿æškB…)h@h17””´uëÖ/¾ø"+++++ëË/¿Ü²e‹š¾~l6Û?þñÿû߯ »ð _xá…uëÖµ™¾è(¦‡€Œ€¡ÅÜ€èF Àè€@0: €Ð €`t@ Àè€@0: €Ð €`t@ Àè€@0: €Ð €Ú`ÇÓ í ¦´ÀÙÙÙ?þxuuu7´€ÑvoÚ´©¬¬løðá;vìè†6õ$Y–ÛS¯¶¶ö¥—^zþùçûöí{ß}÷Íœ9Ób±„»qá&Iíýø€Ø¾¤èØ~½^oqqñªU«8pÏ=÷üö·¿íß¿8šÕ=`@h‘À ·ÛýÈ#ü÷ÿ·Íf+((X¶lYrrr8n0 ´ð%EÇ.C:yòäO<1pàÀ;v”””ÔÕÕõë×ïÎ;ï Gˈbí ö½{÷>óÌ3ÿüç?§OŸ¾hÑ¢œœ¥Ün·_xá…MMMáld¸0„¾¤0µYcÓ¦M+W®üæ›oæÏŸÿÝwߥ§§kßMMMmnnGˈbmûøñãÿûßÿú׿6™ÚNëž…0 ´ÈZ„5`@h‘² t Àè€@0: €Ð €`t@ Àè€@0: €Ð €`t@ Àè€@0: €Ð €`t¹|ôèÑ3f$'''''Ϙ1£¢¢¢=[UUU :T’¤p7€ó¡ÜØØ8qâļ¼¼òòòòòò¼¼¼üüüæææÐ[ɲ|Çw<öØcÝÓH:M’eYï6±bÅŠ;w®]»V-™3gθqã.\b«åË—õÕWEEE’Ô®ÏÕÎj€˜¾¤ˆÐpIIIAA¶¤   ¸¸8Ä&_}õÕ‹/¾¸zõê07 €.¡¼oß¾Q£FiKrss÷ïßßZý–––‚‚‚5kÖ$%%…¿u@g49|_q49|z7@DˆÐ9X‹ÅÒÔÔd6›Õ·Û˜˜èt:ƒÖŸ?~ÿþý~øaåK¦ >MßáJ× ~–›Á¯D¡¾åWÍÞà}j}Ã%Û,Òý33Rz~í¾¤0…c§Ý¬¸¸xß¾}Ï=÷\'¶ º^ú‘G),,<ßf¡§ LÖ@9ª–XÍ’,„Ë-[ÍR~^â–]N÷Ùje'\—,„p¸äo+œã/‰ïÆO m………>úhw1B‡€™™™¥¥¥™™™jIUUÕèÑ£++++2dË–-YYYj #`øi3\Ïæ¨Eúå•ɹm5›¾-»?ÜÓ¤|9çÚ”ÑCâvlY»ùLJVªÙ½ËÖÕ8ݲÂj–¸…A0Ð3ÄÜ"¬œœœ={öhKJKKGŒ´ò¡C‡²³³% !„ú±I{ÂÕÞà}âõêWÞµ?ñzµ½Ñ´þ·?8•ªÓ%ÿãÃSKßð¯ioð.}£ZM_!DZ’Q‘Ý×b³HB³)ÈÏ›ÍbØ×"„HM4N¹*Y)tºå²*W—|L=W„ðäÉ“‹ŠŠ´%EEES¦L ZY vG[y”°|å]»’£ûÊÊÐÓé–÷•9‚ÖóÓzm‰Ã埑겪®Á+„HM4.™ÕçÎëSNO·Zü3øç—%lÛ×\sÊ#„>ÀªDuœõt*ˆezxÞ¼y£FZºtéüùó…Ï?ÿügŸ}ö—¿üE­Àì1Bð;áz¼Ö£¾tV¤ì„Ëy&\ÍFáöŠ8«!3Õôåw-BˆK.²&Ø Ù}-V³ätË’$dùtˆª3Û—´ !þ4«ÏáJW¼Mzq“Ýí‘­fû_4ȲxwãÜ›Ò.`]2«ÏáJ×àþ–xk„þï  ÛDh'%%mݺuñâÅþóŸ…ùùù[¶lIHHл]èš>el*„$QüI½Ë}öµ 3Ì~•Wº’â ³är˳4wRj³SNO6>·±V{ÊVȧÓÛl’¦\•‡+]ßT8>ÛߢhÍ¿êþÏm}RJˆÐBdggoذ¡µwCÇ,u-•ò¥, mú !ê¼Y™Á+ !\nùåÙQVåržÙP=e«Œ’]nÙf–dY|¼·Ig—U¹R‡Ä©ûQ’8)Þ °×+üêˆq‘À@'ø©µZ N×Ù_ø| <­+Τiv_‹2&BH’HK2&'mÉá’㬆´D£2ö º[U¯x£ºu5(`DeM²õæ¸òöIDATÃ%Û,†_^™$„Xÿá)å-£Q,¸9-EsñOj¢Q9¡«P^Û¬†}-)‰Æ›¯JV¶•eQYç©oö-šÑ»ªÎ3¸¿åÛ §š¾r®½<1è9ݲ.uüýË«’R¸î€Œ¨¢¬IV:«uÂëB¯Wœ¨óôO379|Ž:…MŸš¾W\·ûÃå–å3eÊ¢e%Ëßü¤^½«F¼Õ Æ|œÕð³Ü%}µ—+¯û¤šÔj_hÕ§GD*ÑF] eoð®ÞXë=s5¯Ñ(¬÷;é^]\ë<÷İÍb¸ ·ùóoZÄ™3¾©CâÔ,orø”¡°z®×b’¦ý´—bD–UI_í²æÝ˜öâÛuÊë7§¯õH­\% –ÀˆNMßÇ{›´AëõÊÿÚÑøï/}OCøåUIÃ/´nÚÑàtÉf³Tßìkrøl%Ëí^u(ìtˇŽ;_|ÛîöÈ6‹4¸F¼Uˆs/|úâÛfõõö¯›¾:äÐÞ“²Ûz@„‹é«i¹˜8Z.oÁb’º5C–Å“ëj\žÓ›X,Ò”+“‡ô·TÕy”§,”v”|VïtÉÚÓÆÊm&…Ú;MšM’[Ù$„¦ je=c:@»¼ùªœø„8Ã{_6j+\>ÌVzÈéöʳ´pZzJ¢q÷Á5}….—ü3«·”Á«Í")—!©¿‰³¤.lNM4^›—¸éó!„[Ýæw–»_ðC# iIåNLI4íoùË[u^ŸBØ,†Ç%ß|•¤½)UjR«“Ãê…IÊ>•B³Yš4.I{fWnå$¯Õb˜reRî w¿ E# ù­…BÔ7û¼gNýþòÊÓWioJeo8ûè…KY÷qª#ݸ3&)ûì—núþWɧõÅÛëßý¢A}(á–]§ÙÚ9j!Ä”+“xø €@0¢“ºZ¡_<àœ+‚/Úßúõa§ò®ö2_uŸ·rºW¹×´rÝ‘Ssû-•Íâ8PÀˆ ʘxÿQ§ßAÚˇÜœ^WïÜßâtËoïhð»ÌWÕäðÕ7ûÌ&áöõa«Y2™„ÇsÎAMFéÞ©§oýÑæ‰Ä±Âå–7n;¥}v‚8÷ò¡j»GY¥o­=¶ÈÞà]ö÷³«óó6}Ö „pºåÇ'½÷eƒÛ#L&Éã‘…¯|ø¸«šùàqç‹oÛ=.FpÿŒ#:59|_q49|ê mÖ–U¹”reæYœ»JY¹U–Ó-ËòÙý(o•8û·G¶˜$«YB˜Í’É ýç¯3n—äÕ¬¦v»å²*×ÿWR§Dràc†Ä,FÀˆBêIJÙ$$¡ÜcÞMiÊ}mCœEúÖV»=²Õ,Ý;õô̳zO+uŒk1K’ÚÛhhK[͆½ÍÊ_·[~ó“úw¿”rÚ´ ¾·«ñ’l«zVØd\Œ@ÁQHìº=²ºZê‡j·ò@_Ÿ,¯y×®\­ëtËG*]—<{vŒërŸÝ\4—v¨G™ò“¤Š“níÕÃN—œ–|Îô²Ó-}äÌ&’øIi<’€‚0¢Pv_‹²HJ%I¢ÅåSè«­,l« ”…V‹AȲÓü„_hÝ[æÐnk³Æ =$îÃҦ߷¸\²ú8B!ÄÍ?IÆ#œA#ÉB’ι¤, ƒQRâÐl–„|ú~UV‹!'Û¦Ý45Ñø§Ù§×KȲʲPVciA(„˜s]JJ¢1'Ûöö™;Hß8.ḭ¸x«¡Éá~¡uBnBU'½—qõÆZeAuî¹ãbúfÈÜ :Zí>زvóÊkõz!Y–Õ¹e«Eº~LR‚Í >ÎÈOàUCöFïÿ­Z}¶ÒOGÆ+DRjjO!«×5)§ý*èY—üE@Rn»!„ˆ³Në}çõ©ùy Ú'#9]²Ñ ”«vCeÍó±“î¥oT¿ò®}éÕöÆÓ‘›šh¼ë†4åµ$I½ÊÒè›aP?Ë¡ã.åKíZë¿nRžª¤=Ç Š˜2Žb~ãÎm{›6l«×V˜þÓ䟌LšÁ®Ë-ŸY;}öü±ß#ŒjNy¶ìnüê`‹Ûsú! Bʪi«Yzà–ŒSÞçŠkÕ+.üz:ž†tŒß­(s²mo}V¯ÆªÙ$)§~µ3ÆóϬÊm­l02$%}…fi´2¶vºå}eŽ›Aû«ªÔIå)„0-†(äw÷ !D³Ã§Æ¢Ù$ý~zzJÀ°þýeƒRÁj6„$„}þÿ÷–p©)n2J™©çü +if¿%IžB uŒ€mì Þeëkœ.Ùj‘˜™‘šh”P¯¼º¸vÞMiV‹ätÉV‹Áh”,&I}hRe­‡µWZßD›}eåz_§KÞWæ°7xWmÔ¦¯p{„r?H{ƒ÷ùâZ·G˜MÒ×§ªë¶.`“Î\œ–dBÔœò¼õyCÍ)òP‡+sâ•Kœ.ÙÞàýÓ¬>¿úY/!äõžzüõ꛼—´õN6±ö @Œ€mš]ggž[œ>í¤±„OO 79|ïmRo˜Õâð©`ø¶âìÀ+ë<»ÞÙÑ ËâýÝ÷MKïoÜõ}‹ò®ÕbÈL5®tI’Pïò±jÃɇní“ÊC„D#ÚhñVƒ:il1KónJmj‘÷·8]²ßm­öµ¨ë¶ÔMÌ&©x{½öf“»¿oÉîkQýëõúž+®uºd«YR×N+#ìÔ!q­]L0¢zw*›Õ“mKI4>[ðÛŠ5}'ä&\{y¢6¶S ¦¤¯ÚXëöœ³K’¤Ë‡Æ%%Õ¬õx…Ç{z ôMã“þýeƒÛsváÕ9×—6 êoymó<”€‚F´IM4þéÜÄõ»$IhƸqVÃÏrÏÔVÿèѦ¯Õb¸|ˆíç—%Ø,†ÒÃIœ¾Ï¥öfÑyC⮸8^{\í£“>,mú°´Iy͵IŒ¨˜¸~Rƒ ‹ý*H’PÎß4>iü%ññVƒ½Á«¸BL¹2éÒ6í~´Çµ7xv,% „ €³B‡´½Ñ«®ÃJM4*áªN)+⬆‹XCìGg«Y.„x(!! ¥£VG«j¡Íjøåø¤ÜAm\e¤Ž³•k‚S {9¯—žÌïîá}Š6bMø’"¦ˆ„Æãˆ*0: €Ð €`t@ Àè€@0: €Ð €`t@ Àè€@0: €Ð €`t@ Àè€@0: €ÐAäðÑ£Gg̘‘œœœœœ}úÁƒÛ<Š$EèÇDˆð%E„Ž€KJJ ´%ÅÅÅA+/[¶LM_!Ä!CBÌW Lz7 ¸}ûö5J[’››»ÿþölûÎ;ïŒ92<퀞§Éá;\éÔÏ’`3!jNy>ÿ¦åŠ‹ã2z™”w¿:ä8^ëîlLŠ7^r‘Uqà¨SqÉEVe“öìV¥ìèæï¹Õ£´óØ¡s°‹¥©©Él6«%n·;11Ñét†Þ°®®îª«®zñů¾úê6Â4€¨goð>µ¾Æá’méþ™§½Ï×*ù~ýó^²ORïöœýKh1KB.,„0ÅÂé½-&iûÞæŒÓeƒm 6ÃÑj×;_4ZÍÒwN§[6›¥û¦¦_~úÏuY•KÝ¿âÚË3z™ü²ÜÞà]¶¾Æé’­é™©‰ÆnéŒÎ_RDhu.€Oœ81sæÌÂÂÂk®¹¦=GÑN\k=òÈ#………i/D¨Ý[ÖnþQy=åªäoŽ:¾ûÁÕþÍá“…F“¸qlrɧõ~uLF1õ§½rÚ„{ÿÇåAþP«AÛäð8êüîçÎïZ”·¦ý4ù§#:þɺXaaá£>ô­Ø àÌÌÌÒÒÒÌÌLµ¤ªªjôèÑ•••­mrìØ±›nºéé§ŸÎÏÏoçQˆzöFï²u5Nw×ü­3„Ïü-«YB„8Я'ôrºå·?¯÷xÏ)Ÿ|EÒ5£»¤yás‹°rrröìÙ£-)--1bDkõ?>iÒ¤åË—·?} ¤&§\•ÜU{k-}…N·"}-&ÆO½ù‰ú !Þý²ÁÞP"4€'Ož\TT¤-)**š2eJÐÊÕÕÕ7Üpßÿüç‰'vKë '>Àª OÛ¥Ý•ÊÆÖcÄhB“I6Àâòú<­„·Û+ʪ:0+5"4€çÍ›÷É'Ÿ,]ºÔn·Ûíö'žxâ³Ï>›;w®ZA{úö†nX²dÉ7Þ¨GK Ò…C `Û¿·Ù¯älèÊÂÛú˜Ø I&£ðxäï*\»U™MÒÀ¾–Vߎ^ÀIII[·nýâ‹/²²²²²²¾üòË-[¶$$?K¿{÷îÛn»M:×?þØÍm€ˆ5 Ùl¡±ïÜ\ º2õøI·_Éà Ú•—n8áhÒI)¼ :|bz‹°Ä‚CÇ/lªk3 3SM'ìžöìpâè„í{›Û^Ø%3ž–$ô/®Ù$ºµOÄ^‰s‹°]¢¬Êõ?%m§¯¢é+„ØöuóMã“´%§'¥ýÐçÆ–, Édˆíöˆ][ÚyèhB@4û¨´Éoüf2IA§£ÛÏå‘7l;{5°AFƒ$DóÇ~doðÿþ"BÀÍä€1çÃlÚÉf³Ál`ÚÆn5Iê;sç¬NóÄäBh¢Ù„\ÿå«u^íPÕíöy½²B:ÿ“°ÎñÓ¬C .„&€ šegZFdYµ%ŽkÊ^a4I×I4vâ1=Jô¶> 6„Ìf·Çƒ b `ˆföï·?´ñ•×#—ŸpË­_ÚÛª¶ò3tÀú|LA¢KÙ —·#Ë›¾«p†¸ßd‡˜ŒR诊)h@´ÉîkéÀ}(;(È´4d!·sfyÊ•±x/¢Yj¢qñ¯z`m³¦¡•'´†z¬ÜΑ·Å$]ÔÇÿn—±€€hfoð®üÿO~[ÑŽÓÀRÃU³)xBw<¸ÏáòÈÏ×r0 ª”p9\íš=œýùe ¿ü©½ç£F§Kf ª˜:r“çt?.mÊèe:ÏÁ®Ñ ›m¶Åä"¬N\íè1oï5H’$Œ’äÓ\QdÎ^>äõ‰OöùßÕ²£¼>QQíÿl¥Ë‡Ù¦þ¤W¼5æ„1÷ ¦Œמjô6ß0.É}ýÖ0÷Cgf‰C¯”BôJ0Åæsé`ˆjrÛ‹¤$I;éÞ²³QÒ#¶în\úF5‹°Qe÷¡–6Ç—J—GîÌ=°Za8sYo{nëá` Ê´9mèø£ÚÃ×Ö€V:w`ÞÚ5NQŒ€hÖ+ÞâNXF£4wRŠÕr¶‚‹V‹á<ŸÜƒ$òó§_Ü+þœÚ{Ä–ãE0VA@4+;árºƒÏA›MÒ=7¥ž°ŸótBYF£˜ß«Å);ݾ߶”¬[J2ˆ6g°•k¢¶ìj”$ÿ«‡{'ÇÜ­( `ˆf©IA‚Í`¿¼29=Ùø—·ê<sÅ^¯xù»Âf‘F Žkg«ék2Jf˜Ž×z\Áï9³ÊÚ/}Í&iÌðøö%šÀÍì ANÆ^?6Éí‘×üËz}–Ã%»<[—e4 ƒ$ʪڕÙ*ÉÐæó £ç€ še÷µhOñ*þýEÃÛŸ7´çêÛ=‡:rjVCú[]ž û })”‹UЀh#‹ÀÑ¥·ÝÃZíED’$. ýØ"Y´öÔ‡À°ï›~öÆ–’$Ò‚M•G7¢YˆEXBSeYüоóÁ­IÒ¬|ÎH6© ­eYÔ›*n0D³ì¾[ÀtkŒÉÿ´–Ú~ðCCóÙõ×GnÏé×f“ÄÃQ%5ѸdVŸÃ•®~é¦Û딇z6CàŠèŒ†sëËg9_’e=XárûÚ=ò2Mý@”K°.hëlºx€õléyßxÊã&Sð](w¶'}Õ1´ËÃ",@”jrøªìšk— 9}bôP[N¶µíšÁ¨+³LLA¢’½ÁûÔú‡+TêöM3VÕul%”Ç'vß·¼t 5%‘UЀ¨SvÂ:}Í&iÒ¸dm‰ÅÒ±€˜›ðfeÜxEÒé¯[™â¶˜¤‰£µ%’$ýldB‡Ž$96Ÿƒ,„B’búãˆöFïS¯q¸d«Å0 ÔÕ×¼íëfç™H¶˜¤…ÓÓû¥™kNy>?Ð2jˆõÇßàþ–&‡ïó-ƒú›‹ÞýÑí•-&)ÿò„”Sv_óÞ2ç;;>>))éÚk¯ ËTaÑ¡®»÷Þ{o½õÖ?þ¸¡¡¡¡¡á£>š9sæ}÷Ý×--…"†ÿË6›Í.—K[âr¹byÄT§{©¶¶vøðá}ôQØšé:Úu¿ýío{ì1õK~7µ%!ºÎjµ¦§§¿üòËÕÕÕÕÕÕýë_ÓÓÓ?þøãniiÄéP×ù|¾©S§jã`êÔ©Ú³HðÓå¿•±;Føœ8qbÚ´iÿó?ÿsõÕWëÝ–ž¡¸¸xß¾}K–,Ñ»!=Ïç{ê©§îºë®ŒŒŒŒŒŒ»ï¾ûÉ'Ÿ|øá‡õnW°lÙ²]»vmذ¡®®®®®nÆ »víZ¾|¹ÞíŠ%]›ç=HŸ>}ªªª´%•••}ûöÕ«=‘©½ôÃ?Œ5jóæÍanZ¤ëP× <¸¬¬L[Â禮$D×õíÛ·¦¦F[R]]ÆöE°u]vvöû￯-yÿý÷¾æõt]þ[»#àœœœ={öhKJKKGŒ¡W{"SG{éøñã“&MZ¾|y~~~ø[Ñ:Ôu‡ÊÎΖ4„ê‹XÓ¡®ËÉÉé–Fõ êºcÇŽ3F[2f̘cÇŽ…±}8WìðäÉ“‹ŠŠ´%EEES¦LÑ«=‘©C½T]]}à 7üùÏž8qb·´.¢u¨ëBü¯Ým0êºiÓ¦½ýöÛÚ’·ÞzkìØ±al_ëP×]tÑE;wîÔ–ìØ±cÀ€alüt퀺©¯¯8pàO<¡œÿxüñÇÜØØ¨w»"K›½¤ý=zôßþö7=š‰:ÔuøÝlg×µ´´\uÕU¯¾újMMMMMÍš5kÒÓÓ·nݪGÃõס®[µjUVVÖ›o¾i·Û•sÀ^xásÏ=§GÃ{†.ÿ­ŒÝ_rY–92uêÔ¤¤¤¤¤¤©S§ú„ƒ"t/i"ƒþ‡g·Û»½É‘¢ý](–Xî`×?~|öìÙ©©©V«õÊ+¯Œñõ꺿ÿýïãÇOIIIII¹âŠ+Ö­[×½íÂ7v•ZÛ;ŸØ= €Ž`t@ Àè€@0: €Ð €`t@ Àè€@0: €Ð €`t@ ˆu·ÜrËC=¤-yðÁõ«_éÕ FH²,ëÝzª­­½ì²ËJJJ.»ì2!ÄîÝ»o¸á†ÒÒÒÌÌL½›D3FÀ@¬KOOþùççÍ›çõz½^ï¼yóž~úiÒ7FÀ„â®»î9r¤,Ë|ðÁ[o½¥ws€èGBˆ'NäççŸ:ujëÖ­C‡Õ»9@ô#€!ÄÂ… ¯¹æš“'O~ýõ×Ï>û¬Þ͢瀈͛7:thÚ´isçÎýꫯ6oÞ¬w‹€èLjuv»}ìØ±ï¾ûîàÁƒ…û÷ïŸ277wРAååå·±s– 0ˆæÀ8šãh ¢ 0ˆæÀ8šƒhŒ£ 0ˆæÐuq´¸üŽYYYsæÌyõÕW§OŸÞê`~v‘s.î•——7{öì¿üå/mÉ^X³fÍõ×_ïÚ9‘™¸¸köìÙÿõ_ÿuË-·4{vÆŒ=öØäÉ“###322>þøãW^yeÓ¦M®™‰‹—& !š,..°}ûö×_}×®]%%%111Ó§OÿÃþ0dȶܖ‹ {:ÑGs`M€A4ÑG`Íq4Ѻ.Ž=ãóƒŸÇ&À šãhŒ£ 0ˆ&À šãh ¢90Ž&À šC×ÅÑÅ=°ˆˆˆˆˆˆˆˆˆ\‹ ,r“eË–yz 䌣90Ž&À šƒhŒ£ 0ˆæÀ8šÀC=äé)P·Ö3*ôXIHDDDDDDDÔÍq !õx©©©žž¹ãhŒ£ 0ˆ&À šãh ¢90ŽD¦Ç¹IBB‚§§@.À8šãh ¢ 0ˆæÀ8šƒhŒ#u˜¨çççsã7>ÿüóžž5Ö3–æq !¹œ=á iZIIÉÉ“'¿øâ‹>øà7ÞøéOÚöËÉÐužñæ'¹\³ ‡Ã‡Ïœ9sÇŽÇïÀåÞŒ=°ˆˆˆˆˆˆˆˆÜa̘1K–,yùå—íG233-Z’˜˜¸téÒêêjB8,Bt>˜:‰ ,r“””OO\€q4ÆÑD`Íq4ÑGr¹Ûo¿}çÎö§×_ýøñã³³³¿ùæ›K—.=ÿüóŒR#YÏù`ꤞQêÆ’<""j*aÖ[Τo~Ô=3!"""¢ª¥„CuuuDDDeeeÓSÅÅÅ×^{mZZš“˛ܒ´¬ÚsY5íœxJêã7¨oÇ®íºŽ¥+nJDDDDDDDÔséºn_X]]ýâ‹/®^½:==½ªª €ªª-]Ø®Á†sY5›–»nîv-:œÀê:L`QÏÖl™U«ÅYDDDDDN\¼x±OŸ>ÆãgžyæÔ©SüqrrrPPPuuu@@@K¶k°!©®uåä;)©Ÿ§§Ð &°ÈMRRR&OžìéYPg1ŽæÀ8šƒh ¢90Ž&À šãH.·víÚ©S§ÿùÏîÛ·¯oß¾ÆÓóçÏ;¹°]ƒ ƒúøvÊ§î† ,rþsbŒ£90Ž&À šƒhŒ£ 0ˆæÀ8’k9räÕW_µ7q¯ªªò÷÷·Ÿ}ï½÷ìýýýkkk}}ÒONSgpB""2ƒÒ íHZõ…œZOO„ˆˆˆˆz$MÓŠ‹‹wïÞýôÓOÏœ9óÍ7ß:t¨qjΜ9O>ùdNNN^^ÞŠ+.^¼h¿jРA6lÐ4Í~ÄÉ`ê &°ˆˆÈ Òóë>ÜR¼ýPwj~IDDDD=B8dÈßÿþ÷ÁÁÁ‡Z°`}ÀÊ•+ >|È!'Nœp,ªZ±bÅÒ¥Kýüüìß ¦ÎàBr“’’’°°0OÏ‚:‹q4SÆÑØ«·kvìíŽLDoà šãh ¢90ŽÔa² ?AFDD¬ZµªÙ«fÏž}æÌ™6¦Î`¹Izzº§§@.À8šƒ)ãèm ,SÑÛ0ˆæÀ8šƒhŒ#‘鉑¢gÌ“ˆˆÜ)aÖ[Τo~Ô=3!"""""te‡XDDDDDDDDÔ­õŒÊ&V`‘s‡ÎU­Úzep¼ßÞáé¹y)V`Q—’’âé) 0Žæ`Ê8Úz`Á[þÚaÊ zÑG`Íq$2½žQÙÄ ,""rîû3U«·_ÔÇ÷×ó#=="""""/Õu KWÜ”ˆˆÈÍt/Û…ˆˆˆ¨{B4=hd4ì© ©´ë¥YLÓ­0EDDf`ülÁ0ˆˆˆˆ<Ϋ2D&x ={`‘›¤¦¦zz 䌣9˜2ŽÆO ÞóÃ)ƒèmDs`M€A4ƱG`¢‡:ƒ ,r“„„OO\€q4SÆÑøqH÷šŸŠLDoà šãh ¢90Ž=B£Õ…ÆSQÏ~|çÎ&Lð÷÷0`À;ï¼ã8¾ªªjñâÅ111màØ±csæÌ ŠŠŠzì±Ç*++LÏùàÌÌÌE‹…„„$&&.]º´ººÚÉ[hv0uXä&aaažž¹ãh¦Œ£×d®lLDoà šãh ¢90Ž=Q} ãàéÓ§ï¼óÎ%K–äåå­Y³fùòå;vì°_²páÂI“&={¶-ãÓÒÒnºé¦Ù³g§¥¥;v,99ù‘Gii2­¾þúëÇŸýÍ7ß\ºtéùçŸoé-´4˜:©g¬ÕäšR""rnÏñÊϾ-éíóä‚(OÏ…ˆˆˆÈ{5mânÿu¾i÷¦¿ì?ðÀ£GþÍo~c<]·nÝ[o½µ~ýzcðË/¿¼dÉ’6Ž¿ÿþû“““Ÿ}öYûàeË–½ð ͦÚ5¸¸¸øÚk¯MKKkö-8Ü’3u—ÎÔ]r2ÀÍ’}ú'ûôïØµ]—Àé‰!&°ˆˆÈ¹ÝÇ*?O)éå³äN&°ˆˆˆˆ<ÆÉïïmI`%%%mܸqðàÁÆÓâââ‘#Gfddƒ/\¸0`À€6ŽÝ³gÏÀíƒÓÒÒ’’’šžóÁÕÕÕ/¾øâêÕ«ÓÓÓ«ªª¨ªjµZ›} N·äëÊ]_W~ëd€›Í ¼a^à”Ž]Ûu îBHn’’’2yòdOÏ‚:‹q4SÆQB¢¾•»70e½ ƒhŒ£ 0ˆæÀ8šÆåË—“““(JCï£øøø¶/((èÓ§ã©FO9üÌ3Ïœ:uêã?NNN ª®®héVílHöé?/Ðù·êpùU—ê•M¬À"""ç¾M­X»»4.Òç·?e‘Çt²+::úèÑ£qqqm¼³“ñ.¬ÀŠß·o_ß¾}S'Nœ>|xKoÁÉ`oÐu 6q'""30þ•ôžŸ ˆˆˆˆLÀßß¿¶¶ÖñÈ´iÓÖ­[×ö;8?sæÌÕ«W;YµjUK÷q>¸ªªÊßßßþô½÷Þ³?núœ ¦Î`‹ˆˆÌ@·%°<=""""j³AƒmذAÓ4û£uú|PXXXQQ±mÛ¶¹sç:¹ƒ“ñË–-{ýõ×W®\™›››››ûÚk¯9sÆÉ}œ ž3gΓO>™“““——·bÅŠ‹/:y NSg0En’’’âé) 0Žæ`Ê8z[êÊ”Aô6 ¢90Ž&À šãØC­X±béÒ¥~~~ö½ ‡¾aÆO?ý4111::zùòåO=õ”“;8Ÿ””´yóæ¯¿þzàÀÆ ;vìØßÿþ÷–îã|ðÊ•+×2dȉ'‹ªš¾'ƒ©3zFo)öÀ"""ç¶*_¿¯¬w¸åwwG{z.DDDDD^Š=°ˆˆˆœ1þ•ÔùÇ"""""3b‹ˆˆÌ@gw"""""ób‹Ü¤¤¤ÄÓS `ÍÁ”q4WÞ“¿2e½ ƒhŒ£ 0ˆæÀ8™Xä&éééžž¹ãh¦Œ£Q{å5ù+sÑÛ0ˆæÀ8šƒhŒ#‘éõŒæèlâNDDÎm:P¶ùûòð`õÙŸ÷öô\ˆˆˆˆˆ¼›¸9ãmK‰ˆˆˆˆ¼ XDDd¶&îžžµJÑSncŸCÇ&ÓÞ‚)1En’’’âé) 0Žæ`Ê8J/ۅДAô6 ¢90Ž&À šãHÝ3Y®Õ3zK±9÷õÞ²o—(Ïÿ"ÆÓs!""""gœüŽß~ýwÕºÃ{q?öÀ"""rƶ ¡×ý„@DDDdNBˆÊÊÊÿøÿˆŠŠ š3gÎñãÇÛxÀÎ;'L˜àïï?`À€wÞyÇñªªªÅ‹ÇÄÄ´Z!帖°²²òÑGˆˆˆŠŠúÝï~'¥¬ªªzì±Ç"##ÃÃÃ/^lµZ¯²ÿßàŠ‰·c‹ˆˆÌ ~ ¡§çADDDD.òÈ# 6ìØ±ciii³gÏž1cÆùóçÛröôéÓwÞyç’%KòòòÖ¬Y³|ùò;vØ/\¸pá¤I“Ξ=Û®B!㪴´´½{÷îڵ륗^úõ¯=a„³gÏø €^½z½ôÒK³fÍúóŸÿüÐCˆˆˆX±bÅ¢E‹üñ޽SýÂYyþ\Ç®í b`’’8ØÓ³h¬g,ÈôÎ…£&SRRæéYPg1Žæ`Ê8®Ý]úmj…¿¯XþËXOÏÅLDoà šãh ¢90Ž=K[z` !ÒÒÒh?•––và 7deeµz6))iãÆƒÛR0ÅÅÅ#GŽÌÈÈ0.¼pá€Ú2=Ç—/_îÛ·¯1 ´´4,,¬Ñ‘~ýú•””4{y«´mµíÛ2Ò=ÔésÔs:vm×%pzFbˆ ,""rî‹”Ò”c~>âÏ{E‹ˆˆˆ¨çR¥®®NUÕFÇ5MóõõÕ4 õͪüýýíg«ªªBCCëêêZ=ëççW[[Ûèí·­­­õññq2½fXº®;¶²jöHÓ«Ú˜Ê0SV×%p¸„ˆˆÌ€M܉ˆˆˆzŠèèèÌÌÌ„„„FÇ322¢££íO³²²k¬²²²Úx644ôèÑ£qqq;ºóìUKš6bwakv%q0ºß’½î†M܉ˆÈ lMÜ== """"jÕM7Ýôü£éñ>ú覛n²?]½zµãÙÕ«W·ñì´iÓÖ­[çÊwˆ¿¿£B0ê '°víÚu×]wEGG‡……Mœ8qíÚµ¤§§/X° 44444tÁ‚—/_ví¨ÛJIIñôÈGs0euÞTeÊ zÑG`ÍqìYþô§?ýío{î¹çΜ9S[[[[[{æÌ™eË–½ùæ›úÓŸìÃNž<¹råÊÜÜÜÜÜÜ•+WþíoûãÿØ–³Ë–-{á…>øàƒÂÂÂŠŠŠmÛ¶Í;×Ýo4hІ Œ¥‹Ôy.N`Ýxãùùùk×®ÍÎÎ^¹råsÏ=÷öÛoÛÏ–——OŸ>}ܸq—.]ºtéÒ¸qãf̘QYYéÚ9P÷4yòdOO\€q4SÆÑVå5,SÑÛ0ˆæÀ8šƒhŒcÏ2pàÀ}ûöÌ;×(p™;wnaaáþýûíÃÞzë­#GŽ :tàÀëׯ߲eKRRR[Î>|Æ Ÿ~úibbbttôòåËŸzê)w¿I`ÅŠK—.õóósábCoæâÞZO?ýô‹/¾hÍÑ£Gï¸ãŽsçl­È^yå•ï¿ÿ~ÕªUöñ?ÿùÏ'L˜ÐêN“lâNDDÎ}º£dÿ©JEà¯ÿÑ|³""""êAœç˜%趺.4.®Àúë_ÿê˜YLJJr\$øÕW_=ðÀŽãxàî°0•ˆˆz:6q'""""2±®mâ¾qãÆ#FØŸ?~|ôèÑŽFuâĉ.u\”nŒ£9˜2ŽÞÖÄÝ”Aô6 ¢90Ž&À šãHdz]XtWTT4iÒ¤¿ÿýï7ÜpƒqÄ××·¢¢ÂqÇʺººàààšššVfÉâ@"2)YVªÚ@5^„÷òôtz°ÕÛ¯|¦ ÀŠÿˆc“"""""è1Kírsso¿ýö7ß|Óž½ê$Ñœçž{Î1ÑžššZRRbêxÊñqIIIjjj³§xÞwðÌtU•¥™=û]tàRjŸ¯Ö6}©múRÛ¾±§¾‹îqû¿’ö=ñ]ð¼ïÀ;ð¼ïÀ;¸üééé rã“í¹çžk6QÓu¯Û%‰±ÌÌ̹sç¾ôÒK3fÌp<sôèј˜û‘œœœ±cÇfgg·2KV`™šžvÚúîßDX¸ÏÒ<=·ÒöîÒ¾úƒPS ÀçÉÿ‘žžTOµjë•C窼øh¬ª°‹ˆˆˆˆÈzRVVVÖœ9s^~ùåFÙ+Ç?räˆã‘£G6Ìås nÈñÔsuU‹ ÈÒTWuÉý»%Y§ý{Ëí÷(c®ƒ¦i;6¹ç¥MùõhÿgÒKþÞaÊ zÑG`Íq$2='°òòòfÏžý—¿üeúôéMÏΛ7ïÃ?t<òá‡Ο?ßµs î‰e«æÐEq”E ¥ÌÏíŠûwOúñ#¨«SFW†R§Þ UÕо٤íÚª}»M¿pºÞE/mʯG]6~`n¦ ¢·aÍq4ÑÇž¥Kšuž}z›g7w=—‹+»Æ·téһᄏٳeee£G~ä‘G{ì1o¼ñÆ{ï½wäÈ‘   VfÉ%„D¦fýä==õË÷*ã'zz:nbýø]ýØaË÷+c¯`ý|µþý^ÇÊÈq–»ôÌäz ÷7§^¨ðÿ>ëká DDDDÝW7ÿß>½ŽÍ³“—÷t=f á¡C‡î¹çžF¼®\¹bœ Ù¾}ûú÷ïß¿ÿƒnÛ¶­Õ왞,*´=ÈËñìLÜIf] úô5žªÓf«Sn²ý÷ã)ðñÕSÐÏŸñè{û?’Þ÷Cu‰Ž%b¼0iå.N`Éæ„‡‡Û 0à‹/¾(-----ýâ‹/ú÷ïïÚ QO$‹½+¥Ÿ>Žê*Y\_mÛ×BôŠPožoûoÞêÔY´¯þMóèd{Œ¦»QOôÕW_Mœ81(((((hâĉëׯpäÈ‘!C†8+,,LHH¨««s<8dÈcÇŽعsç„ üýý ðÎ;ïØ!ªªª/^ÓêZ?ǵ„•••>úhDDDTTÔï~÷;)eUUÕc=¾xñb«Õêx•ýÿ]½7Ÿ÷p}w¢f9îêJ=—ëãhµ¢º •Þ‘À’ù¹ÖU×ö"¶”æ¿«“§‹ð™—#3]ßСû|=ÊR—õ[uhâî¬îDê0ÑG`Íq4½{÷>øàƒ?þøÅ‹/\¸°hÑ¢ûï¿ÿÀ£G Ù¹s§}äêÕ«‹‹‹¿úê+û‘;vDFFŽ1âôéÓwÞyç’%KòòòÖ¬Y³|ùò;v؇-\¸pÒ¤IgÏžm×ÏÆUiii{÷îݵk×K/½ôë_ÿz„ gÏž=xðàÁƒßxã ÇñÆÍí•=þ€]ÏXé G‰ÌOÓ´ _(ã'ÖýíE#‹ ¡i¾|¾~žžY²þk•~h?º®üh²eþÏZù·õG-÷þR>Æ3t'몿[܇€ÀÎßêí E'Ók¼ð`L?ÿ~üø'žxâ“O>Ù°aƒqä¾ûî›9sæƒ>øÀŒ=ú7¿ùq|ݺuo½õ–QÉ%„xùå——,YÒ–é9>øßÿýßÇܰgÏžY³fýù϶ٽ{÷¢E‹:Ôìå­ÒKÏʲsmé"$I ÜÁk»,c銛µ…,½¢íûÖh^$¢zCQen–ÌÍýxzj]EêG0vTúôs6:$ .­Qê†ôKçµ­ëÕ[Úù[q !‘ üðï½öšã‘ùóç¯X±À=÷Üó‡?ü¡¨¨("""55Õjµ>ðÀ¯¼òÊåË—ûõëWTT´mÛ¶·ß~Àž={ž}öYû¦L™²páBûÓÛo¿½»ãŽ;ìGŒQQQáxdäÈ‘çÏŸïÀm ²ìœ–¹±Ã—»œ?M`u&°ˆÈcä•"H©íý€è‰à™›¥íØl¹ÿQOO­«h»¶@×ELœÌ͆C÷f‰Ð00q«²•ÚþÝʵ“D\|'o&›< """¢'77·wïÞŽGbbbrrr„‡‡ßrË-}ôÑO<ñþûïßÿýî½÷Þwß}wÙ²e}ôÑOúÓ€€—/_NNNv¼‰âи#>¾#?y:^ÚôHiiink!Ijüœ_îr"$ÉÓShXä&©©©#GŽôô,¨³\Ç+Å #"ÕcõÔCú©cÚ®­JÒ5"&ªê²×êô#ß°Üû°¶q­~ö¤èçd°  K®¸|ÝäëQæç€®[¿þ—Ï#£s½-¥—e°ºI©3Ds`M€A4ÆÑ4bbbòòòúõkX©——k<~øá‡/^¼páÂ?þøàÁƒî½÷ÞÉ“'?ûì³o¿ýöêÕ«a¡¡¡G‹kþ‡mŸL¬i#v¶fWBwʧî†]BÈM<=rׯQ:$°D¯Hj™u+mÓ—u{Q?}Ü…¯åBÚÖõÖÕïÊ í_£^YÚЍÞê¼">§E €2×W`u“¯G[ Óô“©¼›îeMÜ»I©3Ds`M€A4ÆÑ4ÆçØ—À—_~9nÜ8ãñÔ©S«ªªž}öÙáÇ÷éÓ@||ü Aƒž{î¹àà`{sÚ´iëÖ­sóÌ›ò÷÷¯­­õô,̃Xä&aƯâÔõGýÀmב8Ørǽm¿›,) ¢cd~®ˆˆ L¸^­,בٙ27ÃF¹dÚ®¥>(‹ Å€jbû keqÞ €èiYpŸóñ¢Ëz`u“¯G[+ U•òÒùN†»¡V§'Ö#t“ ºM¬·œHßÜó–{[ÍŠq4ÑGÓxúé§çÍ›>sæL[¶lùãÿ¸q£­?”⡇úãÿøþûïÛ/¹ÿþûzè¡wÞyÇ~dÙ²e3gÎ ˜7ož¿¿ÿÞ½{_~ùe£‰»; 4hÆ ·Þz«jº•%Á ,"r=ý¼,*”igÚwÙ•bêÍóE|?Ñ+„P§ÍV¯Ÿ@æe»~¢WU)¯@Ey{/µ%ìÂ#Œ§"ª·Óá¶X²ôŠ,ÈÓvmÕvm•eí}ÑnBß—b]û‰¼tUcKY@2€ÌÏéäKØXº—d°ˆˆˆˆz2Ñ„q|Ò¤Iï¾û¾Ú¿ÿþýû¿úê«ï½÷Þ„ ì>øàƒÁÁÁŽ Ô,X{×]wÙ >|Æ Ÿ~úibbbttôòåËŸzê)·½5»+V,]ºÔÏÏÏ…‹ ½+°ˆ¨ešÖÆ.T2'€¼R$+ÊDPHood‚Dd”åž_ÂÇ×~Üè e´9ïnô¬ #S";À2ÞoX¯¶^à_?ÔÖh)Ûõ{è‡X^Ôöp÷¡íO‘9Y"0Hí?€,/Á!F–2l¤~ø€ÌsYË;Vz©fˬZ-Î"""¢îÆyχÛn»í¶Ûnkélß¾}µKÎÊÊj4l̘16lhïK7Óô“û4<{öì3gÚù7~j+°ÈMRRR<=j']×¾ÝÖèØUq¬©±´gäåKm£–‹°•_Õ½c¡(² šÖîiw1™uÙö¨ý ,íØÃÂÛ~…Q„e´~Á!27ÛúöëÚ®­öîQãî¯G]7Š­ìŸ'Úë§OÈâB(Š2xTU^)xÑ• IDATF]§4ôp÷Ž¿©šƒhŒ£ 0ˆæÀ8™Xä&“'Oöô¨}dæe}ï®F)$Ç8Z7­3’8²0Öºú«Ò[¹mn¶mLeêj?¿Æƒ||D¯Hhš,ÌëìÛpy¥Xûv;X¯Àª_BØF µ5ð°,\*bâd^¶¶éKýÐþ&woHÛ´Z¼ÖE_ú™ÚžM“k²¨V+êX²¼L?sºæèºè __ )e~§Âíäïc¦Äoª&À šãh ¢90ŽD¦Ç5O¿xN–•:ÙN¦_°nü€ÌÉ2£• ,ýìI[&È¡£yS"&€öí6m×VÛý=¨²ÂúþòÂ2+Ãv°å–¶ù+ëGoÕ½ô‚~ä ãq[ÅY o¹y¡¶r-eð5"4Ìòð"eÜèç—"ËÌt[}“ÕjýrM;^Âu´­´õŸõbŽ ôŠ a­Ó„®£º €ˆŽ ¢cÑé6X\Bè=Žž¯Þ~¨¼ Äê鉑û0Eä>²¼LÛô¥¶k«§'Ò&òb£õRs§¥,È×ÔÓÎõ>Êð1ôŒtHé$… ÏžÒ–Å…:š7"búÐدmúR?v¨³o¦3jkë>üÿd~®,,@Mµ,̇¢ÀIVe…¶s‹~ê˜,*Ðuµ/)€T`Jòp"(ÄrëPU™y5ÕŽ#eAž¾ï[úÙ“òbš‘t·+Ũÿ̹jnöþVº.óóôö€¨ïd/zÇÀ¾)! s³Œ¦õÚ®­­Öô5¼Š—íBèÍöŸª\¿¯,·˜ ,""""/¹ ¥@~®¶k«öÍ&OÏ£ t]7Xi§eQ¡ý°=޲¤uµR[÷©Ì¸@¹f¸ Ee…ÌÏÕ¾ÛÙ|Ö©®V¿˜]×wã¼£¹2t„:å&eÄØ+¼<ĺñ yù"Y\(³3!¥ˆ‰ƒ¢ º ºÞt¼,Ì?òÂY‡YeyTU„„¶ãå ,!Ä¡¶#¾~">º®_¼zG¿Â|íÐÔÔ詇觎9¹k—|=ÖÕÊÊrzÆEcÁ`ÃÜŒ%Š@Û¶Aæd!(X9 X1dž-¥ýAÛô¥ñŸó7rÕ«xY–7S5Bl‚@{sÍ„q4ÑG"Óc‹Ü„‹ÒȲR¨­iT;㚦?âä¼ÌÉ2VxAJý`}Ve…=Ž Å2…ùúÙSDL1øú©cú¾ëgÿhXmWO¿pÎè–¥}¿Wfg@KKãÔ›ç«3nAû·#Ô°~ò¾~´ñB¶Ž‘gO€ªBÓô³'ˆÞq"0R6[„% ò(ÉC(‹ eƒ0R~RŠÐp´g]+b┤kwT ¯^E( òQS­Ücd|¤Ó¼OW|=Ê’+¶ŒB]]£²)cm ’8€±(U5^r“è?°Ù%„2;ö¬ViI['`ÐóómáÍßT¥Ãÿ{4o¢™0Ž&À šãHdzOO€Èäô3'QR,’®½"d¹m·WYV*üü=9«£ßk›¿R’‡«špñÑ;Næeë÷ªSgißï•é–ŸÞo 06•}PU%¯A("ª·rÍý‡ýÚ·ÛPYÀú¿+?º€2l”±RÌ– RÔÖꇢµ†P"ª7,Y\ˆÚø6éõÞÒ»;¸W¿pÖ:eÔø6^ÒYV*‹ áç¯Ä'èçÏè§QÑ2;åe¨,G“r*Y”@DÅ(V«~2U^8+ÆN@C¬v¬  LVÿ}£ƒb`2vlÖ/œU_·0€¶åkÔÕÐ/œEM5Üøiæ¸hQ¿˜¦öXÿD—ùyB¹q¦ˆïgSÆO„–÷‰€@"º7„°í`ñ1’›Êu“´ _ ¬­ ,K½@¬·ìÿù¹'BDDDÝÅÑ£Gÿò—¿ìر£   **êÆo|æ™gFÝá !ŒM쨛`‹¨ki;6ÉKç-·ß#®ý1ÊêX¥%FBÇ3¤ÔR¶ËÒmß·êäé͹˜@Dº^¹k[Ð-·@~.Šbëëäç§$&égOAU}}R?ú½¬¬Ð~§Ÿ>® ¥;,ósáç¯Þ8Kôé??á(zÇ:Ÿ­ˆé#³3enVXúù³Ð4²¨R¶k½^S2ý‘ˆÀ@À¶8MDÅ (h~#B#‘$"£ELÍ¡ V}Óz$°àã#úö—Ó´CûÕß@V”Ù–|BýÑ ÚÞ]ú©cö–~î”õƒÿƒ¾Ï¿ U튯Gã *ÃFê?ìw\=ªmÝÀØ<Ñ eÀ -;S¿&¬V"6FûÒÒ¶NÀËz`yÛ7UÇŸ½Þø²0-«öç7…M ðà”:ÏÛ‚hVŒ£ 0ˆæÀ8z¡sçÎ-Z´hûöí#FŒ0ŽôíÛ÷ñÇŸ>}ú´iÓÆ—””Ô™û÷èÄ–)±¹Izz[·3Y^{I©½«­¿“w=e;X|PQ®íÚb;Z[«¿š†ŠòºwV¢²B„…‹ˆ(‘¨  @Äö ü°×–*È…±òëjbÈʰÑ".^½y¾eþÏà ósëÞSÛ³€2(ªª\3BI,â⡪pJÄÄÁhƒU[c+/rJž;e{d­3R*¡ÛXj…„‘ÑFKVT43#Õ[ÄÅÃ×O¢ª]BØõúi´-_ÛÞ£Qö Uñý”O ÓN7¼£#˜”Æ:Ö®øz4Þ 2 ~þ²¬ÔÈîégOêÎ"0¨¥Z?;1`y)MfgPââEpEV–Ÿr­OÀËX^ûM°mŸ`‚@{sÍ„q4ÑG/ôÊ+¯,\¸Ðž½²1bÄ¢E‹^yåã©hîOÚÆAûÿ ÍŽ1ìܹs„ þþþ xçwÇTUU-^¼8&&Æ>¾¬¬léÒ¥ƒ ›9sæ×_ÝÙwëTúæG›þ×¥¯èL`‘›Œ9ÒÓSðM³õk/-`ïåþ ,YT¨íÚª> óõs§àçg¹ûAÚŽÍÖU·~¹¦öžµ~¾Z?•jý÷:yé¼ ·üüWƵêÍóEŸ~>.1}ÔªJý‡}¨©‘e¥°ø4MÇ(×  üèzÛsUU€ÚeÈ0ËÝ©sïh×ÌELÚûj—ÿ^·'§Z¦Ÿ9 ÀXX' ÚõZišÌº !”~ ,__ÑB–­* AÂHðÙÞ-¢ZØu±½”a£”ácPScýûÿjÛÿ-s2ˆ„ÊÐQʈq"2>¾²¬55PW§Ÿ8j»²´ûz”Ù™²¢¬™ãÆÂ^FÎQÏÍ ø€zÃŒV»q‰þƒèéŒð"®/E‡@JYÖ¦„¯ô²X^úM€½‰{Ï´7ÑLG`ÍqôB[·n½óÎ;›=µ`Á‚­[·¶z£ÆJÖkiØéÓ§ï¼óÎ%K–äåå­Y³fùòå;vì°Ÿ]¸pá¤I“Ξ=k¿Ã/~ñ «ÕºuëÖ’’’ .<ñÄ+W®l×[£f1EÔ…dE¹ñ;VýB{w—%°ôý»µmmw–Ò¨r²©ª´ÿ†§ŸJÕ6}©mùÚX<¨$V†Ž´üägðó×O¦êûRŒhú¾cwBËC E[¿måóè“ðóS§Ì`]ÿ¹~ô{H)"£›.н"•c• źÊaD\¼åî_*#Ƕ·IÄÆ@u¬ÖF{Û5óÑH;- óEH¨2lt® –L¿€º:ƒ€@Ñ+ŠûªI[V“%„…phíd 6XF~GôrMõÖ;Ex/Y\¤mÛ ¥l7^Wxƒ2r „QdaýÔ1[& ¥W:ùºúû´ß·ÕÀ82Þ`X/£XÏøL“Y—(×4þ³XS"$TDF£¦F?• @ÄÅ@H´1eÐóóäœígMOOƒˆˆˆ<+==}РAÍž4hÐåË—]õBË—/æ™gî¹çžÐÐÐ &¼òÊ+ýë_ígGŽiœ²Ù²eËsÏ=׿ŸˆˆˆyóæmÚ´ÉU“ñfL`u%{‚£´V«±” ™¬Î²Z­_ÿKÛ¾Qž8 @æk¾ÐO¦'µm¬¿k”€yYrÅØßÍȰ(&û<ùuÚÍêô9><UÕÓΠ¦Zôí/¢c®z!ʘë”kŒºZë—k4SÏrÛ]މ-%y˜ µüüWðõíÀ[a½”q?R'N 3ZK`íÞ@™8ŶéaçXÚ‘ƒl¹0U½"alŒ´Xeëà^ŸÀŠŽ±c£”²¤BU`!¡>¿}N9FÃ/@DE‹Ä$#E(¢¢aÔ UVh×0j ÚÞ½%ú‰£ú…³Ú¿×]}T—¥%ÆlXõYU)¯Á×·ãU„¨«ƒ¢ˆÞqDhÚœðuhâÞæ7C=“±ã$MDDDî±gÏžùóçÛŸN™2åÈ‘#ö§·ß~{£ñÆ ûío›™™é¦ùy &°ÈMRRR<=°¯´’å²´¤¡§x§“¶ÛæçíôÓÇ`d©¤´þó#™Ÿ )õãGôãGêÞX!s³m©)õÓÇQŸ… BÃÔ›æª3æˆÄ$eÈpã 2z|K¯¸/2^ôhÛ@°I,›€À«ž[}²3½Ÿ, îS¦Ì g\rò;«ÌÏÕÏœ€¯:áúúôM'Xš¦; @}­qÀ––2ÞuPÐ\«¨¹V~®,+…¦‰ `#è2B¨?šlï#ÖШ«þ±,Ì·®ù@–‹þÕÉÓÛç^‡¿eV†QJ¦íþFOý¡áxY 4M‡ÀbQŒ ¬Ü,=;RŠØx£x­UÊ€$¡Œ¾Örû=¶THÚœtÓz`yEbÃ;¿©¤-ÕãíÍA4ÆÑDs`½PBBBZZZ³§ÒÒÒúõë×Ò…zÓÅN]¾|999ÙÞ*+""";;Û~6>>¾ÑøO>ù$???))ièС=ôкuëLðsKwÀ]ÉM&Ožìé)x‚=Á¡ëöÒ'Yçª ,™mKêëçÏ¢®Vf^€šjëGo©ó¿öË‚<ëÇïÊ‚¼«.i®"F?Q?qŠ¢Œ×Ò+^?eŠ7Vßý Ú¶.Ì`,gë ÖK„„ʲRYTà˜¦i iÖµŸ@Jeìu õõG¥Ÿ>ŽªJoß'ÑrÏ/¡Yáë‡ú ¬¦K¹ ·M»>e,¯ƒ‹:¸_% PIf”Ý5M`é§ŽÉËh¹û!yî´}†þz´½Ph˜,-Ñ¿ßkÿT‘Æ>•FñWŒ‘ÀÊ1Ò¦JŸ¾m¼¹2ö:eÜÇ#¨ÄnkVýƒ6¾^ç¥ßT4$°<=Nóæ š ãh ¢90Ž^hÆŒŸ}öÙðáÛžúì³Ïnºé&ãqxxø•+WÂÃÃíg/\¸Ð® =zôh\\\³g}šü‰:11ñ‹/¾¨©©9uêÔ¾}û–/_þå—_:¶~§ŽaQrLp‹øDToøú¢¶ÆÖܽ“÷Ï©¯J­«ÓÓÎ/ÿY˜o]ó!uâ "8Ä(Ȫ¿F¡Ë‘’ùäÊ•+;Öèø±cÇ^ýõ'Ÿ|ÒxšœœüÝwß9x÷Ýwíýýýkkk¿Ð´iÓÖ­[ç|LS~~~£G~ôÑG7nÜøé§Ÿ¶÷rjŠ ,¢®ä˜À2Ê£BBÛõ;¹sõ{Ï%ÐO¦êY, îƒF¿-eÜ#§4d7|ýšOQ)Š2æ:'ë=KôM@Km°êjµïvBQ,÷>l{kFß%kã2·6Ò3Òµ-_Ë’+¢W¤2ªù† †²ª¢Ñïв¼ €±=·XD¯Hèº~þ4î²XŽ”¡£|~»ÌgésWu¨ÆR’® BÃѹX²0_fgÂ?@;€,¹)¡iÖÏVAÓÔë§)ã'#mEXõû v˜ñ‘,ofÓÃf¦ÇX^C—@û“ÓDDDd*ÉÉɯ½öÚŒ3^{íµŒŒŒºººÌÌÌ•+WGl [²dÉã?þí·ßVVV¦¥¥ýþ÷¿/(hX¨1hР 6hšæä…–-[ö /|ðÁ………Û¶m›;w®“ñS¦LYµjUFF†ÕjÍÉÉyùå—§L™â’·Ü’„Yo5ý¯K_Ñ#˜À"7IMMõô<ÀV¥ªôÌt%!¡pE/mzv&uÚlúშ®¡aʰQFÚEôŠ}ú)×]ot R†6®QÍìhP®ý±}X³<G߀~ò¨~`¬uާŒ3#ú °To˜@Û±¥ÝùŒòRÊ5#|~óG£‰x3þÐu{c~£ëYPˆý€máÙSàº-¯b4˜·\Uº,BBm]ó…IC`oˆ^zmŒ£®Ãñr)µ/ÿ @6 B]-*+´}ßÊ¢BÑ;Ný“†ͺՖ0µXŒžîc¤e[X˜›w~S5˜¦Ë›ƒh&Œ£ 0ˆæÀ8z§{î¹gÓ¦M{öì¹îºë‚‚‚Æ¿{÷îÿûß÷Üs}ÌÝwßýÄO<üðÃáááÓ¦M xã7ìgW¬X±téR???ѯH†¾aÆO?ý4111::zùòåO=õ”“Y½ð k×®3fLHHÈ 7Ü iÚÇì’÷ë娋Ü$!!ÁÓSp—ªJýò%X,ÊÀÁF–ˆŽ‘9Y¨¬ BBEH˜D[Ûú8!KKPY€@%y¨ˆ‰“¹Ù¨_®¥ÎºU?qD9Bˆ°peØ(ýØae̵ú÷{ˆÈ·„kicA;ÆQé›!dQ¡uí'jéuÆ-öS27€±o]Ãø1׉íÿ–yÙúÉTÛN‚mcljˆ¨–Ò|"«*eE¹ j¸¶¼ŽXƇôÔ1[e–ë¶ l""Jæd‰Þ±¶4œ|ýP[ƒêª¶ÄQ–뇪Ón6žjßíÔÏA!êÍ? Â{ÉÊ ='Kûfõæ[;µ‹¸xŸ_ügÝ{Ñ1öó ØRŠ­O¸áAÏOl´}SmÂ4Mܽ9ˆfÂ8šƒhŒ£×3fÌ'Ÿ|â|Ì¢E‹-ZäxÄþƒÄìٳϜ9Óì)Ç6ÆŒ³aƦwnö’©S§N:µõ©»BúæGÝóBÝ+°ÈMÂÂZ¨d1ýÜiëojÿZ…ú ,×°-…ˆï'zÇ ¾9Qgë•Øxö^ÚFK„÷R¯Ÿ¦ŒcT'NÅGé?ÈèÍÔl¬6òdƒ|ýNý¡íÚ*óseI±ñ‹¬ÌË bb¯¯ªÊÄ)0Ú±·‹±ºÓi#0 ¾ÑU…CqPM êjáëk+}`lbhß%°kz`µÄÈTëmGê‹°ÚGYT íØlkÿ¯i¶DÕ÷é9#§ÿ°•¢ß€¦ýEB¢å¾G‡š¸Ž¼{VRÞVå=ßT›ÒÍRåÍA4ÆÑDs`‰LXD.&¯%Ũ¬°U`ÅõÅ¡”¡#E|‚¢iÚ¶úÙS¨Kyæ$ê;C)£Æi[×õ;¾©SgÙ×”‰Ä$e̵PUÕ[V”7¿‹_O bû¨±}d~®þýÞºW—@`2b¬Ñ˜¼Q߯Ãöå¥Dp+ ,,YQn/Ó’e0š©;‹‹Woœ¥mß@tÑÂXn¿[Μ+ê;ʡᲠO––4ýX5£°Ö:mí§–‡é§£²BÄÅÛUF2N?u €2(¹Ù(I× ÿ Î½ QU‰ªJ8Tº5K÷²–73þÔÉ@y&°ˆ\̾5›ž“e[8B¨3ç}ûÃ?@äÉâ¢F YT "¢Úô2ºn´'7j¯Dd´zËíBPŸ/ðñun™ý>>Ù‰wÖ]Xnž_{â(ª«à€Ê ýÀnøùhÚkIDÅ ý ,”X!­ j²¡Ñª)8¸Ñ@uê,ýäQY\ä¸K ;Š€À«Žk KÚ´¡,* _8«ÿ°O?}€2ÚaOFc9duê7ˆl^“M…Û˶T³¼L´–Àbwïa[Bèéi‘;q !¹IJJЧ§à.Wl ,™q 5ÕPUÑ;€2úZck6(Š2hyî™~A?~€ÌL×vlnã‹èi§ey™ˆŽñýŒ#êõÓÔISÑ(aa×Òñvêq öùõo}ÿû/¾ÿýeìH‰ê*X|šæþDhüüQYÊ X­µÏý¦öˬ ç··U`…´R…nT6IÇ&‚» &™/Uµ,ø¹ˆl[j²+«Gµ”oöìÜÙê`#Àºþ3ýô1(Šã•Ž;* W»Šmaëm°¼m a·øbô#Â&´7ÑLG`Íq4‘œc¹ÉäÉ“==7‘öVÚH)ƒDp||›Ž+ƒ¯ÑÖîÑÏÖ¡áÊ5#µëdµÃ–vuuu¯ýY–—ù<ùæØ!ÆžƒF%÷ê&q´çªÔñõCûˆèÞ>D¶‘Ñ12ã’­«®€~ñœÜ¹êìù¢W¤}¤ÌH×îÑ1²¬“XÍ\(ââ-óîlëÛë2êõÓô#e^ö„’Ö«ÒŒ–èg´S qÜ“ÑÞÏK…8&³\N‡JÔl²§3tï(Íé&_Œ¡ë€)š¸{sÍ„q4ÑG`É9&°ˆ\¬a á¥4 †ê´›EDC®D$]@f¤ËŒt²¤ØºæCýÂY¨*¬VX,ä•"YT@ß—¢¥lÁ!>‹~go$ÓNPFŽuç[ë†Ä€A""R¶ÔÔÉžÀ’õ}ÿn#Ÿ¥\3Â1¥Ÿ=¡Ø#BBQU EW6¾s‹XÍ_(Ûþ¾ºŠ¯¯å®ëÞ\¡؃· Ù©V”ë™—E`‘Àòyô Y\¤Ú/\Ýͪ>ie¯ì" }Ü[#›yDædš ,""""j;&°ˆ\ª²µ5ðõE]Qï£ @<Ýq”èa¹ínY^ ]‡¯¶éKýØ!Ð4™—c4b·Wrißnƒ®Ë’+²¨ÐÖHJYY!ó/^Jõ¦¹2#] Ùüùh[,™“e±·Ä’™éÛÐÔIfg0ʯDH(„h|¯FŒìOy9ÔÕB:«Àê>D\¼2hˆ~æ„~æ„2vBÓÚ‘ƒÚúÏEd4jjh4ÒRë7h¸Op,X­Î`¹„ññ,ãBj`kâîéi‘;±¹‰—¬g6²N"2ÚXã&zEª7̵ñ–ƒÊu“Ôi³Õ·¨“§;¶r—Ùõšê+¹l«eRZ¨®‚¦ÁÏ¿ém»Z7Œ£2úZuîÊÀÁÍžµ%°r³ôô󱘞™î8Ræd6< ie BF‰–Qu%3Óµo·Ùv!ìÞ ,Ê5Ãè§Ž7ºº€,̇ÃRÍf!ÂzÁ X!¡hc–½‰{—N¨%U•²mÝñ]¥~1º­‰{ÏÏ`ysÍ„q4ÑG`É9&°ÈM̽žY?uÌXîg¬á".€zËí­ï¦(ÊäéDÿpH`5¤«êÙ'ÊÊ ´¼T­Kõ¸8 ,=í jkEToeðPPU!³3íÉAÔÖØ{–£ Üú ¬ÊrzæeíÛm¶"¯¦MÜ»1d8ýÜ)hZ3§kªF:ÝÓgáÓ>¿Yfûv#!ØžXÉkh»¶Ê¬Ëî|Å÷ÅèB¦I`ysÍ„q4ÑG`É9&°ˆ\@^:¯­ÿ ö ¬ð^"6^IºF6ª-—«ã'*ÃǨÓn gÛê€l¹°~`ߨî¨2_ IDATJ¡í‚Ê ö~X䄈ˆ‚¢‰*‘˜¤$‘ʈ±¢W$êje^Ž1Læd]õÛpª¨DP0„åRf\²ßM{ ±Ø."A· ­×ûøZîú…­õUv¦ñk™‘ S'Ý!”¦ÆÍ[kNWQU??uê,ËÌyÊØ >¿YfùÙFç&Y¿ŠÐX?h_Ë)Ú°„ª ÿè:ª«d¦CéM·¯ÀBý*Bëêw­ÿx»ñ¹ê*ûÃnÑd­mXÒaå û7§ÓwlB]­½½uµúXÌ`y&°ÈMJJJ<=….¤g] ­ÿLO¿@„÷R_c,^k+UA!"4 5Õ²¸Œb®„ê¤©Š±kaq}–±ó'*°zbÕYó|Ÿ~^9Ïñ#f$°ìm°ôœ,Ê[O÷6%°ìæç6,?Bô„Ê¸Š‘ãÕÉÓa±è'ŽÊFýÑ*°à¼Ë-Dp„åeÎëmOº'eýÇÛÖ¼­mùZÛ±Y;°€›+°z⣫˜f ¡7ÑLG`Íq4‘œc‹Ü$==½õA=DÝ+ÿOÝŠçen¶ñTkúdQ¡Ì¸_?Ó§õ=ìšctÎÒ÷ï–åe²¬ª*BÃÔYóŒÊ {W,[,O$Jzb•ác{·D|}½€šyö$‘8X„…@p›XF,ýìIH)bû (APzÀ÷ÕK…êœÛ”þƒÈŒKާdu51`2b¬ˆŽõÈô®¢ª„®ÛVζÀÝ ¬ÚýÔ1ýÄQmÇfmË×F71™ŸëΜJOübtÓ$°¼9ˆfÂ8šƒhŒ£ 0ˆä\×ö.!²9r¤§§à"•² €,È1qŒÎÍ"#¥Œ¹VôŠTFƒ¯_‡_M6[ÄôѶo4šéˆðû)Ñ+BfgÊâ"áëgëÕ–ªu_A"4L––h{wé'Ž" Ðòó_ÁÇ×X­ÙVÁ!°g0û&(£Æ÷¬6Þ¢oòòÅ«ŽKý<0¡ˆ™—-ËJEl‹95Ç\†š¸ËKç(ÉÃÔslG._Ò/œ•y9nK`y³úXDDDDäEzÀR"±Öi{v4:¦7¬¼*%úôS®ýqg²W`±(£ÆYîü¹mb/‡VxmÏŽºÿ{ɃXf"bãè{vP|£ˆhw¿'uÒTøø¹ŸEQgÍsù<»Ž±Ç¥ž‘î˜þ1v!þþžšU3BÂÀéF„޹ 7TcÉôóDÿĆC½cÈüž”Áì¹ê—2…EDDDäE˜À"7IIIñôœÑ¶|­ü®ÑA™Ÿ§íØì¸)™gK`¡ØÖ·[ffñý\5Ñ·¿2ö:4ªÀ  > ³3mõYž¨Àêæql£œÇHD*ƒwäÑ1êÍ??ÛºQ¿î”÷i™G"Â#PSݰ}ž”¨©†Mź”0*ÝÊœ&°{`uõ„t]O¿@$ ´½cÈü\í»]Χê*fúbl/ÓôÀòæ š ãh ¢90Ž&À ’sL`‘›Lž<ÙÓSh‘¼|IÛµÕúÅÇÚ–¯¯*EÉÏAU¥öí¶«_½„P–ËŠ29&›:O5~~¡˱ËhÂå‘ ¬îÇöjXæã+úèØMÔ‰7(ƒ‡*ñý:Ö¶ßSìqý®^EX[)áëÛ½ZÑ›B¶=ÕÅy ™›šjå¸[¥è @?~D[ÿ™¾kk×΀¹¾ÛEÖç(ݰV´«ymM†q4ÑG`ɹîô+ ‘GX묟­‚®ÐvlÖvc?cô3Òöìåe í ¬+ERædPâúºvR"$T½qÖUK{E*ã'•Y¶#ìÕ9ÆBJB",m(„zǽbðP—M˽Œ6Xzæeã©m ÂnVGf䉤ó%„Ž©ç.ÎkèÇý:´íØXY)µý»e)7î*R¯ÐóXDDDDÔvL`‘·Óöï–ù¹":F½åvòbšý”­!wm­¾c“íHi ª*$‚C`µÊÒ”•@´mV¯Ÿ¦ÔgX(CGZî¸W˜\ÿ\A@ Ë_Ô«ˆ¨ÞFÞJ Jnu°³û„†©7ÌpѤÜMÄÅ9™¶ç5U@÷[i«À*s2DwW–ÌÊÐvm…êø‰ŽÇEH¨íK20Ö:mÇæ.œ„w“õ‹D™À""""ò*L`‘›¤¦¦zz Í3O©7ÌP’‡¡þ7yýØ!8[iûwk;6k»¶j›¾„±VÈhø]\`4»q\Iä2ËU)*!{©W@ GÖ¬uÛ8v„ªª?ºA1V¹fDgoÕ£ÖÂ!Ž"¦ŒOu#P] þÝh B"8€,+ÑÓNëÇ¡®®é˜.é%¥ÌËÖ~¯íÚªíÚ*+Ê iÖ­‚¦©?¾Q$&5žgtŒ2|´Ï¯‡¢èß'+œeÜ:ÏT_ŒíaµìùûzmM†q4ÑG`ɹޮš!j§„„OO¡y2;€ˆ‹‘Ñðñ‘WŠeÉëŸøÄ'È¢(Š2|Œžúƒ¶åkû%JÿòJ±L¿ ‹Šl;£‡¸g¶¢w,,X­žZ?ØmãØ1FÙ²ÇQ‡ˆàY^&KŠExDw܂о„°äŠõý7¡ë–G+‰›î»|BýÈAëWÿBUeÑö)I×ÈÜ,­Îºµé%êµ?VF‡’4D?sRž9%ÖüºœÉ¾ÛÎ^mg‚ ,¯ ¢É0Ž&À šãh "9ǹIXX˜ko(ó²añF%T‡ÕÕÉÂ|(Šè E1q2#]Û¶ÕUÚ–õÐu­ÎžßÐLÝ⣠-bûh[×ÅF{,£BÄTUÄÄÉÌËéàŽ.ˆ#y„cELY~Zæd‰ð[Vw[Bè‹uµÆ3yù˲R™—-‚ClEdN–JÙ9ýøTUаpÑw€è¡Ÿ=%s³´ü\¡Þv7||š^¢Ô/*ƒ‡âÌIýÜ)¥+X^ûÅ(M”ÀòÚ š ãh ¢90Ž&À ’sL`QO¥mY¯ŸLU’‡ª7ÜÔt-Oɼlèºè‹/3ÒõCûèG¿ zÇŠðõæù.½"ÈâÂú%„nªÀ âúÊÌËìàN®"bû í´ÌÉÂ5#PÓ—B*¯ÏdF:ý‡}Úæ¯D¿>ÿùœ6q—…ù¨­}Ú³Ó‚”òây–‡‹ÈhêÔʺþO^¾¨Œû‘2°qýW#Êà¡ ÏêX3S‹ˆˆˆˆÚŽ=°¨'ÐuÔÖ8eúéãR?}ÂúÕ¿:|cûúAã©í®¶ßDL\³•_²¨Æ…n«À”¡#•1×)CG¹íÉÜDlòÂ9m×Výd*ºß.„à#–QߢNæd_°Nz`ÉìLý‡}íz5Y'+ÊDh˜‘½€€@Ÿ_.TFŽ³Ì¹­ÕËEtŒë%ËËŒï0äZÿ?{oçÈUžû?çTIê}Ÿµgóì¶g¼o3Þ±±!CÈ%$„ß/$!|¹ ÷&@nœK€$›n€„};ÆØàeð:xÛcÏŒ§g¦{zº§{z_ÔÚ«êœsÿ8U¥’ZRKj©—êóýø©tt¤·Õêzô¼Ï늕JÀR( …B¡XQT^Àzå•W>ô¡µ´´\_;“YT|Š¥ÉÁƒ˸{òQó‹güÍŸ[Ý罞>Æè¶]Ð416ŒDÜUS@QQ˜Ê Xï{ßûV¯^ý«_ý*ß"“Šo@±4Ù·o_îË{ŸX”=ñˆ>Ë’ç“.üåЫ÷“uàÜzìAãoÿÂüçO—º+><€¬uXk×Ë~í-ï°§þ­Ê-`‘Æ&‚"‘B °äZ®ªFÞ:*–Þ:Ê8dýíú[µëo¥Ûæh‘[›@ÓÈæ­Dßi1>"o‘.§!îbøâ1[›+ÞÛ €f X¥ §šòÃ/ÙrZCÕѨ"úUG Š¨(Lå3°Ž;Vñ5~EDf؇ô»3ç­ìÅ_Á2éÎóù™ÓbbLÄ"¤¾õE1rŽÔ7Ò]Šž“l Ÿ¿ü<ž*yÒå´"TCZÛ`YÚUûèºNÔÖ‘Ukrß“ÒÖ!FÎaaíW EåѤ}iiÓßûC‹½›ÜȘ9²j =o;;ÓÃ_~ÞÕ¾ÅÐ.º¬ ëþÊótÏ%E>œãÀ*3\ݽ‡4·Š‘!~ª‹î<ßúù}âT—þÁ¦{g?èô$iiËw«ÂÅ­//Q¿bÝÇž}R»þÖÙ±† …B¡P(Š¥ÊÀR,&¢¯‡zNÆ¥gÃñ ºïºq‹©œJ±ƒ[÷}½é6hÙ°€Ýd%5ŠéI$⤡‘4¦¬ÈÚNzñ ”lÙFÖ¬“Δœvgâ`)Õ@»åNý}\²ê²e;½ø zùÕtûnüÔq… ¬¬wï=“ )móS]b&\Ìc‰XD„§PS›·ƒ¸4^s=~ðq~ò þêK"±¾ñ%Ùtì»»D,€Ÿ<Î.ÿáV¼Ü ,15@ŽŽU( …B¡P,;AÀZ»vm X·nÝoýÖouuU1D±¤ÈÙÏ,z{X÷ÿP¦Øxá'މ™0Y³žnÛ)“hø‹¿2þþ“ì÷ƒsí–;´kn@6nÎX0<íY‚Û)9yçdÍ&#ë:é¥EÅK¹N ¯þå{T_º?Ȫ#Ý{)4m±6S tëý7Þ¯]{#Ù²tn´¯¼ðâÜ ¬¾s^äìgæ}=JZ?ø:’ ïMBfÐì¹Ù²29•"·èïýÿ´›ï‡‘öUÞL崀Źõ“ï°'.°%iÜ ë2,zÉ•ù&f‘nZI,Õ—î–uµën’èî=¨­±ˆùåÔ{ÞW¾eú‰óŽ@Ѩ:úUDEaZÀúéOºÿþššš 6|ô£½çž{þâ/þ¢˜;Î_H¹çž{¼í‘#GÂát‡ˆ÷&ïåp8|äÈ‘œ7©t…D\ ŸšNÚ:Ĺó?¿Øó­ÿ`Og±ÇÈÀfºq‹!Ó­í|øÙ©ôéGxffjóvºmiëÐýòKÀ˜õÃoð×q'ú=ø“‰Ïÿo~â˜wÒ•hió>‹_½‘vÎñ,œB#\öµP+¨–Ï tÏ¥V]²v½vñÄ@_èÅÇå­ÛR}O>m}í_E4‡'Þ8 €^½Ár» ì¡ÿµWà(Ôó|ôª}‰?üó¡koÖßõÛ¤¡Q{ë»X<€x ñ˜ñØCY?ú6|Εd–K-e¯Á®øD4À¨íÀzî©'ñY¨Ô jµ‚ZA­ VP+,÷î¹çžœB ª©ÞBæ^|dddÛ¶mÑè~þb–R,;x×QëÛ_%[¶éï~¿õõã£òz²aSàýhüý_Aˆà_ý½Ìå1¿òÄ@Ÿþ{¢Ûvå\=þ0ûåϵoÓn¸ÍúÁ×ø ÛŽø³¿&­mÆg>ŽxL»õ­ÚM·»w1ÿþ¯ÄL8ðßÿª@¬rÄô”ù¹¿ ¿ý7è›Ôw ÅÂÁžyœýòçÁ¿þA"n|öâo×ý üãC_$B [¶~ÿ#æ—ÿQ ôþÿ?aç]Gõw¾—^~uáÅ­|ƒyEÿ÷Ó‹¯¨øÎ­¯‰wwioy¦'ÙóO“æoãsàÏþ—Ôâ[Ÿýþ€‹¶ÖüÎm­…BLM"$ ¢¿×ü·€@0xÏçXßþ*½âzþÞ…Ø´B¡P( ÅŠ¡zÎ"‡¸+Yjåà•u%rÎݲ´´êüˆvãmÚõ·’¶v1Ðoþçÿcdíz7UšnÙF/¿:Ÿz€4·ãæ~‘Ÿxõ 2ÜJôCˆÇØÿ+=3aÔÔ–}ºHš[ €•ÕB8»ŽŠåÈr¯£vå5tã;£ª¶ŽnÝ Îw%º·¦ú‰á¶ ¨©gzÄÙ>1:€¬]Ovœ€Ÿš;xQLV¨…0ôêýø ϰCÏ‚RýwþÐÐ)PRár/bÙßB(F‡Íüóï>‰TÊÀ`0R‚÷¶¾÷ŸnG碰b‹è3T}€*¢?PuôªˆŠÂ,²€õ£ýèºë®[Ü=(†þþþ¬køé“pÕ“úFíÍoÓn¿Kÿ?B FΠ›¶ºÓ /ÖïxG¡hiÀO}¤©9ðJ/ºï?Í»OÈC„'»×Np_»¾üœfBèö]¤s£Œ×Y!Ì®£b9²ìëXS«Ýy·û/zþ$OmMõ[{¡v嵬Ÿþ†AZZQ[GwìÀ{N¸ñXù°3°:ª#`í¼€44Š© XÝs Y³^»î&ÔÔJ_XIÖ²/b¹ˆYò)c…CgÅäDúúhTLM çÖ}¿Øtÿ*°b‹è3T}€*¢?PuôªˆŠÂ,¨€uË-·üä'?6M³··÷3Ÿù̧>õ©Ï~ö³ ¹ÅÂ#z»Ù¯žØÓÚì½’=tŸ< =@7Ÿç½žt¬Ön´»üˆç&²q jj < ij #NèåW“öUreÑwZ8V†Kú¿Öo,ûyÐß÷ÁÀ‡>FÖuÎg‘åÅÞ½ªÝÆø ŽÞ÷Ù½„lOôîLö˜êØJ¯¹š&†!{¤}ikG<Æš"b¤’¨­óN‡¨$šF/¹‘Íô²«´7¿UêõR»/’Š‘Ÿ8f|ú/­oýÛü—Z0\rN?sÚ¾pn@&¸ÛÄ¢bð,ƒØâ™°|ðNT@ÕѨ"úUG Š¨(Lå,opWVˆ×'>ñ‰ï}ï{{öì©««Û¿WW×Áƒ/»ì²ŠïA±$`Ìþÿ'f?ÿ/öÌùO11f}ýKìÙ'¡ëú{?à6 ºhûo!«Ö ÖœÈB ÝyÒ¹ €¶g"n;°ÄÐ ;ø²óüÒŸ˜B¡XZæVsUgH­Öt’„ÂÍëIs+Ýs)‚!íö»ôw¿_F/¿€õãoKLj̈³}ÙkUÓ~ålã*ô‹ÉêuhW_/‡Ÿ–:ˆpþˆ© Äcr$ër!íÀšKÁ}¶€%ε[ƒ!ÈòsghW\ Mý½Þ¯7 …B¡P(K½â+øƒòæ›o¾ùæ›+þˆŠ¥ ?ò ›éÆ-¼ï41Љ¸ùåD"ŽºzýÝï“JS6š¦Ýõnö“ï–‚é¼YC¨­“+“ ›å:¤s“8ÓË"õ"A,BX?ü,“¾iÝ¡,…ÂLßù;ñï}c³1ØÚÈAh·Ü¡Ý~—WÚÖn¼ ©${ú€õ“杻ñQ²~CàþÜ»Ž˜GÕ°$dõ:²q³k5u®\JÅø(ƒ¦Í÷1ƒЋøˆFˆÈ LÀ|wApÿÌ(¬_‰é)1= B „@*€vnâ½§HÙ¶“Ž óS]¼ë½ìMÕß»B¡P( …¢|9KácDxšýð›üµC°,Ès‰È {òQ$âdóÖàŸ~2·z [wjoûõRQvÒçË8dt³íá"{.ãÀã£bl„46éž E‘xg©*–/þ«£ÙÔúÕÕ¿ýHó 'kÏ“i_åU¯$Úíwéwÿ&jjÅè08ƒgE,â=@Œ £Ê,ú»~;»õ8$­í`LLŒ¹H"²çžÃEu#Šh„Hgœ/yŠ q—XtÛ.hš3a¤s#‹òsgõåB~üõ*ï:7þ{'®LT}€*¢?PuôªˆŠÂ(KQ5¢‹XüȽ‚=ö {þi¢¿í×QW_øÞô‚‹J}@záÅdóVº÷Òô5{/Ó®¿U»þVíªë `0MÙ,C6nY.vƒRùŸÝßýðÙ/¼6^B˜NñìÛ·¯Ë*ÿÕQpBŸlºöÙ†+xA]ƒ^qMà#×ßù^ºu„'{oåÇ ›ÎËsïÊ »¤³¯\³{æ—"2SÌ"ùŠ(böÄ#bx°¨­8µ¬Â…¶=V[wÕk!„Ðnz › Á‰8il"MÍd÷^»»Ü¶÷…ÄïÄ•‰ª£PEôªŽ>@QQ%`)ª…ˆ„;n—ž·ùyX½ø ²~C5Q»åŽÀ?*¿N—uÚíwi·ßEÖ¬'uuDÜÎî­Ò–‰@تD¬ÔboD¡X8æÌóöBššéåW“ /ÀO¼‘^ddHŒ ®žnÝYñν«5ëðW^d÷ÿ`>ë°ÇB2Qdœ–íÀÄÄØ|t!)¬[¹ÈÔvÒ±Š¬ß€tnÒößBê!‡QöõÍ-¤± †á¾ …B¡P(Š¥Iå3°‹‚O›_ü;püøgŠÊ=©>iAmvÇÛÉQ{ò½jÿâl¨¾3aÄãâܲη' €>ç‘ …oð XEŠYtç àÝ]à\ö󣯠^ì¶!/$ôü=`{éYÞu”¿ú"½´œH&qn€¿ü<€bXik9:° UÚ°ZÚÉú 8¬éïz/(EC¤Rðúìä§C,‚Y=§ …B¡P(Š¥ƒr`ù1>‚D©¤Yì½8DfЫöÓm»Hç¦7ÖŸg›¡JŠf¯¤®€ˆE¸l!\¿qQ¶±ÂܪÆâGŽ©Æ²Šâ9:5ò‘Þ¯þ¯S?šûÐüø¯ŽeX¤­ƒt¬F".Ξ‘×ð#¯ {.©øöŠÚOç&íö»ô·¾€õÐ}ìé¼» ¦™ïøE4RÖ?”¾W^R€åÔBX\ˆûÔ$ÒÚF×oÔnº]ÜH}ƒ}³¦Ñ˯–IC#VkÇùñß;qe¢êèTýª£PETfIXuóÇÕ­ÄȹìlàEBDgè·½MZ±6mڴȪk€LEq¢Oy?UCPÀâUq`-~W<Ó©xªq,›W^ÿê( r^. ݱ›òÓ§´Í[ÅÔ¤AmÝ¢ô¦·té›èÑüë({äÐuý7?@wï™}¤·ˆbj‚y•}U ž%MÍÂ0‰™ð¿è’ X¶@¶[ XÉ’ C¨«'ë7hÎkUß(ÿŸ^tilʸ2¶-„þ{'®LT}€*¢?PuôªˆŠÂ(–_p¬ÑáÅ݈‘B*…@5µ2®¸¹y‘#R_€>_÷”°DU‰½Ž Kp|~-¢þ«c,dó6¢ÿ4œž;ºaÓ¢ôzÑÞþß´ëoÕ®¹´µÃ²òùjí" €|œ=ò€@Ѩ:úUDEa”Ë'xXE÷VéºJ¿½¬Ñ!ø:Á(` •U¿ìz€þ¬=ºùowüÆbï¥(8ŸÂÅ«eò €lÞ €÷Ÿçò—§l4[\HS³vû]ÐÖκáé|Gò#¯ˆ‘aíú[ØáC´ën¢7ÜJêÉÚõè=%†±óüB€æB ¦&ÅÔéX]ѧRа&Ööìt=ø‰Ï"Gm]úʆEs`ù’M·}µðý´Î IDAT~pav¢P( …Âg(Ë'x[w'62Á½a Xtû.·Y†^xñân¦ªÂ0Q• ,ÿ‘b¦]6C Î,³Ì‚‘¡e/`55“¶19.F†¤_i)X.¤©€˜É-`‰þ^ë'ß% ÉÙ¼U»ónûŽk×£°‹sP*"¤¡  ˜šãËBÀr³Û ôŠŠéIy#½ê•›¥,…B¡P(Š¥j!ô©¤˜ #@ ¦§ä|¥ÅE`‘Æ´ôàÁƒ‹· ›·Êyíö»|œàÎá8°xnãÄôØ'»ð§~QÞú‹UÇ'‡z¾Ùû±©ÊÏ(°l%hÙš˜`Äü~y/úû±â”çÀ@¶lÀûz¤úOÖ®«ìÆæin r9°ÄäDüë_‚eÂ0ØãЮڗ¾ãÚN°ÄÄéY;Á½¡‘t¬ &F+üªƒg aþƒ¦& e–+'2k1Zý÷Ntéôƒ³ÿ[ìMU ×qå ŠèT}€*¢¢0JÀòÒ~E:V“Uk!„ì’[ä-Ù-„î5ûöí˸¢b–m¼²ò8táñ–žþPwyë/VÄ^z®ñÀóSen»¼‘R ‰%·JæåÀZRïÇãSc;Ù™œÏ"¼xÛU&tÓV¢ç¤¥dõÚùl£Â4µ@.ù¹€‘"›Îƒ¦AÔ7Ð ÓÃÉšµ TŒäµJÄ­‡î§OBþ¢n_@Œ/+Ç¥YÇL{2°æ‚44`‘XKê¨(UG ŠèT}€*¢¢0JÀòŽ€µ†¬Y‡%ƒ%[UßB“d®€•[‘‰±$®-³Ã$I0ªL/3Ñ)SþXx,é­[>ž“û'^¸7øã_ŒÎkj²7óMŸâ-ÛðÇÀ9i_=0ŸmTÒØJEdf¶%&ÇhoÚG¯¸€vùÕÐ=™ éX ÆÄ@_ΕE"Óào¼€44ÙƒËEÀrj]DVQÖ":° …B¡P(Å£,? '’Ukd69ï>QÅKÄùÑWEßé9¶$X …STƒ;V­'Æ B7nO•ÀГLaV|e;}ùèA¶âFý“%MpÖüRÛ¼õ+­…°c5ݾ[*D2:j A)il‚"κELN míÚÍoA¨†^ymö]·îÀ{Næ^9O_nh”–˜«Ì¶KËY~Ö…ÇØS‹j!´§ª ¬*pvÌüÖcS¿ªÄA…B¡P(@ X~€ww ›Î£\ Bø‰£0ª%OðîÖ÷¿n}ÿk9nKÄ­~dÝÿÀnµ”2°V)ÇÅòL!Lð¡YVY'™‹UG¦¥¿/r^+K=¨Ê§Ü„Éw2¯žÇ%õ~d`˜wqË/ !ÚÝïA¨K,ÁÝFvΊÁ’,´u†Fý}¿OÚ:² Û¤€uBD#ìéìéî¬"‘HÙÐHZÚ i"< s¾Ÿb _~§R=Ü÷¼Je2dÁêê‹Z1@¨–…dbîƒ+Ê’z'Vƒp”½Ö“<=¼Ì¾2)ß×q% ŠèT}€*¢¢0JÀZöˆ™°D0HÏÛNZZÉÆ-0 ~âhåhz € ¢‘Ù™˜ç/ä/=+¦&UÖbap[×ÈçÀJr»pQ£œ°ÿŪ#¤¨¼ËÎÀšŸ´8XóRÜ–ÔûQ Xf.ÖSÃ=Ÿ?õðÏÞ˜s‘Œ÷‹IZÚô;Þ%èÀrsܳb°RIÄc¥Ë•ž·cöéÖ Tœ=c}÷?Ø#°G௼¾9@ÚW@C(%mBLŒÏsÃì±óM¬n­óéÎöPS =ìÎ ÂèOAYRïÄj +´|¾ (ß×q% ŠèT}€*¢¢0JÀZöˆSÇ!ݺS Ð‹.À_eŽ{MOŠÉ‰’Îó؃?eŠáAÂþþß»æŒÝä"úTÖba8,žÇÏ’öéYÄL.ОæMÜ4…fÁ1UÙ‘G–€%§‚æ—“BFò:°ŽÆÎv·¾|81GÏ2áö.ý…¡W\C·ï^ŠVSŽA„vÿ`k;É{ÏšZ²~#ý½ðOwy"€^½Ÿ^x±Ônì.ÂùÅ`ñÓ'yw—ýû¿jx¬<H pI=첋ðô)ëáŸÎksŠLdüò»J¡P( Å"£Ï}ˆbiÃO¼€îº@þ“î¹”=t?yœƒæ(…0ÿéÓ°ÌÀG>^ìÈ-Æø©.þêKbhÐ^cb,ûdÏIigºE, Je°ˆb!I9O¾ÂlVdÞ½B ÆxÊÎO1©ÊÀ²7&cšî‡ßár$Ë%`Éãœ7e/€Ry¡ôj¢½ó½%yvˆ–V »…P~@Úæx¢Ûv²>èÀï}Èüú¿ŠsˆÇdWHÆš:í]¿…@°„`þ Žªzð¹,D"HCSñk’†FX<o{4m^[T›nûª÷Ÿû/‹µ…B¡P(þA9°–9ŒÙX;m‹46‘¦fX¦O¥zìAöà½pZÆDd– À{LaÄð ,“=ñHÚf5+î×½‰zB5ë¼ Z8œB¬¨–âžçœßp¬¨UN§Ì¢Ôq"iN[¨üðD©žð2$E‚9ó%yøÑ–ÔûѰrW óÙ ½H-ƒ‚CÜ]HsK!CÓ"a;°fr8°Œú9FdÛ.ú;ÞC6o¥›·Aˆt¦{<µµ2ü ®€5Q¾€Ågû`¦º?]s&ÖIViSDä×-‰8q~êxù›+‘%õNT”ª£PEôªŽ>@QQ?|{¿Ò‘þê‹ö?"3H%Éêu¤Å3,¼µái19a`²Löä£èåW“uàvÿÍ Îû ýȼ ´JuL»æï­ýýý{÷î-òáe“ ÈoZñXå8°¥ŽSf 8'N©È ¬yf¢ÏÉcçNxóúó_Š9éfÖ<¬%õ~”dŒä°Šw`I(üÕ¯dg`e9°¦ÆLÔ¼/Ý|žvãmôÒ+!3Ý»»xÏ º÷RBf`ÕzhïP~–ì±‡ì‹ ÕB˜W©ŒF ±4–{™¿ö2ݽ§Ì͕Ȓz'VŠþG?è^~åT⻿œÞÞü£_+j"ä2Å—u\i¨"úUG Š¨(Œ°–ì§?äÇx¯qû%¤­CœéÁä8¶í„L¥ˆÉqöËŸÃ0ÈyÛíkŠt`èK¯ß±ZŒböÀuï ÷úzñåÞÕo¢…ÁdL+]ŸNöÄ֭⬜ ¬E©ã´³¬\Ç<áv&z¬¤eÝü1€›ÄÇõy{|<¬ò÷¼¤ÞŽÍ*‡!¥+NŠh!”,ÿ¹Š¥€59!Ò±É ÎUD= ½ùmò"ݾ›=ò€èî²o’S=iÎÑ«X<"£CöåHµXî…˜ŽW%ß9¿åÄHÅYU2°¾ÞûÜ!ýÅ-ÉÛqG¥ÖŒ0»…°–•Gï« 'Yß°,=0ß÷…kG2yå_EAþ¬Z9XȯÆz‘Z†F ütÎLš[IS³˜ ‹Ñ!²ÆŽ,2+cu¨«S“bj’´¶A¶åz¬¦f""á´RfbtÁ YµfîMŽ5µH&Pekî ,ùWŠ€Ehw¼ƒ=ÿŒèïå]GèE—Ïy/ÅœÈÍClW( …B¡Hã¿o«} ?~Äü÷±îý.ýλµÛïrÿ#kÖy$mð´ø¹,~ÒE/FÎÙ‡NÏåÀ OÉ8-1: M“]t÷hš˜™†™‘¨-,zÁÅÐ4zÕþù@QQÕB¸L0 Þ× B»ÇN*)@Öì?!³&[åÀsêB6l"MÚ­oE @ÚW‰ñQ1>FVÛæ/ù•;ih"ë6hûnž½Ò¾}ûæx,E%0…ãÀÊãN`N aJ”3…pÎ:Æõ­¨€EªèÀ²Ý=ee`}eæ^³~jïÙëþxÛK2û57Yöï:•Ì<&»b¨øûñTxü§£‡šiãïo»nî£3‘ ú9“Úewa1u÷:°|v¶L¶í!¼·Gô†¦Ë¡ÚM·íÛ{Yi u¬ ÆGE"€ÔÖf?PS‹3aÒ ¸QV©$Ls¶¾ÎLËHc“H&Dd†ÔÕ—¶½¢q­‡y°D,²j-Vr"Êœýõ•Â÷ŸŒ+DÀò}Wªˆþ@ÕѨ"* £XË~¦–I:7έ^¤¾Áq$@Ú•¦¡¦†x¬ÀR^íÜg¶ üŽZ¶¢ØÈS¦&hš=ëP±¸¢FÞs~ÝS’¢*-„F(Ï«"$açÍWÅUîÂçFûÌú)ãAd aŽG:°Š©»ãÀ"ð£ÝCþò'­íR„Òn~ Jg™n!Ì#`IíÉm!LQL¡ü(inüð|ùQqXN–÷œÿ99Øzl >5c&Ý+˰ ×±/fŸúr½’–¹ô¬¸i5œ’—¡ô¹ºt Y™Ýp)áf`U`ÿé)„ó˜œXñ÷£Á9H–±'@–Ç•7ß={¸,ß3Ó«ö>ú‰ÀŸÿuàO?øËO˯J-"inE "3bzY îò€¦xZË…3L°˜,ái!ôÞ·¤CÜŬNc¿¸(-+ ÒÒ 1䤸þ“QËoÉ,|_Ç•€*¢?PuôªˆŠÂ¨ ¬e€ˆFÄÈ‚Aºik‘wñ"”,ÒÖ!&ÇIK«vùÕ¤¾lÙÆ»Ž@A+_’Y½”ŠñQ16ÂA*ÉO€ü¬M›6¹yÅ|p›Ô¸G‘‘ñ؆°fÌ´AÆ &J§pãS€Ð,‹sæÈï82œšzÛÚK6Ôg'ýçƒé `•&¼œŽNò@JO4²Pœ‡b3Fª)‚:Î2½Q)f!Thn`º…prXÅ߆°ÊgRÉ–PMI÷¶Í*Ç‹Ãdwa®›²±[ Šk9\^Ö¶ôeçrÉE$„t¬Cƒâ옕…¦ÀñRÁ㢚SÀ° ¿Æ¨œ€%ÆFì`õô£e_°ÿ92$"3rÛ¤¡Ø_/³!-mbhP„§IgÕ?¶|ÿɸB2°|_Ç•€*¢?PuôªˆŠÂ(Ö2@œ=!èÆó iEÞ…´¯ ÆGÛE6n@:ÖÍ[µÛ.œ»…Ð4‘L@×Q3ëµñdîX½{NÝû‡ãŸþfï ³o²uÉ\*•(±…Pócˆ{>Ê("i_ €Ÿx©™åÀ’XN|UÚ•3HÑK"ÓDm‚AÇU±Bö؃Ȍ{K X™GòS]îeÒ8–üp\A„¾ÿd´¬ÅÞFµñ}Wªˆþ@ÕѨ"* £XËùm9Ù¸¹„û¬^@ŒÀ9÷Ю»‰^°—´´»‡Ès~ì5íº›Pßãq£ò{ìÆœa+dm§ý½ D»þV²fYµÆJ¨X,Ü\$o*¹Ì>7…a)h§ Ü¢å8° 3Á¼V²£&Ç2©¦¹¹æs2J€j†áB7– †æ¾[Ñ8S/EÑO0:t¡Xƒ©3ñ‰KÑ € ŽY-on ¡YY–¨|¤}Ù¸ã/'ŒØv´Ï> Nã¦X./x®„~ùdyò"÷†¸ûþt¹\ìùrFmž ,û[T†£qÏåÀ²Ü›Zà$!V,ÄsÞÝÅO§»÷¤¯K;°2*-ºÓæáÀ’aöX¨A„þFkb»B¡P( E%`-„Œ¤Ý¸¥ø»GÀ²,$Ð4²~éÜè=†ž¿—¬ëCƒæ7¾øƒæØ$¿BÏs@֮ǑWÐí»µÛ~­ø½)ªJÚå°d<¶ÉYÔJAƒ–ªcµÑ|9ëO ÷œIŒ_ѲåÂÖ59(À”HŸµFŒdÎc¤›&ž9Ñb&•jzC ˜u|ÄL ,j ˜ ËhÎ#`}©ç©.ýKù%¿wÞ5ÅïÙÅ9§¹zs· èÐD°U´N¡÷œi›5¤ŸËB†c8¬ù4ý¥7ìT–UB«®élʈç<@:þfD)¤€KÊÈ7RÓ»ˆ·…P-çî¾Ìþá¤Ûvfß\S‹P©qoîÕœXvÿ Ô}›€Š…¸‹±a¤Rüµ—½Vî ,Óägz@ݺƒ÷œ,?ÄÝÉÀ ’å{Ä é!T( …B± ¨Â%ç|P X%8°Hcj눋‘!¤¾!‡‹ª¦VÿÝ‘æVqî¬ÔȲ°°óXkl³½æ†b¶tðàÁ¢·¯(Käq—ñØ&XœBf=¦åöï<yõ¹Æ/NŸÎyká:FiD>€ˆ•{ ´†e9°ìúxôŸþçð—f/'÷A×$X^ÛÑ3ê'‡¬‰|äÄÓ‘W‚º”à&€€Ð×è­Æ¹#`Œh¯ì¸“JÍÀúø©ïøìžÍx{ºó%­yL!œ]ǧ†{>ê᎕· »™i+€¥¢4W3µMpÖ¬þP™fU\–@e a‘›^æ”ñK•lجÝ~—ülٖ〦üÜY»PJºù,·^î´kʺÿìéò?+bŽa.ägï:’¶ƒåÉÀâ½Ý°L²~£vç;AȼBÜíþú…°|ÿɸBZ}_Ç•€*¢?PuôªˆŠÂ(k©#ÆFJ‘ÖvR_ÚŸã²U„÷õÈÙ!€44Ê¡„üLOƃž`Oà‡yg9ÉA„¤c5Ýy~1ûÙ·o_Ñ{W”s¼*«¡8¬O¨áõD#fÅ»®c* 'šD­Ü,é©IñŒG?•Àjc“Élù#%Â5ÊuI+¯€• 1ÒÂÙsc}_êyê±s' ìÙíµ´JñÈýël¬é0£9ã…€åîb¤[K“œÂ5#VmätlÔ{¥«¸Í–{Šgv_‹öu·¾üJ¢ÐkU·Ÿ1Êr XœšRz¶€å}³ÕIûÉ“ ÝBèûóe :¿TIk;ë›_a¿ü9Ò±@>ùÉúοŸøöÔcéw Ýu!„à/=Ëy@þg}ãËHæÅ+ èÃà]é™D93°DÏ tÇn²v==ï|XSDÀòý'ã 1`ù¾Ž+UD êèT…QÖR§œ,nÖIo7R—[À@¶l ú2ì6ü×Ù#ðc‡ášä¸cKB5ôšës&d) –v`¥Ï¤ËK0@ƒh 4+§þa¡ÜyyV0 Áhe¹XRMssÍ%çȰ¼pdz(ëp“1” @’åÍžOêRÀJðR¸çõæƒÏÄ^+°gîû•žg"f¡(}0 [aÒiÅ hHôlÒ$¹eÇ9qXž[§àš À dG¼'=¢UjV2šüÑË´[‰j!œúûíêëÁ¹8Ó€¬íD¾BÎyßibh@ Ÿƒ£vÐßÿ|\»ù-Úõ·j×ßJ:V‹sæ·þ ¥K®öÀD€¿örú‘s:°ûÍÛh7Ý>Ÿ ,ÒØ JEd&+<^Q|eX …B¡P(%`-uä÷Ï%`IÖi ¯ Οû¼ÿ´÷ÔBFüÒó÷j×ßJ·ïÊsOB7oÕ.»ªÔ)ªŠÛ¼&ˆÛh&¤fd +) 5$D˜"¢F‰ÁBYíiS©$4F¬@½¨ Ý^9  @JdH‘ZÛdÔÉ:Ü’ãí¸¦±€dþär3`Òô“J Ž3K2žŒ;Û=“n3ô8°JxÊrÿÚBu¸nzWc4_ aúúCµ7?=’ÈÛZeq.tÀÉp‚¸,^ŠÈhpþàÀ±Ç‡zò ë^ÖlJx2°â¢€Åƒ©¸™QzÓó›'9K/-„ bNœ“•¾¬(‡šZí×~^t¹üY»„ ›­=‰¡AiªçĹ³Èú î­dÕí–;e¯¢þ“æVÑwš|¼´Í)1: M¥üÔq~ô°T”<-„žKrnçdýF™cU&”’¦f±0ƒýÍ q`) …B¡X”€µÔ‘”SωA‘H ±(dV¾Ã›Hû*¤RîÙKÛw³vû]dóÖ|÷Õîx;Šž§ú™½L&ãŸ:uÿ?œúEÅWN»rœØ „eë ,%R–0cæ°8e˜ÕçR ŽÃñͨ­A@‚çB¸“gdx¬ÞÈ$Ú?{ƒÖhÖ]ää>*¨ •§…0nš"`0iúq¥+¥¥›Úî?÷êoýÇè#é-¥;òJi!&€ 4C„fÊUdˆ»Èr`×åjOBŠS©ü‘^“){ÛQ=c ›(«…°wfâÁšû¤ýHþsvM˜È|õJ‚9¹õ ’£…Ðâšýš Ä2žN*Õýj¸:¬‘¿uÔ>R€¶’XÕû¥ªÝr4 in!u BN³õÂÏtË br\„§QSKÚWå\4·hw¿{üa{¢Ó„™{&©< ÎÉÚNºm³¾ÿ5ë_‡£[m0†ö‡Ÿ—[üäq$¤©¹Ô^û|uˆé•Å÷ŸŒ²X¾Gú¾Ž+UD êèT…QÖÒF;…}mg©wµ,ºN/{S¡#·l`}ç«Æ§ÿRfØçms<ÄêuÅïGõ3{™4ƒ­ÇÎ4”˜]î OŽ€å¶e™‚¥`¨¥AÊt‘œ,™•§=­@ÇRA«®†„$EŽÅ] éSÖÃSˆ0¥eŸßÜ@A©Ð$yîsÝÁ¸-‹0O¶—edc£½I`Ò´;L8çV%uMÂ"0 DÄLŽðg‘ µ%íÀr^Õ°óÊ'g5͹L¥lQ/Êèæªc%µö'¦€rƒs䪣%_+-Oãç\¸ƒs6!ÎxFRžK„ÏF§?|ö Öóu&/,`9?ÆsEìÛ!îÒUâæ—)Õû¥JÚWÑ˯€Æf44öw!¶²W„ IDAT^d:`ë…t݆íätÇùôâ+`ü…ì¿Jù©ãìåçrÞ‹Ëú ›õ÷ü®œu+†øéSûúÛ~sw¢çöé'옭€¬ß˜s2 ›Îƒka®&¾ÿd”oFßÇÒù¾Ž+UD êèT…QÖ’FLŒÁ4HK+jjK½/im‡®Ðï¼»ðŸõtóVb& ÎE×1¤’ˆEä›?¨˜?†l„É3p>ðt ¡}æï¶e1 [À i<ˆ<1UÜq/9­f܈¨áuu4¯€å™VOê€ÑÝ’õ<óTÇrXºÀѳf3œ´U¦™ÿvú™?úÜçN=l¦Üè÷`h+Ý‘W‚dÀ¢”D¤H»AæS€é}.f [œJæy:¦LÇ0†ãiùÀM7³ò¸är2”´ûcyR·¤Åô²Xö«gj9¬ˆÇë7jÌLI«6¯`x|dælËy²¬jö‘`K(¥xé¹Ñnº]~ È4tñøæq~ø%ÞÛ €nÝ!¯#sˆGt×dÜ»~äþÌã9Ó¦¤FF7nFM­¶ÿè1=%ú{f¢Ã˜¨ãqdÃf8_ºÒ­Êyw»9G:¤¢ T–B¡P(Š ¢¬%Œ»f}9w¦”´¯¢{/¥Wí/| Ùºƒ^µ_Æ“ú× Hgÿfï ßì}aá×à € ¬ü1ryànú’äz|˜`Ò÷T¯uËÙB¨j!,À‹¨õµZ@¹XŽ^c"-` iç\T»UKÖ Í:ϼ‹ qרl!¹-K£)[âºfQ0b$æ:¡†œ¨©X €é‘ŰÌRd)`ÕÐ K¾˜Ò'h†ÚÂÜBG# ;¯¼é1}»÷Å/õ<5š°Ÿˆ+rèzC»Er.S’—qf 1+€E-\ŸÛõØÐÉûú_Ofı»ã/­\+D<:aEì§&£Ù<Ï"GÀ™³¬™_é“Èêi”êt¹¦fíêëIS3Y½ž0uÖcY?þ6’ ÒÒJ.¸È>~. MD$ÃNÓà]ÇÄô$íPÖáüäq~ò ƒdÛ. ”¬Z !øÑWÔŠT›@¯½Ñ8(ûþ*éÜ]#Cå OT¸ØX‹½ …B¡P(þ@ X‹ ?ñ†ùÿžýìÇ9o#ç ctË‚îÞ£ßý›sFZÛõ»Þ­ÝxáÝ'ì«°TÂáðÜ-,)n=×xà¹ÆFé³±æ‰åœ'ó„¿” ó؈d¿žÛ{ÅÀ˜ãÒE@<×D?)ñ<íiê8ÃbI}=­`æŠw}4®´4™ŒÇFÀéu«¶Õ§ÚœŽeXLXˆÐtèŒ1šE €!Læ4*ºþ,3À)·änÓeI™èÒ¯TK‚(ˆš)8~.ž95Ïíõs}mËVм-„ÏëϾÞ|°+l§€Í°ô™s_"Gê<+å¬pZØ…‹›rÕÑ~­(wCÓòñ³ÔGë~öÆtFܾëÀrã̼D­´ªiý“OÄÛ˜Ã^GÖÜ-„À k!¬ö/Uí†7£¦–lß €wŸp¯Ý]´›ß¢ÿÞSG3š³}Ïh›)`ñoÀH`O%£ÃH¥ÄÈ{à‡´[î$Mö$\Ù´.s!¬5Gˆ†Frþ^g° ë¤s„àå®,ÁOÆÊbg`ùý=éû:®Týª£PETF X‹ ï:"†y×Ñœ·Ú¬Ò°$ڛ߆PM‘“¦fÒ¹¦Á^zU°úûû+»àüIYN>ô\ÝI•hGf*T‚zå ™q·¤8UCšÐ¤ræIÙX¹ÕœuŒˆ(€f­¡Q—–­YÌm!,¥ÍS¾&âÜD®:r§"Ó©ÄúºB£ÜäÓ‰gj¯ÜÓ59žŒ62¤„8K!bEÀˆk1ùÔ¤˜e æ%—˹8—?Î q_ASè—j(D6l}§ùéSôü½âTºm§ýªÑßñž¢Ö©©E €T F ÁèïSüÄ1¢]+{ê1và!ÛlE)íÒ«èþ[¼‹²™1 ^Ó ¯Yüäß•‘Y²a14PÙe³X‚ŸŒ•ÅÉÀòù{Ò÷u\ ¨"úUG Š¨(Œ°16"¦'€s “æÖŒ›S)15 =@:V/Ì~èE—±_=DUp`-A\kÒœñ:Çtä¡Ô\¾’Rñ:°¤•É`–|£3p)‘Ôh[ â&€ÉdügCGêiè×7_Âa'•‘•Ôâ:‚ÍX¶G ŽgJf$¹)ÝÒe 1^ß`Ûn”hðEILÁhЂDGþbÅh:’‰…â˜fp'&šE $¦]µp:Úá<_VÓÔRŒ)ÕêAÞ~Li4c)×Ü䶺 ŽW“µ›q¬dqžP—l† êéËsrÍyÑ5JqK¾&yL®5cÍáÀ’?Eɬij™ñTü¼Æ KÚÓj­‰Àˆˆ&RîFfqÍ>,—ËB8Wˆ»ÌÀR!îU€nßÍúNóב†F~긼¦ŒuHc“˜œàÝ'Ø“ŠAûûU²é<í–;ùÑÃblDŒ TüØ= ²ïžéÀ !õ  TšÅ* i[@†B*ÊFe`) …B¡¨ ª…p1á'ßHÿ#œ=›IŒ@²jõlgV• í«ü?Hç&¤­}atq£¯>Ëtt«CèÊÃ뜒¦C¸]{LŠuZ@æI™ÂÐz®ñÀã_HY¦L*^q1õ€Õ5ÁÜ™g'{ĤoÈídÔðòøYLêñæó[WÐDzW.ŒsTîÙÊÓB˜Òã¨ìà$¦B³Åš0ìiÄ›4mAǘ¯#ÏÒR"KÀ²ÔkAèâ"WpÉÌÀâiË~ˆ„ëÀrž¬Å¹”Ò"İH¨ã,’VÒ¬¢[ûf¦Ý0©x®Ñ“ðX‘¹,hf½ Ò–EŒ€içµuIr@#kÀôTRØ?)fy­UYê¤WR´æÌÀv`©óåJB·ïÀ¼j~åÿð7^@v”#`¡±å1غzº{i_E/ºš¦½åíòíêý¨­›­^AŽ b&&HȽ\q䇠˜šÈrô‰™°˜œ€µÐ_{,SVH ¡B¡P(Š…A X‹‰ìŰÿ"Oeßž‚ü“}!­m~”^µ¿â{ðàÁÊ.8ܬ%³”inÁt3°òŒ„+¯÷Göë¥Ç “Ÿ=°Ûñ€3pÝà€àOÀ*PGJXWÛØÈ°,‘îIt{Ĥ7j,Ð`¶È+u¢a– G¶jÐ$o ¡Å¹Š%ZÜ+¹fºVœÄLòtþNØr,7=Ï9ÓSâ<£RRîi”,pdöÓÁìM)á(8î ·Ü­ÚK‘$€f4f/èf`-2öÅÓˆIn"W…ãV‹š…,‹sù3–Ì P“²šnÕÀ‰Ùò’à€4€S¡›QaÊLnyÛ³μ¹W9º ³ö/§mz…œ-/Ø/U²a3½üjzþ^ÒÒ €t¬./mJÆ`ñÞnú­oÕß÷ÁÀÿ+íšëÐ .¢[w Ô®»)ÿý YµÀT³Ö£uU¬u¨uõ0 x¯¶þõÌüûû§ÔÜS; ³?+Ë q÷}Wªˆþ@ÕѨ"* £ZÎyÿiôü‹øk‡Äô,kfijÉqߪ¢ëú]ï®øªûöí«øšóÄJÌJ÷ñ͉k2ª¸KJT„éB³LÁá‘ç8±¬:M—bÜFÜ2 ”O'ãqGÔã$÷k’¯Ž“É8('V°.@8”'-«F×MXpzë Îe¿˜ &€Kò\DFË³Ìø-é3¢Ð‚4Ãu_ÿëÇR§¯ª;ÿ¶Î]ÿÐósÑjhÉúzÖ”€=OÒ2JB‹Ó0-ÙÀj¢ËÖP<V=ˆ;ë$³ Gš@¦}Ù–0G]Êl!t3°\Ï”»š; Ð° Íî…4H@‹ÞO¢Ûã‰R¬áÔ4‚öe)hήcZÀb…¬˜³Ï”È¡èQD®¼ª”H‘5C<”˜!3Îf˜×f•%%›žufwfï_¶®¤/eî—*¥ú;ß Bð“Ç‹Ìu‡ÜH ÉrZiwÜM^;„ú†+èïù]$§Ÿío;Ü ¦Õµ ”–öX†ÛÚE<†© È"<%õ,1Ø .bO>¢Ý~×|b ~2V–âÀò}Wªˆþ@ÕѨ"* ³’þØ_bˆ‘!¤R¤­]&Åb– RÒj^pkÅàz:ÌR¦¹UO+Y¥§€°ô8?7©Æ5™Üä¶šâŽ1žŒ»S9)­…p( vŽ2±‚¦–ÌÀ2ÛŽ”K¤VR{V¦ž;‹ÐAƒ™-„'ŒþÁÖc]‰ÿ꽿õ5púÛÁ»C®N“‰loLè3š’«D¹“*•ê—ã)Ϥ’ò€2]Eš N‘ AǖÈÈHÔr[ÉÉ]Í•2]£œ°X2{k•Þ€k9òÚD¦€õÅîÇÿìô×86ûYŒ³´õ,%rüÈ%-Ë}b¼©ÄuWe½ ò‰Ëá²âÓxìÜɃýpÔ½Ô¤EKw,Á¼ï>+Ó^ç}²Ö\oÒâ¾Bw]@/»ªÌ»74¥Wš%`‘õ´Û~mŽÇoë #uv.dœÖU5v“ãî5bð¬}a _̄ٳO¬ðïpŸ!I©w¤B¡P(ŠŠ ¬êÃrE,‰³½ÈÆóHs 1;K:°”€U5 Çmd-¸ËÍ¥ÊIþÏÝýÑÐç¾Øýx©+KçeRG`ðH$œX ‚„ô@€êp²äe !€ 3æ¶UŠÀž>À~ùsÄ¢¨«§{.I49¯ÂåWÄY!ý¼¾¯ãJ@Ѩ:úUDEaÔÂÒáÜnSÉwû©.öÜSÚþ[À2yÿX&?v˜lßͺWÿ͈‰1öÌ/!íÜ,—"M-br\ÌL“öUr€1ÒØTd&ˆ¢ \Ge[å¸4VPÀr}7ù|%†.¬ÒâígÄ©&ÓÐyF–„p ŽÐ {ÐÜTï˜H¤˜…àg&͘üçX"ÞQS_àq£ #®jß"¯ÑENº–tTq"àæa¢–a’€Æ€ÓBˆ\S  $<ýdÇŸE,y~T«Ôk5Y{ÓE°íãè 7 hÍ-:0˜òö”žåú1ˆ:à ]É @œ¥èܰôÆ•ÃyuddôÒàîkGtƒ£vyÔð(S“FtÒH Va¡›qËh Õx£xæ©»ü‘KÑÿÇÞ›‡ÙqÔçÂoUõr¶93£u´,[6Þ±YlÙ!6Kà‚0\È%¾@àKnxÈMHxâ›/…„\nð͇ÛÀ¬1¶ñn,[xѾŒ4šÑÌ™³Ÿ^ªêûã×ݧÎ2£i4’Fý>úãèœêêê®îžSïyß÷×M`M·Ú Xè ñ<⋊X¿„>k*?©äFÔÞlh©êH††§’Ø:¦„YG²IGÄU¨TÈáäÐ1A¾ MÁ]WüYG¾ûñBÙÎä÷P)/?¥¹Jj_ž›`¹„€”'I`)…»†_“S1gÝ©µA]¯Êoß™¼É7Œ² ›€1h}’ ¬eºÏ+EŠ)R¤Hqª±ø ¬Ç{ì}ï{ßÐÐc}*[8pàæ›o.‹Åbñæ›o>xp®œ 3ò[w QŸõãF]Þþ¡µž< @ØK.õøCòö/©§ŸD«©¼W=|?6zmĆWÐÇ&ÚýP¦ûrñž™h³H‹ªÀ¢Ò~š‡¡ê— À óž…À"ºd¡ ,Rñ0͹ˆu^]‘RB[\Þ¶&iÜ ÝLì„@ɯѧƒÙ¯y౩CZ„v}x$3;ÚALô(bIºBÜfèûÜP´"RÃá}B܉ôL¸–Dϳo!ÉÈBèÈÛÝ ,[Û#öJÄuWYC«²9Š,9+D¨ÅYïÊ5¤8ç ±+`¡©ç:ÈÚ½Ç;Üê§ÀŠìœ[×Ríf%Y+ùMBºh6É·Ø!JêR`‘ÆÍî¦H5*l/ï qVeo%ê<²RíÈ@ÌuÕy±K’´He&…`q=G/ÎVk„é×r–› ¬@‡Ñ$1_]UÍ… q?Ó°¯Z"…ší.‚1ñÚ7ŠW¾Ž¯Ûx2ÝhÃöš]îyMæžZf„sŠ¡d[¶Šë_IÿøK®ãGð½'m!\ö óLã”S¤H‘"EŠg)ŸÀzûÛß¾fÍšû÷£Z­và 7¼à/Ø¿ÿþýû_ð‚ÜxãÆÂcªOÔsOËû¨öï™­AxÇ¿èJX‰‘PíÙ©v> )ÕsO«§~€_ór~Å èS¶q3âT,eº/›w÷Þ{ïéB7’åñqׯ )°4w–§>¼ûŸÇ5ã#5Þ¨Îx­ã*°¤ÝÄñd\ýv`RPu²Ž£cÊ`ÚñüØGÖdÄB¨™0F·g9.Æ×wRÙ`µ¿>yǃ¸0Xä­3ãÆš:Â0dG¤ Ǻ³É!X9aÃ䀘 yH4\Îr Ä\Tôp³aoÉ­Jzq†‡Ý4S¶¯´6+õß÷|á½G>þ#ÑÛP¥­6­CéNVL`k¦D`*†|Þ²°ešþ´ b6 Æ› ¬gŸ~¹úm¶tB©üŸ¹ Ý9³š¤Ý­Ÿo–¸AžbÂH×’ ˜Fé°¨b£èÈÀªþÁÚL"WlWK4= übZ£Žd¢ìk„5°ÞI`)El•­”GdÞ˜Ç ª£2©cÏ4¹ÇžzÄq,.W~>T ñÒëÅÏþ²¹“éD1ý§ša«ÖˆW½Þþõ߯¹‰þñ‹/G.Ï6l7¾€.MŸÌ ÎÆI\¢ ¬å^YaÙÏã¹€t—Òy\H'1ÅÜX| áŽ;fûèsŸûÜK^ò’|ä#ôß|ä#O?ýôç?ÿù÷¿ÿý‹>ŒS]¯Fꪽ»pÉ}ZH©~º–Pzú¤T{v`ÅAbµÈ|K—Klhغé-ˆEjlóùԾݼ\RO< Í€e€`Û¶m§{ÝHìl]©á' !m… éÍ îÿÓÒçß\~à ë.ðèÔÁ/²¶š±5C?«T·ÎÌ]š×®¥9¹Â~ ,K Ä ¬8=jà±–Ÿ(°˜PU‘ðjFFV×<þxbÿOªûŸcÏxž³)y߬±Ü, ó6Ó’> ‘XÅÚ£JX\¸Â‚l ˆ¾Q< sb; 7bV«æ*æ\T\ƒjÔÛhnØbŒŽr¼)¯aêuˆv©g§´í©FEš±KsÕ ƒ¬EÖȱMÀ€e#„â) #‹bØ Ûî<ÒLÕ?ÉzO4G¤}cÒÒ" r3t”‰Näù1ƒŽ÷Žë–*jËo…aÆj?Ûe¸(` '\ÄÅ ¹M{N&é¿Ü0 ,;X0þa¶ò+õ·]·ö|‘ÿ&[¹Åb_dÒ²)+S´:¬0V`qi+´dçµH™ü’Ç·gjˆû˜7 è¤)OgàCui`N艹jë-ïèK·Y?ÿV6Pdù]¯êj…\ý© IDATg ì8^æÀ²ŸÄˆM>³îÈÅDzŸÇsé$.¤ó¸ Nb鱤!îwÝu×;Þñów¼ãwÜqÇRŽád oÿ²®V¨}»ú6ÐÓÇ fC+ ”>|HçâuoÀ/¸€žÀ/» †Å’ncúÐù­;å·ï”ß¾SÞó]XF ¬3 ™.®…0R`IŠ0Wný+Ö¿Ü7±À‘f€â2©°> Ú)/¢´Xå‘F1NaR”ÆÕÉqm Š~ÊØà /!Ô4×0JÚUfÉîy¢zà‰Á5‹G¼hxKò¾Ë-å!Žñ&oIC4e@Öp¦3Ľóœ$XƒNŠËlís»ïCl-”<¤£ÈÙ€¢U!ÌQ\´{ØÍp/Z‚n)¬ÀCÀt«Ñ¥ÀoTµí˜–z³…¶ ©ìGÒ¤¦òØ1¹R°"–Ù›´=!¦á $Ò­ì·ûLØ:â=WV7ßÔzÓ«ox}ëþ_ë=zþ[»>É·Ø©À꼎ÓÁ&ZU˜«1@1atz)‚=Ñ‘Z*£òˆÃþÛ{p 1e¶!“ãõ#Ëàˆ)ˤHBC¤8+:îÓÁ*ºÈv+° BpžÂù…¸×‚…—G8  #>t6ËpŠAuX§˜™E,Æ6ŒÀÊU0=Ù·¼ïòÁsýgäÔB˜"EŠ)R¤XD,)µcÇŽç?ÿùæ;W^yåOúÓ¥à COSÏ<7!ô‘1x}rŽ)ÄŠ­ZÃV¯ ¹R²›ùeÏg£[¬_yW’Ñί¸ºcËlŽ­A¨íBddÏ1®W¾sø¹íÓãK°¯Ä”Ô7½û„‘ðb3q;0}Oy€‰  ŠÇJÄ_ý´Ó­ˆ6R $°9¹¸áäêQ`Yˆ#Ï)5)Œ5M¡h¶ØLhÄ%í꪿Õ××>§6¼¢tþÅÉûD`yD5q¥´6ù—™°®˜´H†8Kue`A°a­Îä¶ùjÿóûGv‘…PqIVÞr :VPEs$Yo€ðr9Û`É €RÐ4-]jW%²z•QýÞ‘_Üû`Ån—«Ñ]OéN"²¬èdh«ÃBH–CÅÂÈs§Yr,ƒÀ’1ëDå ºøº—¼iôÊ×o¼ìyC«-ÎÑ•ˆoîÂP`™ŒÌd«#°¬¬+†E1ÇmÄ´„>#µ”«3LZàªì{Úuë‡vq¢Y#*óp“‚I„˜S®¸EX¬£zÀ´WÓLZœ±a»ÓBIGdIF6\ô©±?ÏwF¯gmöàä÷Nüù‡&>5›êòKûùÃ]·}õÀö¹w· ̰ˆÀ UuÎb)Xsƒ ¯ û"T> ¿ù5uß0kâ9ˆÀZþ¬)R¤H‘"ÅR`I ¬R©´bÅ ó•+WNOO/åN”fÅ/¼˜m…R}c°ô±IlÕZ"°ÔOÀ·^ Îíw¾n†_|964L¡W&Øæ èÑËìw½_ÜðZ0¶œ¬yú™ï9¶ë«Î¿þËôOñp€–ðŽþîž/|z÷=;f&æÜî8bSØLX Zy‡2;PRZ„ªí^ì³ -År'-Â-}(n‰'QDZ¢‡ waÖ"³^訜¶‹S>x«¢!uÍ£§}—ÈËn¹ðmæû9îð™¡À<šr°²ª`a;v="°˜°·:ý§;¿ö©]? ÒÇâ À[7¿pMé"0½¿5Iú#ÍÒ©QUÁq‰*f‘£'Ãlƒr׈v¤\¿ÙQÔO©ƒ^ô8ª¡úïá7<ðÝV¡½4­ÄY#mDB‹s¦˜®øéQÈȶ¼ªa ˆbË“+"†lô©:JVKˆÕ‚TJR ¬†?åwX5^°Æ)f-±êJ±I¾~¬«²a ? àP£\\îÀðÏ/_÷Þ ®ïÚû-;ï:0¼ýÅ•Wüúù/¿ûð³·;ÿ&Zy™©;µá¿=ï}ÔfGéèßÉÏÓë”æ=´ó/ß{äãÚö?Vø ÅÄTÿ’Χ×ýÞoLÞ¦¹—ÿ_>à¯vÝýÜÐ×ϼì°>:=¼ûÂÒ‹v?à}ü×?þ“æ’)þw«ßbìîüÆþáŸPÏïÔo¿võ(€ïÙýû¶Byý ­+ÿ3ÿ­µ¥çýÉ…oþ£_™Þ àò™—=5t¿[[õÉóþŸd<ÔÃå3/+éÊØðS#3=Co®.]ø± ßàkžüVîNzsSéŠ\8׳ñ»ôÔÞÖ;^5|ëwJ‚³¿xÏHßf_ÜûÀ¾`¤tñG/¼¹·ÁïïúÒÌÐÞleí_Ç—åIbouúÿó>M¯Íkf>ø“·~úÚê ïÜòÒEÌòÀg¿1ýìÁˆý½·¬Ya®‘èý{‚Ïþ Û¸Ù~ïïFo5þ_} ºxÉuâç~Áÿø£^³ßý~vÞÖS>˜j%øÄŸØ¿õ¡è'´3ŸûÆô3=ñžH¦H‘"EŠ)–=N³¤ ¬Ë.»ì‰':´ôÛ·o¿ôÒK—r '}d :ZÁV®æ›Ïçzb<¼ýKÁÇÿ8üÒÚí(kåšäëcwÖ•âE/íõ`Ã+Øšqݧî(Î KñãØ…‰ ŠÂÎÉ Gh… Ÿêì6ÒÔ4Q`ÃyYáû=¾É:B­¾T?KQÍÐL-(m:ÊÀŒØ‘ùÉßó…Zö˜ÙÆ‚ k[@n2°ü€&eG\5ÀØ+>ïú†Ø/™eN×û˲€qÌ“”tÎméðí:[Ba!vÆMÊi‰’I6‹¼u䎔P¦a÷ 6'â4wa÷;Ë2ê²ešÔ$TÍ*÷6F _“^5ð§†vïÜŽØœJÙ*A·K2I…ç„t‹ÑêÊà¨,°ðËøêWáÓˆÃõ»àÀFì[$ÉSÍÛƒo†í뤦ÛÂ¥FhÛgJ¬ÎäI¤¦EØ CXéX|ç#à0+€ ¹h%c«¦Ú[™¢}kÔà»ÊSÓ~‡EXäúLÙ«º@¨èÐD˜IzÙiݾ„ê" ¡çÌÀúñäþíüÚ­{#Ò¹C5»±¬¡¢[ïXf¬oªià;õ¾ŸžöÖÚ6ùã!»@'gqCú–:3°Nç[ô·^OŽ'cÒãhÔÙÚuâ¿Ü Û/¹€¼ï‡K1šÒ ¼ýKg”[/Ê™4¨)R¤H‘"ÅÙŠ%%°^ÿú×ßzë­æ;·ÞzëM7‚#µû9ì‚‹À͈Wß$^ú3üÒ+!„Úñµg'x-]­ÀvØàry~ñålíún 7¾³hꬷü*r'¨ú9óaêç€"_–"õÖ¢R|´)OžøŠQ&op˜µmíÚA¾¤œˆ E´¯¤ œ 31½vÇ*Í ½q–rëµâítô`3 €Ë-h¦¹ µ& žëðì¶on¬^ÀG\S@¹\ÞUžÚUŽ\!!÷dE7•.bsbb!ô”¤Ð%KºB·Ž8ŽŠ@iî”™Uæ%ږțNjâ½L’‚ËnÞ§§¹çzÆ Dzº)w­U+3ƒØ0؆Yd4”W < Ë´6€jO­FÍBòÜYÊFL¬ìÆdud´|-«ÀA?‹9ˆ½{Ä€pMùYF–lóJ&U <ÄG‡sÒÙM{qƒ„[Ô—ÛEVPËD¤§¯"ª À®Ú$: ¬†l~güÙOŸùnþ„Ñ‹Lš-›h°bŠÊ2RÏBU!tÑ>™Äl¢“´ {¬=µ‰±á?U‘bnž!îM]Éa¶z°6ÓÛ€jH§.Ò‚û˜ß. Ù·hÈãðû?çùP]~0gF^Z$—gùxž®D×’žšÀÖm$2•_» –­ž~’l†½XÄIÔ¥)úÀ^ùÀ=‹ÕçÉ#™¬Ó[³®»/§ÏršÀÖm8%£?3pàÀ¼B‘I`¢ûÑ:‹ŽD*E‡À °Z'Q,L&Áؼ ÀeŽÅù@½ãJ1¥X¦¬‰¶Ü©!@`ùT Âb=Yà*ºÙí˜"¡ ðcÍ:˜†• Ý6s¤U`7(;Ò³û÷}"øÌ'‚Ï4‚±ÆŠ*š(Ú.¦¯T€RAIâ#"Î2h³EŽà4ÓÎ 0-¹ÀŠ ¬ˆ"4鮺0`GïäûX< ‰–4¨²¬kÛg“o¬ŠN‘ïàaÆ…  ©¼º1®èV`ÕU·NM‰Ð×±ÐL3yËλö ýÀb Z†v€ÝWÅlÄ9ë$#¾L³öаeX-ÖžDâÕcõ—6€‰¸L¡æ’vOdS†ÛCV€tãð~#Zë`k @ÀBÄ´fC“A›à6'–†AÎÒxl.GfðÀ2)¡‹ŒN…[FEr3i¡©Mè$˜B[Å0'ÕÒí|dºÏC‰âíÁÕx£Úûé  ¶ùÄàxµ»Ùi¯y>T—ÔâkÖÐGéµ2~†äøU/‚Öêþÿì»õ"N¢.EZ?y÷]ºr¦|ûWç†òꜽ—ÒI\Hçq Äscñ ,3¸«+Äk``àûßÿþÃ?¼yóæÍ›7?òÈ#ßûÞ÷òù³@s¤Çǰ‘n‚I\» ¶­žÝ¡'ê£G°•kNÃøÎ\qÅói¦¡H¶¤ ,Š‘öY{•èÉ“±Æ”„ÕDìÿÚŒM»Ž­yªU×2¬Zx| á£Ç}bç·¾²ÿ1JòÚ=·6#‚Àa1E"€)¿€K»€ÐæSõ*2A…¶æjÆkX»e”> ZÐOåD5•›†3Вؽ ÚóµÃmš‡ ™FI˜çCuQö½ÛlÿæØ3K¼ß.tZOß8lÍÈEÐSǰ•«“â%×PO=ÞwóEœDR`1ø¾îW(ù´à©B¸ô7cŠEG:‰Ëé<.¤“˜bn,~ôéÜçwÞ¿ÿû¿/úNO-‚@OM‚s¶¦'5_àW_£º/ü?ŸE«€­ßxF¸Œ@r ÍýÕÒ㥃ë2ƒ/]Ó'2lqö«ŸH•H9K™N *&ÂÈ0˜6€«Î{÷%m´tÁ„'hÅ›QNˬ.7~Z;¼køÑÉòèeü"IôJ ¸tZˆI"\YÞ´WƒWÖ0Üß¹ÉtPÕÙFè†VpÌ«¹™c±û¬ê· ú ÐC D–oR¾ŒLÕU–·_»"ŠvÚUJt[Ú 8¼3‹)ÓBhéY-„»%4hgø¢if5¬€¬, b€êJ¼yõKC}íšµ…;? ¯¡|™ûÓ­¿TñÚB' 6:¥sXHÊ):dÍ•!4{óæ«0%Ú9VLc– ,—ÛˆK:§#4ÑaíÁ{ÊàxEÏ™ô­6Õ¤ú€:Q` Lµ˜MBCú9Û&²Éö*·`îšø/(Τåç§¿ŒÛ„“`…Y‰zSùeÖ&°,X4MQrS|#Ä䯛_v¨qÉ^ïÈÎÜ#’ØêLgŒÚXcf$W .˜+KõËÅ£üµ6Eg` ZCëþ^mŸùškÊî¾czº·Š ¬£^¼ó‚0í×¼ÉÉŠµR®àø¹–Ó H`iH,<9ëÔa­twî.ÑÌ¿ŸÆaœYÖêPô@OO`+Ú[»œëZJE!m³@=÷´zz;ݯ¾æD†2=€­Û JµÓŽs„ÀJ‘"EŠ)R, –ÔBx–BORlÕZX}VÂÖ+ÿ Û0ª§&u½Ê/ºDl»aéGx2 YÍ™2 )®î?¶ëîÜ]_¯üøÔí+‘JÉHö­Õx2°³|ìöÛš<¸ n‹,rpþâU£¬'§ F>”‰€·ØÞ:%0³Á×!€€ûPíÂ=B ‡A‘0-”HÚkìÁ®MfT@y+È à¤rœS^%–äzn¼í@3Y5Bè%¯¯¶Úµ;óÜPc \î­·óbH­æˆØB+°Lý‘ÐÝ0‡ó\e­[]]´³èÁ •à O‹*òŽYà+D í ‡V_6¼vu&Ÿe.9:mØc+2¹öî`Sƒ®)R¶ZÊò0%èÉK.N™þ‘óbÇ«T € :Q†…P†Âahfjd¾à©O,„ÚP–Ã$ d…½.ÛQò²©}<Èܲâ·Ú0Rƹa€§ý$p€…¸3º‹#&ˆ˜Ü$åêšÕ›Þ4zåzg€’8 M¢ðh«‚¸ºmô 2'ZG‰`ûôø_ïúξü Àìβ·¬Ç€ŠÕ' Vtÿ NÊBH¢6Ïj4Б̮¥š qšØR(Rçrª&eNÌÉ=í´‹,„] ¬U휳|ZëÚq®(õÈÕC÷É}ïÄF¢g¦ð‹. 'žX'‹ƒÀ:ÝS•"EŠ)R¤8û‘XLJ>2†9ªòû]ïç]ÊÖo²Þök=ÙCg0”ÖPúÛߘøŸÏÎLžê}Ý{ï½óiFßq5 )àFžÊ•[’?XœÖêYPv5ðƒcÏÜ»ë3,¨Û®1%áp>\µš,ì Zú¦}Qbz>,ØŽýðö•#sìÑW€{ Ýe»‡À²UÄŒ$aC\ Ä\†PÎúìP×&UÔ ðœ£2ˆ}g;öE™Ù•РE`ÀÎtmË&m%¯íVóeH òK VÌœOoæE‹©Ã¦·+’&E+Š÷’P0,»Gà¯Î×'·¼gÈí€n€^`H툌ãÚZ—f“k¬JžD¯ø:hI€ƒn¾Ìbb‘Tç‰P”­Fu)4"ÕÑÀrzÃËâKˆ¤F¤À²ú(°B–­¸Ú[´EDÅ2Ÿ= ›ï °BÄDIFØ#¹è¶r‰ ¦Ù°›WÑtP½§ý¤°&ˆÀŠX ÍA,­Û©±¢KTAÑm˜ÔÈÕV˜*ˆo%NÛCõR2”¶üGË{Ÿzhft;›Ög[-SÙ‹²ë´Ün+T*ÙQIžEÓNÓçMyU²…)°èLÎf<œçCuAƾ´ûRB) $^ÑÓL‹D ¬É£t½ŠVÙ\w=–"Tû˜RÍIÔGÐGœý¤”.Ï€1~áÅ83 ¬Ó:ŒS¥¿S,:ÒI\Hçq Äs#%°Ž(ÜjmO{DZþë»íw¾NŸ´3O•Žj+WÞI8ææ‰m۶ͧYÄþpEª"µÀõÞ‚ âeaäxâi¾xÚGìTš?º8©de~ËÖ·}jÓû‡«&SRiuAÚ-E6àÀГ_wîúש¹ªJѹ’§€êÂ¥90ìæ(Ë7C܉À² ^µî¢O¯û½¿<ÿ×’ò– `^‹­z ,-¬‡ÀbºÅ=«Í£%z¨^+ÛOæ™%‹ùˆsÍ£<)#IJmçü!{kHʬ$#Œ¼„u£L!Õ+ VN8c”ÖdvKüW”’È! †rÛ]YÌrivX×v†wUÃTLRã¼å\¸õU¾ð d/­ ŠøÆ$hoˆ{¢KšÑ:rpú¸Biy†Ü¬Ó°³ÚA•Ö‚¶¥ºÎº/Â!)d+†­¤ù<që | ž:ÐL·ÂÓÉaE'çd*—”ã.ïú7ùÀЀa`úX ôøahM"nµã‰…Žüƒ^ 7Ê‚¤(áéEš•"EŠ)R¤XD¤Öñ¡ŽF¿„Ë{ƒÃôÂÔ¡,=~ëÀ§Þ{äãk3í‘pE䑿 Ø‘fuzxO£8þƒ£»ŽÛ8±FŽ'+ÑY¡Ô}ã #°º8©l7ÕÉP0íwrmcµ2ËË™Š•º=3Ç—ÿ€…´›W)°2õUD=0Å^&Ã.Ch°&[Û°ZCAâ©Px\a»ð¤}TR @CyµÀÀeõ½_3Üj”Dyñ®¯`Ó•QE²,O´˜^6[t(°$S¦þÈ^x= ºÊA›_Ó±«·1E‡£Dv·‡À"ưï¥BÅ(‹–!4‹Ïïq>öÏÀ²ÄmÄeXD2&D­×:\͇í$°h5$"Q^ôÇhµ3 XíÀ¯ÀnÞ¶ÿ13.¡uª1Ó¤‰Àš×Pñm>ìdÂAû…#–f<»Þ§‹y£Í:q`µ] ûY†ç=û–z8- !€Æ<ª£ž:Do¿>½à—^ !Ô“«'Ag BB¬Àšëwú©Œ_ú|¸®; xž{ׇÊ{¾«º[±mWã‘ãžX)R¤H‘"EŠEÄ9A`Ñwʃ®”Ѩ#—gÅîˆëe€ +ú‚»Ö“O>9ÛGÒ­kÛ÷¤ båU»_¨ô /«î¯=uÜÆI]3é+® ¸£]ÄBŠß^øš³cÌ«‹Àêæ,º–úc­2€Œ0+’eUpËλ>¶ók ƒ( bQÓª°²¯ÛxÙÇ üК·r/ Jˆ˜ÂÈÆ¼Ó€&šˆ-iÙ òˆ‘xŠÒÓsÜqUÁ ÌøÑ¬)½ZàÃ0ÄuÁR6€ªjs%¡–ši®VeòW5_2Ü™ŸEÑòDú° }œ(÷6ç jà 7F鸡  bðkĈEâµN ;YÒö|xè!%“,²E’Ÿ¼å&·¤f¢è!°²¢ÏÞs–ƒX!H·ª`œl}¾Œe>¸Ü^ï¬äK $[ÉŽˆé D{R($‹È»¼åÈ©6E^´¯5NûxíÊó¡‘A,9.‡qš«^‚#×O²èc;æU×»EÄä¬ €ÌÔ~˜ÿæ×gÚU’Š~-+òúÉ¡i†¹¬ªïi&-‹óXàHСR©K€håÎIX™:/Å “…¡úœ'èa¢fy>ÏñP=EKžN–Ò@b!<hqÝöÿPÜðsâúWŠë_É/¾¬«ÁÂdÕø¶i³õÚ7ï¸(­ãB=ý¤üöjûcØ0Xk±À,]?)Ãì\=÷¼X–Xú›1Å¢#Äåt—ÒIL17,[8!¿ÿ-¶z„­ßxü¦½˜šDüup™¡^>R,A™öÑÑÑäõ'÷?^Ùwe~tÛÈ/Ò<ª)gÄN/0Ë‹m;ã…Ýž ]>מ”±SLÕü&-"˜(^Çg>Œbjó„î²ÚÙÕÆMǤ¥EØ’Ð&q&ƒ22(¨\'³3!§sÈÞ ܘ³ÛRd%dª†¬¬ÅØêL€s4ßÌÖ˜I]ÂLL¨çâ‹b¨ ‹UŒÒ cæ%#›Ùˆ5>ÊŽöÕÔ^-ô˵zai@͈[ ´"¢$ ´úÕÑ—Z]uåGœf¹À‰êúÙX²3.Ýe ËÀ`…nÔÐè~¿Ÿke&‹”å‘­²KL” "í» mÄcz‘ ,©™H"8™~VÁvàEBºA88t‡‹òã]fŸ—_•ä,i’…0¡M‰© ¶QŽ4V¤ŒËÙ€VHJ„h[G2 Ÿ|~qea÷úÚà·¾²50 ÀæQˆ»f²vŸŠœÕ”æP`?´â q¦;€ …AÔ¸u$ ,Ýž\Ï0i&º¤$H^ M±(Ä]k­ngkÙo`¡ `ÄZñ0¥;¬FèÁ‚æ$ê'UnʦDÍd¨@ÁÂú¤ä/5ËḢêÒÀ°­žù]JPp{¤À:3ˆ¶b¥¸ñu³~<»…0™D=~[·Ÿ?¸O=ú€|àëo;î®uy¿ør¶f„JvF P{ž£×|ëÅ]_‡ô¡ýzì »ö”dŽPâ>΀¸ýSŠ¥¿S,:ÒI\Hçq Äscù+°ôÑÃúØ„zü¡ÜüØú9–›K4,òÔ³lË7*ïÜ>xï=Õ§@ú#¦ ,Ÿˆ…ГѲJÛþŽÇE˜¤­K¨Z¹áˆ¿ ¡¥_©…*°:kÌç;X¶!ðá¡ );–‚S²`ˆ ä:ÝdGåôt+’„4;åaÂ+  è¶Ýj®Ê`ʲb®$±’Ä8lC(ÆÝ8IoYaH4Y`EÊ^]z„ê¯~r´  e¸Õ¤‰4tãCËXVÅiœBpeLá©v£ˆÀꜗ/˜À"©]C÷XýX.·Xhƒ«¯ÈñîÐzb‘”é|L³lOAR3‘õ(°rVŸ“IX°BRK‚ (CæCת˭+ÍÔTË<¨ËP¶A`É0Ô\A3šèQ{[]MÚ=vQ®ÔÆ|t 3iqà ~ ýwu8’œ7"°tCöX²5ª·¨¸—œ¸~ëªLž)®-¿”å®Û{ÉëDž©c–S–ÀôX3¾@„€ÑìJ«£aƒªLÒ%mxTð‡žþþñ)&¤ñ«€ºŽecv*jV0ÙÕ• ó¡º4t¢À:½@5Î ÖqÁA‚îÐ$ê#cT‚l ^ü2úà¾yõNֵ׉×ÜÄ6«G¨Ÿ<¬¾Ÿš¨gwÈoßIÿzâå#?VcNà¸æƒ¶ël˜©ÆÒߌ)é$.¤ó¸ Nbй±ü , CUO< y"?§kR`­Z³ÈÃ:0ÖlK–8Ľ 1í’XB*ЫGæÁˆ©šoϪÍkLús%æÂ¨k¦˜ª†®ì(ÌHKĤÀBKnu 7ºX‰VH3ÊBjvÆ!Sí³•¢ØµàŸÓ%/âZaøÃ#»ÿ~÷Ç5ô8׆œ6•×D`q«­ÀŠ@ªiµ‡:­ƒÔ˜Ê ·‰¡{ˆÆàã¹³zX˜èHá “À ”Œ˜)ÞGåD`Fð|Få¢7uûM»•é‘D®Êhñy)°³$öÉ÷ÐL±+D¿Ú‚ì QNHj¢ë ¬™cõ9™Û†fšËPk% p¢Ã™X!€,·r¶-¼\²mƒ¬xŽÖXÃ@5ã©€L¬É°ß¼ùªOnyÏ–Æ¥ˆoºŠŽËB¤ðÚ‘ËH.·ÅYŸœ[D ¬^ aÞî`ýˆÄÔLÒmè<&í¥ä·è`M¨äíneW ºfÚ ª¼<‡…°â7XÒ°.; °:|‚Ä&ÛÚ`zTÇÕ;3·Åþ–ê­0œn5j9<£È€Ìq¬O(ë$µ`‹?þKÑ:,qÆd`0K–ž¾ð)¿ôJªÃÖm„eé‰q´š}7騼\À†Úedùyˆm7@Êðk·éƒû QÀ†VÐÓ5^}OmTÚbGvüá¥X)R¤H‘"EŠÅÃò·¥ëUµói¾õb}ø Ý2÷&úèa]«²5ëØ@q+°LÒj‰Cܽ(ß*Xº,„‘Ôb¡ ,Ý^@Ö•7GKþD¥e=ðÀHEÂ11¤úùÂfƒ¯:ÂÅ!ï¬Ð×¶jFéQ^çR°Î«ÖdËo ¨\õ¨œ^6ÈåËà+úkj°åögë«;Šßi6è¶½‡,€+‘˜Èr±I´`Êöd˜ `$3Òâ±’³âˆÔ“vtV=P;1K@:ã–BHR`eúÑ4S””Õ1ePBD‘tÉâ² ÏÀÊ À³š Y2kö,äš®D=tèqÃ!6ÄQ'LÚ½¤gÁq™´¢öÐÃý1%úþ¤ÀÉmjõÀª2NJ£ä.&¯_F8²Þ`-‹õ(ã,V`mÈ »ãš+a# 0Ù1Á8âXzždÀ{¹Àò)"mM¶ðÚco°™xéÈ–{*wƒi‡Y‘«–ô!À”HÈ—«C%)°Xân¸}yè*§5ã5IeÊëBѾÁ»ÔLkùª£z2,N36„Ù2°¤ ¶v ;øÐVÇL5¥ºt5Ó¡ÖTaó@½D·ž'C§[ú<øpñ‡#3tëÍôŽÉ¯¹:ã ÏÀ"yZòT<íhçŽVKE!îg•‹1]«BkôÔl•wß…F_r…õKïŒÞ²,¶n£>¸OÚÏ·^ÿ™0oàÏoºüu/v3Ô•ÃÅóƒ+’2± Í¥:OZ¤Õâ= ,[ºÊa“#àLšV'­s‘½ÀX81‡«¶8* èd(Ë7{iiº¤š¬0¸iFNCo⦥ü:3°²:GÄñ‚XLavã¡ùP]$–ÕÓ­ÀÒøì}ÆAdsPJ×kúØ„¼ç»Ñ¿}ï‰;nWÏ<Û±Þø6ˆö=ÈG·`>.ÂVž×E&Ûõ =9Ѩà7ÐS ,I6C¥ôáƒ8Pç†kéoÆ‹Žt—Òy\H'1ÅÜXæ ,’_ñ .R{wE_ÝÌÜ› ®Ý£'Ž@)=} Œ-KËT`…§žÀÚ¶­ðb{`3ôIÚ@K#Øúl=yRʾ'•,:™îðoIưf`š–î f¼æÿRÿ 5>0’+‘º€f* oÖŽâž°$ußw3óºYº¬.U ')¨9³ºØ±Ð­Ø”*ûM2!YG7ÈóŸ9&KIÉÊ[Ž+Š…3­F;7MåÃÐul‰ÊnÏ-òM?`/¶Ã²¯½‰Ëú(°r=e‹ˆÀ²[˜É•6›ËU™ÄlÖå†à S@O±´HŠEcÅ<Õ\–ˆÝj\:¶q®Ú(dw0Y¶_öùÜ(ˆl2<®,‰HÚãÌRÐÐE›´è!°ƒöâqÕ<îgd¶†˜Çdíý„ÀXàØ2ã zÁ¥ úÄéXL©—(be`çh¦Px0Ê>rƬæ@Ÿ`…ð´¤$>?åsI”\ƒ˜èG`ý×ÜëË~óÅ+G-ƈ>n*/Ù¦Dãœá‘‹îq“ÀráVŠlª¸j•àTÂÃõb €±p‚vc®•ï<øÔM›.Gl+ÎÄSÉCGаâ7‹.Q—9]EK:"°ºÙWÊTy U©!k5†WàYÊžë›fõè±±i¿~ÅÐúˆXÑŠk5,´–Å.ìm Œ,-þï.aâNÅ+OôÙf!ÀŠE}ô°®–Õ3Oà/z)Ëåõصû9p.¶ÝÐÝ~Óyô¾Ýrßnþâ—‡ÀîýˆlcúèH‰Fr¶b¥>zD~ókjïÎvË¢®VôØ)‰ÁJ3°R¤H‘"EŠ‹ˆen!ÄL [·AÜøZûçºV;ÍäWôBO.Û,K,9EA6 ! ú&V„uŽ„+Õùµ7p«¦‚Zßž)»Ê ²<ÖA`ñjpWã߈N×LFb"íP„TZ',I-˜ïj­Jê1~¯+ViN&>ßP`¬Í°¼€ÛY_º´xì|Þ(8aÀ4r÷ë²íË X`®Š…ìàV6†Þ¶ù…¯¹À&bÈ0©Ù}ÁÀJs+hüLq‡sÊÀ’<œòë,?@ ß×íü¬^äz¢‚|PXø\¼yB£XÊvXû\% ¢ØUêqá ¬¢Õõé¿YÄí5ë æGgN“ˆÐ#S –J,„±‹“Y„t-åà³[©ÔcSúäöµ'R)ÑQ**i„‹ m­Ç +saTÛ%£³¶t˜ ²½9â¸dR†D!éÙÄ5«7½jýECnñɬ)€«¢3ÀÂî‹Ä‰,u’8D“ ¢‘uÙ"qÅ™IzÎÑÅßuÙ¯«8ø„,1!a—n?°ýïIzM¶â ‹ ,é¨íñ2.sh²Â˜¬ ª‘(°>³çæá+4œ­¦«(rcPL÷ÆÀÿËÌ÷¾êüë½ÇºKúmkNjÔ²GÑég\,$?{ørñ;Ÿ?â ,à,¢EŠô³;ôäQdsÖÏ¿U¼æ&ë¿)Þðf~Õ‹ÙŠ•]ÍÙÐ0+FY¥éÞþ"”KÐO×e+V! õäÑH•ϳ«{ůy¹¸þ•âúWŠ7ü"}è”"L3°R¤H‘"EŠ‹ˆeN`éZ+ °M籕«YaZëÚ\ÅéôÄxôÊ÷õ®g`¹XÆú*<õ!Á¦ŸYY>â<ãVüK~ Uò¦‰–Á4nTI5#«}÷â#àÈ€uмxå9¦Çx†ƒRAyçÄ 3 !«FA±ºì.©6(ЊýSºa0L ¡â¥/áH« +pÆþèÂ7¾•ÿ·Ã€²ˆ–1•°M`ùÌ3cæ]Ýß$KÄ7amUŽŸê´Öò„9’6€œ ÁKH!\¯@YÉUœYÔ×8F\)Ð&°f À‚¡À²”ÝV`ü…Õ`*Ø ÎÀ´Û’:Óéi‹þüZŽe“ƽ^Ž‘AžLèÒd±øÐ’Ä.²Z¡ëjŸ%M ]*M®G0‹$Bmꙇè,H“…Ó$°U"ôdˆž’ˆ‘`J„0*3^)–7ŽêÑÙÆ D »†l!NÊG?/m†Î³èœßd«†òt|°–_°næîgTý~VèZL¬+TX(Ñry²Uÿ®ønW9 +Ç#‹äŠæÝD ·éc¢ÀjZÑ_ zn4‚àéÂcÛ§Ç»64UW¦z´hQ1P—1â ±fÏC&ö Q }C"ž-M*§]%cq‘b§[¥v6)°øó. ¼¿ð’ˆ~cìÇ!·ÞôË}7oúeûÝ KS³u%¸öQ``ë7Ðû÷ `;°"°°¡ÖMo¯¹I¼æ&~Ép]š"ùùâ"ÍÀJq¶`Ñ'ñ¿9ý‡ÿûèÞñù~L±(HoÆe€tSÌeM`µš¸$r‰â ”çr& ,ÄZlÕšS7ÆÓSµ!™‚Ài±çÅ˶@‡èhb2M{*QúlYÏ¢ÀÒ!€œÊ£S ÀÅeç:Ø5WéâÂ!&B1Y5tÍp¾ß?|à± ª·B_V´Ià˜Z†É  ¯’wˆ*±ý,€†ù˜º½ä¹oÊ‘œY }”}nZRÃñŠ]“Ðn( @β(΄ Y•‡àªÎ˜]µÙÌ Äú86;M#Ä](7“ÞÃŽ™VL|än!\áäÛÃÓæié/ƒÊ‹ˆ‹é æ5#œâL,Kud`ecm¹8méeÓ«lJ `hÉ€‰ã4G‰…PS–I`i ±×ä×VñH¬‘gY! I™8£ÍYü á+Ö]ðüêû·vÛ: 8€¦ö`ÈÖDÏI³8O„Šȩ̀x²†jé¸äâï^øš?Þú&Ç/(' ,ƒ-²•`ƒµ@8PB,÷øÔÁÿPn3!°<´ä⩤y©…í;Ýg>€¬ˆ,„‰ÀÍw¢Y¿qä)mù÷•žM6 XˆØÈ“ŠåëK—n-¬F|÷õÆÀSµÓfOÕÔD4ªf©eÑ7$b{%ÒÑ„ ¬€1$?{xút*°ôY¨Àâ—>Ÿ­\MÃå·ýïÛ¶më­Kmrá%lÃ&0¦g¦Ñ#Ü#DÂÁ~ ,€­Û€â®X.1Å/¿ª½_ÎÙúMÔØâ‹°Œ ¬Eïû B𨲠°è“ØòuÓSsº>R,>Ò›q Äsc9XºZÀÚ‹s :Õ•ò\[MÀ†WÐ3ÓŽ[Äú,ÅéÊÀj†™†Hw„K%è^ËXïòJô¢Îê臀òˆŠF?ÑŠ+È–+¾ç´‘f*ɾ±£Š{aÝ ° T`Yq’ºÝ«ÀŠ ,akqá3´¬b=V˜‡QŒ,"°¨PšðL)Êì ,n¦&[AvXF•…˜tÓ"¬ª&€,²DH5Pé± 6†‚‰HŸùøÜX ­¦Û ,³®ŸkêJŒi…ž²€ÇŰÛV`™NOgÖOX}¬ŒI`Å ¬|œ›fi-˜‹ëKYæÂÍ1}ËÆQÞ ™`3Î"‰*¥¹2úÑI‡™Ö:7kX@€€L¬V§µÓ2ˆ<ŽYÖ Jò¢ .³I|GÈn$—GØñ))¤Zðˆ¸±ã‘éÀà›Ì TXb°‚B €ÖøæØÓG‡ŸƒQÁc>€¤¾§­2Ì;8Ö,wHój  ì{¤iBlø}8xÀ.´KšÒµ­Œ!Ñàß6øÊ?ºð[W¢M`uS?”h>â}Ž-$k·ØÀâ"aè‚Ó«ÀXg‹5sqÝô‚_té|·²l6P„”³~o¡äúZkÏNÈç$ ,~ÅÕ£Û0 @-~!ÂÔB˜âœ]ügÍ3*EŠ)Î,k‹¬‚ƒ ("–ÜϺÕä8~éóé¿üÉb8Ö IDATü‹ØÈúS7ÈÓˆˆÀÒ ³NãÚ‡vñwÝ6w³Râb €X4ž^–5D–gõW`…,PäyÒêX&Z0½}úp$ìR€fš2˜3Ì&‹ŸBhê2æ_3žÖœ–r¨ç„ËHk+°UCkKAÒ­ä¹ÏÄ€8Õ+ IÈQ%fGÿ¬?•ãDqKíñ$…ó†u÷⇳De!Ž×\Öd@Že(<¨eÕ`艺`1fy…¸@HJs²! ÅæÀIXf¨¼m+Äh@q“¸™'VeÚ ,Ó=gºíL­8Ъ'˜U’Ýi–]‡äæk+°¬¨‡žeyÛ˳W‘æHÌ^Uƒ(0_:q':ŒÊäÕ=6=Û¸ö2FDצl”¶3`åHHºEç¼X¬}N¬…ü¥ ‹¨Ï({Ë&´×K Ch " …–bÚ‰­]µ°…n%R`ùÅ)¿õuõmú4cú¼`@DóBýf¢ñP9á?(•°¿VJR¬ÍTЇÔÆK^´-RP¼›À2ùPºZ=ñk-Ý­ÀJ¬e`MXG¢! aô—"8X⬠qÀ¯¾†ÙèdçU$ÂðJ˜ÅE¨§&ÿäÖgGÁš ,WÀÖmà×lãW_Ã6tÙº ôøØ6?$󳼫¦H1Ò ?EŠ)˺ a€e¨KèWÊ9X¾¯gJ‚]r9îûþòWœÚAž>Ðò†IK[Á¢XµÐ« bA:£\.({Éú3„‘¥å%÷¤½x†üzJG+ÉÀnôÝ -#‡íÝ©Àòe˜\ﻚG‡3yÐás_sIÖ¡ sFÅ×T=ô“öÍqÄlH¸¦„æÊÖÝdGFØÄrp ónÖ!RÙ `w®ð[Ì`‡YÏm&¥ YÖ_µ¥°rëÄ W[m®*©‡¸ÆêÎO1‹DVÞvhÆØ!Èo5 r~±’­°”í‘Û±ÓÆØ‹DøãÂMÔjfȺ©À²ƒÜÏ‹Ÿ³˜þþöÞ<\’ì® ¬?ãÌÁÅZ(±ÂëoŒ_åÉp%JË)°ÊVtߎ}÷íØ࿞]D*jª”¸ßÒ1æ“\°Tˆ{CEè"°Òäi"øŽU'䵪ˆJS,¦kP"Ç¥Ä\+R`¡“wpi ´e——3‚nì :ÃÏRÈ·ÉBèÙŒ[I0Ö¬³,PpXîL à¯~Ví­ËæH\\жƒ!€Q¯`¿¸¨êbIú,¢Ó«\jκ”¡‰ÿâÚ%›~øÚ³o;| €â!ÃÓÆd Hißh˜¥=ÑÉ–"†­c˜FÇ\̵îõ¸ÉMªi´‹Éšî<ÁµC[R,ÜvlÍ ÓÏ€íµ8”’¿ì»‘Õ;÷ìÄ4ØØ„yþŒ™fGOä?k5ÍÜ,<¯o©™R™íÚk&¯@©€UGä[¸ÇQö`®¬?å¼Û©§VŽeûqˆ­uìÄïû€{ý§Y—]1(¶þŘ=qþ“?scZ²e±õ;qˆÍŶR`Åš \.±fXËXÕç? cØž}|ïlçn ^½)A¤ù¡TŸ|!©ÏÕÇírþ|®±'Š!R`¹sz¶ßÆ•^ïÕD¥¬üfÜ«ÍDMxfd§n™; , ®[qÖ!3LÑ " þB³8ÜÞÒÉ볋³9ÿõG'û–§h¡%± ~—Ë©o„D`µ6¢h¦ÕhÆ±Š™E/Y³ ¬7ȸàLXŽªˆÞÖÉÑï=ù†;ú÷޳•(äŸÞ §À2€dŒifh(rŸ"‡ÈWUêO`UtBS•=Ršˆ%§Ç˜ôT`¥&nÄk÷ßþ=ûŽ/±Ã¥ŽekÇG§O¾ò‰sÇ_ºûHÏ?“Ö™‚¡{Uè넸C”¸ dáoŸûø…ñ'_0ÿå.û©Xt€"«À¢u¸„ä±G,’h—ââ"RYãË©rŽ”»,«¸é„Ð+ 6y@Iø¾êËýÔ'ØåñøÆ@ÕT`˜ßÉ KEwIÆ`©o–æÂ–…Œ 1jÈZäÒ ¯4Æ EÔ›žƒ/e§U–îñíKb7§Àª¬W–ÂËoiCÜ]XaÔ+A#æmZòºØ~ò 6U]®^WXð°Ü÷Tx:¼çËàzïì8öái“‚I{€q?¹F ,0e¦ù¹LñŸž|›æ!€²ôHù©ø?œ~ø‰êߺÅZ‡Åy?TyÍá¿L–žOöÌc†+m ©4 ÕØ9óB d=ÑÚÒÍ„‘VîÄ·cøùßk7©:„)aÚŠŒ‡Âiu£MU`¥CÜõ–»­ZAÀ‚ŒË»»s`ã} ,}õ2€¥Søm'ô’ ¬¾‚íÞk._4W/±#Çzn¢¿þýÔüîSü;^´t›Ó¸EBÜ—íÇ!¶>Ö¥ÓÚ™ó‘©ó“ÑO¿iâÎC+ŽébÕØ.cO™Õ²â¬[Û¥o¨G¿Àg{/{7 ÛIe¦®ƒ9¸}b!Ì+°úYÕ_Z‹W¼š„úìð1þ¯­É[ô|žTZ?rþë¿{úágæ®÷ü4Y˜1.©çªg3˜]°J¬üwC¶R‹B4˜æ~s À•æ"½Ÿn¢ZlÜ£ÔpW° Ùª‹1’E;客$û&É]ÒBÑ:™à|Ž”ü¢ÐweH®Á5 èªÐWò’U¨0‚¼C„m´éTP§¤E@´ÄÏY•Œ¨ñÜÚÙ„òIóU•c ”¨mš©vYíÌàHÄý$ʼÔ¸Hònìö†‘j#’Û‘/É›»#yPêE`!å(dk›Á¼ØL%4ºäQúÞ­ªͤ.’ÜXÂX>R:²²·â{Yr•F&¦Ò%á%D%.´g”³aüiV±WFc)Ñ%æeǪŸªö¸"“&”J´¹Æô:iÌJƪ<³´ó± ©¢K=+ðŽ`ªGx”œIWX\„z| À‹ŠwHÆ ˜©GalŒ‘!  ’k„ä9ojfì̕ʳ°ò¥Š—(°æ£Ö£€ëc³÷ï˜;Š!ã À‹wæQ ‚Æt«KÎhÄÉ j|ÉÀ"­®6?rþ럻zTÔ‚XV:ôDÚM{õD3î°`j#BÜ-)wÑm7ÖBH ¬›šA’efgº?¡È*Нêv›¨––$°\âûsO«ÏZ}þÓ¦¾˜Û@=ú°þÆWÕWVݼâ~³wÔCä`2ÿ7ÄC ±Ý¶Õ>­¿ñµÍnGÛŠÀšžU Ðï¶Ø/Ä}¾ûNÊÔõég ¥xåkèñú·À_±PbX©<ô2îõÄ߯}ô‘§®ôüÔ%¶´â¥Ö6.2™¸*gE¡÷îr-‘ÍÀ:³8@¶ª¥¸ `²=à[³×ÿûõÇÜÆ:Q`ùä›;kÂôjPEé6I 73 / ƒ‚Ô¶tQ0çs$Ww:òŸ<ÿÕß=ýðé…™ˆÎª‘´8x~ÝpIÁùŒÒ£bDT-4qb!LëeV!-Ñ^ €' $®%-æG&Gö”FŽÌÞwbþ…²Kfè GT+yMeéè¥âõf|(&ÔigMJ/7™ƒ´´KQønñÏs-´.fV@¬t#0™õäÍ>BÉå»õ!åàsz.§¤#Ϋ“å­xb!v)4%Ç•=™.ay-š°%]ZûÓ­À‚­' ¹ŠAÂ\ÂU†¸ Ãhì¥ tI‘:!ã2G`•Ù¦)³.’J #*2‹(â-bÕüœ¬µ Êè,òI'"áyÖÊ'ŒøÙÒ;ÊüèÝc{ºØ{K•_:ù¦÷ž|C÷GNåȪ%§½&€Š ©Z‡U¯¯iÑ™ÓÛ°”ÉÑñteÑWÍìûkšÁж%ir°Ÿ €ˆ…^\ С՜Ëõ#)}HÅ”\E£)°,FLJŸ’ô‰£Q:cfìɆñ§ÉÓRõÈ#,Ëp•(°²ÌL+°øŠ-„”…WõʼïI`9þq\f–Ö?€æFľîÛ|Ÿ"'ÅbvZ`6lnÄK¸HG`-ªx>,Ո™° â¼,¨Ü'I¥Àu[džk*jIöÆdò16¸ ìx˜›µQî($bßÒ ,J”‹LêÖuè¶§ø4ÂÔ”Õ3ËMª¤È£2#Öd §‚Œé°•7¨-‘E¯7±!ë€îNÌŽs³08;´6×®`9 !ù#?éýƒÌïºwéÍø¾ƒ` c›Ù™è?þßê±/ÐqÍÓßHÎu .„Gªƒôvïª%±l?±õ±þh܆¸qØ^ãbS_¼Í×7ó™ÐÄöêÄ­ S_$Uµúü§Ó¥B»¥ù 33m.]Øö­Û†À2 sˆ’û{sm°›§Z^—ã>?—ÛV?ñ8þ¬µ¡ÛD`‘Ág@ a,Bô7³¸÷{*°zè!zÑLE&‡qìXôH¿ÛBÙìªëÑ€Š®Œ°*€YUûÚô•ëcϵxÝmLUÀŠÒ—ÚP‹;ÇR© , EŽBaD’Ö,Û*žG!놫¶ ˆ°€j²`Ý|Ñ 3ñb”ˆY1ƒ…. !¬š‰CTE@ñNlŒH³@!â@Ô¯¼.!] ¸€÷‚‰½/Úu¨ØŸ²+Å)1Ùq `Ä+TY¹PÛ±sîÄÝs/­ø}5_ûË#´ÔO“>,¥sGmVT.žÉñY|m3X‰u)° óûÇ!K Ë Eÿ¹Ò„$€"•MX)È!J÷D}ùMo%l¯Nܲ0 óñïÿ©ªÕ'>¦¿öøŠ¾®>ÿi4ꤤØj"¬mân¦;9Gæêeœº¹/S[c¬’É…a#£fòŠ©-0tT÷fvÚ\< ÀïXæåÍZÞxFb` ¡!R©U9Ä–!j/é/h¦¬y-)÷HŸJnuX¶׬ªaÕqQ°`ÿdös3¡×ÑÓ‘d£,|ò©ÕS™û(^A‘£P€C pEÖ¡ŠWH,„\QU{?.ÅXHù)ª9OáQvÕ¼®“kÌcòí}[#Žöî«¢ Œäe/@%Bº³%ÈtÈ·U`u9G#HHgñk3Óåà,„Î'R)QU/øéã/^¾ì~8ð’Æ«0t$6%¾¤Ëº"‚¢³æþr§Àšj,”™U`9²F/ÅÔx*hÅ^\ n$TG`õT`‘–m¥ 6*b!¸†a)I`ErÈvaÀÑJ†À*8–a=}‘TO@‹˜*äòÚ¼ µ‚ÑÅSøÁ~ìUóÑR¾PRYf» ysW¾F‹Â¡¥X‘Eج¨PÇà`Z¾ôÇ"­§rÜ~uçO\«×n;¸Ëîʰ·chHx©ú#ÙŠ3í¬@’h8²E30X ŒÄA{$óŒZeßP,‰Ï² AbY³¶‚$-ó ¬tPzºë âŒ"öµß잦>~éé¦ _½÷ŽÑþ¤³ ÄÚ&Ó*gKÔ];¿‘ Wš`ÀÍN‹Ø®ÝffÊ\¿Æv%[35©þ¶¤pe(ÙØ¸xÕë)«U¾ãÇô îWýc35©Ÿ}ZŸþ68/•úÌ_é Ïó¿bÀ½3°†¸e1´±,ˆâ’!6ñþ®¹~íÙÇöÐO÷ø“êbIÂ1i¼ñ4â°¦[|Ó9ÿ9!ÒBÜ‚åj©C£Ð± !aë'’¶®Ú •R•ÆäpT`r–™˜ÈtºØ›©Ùr!ÌNÅ)ÕUÜKå&U‡¶Šp#èÂiE™©˜ ÚradVm#§ÀJ¸û5úׂŰýí9ÝØ ^™©õÌSø/áwÇ:6¦Ã^¹wî>ÀÌÍà÷=Èöî‡ôÌôu„yÁ`O¤We7÷ m~b‹cÝ;Ѥþ;Ä Ãv¹¿î‡_÷ÿÇÿíO?òçïùg¦nv£¶ ¶K'neñŸÝu Å+WÙÄN„í4@a¨þâÿ ^ÿVþ/çü¥ß…r:Ý{ll#k¿ãHÏÌÍ Õ\fû"°ºT0Ý ¬0Ôgžcüö[ŒÀb¶>š@5×N„Ný¬È 6Â^k­Ã‡Ó‹˜¥ªû©Ø¢“«ÛBØq&Š€ÝÁèÝã»sü=>ûo—x»àjcÖŒcõ)€–i_mÔ~ýÙþÎsME*Û§¡HK% (­€ˆ’Õ,Lo¨°U¨?3ö¥¿m|#)•ØÕHZìµDŽâõ©d—Þ¿d¢(=hn¸&–f- K¢‡ë¶Å{ _xÃÞKó¬Ï¤ G—XO–°„NŠÀ²ìL¼*þ%%¡±´QOx–+IÈk·Loãx+±k[7F¤#°,‰¹$µ4œ‹ÓµÊå‘QZB`™ÕPDŲ#ÿ!'cÌâ盳ÊÑXî+¥Ž…°ÇézÊÐ’ tYÓ!î[A›Eg¨,3&“õž•žTw¸7©\€òZ_ð?׋ÈÚû\Ò-Ýn¨²5ÆüÌ¡kª {z‰´"»tb!däâ´#e¨5LÓU„Õ^EIÆ|f8% ,£ˆK&ù5eäNqJÕ3yÐMª$6Û>÷,Á0…>\X7¨y™oÛc`3°tWÍÄÊçŒÝ ¬îNìÛµ€¹ž”¯1³3fò* EùÖw°‡6´yìð±ä®Éø=/€¬:cèᲸu¬Aúqˆ-ŽuïÄ¡¸fS0¼o ;qí ‹¤?ءۤÔúñGÃ_{oôûÿ&÷Eõ‰?3s³ìÀ!ñòWÑ;âU¯óß÷¿ƒ137ƒ(4—/¬¨–ËF`ÛX‰Àb»÷²ƒ‡Í¹ÓúÜéîG…™í¯\€]ùŠl‰+E`éÓÏ ŽØ¡Û’»´[´˜¡DêABÜìâ*Ìòáç¿r1œ|õø©î<ÊÀê±ÖM¾ž*¶ÕÖŠrµ°Dˆ»ãÅü€}Å*€‰Bé}'ßÐŒ_ý+ç?X“í…»°‹êyqMéé€ÚÏ.N^êräßQ!©½PLS6¼`ÂåԈخlµÊ€щ—Ö,VèÊqëºØoÄqŒTöyOÐê×FzKcOHÌ- ©šqn‘VŒFÄ5TG;C×ãÒ­—>âJá7.|Ýd«Ë OûѪþR ,âþ˜æÄþpí)´»,„IóÖh!œÊÔ*GÐðU±KÉw­SOØV9 TIú°ÉbÒ¬†¤!¡ý¬ ‘(­áÕhÀ˜ÉXéÑ•Ê{Yézq!FMù=XA†ÀZ‘+ÙxÙ¡B‚¯zXäÎðº§ÕÕ@ IDATy~Ì/ Š«‹8eØ-O`ÉDŒ’¡¸”*ˆ)9gJÒE`Q·àtaD`x(² ±hFša[¦æ‰ÈBØŠIº•U`ÑŒJt¦Ì´uÜJ1S‹KX=X'7©:´U’´„­ìTL¦ÅžósÚX¬ó§% 3ÎKxãq“Y»;±He-„‰üêÄù„„çü®SúñGù=/=T¨T0;Ú"¨ÔœÖÇÝÜUêÇ!¶6†xs`ë÷ãùOþŒ{ýÉÇkŸx|ñ%w—~è•[½Ù7[¿·8Ìܬ¹r~ÀßNï°Ã·á‰Çõù³ü;“cså¢Ð\8‡V…"£>ý—ê±/€sùÖwd̆žÇª#fa^å‹ñÇþAÁÿ•Îa ØšòˆW‡í£Àš™çlb'¿í8sîô2Û??r4ÿA© dXúÛßÄ­ç„]Ì ®ÀZ°•¶âTõ¿S_{nüË__¼ vLS‰VòuцÕI…*r«G²vûAhj­½ ÛWîLjEéº`*¬hÄ1ìr½Ìm´/·fnËj À@Qk…õÚT²f&VHË€tàQ•0}¦öÛ”y¼´KÀƒ]ͦU*NUðÒÂÄ&Ca ~jÏóÊÂZ{•;\5aá‚À]>¹*\Ú6*—R`%[ÚÓ’p9–ýç-„ÍÀâŽÀZý‚PØSÔ9{ÂÙ!}XÁ‘·J–ëÛâÆP>%â)=`·ÌGA•¬þ‹÷²&MUdb¥Mx©µ±d+8-ŽTZv¨P?tjäÎ+Ôvží,’ R:'µYÐ_<mQýÓËð§iE!I´¬…ÁªMi˜‘/˜"䙑*¢ …V#õ7í'þþ•ù{sÿï©ÀBÛg(n¥RÒ㬅05-GƒÉ¦ˆç’H¦µœ[Æ{$°êvN‹R‚Ù¶Š`Ϙáj ÜÄ ýB°”½ú¦+WQ,¡Õ4‹ ¸á¡ôü–ß÷`§1Ù§€K@oÖ(bˆ-€¡kˆe1 qb# ŸþŒá'ï‚[ !þä9·™¼ JéÓß Ï<ýûÿS}î“à\¾ãÇÙ.Üøú™o@»e._03SÇyã±,›¬$Þø6HÉn;@/M`£ÏŸÀŽË}Ò­À2D`Ý~Ïz¶y;€´N‰²cË-®âtm,¯€Ö`n‰ÕÓíâ D@„EPÅ.çI!íUKÖ¥ú<˜áaIf‰ÞŠ©˜‰P 9€(h)4áµh„Š™ M@±ÄBè1á#¾Í“"ŽöB;S–fUÌå¿4R¢†7läS7HxB¤@:IIŠ×éËÒ© è×-HÅcùLR:8º¸×GX”l=DÏ*°Vá”ö£-©À"Kh;á’Z-«âÎõ¹¶lg!¡N\V}¿¼óAàˆ§ +Ùºõ”>N ,oUfÏbjD K”–beÃíñó ,g`dý)3ßtäHÎ.JÈT!\’ÍÁ‡e‡ :%ÓƒÀzÝÄ ïŸåëä+sïç¬bá!‰LÛ&lSªÈä^‘§˜Ð0‹T~4×ÑA² 2«"ŠBÞnë”LIÎ/ ƒt9Iè›Ø¹°›q˜þnºj*² ¬t û Ôyn$Mb͸3Ç:±*G(°¥x^Å´`Z€™v¼9.›L5 ’úƒS“ˆ"}æY0ÆNÞucÍOÜÁvíáÇ’§¸=+áôCºsn‘žb›á>úCôE”6#C¬+Ìù³øÉ;Ý;lï~Kfv†B-˜ëWé…þö7ÍÜLü_ÿÀ\¹ÄFÇäü$¿÷¾î}²‰ô™g“oyVýÏÿáþyƒ±,!Èwÿ¬xÙ«ðÃÇÀ¹¹|Áeˆš¹Y33~Òg¦&Ѩ³Ñ16ÖU»={ïe®]1s³¬:ÂöÜè¿cuøÀéG~å¹?|uÅÙJ‘¸Þ Xj¾ìW\¥­˜¥E~@[‡p!V}Ü.<ò½0^@ÆEóqÃm ûÄK‘rêjs€æ×ºUV°hê°æZÞ—½@ÄÛ³f.i• øF0\ÓÒT c!t éäfì-tbÔWäs×i7D:†¹,`9Cip+µ~NÊ fõ2Ë@!ETB–ùÆX–orª·ÿ\Q²‘ö£K)° Âg‘ï‡ o˜Þg‰G3­ÑB(9çQ °*Ùµ(°œÈÑm>çïõ~î½ÞϤ°SVƒúÄë[žr RÙ9+Ò x±6ºâœ”-ù(zýQt=:§€RV¤X_<ØuÊ€ ¬ +wtߎ}?süß{0¿Dç±/ší±úŽÀ2!€ Ïð§2u¶Ðrûdà" ˜<’é‘ò‹è! •Y»¥;v4`g¹œy3 q‡ê(°T”Ö«¦©p¤fTôIt“ª=Øþƒæây}á,?~”Šþõ?ƒRÞÏý"å“ÁúÙá¼ü ] ,Ê’`·ß½)ÎApÎ\˜;óüâQàø:î¶eŸ¥Ój³»ö_7ê*Q`%$0ÕªS ­ F §…ð¡‡km¸‚æ¾ZYËLB]¥ ,ÃÀ É&Û‹(¢ ò9ec¢`ÑÔ@‰Å÷áƒäda~Î,.`qUGäüdßûj6ž ¾4 óÌÌ´~öéøOþˆŒzÿðÛ?§¶ •?r\]pEA0 a…'@§È]»"cJ’ìB³X[/UKE+[ê †Ý^ÝÕû$~üèKÜëîHÍå¼$ ¬­Yõ ´Íù¿Ö—äT9U`y«Ê w!S, –Þ2Ê{Êe0¥ª®UCúÒø¥ùðØ®i‡kP`ÙéTlžfý¤ñT¼ZÐ<6ÌëÒµq€iaDÌûI%ÞùV!K,JÆ’¸nÀ_YVÒ)ËÉùD¡‡p ¼ÞÅwí=þ¡k‚¨s9@•¸ BHå#F¼ åé΀ y€gÏæß½óÕwŒe¦¬zÒÔcR ,zìÁ0Zë¬?ñFâµ8 Oð}ìpW¾ç kIe%X©î¹5:jˆ!:f` ±,†ƒdˆu‡¾|ư}s•^øÑãÊÆˆ›É+Øî}ü%ße.=ošMþÀ‹“ ð>HX E62šDhê³…FÝ4êhÔ—ÞÃ:b[Xìè üÍgI—TôSmH~ï}}Ü0ÆJeS[4õó<}þ 8ç'îì±åÖ€flqôuU§bZ žd„/ÿksl×ÕÖ<ÅF7äô5Õüåç>¤˜ú­ãÞiDѰÿ à}í¿€))ÁaCg¦+‹Å¼6­!çt À«æZµ+¨h‹:€¦NonÛÅ®úªX‡ÍK¢å+•ÕÓ,±ú\2lPÉb^ÚÌ BX°£v¸&çZ•i#bm;¢•Z¶T˜^GÌ<´+HÔ²‹\èR`%6z”'¹€æoDú µ¤æk¥èd`Ù'§QrIa+‚³Šxeü—LÙ-E"Öf!ð®£hDQB`­¡ ¡#SVy> œœ 6E«ìùHT{1€…ÆL*±·ËSNùéŠ"?™áT«té¢9¸??`«*Kãî ‚*Öa‰¤¥Qà€ˆÅJ¶Œy™õóÞ\‹Âÿtý“3cg"‘R` Ì»$Ä=Õ­$‚JhA{í°àaAêé³ì™'®‚vSh[E!]ÀJ@¨¶ÉZSú©kãÏ\Ã3µ™—/M`ÑÃIrR‡&=MYVêÍóÁé¨4¾yŽÀjªîŒŒ´1iš \K*ú‘'îoèI5g cë-òàš> é™+!$ã›G`¡T€ÕXo®bˆ,†ˆ%0 qbÝa.žÀʽÏöB˜©I37›(°vïå/|/|p ýŽ'Ûµ‡8¤&¯²#ÇÌógˆu`¦&oØÓµíÕ~äÓÏ!ŽÍ•Kô&±W̹Ófú:¤Çöìïý}ºýjÔôsOC)väz­ý¶¨ì]´Þ ,ªNÅ4'ÉIwòT7Z°OHœëQ¢ÀŠXŒ”^`Q×gÆÎÌ>ß²èlyø©v ׂ|FD`QEBC®TK(šX X0.ó½…*€H6aŒ"¡<Øxý xy`«R¢³aÊX.h¹*\V²*®š¿qâïßý.š)Îʳsf²¡õ/òz›‡{"@žÐɹØr!î,%Ñ*poÔ&­³Ë®Õs-°F¸Øìý%á,„R­ŒÔ¸S;0{ÏÑrfu½Ž ¬d?‚Ù=¯AÅœkýçUžêwò¯ùœ3ÍÁµáš)ô☘èSªò¨Ž¡Ômí´EôäJþ"§b+tíõ‚Ûò‘XDÌÅ,T¢ `4¶·T=1ºƒ²À”l¹}²4Eå#S>JÚ¦âùLs#â6kÂæú¥‘ŸD`i¦ÕTu•Q©‡„Dÿ•*Tº 3YwHX’C";Mµ-秇Ðd¾eª"›ë·&­"Ý.'M_Ko’…Ð)°èŸ›ÒˆõàIžÇßcGlÇ®ö³V5ÌÀÊ`˜Ør`ý3°nê1¿e±½.Æ¡«'¶W'n5ج#ù8ç·ß @㫎À|·¬:ÏÀvíaÇNò»N‰W½>sÜ«—õ7¾ªŸþÆÚš?¶¥ ¥2Û½×\»b.×Vå žø2Œaûä„s¬\1€©×èó;ïÝð¯´ÀXw a+V¸’SÖòVÛXÊÚdfãä6f!RzK8Ž™vc¿P³ÖLXG®$µÐÀ£@‰Xs,•æ© b Ôìôò±µ{ËU´¡ü¦6†êy¹*owˆ£¢“-§d À‰ÀÒšÅ|æ1»¼÷“U±[vŽc”^ÐØ¥­ ‡N`òZ…ð@Â(ûß»-ýn+§À˜”î€ia( YñæÖÝBVæ àɋݣ»W±CΟ•:ôè‹{í-—¾FxP­Õï0e!ܘJ@РµçPIðïcÌäÆS}JõQ¾ÀˆKÎÒœw9™ætOå÷™K{Âýù… P`]"ÆeB‘x¼Ð£&õ4HXÒŠ˜&¢JÒ¡‹„cq`üfCÔøq!Wá —>FB¶˜ÅÆñà:!°¼°jäÅv îž)Z Î2¾­îrFûLk™v †±S`¥ žˆ©|C‡VŠÀZŒZcAö±×I·6­ ¡ÀØMâ>xÒ;v;Î<‹~ñ7 «ÎÀÚ˜æl [n¬€[F%ºu°½.F=,UÙ Û«·¢ˆ4=ìàáîù ÐO~U?þ¨™Ÿ ÉZŒ±ñfò*Ûµ‡=Éöb¥s¿ôêkgž?Æü_ý-KUœ_;¶¥ ”Cè³Ï‘‹§ª 6êøÝ–€n¿ô3ßÄ6 °‹Ý]’¥ˆ‚sfËÚ[ÈÕ`Þ$·°T«Ëe`Q1/³aÂd¹'üsq7É4Ú¼ k+#³’LÁÆÓ°«-vy aÀ%p=Ù¬‡‰ú Y[¾lâDzK#Ûp×14€€saåã˜Ò’nõ^â«•ÕÀ×ë0£ñN½¿õ1ë9îfPð~pj o%‘烃۸ñNä¼­ ×ϘIdèÔ¨õÓqÕkü¸8v¾VqÕCe9uÒlocU"¯þRµ$ P†°ä”ƒ}~„¸§X< Fg¾-M—+;>I&©;±j['a|.íC‚G'Ÿÿà¹/-ÊYd»¦ÅXD÷{«‰¶ÿ5nIÛ\é€äM›7Oä*a¹Q ¬2¬…p–爃:÷nRbÿL%Öó”…†™Ïz(°„ ¨   Èò³SŽŒ¦:1;X&T<P2%¡}6ðg ó7•O5«“DªNb(šÂö/žù~áÌtÏÚTôÃG2ÁF©i*)Ü‘š¨Û:¦4½¦ÉIÇ2öÀš}ü@z.!“‡›œu«Xìà¶{/›ØÁn[Ï’Ä+†(¡5šËЩ¸•,„C Ñ òÛ]%:Ć‚´WÃ!2ĺ@ýíçôsO³êˆü‰€ž¥¤Çï>¾/Þüö•î_¼ìUòmïLs,âMß/Þø6ñš7ŸysáùÕ´~%ØžB€9*) °}ùý/ÆèÛ±S}îSæòì`>º¬óÝr–&Üâò+X¶(f+[*üÎ…_úØ…ûßò=7u ‘¶ö˜ð¶³ϸC¼ò5ô?þ@„­€sµéǧ.Ì´&±ªe¿’ÆõÂE5ôM©u’e-„=æÎ/©¯>7þå¯Î_ *á,KTù‰È‹|(Î, wÚ,Ì›…y6²ºmL`%(f\âÁ—ñ»^€`£Âƒo(Ѽ©CJ §(–ñ¥™³¨@[ö%°’¥ˆ ЋÀ¢jƒs:!°ŒI­½f©$Úeå7Àu[wJkÁ&×tó¹ùiÆXCÛè(ÞàÁKd\áe†Y–á$ý ²ÃÀL·›dÔ»[œ¸í3m,–®êG`“’ÓÈøƒ¸dЦh‰ˆDª U‡£ege㹑i\:\&ZU¶•!C—^¦;+±©zñ¥O9l#rMX± ¬N_7 fR$Ô*àÒÁÅÆ„¸;fÓÙN3[êS﮲žÂÎn•{a.­)UâÔK4Ù¸*7ªÉ.ßY—?ÕÜúÜæ÷Væ¦XÔi !ÕyDz g-±»çOìË—˜YG*ÅÉ!NÆmŒX‹À® ‚oEšÖ¤mYyÝd«ÖP!íx2žÏE•v; IDAT‘BÜîÑ4#þVãF ¦=h2“5£61iÎôí&§ÜìMB` I­nˆk!nÅÅÅŸ3–n2 á¶D¥@ý+ff¿ãž~•Œ–ÈÀŠ?ö§æâ9ñÚ7ó“wm\K‡b1ä&†XIˆûp ±v´Û¦¶ÏgÕ‘e¶ Öÿ3ÛÈL_gGOð(Ò§Ÿ1Ï=ÃîÿÎu?ŠÃö'°rð6±Qýo$4‹,êdÉ¡Ä Xߎå^ì÷u{‘ÛN€ . {W!LÚÀ´âØpÍyìk¿ÕŒÃçë3ðP« .†m§Àr¸f¦þUô{Ðü“X5CÙàA¦½Zc¼L‰Å hžh´j» £ ç¼¾ìŽVÇÅ\Yë3Ñu¤Ü=iJÈm®ŒŒA…üè4%TUæúÏy¬ÒX´ØóVu5•-èuv¿ýt,„èZ´q(ÙÕ{Õ_%+A¤d¥Ëfµ ¸ânëi!ÇÚ¬T¤ÀrÚœëÝ)ï=ò–H¿i|çR]&âBŒZZ¥è@âDè•ý=N5âoÔT¼«P¡z}…,„˜òˆÀº{¤w…4CGÍD}ÆŒ{V`¹ã:Kì÷½Ä^nÍ9R RBsÃ5¬F541Ù ÷FÙ‡€‘I”Ÿ-Tz½]@Ö¬}ºà@ñð4’#O«+ôQË8V2wÕUH“MÌó ¬!Rç5² , AÒ§Èd¬Vÿñ…/Kðw}ëši5ï+G` ïûoóÒåÃF½"3œv €þË'ßü'Þy¤<@1=§|Õ—ûØÑÚ *Ï¢—î#C`ñDÞEîÅ@x‰¼"E`}ÿ¾~Ìü½wî|Uz'y+¥Pˆ!•L´"Œxù¾e<ÖOe00bmxOÉ̆ÁU9üÖ—¿ºº=ãQÑ.û=êH®¢SïoÝNK2°VÏéSQH¬k«Òðì)Ú¾pLå>ÉbÏzôÈ#$»UlZVä£ksp¸?ÄÛ(Ö& ã$WTâα~ÂÎÅH íÏ%ÂÔõ/Râá`§lVË û^´ëPItQç]#) ÀM•1brjïJÐÜpÕŠãXk[§d¬Ù¸Þ²Ö¿©öTnÿ$›-p™(°˜š &飳–ý5iØý8ë¢Íi2,h›Ð¾©xLz‰¼+ó«t©±ðhõÓ_¨~²­g¸;™MêŽ3S'X[û¾ÿƒg¿ôëÏ~ôÑë}ó Ü•¸à‚Dù©û˜Ëûm¹„ËÌÏÂÞpߨŽý8DëÞ‰zè!Ü l¯‹‘|Ö[ü‡ìÆc{u♹€íع¹Íà÷Ü'^ùvÛÆ†5Ýt ¬›´ªi˜fúŸƒ@£Š5&ZeU¬]i,œí1”cMfáqÓ;Kˆü€…° €+Ÿ®€†Š'ãY;0>­®)Ôëq¨»’æãb"Xä¢Ç¼´äaL–¡¸jƘÞ÷¹€‚áj1j¢€ú®‡ÊC“xÀÄܱWŸ¸=÷iÚBU¥‰“¶¢(‰[çÂf®æcU`ÍÅu÷»—òÄ=ê(¨½:jq)±F<ÙX›d¶oÙÚZæŸsÄTã".F˜m9‹BÜ™äè¡Àšl/¥t¹±pbtÖ Tú0ý‡n÷9gÝBúöÔs¹o©Ó3ãgÎ,xé®#=7pWâ6‚ 5s3úɯèþq­:C`¥þѨ# qXÛ±‡Èaƒ:qÈMÜ`l¯‹Ñ’œÃQ’ÁöêÄ-3uÛÙûIí ÛPì?¸ÑGÙRwzCt@÷ë-fX[C¥0è àj+ï1!têI%U{X" ýV#Šæã¡|¡€VÍbÀ>oBj@-n»ê„Øš}M™)WäÃK{µ&‚2©¢œ‹Þ¨–Ód¥,öIªpõ¯1úþCßß=¦³ ,ÉMg[âÁê‰{æ^ú@éd¿rÙêqjñF‹=—L´"P½¿Wî=æÙÓBhlŠ;cI‘Äž’™ Åk÷ßþÚý«d¯ÖŽ*Z‹ã/R ’©ÔË`úbCæUÇl–lõIç–ñVoÌ,˜Ñ[%°ru 7н"_¹)ÇMÃw!îëWïF¿N?!A 㓞˜R`%Œ†‹]›V¬Àrý8Ê+<,޲¼g–¸¡kspÒc‘Äi£n þù±wÿZé=?xðþ~ø©0xâ¡2 ,÷Ci§Ç!¦HŒ¨£&©ÿÐm!Ìóà¢k¤ÀŠÛ‹q¦& c0¦&4XÃ…Rx¾–U¾p $d·V{ Ûš¶NÉ`>êôr}Añ¶>ld ,ú¢AC]e ¬y•eÓQò¸â‹ÓçÃÊl}äÊT«o9‘e‘h]¹žjÕ¿~á[³×c¥hu[Ïâ<ÐãyÌ&‚Ç¢.½ÃV˜Q×vàsùBÏOûX)ÅÖÍá"Üîý86 ‡âšMÁöº­Loˆ Ö½ãÿ¿Ñ¿þu}úÛë»Û­…DÕ×mp3a¨ÀÚøLøXcäꮹê¡Jò “,„±ì,*Q8HU/k!#¬`NõP`͇íI=@2IÓº ¬†ê¬m®…sdVòŒ3àrkÖTc…¥7UhÄ O Üs’œ1f€¶Šà%qÚ $sª…€ê’>©Lìí÷‘c%˜æàvU¹¢)™½X¢ÔâÍåÎ ¾·n8zÂïâNÿ´[ŠMºx>¼)ÇMÃ…¸¯cºµX!uFïº#¡85/Ø0¦ÀXc+Æwýø3Ç_¼¢ç6 µB áƒ;>ˆ÷­´= ÉØÞÒR„Z:K‹.ätK§bZ˜Ô69pÚ@Ä;ÄØy=X&Ã|Ų [ Â7AXŒ[±öšéK"ùʾóÐöí°£âºØœ½k¼s³B \VÒ°vYu'br~–¶éìg®ÝDÚ˜ÿ|î‹_,|´Tc¼ «Æ‚•\ùBÒ˜+;»`k^'ÖÓÍ ô‡Ì´KŸÿ%àfÚ‡'Oªôç¥Ù½o-½ €á1õŠûÕ µ^,_A¯Ÿ³MöçòÂÒØ 3êZÀö`.õ&°t ó³÷§¯³ƒ½¶¶{? ëÄ!uƒ±½.F°œÃQ’Áºw¢~öi´šæÛßÄñ-‘…²þˆB³¸éõTCß|*°¶ˆ©)² Mw½Îô ÷®'˜…‹3ÍÆEÀ"zXºð¥ÿÉD’ÒÒõÈ:ÉSLG ô¬Þ3å:_T“ ­1|MöÈÀꃂð]P±ˆ ¸æZ:F&K0L‡¢ `L¬ÒeàÖùÐÖ°ãþ9 dÿ ,*ñ^«ÉÀê4’9V"K`ŒýycŒQ¥ùtH¹ª÷툢”ÄÆ0Í©RaÚ2ì²ØI(º„õøüû§õ;ª{ÿŠÒк}D÷ ™Sd PÐЭܓزeÆOVw¡ íµÛˆVEjÓj@#Š~¹öÛI#µàÙC¨±:®¸º°Â0E„-ÆÍ§®7F:¡ïîÝÍgí·.ÔæUÆb(‰“ç,„MžüÖÐN¬u½œäsχÍ>'ly¸¤­EÝ Æ+­A³n–ÀúêÂYŒ€©ÇQ»zmp%À—±nw°ñ Ц¶hꋬœw"gBÜÓ¯çç°ãw˜™¿æ¸qscHc ±’*„ÃA²‘0Vók®]1‹ ¬:²ôöÛfvô‹|kàF¯Y/8”MÂlÚD’žvʇZ ¥Å¾â€¶LÏ„çÃñÙkÅ…ž{L$oz\z¬·…°• ­ñŶàãçÉâ4€l@ùÚ¦« ¡æÝ¼¡(<ÁMÛ¾.Â.’C N-˜™†ëØoرò ‚‹ ¢8j§]Z‘…0çìKg`%ÖÚ,„®†]^ŲUv›;~TZËá¶5\_xë§!ýWÇ~b{ÿ?{o'ÉQ_‰¿ˆ<ê®êû˜é™Ñ\ºG]\#$„À|¬1Ø+ þ0Öö²Ø^ÛòÚcó1F²­µ¼?ÿ°XîCÆ`@ tK#ÍÝsuÏô}Ô]yDÄþ™YYgW÷tuUu×ûè=UyDUVfD¼xï} ¹i°‰EÚx©O6(re…íÖk³v"Š7+pSh±«R]5–ó峚´ém#{,¤@¯ °t—À¢¶ÎuÇ!aq!€\Æu58”C°¦Kg$#Y]¨fždèf$ÌDÀ‚Q k—µ ï1ÒOz‹ô•»^ÀDd™¡“ò'XDÑCùþ¬~ñ…äôŽhs˜zÝ`FKú)SuX*Ùé<³xÑ[€I³KÈÀr ¬ŒÈáòÙ+ÜxCˆY1ïìC’K(6oµÎ\Ò…ö&­B„Þ>1uÉ$* ,ÿßþ,/ {¯àOü¨V~V]t:ºœ.VDWµð,!N'/½¹¥Íi $…ÞþV7dƒÐ‚¡(ÅÆ7  !©Ÿ‚ðª•Wìæ³Ê€[2ŽÔ€%eAžè©è¼U¢8n¬J ¡/3HAj£t¢K'œz k}e–ÑUªQ3ô$¤èÞŒ1$‚pI%YËŸ"$5SÒÏ2Œ4ò T¢LE¼¥Õx£ÔR‹‘â5’%#ÃÕrWÑHwöX¯Sâ~×¶+þdßÛ~y÷Ë/åtkÆ¡C‡Zr^?¼ìv­ir§6„”æQëzY¤oßÒ/±jf“×A#×Q! |™q›A7ĸä”âûÔŠ{ïËGå+ß 7¬ÐŸ ïœÈ-)¨ØÅ˜«ÄI@A9nP 1àTW„©!U£–  gy€ À’éË}ç ü¦HN‡´)¾WmC²*Ô Ȱ‚)lZ¶ÇÛ.¨ibÀ™Â Ü0¬¨/+;kkN_#;颧,ÍÖA•'9‚pi!Àˆ߸?G‹,ž³CDÎj¨ßl¤aÓß_”¡ž¨—é*cü¥µŠÃ=ÆD:JéU×’X\ÌÏŠóg6 MÅ&¸Ž]¬ûEìŠkZ‚κ¹èÊô*°ÎQ– Q||“º—ž­¢ÀÚBÓ¿v† @åB?r)° ÁP® …"„S®2Í*rªV ͤUúe@D™Vʰ-ÄÖ0Å”u¯D÷;év…û©î4¾” ZÔ¬’ÎÕ´ êÌÃð)°DI\ÏÜù[#ß@%nè5)S`­4-9)aÁ˜O%§(áKpŸÁç,·ÊS H`µlq Í ÕV×/Ľý!9_…f»b½¿½ÿõïÚ³–+ÒÈuT@›Kß>ðž-^à—ÿ§å©±hYˆ^ PBä“S¯ÈÀ ¸<µjŒjÜjƒ†0„­„<×p0vWîMw?@eAv  ,ÂpK&}!SÒí)°3TÏçu65hf@Ž6çbfŸl €Ú€ªéù(j~RJMT•Oo¡»Œ#@·Ã!0of¤õ/Ì" tíâæ*°¸j@*°\±°,+r)ÔÉõÓí.ë+°žšŸ|rnÂnæÔÁ!°`g,s±+Øå{;üá7²#©†ûî»Ïÿ?|øp2Y\ô¿åÿ;™L>|¸ê[­:‚,(§"‡^ÎVYÉ4¸ÕHœêxœV{œÏ^˜âsFÕ‘)ûíc/‹2‡{Z˜™“§ðãÇâÿi# @*˜" 4 Lõå9g”·² 2¼Ü–W TÄVä÷@]7ÆCN†:Sá3Êåç—áÎ S…ÜwùMþÔØUw›÷€SŠ“ÆÕ^‹;—“4™RJ`5x5½h*kÒ±©wÏÝÿ›§.Ȱ0FW<êþf&&åß!U÷¿uôèQøª;v´Ö6æW}ðàÁ–ßY^>‘”¶ùÝÝžGðòê!—ÉÁ¥±ÚóS¬ãäÓIr܇R}º³¹éYù‡|L©.ɵ†6xÏ"E(’2£F(¬iZ€­ŒfÏOU! _r–$°ˆ‘L&³¾)¹zá=`c$.·ŠGÀÒ›ØÒšgd ¯Økú®·î’Ÿ"jö8žº€âÓ»ÄBxøðáéÜ€ GDÀKÛ2Ð0C˜´€µ^M)ËÞMf»v¼óNÃ¥Hž?@·¢rýãô¤!Ÿ³Í:¿‡ÿÅÿéïÉ?-²õÛ°æß$w›mqóãç¾ú»™Oüÿ—Á6¼/9‰%à#°üG(›:t–).N‚ÒL¢ß9B,àÂÑ#ý=È'j˯E÷—r„¬cD.ˆzE IDAT)ÕAßC§AÞŒò)¤Ï:—/¬ùíð)ÖýesªG`ß}„?÷T#mÂ#“É6‡ÀòÞâÏ=yäÉ'Úö{hðR~%â=žÌaƒÛpß}÷U%jÐ4ÖæÆÍÌÌìÝ»7“ÉÔߌ·³©àB¼wá~z¶÷“»Þ àyóă©Ï•mÈ ôÚw'nzÅà®:Gûêä _~¹wy÷Gö½ý;S'?§}6œùøÌÛí_ëùŸ8õïÇ{ð‹öÛŽì~ïÅ¿àzá¾ðFÂźŸ>ûø£ÿ¾méêéðÈ«ù˜Jÿ"{ûDañû‘G\µü²ì»Àó‹Óò‡ Wej>À¥Ù¾¿Úõy¨ß8÷€YŽ'ÇÒáY¡™Ô =¸í7¼{î~ñÊ»®é¾ïäÿî=6°´¾÷d"¹ó£{Éÿ¡>wþ™ÆÄïíóÚ¾á¤iü÷ÔÇÄ“cÛ{ïGN}í\ÏsF–®¼oÿÏ4xùeèYÞ½Üã”L¢FäÝ¡·=ÈÖ3½Ÿ¼ì½kkžÄ™ôÒG|ªÿwUß=oXâwžhdß¶À‹ç ¿ò†Þkv­=lsàTjáãæßøTßïl)áã¡ñ7ñäŸä[ò9 à÷O~v®÷dÏòe¶ïk;Ë¡é3ÿ¬~ÀeË/9:ÉÙPjø{Þ`"³ü§…¨Ѭ'î½y`¬l÷¿ô¹„SFö·´_û ëï”Bä±Þòkç{Ÿ“¯Ç“;?¶÷—¼{ö# üUé×Ý>xùŸðçÏÿ-¦éï™ús¡™¯Ï½ù‘ðWbÉíû±ïéÄ÷/[~ɇ÷½Ñ¿ñÿ<ùÅ‹½G®\¾åXÏãòtÛþàòGÁéßýŽÛ°ï?—8´géôdï“×.¿ò"¦{N_Ÿ¼õ¹ÄÔ\üS;£ì³|êÔw ÂxçÎÛ{õhï?û -jsˆ­ß’?ø“ظ+Ï¿>t`wð—ïîýÒäáG‚_é]Þ Î²`öÕÙ»ü€ÿdü̶_YõÈΧþ{ཻc½uÚàÁäôЀ×ß{Ý5«rw±ÅñàWÆ/šýqåwß>Ôê¶tÄÅIëÁ?‡Ú¯ˆl!¬ßÎÕ_y.nšËšú;†ôßÿ¨˜¾hýõŸ‘þAí7_¾iÿý_Ó—ÜDoÚ¸xÙf€{ÁþôCôò«Ô{ßÓê¶” yŽÚŒƒ6ŽMLK5/n–)ÎR³Yj!$¶.TÓˆÎOcþTfG}Ërl À¾è äƒKP€«{œûyHé9À-/—¬íR ¡Åm*TÊ4޼¬ŒRt¯ŠÖ°æølcšÃ1J¡HÕ´ Š’ÐxÐT¡S¦3ͤ®q†ša¡˜ýá\m”SpªÂ²ôs;_:Û_çS×GD­ž¥¬æ÷ïy'¢øÑx »hf¡Bå^¡ÕBЧj)cíe`qøè·2¼¼ü.{ÕT(´Är»¹A…ÊJ,„ÅŸ–¦xO €z _HT Ê'¤&TÊDX\¾×C(@¨c €¸Z…"‘9Y§½,'XÝð…Ly1ÂAù€‹¨åR-fCÓe¦U\ à„3'«üž "`)”étiʦüñï '*7§x@œF¤ÿÝ„%æýj ®û¯ /Fžš9_¸©>Å•’pF¸íDiÂE3 ""’–Žxîô¡VÓB˜¶V5XáÀ7.¾øHð+‰ä®îýÅF¶7l×ÿH˜üBLÑâL®fÀQ`eRö?<@yËÛHŸSÉ?Æ“Z9qö4ºËçKWáy]t.¼w¢ÓEt-„kûî#ò[ã/<£l æf¤],.ø ,)¿"‰^dh¤˜ã ‰åE~öT¥Ó ,™àŽ-S‚-¯BøÙÏ~öU¯zUkÛÐrÌËøp3°JCÜ»8ýðÆåµ`»Uìˆõ¦ ÝŠJ #r›íA‡{rÒÍð3Ÿ}ßÄ'¿?=.ß’UU( ×H ,¦¼,ó]aç>é D¼³SA¥Eó::  Lq"¨\nëÁíü›‘IÙ—œ2X¨QЯ[-TJ.®Àɬ®&Ú‹³  dº5žŸkÛ¹ôƒ¯Hßy0{g­ Ú$˯/mtù#ä]öjíhä:î  ,ïÝ­n߀ö´ò餺7²¿À¥gYUP’“µD5Ý=¦J™ ÓD(¶¤{bzZ'®„¿˜Ó‹ _ÈõžŸœ ÄÂVÙÛå„Ó°ªA2,’Àªx*†I@–¤¨\ƒ/ó~B\0bsgé4IPã:Õ˜ÂæÄ0 Ç ×L^9 ÐóNÜÕ5(Ú(df0€•Eµ(€|lÖ¥Oç¡§LQ‰*#Ÿ$Âšî…¯ï‹ È?zÀK#W(WERP”k^E¬$gMœ®ðéÖ â‹o÷2°ÔUU!t'”Ì/Ú³À:(°T½w÷ËÞ±ûæ²×)Þ6UÏŸ?ßâ:U"L-.Þ4r_7zùŸì{Û½»_¾íi9ˆ7£Ê'îój¸ ¬K °ÜLjFTùÐP’ ¶€ë€¸VE•PwÊôUÁ)(ÏÛ–I ¸•^½æÝfÝqsú5{cAUõØ^ù$48ËHýSòÙKG5}YD (hYŠ[nU†a4 ‰t–fŒR¢kÁ’G ©µt±häüÇänºùŠÅI¼š‰(gpº ‹Úpei‘Pœ ,o¨Àk’Sw–o˜À’­å¤aË]„Ë4úJV;ó™Ï\{íµápøÖ[o=vìØ¡C‡n¸á†lƒ‡¿<õ­ÿã¡é3+oºV|mò…ÿãߎ?Z3ÏB"Ò¦Š*„RÁ$a ëKçüä#Í«z4ÛW…@ÌîA^?|·ÍŽhœÏè2èWD˜²çÁ AUxqUõUP30ô ¯LgZ¥@‘ëÿ~V!ñ`\®ÞW­á%_dÔÂz¨™*áX>á•FV1 »¡ÈAZ2±œ ŸãͪûàYÛ„À:pà@‹[ÄõÀŸL,ÿÅä²}âïD~¦ÕÍéH´Ãul+8í.û£ù:GO¥:ÖÚÙê¸æ<Ìu¢ ³môàÞp1öBa.9Ω§Õò£GwX”©p ¯´eXÔÎ÷ÃÇË¿m× ïÜýÊž@niBo“ÙYË@™®» ,VC£!v @^ ––SR¦ž°#Ü#Õ‘6,鈕ڋ…¼ÿ˜Ëáq ÕXúÐÇO>r.½$¿”²w½I`@–fôkQi²öúP£6A–q-„…†-„RQ%&°,ŸKš=í Ö&¹}–òà'°„ÈçD* M'½¾RßÁt¦ÑhAô¶Ä&¹Ž[ë{»üU«ÐY7£«ÀêþLJPÿ"ŠÅ9tl½ö%Øã? ÎvÞ-S`Mœ@ÆœøzÝ „=ÌÇ‹…¹2WG¶ÅÔ$¡îgÜ ØÐ ¬;î¸ãŽ;îØÈ3ÖÁEr1“¸0k¢Ðô¼±JLN.¯öjòâh8eæzÀ,µê¢x ö3Ʊ™Þ‰d¬j–íZÿä?ûÐ7ñhjtl°8¾¤„ü¦þ«EÙí«À’X¤ îqlQuŸ`*ªöÅo™~—„%¡ÚA† ©t/j¾9ÞÏ ½ìLvßî¡þ‡æ¾Žb%™8#ר›ÁªJK-U`­ŠÀò¤gáR‹²®Ð›õÔ „Û»µœÀj(ù œ›€É—_„R÷þ—V·¨‹Ž‡ÔinŸXªÀ*±j—Ö4"T¢–e¥Pì€-¤¬ú£©?B€£f¥Lc0R–ÁTÀv>v6k оÊ S…ê0Vƒ3[fêqG%(“U+ÕQ5׫è­LPA9À´€B0ŵ8ÝI—t6±¥õ/¨è* ÚH-Z% ¬œMUUõ¬úŒOHïÙë²\/#Ò–X % `(G–ÂG`ÕÉœÊÙ¦ì¦ò+©À<ÈuAiÜ ,(Œ1€IVèPh¼8]O.z¯ûÍS³ÓÈÐpYOFb ±0'RI2¸ÕK”t±iPV…°‹.ª¢k!\ÄÂ<Ò?Hv^ÆžøêÇ|×±0ç¼íW` Á¥Ë%wHoÙ¹[œ;Í>ÿÏèM¯àOÿ„Ÿ9ÉŸ{’^~5BatÄÔØ6EÝDÑM†‡¸·ÜITmâh² ÖJV“è)Ë@……0(BÞß¶°mÂØ¨~X™ÅN]ÉÀ{.{Í…ìáò9Éå=Þßþ\ð|ÐÿËÉŒFUÝS`1E%d$ý•=¯,;ZÀɵlE(Ä™ãåûýûýÔY©Àªò«“Ô’P,¤ å*óæŸî—³ª‰hØ%°"´ #ùŠþÝ—ÜÆG83Ò qxêš¸Š§NðŧŨI` ¿»h(TºKjk´x£©nÖ-ñý¡dð@|GåîƒØšÐL½{®J÷ @í*ò+½°$°¤ÌJa2–ɵ€÷^vGP½«êŽ”«rDeš ÜL€€2- (° ˆcÍS+¿ ½Øy+’b“¤×ó#¬R¤›ØÒúTU À²YB`å]á•Q-ÕQÆAfì‚É9*Ø"Ïh¡âni9#¡(ÉøêF‹ä§1jÛ ËO-, +°DÑB(¨ €‘FÏÕY(±.'¾å9páX#åûÇX˜édIé¨.ºèd ¬–6£‹6‡C`µº†ù9è$ñ„r×›Ø7¾hñ_ ‰ÆD&-ü6öùYò$Ñë樂ëo´ÏéÂåàH%ùñíÏþÙ¶Cûõÿ¶ñŸæÁ'Î ;/kuC6[7D†Q d¢_ $e×°~còÈÎ??g¤½Wd]¤2 a˜çlV—z““ϦRµ}‰~©´ª Ÿ‹r‹…\‚L'ªùä/,Xb#P$$å:tHªÔê ,'‡>ömáÜ’w/Ú¦„]GWŒš“¥åzVø†/íf!E-Àœ‘å„©AµæMê˧ÒKhs&“ËU¡€ ŒÕP`õ¨ÅI¸ÝA…Ñ;`Æ€ K*§BŠä)»ÄB˜·=‹_•þQXi–ÏW3Ê4t¸}«°…`z‚Œ„Ò'îõ¡êX®±a–£çj<Ë`P.?”]± µIîD97P¢v–C` –X› Ç}“\Ç­&]Ä®¸fƒÑY7£SÝ¢û#)E½‹hD6 ]—œ”òÊÛéþ«äj ¹æz”ZÅd‰P‚^ûR‚Êm¯ÓëÈÀòæÿ¬¼á-ÐbjRÖ1ì,H$ÝqY«²¡Øº–\¶š©À2`ÀÍuªŠoˆï|+üÕ“ùiï•´U@EB?eÖԒ]‹À¥5àW- Ã>²<3žZ4ˆ @Ô ;c©åj&Î GŠäμyއƒÊì­Z‚Œœ5I—J3¹Ýhù¢‘€¾¢î–2 *ºü#ž•‡Œ&Ææ€HóE{Xlq ç™q$¾_½›|ÍËW;·ò¦› ­¿Žm*TÀ¢U2°Ö ÓàUÒ,E@èF–¯üÃ=?WkwbáZù‚4`ÖH V=¯º³üÀUYãÕ`vžKK“æhA™tpW†¸÷ŠPq=ƒ—·?Ì£Bª €QÛ!°T-ˆ€4/ÍÀâUÞ‘Éòˆ²¼PƒÀòÈ)'k6—Ô ê”AüÛPø›ñGÿ^åq¼|÷:6Ã2È36ânú>ìÝ-'ì6ÇHF·Ó½—Ó—Þ™åÎÆÊ2ÜÅ\u‰'ˆN&°6ÇuÜâXß‹ØM5j:ëf”ñíâΚUtK¢ÎE”VAÒ7à̈Q~æÊ«ïT^}§ró«À0àÆnŠIéÜYrˆHTÿÐ)w½ ÁÒÓ«¼ƒ^q5„àG7ë#5 bâ,²c `aK[©Ô15ñ´ˆ…º–,—žgÅ èY^E£ES+ƒ-͵œ‰NŽÉjÌqrÄïá‘ÌOŤ®ÄèDó¬ªÕ%¢p£… ‘$Q¥ ®¯°: ·.m‚KNEí•§§Ð•Õýþ Wå:Uˆ G[%Ó]Wò+ç—†v V‰Zÿåí·o ¯PÏTãAÐ…·bR¤¨¼žK–Î \•Q_³MfP@uUZ¹£Àªð6ê”[ª¬*è…¸—oÖ§Ä!³m0ÅåàT¥4Jƒ²(U`1KŽ>*½ð)Óéó(äì*Ýœ·&d¹!î V4;WPì‘\†ž‘œHÏ•X.wfÖ¶–AºWQ…å+d²ûÞÄ =½"—Er Ñ?þbüÜ)àù–jD* M#½å‘…—ªÀ²-¨ã!ì/þ«úö_Yã1»èâÒà qï0n¢‹D‡†¸ós§Å“©?ÿËôêëVÞz]á(°ú«ùI¢WÌ͈ä2E>'.NBÕèØe+–^q …Ÿ=ÕA+b~–útû.¬ëRkûck}Z?¤ž¿ äa¦ùVø«_§ß\Ã)lj¢65_pµ (XR%} ÄtÖºwûF—® §F0j3ÊP-JCÂÉÀZ‹V³ìq½  ¨aWÿ¥TxF<ô¸ì@ó>|øÝ{oýÔŽ÷¿{ï­•ïÊè_‰f„¸ËÈWå?°š*„£tE“‰Zj|[8vMÏPÕ‚÷ëÜ.X´Õ ÖáÃ-“׊ì96ñ%‘9€Æ÷ÉIh‘»XgG6óa,V¾.R'œ?Ò'×¹­m^ÇŽ€æ èÊz>‘Þ³÷Õ¿¿ÿ-×ôTI¹Z‘½ ó \«(p’ óòåD?dÁ "¨TÈšœÉüG•¨žhÉiÕÆ@^¨¼Œ¸B5kHOÀµÊ0z©öŠ+ayQâÒõœƒ•VÒ.È? 0L©À*Õ{ö@‡NX¶r"€ €§Ûeç¼gós(…!< a£¤’¬ ² ‹•Y<üØdw"IôËKàœýÛWÔ|1â3œ™@ËKÂÍÀé$±¼È_|Ž}ï[Å’R+Áþâ¿VúYøÓ?áGžk¶ÏÅÃ&»Ž[ë{;Ž’Ø4講±# ,ÆÄì4lÛþ—à‡ŸiÆê\Äú=€SˆŸ€t×nh5ECtÏ~pξ°–·üÉÇø?ÂÖKpÇ–&°¤k¥–ý(k1Å »êhwÁ­Êd‚÷¢Ì%‘ ,âf„ïŠõýáþŸ¾'t; ¡À®a~d„£š¿£¼Ì)¥Õ²=ÑTQÞ jر(¢&MÓ§» ¬ÚÖÎ;k½  Þ ¡Tu)¥ ¬mà‰æÃ=ôõwåÞ´+Ú+¿±á`|Å]Ör´/ò-`Õ¿ŽM›~x™vÝÿ }/•/’ð6"?UgG‘¿Èg¾_ù:O—Çæ²(4:YÚháuìøtÚê­ÍEA¢ˆhy- (ê)°¤}›rEv l6Üj†’i’™è•!îæ‰÷ÀÍqç§Ž ûéÕ×à/4…’køñ#è/§×¾´ÕmÙhlQ«`Ûr\»¢K–Á–l×jÁ¤öŠˆ¬U¥ÐҒጫ,R=ËÂ…eVHS#L(¾Œò“ †j9&uàUý‹ý÷oûÕQ¶Ý{+HÕ˜êÖÚ«V=P¢_Ê?êX‰D6„‰ŸÀj‚ *ܯE÷2°V9/}Ãö+zçu =ð³Ê=wåÞt gÛº·³*«=¬ú×±yVŠ/> B•ío Á!ï‹hD%òSlî1°’)4ìœÈM€¨´ç"µµDX­ºŽê ‘i¹ìуWì_ºéæÄ>a5ÀfI°Î^òéM„"I|ËU`É'¶dš¤5¯*¥{Vq=ÃYðŠ{ì÷ˆèÅ'9a Üå C-±®4©¬b €´[¯ÐT ™EY 7Ç”r ašåàV;¡e–‹%ZN`™0Ý64J`Én·ñ*#v5ùOºt<°ÙîÄD1}‘}ûëÔ|1Ö*œ]@úÊýƒòEå5¯çìÐÀ¶Iß~a¢‘JêÇ%/~íóÈç —©ºWĹӰ.)žl³]Ç-‰u¾ˆ¢ìÿ»Ø tÖÍèf`µº«˜š„«ËUü —ŽzÑ q¯e!ì¬%ÈUºïÊOJ¯¹”òSǼ øv†X^³SÕÿôódtûÊ;l.lÑ ,YAµxœ(&çþ(ßÏŸöYóØK´+v×Kjí+Tç,i³«p™-[Y)W²HÑBhÀDÑBAT…k²ÔÔFm‹cÕU=–Îõ˜¦'”bZPPÕ5æÌg´Ú¿–ÁPÀ-ó·„|ÍP`½{ÛÝëömøôÊÔŒÆpûèÞukY_Çqçs?†`´÷z( "¡aEóà&h5‘ `¢0ÁØÜcÊÈkøÒa>ó(‰í%ámœÆ÷Òž«ùò lá :ør¬k½¹.:ޱŽòfE½Ü3vÍ=pe"•”;y•4ªB>½îX‚Éx&ͧÀ’’a½Úâ‡çOôÔªÛs}×:4 ªüÞàÚ ûƒ°K ,ϵgWG9·ª‰­Òi¨ÙAEħÀ²€ ‘G@”„P¢"j*«—ׯ6‰7 hÙ¼‹Ç IDAT”¹pN]ÁŽÕ‚YAÏH[FB¯'—ëhž>øè$-Ÿñ~˜¡Ü€Ê, åµoÉEþì“ÊO½•nßiýÝ'Ä…ó+žN$—øá§ðGD:%«ªóc/x®‘Í4Òg²'ÃÒ×Õ_úUêÁ]tÑ8¼è«Îâ&ºØ`8ÂŽâ9ÅÔôêëØ¾#–šB`Õ„iˆLª&“+A‡ˆ©I±¸ Žm WŠDéî}|ü?r˜ÞpËz5¹I'Ž@ÒsJ¹6 í54ß0ä˜7z®2¾üì¹§?~ò‘ÇæÎ0\§^Y=ï3Æô|Ïø)³¦îÃæÜK»ÈTS`%-g@oSpb> øBÜÍÜ©€ ª`”I9¯[…pUÚ"/KÚLzÔ¨÷Vªw¨­“šÂþ@X¦¨T]½oaŸ…pUì[ƒ G÷%ú{Aš{«‡”5X ×B(ÐzVË òоëËß Cp‘Ÿ®¾ca‚à3߇à|é9ž:Îç"²çènÒ{Ñb"=Î&¾ÜÜÏÐE'‚·o/¢Ed»^OoOe [ªå[’t\±Q³<¢§Àr-„®;dÇ>¶÷Þíý%ïk"nZ"å*€Á`ÓJ-„®s°² κW “[´R–'ˆ–*ál%T©ÀRP-+…2eÒ'·ªµT FVânó*TW®Úx`Ó€^s½òº{¼À­&BHV1”[€¾ê¾¢¾å´w¾OyÅmdt;(3S+ª¢ø¿Æ@8çOÿò9öåÿdS`ÍNó3'­‡?…u²Š ìÑoËÿÄr9yÚÅV@']´òw"íUÚ\*°ö\Ž@…üFê•ÄâÒÛWk=ŸlÛ JÅôE~ôytÏå«Zù—^<þâ³Îé’Ë"•ܰ,ÅUŸ8 €^~U«Ò´ïм©(¸l`ü{ÿãÔ¿þd®¸Ö÷8{öTïS%õÈÛec_>B%¼ZàÒ¶áëN~ög:fŸ‘ÿ”ëÞÄÒá® »B]¾-7 RÒ=A9V#†C.¯.Äݽ·%5 ƒ„Š’ÐI½¶…B­@ýó:t¨NB>«!î~xì^`5FËŸE[Í`Õ¿ŽM„•­JîX}¡Gl c‘/=+Ò§œ¿“ÇÈN¢ÅÕýïQØôwEîBsZßvhÙuì8Ú+Ñê[®6–fж¸½ÑjÑB.t¢P ¨Ž‹ËEÉCÉe®˜(-¿è!(œ^Às”«®ØVGy¿à™ %ÕtÂT(ì“§¾ó¾‰O~êÔwQ¢À*æ¸G`™nСû¯§Åî[P. ´ ®†á:ЫºþO$gýÿô¬U(°ä¢itfZ5ª2[:Ølw¢¢(·ß¥}àw•;߈`ˆpJ €H¾¦…ÐÛ—\¶4 Ž€s1]| óÓ.oÎÙ“Pî|#þôO „ý/ˆT’\¶—^3‘m€BÌMÎÛŸýÇÕ}^eב;Ìþí+Îß}dmÇìbƒ±¾7£¯ á:µ‹•ÑYUWÕ9Œ§bú"²mLJn›!ªuÅâ<ê$¸Ðu2< Æø¿ €îoÔ?(Aö_ÀÓÿÚÿò°õÑßg?úÞª²°m>~„˯nuSZƒ-J`å˜7rµOãÌ|Ïøù|q&PP³f1ß j¾´œ\¾¶kXI³8Hõ< Á)#6·rb§¹jPí ‹”[©»š-½\uÖ±Yâ†R§£®FOèyd¤!e0PT`…T-î*°µXT+ˆºiǬ³{ÔW!bU ôk€æJ ‚JgXh )V!$­öÖ¿ŽÍƒ0SHukµsÜ%Eôlòën9B!²çÈN$º‡Ü€'XG?iù„È6¿âžÃ®ÂÕ†hÕuì$p €¬Õ½Ø7¶Ëù‹Ó+zj[¸W©P=–,`"­…Rµ$k•ª)°BnÀ–WqUsX:Êûꪆ©ûÕQ3`ìP:)Ò,· ¡MË;2)”²s²ÙžÙk§Õ&-èÕ#p ¬2±u§s%…<"¬q–äÅVQ…°‚že%ÆMy'’Þ~å5wKC_”g(*쀑†¢È”÷•0¶÷¹Ù7¾»äJ‰™)20¤¼úN„#b~V$—ø ÏPßú $R`‰ä2 CªÆ Þòí,Äₘ*»Ž"•@÷_Jù37)&¦‹õÅúÞŒÅ÷Ρ&6:ë¡ÚqD§XZD!ObqIKx3žoµ.¢C`Õ°¢K—ÁÁ"«%°= Td3à\$—Åäyb©˜µ¾³è˜È–ª·¸j`Ag\%T €n‡ØJyBoàîøÝܱ»¨Ã!Ãk+KDÕ§x’ÕpÈg!T4'ÓÄ áª…°Jå—Qµhi6Gã ¯‚kÍÀÚ`8XÒBؾræBX’ÀŠU¾EBÃD~¦úŽùiʶ»¡†ËJ -.‰-4q>ûC‘>%2gD¡º!±*øò‹H u”¼u×öÈàpƒK&¾)‰DÁ¹H'ù‘ç«ÒähóK«Ý…Ÿ9€îÞׄætÚwh^‰‡Æðž©?ÿËSßZqËŸúÌΠᲑ¯º~Bn ‰”wÑåþÛSo|“~§Ü ¨ªþ©”Pjd`¡FŽI--„Š€Ô  œÊx,Ê4¬D÷¼9ñª7Þzç`͇E}Sº§óBsªúáM½B¢Àòe`µ|2Ý’pa¥áø«|$0¢c¥3Ca,@0Q˜ Ó¡WË"ƒÊÈíÎŽ‘Å­Õ°ŸÏ‚•Bƒ°s|ùÅŽ#°:+$¢%Æv«BèÇ™ãN*Ðé«¿e\ìKô„cUT`I añ3VMŒ©!ÄÖ¼ÀDo$XQúÓ£Ã58Œ`n ÕjAâ=ÄÌ”8wŠBÄòbónc17 ÎÙ¿»Š}ãçÏ€rÙÞ&µªýÑ@ÒYP+¼Ü)q2EM_€Á½ð &í†pƔӅ¤[p '³ÓQwåÙ(U`qØð…hOM8€‹ùå¬mxÇ)ˆâ€uѬ^¬!B¸jqO•¿qtO,TŽ®x• +Çýn­1•¾„§x ¹+Õ ±`ž„é6ªk!¼epGwÑ€)2SÍ©BèG@J 8U;DÎäXy[X[.à$¸Wñ¡$8(òÓ¢0KÂÅr¹öñId#~Púhϵ]QPßH@«fEŒk!„»¯àl¨ å*°ÜÆHQ8é¬ý¸ âÊü)Y–—Z®% @#*â-ÿP!;cçP+(» ¥‚ã&œ&”¶\à± ãÀŠiüÕmÆTuåáSu !o‹ ¬´eþÛÔ‘ ÕYçˆÆÄx–RÒ¿J4ôö‰Å±8/ægeDHɵiˆ¹i( Ý€ ŽŽPY’Yd•B à ֠ÀËóbnF¦®ˆ…9ä² ”Dc „Dc"“ËK$ÑÃOC!/f§e#»h+¬s–g [ǃvÑ:kxÓÎD§÷ÈõX’²WîùùÏæXÕ/"çby„ÔÏÀ!ú‡þH˜¦ìV ™*ÅOçdl–E&-RI’èYÃÑV„˜™ÀÕ © À‚ÍÀˆ¶ Èꄪ)(+XÖsÙ³GãO,.¥^êE‹ò>¶Í"°¤‹2+yÄÒ…f¢-¬%3eׂX@œe)A¿½€ôÕ®}^28Œã/ŠÉsüø  ”lÛ!&ωógä5?n$Y ¡!Ž+!"—…u:N‘J¢G8B"1H á\£<¤üŠŽí¢×^oŸ?# îL4æ‡"ÛÆp∸8áÍOùÑç•Û^×øWÑE'¢}‰‰.Ú ¾wÑ1!Eˆé‹0MÒÛ/Ò)±¼Ã©e¸;‘(tùŒÁšÇZ¯&É,ªÆ•¼k‚S×/Ÿƒ\G±™˜8+–šä×3Žº=õ˜òÚ7HócUØÿü?¡Üõ&qv«'¸£³X&1ðÕ÷<È)³ö:§é•@R-W%‹|™»dõ%æŽSËXÒxÈKãØMwã¤Hˬ.Y>Üo!LÛÕX¡Š­X0³p¸ªòAW™™Å_PɃC H-xž‹ˆ EëÉo&“Éúx)'ÍV`u(\V‹›±âul|XÕá"ô•f *Ûî"áíÞ†´çÚš§!”ö]OûoFÃB¾ð  ˆì›ø Ì¥Fvl9¼ë(2r…sÉ>ö›ú6›úvÇEz5„Ë*„ík!̦R÷ïû…í½×ËV_š´[ö¤²v¡¿nF°š«ºÛÅD+,·R]•VÂG`É2#¶W|Pa¿uúÞ3ýçߟvˆ`¦˜â"8yíUz /Ö|‹?¿@öã}ÿUË:|«ÎœST*°t”t#¶´.2Á²–€2•Ø*€,3 $º+d9?UÍX ù%Ë*(T+ŒÒ-´è‰ `ÙÊåå×NϨýö!«!°†F°'ƒm“—Ñ«¯ƒÏÒ"Ù"ºïвíI¢Ç™G) ‚!p.ç!ÕaØçÿ¹¸oo?TU$—ErÙ ±ªƒ|Ž}ÿß]{èM¯ýîGs;i¯º¹«Àšä'ŽÈWÄäy‘n8f±‹ÂúÞŒEkØ:´‹Ъ‡êÚж¿™9H.ÛC†F „˜¹(’IeuýÖzÇœW¿ˆó³X•}mð1tdhD ‡›WiQZIß ƒ}¡öv‚_œ NãçNƒrY—Àê0jà+)°²E«æ–E6ÊËdu“8²4`TÀÛ³–é¹ä(”?4~ègzøÌXÜ;H:/Lª`ùRi35,•(*Ó,ɹ:£¨`+h©Á«¥øé³ÿΩÏü˹§ÊáÎR„OåLEdb]×™Ûùó+L‰U—ÀjvÂŽ%€ÛÉÑVX+^ÇfÀ¡“êXŽkÆ·KÑû”±{h£vQeì¢ÇAØyÔ–pÏ’›  ¾Oá‹ÏJ®­ýá]Gž9@ÝÿN…Y6ñ6ñ¾\»Ý2p-„íû8ZÃͤ nB‡ÀrI+AÔÆ$÷žÓ0¢VX®8Kwù¦^=â½+Ó½*º‚²\tV¨æóת ZúhÂÛEw›çWÃ)”Fix»épBpXþë%…Ô!°dx%ÏH‹k„kr–Y 9TËäòP°‹ý¸Õ˜KV!ôº6YÑ[-“hÉ@Ê.ÍU`‘h@”evJvAB/ÿµÔÛ]ÖÌeÐýWÒ]»ðñ°,17#.N ¦—_]Ü^’PC£ÅWd V.[ëö>ÃOŸ ñ„ú¦ŸJIÿ„°>ö싟©µ—H%Ù¾c=ü×bòéí§7½Š2yíM@ÙµÇ9{)ÅÏS ëtÿUBë>cÛ­º»X_tÖulÛ ,~þ,ºc7Ù)ÈJ-@<áßLÒIëÎïø/¢£“ØsO ;w×Üm=@| JÍo³¬B^$—¡éô•·àÇ_€Å´GË´ÿ÷ƒö§²?÷iqn\.Æð3§`d`H.mY´ïмÒYÀW"©½òVm¡~å[¶;¦,(Ûý@¹WÛ*S`¹ÃÜ ~шÍ]°gà£ÌòjFêÅ‚v€…âÀ7Ë‹µýkû*M$Y¤«´‘e’¨¼;ž>fŸ^ê9ó¢97«j)ôZðBÓ£®©¸G‰ |=XX¡î§ë*°Êàç1[Í_­|›'«¶…04 Q˜á‹®‰ÃL€ž¨µKõãhq€-a6°Bngø~P̸YV ±=á\Ga‹ÜJãW¨W¼G}í¹@CŸ}ÓCÒ%¢å÷\M¬áf”«Œ˜‚Øpk˪n¹ÀÆý’º³«y¼•§ÀêóXnŒº÷Šì³&È€Œe‚r•>µ¸‹î’e~rJ'Àõ!‡,ÃQÝû»)} "(?¦ [æÔÎ2€Ê4¹N“µ-ƒP—ÀòKžoH¸äDR2ç+ °0Ür4ZóDÒ<D4h‡\ ÂA•0 ³Ò¡Õ-›;€î¿Šlß Ms3Ö“iSôÚ—À¥O¯¿QyõôæWY!K†¨o—œ¡A&žø©ãUEXü©[u?{äËbêVõR€°÷®7Ы¯#ýƒtÔ-$âY{ûŽÀ(@ºçr)%ãg;3-qSc}oF1ÑfÌÄfG«ªkCÛV!”4 ÙéX3 ai–¹Ãï,Î7tÌLºA¢îÀÞ1Åøqëoÿ’¿ð¬8wÁ½þÆÕ|ŽU£è‘Ô4ÒÛ©ÀZo‰™„˜†dh˜^y?yŒ}ï[Ö?þ­ŒcOý˜Ÿ:ƽÀŸ}Âþæ—Ý}¶|:‹Àâ’ÀZÉB˜skT—™þüðjx{°Ý$SÏØíÊl7«Õ*S`)ÎëY% G³l÷Œ¶–5`ˆ À"ÅoN¨¹8Å(ŽÑ5ªè< É3dÀ²Än¥”À*ØÎW‘§I}€€ ¯&¸Î“x‘ÀWÆGw-_ÿRÛlÕ¨Üå+-·ÉµJ¬-ùå¬h!Õ•Ñ×@p{üÿ“ê!7÷}u–É”5 ¥òF"ce/vDî„M‚ÃPD‹);ÞD_V')ð›*¨÷¿›!Ej‘˜TB¨@q ,4¬º ¸EicZ¹¦Æ#°®Íp à q§ Õ ÿ¥£Ó&ç)³€Øzæ#°Hw¹Tнjhá@T©b!”¡ï„¤^Œ»ÆI&Ç ×¤u=_´Ö`¾1@}·Ò(—¦„`W ?Z‚,wÄàÖ´öbê"ÄXî<€d¨ou»‡ÂÎ s8B¶í€¦k¿ö›dhDÌÍ8þÁëJ¦1tÏåÊÝo–ôsþpu Šä2XŒSn»K{ÿ‡éÕ×sþÜ“åÛ/ÌÙ_ø yzùÕÊm¯Sõýþ¹œò†·’ÝûÐë|Lÿ2¾ö®ßP~ê­ôŠkè5×ËŒy1?‹.65ºX-XZº ¬K…ȦÅâ<ô•,>}QVY%¥ ,Éï4˜qοûˆõÀÇxúS1;žý çï¹17cÿË?P^z˪”¼kA ƒ¨Èàp±âas‚êÿàð(éí#ã(äÙw¾Bþÿ±÷žQ’\ç•à}/LúÌòÕÕí@Ã[²A CR4)J”DŠâhGš•–ZqGÔÙ9³âìÌjgvµÒŒ¤#CJäˆ2CŠ"%R IM“HøFw£}wu—7™YYé"â½o¼ˆÈH[™Õe²€º';2Ì‹ŠŒx/î»÷~ÎçÿŽ-=€ßtRúޜͫ< À²áe<µ@ÞÓ%ÙÍ׬Ïw—ÜPri– ùŽx/âÒº°ª3/ü"€e3 Ä  j¥YVKˆ#˜÷¨ àˆsËŽäßö¼ß_®3=@šep»AÒ{§¯äñees€Íl[5¬£ ,Ä÷ 7öÿ»}oÿàu÷´¿“k‡_²ªò6µ‰:¼*ù«¥CÜh;Ö¶>’bìëð2°:U`)(¦ŒÚ!qœE0â<¶”u×nô¾ä4µ±¬#”ÅwùK˜™@ö‚sæ/³ŸÚ@dÜŠƒàØgñC IDAT±»ªÔ¬à–2›«Ä«ŠK¶;$Pš&I³6pÔô„W¾õo R)e­Ü÷õB'ÒœŸÌŽf­2î÷HdÝè:?oK ‰:ã’f(–ÑÊÑa³Ç[^yDn/ïÝ›¾ýHt·2NJî¸5™SƒLMê Â*kE¿y Qå”hÀR|™é¥Ú'XÀ¢1ÿØø™L¹ÔjËÕG\ËZ= (†S®Ëž‹v\¢DX|ïAULŠl3~ý£Ú[fÉKõ,=‚÷X43å<ò¨ñ–Š(—ýw÷ˆ#ÛØðV~û=äs?®ÙŸ|þiüæ;ôþíÁwÔ”0g}ýúCïd=^@L"àCÞª½öú/ý¿ín60„MëÕ?œ{}›ñ*ƒ|þ'öŸÿýg¿/_|f½ÛÒªCÜ»¤üƒÛws6\c!l¨ÀjÀ¿JcÎßý¥ó™Oµ^S<ú%·ô¡_§cüžû:8åB‘tª.Kö€1Êe± je•àΆ¶à‡n"pN—/Øñ‡”žgƒÃú»Ñï¤øÍn"Ê«< ˆÀrˆT4†\*²ÁeÚÍXê,„Ü0VX Y1HŽ@Þj Þ²àUû¶E¥m¥p@¯–€WÜ]Ž€-ÚŽö†þça„dø<VŠ¢Ž­Ðª«Fª ,I$L× p<3¡Ro;R`¹B¡Õ×4\A;v¬õ þ¼=_÷œ§.CPuµîÖ’×q5°´  m} ô8åG)wAiˆ–ܤ1ÔVm专½€éqÛÉb;xê r>Î¥ÏÉùg—Ó˜ÕºŽ*ÁÇ*Œ*LÈÌK2ýJ3ëÔÀõ€“G ô‡*‡ÚÍU—q3Æt€Ô¥ ) !ëØB¨êú1©Õ÷5¾8Ë·þ™œß—{ð–ìëà¥4ªÿ£:ÕñùÜ¥§@!ÎØ‡‡ß¥ª ø; Îmž‡ñöþòŸmûÈÃÛ]ÏHPuoüðG÷¿åÁm]ÝRsH&Õ8A‡¡¬¢°ËJÅ›+°¶A{©,N¹òò¹< ÀЧÿÉüüg®>¥®Ë€Rœ(µg‡\æöè)ÍX÷wº9?ú&íõhÁ7ÃÐî{“ñÛÿ§þþ½dwèf`åir\>uÌúÃÿ$Ž=^¡”ü*Õ î*ߘÅ45!¾ùe5CDJ“¥è­¸×1UŽBÔë|ÄâˆDQ*¶ð6nb]°²7£ìJeÍ+òì)4~ÕùÂßSfUT3+‹.U`MŽ`Ûw`‰$‹'P*ªT,VC`© ¬v,„D49¦>Ês§[œ°Ñø‹bA<ú%ñüӔƼ٦à×À˜ºÚ}o†aðnViGߨ=ôNíí?Ó´yÕ {‡æ5ÈYn²-5p,z4-êÕkøÕh^U0TÕU@UÙ£ºœ%‰ÈKW„‘0‹°G”f@¿ž@ÀŸ¯–bL ˆê=éL°0€E=€—"¨c+ôjiÒåâì±É‹?š¹ìGÑŸYœô2°:Q`1€‹š¯ÄÑ£G[¯PINYÿ §î¯²®_;´qW¢i›¨«wV nhCGˆÉ'ÈÊÀÓu f*ÖR}•(h!pƒÅvj;ö˜¯º ¥%3' ÿƒò——ÑžÕ€ºŽª=U ,#0?Àž¬Vã¿W”>K”ìÓAÅ bsx?Ž–q3ªR³’;ª§pXžf m+°â†©“¡|SXØ'°X¥OùÅëîüÙm·ná%yÖl—ÙaŽ `Œ&T„¥! ;ã½ovò"ë-„õÐëønôˆ¢í˜«P%iÁÔa(ˆ²Í—È(Vl[%ÕQÔ?S`/Jlž¨€2s%`öj*°¦+U:W`ñƒ7h¾£AñrMSÉèKÀW`MO@©X5«ŸQy. ,hšŠYß}Ì7ÒÕQš›aÉTCå—]¿I  PÕ7EX݆õº7±b(éÊ%h?|Bˆï|s½´¨[­¦Šûc¾!úºýT’zƒ ,Æ(3¿ä Ðì4,ËÏlZ‰UJñè—Àqh~ŽMé9p®ÿÌûõŸûåk:«¶¡Ýÿ6ýç?äË N9› 6²­ &„øçÏÔŠÕΟÇG±À†ØÈ6lÇn–êÕî—ùÃÆoüŽþ³¿¤=ø~Ëø‘ÛÀ9bC#Úëî×î}Ý5Ÿâ†ÇJ¦t¯*,w¶pi–¯™jž4ôô)æ(I ˜Ô¶_@Ð ì­àÔÅÃs™)캙̡p€Ôœ‚mö%û-^Ô#ºbžfJ‹¸ñºVŽ¢5Xßeßwô\tažÊäŠ3­Š uF`©÷´l_LæŽòù¦…°9º÷eº=Pî‹íï€-¥Ò4jköžß’™ãà!ÀÕu ÏB¸„‹W~€…‡Xxˆ²/Óe!3'T²»sæ¯ô~›™=u;[ˆ2•fÀ ÙZYÈ83þ¹S¹%®<Âûoå©ë[¬³1 mçì_Q~” ãL¹A7BÂe ª›Pý"†"°|V»ÏÞ­±äŸÆ>Üð+Ÿ· U;Ù•ëP*ñ²¦ÒÍCyñü`.5–׿íE“«M~ÏΛ^<{&ÜÛ Ä½™M>8Í㟗R`‘&Ü '&•~Ù€¡“ ×/\Îåà hºëûú†PÝq˜»Ì{ŸQ±R:-‹œ~åêKO–^º^ß÷ »Û­ Ú),Í¯×¼Š ¬tj{žGb²(Ás¡µ~î¹ ¬\Öu¾D¢(ä¹ÓÚÈ6Ȧïͤü¸ _|–®z[? ¼ÕZá¿þQ÷pÍÖ?DW.Óì´_²p¯!Ÿ}Jôôs¾÷Û¶s½[×ÁßFw…¸gÒàéIùþCê]G4Vµ¦i²x‚r ´i<à&®`#ÛQÈÓ¥ó43É’)ñå/È3'økßä+må3OúžAšž„ã@J60]VíXU°»ÙŽÝ•&{hì -¤v@¹ä|ö¿LÿÙ_ªýkò…§i1ÇzúØ®=49F‹9ñÌ“Ú}o®YÆ®Ð^ûFím?í.â\ÿW¿¡$fld›bµÜoö2ÿ¯?Z‘S;›ÝŸêx2© ±a†æYÛS`-E`•dÓ_N]<– Ø*96N<–_@0(ÚRcßLs5š¯dvÇ¡äÒìO\þÎSsÍ4ܺ_ˆÐ`Zœ&Å(ª¥7¤D¹M åÓðÒjgµ)5¿Ý‘…PMesguXK"ä½öè›U«ñJ qÉ…³mB…1,ºmÉ50#É“û@¢°å)°”Šrhñb«Õl7+°aê,„nmD-Bö‚œ|b9MZPq BÍð].¡À*Ï9çþZ]  rÎýµúYV)°Õ6§³!7\‹¸1Å1ùDo[Õ~<–ÿAÁTCO.¥"© ·Ë¡­ìPnšÐK•AðGv¾}[Ô½‹µ@™Ñ¤›à¾Ï_'ªˆ 7I“;ª±Ét€,Ü{Vò¦ +`/Ô–Kp@ÔëÙwÆz·¦oЋI´Ìèp±4=Ûsþ¼}µ£Ô࿜ýêïœÿ›gf—¸+ÍËÀZMK2v&¼@ZOÉ5Ÿšb[¶ ±+ʨÝõZtþ´ú¶……ÒÞúÓ䨍zË”—Î`oXú¸Ûv°m­b®kîÕdÐ~õ¡;•5¯l(ÿ Ûˆõò[ï‚Ɐˆo<ÒNjøº øÛè® ,¥Àò Ñû«W–L5p‚ô¶•ãNãW°­ÛU¸!MO§^¤ù9ùÒsä©ãä‹ÏÂÑô$ÍLÂwó­’=T]ZZÈÚõÇòìËòì)ûÏ~¿â1àú_û¢ó™O‰o?*O òCÕDh©R5Å×À ùÇÙÏ~âÂ÷W­öðÚaÃ0y§]Ë"Ïô×|€(ëKesiIY’6<¡“òøE€À*Ö+°€™ò¢-*GdVèÃÃïLš!¤Û§“O_uf8Z@_ȵNø! †¦)_¡Ûœrm2.‚F¯Í€ëaìYÜ C'A¼înÀh²¶úÊâøñã­Wð ¬ÎѬ8X7Y—¼Žõ â¤TÒ¤Ò´Ìœ¤lCx³Í WÑ6€¥¹Œ8–•ÀÍÌ^€QqÂ>ùßZpXž«’ãËŒêuÒ–Ù“Ó¶=€¬ô2š´â8~ü¸"kXd¤æ+å tQnÙZ+ QvÎ|ÂÌߘP_Þçq¹ê´.æÓ—q3êœCrÕkø†AÃq_ ŠAåÄU ÝdIF‹VŒ ¹NîšÛAæÒ(³ [ôŠ3±'Þuo± N×75¨Òò¯]Ôðug1©æ· fÌcžä°~là!Xû¥MK%D¹{šÛ¢ÉíøvçF /¢Òׇu¶ƒ)ãÊBêꜵD¾’4˜ån¥XNÕ´†Òpñžaö@w(°R©”3Ù˜ÀbF õSyŽš+°È^ 0 $(?ºª­]UÈ…ó´þ;œÂ8Ù9²sê:ª{MëâH¾åÜŒ¦0,ÌË=4<ÒG[ ¿dT3U©•°VÛ§0¡‘æd¬²:º?%ÓoÆ£ùTó*Œrob°áž5Ÿ´’MMòZài˜B‡W˜¸°a# À*p_Õt€aW)°Úz×P{‹ëLèªÍŠ.ô3°^D5aVÖÙ”MÒn©›-üÏ-ê5_;ÔßI]­uÑð»ÅÅs€WæiïA1~•ΜÄÞž«%µ}N§«£*žï¼®ÙšÝŒl`ŒÑü ˆÖVj–÷Dmé×»ìfâ ·VÝðÖTO…da‰ºX%«,„ë׎T'¸+hoz ?ú&,XÖ§¬æ…‰äO~€BžÅ,™‚hfR^¾€¥z)›†ð®;tCbÏ>‹1š™†ã`Cë©ÀRQ‰´A¹L“ãÐu¶m4 ¡0ÍNS6ÃR= ? @{Ó[X,Áo¹SLŒàGn•'_tÏnzÒþ£ÿ›ÒóG´UŠd¥ár¬eI¼»Ý;·\ƒ¼ðXKÜâ–§™jàô ˜ 9UEÍm[iéU(†G`yÂÀÞŠ2°r”W ¬p¾ÿ#;ßî/çÞt·/^ÌÍàŽéÿÝý€•×’¦kÔÀy9 ÔFvûš– %ý…¬CÖ‘äö›²G_¾©£­VoÞ^ë$ÀëÕ€®².ÊRG¥ixùtrúðèžÖ„•f!ÊÌLAoÐk6cJ„µ¬÷Ê^"[Q-É©…RZ¦Î¨Z¥$W,<ÈÌ$˜Fö"dWtž…°ŽÀJ\Ç{oâƒ÷BBZpšÈŒ­4”2N ‘•…Sh¼Z×ÃS`ícÑ®¸Ò^±ÓK¶ îu¾¸¬25² ¬¨¯ÀªË[U!ñ vQ5C÷*ÏEâ)¸w+sÌ­ÑA÷¯EóIš`[#Е°`•.la®‡˜ ÀÒJÞWÒiRa08%Önˆ;RzX/&BE÷J•X-3°Ô±DóDùVÕmNKk¾ŠÀZÅ4 —ÀZ¿~K•‡¡¢ê”‹}Wž}yI !<–¼z™F/`;W(sÝ ±D¶ÝVíùMlPl†¸¯-T±Q6\=¤I$`±K ¬î q¯ Àr ³D²a 6²]8ƒf½ç#Ÿwþå°ƒ×CM˜&-æèô ÚÎù‘ÛÔúüÐ…Y²ŽM3S`l-„Jw¶‘£!%Ûº†ÎUEZºp€<}‚Ư²dJ…-úå>ø]Gùá›ØðVýç>Æ(=xõ×¥°€Ç¢,o†¬{°aXEò3°–8úª{M‡e¤Ùt'¼zá*°”™NQKjMTÓaeÇ®úË£- r„d´7T1êÒ-Œ8Ì)'fžÎ\F Ü h2½Qµ©i)#¬ìIWG­ô…¼× C„T=Ž·FzôtØFè ’”½Ã7ö®+· ˆx ¬nYTXDž&Fÿ™¤¥oôUùøà½ræGAóÁ{ÄøcÍ4>T“ÙSn Âh»ò+mûÛ´-o¸ÆbÊ´H…q€êîEÀW`,„LŒœ|p*ϪŠ"cf/•gÉJ³ðª'5.Q&+n°Pm9ž:ÌS‡ÈùçÉ)Pyž5bÕ…SçEùËTœP.¼î'üä/*Ï’•…g‘!ÙJ¹ TGò <êJ{X^Ú 7¹bzV»©Ö 5±Ñj ƒ(‚lÁ.A—ºK`ŠÄûYÏ%Õ˜bSÞÙ¯0Ø‚h«¶VVãRóÄ¥ÊP7™1`Õ Ž4k§ˆØéÊv3°˜°;Ñÿ§¿é/Tý¸àKXïx|é)[‹"6ÒVÞÃX««À"¬«‹mßí~À®Û§½þñÝÇœÿñI86¢1­´ç|ûN0FWI7°æ ¬Ž¶k/Vž>Áo¼U>ÿüö»Y¬1u»‰ˆ®¡#^-p½fÕiß,žc´˜ëNµcuV·üdhnõVs°‘m¬æfèò…šTrw‡“c´·¿G»÷õ!EcWh! Óä·ÝÍ”ßt»öæ·Ù—ÎÁ ¹•ø†¶¨(.~×Q4ê”× Ì q§Ëp¯z,Û{/¿$ÏŸá·Þ%žø:~ß›¡:‹dŠï9 ÇFùî½,cÉD¢üì)šÓîyó¥ÑúX^¥±ÒåØ0Có¢§ÝÀRB§ –d€IU÷CQX*¥Õ€"°8<5>'p¥­ê̽PäGêpº} õÖ^§ÀYë ¥—èT±ö„\VŠÇÕs¬6«B`ÕÞÉÛ¢©¹¬ëÐB¸68vìXëT}wTO¡o]¦ÀZò:€S“ß‘Ó?¤ÒrrPVÁèv}Ç»TÍ;mà.Dó”%9ÿ¼¸òˆœy`)0³—E·A¯­nÛÙNŒ3Ŧ6:EÌÉÆ¡GANÞ_¦,˜}X¨Ý‘ãþü“ß@ĸ­mÚ¥.3{=áRó°°5'–¨éAŒþ‹(wOì*Í{"¼ë ¬¶nÆ:hÞ¬‰¯ÿ5yí’kAÌ{’Gô:KêEIK¥Aq;¤36réæ„hJ`U* 6ïã‚ózàqÉeÕtÅKš1 ¶ ºo¹šÐI—Kó¥‚Cœ®”íX*Q+Têâ!î /¢JÈ’X_ºzü¹ò';û…†\´Ü©>ÑR#–µ+á NKªë¡4WŸ×áõŒ¥zøÞƒlÛ¶ÕÑx;¿õNØ–’_@$Êú`Û(Xª‡5Ìêôfä7Ü@žxA|ùóâˆo<âüí_ªV‰á„?\üŸÜB.ÄÀ¨µAχ)šÕVJ¥w“ž«áETsl ¬´½è$r ¢q\nÎv½-è²¢b!´ÖÊB¸^¯ñú¿úª3¦¿û!å‹Ï´ÀrWß¾‹æfXo¿Öò%ªÓ›‘¸ºN—/BaÑÕËÎçþFÿ…_¥"ÛuK,³É&–‡å=Q›¡B`­àN7Ñté<Úâ–«Úr´ZÄ)*(·Ð0¿i}Aëš%¾ý¨|ñíMoÕÞüV· cWàÍ‚´¯ÀÀo¸E|÷1yòííï©i‚r à<XÎoº¼žï?¬˜í ª­ømw+cõÑ£GåÓ?b#Ûô÷}¨¡oqÁ’=T,Ðä8óÃÙðˆ’ž9ÿðiüÞ×è {ø 7#^-ª¸Ü´‡ÞA³Ó,¾Ö’[Iä[——QÐ=Ø8–W[KX^ìz !w„á*ž 9¸, [éö•KÕ"¬Ô- (°ÊjÆRhj~µOög1j!ê&±ØzÀîðà €K0(¨ÀòM:îB·bP*­@î¢Nòw÷?¬>G¼Óéæ²Y-õ ¬Í*„Õðû¶þüU[Xóð2°˜‘P’(Þs½±ð°R€6ø§h[d±u˜£P`‘­È¾L…qôÜØàëz–"°Š“dç7äúM¯qkJh !ó—°èÖV+)Ú®ÙRB³ÜDó°0²ÒÌì`¯}Èéð!÷}CŒ?¦ˆ'™>éèÿg¨Ÿã,\•Nù«–œù¡6òF´ð2ž<%ôcÆà,B+‹w±kyð“§üSS©LX¡w“óüû†_)ñWA–褫¹"SD\—èC¶M;…Íû¸ êÊ ŒzuÒƒuOÑtð鬚*Êi²„£©îú IDAT¦Ä¸cJ£ÜÐB˜³­DÀæH F\¯͇¹Ž–lðôYÔÈBX’ËlœL—³ÔM®Ç¢*ŠUV`CÜ»œëïý€ƒÊëD«u÷ìg[¶j¯yê2Ý® ¡ßwH¾ü”(lÿ!ûãÿUž:.OŸPñ(Ý)ÙÄr°É`­*lËù§¿G<‰r‰Å¨c©X"AÓ”[`[ZxÖíX41&ÏžÂ*¸ŒÝ ¾B¥7¡tej¤…à´lÛÖ×OósòÇÇøÝ÷U%›Kõ{%³ lïõ’œ+ÿ ¶k¾ÿ0BëiôÁR)šÀwï«üÆÓÞõ³Î_ÿ9JE„BÚÝÕ ¸R¥@7ôŸÿЪ6¸!쀌68Õmʦ°ág`-A`Iͯ4ÔøÚ8R‚KH‚ºdE”¤§Àâ• ¬ÊnÃM•õ®Ù®âi«>@šEe-lh99”¬¸²h»ýÏZ Äž»0,bhd y7î¡C2âc¾kÃ\Ö üéúÍ÷0ï§°îþÁ6AÅI÷ƒrϹaçn¿Ë{nÐïÀÌ€‘•i0¾#I¥€±Èº7F«$95h¨Àrù,/öËMp¹¢’®±eNPYWÍ òÝeájÃoÕY0³×¥ê¼‹^(;þ^\üÜJ4¸îè‹ÅäwÈ…³Î¥Ï‰ñoL¿î&/€1ö5ûøW¿êW Ï Ò´\8K…q²²Ììq‰<-ÄS‡@Rο€+¯ë+NêÏšø^Â_…p•K.ª^µ Ké* *,c†É­€]Ѧ ,ÿZ´»à\¯®m"ô2€0×cÚŒ«CT¡`5U†Õ@Â&épÇ_§žúâè‹'2U·@Q8hÔ›š@¶$˜TB–ÔXe²H³´h[õß.:mY ²b!l3~yX÷*„MÁ¹þÞh·ß³ôŠwÜ«½îþf¯Ôž¯¿ Û¾K»û(â‡o O¼à~½I`mpø?x¹É`­&Äß ù9½ˆº,‰t¥'·wyây×e¬ˆ’<úü,Êçk–(t¤À =øÎ×¾DãUƒFÊÎÝ /íò^3¨÷hL{ïûƒ‹ùÞƒüÖ»hw¼¦‘ Ö#ÕË•ÁÓFW`m˜¡yÙŸ`Ô:IÁO­M¹jØÇ¤æ{ '  (må5™Žº‰wª$Àºe§uÇ%Ìs âÒöhô°+ÑË@*»ó×UÆLº'‚S.E`™N´6&w)ž(wEån‰iîÂN«® – ˆëîͼ™UÿÏáXä@”›®½Êh'$¢‡T£À°Èï¿ ¸ÁŒHµPÃaQyä°«îY/x9îQ†´ÁÍšªÓ$Û*ÜøÂÆš¦5寒•efokí€{ú ¹.êcf z NÞ?k´xÙ~éÿ‘³?nUÆñ &§Ò4DI\ú9ýІòÁ{Xd¢LùQ*ÏÉô GŒÃ9ÿ7•†å.¨rú2sK]_9å¾[Èùçì6F2{w…ª\]…å%¶X^–^»d• ØœJ hïÞvÛÿªýê¯l¹_}û§[ÿ·ÿÿÈÝMcMuhcÍÛ©Ç KC•ŸQ•ê‹ê&cà™þ]s·š¿—åãÊÕU†UŒ€¯ÀÒ„‰º ¬¢c›?Qã=´U×G4€Ô\Ú¨áEt'Ì•D,‘{”ËùLý†á²Z-èò(€äXJ«u ÖÛBØœ¯`É2nF~øtCø}ŠácC[(MÚ$°Ö+œ…M᪃¦ÆÅ±ÇÁ˜«„5×Qµ¨+ ¶âN3Ó 41fÿÍÇa¯PtQ©è²äþ£¦TD±ÓÔßûãW ÑÎbdù‘Ûø]GáØâÛ_s•Ë”M#“ÐŽ_;ˆ•½¯,ÕÆôŸyý‰èoûi–êá¯}Ãz´«3G› ¬5‚Ã+oì–h5ÞòS«š]›‚°0/€€)¢ÊÒRÂ3t+¸{ Zm!á*žzŒ¨¤–©Œ& ,„ ½Ü xË»‚_»–tÚ}é½úåý=–zeªåqÂçî¡ã¬¢ÀJx¬Vwª[2\ j*šwSUƒŠ…1bü›Ö3u.üݺ4æèkî^r*–(‚haðÀ ¤ŸS£k^L~'‹ò²ð:Çd‘p“J³pj ;åWðlw~2½Ò u™KfO`=7,áIÕã,ÔQV—ÃÛØ‚´ Jp à¦k n gŸò×c_UäY8…Ú=/£Í3O:/ÿ©˜ú.*ÍÈÌq€äÂY*͂ƿ£íz/–Ø@.œ•SßI—‚,Íx»!éXL¦_”sOà=«÷˜&sçà,þü®ÛoßûÞ¾½ZèÞMX^b‹áQ9~ç+°ôU&°”« €FzO(|¸wðº„;Í˾p”7š2°ZX+_–¯;ƒ· ]çˆí›:ºoþNتXEÇVk:J3¥‚Ãjx¥O]:æ„kÊù•”²IÖ65¬é„´ÈÀ‚7ß„åÅ)ŒX‹Ž—E­†I%p;²äš×õwÒºPµÒXÎÍéïûe6â–(a[F è=- +ðØÜDGØÌÀÚp?ú„àwÕ«ö:ªè¥@Ty÷€ê>ÛõÇöüGåVs—ÏNÐîƒ,™¢Ñ‹46º2‡žsÅVäY)=€õöó[îôsÊ;‚öÚ7ð/G/Ègž¤ŒÚmgz®•½¯,Ù£Ý÷æZç£B$ªÿëßꔡ[(ý–PËRÈÝ ÃëI[Íï%ÇñC²š]5¿Ê„fz£ö°Œ°ÈQe†T•^ ÃÜ Ü$°txS£Í&±{EÿƒòÁí±ªTN•·åÇGfn ýä¾{ -„^RIÂ[ù$u÷óŠä˜¬ ”;ã•çÙ¹F, ÅQ bRërþ91ñ-*Mw¼aÚõ58—?¿ÄxÌY$;-0²Ò*©Ý—_Õ@:2{Z\ý YýNi Àúú€qß\¼Á7=§A·´¢÷öX~–"°¹&×2}ïYšša±(ï˜äÌ“ÖÓ¿mŸøÿ<ù•Ûaó‘&ƾîSE.‰©Ç•)P(f,Î(ÊIL>’ä쓱ÈuKŒñä~2ý‚˜ù}×{` ©8 g‘™)Þ{$¨8¦©,ZÄu¦_{›»j†÷8懸¯2E:‹•‚µÝ#¤˜lQ…0@Z3°…ñGtÓ¥p D¤úñ ¥®è‰ª,é¨2ê‚ú¦+‹™ñŸ(UWw)7±ª~¼a@»ÿÛ‚SK`Ù5Yn@`ùõš[+°JZ@¨Gu(ÆŠC=æ8g R6á>âfÃUzØMÖFÇfµ@nßH{ËÃlë4²²dêJ+8B”Kté<¥çäÙ—ý¥47ÆøÞƒlïA4Ûñ¾!*nAïQ£–°Þ¦.þ%Áú`”I£\@—/Ègžty±î1. lïí·7ý¶Czn½ æÞ¸c mcW!Ü0LÐ*Ã8§9•SÄ€ªØõ Ž ·’;€Ž!  L–ÒÒ«ŒU^«À’Ž× ) 3J®}¯?a’°ÐTà}ƒ÷=¼ýHÍB· Þ$­ËP¡ÑLLò°æ¶<©U,„=¦û¹…½¢Ë±5wp[ú†”щ}݃`ˆ;™…§êbìëâÊ#2{ªÅ:ded楪%…qçܧ© % Ò¥@Ö‰ÌôdÏiõY1V>ÆŠ ð-«ª@¥Mã‹è)Ø€?9÷øŸœ{»61‘Š!£© 8]½ @oG5 ±â7ã&¶3W†§¼cx\ÿ΋©c/eê 1uŽOO~k<¿Fas†À"ÝÀm-‹æ¨éJÝ c) ¡Fº;Ž'¦"¥l²UÁl5¥Õ åý‰Y5À5™ù{ûÞ÷{ûÞ§3¦äZŠØê¨“ªxè» Ôl°*EQ¯ÀJšádv{~‡?aÞ$°Â®…weÖèèÊØ¶_E Q„—€ E`ùZ§ãÑ-Yó*g* T¿’”3O‚¤¸üyqõ«dö”̾ @Ì<)ç~@Î?ßbr‘ʳXh@ùædæɆ+ûÞ:,9} äðž#AÞg½Àã»&/SyNž=PýýëX`: õ‚•ç©0i±PPãÃÌd¯[ß,^0[nëoËc;F‹—ì“ÿUL|»R‘$ô¨¢©‹EV %_b‘Å%]»Kf”¡3OÐFÞäp< ÀÀ“µí?¥øUèQTXDÙÓðl†À4EWájèÊ+3ɹªXÞC5ÄkXáŠkµ ,€4ËXex2oN`ù$Wwϼ¬@hÜ $""@eYÊ åòA69jD¡f¶„G`]\œV!Y¨S`•çÄEªæ°:çÜhoxýé·‚´œL>u²çG3ÅE*-²F–o!l^©±ä8dXLò‹¢ Ö?¾øœû‡/Œ>ßzµ†®«+CÜW+2Âq]„ªÇß$°Ö+;LÝ´®:ˆ(¿ÆX¢j„YsY" Æ(—í†+AÓ“âÛVþh’$ò ,ض¼tp°08„ µB ¬@ÁAW„¥X×`!À†FÐÔóæYª3^ló±5,)Ÿž¹òÂlg£k[ÔXÒ,¥kO½”žšê9{6·FƒçC`qÁ„Î¥Àª«ËãCÕÖE’ƒQÃ5§Ê9! ©Ê/Âs€ Ûa<…Uœ-1~!•õn.¥ÀRS£¹0TÅCæi¦‚Âzl‰ÆïoßûÂÞX¼/T™Ýí EÝô®T`9RkŸÜDkˆÉïÈüUT‡¸SÞ³ï©,íN@E/˜IQ0VÚ9ÿiçì§‚l”Ìž$+ =ÆÅÄ·àÄ•nB”TõC²Ò-\„®æ(Üï2ŠÏj–¥XŠßQœŽ´åôh[^ßÑÙ­ô8 @Zrö'j›oe7ÎÀ ÄATž‘ g0Ÿ.Q0z€õT`)gÛ¡7´µ¶Q„9ûcH›™niHmèµUµçŽÌ©,ÙÂ"[е+°ñ¤B»œ–<è9Y• Ðv¼SÛúPEꂺ¬4ÆÉ^`fŠEFZ‹…F¥¹î·€,ï¡Z!°ü2&ú)°T¯ª ­DxÇVq£¢nn:IãWdÕB³.r‹ •>D`®«Bè¼X+‡¤ÒL©j†Âûm¤ ¬j&hÆÉèg ¦¹¦ä] /¢?ýVV¦\RÉžJ<îç–Œ"ܲ§Àª©“ÄT1€[õXRuÙšœí9±¼œ»XeÜ÷el¿q°"#6<ÿ5µ _|Æú÷¿iÿ·ß»öobI¬ì0•*^Ù¿ýu!"QhU=WíuÔuDc’skÚ¾F éIñÔ÷iÆ-Œ#«XP¨p}žÞJ=Xÿ £ù4 îŠÀŠD—.w3°®ÅBè±ð45./_¨,Dê¬Çß|gl±|ö“ìo?a}¶£­Ôð†I®¬ZÇ’D*aV\ë´úgæ£ËÅ5²/l €^Ž« ÒXj¾T“º2åe—­ICTVA.ôˆf°™£ ºV`ÂVQ•%Ï  ¬àŒ®b ÔȲ^ºÕf­…¡¹ËGȳF*gLy'[äƒlb£€ì1þ UÌNýní{é×÷\Î>X§3¡JF@å4¤Mù+rîY™~Aùãäôh#÷óÄ>p. ãÌìÕ÷ü¢Z©zsÍ]„Ê{ÅBýôZ}߇Xt»ë׋_ÇSÁ4>üºš5]Å\y¾B` f$ Š×TxÑ)@¡…yÏa÷@f/ õóØ(ϦV=0ª~» ¬rF Yêð‡ÓBÌH€œ¼F]…ˆG;ž«ŽÃÒW¹ïN ©HÇŽ ñ¥X®ZÅkX*²Ý·.,&èË®…žË ½ ¬Q!°ìjÖ=¦Åw/Ñ&=¦íy¿ûþhg©4%Ƙ¾ó=íŸ×jƒ÷ß&g~„ŠÔ‚¨4£ì„MXƒ¨8í&.U+°\ ¡µbB9ýC*ÏqÞsãÒ++'y°…†¥Ú–7 ++F¯`±̈C‹°:[( õQ~”!;G… Wm×9ÜŠ‡f¯¯œRRÖs#·s,¶£õæÞ<üe¼`µðì*Í,»ÍÝŒH “qé3D«„àcÚ2X>Õ´z“œ,³ÎB¨æ ,ÕXEa)å– ¡H%5çä[e³M2,•!à#¯glkôˆæR(7#°Švƒ6gåÕÍZ”ŠÀ²0ÉIÓ…Ü–h•¸µ-ËÊ#„ˆè¼-– ÀÁr*U‡¸o¾Ï/Ãd}ý‰"¿ˆb.œQßÐùÓìö{Ö³m›èÖæu@¹,o‡Àꡉ1ZȲmK®»º éIòÌIñÃï@ˆP^¼>—?Ú3aù¿åNùâ3”ž§±Qe!dƒCjsÖ?DÙ ÍN_#ÍD3“ býCPô_!/Ïœ‚c³m;`v<·Kõ ¡Å]8 @{à½þ`wÂRƒ&YIÍ`“#Wn-Øn"[ÃP‚öñOÙï ólæZ6’T'AI%¼·«£RƒP{ƒ 56m8@Ì…fJl‰i&³ÍSzÁÜ‹°^«ÀRT¥åíÍa~AžkOr€ÑÉ;€J³âÕB)—èîvÅ{?ýÍ߉ÿJÍrà cõsL–‡cÇŽ­w6 hñ¢2¬¹v<½fï»…¾FQ5…KŸs.ý#ÙÍŸAŠÀÒÂPJœ¥ÆZrö)ä½G ÇYïÍP.ã|à€ñá×ñáû~ðü˜¢ÏÄ•GÈ®Óc»b™ôFÒ¤FàÉÌP¢¤¬{äðÁ{YbO››¯xb¿›¼îÛKSJþÖ Ë'°2/Â)°P- ¢vµRXÒR?™=…6bÑT‹_×éýÈûoS¿ÛÁ{nT‘í5P‰fT#+n(ÆSI½®%Ë%°B½êgOÔÆS‡ô}ÒFî_b{¥À*MÉÜ0ΓKX,4]Ÿã¾¼‡jDw{®  ^õ˜úªg`Uö¿Ë·6©”‚@ˆ{MTÈï¯=k!§Z ! ÕŠ¤’g!´¤.AL)¯}Vf9À¢ª‘I9”°'Ñà5CI¶ËB ÑE Ž[ÊÒž· ÞržS+ÇÌ– 5ÛZ^B‰¦ó|ig@XF!(šÔkö!!à Ï;… †¸/cûƒ•á°H€»âW%“çN¯àþ7Ñ+{73°V¹$k ¬×±{XžyP|õŸÅ×ÿ%úý¯¼%óÄÅ—H’”žÀúúù·Oÿˆr 0 æ—ð[¡,ššÀ†GX4€ò‹òÅgð#·_ãžÁÚ¶Åzû—Í^m¾3¶†-”«3Kx!( +g»“^%³]ƒíl)ÿ…ËÏqôEɹ…¹Lê²J1ÊkD`m$VKÎÑ “Ÿõȉ€"ŠêRÄ Òå’ˆ,BhúuÆîÀG<7;ÀÑlO¥#0Ù @“¦ ”¤o!ÌQ¥TWËQ`1¥ÀªÉÀ¼IˆàŒm62)TìÐøf8zôèz7a#€„œNŒ=êŽö¾P:Ê“œ T"¤üÅ“ûYß­àä¡Eé@…1è1U>§Ëùç¨4ã: ™FVZ\ù2~½œ} ¼3<±O.œá=7*úF¼ £["btVL>!&¾-³§ŒCrUžüª³©!×Ugg‘mø¾Îÿp« Æyßmbò pƒ÷Þ(&§ât³*„ðI.+‹ú,€ž èÚà\ü ÆxïÍîO…„œ–-õ§S­2{Ží,_€Iž<(³/óØhÖ 4ûÈôq€XxÈ%¼Ü¬k °Êi0û ÇùÀ]°²,y ƒ–‡zPþ ¿N%»/±ÉÉq_ÞC5ìy÷ªrÍICu¯·fl%ôåX­,„^¿ÌªÉ8¿Ò"s 2Ë4a ÐçJ¸!îÁ*„eK²ÈÀˆ+‡¾O•x@ÄI–1'Ï|© Í2sŒ-±êš©4Ýõ± °J°Ó΢ґÛÒ):6¸„äº0 äÔÆ ú5 eó÷¬“GL‘}-Ò²„R`±åX¯ á p¢1ò¥ç°á­45NçÏ€¨U´Ä&®+{_Ù?øõ…øê?ËãÏB×ÑHUY²€xæ)95É÷â‡×)_ɶ)=Mc½ýplvðÆâ|&töø=€a[ˆÆ óo?üŽ|ö)©è+÷D`Y…åÙSòÄ Ì0Ùðˆ­5<âþL3iùòK`Œßt뵟¥ö†‡äñgèòE¶ëºeïdó±5ü°NKJ?úsé­¤Sõ”ËÂYpJê%Ó å"½.æ¥Ìä·b_eŽñ.ܤüãù‹ˆ#¹°c!óf% IDATyʼn,8Rêm7iÙØHV¿–¼¤h©ê¨Ôé©]ñÞ¸aÈË€(‹¨|ÖbVë¥Ì84„ }Á‹”0°!¹í†ËꪅT†4Ja%1 *xs¹*­£Ü;úw°ù÷ö&Ü‚ªMK °š"$Ãh9¸5ƒò£rÁUãóäÛ¹¾íi1ö¨ÿ&èQ8Å©Ný¡ Ü„iWøT`ù¡T”¿‚¾[8W¿ÌûnW×ÄÄ·dú8¤nòä9ÿ•¦\>kàN9ó¤˜ø–˜ú¤ÅÌ^žtóªxß­rá z{ ¯”| ˜&ÓÇ©0nŸþ ãúø©Cÿ`GÐ"à&D™Ä WPWÜMÎ" oafJ¿Ö¬ ¡âïIêç½7×~»"Bi˹g m©rš´DYÌ-M`©\'_PÖøÀTž…i¶‚§ÀšÀ{Ý…Jå—/\\ a}Ïû;Ýš™=S4Ÿ6pg[›„ݳNµ!ÓL¥1 ÆBqÉåꇸR)a„[¬Ùxó 9ÕtŒe4©BöNV!exóFjW1%C J,ﳎ.5qfÑʼ I‰ `Lvrs`0ʉ†±:´ÕÄBXr*#œ²´…úY’΢càŽ¡Iž©0?â]4W`åd@‚Gƒ¹´‹‰vVk7Ä=03·‰vÀ¢1äÉð;_#=N™yšg#ëí€ÚDçØüå¯8hj‚ržÛ í ,¥±QdæÖ‹À¢ÙiHɇ_ý-D¢`,òbèìñA{€±àʯ°×±Te3ð°Ô‰ôUÛ‡|öÇòÅg áÛwAX¹,ùüÓ°-¶kK­@l?x=?x=Ô‰H6±RpH¨qPɱM³Ýé@‡$N\‡;„`6ƒšÓär<ŸÙ_ú°è¡ƒtûâÂüÞd€³Î(€}ØýBi^DÏ/Ìì\Öiu€Ät …R u!î_›}î“—¿§>çQçaŽÆÄs…)½NÕ v8@%å¹–7¸—\E\ÙžKäBék×yÁ C;è GØzàŽA7ÆÅ³V>w„0"Xý— ™yI\yDý'3'Ö»9Aù«´­š7} `de@Rç¶ÎEB_”¤©×x7zÉö-cT!° WPa\Î<é.”–Ë^,<È"Ã(û2¤ÅŒ¤¶åÍÚÈý@¸“ 8y1õ=¹pÙ9™;/çžÀ‡ï3ŽüïÚÖÁMmÈõ–Ù">xyóÇjÜÌ3‚ù^Gž<Àî„´ÅÕ¯¸‹–¯Àê©oR7B ³ð€²FXmÁ ­og]™¿B‹—eæ¥`F»ÌàKÕXtô(HRËw²²1# Æ—w?²ÖU/µúe²ØŽ Ç¢Ûp-1X–—µ\hÛÞ¦m}H•Sloƒ õBZÿ?{_ÞÆu_{î I€àNŠµÛ’%Ùòîx‰ØYm7ŽÓ,mâ$}I›¥MÛ4iÓúõ¥ék’¶I—×&iÚ¤Yœ4ûf;­x·[¶,KÖ¾QEJwbfæÞûþ¸3ƒH‚¸ ϧOÌ ¸ƒ™ßœ{ÎùU¹‹°²A¬QmÇçU` s›})¹Ô-NÝ,ù2V/!Ä]n@AB·÷¢Îík½& ,€„‚M±º–Ì–âTd22+fd¡0ÂÔ°À`þí‰ÿþpÿÿûnßî1> Ežu•šî#©³YnMĬW3 »X4…)g>)×T9©6eŠNÆ  h–¡¤4êµ:ÕP”ê²7%™Z.€ ¼ áý‰ùÜ_KÌï zXò‘¿$©b ¬©ãHê#càˆÂâFû‘š.8™tS‘ï‚ÿ‡u¿óå¦{_Ý^Ø4s~áš «ˆÀÊY‹ ’º*zw¯×~8 ,Iâ;¶}[-ô¬Q31¨Ÿ`9¹ì²»TX‚p£Ù$Í ú €E,F-£¡SV0F ÿUÍÓÏ!ËýÏêñ³‘ƒ_?õ\Á«†‡–²ˆi*9–Tû«Bׄ +ò¬”i‚:ÞÆh)0= -P+óÂÄl–C¥ ¬hÇaóâýi%UY€Rº~iÀûOÃ2á‘\¸rIo­ Ú°räÏ3²™)¨iðÏ×à…ú;¿¯ýѽô¢Kˆ¡¥ °c# Ô›i%€aµÀÓu×Z¥56©ŒÀ§{Ð5롪tÓ%ÖЮ5HmúÎ÷+·ßM×_4Ë&VPMðt!,cnIöŸ! 2Õ–lPãËÔÈ’t)ÉÀ&°Œ`4Ë­IX¥7XWÛ ­Ï­KUiXT+‘H¼êU¯ºüòËûúúúúú.¿üòW¿úÕ)tZ ¦£‚VNª…]ÖŸ˜ÌÔ ¦Þ¢] AâLËhðä’®fÊÐ’ˆ©wMn½ª©sê»ø˜­œTœtXWE@$Å|©dÝù¨‘´° ¡·¹:‡Il9¤kI 2ÃlðQ6ø¨È ˸kX'úºz â'ˆÄIxù‘)v­¸å(°dBc’ÇŽ[G¿€†7ƒ(²µ"ÑÃêÆÿEjV3Ú¨¬¿§`SJÛ-™¹m{µañÉ€ ÁU(߈äèkˆÌ˜¯f‡aD¥B9.ìü¢„Øu)jÀ£‡…µŽ| =€†6Òú­úÕÿ¢mÿK9åùÒBÙhR$ûeù\Z–R·ž¶\_ÐG’Ôt„ÇŽÏêÈÛ9/R¶LÒöÎCgœ²à(°ò,‘ì·Ž~¹Ê}…¥@X^ÖâÀW*"°$u€/]Á•Vй^H¾…0O•»v›ÁhÂ4ÌeÉmJ ¡¬dzI:HKKf¨K_S²k¦ŽÔR²-‰¤çkž|r°×ûª w'–€ËÒ\ËJ3€.TMNŸŠ/-„ ¥æ¹Ú+Km@®€²rÜ“ 1: ]'íÔw¼W¿÷³ôªW¥tó6åºW®h&–Ü4p£œwi!¤BшÀ¦d£4+€|yPdá¸)?2>lÒ €:5 Þç ÔÅd\Të+_ùʵ×^{ï½÷F"‘H$rï½÷^}õÕ_ýêW‹¯g)!R'ºÕ¶gÆNˆÄW¯«mÖãB5!Hƒ/¨zÊ;p= à›ÿèÏ6Ü1í»¸³²2Æ~ŠpåUõ[oϼɗl»Çdièðð6ošS–×BxaLzzzÿMùÈsvÛÁ¡gÀÒ ÑCPà&¬Y˜ÓŃà<~Òý+Ç8¡?Ü‘Ä j 'H‘M%ê·ÚëRMÝø~©·¢ ;”ö[Õ‹>lwaó€ÚiãSŸŸSÇ‘èaÚvî´¶¢p%=5H‚ z«/&hÓ3´Rm¾–F¶ÃJYG¿ 1ˉÞveê°´uðïEzÚ”ö[iã•ÞÅäˆ{™YaDÁ컥ìDóÅü==B›¯`¬ï‡lð1›Sž®ÇŸý$Õà(¶ì„KD`ñÔ „cƒZ½ß4~žG±Óß«’;’Š1˜­WÓuujÙ1ês„êPf*¯ðg.ÕU´héb+° 2° a µ?µdÓ<X€‡Àû'Ý\v»»ŸPdBiЛ´’üÜ/Ù1®XBÉI¢¶è3¶ì” VRÊ ÊÀï·<쎬[¨é`“«6-eKÆUhÐê3ïì‘ðX3¢£™ÅôÑ™1Ú›"33b³­Ë@a¸Ð ¬ù=£’æVõ­÷¨oz»ý·?'3ɤE,7Ž¢Àš/Ìï æø« úÈ_HÝC]˜nÝAÖæ´¢è8J‹Ÿ8b}û+ìÉGl§ì"j÷Ü'†µ¦'C×T+1%ÐÎq/‡À⃂tt-£¶€KrϸŒÀrXe[B}D`”lT@ðÒz Tº5'R£5Ôi>8«\)#W¾b,*õàƒÞsOžäž{î¹ÿþû‹¯õîµ×øp÷m¨œ0tX +  N„:ƒaV "¨é£„ØBaË$åÔôTm¦ÑØÅ:UÅé•Í]·w^Òjt8’š†ÀÊËÀšƒ+¯ á…E`Ýpà ‹ÿ¦`c»Ù¼HÖFFbÍuû#;Ùà£%¦qÏ‘>–¶‰¢¸ª(Wuĸ)Ã|ÙƘåj²Qk(«ßLjVƒPÛMækP׿[ê°(«^¯t݉Ueõ›*ØÛiÇ‘„71Xe% å¶P»V¿üoµ­VÁº‹ µÆæSJˆ ›D]ñ5ˆìhqc0ãàÔ mÜ!ÿ$võâ?Pºî´Í°¹½’ ,•l2ˆí†à¶…PcÑʪ7BññèÖ¿Í)Ÿršå2£p"´DúJk–ðøÑÃD«ƒ•Ù1Öû-ÖÿÛ ªB ðØq>\hûZT<ˆŸ_÷;_èúȦú²³êæÝ9UL`É€v¥‹æŸ÷‚š}*®…°0 VÞµûXb9õœ,È¡H÷Ÿ´ÝEY @ j|Š@P–«Û¹¹yÆn* ò´oÜ—>0ž –Êqùdµ„ë ´„•æ&ºT`™ù¤™…#¯›‰oJZ2^à£Å–Ìí8QYˆ;‘ërT é»`Xè3ªÌqw‘‹Á²L1îWW¬¹a~Ñ⾂ù„­À Θ8^dI}ƒL€Àw?'&C„Å{ÁQJJ-÷’IØYsJ?NBõø±C챇øá’Zõ‰óçжé3«KrϸŒàQ`•1·$5VTPÙÃÇ"–lP@ N­CŸ>þÀNÑhtÿþœêRúlëUûTèg¸ ÅeÜÓÓsq¤EÆR¸8ñnAó¤áf3ïKÓ>žvàÓÙ¬á>.w öïßF§}i ·à¾ºÐû`øšÌÍ™<³­ß"€}“ï¤Åæ¸"kg9gãççð)÷86ÈH MYõú©[0Mû.…ÜKj÷›{ž{±È÷PÎ>”±ïPz“.”hpµƒÕL.í¨Ý箿ÈdÖ¹ÑÌ´[ð®åf`‰ìX6ÆGz@+ m›ãé!*£ýy4•öÛÔM°_9¬]#Ù+ù’Òr=6òìÔ-XýÊ`þã;¿%g¤ÄlᎨžžžj;ª‹oáÜ[g¤ _e['pdÑ3mÁ±N¿…±aÛoå§ZOOlV( ¢Ñ˜ìBØiîéÀ˜}åIT(VÖ„ÃËdH@X ú¤l^®kiíF÷5¡E>E&‘ëõÃöÕλŸBÖ-xjGA˜` Š…Äd€ Ë»ñSÖYíVœð©žžžGú­@\P~¬¯y7:÷ IDAT@†(W÷ï߯Û]Yñ±àN¡ÜóüóÞOQÊñ Ù1n+°ªñ˜œ¯-È'n\ ¡l£ÆìeßϾŸ=ú?Æ[ˆÉq±߃Lݪڱ¨x <òÈ<îƒÈÁZFßC•oáü©SH 0ÓäÿÅ÷!¦ù”_ Ƭï}ãྷpŸâȳ="çÇˆÉ ®(¤¡É»/å>žeB9K$â®sÆ}˜˜àCƒ D*°ªm4gÚBOOû¸?1ùô™£Oî}±¬-¼0Òÿñƒ÷}±÷É%ü ·WÊc:@)[ÆC#õQ'–A2ÂZ V2kÇCœ,ØBbò 'žøÞ¡f4Ò0€‰‚bió×-™nW½â:ù' d15®­­­ûöíkmÍu;þüŽ;gihJˆ½ŸŸ;þPoä¥K£7~pýM>uâ'ƒõ‡oŒ¿æ·×^õÿìlä €Ö‰‹>µñ-_ì}røW'®ü“¯ý÷“Ïì =Ý=qÙŸo|ãLoñ«áÓߢÿ }bó'7¾@Ê4?ý{5ÑŽXÿ^¹ØÇO|3^?ˆ·üÓÚ÷{WÿŸÃø"Tý½Š³Ex6öÔ¾ä+¶Ÿ=”j «þŽæÊ¶ók aDͽÿ‡ø›Ô‹>lø[°ŒvÙ§˜{? @i•Òõ&vî6ð Ò~ë,’–ÙÀÇ^´zï@¯T§´ù+u‡§ÍCÿHôˆÜÏiñƒ'£ÏIèlÖþøîÅŽ­)";*2ÃDo¬þ6‚Õ–6vTÕ¯øÜL9eÖéðá¥û-ÒvW";n¾üWDÐÆËIpm¼ÒÜû—ˆj—þ• bCϰ3?õéWüÝü–ra¥Œ—ÿ ,£nx¯+Âbƒ³þŸ)­¯Tºï6_þ”ÈŽ©~Ç:ñ5âo¶;-V ¸iìýKX)mëŸI±˜ óàçAˆvчÍ}#̘¶ý4dü5Ç©øÄße¿`ÓäUÝðš ¶ðáþÿljmÑë?¼þæ™–ùHß—Œš‰–‰M½ñ7§¾úÌÐÉÿR¾ à é߸³kkï9ãKŒ­ïЃ>úòÐHú ? '"L5™?NáÑ@5L®»¥æŠk?¬›ìü܆wÿAß—Ìš‰÷ãÝW4u~pèï¤PM…~ÛçUÍ«g ÜðÕ“=/†ž@Mß?µþÑŽ| ûLí7øƒþáø/ŽG^¼hòê£õ/Èå•L-ó'BÑN?GŽÝ’|F´_lœ\ÿé ow7û‡}ÿ–­³ñ–Ÿè?"–þomð¹ã÷Fv¸-uÇÝ«·ÿô̾_l˜\÷™ ï°‹¦|¹õE¾óßïÿW+ðç¾uו×Ná#Ÿwê·>öÕ5~ú×ïY¹:T¾o·õýoBÓ´?ø„ùÿ”Ò­; (|ÿX¦úö÷X÷ÿé”öŸ&5åôfɤùуôÒ+g_ÒE6k~ý‹Ú>ZîG¨*ˆxÌúî×Lh¿ÿgÐ*u4ÅÎé>ÐÖ ~ü­+Åü¼=ô3Öó¸òº7)7¾j®›úÅìéGéE—¨÷üÞ¼ì› ¾çzÉ¥Ð}ü¥¬[>I:º´Ü»Øá¾ìW²…“wݺak ɪBŸü(˜Í_hú).vZ#Cæ?šD´ýUùŸ£*ð'~y¬~×E“Wÿñ†ÛJ_ëþþî—ë…Û·¥Â—{ŸÞ~ÀÍÉ׿½ûò×r¹‘kB›¾­|'oËèqîKþ–õŽï¨ßUÓu;¬+wÕ=àºø«e¹‹_ž=úߨáãz‚¼>sçCûý‰¦Lí¨’©ùbçÉÅd]ô!ú¿¶7´ÁCàÌ;UuÉ%—¼ürž¯rß¾}[¶l™iù©PHž…Є§]`˜Ø> €  ÆB´Øy¡A³_Õœl¿ªÚoê‰ÒhG;€­¸¤`uop»¦ÌOÂT=‘1~,C‚D=b[T©ÀªƒGUù{eœäT£rÝ>ÛÀk¤š ÷>¨šcш¯‰†·¬°We@ _#¸i§­O‹’#ÌÝ£šìäã{`¥„ՉϮl”ÖÕï#þê(£Õ ºú.Öé¸í„þ&2¢ž Kä,ª)MWÃùñz DfH$úÌÃÿ,O/R@·®1ßO*Ô–Ku•‚â>ýœJk*têì- q'NB ú³!^ö ù!îYn™(ÙnષT®]×Ò]„½‚£@MŸªÁd3€ÆlyšL¶ R¿­êd}f3ì¼U€ŸúüTÀ<XQ#› N€Ó+º@JŸ€>ÿ1¹€,œdð‚&Tº,r(ðÐÙ#Ÿ9þàƒ¦î­§•²ÊËq·„ɤœ0¬6sij%«ºèÆÍ$ÒHw\¥ýá_¨o{·ú–wjû¤rókH{'‰4@™.BÞÚúÑ·ùÂ^è}H&f_´j‘Icr\ô£ÃüXI9¼ â¾räÏ+D& k. ×Þ€Ÿ95ƒ$bQë¾·~ôm~ü~ÆÓd¼­°˜ážèöRwƒec6áà”yÖà‚àŽGþ¡³‡ùôS,n!<Û=zvêóLØ]Š€K(€F-N¹é$jµF Ö³¸n· «Y_ €båB!d‹˜ [ðF„‹J`Ý~ûí÷ÝwŸ÷™ûî»ïÎ;ËPÁÈä‹Ü°Ùuž Iµ ,ÙOPÆ[ÈBq$D”b=ï›7µêä‚QBd¤«·™Ñ&áô޶í«û=XêBÜ¥ÜNÖy´šéŠjŸ<T—©ín¸¸Òýuãûhã• ÃËçœeßo0Êhg›¿ ÆÆ^@›®*²TŽÀZ9$.,|aDê¡%18Tƒ€`°’)ŒI™ìžë,¹B`åÃïÌôhåXŠÓCÒõ?åwÈ#ɦåu!t2°¼¦NLÓã‚‚ªNÖÑÉQP®fꂚ§h ”Ð`Ñ%°4+ •µ8‘¶¥è²X׉* µKc×ßÞ €f@PÕýŠÀò4½Þ=Ö"‰æ/ÇäxhbÈ 818œw¢¯A@„%ÄÎÔ3‘}OgvO³»Nœ–´N‹dì‘sÇöŽå©é ‡ð’û¹’i=ŽNíCWû} T}Ë»H“-í$u!å¶ÛIS ‰4c „õµ/XßúöèÿX÷ÿÀ€x!Μ²ÿçÜúéwù =S—™–ÅŸ}B𾓳.[É8{æ1³Ë6~`ÏB½ÑmwsËÀò‚„ëI}é”9?ûÒ¥ ›5ÿå³üèAüÈ~¢ï$Ò¾ i)ì8­…pV¨¿yú›ï"«×ÑYn@ÄÐ9,ów ž{ÿ!É×ÿËì¯þôÔ×OÅ£ïä"À q·¦ðzËú¼ùå¯àQ£°×ü6(¨_Õ0j Õ„ zˆånmŒŽ¬µr-e¦×ëA8ÑŸªÈMIJÑOzæja¾°¨ÖûßÿþgŸ}ö3ŸùÌÄÄÄÄÄħ?ýé;w¾ï}ï+} vˆ»3ÈìbΠÕgÒµJ€.»Â!) Z1«Á”³º']ÕÉ‚ÍMö^Y‰®i nÊÔàÍÃ*N1}^ø¼ÖÜ…‚`™uÚ{ËšíB¬krXò£TXðGðý/ñÞcüÈöÄÃü…¾g²ùw2ŒYßÿ&2iÑw „°øá¬wÂøžD, ç¶|9‚?ý˜1»äG‰ßA\Q`Í;ÄĘ8sÊfig&°ÊG²zû‡àA©”nÁZ'#’ž>~ä ’ 12MWßüÛ dª«‚w¤{½ì*ÚÑÀ¥bg‚Â2$°¼ƒ(ïåË%°$Y#œV‚Z‰Ðàçÿù³ýE×[p‰9“XqË>Ûd u²vB¢¥KK L­ÑtBa¦3+–ŠyãÜC`Y¾OÄ»Æs–*4é LUWW÷øãïÚµ«»»»»»ûÅ_|ì±ÇjjJpü:¬™CÈbN á:üv¹)³ô¥§O*°2Z@³¯X.%D´k$W}¦À©˜%:kB¿QýÔÕýÚK§sP`pÎbÕÀVÌ#Î8ñ½ ïË’`©éR:ïPºîœ^»!ã®I”©G-„¼;¥/—FÔêý;ÿ[63< ¬¥?&a}@.ÕøØn>±O˜qëÈXÿî?‘:9úyóËŸ3þ-ešðtB̲ ¬Ï0iÚû¤»¼‰Ü¥ö}/}©÷©Sñ ­_Þ’ÿé¶øÁ—aì‘ÿ \w“rókH¤BH† ~ì˜g{wñÓHçj!N›å=8gÏJš[•7¼Y¹ív²v#1hç¡H²†¿ô<öøÃÈfIC£ qç³XüÈ16Bê@©8×sÁM"óþÌã0 11&dX˜?@ŒÛRÙùDá0X+üÕ|{yØ™ ¬²Æ‘vK–‡ÀÊfØO¾ÆÄP™¾B!ÄуèÅ—ÐÍÛðCûÜ·Pn»}*‹Äó¬òŽªG B›«­[f–w9±àÑ•ÁœN¸d—”¯äªN¸Ÿbª…0iÙgæq#Uð'¶…0 zR«˜¦R NA„;‘àL*ïÐJÓÜÖ4î¯ÓtY/ð{š&«²¨XxÖò¸Up¡P–;Å€ZM'†OèÙ=g–•ËâœkÒœ…ÀÒ˜ßÌ7’)X3Á§¨.ªÏ9Äý‚´.4„g#Ï  … e… TÝðóÐ?³óO’ú­4´±’·sìNÄÉ>aL¬-cõä´áReÕëf]x%ë†Òz£˜<Ä£‡„•$võâßÏ9Ë„ºöXóVn“ÛBHÕ:ÍÞ”,r8µ%"º?nfÁò,Yâת:©LnÅyN%m ;`Ëއ겸C`MÔõŸN4#§Ó£—¡]±ÈòXd05ϧæZe\©¼UcÄ”ï8ë·´‚rA·]ÎÏòÞc Tyý] Nø?–üøaë[ÿ¡¾íÝ2£G±“îutÝ&ˆÞãÄä¸è#ua©Lñ‚?÷4zýÍ|Ï.q®Ÿôѵ•”O‹11Ë$͹Æ2"gÏ?œÛÉDmât/R…:…ùÙ•B~^!bQïHQ`•ÒÚŸ_ŒZßùOÒÙ BÄ@Ÿ˜œ Ȫ®2öpàŒHÄI¤‘´´Ó+®s¢[wÀù%®â9JÊ>^ÂaÌj!BÄãÈr#°¼°µT)°\ è§ÁÌ-‘VõZ€A²ƒ©ˆ Ù@ñØW>HåXT(,¿ áŒë*ó™e[+Þʯ%ØÙ‡À²4²ÔÌ.ë#5ÝJÛÍlð11y•XNà4Ñ#D¶L–L§.aW½X!°.DeÝo‘óO‚ÚzsÅì•»1…6\ÆcÇèÔ¬ê ´ŠÄi‘䓇QÔóXm uRu‚õÿL&‹‰Ô ¤€ZÅ–†•‚:?uö…¡Xu•Xv0eÑY¥â!î>Wýä q‡pî6¹˜­þPwm=F)('–&T»SU(W˜åK@Íõ-ΛÚå ³[ݶÅ2ñ@¦qÉ€v8Ñ>šÛŽMx)§‚Ôû–àÈæX ”U©  Ƥ柚>®e™pý‰9`0n—U‚Õ<¡ÛŽªsÙqŽ\+ÆìÌ%i\Ër!¨s¡2œFï^WMÙ…÷ü‚n¿œ=òs¨ªúÖwÓ‹ìß2K*°øÓ1ë»_‡ D ]½–´¶£¦VD'ÄØ?°—ýòAÒÚ¡}äÞ‹áA~ê8tŸrù5cçúÅ铨b‹=ý(ßó¼òê7*×ß JE<Æ~ò_0ì_™ˆN ­ât¯X`keNz^ »éÙPè)‚RõµwX?À¾Œƒ/ç½££[,üèôâK–våµ³÷(›‹…P*°f±¦S°Løóöu-*S`MÍÀr¶v!XEX¦,C&Y¡˶J S 0*×€)P,ƒæ&î H(KËmM2VŠå³ ,O(„ b2.< á¡"O%ËÊZG·½¡íÊæ®€ªÁ!°L53œIÐÌÙo!þ°ãŽ¿ðèî®ËÜg¤k¶ŽÝ€S ŸC@ëB¸GÂ:ýQ¦®DôôTˆX"Dvœ< B•®R›Z’ºDj Òwƒì˜¦G€R-„ÂŒƒ›€àÉ3(™Àª*Ö‚Žã¯'ˆRºîT:ï˜+{ån0r)Ñ#¤¶XtT•Œ#ñ·àÃ=`iì-—ˆ!¾F°,|\f–¥¡d§Ò¿¹ 9îU2ˆe¡3yQÓäúfÙ—^ÈâeIo)3\®ðªF×QÐ…¸eòλßÜjT)U êé­BÑ@Xþ8(W3µîü™êd`ùKˆ÷ò;$Z½ìéé©U}p„WpÊë€gV̯Éw€š>Jˆ­ÿW<•+µàhµ$Ígr&5ÿòƒÈjÞ$&_¾++˜,îýÉFfо#åã¦G*eÎ,›Êʪ—ˆñl®Æ5\–]a 8¶Gcæ8­eŠjø1’H#ݸY{ï‡é–œ”•¶¯ †Î‰þ>Û$(å•·Ùk­^BèºDï114@ "“—hÆž{BÐWÃâ,öøCÖ×¾ smè¼ H&øžçašìáŸY?üRIó_>ˆ?àUQªíX 4ˆ+üÕ¼ÀÎqÓ}à)ˆËGzÍÚÝ«Üò:å¦[é57PXò¿|°¼;œkݦ2V™3%bÑ"kŠx ©›¦©n•Ã;ˆR{åJ¨J„T¹Ž®…PÐ áêÃsíì¦t!d¶Š*1…À’kI.…2'÷@ø¡0INU ¹æz."ÀO|4fW;54g!”1 Ù™[¾Ì–›‹æXç‚rpP§™ðl ‘S3ÃÙ|ð±Ù ¬©C9œ´KWÜùÌ9q‚v1½DX|¸‡÷ðñ=êúwÑð–ùÝø 7Ü0¿ôBDBpڰÖ?”RÓ €§Î¢¹›}_êk$z€È–IËÏ=LÛnà`i¢‡Ý{Ýâ Ä}°ô Ö‚Žã æD«SV¿©øQ]%ã(°|b€e!óBÛ~/Ÿñ^p“ =n’@›û*ñ5ŠÔY‘[¸ú*IJðï˜Ëê€ZTEŠ*°tJß'î#ÅrXv`Íåáî 6'å7êþ„bé öý­Bœ.„Dfs ]¥¶ŸÌ®Àò+š,>#ZÍ 7lÝ7~Ì™ù”åužÜö62Šå`'°RÆyH;QA÷X\jþýV 'ÄÝ„·bìBhÊ"x•¹º9Ê5ªL,wÏPD6eR»êˤšvÒâ–ü~%7'o²ä]„1Åõ°ÜQ%?Fõ]¿‹‚YÔ@„#":a=ðôšÅé^*·¼Ž;$ÆÇd{2ºn#ß¿‡Ÿ<.F‡@ÞšnÜìnF?@¹ò:¹0ݸ™Ÿ<Æ{‘Ï(·¾añ>ai`;Ÿi’U«Åù³üÀÖЈT’ttªïü]~xNUCc #°æwKo*·‚R ©UåêëE!Òö=8s .•I‹É hi뀚Zõ=§O˜_ùöü3Ê+oƒ6;o»x0M™u¥¾á.öì“üàËì©G(7ÞJÂõ¤Ñ¶ý’Pˆk,…ÐÅŠ«p^p0KÝzéZ³°oM©­#¡°ˆEÅø(il¶÷èÀ^ëûß ÍÚGÿrÚõÄäi(ý­æÔ… ¡°H§Dt’Ì@`-Ó÷ÈÔª²X’⡜3ǧˆ #‹¸ ¬Â‹iZصDf %`g`x«z»Ê•z=ØÞU § SMÔô1Åò ¥‡ÓqªQ#¨Å|© õð ›·ªõ4›ÒW,„ÓB6’eÂÊÂf§]’Kç­qµ¨„À²-„%„¸»Í•æªÀ³Îe­îÅ IDATKeƒõý,M#ÛHÝz@ˆtµ7 2÷Öxá#|b?ãñã!áͳ¯æaUæ"™ÕHüÍP|˜€•(¾ øo&̨Hö£¼¬*êB¸‚Ì#¤…€Ò~[‰‚Äê„Òñ¨5Äï™–Ôö 5¯¸±uÝ›Wo節/²Œl<“«Äíœ2å²!a8êz Tõðb~O]¡9ÑWev ¡ÏÉÀjöÔj>x ŠÍÐþPn—CnWŠrö.m™’¦á>'̲,®§„P§p’[nмk6”÷[êÛ©áP—hS˜/5žÍUÀfKµ+æIOÛ#“¹)³ŒH9}늸W0ï°Y'€î¸ŠÔ…H¤A¹åu”K¯tíN¤©…ÔÖ‰x Np¯èó´X=B–v/§@Öl ÝH%ùž烔~â’ ²ª‹¬YO¯¸„€? Ñ&›@]Á € q_éBX9øþ—dN™ó7ÃC D 2s=õ{úQöô£btX @ö¬L:³ ™€a œIŸ5-òBÜ+!°¤‹pÆwÛB¸ X^H²†O‘Ͳ–óË3¹e·Ðå å(°¦~-YîXÊô]¥:ç•më¯oYsI}Kƒ?§pâj€béÈ×\dt3 gëàx°õ:OÙ#ã;Í…Y/7‹8eÂ4(3(°(¦ÀPG+IÜc¬–`!„“%1?ÂEqçÃ=|b”€Òý\…ˆnÙ¿ÿ\VÙqÛZiÿm‰Ì‘ãñ^°, v­<›7 vÉ2,>ú‚ñâǬ#ÿ*Œ €½ r;<Ù_lÿS|ì%Ró€ø›‹,Ÿ·ŸÕ¤Àšã8® JP%ãHüÍ ”ø•¶[–z_æ% t¼6ßBØØRÍÂÒ ¢`²kÕ‚JVi—М…p µÑߊvv£ Â~V%Š·b Éݨ¸ ¬ 2»ËÎ=¤É_³ÿ~iïFÅËÓ›§Àpd_röN6ÌN˜xH.Y‡ŒšIA91uÑáx˜Ìºrâ%Õep.å]AE §Ú4ñ&=p,>äîC‘’T8ýc–‡À‚›e{ ã5µqÒrG•œQ§Ýr©rÓ­ÊM·º¹W6AåÚ›ìÇ„5쇫Và§Á{¤ógá!Â\(7Ü€½øìÂí|'Ž o@7n–wïtÛ)#áT …m–ÃGÌï zBÜçq«‹ 19Á_(Ì“â'ްçž.7à¼\ðwŠGs{21Ë$õ;«(æeI{'¾{'ûÅìð]ÏÚY>pfêòް ùæ¬ÀB¸é1:ƒæ@F¼/à ,ï –¢Àzn¤ïóÇþÙÏZÎ=cÆb)f –e.ÖÔ ,'|ÝT²/ɨ„iC(WàÔ!ÒèJI>|gèõï´~ëU­›‰]„ô\-$õÝ2¬`A±Ü,„D…ã†M2A@e~ 1Ùë:¬TB`I>²ˆ!Ò<ÈçÄ1äY‹­™!ëÌO¨kßNô¤Ÿn¾…«WÏ)†½ª¹w¹"}Þæ³²£ÂŒ eʯàX©bÄSDfÜàñ^Nô0¨€Öt±x¯H`æ}`ýÚópfLîpéz“ª"°æ8Ž+¨TË8…ø•Î;@«ÉR”ÖÁr!—vR£h‹ë¹a1‘ÇŽÂJŠd?}þVmóGí­Ë…Ô^)´´™'ϤQÞÐ¹å ØàƒÃÏɪC…â­üòeóv5U£ÎN`5ø‚Ë~ Ã-JÈêÕ«ýª NåYnù¨jç©+Ó+°üΜ'å Ò–çâX\0dD¡A1Re&§úe•«À’Ÿ·¸j?ÿÁ¶×§«êÿålt}ÙQ8FÉ™XYn¹ò±¨åQl1&ui˜ly—4ìzú³VËu:U]ʪ®é_óô&#k×ãÀtý&žI‹±qæY³N8©Iñ‚nÞUçJN›Â#F†Dim'3íÀ€?€n¼(¥;®fO=¢ì¸ÚÙiJšÄð © CÓ¡i0M˜4}~QLy°¼ Îõ[ßúÔ7ЫóÜýüWOðc‡qËk•)Çü½õø(?uµu¶€Ž.TL{ëb^Æ‘n¹T¸"⻞å‡öÁ9}‰³g .ï>Kÿ`}y–7(­‚ãD’³üÀ®WÞp×ÔD< €,C ¡wejUñ쪱‘Ýñ‰Ä›`§©º¥,33–”¼è–0åÞn¹ËµN‰Ë:B¦Z¥–MŽÖðÆ%i܇üËô¤•Á+šr¿z—ÀŠè¹8•]•W¬|ÈÚQz8SVªÓýq:èÜŸÌ@ @D«\UJ"T,)M®5ãFìI¯EûmñÉÃà&mØ!ssìP§JXìüã"9@›¯£¡¼þÊáðœN "ÞËã½4²ÍÉœ²ûéŠì¨`$TFã RÓ…2XvX»äΜŽiʼn0‘8¶ÿ4b0¢P²^Œæ¬¥?áÎqWP%¨žq¤-7ІËf_®úA¨¹ Ñë±ÀÖ¢ ¢ÈŽYG¾˜ûÛJeQ‚WnI`X¥ZäºNŠåÔΟ¢ŠêáÅBÊ´ ¬Ù¿JȆ°¼(‘Z׳1#Ö©PMòåùP\rªÖ‘}Q¦H1@Ú’óyn4;0nÆèV@~ÌÓSºábõ½ZàÝ·!&ÆÄØA©#@/¿†ØKV¯u—!MÍbxP²!$X#¢“"•$a}ž1Ç`-1…%F†øa[™B7o#ͳçÛòÞ£Ö·¿ #‹Lº ŽJ Æwï„¢÷˜›¡.âq Ônzó2Ž9ÚWóð~1ž;о©ËWàŽüCƒ—ûO7nñ˜ä×f °–«…Ð;ˆv{QK^S¼lއÀ²2Ü™ãá ËXV°ªbûʇۅP Pe8äײT÷d`À­è‡ü ö(K¨%yqL!Õæ­Â^UàÑ_/–™…P#¹wY·)bÆCÐ/ãñ)Ш×Vðv²¯PñŽÝ.¨ÌÀš[ˆ»Ä"g`‰ô Rç¨Çeöp¦BÙÉÇ^ñóµ{ 8Oœ7Ø©ïÊ¢À M™1‘@‚eÏ_”€0cÂÌõ‰“nÝÁcÇ wÄ÷¬n_¨"¬€0ãð’Eò ?ÿì›XfT˜1€”kxDu(°V°‚ù…ÒvóRïÂÂ@ Bñ¥½²¬e = €ø[”¶›I Ý‰¬R|tÍ?SûÇoﺲ”…m ¡°…ÏÓÏÊ:—u•¨šçF.¬æŠ9W%ý€åBÆW%ÌìP*"¨Pó÷Äírèʾdñ#Í nPX-q~V#=Yýsjª®‹ÂmZÄ©÷ãi@šäŽ^s†9Õ‰ln™”˜&3Ë–ÜpÊiï}áXHK;‰4’úi_E/¿ß¿¦Îe¸©Bdý&¼wú‚˜œÀ{Îhqšo)¿Z¿Éå\HS‹òoõÖOê]ïÐþä“ÊÕ¯` ÇRÓ¥l9gûE´Ô9 —ŽXréyéƒc¿x ÄÀ2þä#¶àÈ0¼c'â1ɉ ¹`çü¥çˆd\JÿˆD ©] +!d³-ê!á¤k $…ŵ’ÕkÕßx© ‰‰1qnºÉøØ…â.S«Š+°¤\ˆ{üt®É.ËXš™¨P$McGb•€‡ÎùRïS»Gs†Ùïœ~ñŸøÞÎì-ï3̆?í½ïO{ïÛ7~¾Äå]:O^Ó½0ˆÍäýNmk:}:õHšÄ|*!’êHž¨N Ê=yŒ½EÀ^µÌ,Ér"d˜@3ŠÈ\¥=€fE ,¢P§ëê2r‚´ÄàØ™@øXáÙé,+¨.²ãÂŒ›û?kìú¨£·Öé c\1Ø_,Dêƒ,Ý3•³–ýW°‚êÇ{\;"¬‰Y—¬rðØJÛ«”Õo–r9=²Ô;5#j5½Áô«% Ìm–sµ›öX¤y¤ªy*¿ÍC`9çóÚ"Z¦Bá:€¸i g4³0Ø-uì’Ñ¡´¤3"cÏç9!î â$ ˆ€B)œ@›ÀrXªP$¹l‰“÷iP˜$¢1ëäµ ¦‘#³˜3—#-„R¦½V2•±¬/õ>õï'Ÿ)qùTB´}Rûø§H[ij!«×"›á{_ã£0 RA`šnHtÝFâä1bèï=j1)Eë‚?_¥4#æ¦Wâ2kCžÃ‹®¿(o¡` ih„Ï€JmDÈw>m~ésì±ÿ)w—–Z€~ü0ºq3~²„¹#ËûzA)]· €8›³ˆóNµ¼` ,~ì´‹3š ª%Êr¢[¶Û.¹ ˆEÝ=Ì¡" ¡ðÜgUx˜B¶lÀ½ ÀÍ­çøáýŽ…pùe`åAXEE=²×­·%s2°²ÜÊJ !WätT†—ªz&½g_¸ç¥èi÷™^s`´¾·ß˜Ï$Ð]£±p,Ü2Uêf…£/›j!ô¦UŽdSßïÛý§½ßü¯S»à€Êtô‚ê¡/ð°<9V)’Qó¸©À²“ÅH}÷ÔÞˆóŽeF`iŠgØÒܠͬÀò¬¶ú+`7ð{¯ù˜ö»:JjH¯ˆùèB(3°ÕB(Dú<pæÖ¨N´ZpSSNг'ϸIO/õô”\¾LÝl¼Nh݇tQäÛ‘@…}IìÄz%R|ô|ôyû]r¯1ïwâX ”W‚ú.¬ dB>òœHö‰ì¸0£H° €€UŽüÊ¥2«A5—q\Aõ`e ƒµHƒ(¸Ô¢’ðEhøb¼Š ¬²Ë‡*Â`9Ñ–Í qørÅœî4 ¬ÓÊ#°ä Ê4Ï$ËÊ^?>«) 9U¯9B¡Hs@šðÒ%ã–QêH´Ê©W¡0'¨‹N5åæÄKø¨ €)†û ›áþ!ne[§fЙeäY í(°Ì’«Û„•ÝîÙS[íç« ïŒª\~ ëþï[ßÿ2Õ? ÝðùÄȈE­Ÿ}ßúÚ¥|Œ,RI©„b{^+馑?\99Âï=€l,9ÕV`%1Û ÚÄ\É ¬%ç­$D<&Οƒ®«o½Š"Îõ»YN3Ÿ<ÆHg·”׉sËÉn©YúnW ¾gÒ¹€èµsÜE"€Ô–t+7ï?Fºn“Mw¶wÒÕkðŸ+Xf.Bây\Éî]r)¾÷Eë¾/[?ÿ‘|’õÀ:¯bSiï¡^RŒÞ7 nN&ÕFfJ­0Áa áV`5ÑDÁS`×A%Æ¿'§~UÅicÏÖ¾ÚúóÇYË!-¶¢Vß’CŒµ’sÏ:Ïýï¹–õ^ï<û; f]ýÇÛ±JÒ›únÌBhéyK¥¯Ó¬5äŒ0€„±º€¡,ya/¸Y T†³£¾ìK7má( €IeBiå´ñ„NžR¤\)Á$$‹øz1=‚Ê!ò XøeØÒ( aÅ’¬ ŒÈˆÛ­éØ¢ËKÈ…P(ÏBXðoªrazòÛ§­—_+^÷ã{ß<èHÀr¥l0Ï¡‰õaò·þ{ݵò‰‡!\v鵤Á=ÐwÎÅ5á'<ÌÍ ¶Ü-&Çtšû²›•Cgpî4{ýµì£šž¤¶vø™nò•’W®AP<@<þ°&JÔè°ñÁŸ¨¾-M`¥W¬Àº –|æqvèRÚ½OûéÀlßA1|V>z?ùÄÃÆOü\UÂ%ø3j=‘)…©—X–¥ÅV=ýÔ?¨F‡Å7¿Î^íŠBÜ7Ú* €ö`‡/“/w¿þÏÆ;?€D€ÊfàØˆ'Иâ!€¾Ý㌄Trõ cGŽª/‚H¥ä‰‘Y„c³½ù;î è¶#‚¼ªúXº`7Ì›„XZrÅ¥Áw¢l”ÀrÍÊûøô¤Ž »ækVˆ'N‹ˆ'•È©2kÖ] BWáy'й%k‰K0€ULÍ™y7[ŒÍ#G{V©b„´Èõ©1W)7’…¢]Éåk@c†×›*ÛPl³Ñ€q×bBÝéM{VC‹/)²6‡À’©5Q áºëM"°ò£X¢`ÒÚ"9ó¤¾[Î>[çåbøkbøn9õ0¤ bþ‰ÆY\µ¡; ¹ð¢{ö‹ÊY$³…¢Ý” 'þK RàjX±~S…I(!&K»¨ü¸*Lб{ÅØ½rê!é`-YËáò»5â»ß âí Š³™¥{33çÀl x«•)°¨ò‡&šhbëÃËÀrÖN`)£Îw¿GŸgääC*sfÍ«­¿M)†¾¦œ´ž$·Êòþ·°–ƒŽ˜|@e‡ôš¦ßvhLå”´OPÿÊÊÇn ±2ùU-žÊI;-³R¬²vÆô—ìË€  ^@¹+4´ë°š÷Jf]å:q=‚ÒÁUÐL#Ê Ò(¹¨˜Suý°¡•’m¤YÖ;¾4OÄ%€¢?BKÆÜ&h§µÓ!€í‡•6}4±Ž ¶v~ËÛùmwj1Nõew/׿ª©I/C`µµë!õ¤N¸Ö­)ÕÈ:wºA¡“<ñ’|òÑЯ/ C+ °< ¡–ùÉçžÖ&Ä*X\€b…Êrúú¸ êA55!î¿R†°Ø±«ù ·ðn¡þ53%þ嫼pnFÍN#ž ]H$©µÅ‚š™ÇV3Sঠ×]ÖŠ¸ªýV*›%SìÀaâ‘ïËgŸðX["ˉßz“ÇŸµ?óiMתÓ'°Þ߉¬‹ 뙟úmvÍä³OЧÀ®zõ°«ß¸Ü«·4‚¼*UW‡«¿a?] ,J×VL_þìÆ,©”¾–YÉà°•}øÿéÜ“Ÿ˜þ½ß8ù…¥OÏž¼"—|9¥ÇÒ°ênÞÉ“’¼ÞRËs[ ¹cšÿr|!¶YÍBXR`I¦C‚y¦‘Ì<˜dvCÑ¢ž«i!¬€É|ÖS`Õ&°Ú,ÀŠÈ*Á“ë¡©ÚÕ!œµ9ð*üÊL¬í2Þ k? Îm‰Z<-gž³øŽ·™Ç~ÝSIð(¤ƒr+ï2áö‚»OóDZúÒ§ÿAN>€RûP|¾ŠZRT»ÍiÕ ,0“¢ÝPBÿT®²ÅCåÇäÔCbøn1|·œy Eª+„)ÖÏ{oä;Þ@§T~Ä(±Aî•ÕZо2Wc!Ü ÖÅ—ôñêDó8n¬v(–߉)WSBC寔“&«•÷ÞÈ{oàýo”{öK+=ˆÊYTÙ*ýßU!&P… ¿5µì¼GÉ}Æ‘Ÿ§h¤#§ŸðVž[ÑÎl„¬šÝ)ÁeÝÔÂ{EL·,ëJÓ=\¬XÕ®¢ @AÚ9d´• ,C««$KùEM`ió ­-„¾ ‡†v]‘$Óó(YWg]•vRXEžÀËCÜ#:èI̵°¤íèç'>ó‰éß;¹0£ÇÜm”‚dÊpw†òr7Ø[²Z–¾1˜OŒ„G@¶Ï‚9›90Z9^ÍgT6¸@)âÊu4ßáYÛ:hÇ µwªÅ´û/‹{îvÿåóÎþ¦û7¾tUj|¶ ¥ä³O6²i5rN )©w%RÔ‹‹EñÈýÚvZB>)svåkÙ±«¨ás*³¨Y­FV¼Ñ_FêÛaþܯ°½Q,Šo~ €<þ º¬¦J±T¨ýv-µ´Â0ر«A$?£†ÎÀа£+ÞŸ­ƒà EM¦& ±D¤›;R• €ÃðüõX³Åœ¾†Ó  .[A£¯ÑNµÉór@Kf@e֢ʩEŸ,^žVKú; 5=aHnØEFS/ÌàåˆU·ú nF„ „´]C¹9Ñbå¼ZU$ þC±Í,‹iK°áˆÖö, A1µ9Àª},‡;oª…0?†¥ ¬än¾óN¾ã­¨G`)wè+€âý7óÁ·S´‡u_Ã{o`ÉÝš¦Ñ^å<ÿ_Äð×=žhòA9õˆ½GÎ>¥œEŠõ‡>Îw¿>Ìdɽí%«â`«œ÷F¹‹ÐS`ió)Pùq9w뾆÷ßÂûoa­—ÖZ¸u^ 2àæ Eº(Ö[ÚPXµ: áJÞ×áâKúxu¢y7~ˆ{%FïuOüç/n 2ý2jñÜ7|Ç[A\åF®{ÓV´?*ý²fá—‡›#ß ì´ç7*ï4;/^ðVžo´þyK¡ a À2B ,Ã-³ŠìN´˜»ú ÷Ê•î€þ&F`ÈK;G9Æ–2P.ûòZá¢4ŸX¥‰´îhBÿªHæµK”žÕ#(‡ÂoS#B%>‹ ]ŒŠtu]eÚfíœ&°â<Ê(€©‚wŸï†ëÄE°Ÿ¨áð"ižU‰»>ÖxìîÁ«úŒªKý4ô(]‡a…R¼œéGïß¿W>ùˆZL«ô<Š•*9tÖûáXÃçÔìŒ|î)uî´óßÿ”b/Ac ¤ÁÎëÿi`çžü4uõ¨Éqùä#•ÊfJýn 渇Ôf+ØŸu”jf J‰o~;º¤Bã~ IDATŠ*ž`»öAy¢²ŽC÷ R¿—¢³ÏÔäuú$§¬)K<ò}ûÿ“øÆ—œ?ÿ÷ Û †ÏªL~X;õîà·¿€: )‹ƒ7$Ø„/#õí0>ôQÄâòÄKò…ÈW^[ |Í ,o¯ÚÚi÷>Æøõ7aU•¸[¡ ,ÿbQ7ÄÝ'°J—‰’…®#]F‰Àj(¡i*ï±E"Ôǧ™#—¯Låx]Uh¯ùø€C´@±\Ø•%oÒ¶G4kÃ>Âîþ%–¶ïÝÚu”$ ì‡Êpò®£I@«ºË'°$×M‚®ÿÇ+̈ˆèã˜aB˜t7ø¼·Í,=|ÔÀ Z›¹èŠz¼U’6…ÀRë¤Àò¦‚7ƒ¯Ð}y¤o•;íG`UùªÜˆÊ“ÙÂûoä»ÞÍzo„G`¥Èñï-Ûfèžý2Ük=Âz® gŸr‡¿.Îÿ›{îËxÿͬí22S´…Kî3)¹Ç¼òÓæÑ_YÕ{÷ßfb1~¤£²#øÀmxÿ-dæŒ*LÀH{>ÀwÞÉwÞIÉ=5×Å# F/=”âúÈ€'_xµB áj!l¢‰&„g!´ç!ò6UœcßQNÚ=óùÆ×£^ÀZý&xfR¤Pª8³¢ý‘ /ÉÙgq´~ÊYPn™•” %vÜ·­˳í7f!äÁ¯UF`íJ¶êàÛ>¶o•7NžJÙE3 3²„À"€á”<žK>ò çþjŒÆ"°X@`)êŠ&81R)&ÂBJ«8³àÇ|T(°bFivKå¼s¹àæ‹(H°(w"ælo9¬À"C°«Z@F0¥üøÂéàA'¨2l8µ¤‰Í xETÚöåX¾ {í5ü†[øM·óÛîä︋:»¡T4@ Ÿõ~ Âàk¢×R/ñïßv?ÿ?‘˲#G÷üÈÊöÜ'°ØÞƒàœ_wt _2¡\ׯb°‚óìæóWjvÚ‘ €]^…X§Ã—!dü,½vl(•Njé–>R:†Ÿö¤DXS¡üî=ÈçhÇNpC>÷´ë•NÆ“ÀêXjvFe)™2î—ù57PçNË矑Cg49¶ ÒÀ.ï‡TCÍ¿ævé1%<ºbù-|ÒÊÏÀZ‡O ;v5¿ùí0í~Ý$'Öï¢u5½"°‚ ,®®4ÈЗ¿§Cæ|¥¼gÃs@+cg´K,ñÎ?57 ™ïm3ãð“ªJ¯²¼ÐU¿òXâù-¿˜ÚR*&!YÔ0.áewÊÓ…¬þÖÏÀbʈs¡+þœZÐi4L`I ç6 ¬L­Àb¾+ÆkZ‘n‘l]'±0¼ ¬õ°J`s¬Â4øQèUPa-ymµôw MÓ(gJªü¨œzÀÂBu–×Ðí Ö~aìy?˜Åz®•ªwòþ[XÇEôªÁLcï‡ALLÜ%)Ö f~Ì¢XŸ·HûѬ0R"°à«±<ó ç 1Y `Ke`Õ:ŽMl/4ãæ@‹° Šbü?ÜÓÿ ^„׆h÷ü¿*{Á}ῊóÿVg ª0iS´K«P=D:äæ+3ûê­'?®§"äìÓu#ßtO}Jx ÜÜZâ„6t@‰ ®Š3A‰Ç6B%Uu` )°âXKcÌPDQZ(ê‹U*°,â,Qš [üt‡Q HF¢†Àɳ„j ,=èÄyi1ÍL—ÊS¶7°Îˆ‚޳M™QKƤÝÀvô3€CÞˆ¶ª+¸%X°¦‚]ßëa/%ÚJx•ŸQÙžý4°“9ªéyú52¤2‹àœRUn{¨§¾®'€Ê.ªÙiX~ýMÔùe¨vu~ð(+ÂïúÐ*I”HR{"Q¶{ßÂÂõôÁ²ÔÜl%;³˜|ƒdƒ ,Ÿ¸ ¬© ´g?j+ÔÝKÈfœ¿ú÷_>ïþÓß©Ì" y5? Ó¤®±©™)yö„ þADcººqÕE„êüYø\!íÞ@=%žx®+Ï 3¶¼ôgJV`mÞ—Ñ0ŒÌøÑŸ¦öÎ:5u ?$œ.thÚVCpKyU¬Þ$†¾¦„¯,Ò'°)´×Þ\aÖ¼[ÍBÈŠ»îJæT| aåvOG ¨þöH €0ÊX®éÑUU * û…}dì&L7w{¹F¾À¬“Ó ,«šËò»‰Iñ¨¡ ,ïš»ÈÒú¬å+½5€.Ù8l3Ëû£3 ¿'2^7üH§Tt,ñ>l¼w¬ÑBXj!Ü §P´&¥ïaP•ÀòÒß«•nx ¬´ÊC:ª0)gžÈœþ†»WŒÝ§¥[¥õä'àXÀ:®„¶ ö\gù9ÖSéÈ`Ý×ðw˯ (¹ÛØóAïf,>@{*=‹8k]¾û¹´¶H5–ÙÀ³ñ Vn™n¥¡¡¡åjbË£y7:õ¼ Prú13ö|÷Þ@É}p³îñ?VÅ1zOKGh•ÌÈzµ‘NÙÙ墺;€\ð²Nê»åüq|×»ù®»¨ü˜Õ¦¾™©Û3(±›¢=PR* AÛ^Vu–7Ròæ-X'e·þ&j-yš-€s"Æ’ñåÁxÿÀÜeG­R:u`¼AQÄq_/lŠhð«R² s@Ô `” „g-TZç\O•y—´šñ¨ŠH»¾…0œe(„£py%UpÝÀý!C“ÛAX‰£¶4õ*?£ÒànógÙøðǨ·Ÿ¾ùœóWŸRÔÕ‹j7KÔÝ Â$¨ÎÀwSÿ 51ÔKL× —qË;‹óÛî¤öÎZKÖC4f~ê·­ßú#D¢CCC`Œú¡”<_v@Õb:ØmT(°”R#õŽþæóšÀâÇ®fûW ÀòÁß|I52,Ÿ|D>ÿ´zéy5> ¥¨§¿tÔ¬µ¶Áuå@`kU` ŸƒÏL±Ýû@$‡N«s§¨S/% ! ¬Æܱé_Fvä¨ùK¿¡³ÞV ¯…J?7¡Äp^Uå”ZªÀ"ßB¨\W¹L2ô쎆¬E?p*P`I¥‚‹×¼½‚6RÍ -¹çcÅ;¢q”Î Á¶2Â#¶l^N`I†òŠÞŒ[„O!íJ¶ÿZôgÿ¨åSmÅnsާÀªâȲ˜4¼é+ÿŠŸ7 ÄÚ—¾ª*˜4äÅÆX+n̹°0¹ÎÀ’\îÀ»¯…ÅîÈØÅ«;k¶ÿ®ç¾yµ)°ÂÂuØ©e Xu ¬n2;ÌÜ Êce½™ùª ,?+(õsO¾[¹bÄð×YËA¾û½úæÇS`ÅüÙžÔ>Jîã;n@ɽk~‹‚u¿Ñ°ZÝ“« ,ogb}Xj¿ëÞ<ËHÕé(zEñ~ãÈÏÑ #çƒ{ª­À7_~ùåzšX4ãæÀØÿã å:‹§U~ÂØó£¼Ý}é/•“@:bôJìÔů•Ððåå§šÀêL-s•P™sîÙ/fk»Ty){N ß #ÁÚ/§h¯Z¡_À^$©¯Þ¶»—¿ãÝUýƒìê7ZW\-_|^žzY>þ|ñ9:x@Åv©»WÍÏÉž@úoO«o!”Ãgá+°OPwŸ‰ CÍÂ\Ü"(…†mqàËØXºüRxÖ:…¸_LbX-e ©q#䉛HÙRz…oK íg7™Á%à4âž‘A執aUѼ]èŠ&üSžÀÉ«ŒË?¸ûª¥+Ñp¡u[eÛ•@>6 àŠö‹1rMe8‹v±ÕŠÏ•r÷²Âã­tãJ†b¶-\˜VÚ.þöùÿe›9Ä< À®d;ü.»´›SŸK©€åë*˜b:SkÍ$àF3ö$'° l¼…p›XÔ?žy\˜6€„QÏî~M÷î:Ï®/ô‘¯QõÂ8Ö:B…j[µÐIN=lO?j^ö©Ò͉›Õ·^©6ç §ëÅ€À‚n0í½QI[Î>#Ó'äódì~ë¹NOÚ‡Udþ8j—KnXë%æ%¿dàý·ð¾·`…¿”ÜÏßf’™T΢zÅ, ²it…>™¹XM4ÑÄ  gºÈ0ö~Hfΰîkôìå0%÷©ÌicÏ+gA }UŒ|‹µ_¾tæÂW`•‰·õ¬ƒç¯ ™~Jº§þ?óÈ'uë¼ZÎã]¨J< Î0¦f§áºº4нûKjj‚zûùõ7ˆzúÔÈ|ð{jr\|ï~ëkPé•^@4FÝßm] •Aªš‹ ì’O>¢-„â«ÿN@—ã#lÿa»ÎWQ'_zÞýâçPôoPí"_55= m\–ô1LvùkhïùÄÃòäËŒ`iPW/N¼)‘H²½è÷U*°„PcçAÄ}iÕžýå!,¶ŠÅ©£KÍLm¹÷õ€ßB¸¹æ›m…2–pkR÷îÝ ®cY„CÜ•Ðâ_ †ž§ .+µð_Nþë8uâžÐ¸D`…‚Éýº’3j(Ýv~h®JZ1_¶Ýs‹sÒ,2;¶£+€9–0œÙbNX“ÅtpMÎ)O%Ì%I®€Ñü"€‚¹oJ ¢’%A1‹2¯@f5V@`qiDü&Áß=ñu©Ú]²#- ŸÓtlhaƒX[AÒ±B(pêÛ"š¬ñQÞ|d` G}W…=‹u“`-s6ô ¬šß:ŠõQ´›Ì(éžýb°B©Üc;ªî¥§À²dvx%vóÝï1öþ°uåoóÞ롤{öKrò~ßB¬ÓÌö*@ñJ”ëõˆWO¸¯³’Hßqï½ÞûÝj‡ÿ7Yín-ù¡‰&šØV äÞ÷–ð#|ðvÖ} 뼊÷\GV«Ê×ö½ ({5,„ª8Sÿ$/Ó¯€(8/ý9¤Mñ|Çm¼ÿÖõrá%1þ=U˜TÎbh[Z.Jd$ƒæŠªXe0[é·JXú×jË‘RQnˆ:-ÌŽ-- \ âZîD @L®ÀœØŠøŒþÔ?p ŠÃÏtW¤ôTv@o¡|UA`Œi{n8q#9ÏÏ•…wïšæó`’ÙÑ3¼ŒÀrs0@„†ïùò€ ñÁ„Å\>Ÿ H÷p6 뉩á2[È­ûškágGþôÓ¿wnqnÓ¶xA@½;Œ÷ýh­[M0 jï„”òÌ ùèýp]ùƒ'Á˜ñÃÕ¯¢Þ>ⱈ¾«&F+V F‡°ë>³§éÕð9„’etˆ;õöÁ4‘ωûþ·|ù8bq~ÓíìÈQÀ+ï“Ï>iÿç_uþö/Ô4HLÈ'A±Àa—]%a+@6ƒ\ÑXãIÞ”LÑÎ=pyü±=Êžíö#>.»Â éܱ\F>õ(VØ® ÆÎÃu©»¯’‚íÙWZ§¿?á—w}ÈøÈϰ° îbA8Ľ™UAw-êVyÜP¨µÐ'°àXæY—5¤Ç_)¦¦dÄS‡X!Ëõ›ø&ÁZp¼’Ä²í¾¸0 ™÷¼Ï†ˆxvîüwF_ͦgìA\E²Ü_E$€¿óëé? _RY%‡n0$… Ž¦A‡Áà±O£í/ˆØ+¨P0¤‰&µúoJ®7q—0W<˱AxKÇ¥·æîx[ÛšÂÅ)d„^û5YŒ~¢XgF,„æ±ß4ý&Y­*sVN=ì½°¶ð2°”=¯X¼ÿ­Î¤}šŒÇøî÷{Þ À=÷Uœ1íU¼(Áßnìù µZõJX[€Ázà.ô.4±hÇ ÖrØØó>`&뻀ÿ÷*Ëg/Ç`$ í€{ªQT™³ F‰]úBÀZ/¡X/ßy§®ÈP¹1z+±çÀlb¥Øø ¬^+…³s¬k3XžK‘ަúÃþwüŸë¥ïÖßÄdHKÇ ¨±v«ÄvÅJ!îÞÐ.© ,®3°TQ9Ì+A™K’I#Zs“& Þ!Î3od_ˆÎ08€‹( ÈÀ’:yeHN” ÷uƇ!,&€r;¸ÓpÕÊî“ÁçïùŠõ¥ÇfÖ!1§Ñ3*IÅ­H¿9Ð9îîßÖ½çjb BPgwÀ•PÏÐ<¦î×þ¹²,onºÖ3UDjï¤În•]|·ô\& ©VÏ%¾û-Æïå7—Xjz:ÛK•h«y íˆäw¼—¿ùVj²&¥ÆGÅ÷ï þ©óçÄ¿[ ŸõžÕ î+T¥±K<Ç¿á–Jëb@`]îÝàP< @ž=å~ååóϬhCjô<,MÓîýø[n+ñeWÚ³Ÿº¤Â¡YÛhx#¥B ’mX!Ñi0Ëç† >|]åºä°ÈÔó7N]Ö+óÓÒ*Ë· VÎuÒiS°c lÔsÌ ?¢«z gŠ“:¤wÿkˆ€ožñëKÿ<öèœÈžj'¯ló…\8ä‹'?@1Þ7S•M´q9Ê€±j¤¿å;Ÿ<'™à+€ãqg" &€ü·úl? Šºæ÷ÿ~û/¼³xW$Ó™Ú2 ¬KÛ{îÚuì5]«Tüj”e`­yZIÎ=ëžûbÍ§Ý DÞ»ªá»Þ @Œ|Sûé43U=Á 3I±~ˆþ óÙ?u>ûuî´G`u¯ŒÚc—@»øÍo¯|ª€½öv쪒2+!ˆî[цüÝë ¡¶vêîåW½¡T}Øp^{Ul£áM3«‚ƒ&›j)°\¥f§è^2P`‘Ðü‘Å S[Qo áÉ…ÊþÓ€À ç:eeÀHf^q€»¤a0Œ ÇðÙ™±¿?óèwF_0.'ºâGdð„ØgÌ "€âŠ(˜-–ÇÆKb²DãÌKRâpP€63 Ïr@Í‘Œå ·u‹NÑ’VÀ¯µýä/ Tš¸ë@¯¡(76kûX·8·ýçlDo¸ä¿îþxUqûBKlô7t­oLI•—ÓËéÇ«?¿œü* ÖñŠïPö‚œyÊ•óÏ`5UEÄwzŸuJ ‚Çøþ€WjåøŽÛ4oE±õœC»ø°¥Z›h¢‰u™-àQ¸Y¸©"ÊËÀŠT'°TmK-¼ €µ"3ÅwÞÁwÞÖÌR¸YÕ]Ôî¿ ËkM*<ª@/¹ -„¥w5.»ZC¤Õß„”¯„2r-ïÛ}uã/쎔Xq?R* ¢Ú­G!IG9(¯/dðêŠPMÅü^BÞJ)sÂ#°£,J6®ZÌ›<îIB°È‚ïïÐ}æX(/NE–2¹°¤ýÌZW ¬†HŸß9ñÕß8ù…É|¦‘…õ]žÜ^þâä÷>9ügŸ;óè ^ÃB&—W3¨»—í?D»÷O?€úB:½ýúvùkØŽÔôTøåZE«Ÿ¬vð;v5[>ôïÐä”ëRw/, ‘¨ñáñÛî4ÞùþÒ®2¦¦'àº:| €š Z~Åv–E­ípÝJÎ.Xxb ;z%;xrYÑ¥†Ï‰Ç\E]=4°ÓøÀGªä‘ÇâÆ»ØøÀÕ„Z…Hñ„–§O4¾!55Ž€¾ôÁè=ˆÆ¼ƒnE`miÂF#l!ÜRÖhnñ±©á禖_tƒ&°Üáëa÷\1¸²ø–PBGPE¸¡Ó~ê_MNÚç Ä é+Ê ¬œ(8µèÁ\ª7"ýJ“GN<œº÷¾ücÌi“Þw!‚Òm²˜;φ$ìv6Ù¦B¤8 M;ý¿æ|è‘@ÑÈ^ ÍRDŒ@eÐæDͦuEâ}ñõ«ÐT`Uà=»J=M{…Òlð:xUa Òàžû¢*T9é;Ÿ: î»Æûn ƾ+ç_€›£ÄÎ:Äk;J©}tî{Uª‹¬VÞs=Npo¢‚‹íóÞDMxÐ9€º•µ7 éÀˆ/MâÓ§n•9Sk…:‹j´F0M`qÊɨùã*sÖ³®F•H9é†í2[%Û~íò!ή;’–sn´Ø 6ÔMªñ@寡ÃLàŒP:¤Ã,Ϻb¶šl‰…P#ZÖÎSÒX„Nâ°Êr£RHh7ã\Û% ¢"€âîXnK:¶óÂ`©ˆ¡,ø‚,ø>Dnc 1c-¯L·oŒÀÒ ¬âjÇÙi•uc‹i±‚-­ÀÚ5Ù¶;vµñÑOzyO™ET(°ZÚ¨«¦Å.9F]ÝÔLÙ¹Qm€+ ~Í äKÏçÏ~k"~Ã-%G›iQg7„Pã£夦ƃÏk#\¯Qq§gLÖôS­,M`ñ›ngW¼ú»I¬ IDAT/ã›RÕĨG`•3DÀø±OPgcòOÓ¤öNó'¿éÍäJDXÚYÁ¯±GèÂDJ®g¼àG8Ä]n¥«çׯžú[úÜW§¹Ð;R–WåÔ0’çC¼R05ü=]¸’ „2°\ª§Àš¶Fô.É HéY‡°-.'‹†ýîQŸÀòíó•`S±àºv|ŠŽ¶y_Õ¢á—äZÆ´Êv6Šì2) Ï«-†®DV¹…°+’ ¬jOÅEü€ÖhsßœH®5*Çõ¡g­ MÖ« eµ­Jå}7Š(ÊÉ*†ðZûµÀ:¯&«MåÇÄÙ/(¹QjÀØy'€ ý¹çž[º ßq x¤I`ÕG)Ã} XUcÛÍã¸ÕàXå*ƒ¢® ¬r–fW$&V:$«ÒQù1cÉ=Õ7ë£ä^Þw38iU˜÷W4zÉV X`&Œ”X¢ Ûúð»k—ÿjG^ GZ_èo¢ÅIK÷¾+4E×s¼iÛ ‘ûÂîh€A €bʆV`• F–ÊZRKÍñn«@ó…œb’\‹|R¯…%tDb„O`iY[”",Ü`ºQÅòwݲd‘e)¾ ¡”ú¹®Rš#›·"•ô^­z¢XA§Ø9£þ—KÜ/rp€ –²äÊÊïˆÌ_ú ë·ÿ„w¡«ðšõÔĨøþ½ò…x ¬u%°Â‘vî¡DJÍN«Éq5|®bW+ ]„òÅÀõ¤'ÆÂ‚še™ ]zH~1_ËqÔÜ 8§®måÓ|ut‚HMMèÀû•*°°Bãžññ_¢ü ×Á4å+/ªtcˆÅ¢JÏÃ0«8ê Öv2¶l£á Y×·”ËU€ƒÑÔApÖð‰Ú3‹³OžÊxma¸í««TP;!I+°L‹qøï®*抅b|’½§óºdºÇÂ-RÎ9.€bhCyU0áz°e,„ 9.+¾8?&Í|kÜô.ÁqòÌ’ Þ™°gîÐëG¸Ì0ï–]×H1¢q ,«\ÕMP†Ô´Æx@`iɹpá¬X… °ZisƒhX[ áÕÙ ¥‹#”Sm6Ò›lo”Àq¾ë] ¦œ4ˆ±Ž«–Y<¹µ_NqÀÚµkW•…Œ$ï}3ÅÖ³ùâC†¶öX´µ£úqlb»¡y·t‘E…Ëg”ªœ¥)> ZŽA¹bä/}V& $E»kÇ ’qðcÁB§åìÓ^;‡¿9¯;•¸j-³ÿºˆp»Å`5ÒBèešÊ 9ýßDrÍwÅß²Š1wb Y ¼2˜G<õDSL¦[¥öbXå .k*°‚&#“X_¤@ÁȘÈgp;JŽ7cÜi¦tD¤O`y“Þ°€ p¤ ¸žÚ-–›8ôlmKEà»3R`-ízanòÑ©²üõ´’vóhŠ ”·\­~Y{#gTÛ—Ø¢©Àò@;=U4F­Õ‡£ž,hz€|üaqÏÝâkÿ »ˆh ±Tv.‹²ƒHDG. _|N磗XK÷°o€üÁS‰P“ã ˆJ?®>7¡”@ƒË+°ÔÔ8¤¤®pN±8MQWµwÀuÕÂ<8§ŽÝ«„WqO°ƒ—@)õbCœ‘šš€RÔÕj:Svø2óW>m|è'׸oÛhx£gN´kkXp8uUEŠà º¡©‹à*ð•ñÇþžýÃ?Œ=¨-¸¥«Cpv Z íà‹qS;åEm²éTz ¤"¹öc}²ï£¿uðÝšÊÑ"¯°ß\4³ðÒîÂ%K!ý-X€0œ¡ü€¤]:éé_·D¯áÅø ™Û~çàûúc­\^°(óúéÅHñpÛ îÿ-öÜžç»z^ÞzÒ´à'ZÖ´úÞaí²4üé+CÄ꼯ꫢ&õ*ÄúU~ €W~çViªªskT ¬ã*ãÀGAK «uÙåù®»‚ÅZ[«/Ïûoªß„Fà¼ðôUíãØÄöBó8n5Tµz¡T5t²Ñ½ïq9ó„ž®({¡žÀˆÕ+!3åÕ º‹ª0åz‰ZåB2œ{¼÷íVDX"°j+°´ ‰6F|³‡oìÛ¿Š5˜"‚P”üBr-­üg~–«XåD÷GÀÖ’ ,Ã7pâ‰Vn$`Ú^`‰8w=ñWw$ ­#sM0¹`(ø ,p¡µQ$ íP(–“8EU%ËB@ÎwÿŽE„â{‡3ó¿sâkæüÏ'ÓeÚEÇ£½EYDWM0€½Úq¶ Ö{ØÈµD`­–2»aZZxE};jMÛ’§Àš O½ @e¬;GSqu½ |ú15; Ë b¹–‚í=@û١˨‰±7=ñ÷·-|ß[¢.7¡f¦PÈSK+µx;PI`…¸ OoÕÓ Œ¿Kµj êì©Êmtú»|ñ,ì`u¯ØÞ¸"l£áÍ– q×§µúaçŠà †óª áÒq[áZ Û¿d( ,„R³KQf˜ZU[Ï;^LˆŠ’•) '~sÉàÛú²–§“¼ÊYý«C?ø•SÿëïÎ<¬'KØ<@Eí=©=”ô ¬×wîúÝÎhÏk´šÂpdD·½—$ e`årÛÞ¹óèÖJ…£áøª1åþT ̈hÕåë Ê,,W˸v4 ¬­…ðå{Gz.]‡O…Xròû©_uÏ|¾²pª1°öcÆáO°žkYØëɪkdz¿ l aM4±XÊ^c÷Šá»åÄ÷š:YŠtòžë ¤¾[eω±ûÄØ½zêÂÓRÅ—™ÐÞ@å¤UÑO &)ÖÇ:^Ã:Ë×~Ãí–ãNªTþ[e“6ÌBà;oZÝ £"P”|*ŠûÖBSOïûÓÎDUзm±Ê7È ¬+–$É¥Y\tì' *âš;Ðõܦ̵Ìs$“¢dB›õL†þKVä@`ˆ1+F|> ¾Ê å·R¿ŸýëÑöã`2+Ë”V‹~JÆ]žÀr•ò©Vk“Qªd!l¶ï¬Õ¥õê„–±¾š'+jë€a¨ô¼š™R“ã¥Ç7,Kƒ8 ÃôDC;vÖ¡„h×^F€öì£D v±{ædãGbÕÝ@;v–êé &Ç!¥:#Ï”RÒ=«·’À¢–Ö€b[…pÕ`GŽ‚1yú ËËW0CŸt ³ÜJ – @^8VhOBXþ)4ËŸ‡ÒŠÞ2KBÜ%¹Ú-á\w˜ÈYZfœE ™Ñ.{­UT^Œ°aKÀŽzcžª ¬ãÅ3éÖ¡SâœòŸu­e8 nå¹W)`ä[:¢ñލ÷Õn±b”Q„OQY¶G®xØB˜W”· ‡aÚ ÿUµX>¥XÁÌ–ªl`[1ÁÆX+Ëåjb£ÁÊM„«_‘(¨â˜Iɽà–,U˜†›SÙój¥Â`'k–6±!h¶6ÑÄEŠö¤ S€ç¾(çGiwaUð·‰éÇä ráï!‘çƒwx ¬ ¬Â4üIK2[á·)S´Ç8ðîÿö´ƒ¥­Õ-„^ÖÆNøÖ•B€ÃV‚7ȱ"Ž7ÌÕ^Фµ­ °‚¾í`üZz §€3€ãnlñ|faÎÉ Š˜Šª¨þ¸G`nT ;_Ì!Õ®H+°¢À…ÀbÒÒ®B¹ IwÆyD§äN ¬$¸uÉ9NÐ •GUЇP›)4þŸ“Ÿ_ŒÌ|,þÞ+;Ë49ÇÛD8çå[#/MØ ×uÜß²|½ •XÁ[°kT|•ÀxÇ]¸õDkU£öN55!{ˆ´X…Ú7¤‚°+büØÇÅÝ_TÓ“¬¶Pƒßx«û¹Ï î^êéSC9Ñãú–Ru†ôjlå`”HQw¯ššPC§ÅßC$Êöyo5Y"°(L`¥Z>‹z6‘!ŠÅÙÞòÔ+òåãìŠÚٸł<{Jž9¹Ù»·µ¡‰mÞÚJü•Ç ÕÏuÚ„ ,×'žŠV!'`Q¸ŸÌXB³K1ÃËÀ ©–bNd´P)Ž+î׆¯À²œD>–qXq2·¨¸ Á‰qåÚø ›låoQšÞµiV͈³Òyï–þC—dÖµÊ>)+EŠ»®”9•sSyL`’¡yµ"Q›ÀŠÉ„¾XÖÒ’ÇŒ€Àâ’€˜ZñÈ$Á-ö³ŸMÖÖB˜¡X [¡ò£€¢XŸoëȨü¸œ|H-žÔ¼•*LÀÍ‚ 27©ïãªÉ7ѶÕ<ŽšÇqËGÈjtÄØwåÜsà1>p»qèÖÕÀÚ¯¨úŠxF‚÷ß €¬VÖv•9 ïŠ×³€‘1Ÿ½"§dÍ âe ³¶›…þyUS1Us½LÓQ`­ý›˜ 8BN@7öíÿ«þ_þ̾ê_½l,’z¸o–+­‚¾íH ¡÷”Ž·œ€±BzÔÐÉÚ£*€+È7DÀ‚@1 Æ,мñ=“ž…Ð)W`éò‹Ä=÷AeVðCÚ÷ ( ^IÆ*L`¥£“n,}2S'äþ†ãá¿[xìáÔ½OÏ ¡è$ ÆŽc1¤oXa&bñúãí"O>€}÷`Ç:+°–D¶ÿùó¿Êo~;í=PÿµìÐ%:ʺzصo6ÿ¯ßr¹•Ù¸\^ èXýe§kvø2âïÉ—ž—ÇŸ ôMe ,Îaùúˆ ¤À@ÚEøB½,ùü3îçþZ ÁÆ[·ÑðFs[0Ä]K_EÝ\§ EpÃv?W ¶”"’…/Cy¢b)ÄÝW`)&5ç–vÐËÚ´ZÐÎCB%ŽrÄd€Ãì¡ì<€H¾ €âîÒ©Œ|t€Í új¾±1Í$YIe0¶;Õ^1wÂ|]ó¼Ïð4€nêôŸbŒJWs‡ÕS`Å}ŠjX-Ætº–§Àò×£[ã<À¥â²K®Mk‹a½,/e˜ råÔÃîÙ/ˆÑïèè+HPdµmZ°Òu×]·9ºø"°.<ƒÕ<ŽšÇq B»ÅðÝŒ]ïä·³¶KÁk ôAä}o6Ž|Ò¼âÓ|ï‡Èì²”³kÀ!Ndx5Öq…õÚÏ>ºÊ·ôdÉöS`´}¨qÙՙ赢O׈µ“C(±b) /Kiª¥"+èÛ¶øËÂr2ÄeÀ¤½0eޏ4>E €a—fh#2 `ÁÉðrs™n!”ʲ˜Ê#°ìò[ˆ@×îì+ü¾ó +ã–†ÅEV¦ÀÊùF’"J¬ž{uf*Þ]Þ¯AtCÅúO¤ûÑ—…O`IÔ8Ž?3ñ‡Ÿ˜þ½Ù‚WeûZu:°š¨ M`!ŸÀo|+4aºÞÂê_FÃà7½MÓIuw‘ø·Â²¨¥]r9µ¶§Ý´‹°>7áYûÊ,:ìEÈC)8¶|îi(ÔÂ<ÌR‹_ ¢T«NvǦX^X؉!j~°åË/`{ò7^O]55Åë‚m4¼ÑÊ_¶õBÜõ™°~0ù†"8ˆ2¤ÓgΡ̜¦*\LX’\p jZ%©¦l6˲ðkI4<ɰt᫊*@p{¬° î¶èˆô@Õ«1žËH«À1«´â¬4€o !Ç5,ØÅbtÀnËûv“"®JWm‡ë&ßêVŠü‘^mæ‡$aB3[IZqˆ{ˆ`ãÙϦ…pka½ø ¤B±>d$•(ÊìUœFhÚ³V6p[ ä..<}ÕDMl¢ÝHŸk9Ⱥ¯iôUÌÒ¶n2SéTÅ9ó<ÿ`ç 3©ƒ«(Ú˜WOí» -„žK›’ªf`a3,„«F‹‘ÀEÍág¾…$|ƒ@¯%ˆ-U`¡LÕ¢Z¦qg¦Ð2 É®îÚùƒìY7D`! £K™  )Å]Ù6 ]tyV¹K2@ÊŒä¥û + Œ$}“ ¤£@ÿÇÐ_(’Çì«€Bxî— Ój¶âÝü¨”2‹$üJÄe¡:Q;çXyk x+¿QQ6X+ƒG`ñÛî¤þãG Üsa÷ªì²+Øñgƒ“Èb¢»#=ÒãNŸ Ö£&rYµ0+â•-kÛ½ÑX ¼O=Ê^÷&51¥¨»¯ÈcaZZÁ¹ùÉÿ†Im›:¶§¶êÛ¡ÆGå™ìÀ‘*K!O¾€¿÷ÃÔ¶ÁÆÏm=q· ‹¶F–§½Õ'|%œÏÎëKS@‘¶A ¡í`6Hƈ<Õª^zÕ,yîŠêío²Wð[·\ˆ»¦‚xxêܽóOï1vüèÞ×oàž®¯5•aë«Æ˜íX²d!,m¥ÖBÿû$ ðŠz£d ®²Ì¶rúâ¥"K!  à:0±'(Þͥ´³–ÁQž%àL~ ZÈŪ]#˜ÐÖ%"Eà•Ü(Z)´ÄZ,ý¾±÷v½ñlöнùÇZÏét-“U'vÚ}­=©šcK& Ûb ¡«km@-¤L ¢z-ã:b‹Î(¾jÁB°µº ]—’‘Q%*_ •'¸¯ÛÈ”¾ÕÐÌÀjbÝÑ<Ž[FœÌqPC\ÉÒƒHÉ=”=ëzCcõ‡5‘5uÒ“Õ bÊžóêA¶ôiUß:T=ÇHõ˜»úJ~éFl}íßÄɶ»v{]×`­ L $°Deo5*¾¦?Ç©M”ï軂‹h@·Óà'÷]ûÙ®_ÿƒï^§‚*&ì²úä[ÆE×$€×´îÖS»Eæ’Û’V$É#43…0åÿ ®ˆ„ˆ;–[ÔO-’'t¹§À²¥Ôf;ZI­æýûœð8[²XÊ+ê’¨vm7°·T:›•‚zúÍÿ’f¯6kÿ2Rª$ÜH'z9îa¨Å´:{Êûy¬ŠPƒ¾¿émìò×pþû÷} „ú ãq”HÖ)IÜx.Ÿ¯ÊÕ)í\Ö†¹NØFßÀ–«ªÜdh*¿j0y€Ó™É‘öã/ŠS±ÁAÔg~æšðE¬Óþ<™,)°ÂX¾+h!Ô–äL^OU”®´ò¬/¶šŠJϬ¸ÚŒ CqwŠMè6Z™´dÝ2Êf´Úw¿‘åõM†²ŒÈ1I·5îO51Ŷv½uÇ¡ÙxÜZÂîˆß.]ÇB¨‹™€§ÃÐj­X•4"¤±±VSµu±¶B… ,T‰i×½áh !eݰLé[ Áa+XÍãxq y/,=ˆ,¹GËXûQJì\ú’¥  ëa ,f±Ž+åÌSrâ?øÎw®iU›‹e…ÏGÛ{¶¿mƒ¶¾ ßD/ÄIÝš­P`1ßB¸$+Âdè‰%wœ?2Ú~À~«:_–àQyU°u*¾dý¼s§Ñ7Œq`vô@W×÷f ,iâS† ÍŒæ,6бù_<ûÙ˜ÛÂ}º-ÈëÍ»6LDdgx76]I³8ž[ ß–\Ç÷¡”ÆÙš“j°ÿ[…Z—G»Ô9èg· ¡Ýn3Ä}¥ˆ'(žX~±µa}¿Œéx€^wš”R2ÔBX,¸Ÿû,õí0öì N¾ €õWiŒ¥C—²ý‡i`oi#ÎÅ€3ãöw³×† æ:«¥uéË74°‹Ú:Ôü¬<ñ";TÉõËW^°ôñ Â6Þh‹³ÒÏ[š6ÒÁäµcXK‚ºFQ·Ù2i @H`NyÒ¯ö X!–¿cLÂ'°b†Q“ÀÍ.àvÌ žw€˜aŲ]¹–ñÅÔ€¾h+ËrnÙ…cžU/.EGdùÓZDFÌÆÆt #j˜º8—ù§3DZY5ˆžhJ_Öê¤yj‘šŸå]yÛÍX-‘2PÜÙO†¦kk¡|$½JºB9‹6Œ„Nÿ 2zKkŽùùŽ›¨ÀjbÕØR!îM4ÑÄ–ÅÀL€øŽ† M`1‹B©¥«ï» €˜|Èün”]v/ƤAm  ¸À*o!ŒùVd‰…0â›Lß¾þ®Î7ê®jÝUu[)G¡(\øcå×E¼×–\ó§ˆEHeK©˜€dqÓl1#Àd!93Ÿ îŽd À’: Þ$' `º±=V1âý §Ü"°œXœ ïjAúÜV¨R]û $°$üû«¥î©‚€a'P`5-„¯d"í.)‘ùʼn¿¡ÿ¦÷¨ëºÿð?Ôèyuâ%(%O½,_y‘]rlé(™âïþ Jµð;Þg~ê?™¿ðkìuo Ÿ³tˆ;µ\è<"ö†ëȇþ£ò)!Ôôˆhçj+n/^è"ˆ-âÈ— NMž„|6Óçg&LøÓæX¾û»¬©• , ]&¨/jªª§ϧá÷íÐYüâٿδŒˆ1³[öê•ØoÓAï÷Ï¿ð»'¾öå¡gô ³Ý™V›i‘,´ˆÖÆAs7Íè3:†wÉr9-”®ÝV½Îe‡?yS'Ä)?dÀò×Ó]1e‘0@*ël` VSµµ°>Eqa?ÈR+u@&¡äfZ›X5ÞªÉ_5ÑDõ@œ;ÉH4(¿‚¯À¢h×Ú["(±‹RûÕâ)1úm¾óŽ5®mÓ@D%÷ÆÅzŽURúN Âˬxm–Un!p¬£/uj ›9ÐUÝpÚjÆXÎ ~’ Àk#—~5û]ì¤`µn(yjÁÎßþmD‘õ÷š»Xuº Ëp,;’³ ³®÷ezÃee8¶”cávª¡Ü °/ø5 ˜TÈB¨ïyìÆ¢‹õͧª!@ð4h!)–ãÿP'÷½‰‹’hÊìè·'{œiÜÿmÁ”š—gNê.Eµ˜V#Câßþ¿ñÖ°÷0 5-V_&Õ‚Xœ:Öd_ð×½I|ï[òäKâ¾oÂ4ÙeWèXz5? )©­FͦÔW-T(Ä]n%+¨Í ;nV?pºŒBÔD_þøÄ7O'Ÿ¿*÷¦ŸÚ-|»Ÿ!Í¢Ÿ„˜7¼‰Š€‡ÒTš¶õ-ÍÀÒàŠÃ «XvQDEå͸IJ¿2Ÿ¹Çì?‡g@²dŸ4 ™gŠÉ9'ß‹+ág·ÿ?{o'ÛUW‹¯½÷™jêñ}Ç ÷ÞÜL7! a0 ‰„$(êS þü©?ÞPQ‡ø ¾ þÄŸˆúA5AÂt@ &¹™ssç±çîNsöðþØçœ:5uWwWwW×=ë“O>u»Ní³«vÕ>g¯½Öúz9ž)¶< ìNdDwŒ]õ­ù¯„–üÌhÖ ¯Ëq.g2÷Êj“•1LØÒôqÿůolG‘g9ÒWÂMÅxѯ.~èr‘*°z õ[ÁË„ª&üƒ‰-„‘ÈØ›ÌËßd\þF’ٲܓ,ss/Ü·GPS`­k74Òqì¤ãØh9ˆ4ÉäW)ì3.þ¶óG»Ò%cç‚PqöËröÑ®4¸HΫk¿I°6¿D­„ŠXu7¸YÃE¬¦ ¬x/7YêèVûÆBe¬Ý½ã&+ 0\]zO»6FèàV±Àõûmðê4\yßC”rbSC¿ ¨Œ·÷e=eÃ4¥`Æ/e©¹'ÓÕ ¥œåu†Ž8÷7™ó¢Xq„üÂÐëõUó8ÆÙí1S¯¬ò¿àòõ¯üua¢»?F¥0nl:ioÿNá(%¾öEùø#p+ddT—êã÷|\?KFFÙM?¼ì³°›~Øú?b/ÿñîu|¹Èdésž¥Ä}_ÿq¯ün˜a¤¦&‘•YVÙ” IDATÔ—‚ t{#!$X-Ui/¢ÑóX;5Ó²QBI™~1Ù"½ï¢s tw¢ ?Ïê©•pI}k½‹Hq “6}ž ŠòªNöÑ\×/Ëì« ahó2!ZåÛEñÌzUPI¸imLŒ/.¿°ÙÉæC‹ñ¥…M65ôÎPL`%s¯œ6 ,ÌÏ`1?ºº ᦱ¬»"*MÅ`Åø)Õ[èÊ´ò%QËÀ¢…K–í!RØKö£MØÛjàĉkv®>COe`¥ãØHDZÐréØw.¿@ìºå‡èPwÒ‘IaÛùJ@ñ#M ©ƒðIfzÉ‚µŸb×è—¨ ,*Ðd!Ì2 d‹h;Òd%sß_¾ãÊçYÚg““Àj°¸uàj zýð.61QŸœRæ>&C-áµ[ð *Åïóë0]›X¶Ì˜ Ü"Z|f<‰Rƒ&Étò?消Š9£0ÖŠvD!éøvIZcs$í,„÷œ|ôõ“ïþÝéäì)ºŽîþ•Â=#w|pËëîz©|þmdx”Ýñ*ó7ÿÀüõß§/¸€:s »íehâŽ7(Ø-/f/z }ÞÍä£i}‘šž€ÑµÓˆm Û›ÞÍÀŠØŸ o˶kOt×-„Uâ¨øýO='ëŠ"rºZQŒ©·d¢º®„`ÜÂB­À2LD—ÂfÌò"€RG`5Ç¢çLãÊá­aYÃ`Qл–ëý‰j SYíÞ©ÞƒéW³Ëni' Þ㉩¨dîU;‹g‘HÎZ6eï´‡ 0„ `ž¯"Õ'“f߀tC‚U—àžÈÀ"û0ÿ Ö¶ø`ŒÚÞò¦X=U…0Çþ@:Ž}€–ƒHÌÖV”5Ûöb9þMåM«êD-o1qúßĹ¯ÑÑ=?¿öÝkFm^] vm~‰D³,Dpê³®r¦ Žšè)Xe&\‡”ŸØÝ"¯GcK6*„YÕ¥÷b·Â ö÷{‡4u¥ï°“BWø `2*®$,‰Ðz—#ŒkÌ',@‘».©'°QsÜ….5H ­E{Ì˘÷]DêŽ;L„!2åÉjêJ–A,E6½i/YgXD¢}ˆ;” 1S‡¸‹v±Y‚véS,I>BR7¿X6½xvËKÀÚFÒlTB\@|ãËÔô$‡•¢úK¢‹d¬„ÀúO:<üƒ£åÅËÞuˆxZsy{Kq´\6ZÀ£„ÂaXäYw€ä´Îã"*ÍÐ$$‰ÀÒ:)îíé«Ò¹Ê—=¯2€«ŽÀ²I#%¤cÔ·‰ÔËŽÑ-Ì¥kàÎxe¶Ìhê ¢^F?pTGB#Nög.ºþEca†#­W`Ù‰üÊL{gUy,âžÄoÝ{wþ­°ãµö°¦²i«W ©«·°$ ¡ªœ‘s #ב$'*°B>ÎÀ"öˆ±ï—»×Ùk¾^_¥H‘¢O@r;1ó°*ŸÂèsžR¥ÊŸ üž!°j¾a‰ŠÞ𤠑[2ù?Üû3-_kµ º„56 nú~F­L€ë¬Ëõ]ªZ˜ø>NqóËÈ-0ÀTxºØKˆD=A¡b“À¡VŽf”¥ÔX¶Ÿ¯8åyáð$`HÓ)ºç™9ûâm{Ãv•×+"À¥ÔkÉ:ËÀÒlW›õ[ „þBÅ'Ñz©]챦ºã3^uØ^æÖwŠjû —]I&ÎÓ^°vZCмH<ðmùä£òo«© ¤V„–¶® Iô Ö51Tœlåʶl~”Õe–0<šðuЕϧƒ",äd®" EýªÃÔ[ÒFJ(õd+)‘†‚à@&ªà!)€»«´'6¿ÿ’_Ižºj–l±ëX=¤C⡈–ë¾mß@˜7j‘ÆM—™  ™±²T†pJL?ïÙ.€ É,ï#"ÂD’ÀêLU 9tL`”Ž,½þ` S*«Y:U`õ–¤À’ÓŠ“÷Š“÷Ês_ÿ¨üåσZÄŠªêR‹Ž>·‘äZsȉ°ý,–I`Qi`Q6e2¸Ýiª&ã•[¯ý ÿ§^³åÖåtIк3W¦ ¬ u7Ð(°ô1ùÛu'¨@N?(:tšcÏ2E€]ÄÍ7ß¼Þ]Ø¨è© ¬tûé8özvIn'Y9¨º+¯ÈÉÂÇÒ‡pÁ–y·X— vm±Æ[É%XYfjuQsVȰd¦̈"Úðe{7ÿ†ûú½›FgþØû d¾&°ŒHe©{ȱ"@Gäf˜ÅUÀœ1¢â (LeYàI ÀÝel=…Gψóqƒª-ÌÊÂG}¬{%ðófÛðÝT!òÚÄã8ëU¼Â€’ç鈒 ’EÄd›X±Vë\uþ*´ÈK±ªèî1ÉF4˜#[¶±5ätÖôšëé¡åã …X‹ýšº‡ž½26£k ,]>uÅ ¬ïOœ|¬tæŠüöXWU]H¥|qÏÉG¿¹gpî¢?Þós+ì€/¥Þ´° Ñ”H$e„sª`ˆæ53å%,GXà¥M„”*&€\iëð–PÓJ£ùWX.—Òˆ®n¾”Ò¬B‘-Ù:+¦‡¶’ÍoÞ{{Ën'3°UÎK² O³Fµ®ÂäTnZ¥÷`–C^; a{ÖîüðîüE`kÂÑ•©ë‚Ä¢vU9 È.\9õ þ£~@G®[íî¥X3ô•"EŠ ƒ˜Ä¯(¯®î?öÏ*˜'ù‹‰³+a ¼Õ… gš¨BØ·ˆˆ¤–aíí`Gé< 6jFFe¥áÒVVÁ´öŒê$ ô&#r{þ†kæn6ܺUD\ëJÇä {ÐÌpiVe0Ç«8úJ´JÄ]šôç={ŠÇâ‘Fí—šýö#?&|¥þÁ6е)´Íb%XºŸXññsO|§ðåoÌ>Xš!j )°4Í$ÛŸý#Ǿ÷?žù׃çŽ.ÚY/ôƒëÙÒÕ4„(éœu³@•Àå<îI†h ¡Dì×VTó\É‹ãSÔ.‚D.×nBÎWæAõ3 .û˜ÚÄÚVÈi(2ë»â¤Ù …WND`9°)·Œenà±zV†ÕØá†ž¬XªjX)Õ[ I áÂwÓ¼¢üYP‹íøbâ[”7¥Ê'Àl:tÕªö3ź qO‘"ņ€a‰3ÿ!Î~Yœý² Šrâ~9ýXÆØó:íp_I Vðô_ù¾=̃_aW/€R#°–p×§£jXK±æP¦%q™¤–È60MìÛ¶íyÞ[³þPòà˜'Ô3ì!3ƒÈ¯áˆ ,TXYêpQ³0 mƒ"~f¶e«ó¥%`¨ý¥¼«nÝ9„Vÿ ¯âå¥jS…0ˆ,„Ú&“bc#â¾u͆eÏ»k[‚pcA1­=^f;”ðWL`I%øMkžZŒÀ¢B{Ÿe{/á!ñÄ™áÇ._´³^8JÊÍÉD2MÖH—•l±t‰[}€N|Ï1QÂ`¡¥ð|uã®™·\Ÿ"il?S­mœw‹Ì 1ø)¦„Æœ!´AÒÄ`Æ«Và43¹HfmbQa(,W®+*²Èh•I(°²‹ ‡×6I ¬ 3Ê=(’££7ÀȪÒqU9-gº´'(Ø$:´Þ]بè©eU:Žýtû½<ˆ$»€œ¸_5ò§>ÈOþ+ãâŸ$ö(Ì!V 3 樺uþ2oÿ×—ÀZ›A¤ˆ3°–@EÅfk)…Òò4  jÏ!á l Ç0 ©¢Ò•UÔLj ‰¥¯Ž ä kÄ®­4²*˸ €rsÐ̨ÂED ÄÈ›–Q-€ÊgK¡*0$°$à*€¿D–^ãi a<ŽÅè…•(þƒG´T,¼jg!Œ95m“I±Æèî±ÞBØÅ†7Øí?‚L¶[ î¿søã¯Ÿ|÷?páÃzùÊØ€ÈB¨XËü–øRj5_1¥uOUTk«Öl{|0¨ÔÇ,†¥e³jñ"‰³žW$ædZ%„o–Œ9:ÊÕÜårÔF´=À¥@}Í%7¾sß׌ŒÅ§Ð/Ô8ïÕnBƽ"G4X±¾ig¦-•©_tÏs×§.€a+îÓYš‰¶¶¸ ÌíÜ•]¦¡ˆÍ‰µÜ«¦"-ë‡Z<¤XýÌ«ù§Á2íR¤c–¬œ@²;@M:rƒÿ¦œ=¤Üqt E=ìuÇîÝ»×» ñ7öÀ¼”Žc Ç>@/"¾*¼•3kÃ;ºšŽÞ€XƒX™Kiò+(P•3Á£#k]ÿž•×EâºFƒ)°è’,„†ùÒÊ+›–°Ù9`d§ `T,|0¦¤^QUÐL`Õ«·bK‹d€‚iÙÌDÄ2 b`†Oq™´†4Å*ˆ$ †2Üᘟ÷Ã’¦“(·¥åj£— °Ê¼S–^:ÆãXâ®V’yÑæsÌ[ñÅX1¥m2)ÖÝý1&éˆ •¿2Yö¢—áE採©„@/_T`-;ý4–j]6ô>Gj¼ƒ¿€‹r Jçd- ÀÒGÎÑ™E;0¸Ð|Sˆä«DR#R`q«`{n€N×2°ô.Bž9ˆ¶¸ -„ͧ’#žW íòTPÛ*˜ JpU¹†ãjh¦nw¾-eÓ:ÝÓ|P LÀf+ïéîpˆõ{û~lÑb ªÁY·P`!×k¥‰ìV'CmD%ƒW kýV›o—M9oDÈ©ʼnÏs€^÷®Eï³~: ÀÊî@ ËñoªÊU@²ÛºÕá.bpppñƒR´]×"Y HDZ?Žc —‘äv±Ü.ý˜n¹‰?þ§Jì⟟ ¬åf` ÂC¤ÀRþ4¹µŒb»µ*„ËìÍŠ°6ƒHâ*„ zú@Wï¾f©ç6j €‹ìE’ȉ0az.*lRwGjÔß ªˆÒ¿ÓÎ&‘’][~á/]zÓ;Ž|Ä iŽØ9Hpæ!R`™Ä` » #‹§ i¹zæ%-„¢ƒ;oí²¡‰q,ɰý˜ÀŠy«˜ÉRmXáZQÛdR¬1zyFݸ`?t«*u‡ÕXŒÀÚ@ãXâ¾l‹‡SM°Ø'³(49Èi¾_ˆÀ"Qлò° KÛú¼Ìâ[V%^Õ–¶fûR ¡\R•4°ó¦¥s Én'Ù—±| ¡ð D|%UA1ÙŽ*ŸÂðµKîÛ0ÁÒ(,ƒ®~òé¨ÓÔ Æå‹eßPið šrpX @ɯÐ ¸~gß«âç3pÊÜâäP4<­¾ôâÇR6€²ˆ-„€-3eÀW>tÉöˆß«ÈZ LKp­¢‰’JÅBiW…/ôÑh!Œ——¡õ¦ "ú;·*²/Bjßø+Gس·±üøÒ¥|ý„ z羋è;K-BÖrq#é(oSÞ´shQUR,¤À ÂÓ ,¾ƒß;û·^nú'üŸú/Û/K6 àéâDõÑ©û¦‡Ž\öE¿²çåhâÕt *©aÜ)px€À—‚K)MŠlur(…Û<”nµD7Û\ZÛ*(¡ `Ø(´{ÉÈ–öÉã|  X)f3“CAœŠÕ-P‚ º`èäZ"gØH\ÑV}p}\(N<û÷üä½ %Ã[€åÌÃÍ“•8÷5V~ª*ÏyŒ¡=ííMBúÄ‚‘ˆ³E?•\$ô<¸Þ]ب¨­¯z Î{:Žýtûx-â¾dVðÔ_ø¾]ž»/üwh!¬)°VÒ©u™^×h# á(°¶8¡Ã)ÒÅHAS„YESŒˆYï(Ôûê:"ˆ›¯â°”mPJ TNWËZeQ€@Y†k3¯K›ûPâ~¿ñíß8ò·ß?à‘éso:ù·ùpòtAâ`_ˆxµ›&n‰U¥Ä" ,½TNºý šÀ„W˜˜X®ÖrÑÝcÊYu €‹XèÊe`­(Ä=–‹®\¥” Íiûš[ Ê% ˆ(ˆJ¾3½7ËÂ#» m”yn4mV¢ ­ÕÓ,eÄ@”„˜‘9TLV+h`g™…h{ qo{sTšY[?Þd5Z;A6*xb¸fÉÆËÖ×_‡ºb®Û ,TX“ë{‡(6Nû« áØØ˜išÛ¶m{Ík^óä“O®}º %øá¿UAÂÇþya=d¸Œ¬ògÅÉ{”{Vÿ]Î=ÁŸùkqò^€|âØ+—w8¬º<Òº‘ÊiqæKˆ°4âÇ$Ó‹Xn¾ùæõîÂFE<÷‚@ Çþ@:Ž}€;ˆÄˆ ŠüÉ?—“ßëøuJ¹çÈâ³á¿ƒF ár:S›a—ñê•bm‘E7{ºùªbÀ²!€Q±xé1¦,ÒôÐTÈÉŒXŠ Zº”¸H·Õ€ës{öÎÜp}f8¦ª]ýÊ"‡ØHLz¹•A@ÐD` §\8{Úp¸4Î3E·0^åµ%YXEûRÄãX‚åƒÈ=!Ф Êoµu N–7é³0tÊ…Ìz Ýý1&éˆeçs§HBÓ+‹*°6Е1™µ/×UÑÈ•/ €2j¼'mÛŒ-„~H`I§K³úï^’ÀŠ”8gEc!ÂÀ*¨DÓrO5Åf%¡«ž ¦uŽkU´x‚íJ>öcÞŠ†ßÒx½- ï*oqg¯»d–‡ž››;tèP˧–Ñ‚*ÀvÜÁ¶¿ÀÔ±ûÛµðƒï|±†èæ×Å£ú©êüYæÕoóÇîphæ —Ûƒ8©Ü³Í}Pî9¢pÕ‘©ZÔÜãGÂ-h’Ù¶.ŸCÚÂêµP.‡[„làw‘¶¶¶¶ÿólu;Ûñ# L}øß¼›ù¨8õ¹àñ÷ºÿÏø‘T¥£ -”&ŸE#”âeM`Ig"Ö’ÞEâ®;àè“줅¸’7%t ú°§tå¦Ù½7 ]²h ¦ª™)œÈX¡û`E+"©^–p)}ú)D´×}`¾ `Æ/ëÝø™³ÐE €¹j¤×Ó ¤¹*¢EÚ±“'Q*“2\tt§ãùõ ¬¸qôUÌdIýTrqË’ïB×êÚæïp”ŸZÒX¼ÿð—õìÿüÓÃ_æeœªÌ:tèÄä„bœpsÀ²—1šO=ö$°… !Ò¦ ¢ {÷–×ßë•Ã[WïEÀÖ«ïºë®$?3h;ïÞ÷³ï¼ìN¬Èê% &73Ûåüùó{öì)-V`•nöS•OÈù§õc:xEÒˆ· ‡Þ£Ü³æUoƒô‚'>@ò›WþZË#åÜü©¿¤ûËß^öümPÓºáA¨ÿÀ¯AIëÆ÷ΖɻþqÀO^ô¹F±‹~Šmm †ùCU7¯þ­dÏ•?<úG±®ûC¬¾G`8xðà’õöÎMóÿù‰ ¿ø#ÃW]ä¬ogÒqì¤ãØèƒAäOÿ•œ} ̆ðHî"ð’òj6vÛýêøŸâÜ×ĉÏ4#ÆíÜ IDAT´`^ñæà‰÷ƒeئÅùo°Ý¯fc·-©ïûÔäéÉÀPžýîÏu_Û¿0Öfßqøc3CGlÙÿû~rµO×9î~æs'†Öÿ»ñËW%¼=úÀ7 _Àª9izŠñÿ5ø¶¯æsοÍ]ôG{~nfï:üésCOÞR|éÃò‰ùÁ“?æýÄ;.¿çä£_ÈÜ3<{É{öþ7¿zîO”¼Ü}Õç3÷äçvü¯=¿ðÏÇüZî Év®»ùW÷ÜúëGþ¶óÏ Àó·ýß—Þà\¥xWåúH³2øç»ß7òùSßëü €ÜÜö÷îù¿üÚÑ¿©Î ’þå–w|éìÓŸ6?Y˜Ýù“ƒ?üwä#úU¿Œ×ݰiçŸþÒSCß»jö…£ÆÀ7òÿ16sù]û~â gÞ+­êÿȽùXiæoÉ?8ÅÍÖªózbÿ©à¿Þ¾mß3ïZ꬛Ä}gŸJp%ï±?­ÿòr÷Uwîºzy­-o=ú×na|dæÒ»÷ýìÚœ±Ct—ÀIbçÓNz¼.…9äìcâtt"|¶KqU¡$3¦„ @UÇÆÏ2`[nË„{3`€‘#ÎfUW•Ó0¡1@ ™OU¶Ý0zHU÷¡¸ò&AhœÚ®A¬!ëú?ZþY}l”ËI"¦‚i„¸§ãØHDZЃHG®“³Ax0²æåoˆ8wŒü9qöËbò¶ëÇ…_hõq F¼,+§k( †_reÃõõh¯Í ÆN Öcµ§mÔÌYVg¬°XØUIÁphö¬+}†\$7«²ŠÒ•„p˜  `8H£´kÈÌ„:08°u&"ŒkÏëNòÚî´HÚ¥ŒÇ1®@ÇÄÕåUÂàãÉfuÝðÎ/”,žo.9¿ô; r³ï:ñq>8ïÍõ„kOÁ±v9+á Kí„]þHµn +c…pp‰È¼ÎQ<õ+q—ªöÙÒÀ†¯Ú’sEíG­æ:Upš„>ë8ù.,’¨ˆ’´®‡çüY8@$ÕD¢¢¢RFîlJ˜‘PfìÈ! I Àç…‹(ÍP+°<Á…’ e`£eœ}²rúvì›å˜bùoÛàþ‰ñ_ž7zѲ[[*´yÐ@/êWV ë\…ðŸøÄM7Ý´Ögå%Ä ¼Æ‚K‚rÏC bo5‰9–¯€—!}qü3â佪r¦v°? €XÃúŸ¤p)Y<]šÐBB¶v¦2@•O Ê‡’ÄÞÚ+Å2S¬6Ò ¬)Rô%èð-fc/Ë€9lÇËÙÖ[Ù®;If+x9–K#"°ˆ.éivU ,b !Q‘°s$ʼö-âhŒ^»ÁµIŠÊÕ'ƒXq–dzò÷òŸ~à?ÀÂ"÷?9šP’í©±©`@×Eb>´JH:h8¨ñ,åµç¾â¥À—QÐï jVXé%3°dœlD0$\È%3Ú[XšSË›N¡´À÷¦Ž/ü6“ˆÝCóƒ' Y_(#@ûþF’´Jù«î€(Bõ]–¶Î 1]t/"°dûÀõ‘´2i£}·— °ôÏ\]•ŒðÄÐÀ i]kS"œQEÄûóD~¼Çƒ° ¡¢&ålK6@SZ\ñ²¬È‘ ¢ÔvOý%Y¸tûö%Ž«Š~€!VZpÀ)0£2¸¼8­å)½·AµªXSëöÛoÿÔ§>uîܹ Ž=z÷Ýw¿ë]ïzÏ{ÞÓÅS¨`^Î?•¤ZS@‡® ª+#°*§‘S'Îfª:®ªãú‚¥K&…{3ˆˆ34 U:¦üDÄV|'}Öݪ@•{®–V«Ñw𙱕t;ÅÆBOU!L‘"EŠ®eèàåÄ,°­·6ãâ µ/ª)4åÔº?Užø»~QR)ß õª5K˜Þ`u­Í‘pF•‘KéùS†<”ÎÀb qBVÍéG&5pˆ ªò,Àà§ÝYâ¾°må¦M—(Îz’…À‚½Àñ`(Jsßä­iE5M`™‹míôÖ”Àzç;ßù±}ìꫯÎf³·ÜrË“O>yðàÁ믿~¥í&~írò»üÉ¿àÇþi¡ãyÉ_Œ.XgÄYTÚÖ§Üó±ÓAU–?±+$°Žêcb#q'H£L¶@IÍ‘ÕÙ°V2.Å’ÐS ¬tûé8öúcéÈutÛKÀoCkæa( ]‚W`déàeˆ9@Ì<åiióPxm]‘…pfصÄx#ºçX´FEeÍ:Z*æ¶XÃFºM¹M4²\âêÕ—ÍLƒ–@èXq ÒÈ¢*;>¸é7Îß @p¼2À.màÛµ—IÒ*\£'yà "j)I`yMËT©”¢Š8†qyf'€ zCÆÎ#I‘XÓ®#æý° ˜\º¨d]ÐÝc’³’)Õ „U›‚ư®Œ:H‡¢BçÝ2H¨˜­î‚+qvS:ˆæÆ'-(òã¥)OƒèW¯Žw(Æ“o¯LÃliú˜÷=Å8‘”r @Up®B–)°œ ¯XЯÀËá›<]>'57¸ …p,[°JÊñ&N–„ ÀV+'°ÂýK+ljIÐ[S½v}_U¬)õâ¿ø3ŸùÌääd§Nú‡ø‡ýû÷¯°Mqö+rúáøŸªršWj/1UÚB˜Ë@¸šÏZ”{É„f¾~¿cÁnÿY@Ÿ "Ë´‹t¤ÃÏ fôué¶åY:xÉ_D —²]wêÿHþƒ˜y(¡‚bËÖÚa}-„k3ˆ1ÕkÂ,«XOE÷âL1"ÃþW·¾ÑyíEöæ…›±r|檄Ë¢”TÎûžË9ªÌœi!RèÅ’ÞÄÖú/1)§le#FµàhqZŸÂGÒB(8ðǾ÷y÷ÍQ´NE… ­ÕªGÄ©1ÄnG£‘Àºû™Ï¾íÙÿýs­h2?í¼|§µï +"û–¾&_t÷Ǩù+=«¤\VW tÖb¥ teŒ ¬X%—â³ÕÚG\å|Ö«.³? à “H ¢Þrì¯þæÈ·ŽôZ)°¦ýÚÅ7¦­µÜ•Á ÂPá´àò@Ú")ó²N»ódð2ûæ8Ê* q5"Gù C0-bàDÌ0hfìËŒ˜6&D$m[øý^™¹ÀIrRXYÒ…:ï±åíweß|åðÖ•7Õ9ŒÐB˜f`mÈéù±OJ•OŠs÷ÿæojÌQsý¾J[q6a±wqó><ú'üð߉㟆¨³ Ý¨)°Æcç òf }9õ=åM’ì¶³®6*¼BwqVâÙÙ @Í=¥ªçƒ'Þ<þ§Á¡÷„Eµ.õbq!D´¤H‘"Eèð5äÌ!qî>åÏ‘Ün:zÝB/ÐûCKÌqï)ö*!¡Àê­ܬZ6š ,'Êt'ŠˆwË©ÂÕÃ[tçU 7«L¬*&d¢ú†Ú™2绚-¢’Y”BRPéI®%Œ0³H¸p ³|&pªX¢>Ä}ºZ¹ß>è´0ý©ú ,"LASˆ{5T`ˆ‚Tšã“'Øùâàé“îT«³pfÆ!&zCôTäá*z£X»‹¨À\íqŠBXj1 ႌ¾$b0šX–nŒ ,]¥ñTeîwÆÿú{KHЋ‘,ÉÓ“U5?9!¯ªÍ<€ªªi>xä’ÖóL1"M.9VœÀ¼ lŸœø¦´Ülq쎗S]LP MV20‹F{,T`iS!‡à†`“pÍÈv(âg§5¿¶pBûsc*f± @–®ÔB€cÙüÓ+/È_qÍÜÍÏܳ¶§]Ol\Kñ£ÿ¤}‚²rJ•C™Rœ‡¥Êm~ºÒ‡ @-P‹ØZ5Ùö$Âg¿QÛ“SòÃÐËèès=¯5¯ýý˜a öf€(oRU'B¬a@©ê„œ~ºÊR½zŸ^^ûGh!¬ÝAÉâlQþ úÃP’XÃÄހأi  Âú*EŠ)@r;‰5¬üqúßÂv½jaŸßò ^,pMÒ[w}5jI6ÞÕ8,¤´(,„4×I³›29("MOK«2qSšÀ <ËB¥HUö} À¡! Ä© kXCrÀ‘h{’',„\É¿:ùUiµV=Ä!2ºÌ¼!M~“ÎB‹Âˆbˆ‚T¤áë•ú¹JÉ—7ªÊ²…µP[mÊÖ+V%’ZÈ ¢Àê.TR’X]‘è·*„á—„ …ÙçË çâ*Ÿ:òoÆwyfþïÔ?~øÈÁ¥¶•<;Sìmù_¼rö…Høcø­ ¬‘KZDS®ˆj*C{ëôDàLu€ã eÏðz"ëŸ'më¦`f¤ÀÚjêZW«¦ `ÔɰlÓPT÷Ï#±sÓ›3YÂt=TdYXë‚Û·í{Þ[_°y÷zwdíÐ[·2CU' êñ¯ªX3t.~/XËÑî¯j¶ïIt÷ÇX+0—òW]‚‚Œÿ¿6Е±–Þ-ƒí©"`Ö¯PT~àë÷ž:´´¶Bƒ°K #£¬€HÆ•zËÑýæ³?Q-ûMRžòPn'{¥g6SÏ·•Hu®: ' ¦´HÛ°;» ‘Õ—µ*„±k«XÄàQLÉòQ A€38rWFœ$U¦ï†Ið•Àº±a ¬Êi$»“äv€¬]ªÙèõQ•Ó­sÜu–™GD`ÉÙÇÄéÏû¼‹Ÿ¼§áX9õ²ÆŠño+†d·³í/m×1ã’×€ˆ³•d¶g°F¶ùxí"Ôé³h °è¦çƒeС«tkÄ,h^lÃáæ›[Äô¦è=e!LDZ?ŽcàBD2| âl6v¿zñ£µ«|\œûªœ}¼ÓS`=·ÖfYôÍ qÏ᪃©ÆŽ9¬–E£g7™…[¶ýˆê’µ]SZŠAÕ“>Z¥—UGD`éŽIÊõ çÖ-{!i9^çËðÄæcæ# 2;¿µùŒ@­r¼f² e¡¥…P»U,³ÌøîO?)œ2¨<ÌIÓà"\ëÎzÕ3>¯ó/_8÷¨ŠX:±¾b§*1µšÑÚ´® »?Ƙ›ˆ§X)ô‡¹˜F©§®Œ• x×3ÿz÷3Ÿmù¬þ^HȘ_F%AÉ9µ 3¶î˜ JKj*ù=Õi€Zú¤XM­&æOÍyÕ@µ È=`õ ,}¤I ¦ ‰w?%æ ‘A[Ö„ —æG)§¼¨ !5#í®\H`YÌÀ­2ê׈§md @13Ž,„  ÀµçÌ”ÀÚ0ذVù4•Ý¥ÿ‡£“Â^b@ú-sÜÄZ•ÝI‡@¸âô¿ƒWTñYåÏÔå%9÷$U:JÈ3_Àv¼bZ’ÝÎv½ÉlÕáîÊ›@G®iy<¹†.Õõ›µØ–`Û^¼ÐÇ‘¢¯Ki/0X)R¤H±V …=0òÆ¥?_'vnƒD ˜ïðñ´Jûw~íÙ*„…hÛÜPÂlô¥QÖ{ Ã–ó<º'”µ·lÁPU¥Oʤ  Â}ƒnP ËL’‚ùºŸC¶“+m•_? @$xaT\C®¦^ 2ÉžÄëmÍ1é“M–œ0ê8"°ô"pί~£úŸú/|D¨¢úƒÉÓ'K³Ÿ:ý}eøÐv*8ÌÈÐ0½«ÃjõàFEÚ2ë MŸ¹ïìáÕk… ” >Z(Ų¡3°ä†¢çïôðc'mù¬~+I½ä2ãjl5Š¢?UKKsW úL§jžHókC=‡§DË ¬>m ŒÃ¼<ŘÊлn”þ>«æŒ°‚Õþ#ÜÚ’ÉОq_q}^ƒ0ƒ_R¯}øÙM™pg"C Âr0QË®3GH»€v «6wJÍB“½‰ K`UN ¹$Xtô¹tøºŠäv]ݯøl‹WF%€šÆ¾_bÛ^B¬A’Û(9õ`| ˜úO­áRåúÿ*˜'Î:|õÂ}cc·Ñýp¶Ò‘댽¿HÌ€¡6ÖÀ~óŠ·°]¯ ÿY¯À@·¼ˆä/!…½‹~&)úëêpI‘"EŠuaæþדüÅlÖ¬Îk®¯…pmÀ¢è+«W-„FS–Aˆ.>HAcÖX¦SÖFô’hÙR6€²ð\á!â³Xd!Ô+. €œ¡ ,.@Á´\ª.ðHõ0êXÒðd©µÛÝg•†‡*õõ§ˆÒ*!½8´” Ù€£—yqÚ—!mÏ–'fÂt‹iî°úÊÿÜìwß]ý‹äC«”/í<²˜ö¼\{Õ¸Š7Q-—»]A ä=Þ—yï‘É÷”¿êtÖ† qÍÂTòVRAâ®C¬4Û¢iî%!f«%QJ²Šˆ¸/)wIM%Õm: Pχš#;ÊOë§|4Sð|â#ºÆ^H­Þ2‰iÀDÄÔ(‘"€-Öƒð*`UÃéB[¹ÞTÐÅsŸ»y×-[/i KKt‰`òšr*“‰î¤t»)2q;CVBÜS¬ 68•ÝI²;õ_Hn—±ï—ËþbÒ=T±ÅžL\‚0úa»î4¯½‹m¿€œú~|düXySqÌÜßÁ].a—þÍ_ €Ž<Ç<ðÛl×Äìä}‘&‹Ø#ÆÞ_èäµ=ŽC‡–èÄN¡§,„é8öÒqì\ ƒØ¹kžØ#q¥”%Xñƒõ˜`×fk ,Ú[w}ŽahÃ]ëúßÒÀ@ÃtI·d;ÊÀ°ÍÕhÂЧWJé¹*A`)€+­ì0XÍB¨×ê¡+àyƒ{œ·OÐ++DçàPëí{_ñ‹ßp[îú†Îx‚LJY°p4XÂÀ¢ÏÁT6€'½cˆ´e+¬NàÓj.5ï})° 3£{ÞÂj"l¾¬V¸^~꟎?°ò¦ºûc¬³v±Ý š^YÔBØSWF/ªöPá-D‘:Ä=à–A`Å G"T¤ ÀpT±4 ´öUÒ À”}V?å)¨¹~#¦Ò"ÐÄìXÄÐ3­eþ¸f ÀŽÌP††ôS.WÊ —Rö³VµGâdC¶ªXº€løn:`92ª&˜²RÖ†AoÝÊtÌ« –!ö±GèÐÕt`r‡Vë•TKVP`Õ^ÀèЕ0²ªrZUÎPAQ•ŽZ$»P²|BÍ?€ ì龜‘¤ `dÙ¶Û;~s¤ù±†;~yïb÷î ÝÕ è©÷tûé8öÒAl±G­ßg^ñfXºk]$Xk3ˆñ}¼E{K€€ÞœozŠ``Ú{ÂüLç÷¬»31U{Ëz‰XU^EúìÀ2xÒELЖ L€JÈ0Bø¢Ü"à¤D&Z85ËÜ<p¥@ÑÏ6Wõò¤D”;À’€: €yYºbæûÔp`î¦ÂÜýŽ@$5Éuò‡UŹJéï~÷_O´æ <øñc—û-Y9´î;æ·æüÅ—„îþëBÜS«+§èE(žžº2ÆÚÖVñº¯{/øjYâ á·}ËѽéäN–/ªÙZ½å¢Šˆ ª’ÖÂéjå'ÿì gÞÛ!—´jË¢ € bÜ-Ù9ýT ¹V`% ÚñÑI1‡®Y­˜ÀªFáYÜ)ØÊÑP÷4ˆÀ2Td!$aVó[ˆkËȩڢ>k$XXi%i>U`u 2ãë*ìu“À °vèÉ̸ìWŒËߘdyˆ³™˜Ì«êxãkC aÓ&alôüØ' $¼I@‘ÌÐ\ØaY< Bé*[ùšX}ƒÁÁŽ4h)šA{‰ÀJDZ?Žc ÄV $3@ña!\›A¤¤w ,*,&iA`iç Ó3È5Ó— lN6¢‘!6Wyžò8ÄFåîʰd»ÎÀ¢„@„/¤ÎÀràpíYYw¨I3óÓð’Ñ«öàRUxˆ‹³¦UŽŠñliò;…/™|µå³ÚO¤ÑrõÞø’våoN|}…Mu÷ǨÅ5¤îÛúÚB¸ÕSWƪ‰žhñvå;Σ O3H°Q^v†gŠ3þâ!V²>KÏCj€O[¿|Ê«ˆLYZÕgç¦êž 5ªUÇ·ëK†$âûS'â§|)4-Exݼ­†Z誨øƒÃŸy˱ÿÿŒ} €EL&_&«eÅ8 ¬!ÛÉE ¬Í, `ÄH.U˜ÕülV;õµ™=ñãlBÕ’ùj@Ž„áæ†äDzÊ›âÇ>!Ž}rõN±!KUN ¹í!¤ ]„M",ân¶¸ b;^A¬!U:"Î~EySˆ=ªÍ büÛPœdw¶¬$ØE¤Wº ½J‘"EŠE`dA¸‹V!͈c2ú¸JF¬À2io…¸ Â`µV`iqVâîˆ%X›õm$êúÈ6€*ªZ¤óÎM¥kczéë§ôÙPöMïíëÃxSë‹’\š>ä@òÐI$™.GŽi‘ IDATÙ¬ÀÒë:1eNÀ¨Úœøì×ÿìÔgX~@Þ ¬mv¨DÑ’Û"ÌÀjE`Å ,Xÿe{ÍU¯ÀZüš^ ¡…0™Ÿb…Pþ4tªÃªacXÅcNuÕ.Â9î¼´R`0²ì’Ÿ Ç¿©<ýч–~¸l…=_d½ó8Rô bÞ*ýF¤H‘"Åb Ä̪ìõµ® ŒèMÚ=V…•&ÚXš{b`z#=éévu‰Xtæð‰ï‡– ÖHH&‹„W‘÷F1ð¥T‡²Ë&+_S`%VP’¨ò(2F’À" ,mɉ­”­­¦v˜›’GJÓW¦I‡œ¬MLDZ'iÍˆŽ¥V˵Cç1+ÓoP¬­V]=+Îâa≹ó«t–eƒ\ÖlµòÅìg¿˜ýliÅFΠéÙJu鉧‡ø~ñ™ä+Aði듟¶>¹dn;øoå6X!aTT1!7àÅèÇ[ jŸçG>ðÁg¿~ª\W`×—RÛœõÔÄ¥ ˜`§= @˜­‡c.³±N{5VïX§ÚÔ ˆðœ{ …Ö²zKR]Î"$°t WM8:ÄÔ“üy5ñÈàÁÉ¡g8¼ `†Öî\èûÖQ€\qI´±ºYa0VÞc'”ű éñdáe…ñ”Àê¼i°R Ë‚*Y: €ä/YàpšÝ  ……П@ÌÖ…lèÀ~PSùs: ‹Ø#ÄÙL7=ŸŽ\G‡®¢ÃVø&:BÍÎÐWwÓ\ï.lTôTV:Žýtûé ¶…9tƒµ¾µÄZkÁ­/Le MyDí§c„éøÒi‚»FA !‹`ÀÈhÕ'€³qgžâ’ $8¾o•X¤iBÊåh&°ÌˆÀJ(°´Å&PB+°¨bF˜Õº ¡e`e“–=ËÁ€pAH‡FEîR³"ÒŽ•W-v*F\‰l¼Zn~–S€é_M«6ób‰‘Õõèî1T`Ѹo[}œwÃ/Àœ¿¢!X´mˆ;P&$ƱÄCúFWQ˜ñª‡ç¦&Z}W¿púÉ7ýÐ{Ÿù®w9®7‡—×úF¥ˆÀ ùnÁËoåŠÚ¯ø[Ö·T`é(À@ ©ÖJ8LÎ-/Ì\•ü{>I`©Å}ƒfè¬Ò±ƒ)º‚H´ŠVÏ¥!´€’‚Çßg^ùV9垃p‰5¼H´¹"j 0ÙX0€XCͯB‰³YUÎÈù'ÀˆqékVü–B¢½šþºêÝ|óÍëÝ…Šž"°Òqì¤ãØH±ˆYP€ æ—4e®Ë»6ƒWq2{Oe( ‘Q¥Z<Å@ß¾÷À+¼‘¥å:m&#ã‘EcÐÌB3( Çháà+_Bg`…7ÆL² ÑC "™Bàò 9ˆ'o†”“ÃŒX{D¥!_áòOýN4­fÃbóáÙã\›ì<«8œ•’ÇëÊñZÅ™‡Hx€J&Ožýë\õc;;Ú|ó½ßÿKÇxË–WïÊ·¹I®G,l™ñ*Û³ÚÀ¢#íJµiõÞ-$͘ø­@wŒÉwÙï¬)¿¤©×¹ÀÛµØÁâ®ÃŸž´OßI_öÒû‘ü [X€K*HŒc¬c ‡i}ìÔý‡¿µ{üšßÞ÷ʆ—OûE¯0153Ð¥¾×ÄV“‹G„QQ–X0ôOØ—A•‡O¹Q)O®”4]E^GjžšŠ _piú¶f dÚTF0ïU‡lõ(‰ÐZ8KjVPOÊ›Ì@”觘ôSV „`È:Õ’2&eD2Ee2‰Ï¦–:ô­5DìÈ^sêf®DfsxÐש@ ân¶ÚÞð;ù7.Nܼ­NÎo$ ³*„›¬PeÊÆO)Ų‘XPÕñà™›W¼Yu ¿@ÌA¦‚"GüÕ.„fƒeÚ¾ÐS•3Zðµª}Û€è _/°)z€Á%EŠ)º‡å)°úw†ŽÑsÖ&¹É-V6›-r—u Tœàk/1þ–á+ÌYs_n,þËˆí  Î|­tÐû"+Ð5¼â³P®¦,•´<ÑD`)’5[„¸Sn¨  €(¦‹ò&+ ¬ð\£¶šÚ–-sî´ °j†¶†£¬cÅŽGªùÉ'f ?†Ž¬Oœü¾,—òxµÔ)›ö[¨Z ÜñíÊÚ(°*rýkK…æ[zyVy|f|.p÷lqVï;í—‘Þ´•£Hçx¦8S¿ö<"°ZZ%á<Ú‚ÜðØ{ïpK²»:tí½+pcç43=Ý=3’f”Bò ƒá“í÷HŒ x~`Œ ÷}`lã÷àÁa ŒAæÃK °Qh #MÐÄîžÐ9Ütr…Þ¿ÚûÔ 7ßÛ}ûN­?ú;}N…]µ«ö­½j­õ‹5åÖIX­Ö$4=bìÝÃT‘)–Z‘ :0ª%B}xDôª/w#], *ñìËkÇL‡ÑûN¼£¸0UíÄZzË8Ö&Ö†9GÎÓ‚’ ×b!ÜÕ¶(m‰-I)Iü%N`Q.&LëdW·žÀ&V!°À8 ¦M2o’Eåù—&]q[+¬W9à>²íto.Û€[jg(±ñR˜_•(Q¢ÄVyÖ˜µ£Ê¼nú ¬W…ðGN=¸ÜO¹…p£a¯ÞsèÕ{¿™ kˆ¡ýXi@Ý`Å_dân3°<+hòQT`‘!NªÁ¼¦<×Êb–ÐDWéÔäÂ*dlØß—1*6Ÿï½O`i¾'ª…º’Ï8 Ë3eL®F˜—¶ÁÂô•¶¦»@óhðEúÜ[3Ùäf¼KYwôW#2‘¬¦XHÌög`=³zɶ›†ÜJ±ƒ3°~cé£Ý‰«ï]øï.d`o K2g0[Ù–u)øƒ£,Ýcø˜³I Tê \‡•ÐTŠÔO”â”!û½¿xšŸ>ßûçþN¾q£°=–»G5|Ë»K7W`1Ÿ+ Ö²£RR´Åöð¯ôšýƒ*€Ê#p味òjÜÀeÀ“‘D{)é{†vÝÕ9Ó'£v,%ù‡2°( 0€’ÊÒø“I’·cr£.˜~Sqä¢DÃl¿ÒüQ8Ÿµb€¿jÒC °6Ö¾¨N~-±5È3°†/¼-Äm“Å¢ýL2G ,¾š –ù£$|B€µœÖ²ó'0NÓ¾ÝØ­VײaôCÜwÀ«ìÇݲwÊN\s™5W[¨’q Ø›œŠ§ÀZžX¦†úÆ0áLs#¤ôz&½¾{1EJ3À€[“S`,r5ö”V`2ªŠ27*q˜*™) €NUÞ•ñ *°&}[+­r Ôö¿I.–©˜*€ˆJn‰œË—1€zz| µ4Ї.=MÅÂôÖl÷ËÏÀ›ãt7ä'Št…(ë-G±#b³)ÖߌÆÀÖ6Ý‘üU®ZÚq\Så—™ó¦m¤àsæÓÌÒ+c3°èXt£Ð=i×U €d’þ]”mYiµY_6H\ÒXm×&Ñ·ŽÉf`Q¹ÕTe]Ëv%&ÿp#¶·§ ÂhIarõÖ\Ò ²@ "‹r̽كí&fε懚J r<ôrÖ)c.”a˨–|á9;³C$‚÷®ò•Ø"/W`)ÃÖÿ' _c Ó#Ïc2Pa%µEЙÉÚ`‚[ïÉuØqïâ–‹ö™îEÓ½hâ`«Y}ÒOc°Ò%VT`EVmn#q¸R܇[OVl%ʸ– cG]e?î”ý¸ Pvâr`þ$Ö¬À꯵{3°\§õºðn-î îöýV_tÍ`Yhž ØêW H&Iá €žÍS/NÒ¨0bbKRV1¡úï;û27ÍiùÔÈÔ(0p#(9>8/€]w:iŽée5ä¼U”Nv¢€:«‚,„–áÖB( žÇÄïÏÒÿøÂ—‹Ï¾¾zß×¹ohï—Óy§?ˆG¤"ËÁ©Kšzx’Ki¸fšG¨ØrÖÃsÿlñ ‡½ýÆh< u$Ø{²ÅXâN£ÊŽd°è‚ß’®i#'°6CVeÐ9GY›G3)(FÈfš¸~쪄ªz’þ1Ë-„Y_‹…D‰Km®ÐA:ržaÔÖ=>ø&ÍÎTNKE x^…0°”oMÕÅrVn!ä–3j€¤)3\0À_Eñûøa)°(à¼R`9ýx¨£`Ê«`YT±Ö›™  âX.ªlÚå^Î䯢ƒ‚¤¥šSD}ºö ,;ãG¼{tÎ8&ï¤T¯33_ø??ÿkç>¹Æ-¯Š6XL“ù‹tjRl\ÕL{ŸªÿùãSŸyjñÚV5电¬\µâ¸ÄËY’ÞXÍ4¿¢2G`™•3°òKq>m¹AÕ)°Ò\•ÓXçTÜÑ Û¨À­~˜X¤ÀÒÒ‘È’§gªÍÍœiM]Ê¥ 3|dþŠª´ER}þ;ˆ+ï°6€ˆUÔx@g\e)b¯™¾ãÝ·øKñqm µÇå¯;+4S€ô¾H#I­6ÖvrOŒS`«Õ,€‚&Žu½XŽÁ_K€ï9ñ–Ÿ<õ¯œ=¸ú¢%Ö€\UX9¢½î#«¬é"ËÏ]Z´®âÀ;ñþ«~šïyíš¹yì’b;pþüù[Ý„ÛtUìN³ìÇݲwÊN\^"„Š1îåó²ØþñÕt/}³öN4Ígó­ç×»_ÁHôR—_ÁjPH­¢Tuâ>˜æî±Ø¹ù*…Ic¥:þPÕ0L§›ÄnÍãxànun3Üñî }ó‡øïù‡¾÷æµÆ¢ìÇݲwÊN\,˜6½k&]b••”Qx1°Æ·µ›ºöIqøÝń͵w¢¶–n?¿Þ +s8Vå¥ W+½O`y>Rh/€Bõ÷>5@ ™É qéÑàDŽT ܰ!íׂ3Ƥo¼¬•¥SAŸ#2¨ã©@Ó^ÀÛÜý6üöâ¿„~ÝÕD~yaSçƒAÖ\ÚKI5Ú²‘üx¤Iñ³ŠŠÚ£iÓËÁ©K†H± í¥¤¶À¤ÿæýw¾øâ\/[G`õ@VÎ$RȽö6î†sôçÔà[ÑFÀ>Éï@ !•m……P9K’nQ Y+³Â+6âŽq4““S5TçòîsbÃT“öŠ‚ÞUF% ‹ ,ú‰o½Ë©G/þáªðÈq¬\Ë¿5DØe…ø¼óì<€WE§`ÇœÔ먲 €IQ³aVWjm¼šO…ö'Ç®TžúBó¹WMÜ .}*`êh#Jd×^ D„ÜB˜˜ðífËYð…(Æðy‘Öªð mvE‹,„ÊpÀ[[”Uu¬/«ÄCvÀ«oëNn§®¥,p­ñêTÁÑhCÅ‚ì€q¶Íçt“¸ò8J”(Q¢D‰ˆ<³PÅeÙ%oâK#ÓyQ/|qc«êæ3 X³É‹@ÔÓë%¾v!hj‡Â[zÊÀ¢éY‘ã ,—T÷ !îI®ó ,n£^†ÊÉçÖB-¼Á,N¡<­l`b™gÊD ¯6¯>¹øº&’Yê6ixµzˆ·*0§z"°dÀ•^®ÃRã|vD„ª†õ0ʪc¤?p,Ÿž? `ªs8ä^QS–±Õ ¬ÿpîÓï?÷Éž\¥ )ï,„L¨ñ*ãez£\Q,s6a.¸²±- >äÞ]¹MÒ˜…¸»”lviH¥­Ž7bm[/“Ø‘é]²1´¬KY¾FÙ ,Œ³žE» 8J`xF¢O`É\U †¨"¡§íÚ$\0üèů†X.K¦¶å*ÖOïßTÄŽDS8”ß0éE¦ý*€L _W I— v÷úwxÞ¼(µài«ÀrX4š1[ÑBAû9c€\öÇœPx®„«ˆë°âߊ«8aØtT9U}w&™¤lþ`Xœ…ðvb9n/èæ3úú_›øúèOFv0o¥.Þ7EVþ„<áõ«SQM½ÌHC3ž3"¢Šk.\%/é/`¸ö5zÝl€HÒ<P+ÄÄ|×ñ¯mÿ”_À²Àé#¸ò´P°öÆbË Kº àR§Aüc , u®™jÈÖÌh8{”ñ&Ég²óN²»P²Áò+ ™&L} ÀùöËÿ|î±Ôdß}ìí³ã溙ÐLõ0Ád`¼t)é]~U8¥Œ¬6®v[«ØHĤñ5ÜsO/]ÿõ^oâWŽýà&wºvôlñA‰Í*°n ÿm&†¬ˆ®Lé–’ŽÀêg`«BhÅS]Ó/»éò³(݉H.Ñbt ç§ô«m¨BèŠ'Ž^üÊèâ€å%;¥‘®åò+ÍÁµ.œa:Û”'EùY:HLˆ*€™°‰Ô¦À“në±¾eÏÝŸˆÑ¨]î© Bû¯l¼€¿×Ž0…Q‘‚á…p2éòaʃM—¸ð,½PI¦ÚQ›ýšŸSc, V¾-|!h¦IXç¯å.*®n_'x»ÀR=uý3`ž8øÎ[ÜK3­sâðƒâè{†ËXµmmÀíÔµ,Ú‡µ'¸Ó*Ó÷Ћ0½«¬X‚p`·òV§OŸ¾ÕM¸ÁwLˆ{Ù»e?X0À¬…Àù°MÐó0Út/çO#Ö܉¦ý6q’ÕÐëŒÁ¹…°T`¡nÙ¨ÀºÿÜ´ ƒ ¬È*°& ª(š˜¥FQhŽ“qõš!P4aãà´¥g`Ë:v^È1ÑïEo˜²Öúþr9ŸíºÚíºñŒºðuþÃky¶Ù^$óLïÒè/Fv°m&°n'–8üwøþ·0¾Ê_÷"øì«Ôùÿ®—ž„ÎÔ•¿À§ïß¶núUom;¶o}ë[ouncäUwÀ5Qöãî@Ù»e'®µ´ú’7ËBh:ù¬XÏ?,Žþ]ú¼ÆN4½kXõ0óêúúgLg}ùý‚qì¶zg¹M˜´¼À½¥gŒiA‚V˜ªõ ¬‚…òÑ3#ifåDOû§÷÷’oÇ"•¦zß»÷+_èÜó²‡íxhñ‘ÿÜûÐøÎŸ:õàIuo•©Ý3?;ñÍÅo¸4ívq-¯ôfºþµ.ï˜Ë,ÅU,eä <ÿS¢Í' áZ UÈ šK:Óa~n)gšž£B‚Øh!¶!\[¤»y¶{SÀõ¤5º˜ÔšR¨ÁÎ;‚{*Tèü|ïh‹ÿ•½÷O¬ñ(‰QŽx1¹lÍd,+X©‘`–^¹Yp ,µ_çÊXLÛˆÅÓ½àÚX}ßÐSùv´p ¬þIÌŒ*ÐÆ¸üõØëºAÕqFJD\)?  ÎNrÓµþìâ““Ÿ8$ïøW'¿~3¢leÃk}ßÜ¿†æïßÿ¯h –ƒ—EŸ†‹ÌÈl\”XUN6tÓpÝ“Uô#ãótÐW`fü*€{Aw&©Ï?¶xù-¼7)  IDATûïr¿6ÓBº?ÔL]¨-gôjøÏ/p5QËÑS"rœ”îßæ‘çû–U?­,†¼YVspí«¾¦u,"áAA3EvÑ@¬À ÙnS`™tI]ü ‘{6Më,Ûó†[Ö ™´ÀtG ,Ù˜kê6áv"°À}z§ºv°`†Õî0å‹ÿÍ´ÎÁ«‹ïÜžÆmJ a‰QüÔ·ïå5Q¢D‰k=-¬ÇB¸íVûú çGß³.É%M°èUö1½õÅôÜ?}ðŸ.}Gerïÿv+&m0GˆþüIÏ /*°,ó2ô§[,!©&š [‰ø€…BÇ„ß|ä ¯jÞ95[¹æÀý3èWÒm-°9Yi-Ê9Òà +†²¯®¢S=8×Þ´ÚÛŵÔïhè>´”öz9Š?Ÿõ&È‚k)‰ëAè-so¨!µt< VåvÈ@EˆhÝ,{ÿ Lüó“Ã^ÚëiƒÎèE“_áóY»¸ÀS‹7þjáIÑ[Ú†¸ .<&DRpÕè­§ü( SÊÍv×c¿lÂ<ëb§ù‘«_ªóè;Ž¿iÌ®½ñÙäÛ‡Xo%»&ÔT×Ì&rô‹èêœÁ1b€„"dJ‡j"–ýCpõdÖ™A}ŠYÔ[ Züæ|2ŸN-.66«"qX‰è×Í$&ª×q[„€ùvxQJ tÊÞ¥“_U{íûf¡ý[:ˆi\ñün–k¦‘Ñ}–g6ÌG¹élï5ÌŸé\} îr¿6T@`úà4Ÿ¼`àùˆÓ\Ê×Nˆ–¡fÚ¬¹ÏiQa˜Ç˜+„zOíÀ·Üù:·:Sžá©¯V¡éCîAÁpE¼¤¿Î*„ŽÜÜ5X¦ý¼žûˆüÔéæY~ë,“.P²ŸI!»ðªÔÅšd‘ïy-`àU·;¯é¶"°6>û*ÕyQßøâð»\ßïX%[Q"G%Ü%£p‰%JÜäDÏZBÜíŸZ¶Íss–M2§.|^*6½kàžwâ;WY—XÑ~Lƒq߀Q`k}/]÷ƒ×ï;¶¹æïLU[D¬èô)À¥8 ¬pSžWH`ñ¬KåŸü):4pã`†ÍFÕ·Dw µÁ3€8hyBM'Ki_øKï*!öXÖ×sXì½l+Ä5Ñg‚i\Ìxjg)Í„'ü€*X?yí7dµñíò[ßzðøè®5SÔl#äRÚÚ¡hži?P q'EÌ|Ò9;ó0©¿ÆL·Y9˶^£‹j€ÀúìҹǦN3—Í5µÁgžWP”ÄzÝF¶´ ;Ë þâʳ¶Ÿ{eíø»ß»ÂZ«‚çUÍÙæÇ¦Nó¤ú&°g3mfGëElcò7ŸÕT]˜¸®„jeé„¿Y®¼g ,pM‚AYLI=@öÅ*@:Êb› €ÏÍzbð Æ{eXÚâuk0½® ÇRÉ 'Uç“.XCG0Ÿ†i¤,zû¿æÐ)¼hÄÍ49XXJ{°6aŠØkcà‹×ðÌyM„Um¨˜¾@†%2Œ%°Üªš‡Â ½ýR\ûÆæ[i«T…Íìs`Ú7H³Š+ ÓÄêëÌÀr ¾ØÙ™×k‡é^Î?©`€1­³·²=‰svݽÄ'O™¬©®üOEÄÖvûq{e`m |æU,ÜÃjwðéûÅþ·Ýêæ¬÷¢k—Ywüñ[Ý„[€²wÊ~Ü(;q°``&]Z­ØMR`™tɤ xU±ïÍÔ•¿T>¢.?¤Õó›öŠ™;:5é˜ÇÂ=à> ÷¨±ÕJ¬Š+§ª('n%ÇeßwF5³˜DL…zííù³*YWŠtX¹Î"jòK,­N¸^¸ˆe—S±Ú±ýþ4ÓÜÙ“Y—¬Á ¨¥4À²€˜/'ÉÑ€ŠÚÚj<D䑈k¬þF>2¢ÃŠBRl¹Dž…¤ûù¹‹:ÿ˜óR-Y™˜ªä­m™«£cX ÃÅ!yŒ‡¦¿#§ßY;dAà#!m?wvæáG:Ï­w;T…Ð*]•ÐA/ÕÃJ+I9ß\o¸„âöX›%ÎH°±€rÁ—’áÔð 1ý¤´8]¨Ù'Í@›c­°,`š®~ôú^YÉ•‚Ò#¡.d`{R•h¡«ÌÚ ´Ý²¶•:,Õ«½ºóó ,¨\,f¡uëÆ¢¨©fÖƒ½m¹ Ÿrõ"x:^øTå€Ë“Oÿµ÷cç~‡¾¤|± ë³HÄø!‘ü!tÒN¦¼@xŒ—Àj?sÆÊU±Ðf*àªh•«)°h/Üf`‰õ ŒîußÁYðÖºpÁ©Ç§î…¨˜øÆº¶°U0­çô—LëÜPÛôõÏÀ¨~S·ŸÀÚý ,íó_õÓ·º%pÇwÜê&”Ø”ý¸;Pöã.@Ù‰+ûðjm“µ˜?¹Â‚7‰Àê¼€×îäûß—Þ½´uI4WW?îüîe×í] ‹ö‘&ŸUšøºé]]WM›„™°Š*¬?‰"‹Iÿ[¾Ù}¹/ªí½z¢jÄÉÌÒ'°ì«þ3{‹‹YÖx‹â·h:m„l¦IG¦(ðhëB¡¢•ƒYÖ”_ô$­,I¼žF:ˆ[r€ÀjÚ™p5ôQ˜ö_ï¶©‘]5ž¢_ER“µF·@`Á4D¦‚0¼±Gz±Š:4™ïÊ„Ä/—:ÿ„ßFµËÁƒGîÐF{hÖ)þ·«½ÌÎg¼è ×O`¥KAf”Ö':eXè ÈÌ¥ÎÒñ‰Ù±»Ž¥¬®ßCº1$Z’†¸’//^ûàÂCûô¾qêÁõnŠè$ ¡n3Û‚÷¸@`µ³d_T“…š}C$ ¥à3Í!Ä“÷Ó÷…xgÃB3Sx·áÝ­"xº^Ø‚`²¾OÐÖtZÅ¢¦Ìc‚ƒÜ  )“Nd‘ »&E®¨òµŸM™hÉ ž#°ìhÃeŸÉ}`æÐ´sf£–«xº¦ ÊúÚ(r@›åXvËL{ÄàÓsí§æ(8²‰Ï ¬îr&¨ nÊ“@«*°|Ð0 yW^~ÎÐ-vjé^–Ïýÿþ¹æå/`þ„ÉZlò΄^z´ΰ=¯ßÎfŽ|þ¿šø=ðpÖ$ ¦wÙt/ëëyå„<î $°^‚¸iy7SS;½þãÎÄïþÀ­nÂÊ~Ü(ûq ìÄ•ÁÂ#ÛH—°2å>lâo®ÉZzî³ô™OÝǪG‡h¿€ÕïdÑqìï¹ï£¬•=ú´^xÔÄ7¨Ôò˜Óa%OPb•ƒX|Ìô®¯Ùx‹_ª¨ûy^*…@ Oû p¼uÿ¾ƒýÇî;ê3?{ò›‡VϽ6ä9r^•™Ê@¤”g3°Æ¶!ÀIq­×êf)l¸ûzáY ¡S`UE@óñ™ Æ;¾BÒÌvTâ™Np¥¥,š D"€êXº¹¬ŒtO£ ñNÔ g ,ŠææÍs¸6ùKµï{xîâ¯ã· —Ú*¥ÉÇùÞ"*pº÷ȃ¸@O X=>@`õ0HŽ0C†G‰¢¢¤¨ßYKIl€«Éë¾f$”€"{rñúÓ­«Ç«{^³÷ȪÛ,"¯BHX¦ï‰»Ôi X.5?VÙM#°bE]ÎÑœï,4§ÎÇí1‘ù«‚.!TÍ‚,¢H’d¯¨ÀRƒõû(‹)®#Êc¯d «a‹ÔUN†–i „Ò ­¨KhFnMK+Ý'°hL [XBìeU"°¦ýœÀòt £z óÀ×®…Í“ýa_TsuÒQ/kgiÝzˆÔ `@”73§u ,®E(|ÇÈ‘ö“¡ cr%ãðÿÓ€*_%Þ{"a˜-¬±nUÅsª´¢À2YKÿ#V=̧_Á¢½ò¹šîeÓ»²¦·P²kÒEð€ü*uá#|ò `é Ý:Ëoe’y¤ Ó¹ôÛH|æ•êê'ôÏê¹ÏÁhæOš¬ ºOmÖäö¡$°v\¥¹ÝÅ_•(Q¢D‰7,˜1 &]dµ•¤jý—FÞ“Îä™ôm€*£V| «Þ»?Á÷¾A_ÿk}ãoŠÄÖ˜u£\V@¼¦wuÃí}‰ƒg‘»Õ‚µíßÜõ]/\¾ãØêe‚ˆ±’й·Å>EO V$ͨ‡²„ kqK0®6B^8šÌåÎT„g ¬H4},%]ã¥Ð¼®&;¸Ò¤Ú2_û5Ÿ²“óiÿÕx‰¤½e,„†IaVo]žk£(š‡Üd‘ð¡rš +:mWÒ"°æ'Ÿ¿Þkï¯ÔÓ`€®úß$l˜!ãǽ¨ ©‹WKa±µøo’÷3éÿÚÁ¥o(&‰Ë@û‰bR@"ûËùÇŸœþÛ;_µ^‹ä5nþÞ³±\×Òa’(³†¸XmVïóç%«6~ÀûžWLï_yÉÄZ‰ÀZRfCAò”£ïsá« Z[B`±þ%×Q ˆî±ÔŠ4ƒ ,-pÍ9—µ'DÞ7® .n¦Ÿå̽7ªQyû«I˜ô#è fœç– «^@‹ìls~!é^HæskAña6 Çòiy#Mp9@ƅƒÊGnïózÉmçO¯>þîú J£TxúI…] dZ^î´*ÂKG,-2>g5Þï‚é“‹×/õ–˜>|°Zm9¹öŒ—¹Äqb‘˜ôà'Š)Šë’,#/ÛPÁ¸Ua0û o œÚ|6œ\ãâ·©´a(?p©»¸*å*-’Î¥){بàˆNŽ ÐZ†î\Š¥0»2 —qOµ7Ýq­,Ù -'¡5܃¦0໬+â1/´v™þŽN_{þ÷ÒNÆûîÔ°0sè‘+§­z¶Uýç÷`É;¦¾¼öß ‹9ÕóFÿèêæÞÝß.~ ôô±uúôi>q7DhºW–ËdÍ-„‘#°öƒq“Ü€Ùìt÷¥‰Ýó­?âßë÷l¤,#¥ +HšÙvâ÷ôãOöd!ô– qX‹Y›$NÎ ¸.¸ød—;3D³‹wO5î¬x¾o|sY€Ð~!€ž È!蛠挿Øúào²>+ž¢b³ %Á5€(«pX°åéc¤X.¢ z6Q«ÁúÉ÷×äâÕn \ó´âÅ–rÒ\ÏÇ]xäß%ïÿÅËIù0•F•æ<.ŠŠ’”%¿¹ðg þðc×úýòKg?þ£ç~ûWΡ;uµÛ¤ÒHØlIä‚Y‚…`ûµ‚È–?ɃĞCTïзÊÍæ©ñw-Y=Ý9µj/Z¥­;Ø$ÅEhBMÕù¿Ï|lÛ)B²“¬àHèžß¹þW?zî·ÿâò³ô_ ¤çF&ðÔ g´ÓB9B¨îˆ……ƒu:)º0.ö,µZ0.fYi5£ë:QEPP‘D±—ˆS¾óåí ó;‚âÏi¸ "8´ýœ…°jè¡»‚ƒû''Ò½’6€Œj,xýû¥â ¬,„^XÈS'íç?;ñö9õà^G`A¹ôó¹~úä{ßø‡¿þèýX }|™×+ *†Ui·¦{Ñt/Á«û÷ý€wây§þ D(Ž<¯jº—MÜ¿œLº¨ç>§®~B]?mâ0F«KS—>€WÞLðúñ›V‹Ð¤‹öaÃ`á^•Ü'È ÉÍè­!JÖK;îb°ÞúÖ·Þê&”Ø”ý¸;Pöã.@Ù‰+ƒÕpo;—]läÃú 3_ã¬v§‘mH憗‘m¨¤ÿÀWu"Ÿ¼G/>nO²}o^†žqû YÌcá^_7½ë¬:ìI,±*ŽÕ§7¼.I®4WÄP¸¸ôw¼i ãhÊ'–!°*|€¨j¨N]D(h©ÖG“vž9á?wê[ò_u`IµpÓgˆ¢ùp„°âù0 \“'®çTl‚e,„B¨© =žX¤çš»ViÞË z®nÐÀ´0\õйÜm€!H«¾Š2,1é{I=«-^é¶2-¤¢«¼—<&ê… y)Eàªê³Éçù‹É+/¶æ€޾¹·NMí ÀÓa h¦´‘Ë2P ¼u*°ò,—eêÔ ªw5õ6¯À"j^5W]2…%°¸Ò@ä˜ÛƒFÎP‚’¼?Wù´ñ²X¾‹BÐvñÉ'zçß0qêO,»¡$ñ’i5óRb<‹ª«ùðª¬6¯·rž.Õ Ü „Úsx?è:t[ƒJU64ÄV q7ýMWÓ%⎌蟞Ê(°ŒÀjÍÀêYa1Õ‹¸*â}¤ ¢ ©«˜ò\2ZÄû÷/ÑЕV• ô^1y蘜ýÓ¥ÏXÌ:°EB'ýeSó0Ve·ì/ý±«8^yVëD!î_sèÔë’.&×Í=õwj"b™Y÷_f²BüÖÏ£õÜçˆ=¯ƒˆð™Wú¯øQî1É‚žûœ^|DÊ5V”B .|"àÝ÷ýŒ ùâÂhæO°ú Î`È&N ñ´iÃì¶EaZ?ãPÉcqäA½ô«]ƒÓ9%W*°^‚Ø‚<Ž%J”(Q⥠VÙ¯jÒ†IWZlsªgÓ»£Y´Ügþ˜0Y+WÑ»eH~í]fàS/ OÙ~Ö†NáU!úÁ·ä"TWÿ'Ei”¸i pbÍò*„!eÇVóøRC,WĽ"n™N¬3þÆX6¿&WlÞƒ iÚ|VyˆBŠòÅCä³eÌBJ1&RJ[¾£¢êb–OìI囑 ,Kx%6Î\FmAo @õH7©zE×xi-”×â&i”R¯£¼@ØÞ¶öQ8mÓgâ]‡îù?«?øÕ÷,•"°Èú÷>Õa¤½'–3šKr:‰X¾¡‘’%²”eÔ:¥IV€ÕGf ¬Ñ ú ŽÀZ%ºke$ZR÷VW`eŽ,c&‘Y—º¯Àé¬ÚžDRyK\ceŸ97óðÇ[¯q›$¬ ²*ìõi tùFGçMXã¢êüÛ³ú«Þ_ª7rnM1ËÒLR)sYÓ~ß_†J[/ëŽ4\£±b1rkŒ…qÚOíGð¬+]Ed(ÑX.|ª_à D¤ß;½ï {ÖM À’îÀgœ,¸ž«ZjTµä[i'3^X°ú…bžýžVçŒÍFÕ©`8kípÈBÜ;Ò©ÒnŒÖóà{ßè¾£‚Â|öÕôÜçûËv.€‘V=Ê'ïa'üûÌàǽû~`èeŸ8@oŸËhù̯A¶äœ½wáßózïä?G¾nÌZ¾­,TX/AlIE¤%J”(Q⥠Æëw0­çWZhs¬¼¾uõí’ L²0°L¼lV¾ç©—ÐgŠ ©9Æy‰ÀÒsŸÓ _ÚH£KlAn…S䆛ðÂ#‹¯¸c顇é÷ìåßOÿá7íyÓØTÅÀ¼®Ë:T"Íǰãf-pAòÅx¢¥Ú¼ À3AMT0˜ +å q• BÆÇ(°ˆaš&dZd,%šÉ‹ G¾+ö‰]¢×êÙ €ÄëÍe-5]ŸD@˜Õªº`!k%¤‡ {ÆË`Ø/Þù½¿tü{ýx–À ¸ð8?\¸³º€â™ €NÐ'°TЉ}³ sCùà(uH1EÌ…æ2cÊÀ2³¶d¤6Ô) †-„Ê8ÿÚ¦XÎØf«Ì GÔ“Y*6«À *…ýfÚ¿f¾4w)ž¸ w!QTSð„~æç>})éw%qd™ðý ããsC-¼0ýÈÜt?âZA È/ øŽÀ"fsÉX ×Òäcrl‰×kñzj5ŽX‰-w ô0 ÏP>U{ð U©t ÐôoÕF¿9Ô„7¦Æß„¨hé.í¥¦‚þbÕ‚…p47*p){EU]Qå[ªˆ@6Çæ³ XmÂåÊhÜ4èÆÓ&k±Ê!Vv¬ó©—1Òô®šV~¡æq" }õÊ[fõ»Àƒ’6 Ó9¯›ÏdOý²Éšˆ¯ûÞ,?èÝù°|²ØÍ´–ÖŽÛ¥¬2®ew ìÇݲwÊN\¬~7Ó^‘À²6ö<4@`Y¦É ºWHp§Ndá, ¦¡z•jWÓË­Ëgî糯`z¥릢"ÈB()@§&‚Ÿ:õM?~ê†nÆã³_{øž—Íì»7¿"¹SÌ»$q ±–sÝ=ý_ˆ½6ßø"b Iª8¦ æ!‰3„^&@ Æ€8Ð2] ‰Å…¹õ%2ÚûÌ^oQµL±‰CÞ¯7±Wﯣ`A¶I®Á —ÍKótgfP ïê~@‰ŒXµb)4Ò„¾IL ³ÜACçUÉÇG§ËIÎD#2’bé#Øá2°¤=‡*èQDL©Ö>ÿØŸ]£ÍEOæYì¯À*$èudš‰‡¸›5áU^¶ô~g6Ið?¿˜ï”­Àª› Í©‹_œúÔÝ눵t¬"Ñ‘œäH j8…P1•’ƒÅƒå9KEYþmÞ?±=«‰½¿×Ê\é@¨ŽaÁ'-‹§X,?NðŒñ€¯ŠV a), ]³Ê\ao)1†Àš5]tR­Ð¼^GU¼>ÝûÚU6Í<>u/`LãÉ­m3A/= Àô®Ê§~Y·_À¦^&޾‡Ú¼,,5š–°å( ¬‡]Ê_•q-»e?î”ý¸ Pv⪠,½2ÕqßÈ.ô …œÀ˜AŸ5–ÀrH[ :,ßòâc&kZkÀ~Èjwˆ£ïZ¾ÄM@”Xš¦únÒ¸®›±fXaw@tˆU)N×$ŽU`±€ô»BNø€l0 =E B–Ó ÍIZ˜ `I@Kw` _v[×!°Žø{¨ ×D ÀŒ˜ø¶ãoø•c?øc§Þ3É'4L;-°-Ü–6+¦Mû<ŸÎLx~~¼¤|aælk…°vò9­SËX !,ïf˜&U‘’Ž}ý ,€†+Áʸ«ú§¯v&¹¼ëJ§ñPõ£ þh¹=tù™Ÿ:óÿñ¹OH­KNFíU‰¨Ìô}p±’’¢¸Þƒ•+°¸÷½æ‡N~ ÅŸµ³~ZÙ¥(טP0ÙªÐÆE5Éû:9Ò™;o<ãUx ­v‡7œÛ"[ç>gJˆE¿ƒ\\š«Û8Ÿ:Û©Yˆ»KÉp.Û¸À E9•ŸŸ5b!ŒxAßd‚£ÑžÉÆÑº64íWd"†¥¡kÖìjNŽS`Íú5=Öm¤=\úÅùÑ=šåÆ%’\9OŸÛ#ßú—·*7}¶:C6`!„U’z·šåÐgð©{ÆþÊ÷½`zñÈ®‰ç z,˜âS/ó^öC+¨œú«/Ÿ<°1˜t¶„¨n<€ù&¾n:çQLá\eˆûK»µ a‰%J”(q3Ákw€û¦sÁt//—w^ø›»?º†R¨†X*DHÿ]ÞB˜oaé Ó½„ÙWç›n?gÒEK`Í/î÷M²S uyy IDAT:l‰›€ˆ¼6Lª¶¡Œ•š‡3%gcÜ~/3¸D­uÂ ŘÆPÅCÄB~…Ìë¥Z–ôIX .Œ8€xé –#µÿ`é¦=ÆÀÒŽÀŒæéC ±’ˆÚL2/mðEú¯ûi‚GbÄaakž²á8ºH`Y–0~¿ÁϵoÜ?sàZÜ¢eQIˈuXNvEEÍÖ\r’Ì0CÆÃÑ$£•á2°œ…P¥9¸¾Ôm®N¸…[Vu=é׉–!3e;Ó»rcæL»ÙÞ–(»:×—;Í£µÉÑåŠÂf»3–JY´‰­trMœ7«Ý€ùc—^=OxFa+Ò¾Ôùÿ®›gÄ¡¯æ³¯1‹àwò»³§~0`b… „~“ˆÀâ>øFìðëB©ÀÚq(i«%J”(Qb B±ÿ-€Q—þÇvlÞ$ P=æO2?Ÿ+²A–é]1ñõ,„į-ºý¼žûü²äã¬r0¥‹ðf†‘çINø³.LX½Ã4›bÒ‡PmÓ­A¶^„¶ Y0nõJa"±pÊÈjó‡nü{’íÀzšê^€0VIÑ«{½‰};aCs†@‰KÌpÆ+Xã\Ï5„Ž3_gºyŸÀ¢ÿÚP§HNhªG1kRÃðy^’–À²|P;M™úÔÕ™§ÿÒça™5ÃÕã Wzªb¯ôÆ\Ÿš;÷¡àÿkóÏ1H`ÝÈú„Ú˜¬¨Õ ¹Úù-§ëš¾[0?™†ëµ”ðk¥ ®üjáŽ#1dN¹Fä£Qó‡¯:_… ×dÏ,Vô3zõñß`ükŸpå¥Q—ºM"­±C#¹H\IºÎa+Zj?!ÂìiùÜ¥™'ži÷äDe˜¹°Ñ’b q–ÀšM÷¿-zÍÝÞX~œp<84zff£ 3~*!9Û¤eÃ]Å="¹†p : @ùq#Kxzx¨aö®õ:éŸÇ<¸ì¹Aã“s:|“ðl{6f!ü·'¿õ—Žïñ‰™-iÌÊ0½+Ù—^žýÏêÊÇMïŠû^7ŸÀ&Çû |ê>¦ùŒný2âÈ{Æ¢ýkÚŠW‡Þ¾ÉƬ%µãPÈÀÚU ÖùóçouJlÊ~Ü(ûq ìĵ€ù“âÀÛ#_ø}˜1> Í¼4Ê•V…€*V9È*Lº(Ïü'E¯U°` lÌ“½ëDîL²HÏŽ¦{4ÇÖéräW^‹p5Kžû­ì©ÿW/mYRÆKe3c„Êÿ `7cÕ÷)cxÊ«² Ž–0Nµ´¸ìö±VÑ„Uãa=]³„|±7÷Å©OfÕ€)/‚õ˜5мT pÝΆEXIžœ-Àò ¬¶îÀ:›ê#¶Vâ›b™©a«j+6Ñ|µ^8´€f™f}V%2ù–‹XAA çb¼ˆ2kŠ%M+°¬…0ç>\¤ºd$#Ò¶œÃ†CÜ‘+°òP§º®èXzy̹֒’¶å}(ÃÀãÑ—-]Ã'[—ŠZ׳1–T @ÊcÅS:/û §jÝGJd®g‡!BØ(´\àÄݤ«3éð´_¤_ >9}åš‘<æ9jØÁS E¨W¨è®µÑ$ËœF,ÓúzÜd5n€®‰h‘eöŒu³ŠT<\7“€â @W÷™»X‘JQЦ¸ ¨ ©ç%KÅ[øuSc|gc, ÀÌBÜ1^`*Èé*2ú±,ðÆÉBÎy‚ë+ñlµÍ"œwxtu§ £¤yn‰ãw§ÀÚ¢wÙʯü)°n"Œ|þ÷L÷˜uécökmOà+X¬z^Ý$ ¦w…S+/< ¾÷”ª¾™$,Ó»¦O«ëÀ;ö þËÿw eS¯Àª‡ùž×®%ë&c‡_/E8Þj—)°xà[Ý„[€²wÊ~Ü(;q‡dá¬éœWW?½ðEuù!XSÒ¦ §Œ¦³óÀ»çŸ1R7ŸÑ7>kº—Á¸wê{øÁñU±ûè,ÝKHx•ÿ² ùµ–IM²ÀÈuTÎ*±È D®:7m[ïÍHÜʤW­êlfSe\ÁUátÁ¸è¢j¨ŠÜæIK¨X÷išÉ àÙùçL'éPhz36%2Àµ`l@E% k#Ty”R-u1^ó© ¬š|î¥Õâ´„M2Y lª ç XAåfþŽÀò{2h±œÀR\¢ À×s½6m Ÿ{E—™Ã° k5J´a¹+V\Cóªä8(› >šÕ6ù4¾«ò“Ö´ÕýtØùÐ…G\ø òJVX}Q¸óíC~ —‰®9€&ú /g!üÜ >ÿØ™ÆÜèOfPEqN±%°RrkjN¶µÆ¬†%°&ý>ߤØ0å¾!5™1áõ—¿cñ•oh}Õ¼h®ˆäòUÿ²40dÀL žViäõ¤ T5ºÓcÄ´—*»Xç‡àbÝç’ .HÏk!äÆÀU@ XÌb €(üåq·0O*÷Lîp ìj¯m„„a¶˜ ™øF½"«¸*fÄák/ûQVÄ,§À*Zž 9Y[C`?”ówl‹Bµ¶ zî ¦ý<ó'ý~ Ü× K7Ÿ5Y“Eû– ß´`Ž´âûß¾Þ(+V9äÝõ¿€¦{Ť”ä˳¿)Ÿy?d›Õޱúqx5ÿ¾ï‡¾Æ½6G¾ŽU®¼‘›’ÀÚqØe¼U‰%J”(q+!Bq×7L]ú˜ÉZòìo©‹¢ç¶?oü¥ÑØp+ÎòÃï ®þŒbÑ>ó€8øÎU·F„)ªLÀZ.ýX¦w¥˜F<ÜÂV^ÿ êXãTo·5ò8 ®ÞP,É2Tk¦ù´1«BÓH=¾)ES‘J\õÆa¬yw,¾òÝÝo˜‰*°9Íöú–ÀR>€F:\?.5¤.ô3°2A‰Zà ,n$Z’‰ê²‘¥‹hAV/®‰€âÒÈ‹ Ë·ÜŸiæî^aEd‘¬Ã&ˆwmX;…©Cµ®öÚp¥ô ÆN˜5[ö‹~ˆ;€ŽLpD<Ä ÇBÀ–+´·wÿ· ¿ü¾Ë¿àŠ$ö%ûLâùìš#°æ½k®^€cÒ¦ˆá"˱-ÄNvDÛ-#—!°þdéoª~ô¡¹/9XfÂ:ËX€ kˆe€î«ÀR¶:u>ž0¡¦ß´ïŽ÷ïý‰»_@‹ ¡e!IŠå1o²PMï+'^þOŽåýSǦ)Ä=0…Ë’¢ä¥d @Íä ,Êtפ\XËU6\Jº°2½|yZÒVêäZðT@ hf]X ¡(Ô›ãvx™îñ|¸Ø]ÀeàV>^›} ñ–Wg¯]vEX`‹°*¹"¸q>Á‘w;.QÙAf—,]ÖèêÄïœÂ;˜©0Z]üqìï±h¸yþèù/à{^¿ê6øÔ½À±ÿ-ióøä)À˜æÓY0é>ûjqôl›‚bŽ‹ö¯å@n2vðeñRÅnÍÀ*Q¢D‰%n øÔ},˜„ÎLë9úF]ý}ØhBÀÄsX4üªœOÞ €rUמjÁëw ßi?€Ï¾†S|âÄØå™?ÁüI¨žIÆ6tëlþI—–¿9P×>™~á‡ås¿sKö¾,~·ÁÀ—7fo~eã­''öNó>eSTK­‘ Á<„º&°&“}ï ß@!# IUß{Ç+)éÆwV”X—óóŸþÕsŸ¸Úí×w£*„"·Fº @çÙÒ#Bxz*£4(?©2P9UUԪ ™T_ÍšÝÌv(%GØ|Ÿ*j°– k· ¬>¯z-nÐ|á15ffdFä?+Ãe`H?ŵGŽÎ"Ç‚?ÑÑjóIWVZ:è-ú7蛞Õʵe]e”#¿’Ú|[õ’#‘çýís½w)¸Š;±_ìÖñ•ªlèöèO¤Àò\5LˆS`IÐÜ7€ù¤½w[#ŽÔ"®Èyø^Ü2bf¤ áPVÀĤß>Ÿ j°º0Éø"SHFg†(°b‘Į́%Õ0ÉêD`¥–®ÊB›÷ï» ¬¼I Y×µ')t.Ln]üž ¨ EÖ°…%¸cG–;9®¸œ.À²À„õÉï?ñÎz÷[—[±¢k:Þ€h„ÀrÙUœ(°<«­ã> &Ábäü–+°¦¼1NáÓ½hÒ ÷ð½oÀ}-¼ªn<¥oü­^|`ôýÊ`“÷û¾ޘ𲵀M½ vªªî{'¿›¹ÆcCF¶%µã°[ ¬Ó§Oßê&”Ø”ý¸;Pöã.@Ù‰ëÅ«[BÇt/éæl4Ä]_? «À&°Xå@^Oz5«Ø‰lúÓÍgLïšIðªÞÉïò_ý3âè×/·úhíÂ!8Ö­²ê¹ÏBg‚²ÛEªÈ_ïÍøÇßô¾ïØÕf½"µ¬ýgPnŽóõ Á9ŒÁê;÷¾kÒ«P\æ²”B–M^h pYTB®L?õøÔgεçÝ’äÉÆc ¼5ບ70$qš ‡ ,ÏxÚª®™Š`³x¦DÎ[õh°Í¥,ðG<ç ú3ÛÁc÷¬…p°ÙI™ïXƒUç³6, ãCð±)Ô|}B¡*„]•* lû«(°­Ï.®.Їž qÏâŠZÛU ×׳% g@ä8ÆÍÑvóI—üwäGSaŸÝ.Ê¸Š R•]6†ÀÓ"KaPòzÊ»A€i/Ô€OfŸûñö/þëóàÖþüÜÅŸ;óÑß}á î›E>àN»“S<£ ,«>Ë-„Ì› B˜|§b|¡ KSõÉÚ`i?R ªB‘Me©Þ¦E˜)ò!Ÿ/ôŠ«hf=X–3-ÐaDÞ1-„ö&ª"ÐÖ=8ÖàLœ€ÔaDˆÜÐK(pµkAÍÔ$•€h¤Æ‚è+°F3°¬¤‘ùq/ŒÂ)°¶&ÄýìãOæ ÛÁyÐ6¦ý^Òq3Â;úwÈç*aõ»FŸ FÁÂYíçÞ±áfp[Êp-ö20&[ðÿ³÷æa’\w•è¹KDäZYYKwõV­Þ´uk_-Y6ò†,¼Á30  ðöŒ?}À˜Ç2€0Æö{̘7,fŒ±<ì¶ñXmËF»Z–ZR«÷¥ºkÏ-–{ß¿ˆ›‘™‘YUÝÕ]Y©8_RVdÄÍq#"óž8çüÌÏ•u„”ÀJq‰pÇ] ¤XGHÇq0Žã ÄÙ£0Š$z,?û4V˜¥+‡Õ¹Gíû;½ð” ™GG^5¢Çªx¡Df ±ÂeP^pìKYKt*tVO&¾«½];þ± ,]9B]Ú]ùoë>E¼øŒ¦mç}1ŽÙCæuÁ:Ÿ§Ü[s¥w¹ßÿþŽÄw‹1 aÉr\1%Q Í}¥”ò>¤ÿ2ùßæ} 0R!“3wVšE‹.`R` eS¶=qGg?õâƒÿ:uT›ñH5çG>»è-“VF\Ñ4 !qÅs?€øš6…×Y·B!îaIÇ=çuñü’L©Êxðû‹ô8Yáð¢P¨SÌA@-;  *›š¯§Ž)?õ¸ÿLsG23öÃÂgäJëŒ!SDvH‹ ΋èË Ù"¤æ‘\9ÞrZÒ¡S"ZTxÀ¨U NÇ­æYÍÀÕL£À‹2°æIQÅ‹+°|\ ÀÖöYpRŸ X»…ÀïNüûgî»mÞBË K}çêú”÷Ü«…u} ~Å?ò×H’_Â` &(Ùj™àå}ÔÌSˆ|½‹ÁJêpå( !¬‘+˜úvøJ¹”yS`w–ÁÆL“ÀÊËó³Ê7n¾üΉ‰ïc©@C©” «ûùÄ2dc¶H¯9Ïwtóݸ<‡rйã§Jþ€ÇÁaw ‰(è¥ðd´ ì„Ö¨lÉÀÊJ€æÙÃ=²3QƒÑ̶ÕBhG»3$²T2òå…0My[Måµ/êš>8Á“̘š«J°‘‹¡d`Q4qŸ=ùõÇJ_ÿïõÏw*°æ½ö+“‰^Q DÙa‚xyÄš®ž˜½.Óþ¬Zx5:ÅÑ]€+xpÍBîþ$'¬KyQ%> /SV€g7•\dÙ ¢"ƒÓõjàTY wà én±J*¢´ˆÅ#ñ Õ(`žMg õJ3Eг¶â˜ä+ŒWœô¡ê¢`ƒ3DBeµ¸E#`ª¶ˆXˆû¢ª#:…HªFh³:ÈÜTÞ`&{€Ö –=‡ËÉB¹Ç%ϳ*ö ’Š öÀ¶L3K1ßI`EW“äí_„YiE}³KË2ËCh† pU·!#%™µyd`©™§uõXË"í«…—Ɔö42níýyû¦ß²öý¹a™÷òî-¡‹pþàò7Ñ /ªéÇá΀•X).<úÍúX6™"EŠ)R¬#D%u4Œ­Ï_ÄRtõDpòËôÏîà/êÊzΩ+G°LrÂ:/]-/{Üýc‰»_m~¥ØxçÒ;ÕÓBH?¸yq°F ¬…ƒ@ŸÑ#¨k}¡™¸¤;Ì6+ÇælSs”·Ï‡Àê Θ Ê)EvÂ,)°Dà1€˲q˜Àò›–‹Ë13vž¢ÒoåxÁ;€'•B -„º @(ËÑY–°1ÊÛ³KñMŒKq`bæÊ-3{·çÊá®V«fÊFx "KÕñÚ,éæ ¸æÊWŠXÂͨèf ‘Ã¥èRõÌõ“™'ÎüçÏ·…:5«2 Jm—°(ÙÇçç§•žEt5‰˜ð#ƒö¤ssä©)ª(§˜¢â‰„ê,•ˆ–I=Ÿõ«$ûÊKfNe€d¦Ž,ãž3PZ“€ËP–ÄÃúQdU=R!åX“<Ò–;•˜Ç" À³³§8µa3ꫤ¢®‹GBB؈²Õ8<´y7$Zb†ÂKèt@WÙ}®Ž ¡¸ãœ¨Í!f!¬Ä8и!1R) Š–Ë2çªá ÜÍNõùÙ³!ßiÙë ²Ðz¹9e]^þ†» Íg-…Õ°©ÞОÉ8†À Xa‡ÛŠNÐe¸ZX˜g#&øZ[èÆYÿ…?AP‡òÂÅ—¡\–ÛĬÝèJ+ ® x~ºk±œ}D/¾œ*°R¬>LuàÀµîBŠU@:Žƒté ® ±Z~á¯=o±ìöį\5ýxpôú§gèê JX·êr!s|ëyùšÞjD–`™qf—å®{—cjdÙ €éÚièÁXlèr¬‘K7¦aÂéÝ!°D¤Ð‰g‡Ÿ÷Å8’ÉQhwVI¼Ð*#È|Ë0›¥xϲ)ð óìŒjÎó4i5/¦C"õŠ™¯û£žö^ ½$‹I5V ”}×ð5¯ZxÃ]¥klÈ„3ÀM1=É9SLkÙð3Û¾ç?íyûæ|¸Ž™H3Ýr¥VQ8´ïÓnWå—-xnXsÐË™.Gæp!ºÄá7º¤›ºú—Ÿ·ÿêá³Gã …þÓKàÙCN@ Ý¿8½?tJߨ¨Œ«¢ÚX5åþêÁ¿¹ÿ…ÏWP@ bT\å2"°*1+jÁ¯R4˜!•ìʰ8ˆ„u ™’–Þ|k=J*´!£º&Ý ,žç-¤ÉÑÊl¸³lQ6€Cõ)%oĬi-¥À¢À/ÒþÈÀ`EB[F ,²J;n8õÑ~”<ø]ƒf¹R'uÂ9lð¯‹Ï#4VX €’í$/×â¶ÂU×ÌÝ~}~†«›<9X¸(_–).+ÊãXG˜œ\n%¦ýŒté8ÒA\"ЦÀ2 “ž‘;\Ïœ1€©shw&8÷h¬Ù¥SZ{ sùÈõ|ø´z©º‚Û,3¦ëSº~†ì„-¯À‡ö`j€¾¤¿,ü ” ™cÙM˜?HdÖ@˜_α™ð…\ŒÒÍùÙœOÖr@©@,hòPäýÑÜ£Y½#°Þ½ýúwãúøæTŽ`BšÐT` ²½³˜°ÕÛÑÙ KK ^ ëÖñm·Ž‡IÕ)¯Ÿ»SAmŸìÜ¥àžL«âÃ8ËÚXTÀ°“ã® €Ù @*Ë ¤–nÅwI‹” ŠUœ¢2s³e ÑmÂì*µÛh8ZŸšÕBÛBÜ)Ñ܆]²2h@IoZœ ×äA ªÚ…Nózñxù¥ÙË8*[‰•/dJhPZ“£ª#òq…—®‘\ÈX£þDU9þÚ°è¹&'ëdu~Ènò&0£½yÐ –*R`¹:S² [¬ãµÙ½åêb@À‚©zå›S‡žógÍûj7 ¡Žv_…§±D”åDú>’²™¸"EX†ËçïÕZÿ¿Þ_*»tÐ|szLs7ks.:æÈLYw–öþ)ž8œy^á-Íœ/^îÐÒUZYLbü®M»ïÂnZy'ß6—^Žjh º~–áX¥ÅÝ…ËßP2fÕJ^~ÀlW`Y‘10QñÄ”ÔÜÍÈ–*„9«E1ʴЀd«s›œœ”Ó¶ßr¿V ¥’š~œþTÓO`ÎÈ…„¯¯"XvSóQÖ2$`jöYe‡9ô© Àc=vß}÷ 'þAT’x. ¦fŸiY’Xžyæ™ûï¿ïÞ½o}úÓŸ¾í¶Û>ò‘”Ëår¹ü‘|äÖ[oýÌg>³ê}X׈ÙÖ²)R¤H‘"Å \„á­í-š¯ÚÎϺ~Z±Ì¸!•¸!° “|ô&挬ù£K^¾Flz…mQJ ÕÙ‡© Ëo™€à’>/4 ,æ”hw@,„TMo÷Ü »‡VçÙ{^È‹G`i€#°¸™Õ“f§gõÃ-NÙY箃X 8";¡Å]AZÃ®ŽØå^‘ØŽÍ%C3Ý2;Ï£yr§BÍÌü¹j™â† ,Å‹–MGµÂ*$lòi.*—Ìw#²@Y EΖŒŒc¼5É«‘TžÏd·SU¸NÐM…r‘ÈÛHeòÀ4ó-á¶p:ASÑÓBH.× Ùg’ùäy€†mh¨^^–9Ð \ù±|w‚ ƪŠEL ŠåfJ\7ºI„ ¬„Ýœ‰7ϵo ¯˜+gYP\ó€(?’hqˆR«êgVÏ8^‹ö+¨+@¹²õ÷·àòḅ°9ôq¯¢Žb³ÈþIäÔF6î,Œo‰‡Ci@IQù ÔÈ™n8UD.Ùa!$.øUCW8ek–A”õzД¼Í7B‹f[;’1Ú rŒ®Te¬BcÅ÷Ÿ n2ÔA`9ÑA¶’˜²“ÉäˆA&F©³X'9yW+ €ÍHÕ–ÖîÀäî›^2Ϭ¡¥¶º¤ˆb°–ÎqWÓOBy¬°=Šéí9ôë—T˜÷¥/}éÞ{ï/¹÷Þ{¿øÅ/^Ê>ô?­—€ýû÷¯uR¬Òq ¤ã8HqÅ µ?=5¥)¡ÇC#ú-Ï–b¹mô›å'Á¤Øö}¨–¾ðAdùI±í1ñzº1@/ö_úÓàøß๭˜ÌãÒç¸ce„|PªJHÑÈýÄö×Å^È8–xW+‹œ8Rµæ7D`Ѭ¾×Gß9±óã;Þ¿£²1™¯ÙÜLB­qåÁïÍñßÝξ+¹4C&žhùV¤‡êT¨™™?o˪ˆû6R`Õy€ [h  xäË ›y6¸š­WIÎãièáµLòݤ÷ŠX~f!.ÑjËÀ‚åÈq*î»ps¢uÐM¦Uƒ7Xµ«^ ìMÖÌP< šEgL°¸ ²¯ÒZ1Çœg‡Öd~tÃÌž­sW;\r&I»¹è7X‡Ô‘ß{áË~øÑoœy€KÁÖ2" çÝ"Û)ׂì“ìJÀ"[@TθOVgH;.ê bV¤À""‰ ~`×ßüêÞq‹YØ"R„e"‹ê¼Ç#ðÃ6y ƒ ’¬‹B[&2CÑ"Ÿ¦¶\s&˜ó# S¥‚¦(L¬pÒgsNŽÑ X±øw2; €ù–ìµ9ÆB¸aD×Sí«±U qß¿?q‘crí¹í-@9ˆ„¼>ËnÆòXjú1büv–Û€Ù¥õhúº¤!îÏ<óÌu×]_ríµ×>ûì³—²ýOƒ×5î¸ã޵îBŠU@:Žƒté ®bìV–Ù@Eñ˜UС«ëw-¥n G/ïÓî,/îÀGn¸À.­Ú fÆèúYÄ‚f2n®ò/Š+8õ5ø‹bâ®PçA7ÈBXfÖ˜ÐÞ´vIv^ X·û¯²[f22ŽeY@$ª|vk¸2W2€«‰À’K4Mk‰Àúß§^ü þ9]ƒ‡èúÑ€ÖžÝM]÷™œõ%!"‹ëö)·ñµU!ÌK:Ùˆ¢©Ãp(fIm¨°“ÂÏø–{ºVWÐÌæÜŠšµ‚Lrc¼ ãB»sÁ‘¿À²›øèM­oMƒ ›Œ3»¤ÓÚ½À¢ý€«²“oÝrõ*6øæW]¾¸qÓ¦‹eH¡Xk[·L,ãŠ|O !T$”{5å.è\(~±XS¥HvÔ¥;Æ]‰\—µ:>×(°:ª4~·jvvǯ=uG‰ç±!¾Uà0›XÂzà«05IX¬Ÿ?ݘ‡ŒB|¢~:*KŒ/ó--=7²~{öÅç‡f®ó^uÛbLwóRe*F`E‡‚‡¤¬1‘ @Nå)ÜÝ@›Trá¸cÃαLþÁÓ/=ÔqXÊNd'Ô­ƒkqÉ Ö‘:ßtÌ1Q[8ÄI!î• €¹Ž¶ˆ€ŠîQ1ʶ2Ø* ^‘Nh!9§#¹Kn=g}gÀY¿iH¬¨PÓ×öéqê“M6Ê(°thÿLžÒ6OuÍšáåD`u(°TySv°í–¶ ;9T ¤ÇÈ6¨8¸šªÏ#Rì-­VF‚52–Ê•‡”¿A¿îÌÜÜmj}öÆX&ÿó{Þœø–Ѧ-™ÂN‡¥-™Àoìþá•ög½@‡V%^u‚9cà¶nÌÀ¯¶=LŠCM?­xy/D–ïƒ;Æ®¼”ý\-ôE¶ÿrÀ’pÿý÷ÇeÛ˜›3eZÝñ×sssH|«Z˜Ÿ7gëy/ÒÒÒÒÒÒú¶…fVôn£Q÷ÎÿÎjož¶" ácÏžHl¡ö"ö£8ùÅcjw†Ùe>|õ7Ÿ @y@2@Í<} 8ùåUìƒ^|‘–¨¹ï´µ@Xß~ü Ø#<òµ‹.z Ã/Ϙ4ñUéÃñƒ/Þ4¶us~è"íÅ„qÆ7ÉÑø[ÌoNªýJuɽ YëìÂ,€… ™ˆd3IÇâÔéÓÆ7—Ø‚£!.ËŽ/s/H3…KÕ|Ëd`1oak~è¾]¯Ý~¼¨Ü¡¶\n[Ÿ:JÙçÌÎ4æ 0Š®…Z ÃZ¬…\òÄi»ñ•“ÏÕ‚&u¬1ý?~û'~ë#/ümY¯×B –ôpO°¢û¼.š½#(ÌÍÍ=ùÔSÊr¡Ù°“Û¿F$Ћ£V€æq^þb“«ÒnX×v}Ý—± I6îß¿_€ð´ê‹JÐm„øÝó×Ð\}ýÁ]M ,ÿ ’çTü"O"'ÙŽgØÌ‡¸çháOÕ+Ç监=§ç¦ÐÅûWB±8oÂtCùû÷ï×,Vâe´{ÜÍÚœ8pàe`™-,ãÅÚk§·H]hsÎ ®HÈ&9gcÑ`:.~1"ÌtQÐ>Æ+ººß>yÍûwÝ1{èè*Þåœè4¼½?m-Ì›At=öù½zµZ „.²}½O?£œ @«êñ-¸gþ¹/_ó­©kŦ».¼÷ß"Qƒ‹¦;BþV°q¬gí0ÖÞøÆŸzê©7š%§Nºá†Nž\"r¬³©ÆgÿyæÉë>ôŒo,Ë%×_/Ø¿jx¤ã8HÇqâ… 8õ/Á‘/ˆ‰×=ÙxËÿøÊ,€zÕÜ5?4³Šr÷ûXn‹ûè‡À¥}Óoá¢Uò^ÅAô~FÍ<Åœݘß-&ßaÞÒ /ªÙg ƒàÔ×À-ûú_éñ„vEÿÏàô×0»d]ÿ+MýrÝG~ܲoþm€ù/NÙ/&ß!&¾{U>·ß°î.ÆÿpèSõâ¦ømøå%×ÿô‹ßx´ôµí³×ýòî»ÿà…yzø›´ü-µïËž¾ìYxÓÍ…çü§ÕÿÏ7—¯ÙÑ àŸŽ?÷×Îÿ¤×÷ç>8‘+,§Ÿ=ø¹3åƒrógçÇßúë#OýSîKFfv~lÏ&nþÛÿá…ò£ôúÎÊ›_vO)?uËüëžÆ¿Õ†Nÿˆþwÿ0ûðéòs×ͽæÉÒƒÜÍ|bóÏòÅŸ(}À®™›^,? ÀYo§ÞÙx÷›¶\ÀìþÄÌ•w®ûœõ—Ôþ晽ìCåÇE=ÿÑüÏüæ_Nm,Ëvgÿáá…ÚëPå³?ªßû]ã“¿zð‹ÇËO¸vîŽÓêÌéòó¦·¢–ÿÃmÿáLmñ£•sÏùĦ_ðìÌ™ß>ß)æ[.¼ÿ?×ÿPÔóв•«g_õìp¨Óº§þŽôö7ŠS?¦ï½µµ¤tBvaÃïîhêIÿËÁ³þ/¾øßJÇßå~ÿ7_þ'‡úvñ«[göýÇ=ß7Û¨Wo,“ÿÐáÿ§^H[m™Ùw¼üôU³ßõÁÝoˆúÓ3§ÿ ë}Ù‹e·ÐLÓûÍ¡_²Ÿ:óëàêw‡?DÁ¶‹ñç}ºV< ³0þ{;ÞO ?øò'…s¼‘WNÈK2Ï&¢ÀªßûîÉë?wøñ¯æÿ.Þ“]37þâž·øéã¿KqïróÕ¡SWÍ~׿ ›–˜cøÿîPùñæïüɯé6÷ñ÷];2µÆþÓ‡þ?ñg>œ¹o²ÐKjôß}ë[ů ÍnûÍÝ÷öXíBûÓOwÔàè—‚“ÿ,¶~¯Øœ¬_ëø/ÿ•:ó`ïïY÷Ñ!¨Û7þz,p‘qñœ úM¦cXÎú{÷î}òÉ'ãKžzê©«¯^M%ö€­Ã(µå îD).é8Òq¤ƒx!è¬B¸Ýû;@3kH{ Á©¯èú)@³Ì†‹Ç^aU‘X¤{jsó±â.±í1ù^ºÊ ¦¾¹Zª^Ƶ;G‘aS‚(-¾ìIëëîb4Ör=5ÿÐ*8õ5ÿ¹?`Qß–] )Å¥‚xGu¿DP2TÀ|5VpµÜýÆM—ÇÃìuOË‘áeë+ˆ’1Vç„Ù8³xGÝ:;–Ÿ6ñYžöÈtfqI,Õ"1&q)ÇíOŽ}ä“c!šÉ‹Êóù“¥-÷„7  TÙ ÅëùéJn ˜~©rÀñ›ÿæóÛ?lðŸøÄ'¾õ­oýñÿñ¥ìCÿ£I`­i7R¤H‘"EŠAE¨Àò™ÅlÏÀÇ_ŲYv“® N~Þ·¶ý\2c˜5$'ßÙm^ºŠÙ%Ý8§+GX~ûù}Ž®žPsÏ"”YiV˜äÃ{Õ¹ÇôÂ!]>çüŒ®À2ã|ü6Ú„å6L×NA«‹ªhK±L>(žæÞ2&Ï©£`H†³z*™­44Þå×k.šü+¨!`è ÑÁRµe`%"¼•“6ñY íQz·ÃEgÔxÑ¡p"ºÁ0YBS8TD`Å’¿çÔ€¬Î6*cµâãA;^›ƵÕî3¡t”“Mµlt†ìŠQôXÕ"˜jXû2°ÃŠ{\iXMÑ!USí!îùôòm·”·eÇÛ…NÑ+t ÁêrÜy—ó¦¢e#JŒj(Ÿè¼6^Ɇ€ª ÆX׎LÈ#%?7`raï)y¼áT¼Ö!#8¼+ÕPAxºî<¬!×J¼9oçš!–šV«de;x`kß×ÒËðˆåQ6åÀ1%X¢Yãµú±ê¼÷¢öb‘ ü‰íïî™oÅøÈ Ô¹ÇÏûƒÔôãÁÑ‚£¨3ûðâ.–™ Szî;ºzœ9#òò÷[×þGJŠ‘eö0”«gÏûsûëîb”Ѭž/ÓBH ,(o(YÑiF?Võ ,+*s¶.¿ŸÆÆ%;,„F ÓÉmk6‘#B–-$íEÃZDTθÍGs&•ÛC«Én‘-°`mð[¤š§üiÕ E E€È¥Uˆì~›rE£èAûlÓÌJËXØÈý'•E\˜fŠv¤(²fC‡ ’;5T»…X; #Ù["¢*„AGa¾§¦OyÌPÎk'v…ÇDK5ß÷”B¤ÞjvÄ ¹ˆ*WÊÝöÆnLñÚx;éYá˜&¨MˆçA#ðÐÁÞv1Îk¬eÞ΀°#*TJ–ƒ•Ƶ` õÍŽ¼Ÿ,sx¢Žˆu¹{¢6  Pûá·ÄUŠ„¸©Ðî+k,„ýÑŸµ½£ªÅuí´®¡?)ÄÙý®À“,;­º‰µ·€Ù«âí¥Ä꟦: æÝË.»ì _øÂüüüüüü¾ð…íÛÏóàc°h«&Ž9²Ö]H± HÇq0Žã Ä A,K˜ÈœÀ²›°ÒU´Þ›üsõ°ŠƒÈì2½‰Ü|=X3Oœ·‹P×Nà#׋Mo›ÞÀGnd™qº~V×OàîàÃûÚ~ÎsÅ.B¿ºô:}€uw1šúwB'p ¶ˆØ š«—íðñsÄ_-A`ÒdÒ[~? $;,#&TKt#™˜…°(RÐxð4×.Ê2€¹©*ŸiÖi*°$bÞ:bd5±À†µÇÙBKÈ 8ƒYt@„µéäI-¥øh&o=B[P-3²ŒnºYD2Zõ!lÉ94Wd9$Ë[xX¤E¾ËY¿òÂܹSÕfu<Òe’Ø+Dж¶ ¬9·ñ™…/x¬  ›ŸB¬$+°ˆÓ¡ä,?IàÕ¥+LÌ]±½X¦ÍÙ`‹+¦É­‚A/ðOÕ¿Ù·¶‹Ñkã1¢-ÿ ­¹T%; ÀŽ(WX·+ÕgèE®¤Ãl¾UÀYs§¼y9•œõÆ[XË’@^l§ªÙëµÅßQÝ9ºv ü*” ‘H¨MÑo ahçï)°ÂBØ]¸ À¢œ…å‚)ZˆX‘ 9ˆ1ÍÛ¼œYÄ ¬pµ¼; À!öD75D¥•á’rП~ÛûäïøR³Q ;ïðèB !Z,„sü 7?]+L(ʦ’ˆ w5íS4X?U–sOœ;ëC!)ÈüUãÛE½ðc¯At6jé!vØ ì¸…°u¬ëÚ±2 à6í]m£ˆ¸ªM™&Õit•*â:/؇‰Ÿ” Žšɲ±o~€/Óþ€!–ÌÄOf«?OyiÍî›ÝÕ' ¬µ¼£jEYQD`éÆ9Äòû¼t€àØß«³ÿÚùn¨À’ƒ Àê ž5E†·,þ*EŠ)R¤è#ð±[‚“_®}cCfcºÆÇ34;â/îR /]lêô' IDATÿàêC´{U’ÀøÈõÁ© N~%\ÔÅÖ»é¥öÔÙoࣷ$;&‚†nLƒ…d_Î8¼â¶X6¡`¹MX!ÿ½ø’š?ÈËí!2).&Xz¹ ,&•±ÓVÀh6´š*„½ ’,§47é3oçŽY»*°$—$"jƒ\,@ª`9a˜¯¹`s9æä‰üH•cèÃd‘ý-0 ,æl­(» ÀáÖöbyäôNŸ¹·e¯þ_8è忥9ø¤® ™Åö•'Þtæm¤™Êšªvš3%4š©U9Þtr%À|;¯ ³‘¾‰)A{ÅsÒ2›:BZZð2®hò¿ÄÓ92™²”\P­!îãI³aÑnW`¹O´6ô‡·ßòô‹ç†_þ¯³ŸÇ$ն㌽¿åªò8Œ?”iÄlz¶l½Œe·i¸Ê?æN!‡1Ýõ¤Ñ©¾µÐKeZæ¾ÅÃÏ c¡„¶>¸ñíŽ##á9Ÿ‰’ø™’Yò„Òäj€/Ü9w@Y,M`-YõïÒ€3ök»—~þñJ€ö È9Ô#kw­5½Q¸ÓÁÑüCnܱ *²‚+%°ú)m•"EŠ)R\lð w§¾V¬?¹«XPçæ-VºŠ‹ÌÅö®ø†Wƒ º1­¦Ó•£áÊó~J/ +GåîíÜV×Nše7¶e±³Ì˜^| ˜`I1’eéú™evR/¼œü'zþyÄ,5ÿ¶ûÔ}ÿÍ< ³í„Ì%»ÕX&ÿÎÉk£îE¤YÁ®ŒHeo]DBIàž½ÏÙ½7»SœC¦Dœ§ËA¬Ÿ–."¿'¥õ ¬VžÀ£gÕ‹SæÏáË„¸èpqrÆ><ùî_šþ¸›Ÿ©¹#èBÓ¼qóåÑî7o&G@qê¼1ú1ÏÖNÍUÁ”>`³ÝÕ—Jäóìb¬ž#ëP홊<Ê#3áñĶÂp|eSJRh‘‹c%]šSz¤òsŠ5-„ÿ0óX|…a») #ÓŸ§|O+²c:Y²:I¼†HÞÕ ñ„þÎwÄS†ÀUÁ‚5 `GnܬÜv1ÒðY–ŠaL·Ÿ¦†À’–D{—òQ¿TV.– Ÿa¶]+éJñ€™äØo+ÆÆZ"‰'` ï¨Ù¾® ¬ +l *‡ÕÌ“þ b„Ïiˆ{Š‹ˆfÖšvcÕqÇw¬uR¬Òq ¤ã8HñÂ!6¿IC8ÜE›+»‰ïë¾Ýªam‘ÙeÈüŠnLëêq5ýDF^þ±ù‚#Ÿ‡Vjê›Ts08ú€:÷¨®žD”vßÒ”XIþA9ˆ,‚üÊ’Ó•ãº1Íœ1G×NÓŒB/ò~ ÊUÓç_Bñ"aÝ]ŒVwk^"Hޤ˜šnTXA,¡©ÕB¸ÚV”_Þ¡2åÛD÷¹ŒQÇP¶z^:ˆÂ™ ·Ïy!˵32ÑÙ­ ,“nN>ʼnX&Û›q‹Ti†þÔvQhT²‘rJ‚³h…™öâì$;’A‹A˜©(oD ɹɀÏJ+^{Q[®¯5€z@Ñ]Ý ,ÎËÀZôÜc…çŒÌîÀOG¢ÝqU@Š­DQ(€/ëˆØ±nˆ×Ìu„¸0{g¨.ªÛØ<77 àÊ¡æm§íb$r-´¨NxÇ9cGvN†e´`V‡Í6…Ž È|L2&!ŠÞ: ·ä–A`õ‡…°ß°†wTí’‹ÐõSXWBÏOPg¾¡Ý95ÿù?AÕ§ ‹0p}!%°úfHL•"EŠ)RôX~rzè­ô:®Àð 1©Ñ/]]9¢Î=оÊnw1gTWO¨©‡ÔÌDѰzñðÒ ¬¤÷ð-g92zƒDa¬¸‹wƒ\„Êóžû$‚5û ”·D)zÂTv³:2³AjŃ9¯@^*++zX#.£;‹È®,Óš  Iå”TèZÈDQ¹(z‰,¯©ÀR ¬I3åX • h!°Z,„q–ÐÂ$ymÈ´|¨d¤£ZŠ ±ˆ3¢–ÃJ…ŠKÆZrЙ>[«h¦ºÎû(+Š*xiaZ[®U-½gä»…ñMó—·t €«=²&:é˜û¢$þ±µµæ»Y™°¦9z†î±À1÷¬æ¨†®âˆ\+´d"sÐdtœ›äi‡«¤“Zb ú“0õ™Oä’½ZÍH{ͺYnS¬Ü9,¿€®Z_XF_ëTE‘ñ°fËÑà/`©…0ÅÅÀ *°R¤H‘"EŠ~Ã|þ5OÏ^Y2O~Z>Ø`ùm ¬Gˆ±›€[bÛ=üc«ëSÌ*Š?@UލÊ1D%[ÚÉDÓ¶ì’ÖÒ.BMV~’ ]@Í?§«GÔXv#ËO"hô¡‹p}ÁŽ(K/S%h¦æ¼*G'ða$Ó*õ` }v§… a×¹LÞjV‹P²* ¥ ·ã!Å!âŸh2°ˆn0éæšûJ¼I`eZECEÅÀ‚E ¬ŠÇ¤2qR`1ÏÎt08!…6VD`i†Èfåз´pέpY»wèv³4ˆÀ¹vdâã;ÞÿÑ=Ll—×S%• °êìî6O´Ö(ÌË„äÁ¦…0: lØNá4€\}¸sƒ[‡ö왹ùÖÜU‰ ËÖí ,»ƒä-ʈÀ‚,ÆX[íP &Ü\·óÒ6OG:œŒ)Ö¤ÀâCWÐÕº1 °uF`å¶À˜Äw¾Wlz#½%|O8Ë+öÒïH ¬þƒ¹› +àÀµîBŠU@:Žƒté ® cŸ?üÖ§g/_“ÇFk>ˆD`Siw–9£¬p-çåë˜3>°ÞÇì³Ëjj¬°ƒÙ3F‘…,h¯Nÿ¬0kiXr#€~s®ù8®F]Ò99Oq"šûóA @FÇX €ÖZkmþ\-d… $ê(Ngªvrä­_؈“ƒf”¼Î¢ ©ÍN™^øuñ ,Ùb!ô©"0`8¦bȶr.%ª=ç4èOâËxQhÈA4œð˜AÊüΠå-Q0ÄÅ„üW Ð#5ÝXÐ$7ÍO!§d¤Àªú."ªdås…¸')°ˆwƒ°TVÜR—íqGl°$­©™­söYåÖ„mãk6îüù=oþž-WÆv…LT²#…6çD0u^#¥HueÁ*ZÍ ,‹É=…ðè¸]u.FNØc8^áXË;ª7 € íaÖvg¡}fÖYE&B•´Ìñ‘ëŶ·Éíï¢_8ƒ!¿BJ`õ!Œ®u è+`rrr­»bŽã` Ç@:ˆ«ÎX=pþæÈ÷¬É3£5D"°(—ŠÞ«#ÃùÆ×ÒK^¾Q.,ÀääÛ›²¯û¨}ãÿm(°¤5FÀ]J¥\]?M?ÁYn³‡µ;§ÎìÀ —ñ‘ë¦fŸ–hçbÍÇq¥0O˵ €æjQÕäМ´_T ¡ID²;3°D‹Å/’1ŠO’€3Æýh")°&s¡xб2ˆén “Bö· U5f7XùÖ ¬ÙâVƒí"V>/Ž‚ÝŒR"X<Þ€,l9Öj!4–âI«´DŒõ#̸U  wˆ{¨À"!jA†„ê1Vžò‰ð²’8D;¶mçðÅ! ¥™“H` !ô'I±¼ì<€M²…ÀZÞÅØ™%‰®Ê°˜>EqN‡}µdKíæú—W ÑVä$MD“Àê>¯p¬á•"™=ÂG® ­+ùå·५Ú*2DzÀ€`ËËnLq)Ñ´ƒU*½Ýƒ‡té8ÒA\ÐWm Åš|ç®ù 2»,/{nœÕ³œüƒÄø«‚ãh’A±üvL?ÁG®g…Ém‰®14ág-O¥+Ç Ëm¥2^¾68ýõ0ˆ¤°ƒ9#,»A×NëêqJúè¬ù8®fNÞ99OD†Jþñ JX.ZÂŒ´à‰V”)ÞƒÀÀ©¹+#_÷me5õì,Ž`ˆ²ØmÎ?Vø¹xûdp3Ò$Í€q§1Z(X-œËxÛÑn Øêܦ¸æJ‚“Ñ ²«ýûËÞ|ªúêÑm-áî<²ÝQ9X\qtXçü*¢*„¢»äG†…&#Và!)¿œ@ÎSAÐ]e¡É£u–)l]³Iè$®gäf¡Ù0¡i‘i#­¢’å\Œ¢ƒq“L0Í5 ²1‹+©D`w¨ÿ†í,ª`1K2Æ©…À†t¸´j%/?CNÒD4OæÔBØkxG% !³K¬|=N?*­»Þ /û~l»±Û;+îÔµ“ƒQ‚)Õ‡0Þ*EŠ)R¤è¬®õioxuò"#ÆoÓîlH$¶Lˆmo;ïZ:K¹ÞS¿ f!Š¡ÀG®Ndž’¶Xa§®V /‰¾!°ÖœÈã,WE Š€‚¸D!î¹Hf•I,ª 8¸êa!À;°\C‘ÈÀñ±€ˆëP°lÑÈNÕa#™)°”ËóÅ3âä°È©Ø\®ÕB¸);Ù ›ë³.YcÌ·´ÝL#“Õ ¬‚eï.µk@šqìZ Rx‘¢'×z¬æU€«}°^X—Pͨ¯šrÑJBÅÚ*µO´DÑŽm›½æ›Vd0 £è;À#ú¬¯\I‹Í±Zo°æHr%ÀƒoW`už{)™šd~dX\(zåǐɮÉ\ÍS a¿Á¯B¹D†wAà/Ò7×úƒhaÃÅø«Yv3Ïo]«î¬.R«ï0 X)R¤H‘"Eß!-œÒ|ãkõâËôšå¶‰‰×^ȳè˜KÇ·öæƒc h>zÙ7•GÀ ;™UÔÞ/ì ­xa‡šzH/¾¼néO êÐ 2›ŽpÙˆPèÌ–JgŒ´B5^0$š”A“À¢?WµŸy;"Úº§Ó\‰ž"2®D#S¬À©‡ýl2 ™F©âTe— q ‡RÜXYiqßVv@A¶„"oΗ0×ÞH·Æ™’@C@D«À–ËÅQ½ÚBDôd„˜¿¶¢jÜÀ‡L¨¾×ì!ã4yººvÑJBµ®,xÚ'ÂËN"°œXqFÙÓBhc KñKÉÜØì®œÎÇ)³Q»«Ö©X‡"L2É×@žÇÈÙ.æÛÚ®‘€‘’ŽqÛýƒÐýNiXiV¿AUÃÔd\ly S¼|íwk5ÀòÛ% Ò+§ï0¨Âýû÷¯uR¬Òq ¤ã8HqU°¶ß¹}>ˆÌå£7†Gl½û‚šÈ”«½Åøb];¥¦RSßRSà#7Šíïf¥+¢Np>~;+îâ#ׇ Š;è…—–ó™î“÷»ý’^Ž0Sh§§4¦J¨‹ €’•`!TAåð0™(—¤#~!1€É€¼u6L¹žˆ—,% ³´À@UÎÿ÷Cß~ôìqð@F î; x[ÝÀ¢e3¿÷‘IBDÕ-&2È2ßâË%°ŒkH «¢ ­¼ÕÒŸ*#V€(|=vTh’þl(@¦‹@¬|> ÈY™h!Œ‹ûìž!î&ÎŒwÉŒ7lÝ–lù×v¿çÃ{Þ&c¬åD¶…ÀZÎÅØY¹Ò₎d^6 ,ŠÞO$y)LòÝEеÔ@" Û)KAX«;ªžyÞKН“ïì¯z ƒTÕw0.†»«ÝqÇkÝ…«€té8ÒA\¬-µ1v\–——Ô«-gTûU4¦aÅbkÜYú¿:÷8>v‹™?ÄַƧ¿,3ά¢öæuã\ïêæÚ›‡_ k§Xa'üŠìïxé ^Ü ¹bÛQ¬‡qlAVX$ÒYæ”íTž¬(Æ4Gµ !(ÄJz¶Hê§X*‹k 15Xq-ÒOoû†ïº1! ‘¼ÈÍÏ<„/™Ù§Ë €Ã¥8~×›lä<鯗ˆ..¢lć÷Ü ¬€ 6‘;䑤2–FÞÈ+§RC€°šÉYpx+¥]´ª¨â ©‘¯}Å4ZËdb…ÛˆëSæOtQ`™n›¨Âæ +>Üjù\ÎÅØy–JÆé /ŠX– ‹¥2°}€â±DÄ»Ù=¹TƒL3´>Õ‘$cî¨ZM? €—¯_‹OO±¤WNßaÀ„W)R¤H‘"EßbP+ÿö'Xf];_¨# Ð`œw-Ù É/)ÂÒµÓÑ‹SÔüóễþÁϸxÉ,ùÁ†)±—89O¥8vÀÕ5°Õ¯#áæ˜g·©ŠÂÏR €ä½æ2R‘ˆ&$S²ˆ ÿÅ$Qã™üX&owi'ž_g5DN7؈DOmpü|ÛÙ…À¢4t«§@)1NG ªTHr³\T…0W/py € ¿[oÞ´†¸»ðÐ="LA¤À²’8Ä8åôV`q£ÀZ"‹£5Í^æ<¦²Þ=›ËRcƒ³0¾1ÛäÖ¿[Üñª…7ì)nèlÁR6"…š)XB±™h€R a_A/¼¤½y挱²Ú *RVß!–•þœN‘"EŠ)."նߟ`ÙMèE`å¶.YÍ+ìÀÌSjñ»%\¤<(ÜBLRD¼•y¡æ¾L@jö±ñ5¶7ë&+»lW\[^²c6+êℸøƒÉŸéöåXÉžÂ@ ‡2V¸\”pÄ—=ŠÛ߬àÀYè¢ÀÊ«ü"Àæ‚¡;%´¥DdÉFÓ"wˆÀ¢ÊX4Óe5ºˆ$šó”€wÚMe5~öð'r^)1ª¥ F¥‰ÀJXecÛövª ïâp4¼•äí ,á/}»Hj0:š!‘ñ0»*†·o½¦[ ?7ñΪïMl*"V«Ñéõe‘’ô="ÉR\z¨™'¯zŠ~FJýöõÇôºKˆH‘ˆté8ÒA\ľs×àK÷•6ˆ,·bÚ³¬vò“tåˆYû[÷±_òÿU|µu€žñVzö™óÙ.Xwã˜\fY™ÌPt"°]r.QÂåt©›rŠp•صefïåùMôg'(°ÝÑŠ±®¬`Z ŠÓI±M¿éIL4Ù(©’¬KbņV£À".& cÀ£#³¬O-™%€i/?³?éÁcNòÊL BV’31·öqœwB'Ó©f°ŒÚÎ JÆo?t+ÊÀbAø‰‰"²ØœÚ]-X6bQ÷Ùå%Ê™ÕxªÀê‚5¹£ªÙgðrWÖ2Eÿ U`õ•ÀZw )‘Žã` Ç@:ˆ«‚µ­BøJD–Ý @WOÄ’Kl{y6´{9íðü$Àtõx¨ºTå]ŸjY¯Xîœ^<¬ÓÌ*òMo NýoµpÊ_.}Óënó‘×)³| ¡yæˆD¥ …¸óKx!Ñü_ö´§Ý»ã»â"ªˆw\ñÝ1Ã%Â`(¢(<žÜˆ‰œK‰X^Η5Zbu™p}xÏÛzt¾„!°4GD`™¨xH-ü­™‘G5Ó–ë+åé ¾U'ìù¢¤ëñ:bnÄö•¹p_A¡‹+N`9=3°Œó.‘‹wÛd`¾ÉQíÉe+ÊÀbÔÂÓ2©Ìå2a aÏÝ4h^t)Õ—þŽªgu} 2ÇòÛ/ñG§8¤WNßa°h«)R¤H‘¢³í¯e7^!`N"£½yø³,>vßðj ÉZÂaÙ è â´®€ÆÙøZ¤ÀbV@pú_°¡+˜Ud…I(OÍ?¿*;µ!yY_^j¢|%Dõ× b ¬‹âÞï/½ãÇõ½û†'–¿‰IïêT`uCœQv‘¾‰Üˆ2)¶i³3,kÅwÜ‹Þ>Çó@SŇIÄ¢âÉØ8j¸ç8S¯øÚG÷,y´ Ù˜®Ë byðm À,Ÿ2³œ$ùR<é¿·…ቮ–E$cçSÁx™f¡Žoyùë‰p°2:8ºñtÞ7P³ÿ€] 8R\2¤ ¬¾Ã V!L‘"EŠ)ú ƒªzîW0–ݤ©ê‰Ð-¨<ø0Á¬ÂÊ*l×µ“ªrX¶ëÚ ÚoêªüŠö 6t¥>÷pX^ªt%^Ú,V³Ïòá}«½ƒë7,Þh5<œ\z¯&H[‰ñW—{ËWºII†ûÛ£_âäÄ×ðÀrÐEu÷Ö}wc€Ÿ>û|D¥ W2â>h\~hòÖÐ7ÆÂ¡ùAëžšë]5¾QžÈ¹výhe†X²7c¢8eœð3‹ò]X†¸+d’"/o9ðÂf{do4n%y%íld!4 ¬hP ¸@‹“Z­·Ž¯72<¤êœåX—”½Åuú­Ó/Ðsÿ€—®Z뎤XR–±ï0¨?¦çææÖº )Vé8Òq¤ƒ¸*h>4Z‹ïÜWà F1X¡‹P{s€föðJÛñ0ë0]5aXZ7Î…¯j§°ÌF–Û:lè ¬¸êg.tg"¬Çqüɯ¹o×k3ËvN™¼žv €ŽËûü·kÙ ¬N3]·AÌt¨‡¨ ãµÅm—ÏÞr{æÚgôYÖòâ½—¦«@FJÊc"Ü1±ã›//Zö°;à;‹'|"°z Áâ1gZøò²K— 4Wh͹70ýY²ÖžqÞÉ.–aM– Õí—s1ÆBÜùûì÷ü¸¾wK¾´äVÝ`Jd—­g¤CV!ì†K}GU®Z80–Xëé•Ó¿èó+Å‘#G–^)Eß#ÇÁ@:Ž€tWkûMû İa5Êq§w{xÅíä·ЋGèÊQ³ÜÄ`éúi,;Á²Xq·µïCÌ.`²@û‹°-x%Œ£)Ûg©nÂæŸ}‹²X’¨nƒhuXDÝ4¶õÿÚý¦»·öñËž³ÚBÓÿÞR²I1à°Ê'©TÏ•)Û+Ž8)G†Iš$I³“²Ÿ VD~u4ÛÃûØ]Ž’Ž™½6”Ù°l'°–s1rÖT`Ý4¶åæñm½KôF–Xš­ ‘@ ž+—¢—öŽªýC† Áò[é "Eÿ#½rú±@Ùþþ°B\sMZÖaŽã` Ç@:ˆ«óÛÛär‘ð ÄÀŠ R;+·ÜÖõ3Ú›W‹GP~–Žb°ˆÉb™ ,·Uîº×ºêg飀&½±® Ä+aMh”¥2ñåmÖ¥ q? ;9h†XÞ¹A·AìÌoâK12F'e³åjs–Ýr؇ޮÀËs›œ“g(k‰(®APÑÎ$®h €bb­.KƒœeÓ¡fI1aqçÝÍBÈÚXFÑ6j·X˹kU¦ZYn£U¿¶t”DTÎ2E'.ðŽªÎ<}@ÇêÛ&B7¦'¿¢Î=‘•;ß{!šâR"%°úÍŸÐýý# EŠ)R¤ô¹rd`ÀœðB‡ÈyX`‚—®´:û°®½€®ë –gö0½9þ£ŠÉ<í­õJ€ÉÀêÆÅ\ú÷ó€dŒù’XÝ`sŽÖ¬"¾ìa+J%·WÛBh8Þ;rýÈhææÏ5àbIVÕ-ã?#Å|°] ’`€©%N £Àêf´äX&6~ÜYYv^Ô`Ø_ _VØX°6Ѝ+‘Z/´òÿupòËzöék©3úÏþ]=œø'r×V7ź@zåôxS•"EŠ)R¤¸ˆèsÁÈàáÿgïÍ£#¹®3ÏhÜ3±/€ÚY$«Š[‘EEÑ¢¨²$KòX–--u·íi pv IDAT{Ú’G=îns¬¶=nO·çÈžq[V{ËÖbÊ¢dÓ¢Hk+Q¤Ä½ŠµÅZ€Ba_@îïÎ/2‘r¹îïððdEF¾|È‹H ?|÷»z& e–íoµ…€ì8À*#ÛÙãÏ78°Š=ÒÃÊêèw¦ò–­qåè+HQ.«ÎÛÚu¬éRSòÝg~±æ%ÕÝXÊî lËSBÀ*SÄã=»ß4p@+_È©Õ`æÎô;ÞBˆªZì6v€X^ÀZûÉC–ήòô¤B½l‰Y–†ò :‘ȰdñÌøUVîÛ«Û:¸püPô¶KWs1ÊÜç_éć­ë;ú~~æã¡Vÿƒª•öv&ÛyG¥ä¤}ËJ©å‹ENX¹ŒlL„÷znøHl¿Áþ9´¿Ÿ2ÛǶÇ6ýo Ã0 Óêwšž›O©Yd–­¹=w@lñ全ó˜µrIvßé ¼”š§ÔœNç-cìf˜ÊÆZ¥îjþµxÚÜÿÓÚ@Þé”k5Á–šBÀK~Tò"EË1¨”$µæ!¹Tr¯átˆ{.μ¢ìÆÐîçs·Í²YòR{ˆH@£´˧;ø¤ ²³DÕíW¬zV '—]¬‚ìüNŸÿ‡ÞVqÙRä…°±_[ `znïÞÜ”ÂNFÆ9´Kx"”Y¦è9´ZBr€ ï¡sæÿe _9MGÞÅ0 Ã0LMY›ÒüŸ¼Ý‚ƒ•šSsÏ=wny)Ùy €Ñk¯ |º‹p©ðõ–|¤íÀr¦…°ÖPìJöâ_Sj®{È«6Áµ¦6‘o!Ôÿ¬ï®¶ÀÏÁÝ Gú7û@“lYõŸÿó½o§3°òÍtf%äõ½{un=t }itVúj§¤*)`I¬ÊIFz}_ýŠU–°J´–îÚyÕO4胰nÈuD>[e–_³µÐ–컀Z:Wä;±€ìyÛ¯Z°š÷ý"}êÔ©Foq®£;à:º.¢344k‡Ñ _†•¡a±y)!ð÷Ë®[E(gð÷ Ôl¹wý@GÖ´Ž”šÏ¾òY¨ Ò thKáý U»gÏ“·,…5!î9ýª5¦ø©=·ÿÇC?~ï®ëŽW,b~¤`õ¬ÕB§,su0_…Íx¥l[Ù­o{J¤¤k$ ¡T·½2oèÓˆ\ƒ¡/[RÀòØr•?ljGR „€¥Õº*åžj.FcÕÕ˜&>]¾êÃÔªE¥­ÑpxÍFpêÔ)ëÚc™—_Mo“%ÝB({ï‚ôPìêÆ>qíÀ¯Z°šŽü›jc·á8###Þã\GwÀut\DGhìäßYDÛµòØæjæÞÕèíÀBrFDÑc/ŽÇÉ ¬ZÔѺöXöòßQüš5ú°ÚHéE¨tæ¥ßVó/èshåræÌPüªãϾ3§}„‹9°Z¨…°‹èÉ :ÕO04s-„~ÓáBOÎKUM/äA±Wßð–âÒ6¨nê²W.õ•Ï,Xá’›$/rÆ®ò¼Û{ÿñwߨQ\ËöhË[uV5c>ÄÝy ©:tŒštº…P-¼¤^‚Ê8»lý¡¥óS /oꔎÂJÁ o‡ ïHÏ YC‹iQ8«éмjÝßJÑÞÞÞè-0Àut\GÀEt„‚Â<ûÎ,¢-`¥£ØêüÁ5èf@½²íÀš¡ÄtùÅ…@ XÎ×ÑJYã‚,a†ì`†VJ-] ôBöŸÉÎc5ÿ<@”˜¡š+¡y¡¤Í(<î«b½¹ñ‹fYS!äX Xù=Tl!pW×Ág­oð–íÅk£ŽD"ºß; ƒ¯=TnϲŸ7,B¥ÎѯX5Qåo¼®Ì½¦Vë¨â2@uc^SkÔ@ýáÈ ÄBÔܳPiµt^vuvå:ÓÞÞž¹8 @Å.Tý˜(9@»zEûa,WÑó²ëÖÕ3¬$e– ½ÂÛáø¶™ºÁVÓag¸·ìo Ã0 Ó*4v áÅŒäo:ûgp½šZE6çõ¬{pÒå8jùU=Þšþ>¬¤ì‚¤•‹=kŸ°°Ú'E‰‰:lÉ“ûÌßîYëÀ‚Ó¯\×>P€¶€U¾¯¼‰)à´+ï¥2ªØÌ‘Î~ï•.I¢«½¤Øà?z<>ý(¤ò¢l aîKk%XúÛ¾ËÉ+NŒ2ïviÌ7¬Ö¥³þ¯lLEÏP §Z]ÀB6¦m§ÈÆ)9-üU·™'çûÓ…l;l´t¾ðþ\wy«ß«Ü X͇¸3 Ã0L}hhÖÎDxÚVo;D"|Ý€ÐÑì2¼eº«š;Ä¢¹ìál€l;LÙZŠž {îÞ.@À Z£Sb²ÌRN‘Wm:|k2ò,¥ lJøVÉÆ(5¿štÖ ¼ØôB©Ã›”,5§oËäWžêÚÐ>³çßT¹²dÖ«¼I_YKæBܻ͒–~Ū q/â•ŸBX;¬hes £0Ë æŸ×ª7-¾¼)×R#! €•€±Æ×Y(ÊÓÊåê,J/Ðî*‚¢ÔůŠà}B²‚9—i 8«é­ð†³Nž<Ùè-0Àut\GÀEt±áF=Ù¡EôäXÂá é^[‘ƒeNt¶…Ðñ:j'EþCh?,¼]È€2†Þi ½Cv܈܇=µð¢³{X‡Ý}F"â-ž…-Ï!ÌÆË§öPb"sî3jñô¦WÞ ‹9VÕCñ¼Ú( œWIQu›™£å‹0ü²óXѬñGÕÜ3Èð”Z8cä½Öô“È,Cï<°;lMAvQ §¨’€E™e5û4Ù~#ôûd.ßÊØýv5÷-_T3OËÞ;Á,·ÀVÓÁX Ã0 S·Ö#éÊÔâÏàÂßKË ="\.×\xBpÎå,:‡X†÷È®[)5'|Ý0|ðuåOXm¨Røû(>n}Ù˜Šž•G¡2jö)þÀæºUMf׋ù gk–v^PüZ¹sôØ{RÙË_ò´ΜûCdãæá_”í×oîɶ‡?7~±z–€°jàÀ’&Pi°àÖð’/øËêƒyk0XÒÕáówøüÛßv™ çÚ†ŒÜ·i£¦:Žš Ùy“°òÆ+mhª'Ù×þBÍ=@D”°ì®gaÀJ©ùç(5gÍ<)ûïµÆ†Ïz‡>Avß¡_¦ÄT²„œªÒÙWþ„b£`¥ôûÉj@»0FÞ“}í¯­©oÛVb,`µ>.¹nÝDCþÌ0 Ã0;þ‰Ûô BÔàS„ðõÀÀ*ûÁ^˜0| VÒñ=l-«™a6þœ1ü ÝBýÒ™«)T"0@-ž ?7ª•ËÙË_Ê^ú¼‚ìi0¬õ¢ÆêB@lþ‚¢Ô<J\+c°Ñ]?Úo¥æžÕ¹`Ð=Gu$hl:ÄÝ£mk伯äÉ9°Œ|j8n=´pû-í{ÊœcØÝ‘²Ë_.Þü† ÕµVC¾ïR6¨…ÐqÔܳd÷q9`ìz“±ûmÆž@ÈÆ@Ùzî„bc¹£%žšìV莣¬«ÿV*{î3È®PjŽV.kK„†…¯¤l [?8~Õý‡Ü?TöŸSlT¿ÛSâZa–FvÝ3Hñk”œ†ÊPbBŠànç¿r¦Ž¸äºu¹B·ýR½C“>\×Ñp]Ñ;…pçÑŒ 6A$Æ®{=7ÿ¦±ÿ§+žYM –Z"#‡œ_Zz…¯»ª3ÍRsÈ® ôùjúIµxZÍáë’=·0†ß ǵ-ÒÆî·Cï0zn –^•¤Ä$„)BCD`Ð>oƒ Â0z^€bWHv`µ>-ݺÌÃm ¢ÑzÂ`j×Ñp]Ñûç".bÑc UKfï½S†÷ •K¥Ît¸Ž:¤|ƒ€%;n4î_??KHáw o§yà#º‡Hv%& 5"âŽÍø¯héUJÎè—Tþ\+`MäoØ îþ>"´°_J/”É}ß‹Øæµƒu¼ ÒŒ ñÉ|Vc>6´‰ˆÈx»ä± ÑTs1æW²õ?«¹ç¡û7^žvh„KxÛõ< ›‚†ß\ a?sï=·þ¶1ðf)ûN]ÇExϲç°>Yøûóá:ú­O„÷Bz)>¡_H„vëw´,á)ò=)Þ¢1Npw-ݺFÿJ] FGKþŽÈ´\GwÀut\DGÈÿ´mÈ].b‘Áa@PüêF•‡RsÖÕ¯Ù¹ÈGDdµ\RÀr¶Ž¥X¥7ɶCd÷íæ¡Ÿ‡ôÈŽ£Âו±ÕŸÚc)Âf."Û…í7@”œÉ‡=S|rõ4ÛÕ @¶_/BÃF÷í0CP™|~–#T,bÄcg`ù«ÎÀªùwŸÑ5íßü±?øä¿9ðƆ<{ª¹Í|ˆ{Ë·’Zx¶€µž8°´€ " ýÖT8¢’“Xk­*DøºÌƒ¿0:j2„ôèhælÒy‘'Ú| ¡Á‘Ý·‹Ð°l;¤3kdx„¤ø5„%v¨æÞŸÄº¬¢´¶ÜÅøá}wüì¾×7C?cSQMÜ·“Ñyü[†’SŒÁ„¿¿øfÒ+Qëhöò—(½(ÂûÁ  ÝNHéyJ/Pzf°ûUå" iîýqࣛۥôèfd¦Õáw½¦£¿I×”'N4z ŒpÝ×Ñp·ÃÈŸ]wäK¯ùçèc¯Ã6¸ˆEK$”œHÿþEñqZ¾Ã'»n+úJ¶l‚¥¡ÒÂÓ#Pî<ƒUãwµp”•‘ƒÚoµ3Ã+¡¢g›g˜M¬¦Ã}Þ+†a†iB´Íê×?;i)úôÏõ}ÅÌYŒ‹Ñ²%'…¯KEϨè9˜Acð­Ï”ÝwXW¿¦fž”7ÖîNp/ cñeµx†Rsdûz4¡³¬u`UxYhá%kê{öãëûždx¯šþ9 |] ¬±÷ë”DûIýý€ ä HQl,äÌ0Õ°ÚBزNm¿B¥†8ám'5~R /ÀÎ’/º‡NJLª…—Àã­zݺ·¶ž:U<9‚i-¸Žî€ë踈N¡à6ä§.±áèé캩MM~€1øÖ¢(Ùs; Ô©ìù?¶&·?@p¶Žµ"7cQÍ>m=b=¢æŸßþšEžEO!ÔX•NV˯Þváë\7<nž;@˜²£D\ŽáÞv¨ ¥f3¯ü ůmuû«ðÅ誩£¹:…°õ2°Ôô“ÖèWhñ46Lç܈ö9Rb¢†²’*zBŠÎ›‹ïA'Öeã€ÕiÍ|12åq^Àzî¹ç~ñ±£££èßaÄß@«cÿ&íºWfdd¤Ñ[`€ë踎.€‹è²q?v¹ˆ gUÀ"¥V.ÝÇ‹Ÿéí4¯ûÌ°Šž³ÆQÓßÏßµ¥:’5þh‘£:°òãÍ Š_ÝþšEžÅv`UÑB˜Q|Òã¹ù7Íÿ]‘¥ü=0ÞRV޵'÷P³O#»’½ô7 µ•ÝÀ£;¨¦Žæjˆ{ë99¬kZ“ß²¦ŸDî*(ƒ6]:¢ð–B-_€Êˆð>á‰=AܯƒºD`W…†Ç|12åqþºýÈG>Ò××÷ýï¿Ô ´Ç7Ðê¸N¹²ioooôà:º®£ à":Ew›ÑÝf4ä‡/±ñØ…IJ\ƒ•þ^ái+u®ì8ê9ö)ÙwÝ£ÙB)vÕTM¯ÛRsÏŽ:°¼íÂÓ&"<‡ µ°TÅBµ| Þ a–x‘… ï•Ǫù”«;õÇxŠYovçëà‹ÑTSG¹*`µÚ‡.²(³ *J îÈÏ©HÔPÀ¢Ô|þ‰Š"ÛyŽ~Êz‡l»®Ê5ùbdÊã|ÖË/¿ìøš; ý^*[í•a†aZ‘O|çjï\r¬)µ|€ï¯p¾§ÍÜû™…)5Kñk[N•ÒúWöÊß{‚C"4”½üE5ó”§í0eãpÈ@>`ôÞ é t”2Ë¥\[G­Þ, -_ "Ê-ÞWíKª½'Zï¬ñGe÷ñšÎ[d\C¾…ÐhµBÊ,š 7É­Cø{`ø(½ˆl¼Ühˆì Ìð÷”^D¾O°Òc ¾-÷>Á0Û¥õœ“®GðB†a†a˜Ú#<˜!X 5÷© `é‰ÎcÔ‹[~^ÛÀEVöÂÿÈœýC5óZ¹ä  €ÑÿFH/ Dp7jcÂ*üµ’K XËœ#;ÊöªzÞüGwaÈŽ£ K-pnSùB³åZ ãØ…¬B±9¾œ +{á/AÖÖvDéyÂWVÀÊmfkOÁ0ëhÀu»k×.Ç300ðáøÜ¹O#nArXÞ‡Óœ”Z@EÖ&á‹‘)ó-„åyðÁ?ñ‰OÜqdz³³_þò—ï½÷Þo|ã·ÜR9¬qçàVëĉÞã\GwÀut\Äí3òÀg».b3`îù‰ìù?¦ÌÌpÅ©^ÙvŒÅÇ)5'|Ý›­£¶nÉŽ£Æð{Ôä· ¤ð÷e/þ*zŽÓRªÚFõˆàŠÕÀUð k©ø JÎX“ß)Þ·qøàŸ×ÛÃ+)Ú¯m‡¡Ã¤!=[[/FwPM¥lÕ ,-`‰Ð°ðõˆð¾jbç¸çXjáEJΨ¹çŒþ7ÚG&þ€š{¾äÐÏò¤ÀQ‹/F¦<õv`}õ«_½çž{ü~ÿÐÐЯþê¯>ôÐCŸúÔ§ªyàÆñ…Bˆ‡z¨P£=uêT4Íÿ³ð®ÂÛÑh´p{ê™h4J‰ í½ÊÌ=•ÙôW±8O™%)¼-öJò έðÐCjP3Ävæîlã:BT^|jjêÀ+++ŸÈÝó +þxô±×g' Ã0 Ã0; J/RlT÷Vƒšy*{éó²ëÙwuåË”˜€0¼wü·*r^(ýì¯ÃJyÿ^ḽÌéÿSÈ4FÞgìzÓÖ¾ŠÒÏi¥Ÿù$Èòÿ/0|.¼’P¿ù—Súö®.ó“EF"Pæ…‡(½ ûî6úîÙrì}y¬«_³®}ÓØuŸ1òÞZ¬Ï¸Œ=ý»êègnïnô^6AöŸ«ùçÍÕm³Ua%ÒÏý{@zÿžZ~-{þÿՇ͑Ýwd/þš}Ú>rèçeç͛ڥæ3/>$¼ž[~kSdvµp¶åÀ¢¶¼Âv6à2Fûøècÿî_ôï{÷¯|ì}úŸÞ”cÊ·LëÂut\GÀEt\ÄæAx;ªW¯KË¢å‹jú{”˜²W| ¥—`¥„'R¨^au¢ØÔ6ªÞ®!‚QÂá¬5XÅN •K”^¾.sïk¤^m×È;°¶_Œî Ú:’`´Zˆ»ÝBèíØÄcŒ€îeÕÊ%Šê#ÔâËP5÷ „Ôí„zÅæ¨Aÿ øbd*Ñàëö‹_üâÝwßÝØ=4RpÓ¬pÝ×Ñp]±uþ^˜!Ê,©…S€Ð#ê)³\ñ”œÿz§’ ïƒnÓåüvs1Xjé•Z,n?E±_^ÕÜód×-5A&C#€ ÄÄ–‡©ñÅX (µåÝzQeIF«…¸ÛS7%`²íZz…bWhƒ§Šž§ì Èžv9ðf@¨Å—AjS+SzÕŽ Ü|12å©«€õæ7¿ùË_þòääd&“¹téÒïüÎï|úÓŸþÝßýÝzîa†a†a¶‡Ð’ÈÁA@u’36¦ÅkKWMìWÙq#kü*êäp¹f áÆûI-¼@vUÝñ´5 Ÿð÷Be(1¹~™¥Ú>uÍÐrŠnY˜k,jò‰: XÕB€§Š)~M)ÊD!¼í›zœˆ –^Õ,Ù}Â@6†tÌðv oTºpÊaU;²GÖDsg˜R8/`w­ ñúßøÏþóG ƒ÷ÜsϹsçNžìøZÞó_½«ëý÷lN\o~ G0­ ×Ñp]Ñp[™c÷ìÕVõ-„Xdï„¿ßÑ=®Á~—ØNVT6:°ÔâY¢ýÆšöÚÏ@±5–šN-¾lÌ.K³]Œ´ô*-¿F+—h岊ž¥äT£w´iÔä· Ò”ª«€Uet a+ XÈl¥ ¿ ëö@Ýl Oùvf3@øº`“–ÎÀNg`5ÛÅÈ4-uÝ2­Ìèèh£·À8×Ñp]Ñp[1FÞk ÿøåé,ÌT%`o!` Üïô×!dÇä\áÑj£€= @¶ßàÔÓ•Û‰ùŠ´fžHÍ=SñáÍv1ªåWX[ã D« XÙ¸5ý=ä¾áëF•u¼1~ëÁ…ãÞ@åS›JÍc³ î9dä:}C„F3Œ¼Ë°zlVmÌe`9ÜBØl#Ól˜Þ³S8vìX£·À8×Ñp]Ñp[é1vÝàØÔô2ªq`‘¢Ô, ôÇÅõ>ç7¹Ù~½uí1=çTöO¡€%× XÙ8Å®@²í:‡ž­24 €âãi-’Ó´r €šý‘1ð–òo¶‹‘–.P §Ðr,kê;°R€úV7ª¬ã/¼¯Ö;Ù”˜T‹§ÈŽ#:_eµïŠÈîãúIvÝ çÀšÖ8°´F¶‰}ÚššÃ¬f»™fƒ¬&bäÏ6z Ã0 Ã0Ì&±3°*X”šYÂ×Ù˜¨SÞÃG‰ J/nÍʱ~ÁÂÛk{ÕÒy’m‡ê Ìv5¥(9£?ä«™§õ=”˜¤ØXr¸œ‚’S¹ìy;†¥ÕXdM} (³ •†ô6xG-…šý‘5ñM°’ÆÐ»ôÁRñyÕ ‚ƒFðÁÕj–n4ÃX°Ê9°(6 ˆÕë(‡•„á×3X¦np !Ã0 Ã0 Ãl„L™ !îÛñP8CÎåTa¡fµÎ€¥æ_ êÒ?ho ¼-_•Qs? ÂûX3?¨Û6¶¶_‰ð~©¥JNåŬæ‡SÈÆ„·SøûjÒ÷&Féïa€b«-±¹w­Xë1Ãt*–ð„@{BËf`Y×¾‘½ø×P{?éyÔ a*ÂVS0úØÇËÿ×è :ÀÉ“'½Æ¸Žî€ë踈.€‹èNž<™ËÀZ*&Å.]µßTIDäµrÙ™ÕÄúÛ”^´®}ƒRójáCvw䉪A¶ ¢ç(6–9ý{”Ž Ÿ¹çýÔôÉìkl¼Ôc›êbÔXFϲ븱ë>˜aX)J·L²µîÜá½Zm¡Týº›ªŽ[D¥µ× €Z#`M€ò·=yP£XÞ6HeVJ(¥ø¸Z8M‰Iëê×í#vÿ ó–ŠÈÔ°˜:qâĉFoq®£;à:º.¢ à"ºƒ'NØS³Xjá%ØSù† ä¤3«å|W]¾Å›Ã߇•È^ø3ëê?fÏüW’]·:žSn3í×PK¯d/ý %§E`À<ð³"4lîý Ÿš{NE_.õغ^ŒV‚V.–¾›lVÛ!cðc×}"ЖŠÁÒò¨ïþÔ7ÇÝoªjå È¡!˜adWì\ªlÙ ¿ð´9ð檀¥CÜ!¼Q –5þÏÚhM~[-½Š¼€U– ŠÈÔ°†a†af~H¬T)ÿJÍQüŒ€l;TÏ­­Cøûá`¦’€twßå†Ï½.òxú…ÿD+—‘˳×!÷uCøº…¿Ù8ů o»çÈ't^ì»Çè½+¿«†£¢ç­ño”º—ÒQÊ,Á Ÿôà :\²Ú£X2¼¹Ùv”Y¢Ôœí!bÊ¢{`eä@n.Á¶€µ‘µ¬}P«X¿'%&ÔÂKÙw 5õHÏ·2u‡,†a†a†Ù¶ «´D¢íW²ã„S3·‚ð¶Ã ÃZ¿˜šþžšþ>¬DõKQlL 'Þ5ô„WfVV Òcü¨ð÷ʶCõÏM—í×Û7úï]“”¯?±7‹€uVEÏÆ¢VÚu¥±o·Š+§Ä¤G„†´à¢æ_È<ÿ2/þ™—þs 5B6 Z~ €ˆЗþ>É XÅçq`AøK渫¹g’=¯7ú߀âWQËB†) XL8uêT£·À8×Ñp]ÑpÝ]G;kDB©X¶€ÕÙø ñ"Ѐ]„ÙXöò—³—¿@ññê×±®~]¨Ìîà€æ|qþ50÷~HvÝæ¹ñ׌áwzã•m×€á3úî^sܬ /Öñb$Šž`™Ûxwb 9£œ¦µX*v †0´©ÇŽ&œë]-EË¿©’¥V.B®°œKp/t`¾¼Î+‚ÃÔB‘PEÏÇ„¿ÒK©dãµk!lù"25†,¦NŒŒŒ4z ŒpÝ×Ñp]Ñè:u`©‰'rF'¢Ø( ,B Døwa­ ¢–_Ó7”^¥fÕü ÖÄãÖÄ㔘(² )µüšZxq84`4¶›`Cï’=¯3XûÙv„aôÞ#°æTZÀªõŨæžÕŠ!Å'(½@Í¿X<ÖJ{m68°(1Q&„¾yÐ.ex?´º!$ÙvXcÔZ†kõ7UŠB¥E fØV”jáÀ2‚º.yûÙu+ -¿¶¾Ó3»B±«9!Ep ¯ÝÂV/"SkXÀbêD{{{£·À8×Ñp]ÑpÝ]GOÀš¾<•±fŸV±Q”Z€ÊØí{fc(¸îZ‚Þ' ¢g3/þVöŸYcXc¨¹g7.B©Y¨´šyj(8`,>X8‘°a>9 ûï]w¸bƒgm/F•¶ÆQÓ'‘3³@Y׊˜°Š8°|]0|”YΜúmÔÄšy§¡0„· †ÏØ÷?éá›”˜TóÏë4dãֵǴrê­þ¦ªt~ä tÝÍ0²+jñŒþ¶qLÀFXÓKÃ'»nHÍü`Í–¢ç’‘Ú«%‚CÐA]Ù8¤wÍ ÑêEdj X Ã0 Ã0 ³-tWNa_žšÙ¸6^ÙÁFN}þÜ[ÒTNÑ,5ó4Þ#»nA®‰iºÙP-½Úë›Ë*c2Ñ×`ìyWˆ-/6&Ëšx‚Ò Öì ÒºÐz'„¡f´QÊe`~«Ï‘OŠð^Ê,«Å3¥Ÿ&lÜY=¨z(9cM-_€•DûJ«åK2/`ÙŠeEx¯¹ÿÃpðÓΩµ–íþ^Ê,ëY¢Zz½Ï¶+~œàÎ4°˜:qòäÉFoq®£;à:º.¢ à"º]GÞ'»n†Jg_ûKküQëê?ÑÊEèP€ŽFØláë†0)½¨µ|¤ôGYJ/XsÏ‚²²ýzámÞNÝĤ› ¡øµüí±ø €&q`G0 «TŒTí.Fkô ÒÂÛ ÀûÈ’‘0ƒÆà[Dp’3ºçNCÉi€„¿WG­ÁۙŢÏBéE¨4Öv†ÖRóÏ}'Œûeï]ù;dçMZvÞ>X)€dÛ!cøÝz¤nšsŠ–~SUË@Y†ÔGdçÍÆÀýÆÀ[ÌC[3UsÛØ,Ïú@Ùq€Z|Ùþ7e)½!ó=­"8˜ÿæµIôké"2u€,¦Nœ8q¢Ñ[`€ë踎.€‹è¸ˆî _GcøAƒ–/XãZ×þY¤t”ÒQé kBŠÐn€ÔÊeäF÷m(=¯f@öÜ©ÏÕMLvhQ¶ËïB“ X«ƒ—ŠÞ[£‹QÍ=£æŸ‡á3¯ÿe˜a€„·ÝØ÷a†ìº ¹×–bcÖÄãÖä·±6kuÿžv”v`åBÒ‘GË)½(|ÝæÞÃ&Ð VEΛ·Èþ{ Ó”*¬nU¿“–~S¥èy²mU¡acøAcøÝ:ÄÍIŠ9°ˆŽ#Ôâi{K©€„·cUQ•^áë„1üc×›Þ€/"SXÀb†a†a˜í"|=æÁûßn Üo Üo§MÅFsCÄš¢…¹!q´r €Zz€è¼†VŠbcÙqDŸ©›˜´l•lœÒ ^c×}ÆbMïÀ‚ƒE™•Š':­\Ê^þsä}ÂßkôÞ 3hþÅ|r"Ÿ&¶xÚ{DÍý¥,o;Ê”°’3öù+ŠšzŒ]Ù7ÝE@¶ß@øû„§2KëÇÞ@é¨ZxÑÑÍ6/jé<Ù~¸Ïeîý ÷uŸ1ߺ€á§Ä„6]æF vž#BÃæ¾o®Ã>f#f£7À0 Ã0 Ã0n@vÞ¼îˆ51EËrÁF ÙÕFDxð-Z¹„lŒâãÞ'¼”˜H†÷åû•DhrÜU|€ÈÞ;c£O̤ºÑô–ðD@éA„΢fžÊ^þÈ’7ËÞ7@§Au-ŒèÒqBúÅÔñù²ã¨ì’G‹¬h ½°R°’0ü(9MñqáïÁÝÈi@ h!$¥æ_ »o+¢vf _·ð÷ê"r€æŸ§å ¥ºkiå’šý‘¶ª¹R”˜„íiä6„!Û¯Wó/PôeÑwtïðÚ¬+sÏO䛦þ°‹©ÜÏ츎î€ë踈.€‹èÊÔQ«?jîY€„¯§H°Qƒ‘ýÔÊeµôJ^±>[_m«íÀZÍqWiëê?Ò‹Dp·ðvœœ¹‹HÀÉ|éš <åZ¿­©oƒ,£ÿ^óàGí øºExÿš-y;`†QzéE²ÿcøAým³Û„•ë"T³Ïd/ü¹ÎM§Ukºp„\ ØeÊ, _ÖãÊ »Ž›~ÆØû¡Õ#m‘ó–Z\EÏRÕ²c뾩Rzd o‡³YW[@ûãt6™öa­Ÿ6Xcõªu‹ÈÔ‡fù9ʸîgv\GwÀut\DÀEteêhÛ—2KÈÙOšái¾nXIkò;„žz–óYÈöëVÏÌç¸'g¨•+ÖµoXSß »<=o§e‰&·`yÚ » +±QqøbTiJLBH‹VæDÜ €âã”Z€~µK#¼(è"¤l 9ë–-` *£Û¾ê†Z8 @v«x¦ðuÉîÛeAò·h?µpZÏ(²øÊeRsÏV¹™Ö}SÕ×WΛÖHDärÓ!‹ X5¦u‹ÈÔ°†a†aÆy„¯ËK6ü"r¨ÑÛYƒï G%ʶCÈé#0"8\x¦V¬‰oæÏ‡ô"'¾(Ê$knýÊv`¥£Ù N‰‰š>ÅÇAJ*ºiD^ÀJk«£ÜÙžvÈç¸gW ½ÊRzBÚ5­o –Z8@tk{¬„ðuɶCPi=Äp=déÞU ænì³f°ü½Â¡Ì¥æ(=¬o!d˜ÆÂX Ã0 Ã0 SÌý?-¼"8Ðl=v2²_Í=@DöëØ9H7 ߺVGcèjþy5ó4õ¿‰–/0÷Xwk»P^·jrK‡¸«¹gA–ì¾£¦O¥;.u÷eylkéU¨4Œ€·*y²ã¾hÿÛv`-Rr¤„¿W­å ”˜B.ƒ¿ÖPrš’S0ƒ2r`k+Ȟ׫¥W¬™§tRØšÅããP£Äd>Þ¤f_ã,@ˆð>Zx‰–/BëëÀb˜ò°‹©Ñhñ±)LkÁut\GÀEt\DwP¾Ž²ãFl6õ €ˆ4úïõû÷ž~U+V"²ß<ôóÆð»×Ÿéë1úïÈûªZ¹ @DŸ¶­ XõÜýæfÈB±Y~Î^Œzh£¬ZÀRËPÑ~…õ,ÝBÊên/áï×%'·¼óÍ¢íW²ýÈ–óÝd×Í0ü´ri£-N³éï,5[• «ußT)9 @ø{½ÐamjùUÊD!d§O´n™úÀS'FGG+ŸÄ4=\GwÀut\DÀEt-ZGØeìyáP¼2ƒo…áSѳ°Â×#tž”^'£É,OdõvzqÝN‘VoÙ¬âYì…ˆà ð÷iY­¢L°.Ä];°¨è9"Ð?êÛB¨æŸƒ¡¶Œô=w°&¿µîZ¹ @vß@-ž®f±½‘K1k† ,2²€Zx ¤„·£ÎÓ'Z·ˆL}`‹©ÇŽUwdš®£;à:º.¢ à"ºƒQG3dôÞ¥oê †y Z›ZÁÒXvËÞ†Y„Û,"%¦2g?ckX*MÉ)C«Ù—ì¿Ç¾é«àÀʵ®u`jé<Ôƒò k %¦(63(;nÜÎ:r×}RÍ>³®.´r €ì}=€*Öób´Æþ¡ÔPËMCŠRs€¾æp`…F =ÈÆ ¾ö+ìwTf°€Å0 Ã0 Ã0L9ä®7ézr­€•W°š[¿¤Gvßaîy? MLå!KÍ™½ð?`%eçMõ÷:1L+²­È=†a†a†av,«S[Âái'\£ô¢ðvd/ý-¤Ç<ð3klDd©èY²ã(­\¤Ô­\ÎKEkÈÆ)5é•m×ÃÀJá=5ܽ·€šý¡6…‰ànŠ.t6ï IDATTàÀÒXÎ "¤Ì’uåï!„yà£ö!=ÑðÁJCï„pÌ !Â#ÂÛIékâqá}:ÛÌ TÑBX”9ÿßuמîXÜÙxæÌÕ‘UÚ2&Âû„§2K”œÙlˆ•š{Æý >cÏû7·†Ù©°‹©§Njôà:º®£ à"º.¢;Øáu­2…0·2Q=¯^RsÏRr¦°ˆjéUXIÜ-|]"´€ÒEPñqh”24¤ê‡Ô¡¬ùÔÂK„·Cv“m×énGè0,!)=¿:£pPüšš^Í=G©9ûHf €l¿Á¼îcºqÒ9„ž`÷ÓµZ½ÃÎÀªìÀªæbT §(vExÛaø(9Ce½xë°¦¾KÉáë6þϲý{{á}(«…Ql´øñä4ÙûÏ‘_¯<ƒrǰÃßQ™Š°€ÅÔ‰‘‘ZÅ0õ„ë踎.€‹è¸ˆî`‡×±õZu^:ª–Îé#+,¢²‰Žá½h%'`©´5ú0å†êþAÚ À–¤Gw½ÕÙ~ƒŽÖ¶¶Û›‡~Á¼þ—WGÅ Cøz@Ê‘.B­° Ÿ2Pz €ð´ÉŽ£ŽÇžÉÞ»²ˆHA6¼UÙUÅÅHÖø£äÀR OÕwª´n4öý”ìº%ÿå‹È~eº­«_§¢ƒ/µ€ÕukSÍl8;ü•©·2u¢½½½Ñ[`€ë踎.€‹è¸ˆî`‡×1¯[ÉV°¼¶€EÑœ€¿Ú>|\ßVsÏ©¥ó0CFÿ½Ð²”0(1•¡ÌröÕ?¥ø¸Z žV®@ç©ëBoM¾ç…¯K¶ß ¢g Ù¿z‡«²€UñbTѳÞ£ï V6†è9Z¹„®[Ê<${ùK°’Æàý*zÙ˜ï-t‡áý@+Å,Š«è9™¸f‡¯Þ•˜B®ë“ɳÃßQ™Š°€Å0 Ã0 Ã0ÌVXÍÀj Úµôʪ‘*6fßEÊû sø=¶ëGz„·Ró”YÊžÿcJNCHJNgÏý‘ˆRóÏЖ+Ù}›·û¶|9¡Ì=£b£wmw­œKÅFµ,—s`ÕJb}w«èÚéÍ´CÜ3„¸SüÙu+„i;§¢g0ÑÙ}‡X«ÍQjVMŸH„†ÕÜ3Œû×­)BC^JL!·ãº °&·Ÿw]F»•¤Ì¤Wø¸ya6·2 Ã0 Ã0 ³ ¬ÖP°lVj€l»€Š_Õú­\¦tTø{õTAO¤)5ϱÿ])1©¦¿+%B{D †=ƒ[@†GPÐô·ò}ˆÓ±ñ¶K¿&5@vÞÙvpÍQ-&ZNL!Ôª¥·º?THJLYc_µÆ±Æ±Fÿ~Ýéjîû{#v…âã€m‡×¯) Hm0aQj^«œŸ°œN‹hº=Sø{ïÄdwÃS'Nž<Ùè-0Àut\GÀEt\DwÀuԴ̧ð÷ìy½ðDÿèûP‹/X—î$,{ï¤tT X:_¬B´¡™'Õüs…æžÀðëû²¯~Ž’3Öå/€²²çÙqG·ú%0ÌN‡3°˜:ÁýÌî€ë踎.€‹è¸ˆî`‡×qÕxÕš – Ã>5{‹1üC®‡\`9)Ô4ûÉQDû €PÑ3Ec°(9CÉi˜Aóº#ï‘°’jîGëOK\ €0v½€5ñ°&D¬N‰|S¡•Ð9VE)1RfE™A÷pˆÀ€1ô9è¹áWŒáõÂß'‚C =q²(²ãkê; K‡òê„ݽ(ŒÁÊìÁŽGe*Â,¦Np?³;à:º®£ à"º.¢;Øáu,h!lM pâÄ=dÛ!x;×ÝU˜÷$<­áÀ¾.¡Ø=#;o^w¯Uß~#„`ôÝ“]~ÍšxBvßQh²»&CÃdÏíâÚ?Sj Rñ„̇¸S|œhL~9°î´R#e–‘š¥Ô*õ»~Ìè¿ÒSxPFö©Ð°ð÷•R¾ÈöáÌ2¹vc"0hŸÓq#‡^Ud‡¿£2aÃ0 Ã0 Ã0[¡Õ[ ¡‘ÂP$›ÂÀòi! »n æŸßxÙÃoÌy³ Sj.;úðê9™%Ê,Á _Óz—¾«¦ î%1Cù›jæéì+’9÷GÚW jò[™3½ôy$¸GÈuê9è9òIóÀÏ–{ ôzŽý†ì½b]ŒZ0'`íº¯Ê 3 S °†a†a†Ù yKº@Á*†ðD´S ­ÓB@vݵøòú.B+¥–/@ÈÕfIa˜û?éQ3?Èœþ/jî9äìW28”W&e÷q{_ý[¡cã… OY”ž¯òᔜ ' ¢vE4ƒæ¾Ÿ2¯ÿåõ,_¤GeÛuµzj†Ù1°€ÅÔ‰h4Úè-0Àut\GÀEt\Dw°Ãë(rG+w–-¢Â Û7[Ç%|]"4+¥V.W+—@–í)œ$(»Ì½‚¢øÕì•/ƒÅuÿàPá’Æð{`‡¸×Ù}»ì¹Cö¼@^’³e©JÕ‘R«gÖZ…”m‡ÖOiRvl¿ªŽþŽÊT„,¦NŒŽŽ6z ŒpÝ×Ñp]Ñìð:®¶¶²€U¡ˆºiÎðÁ”;­ÉÐ~Ÿÿ¿½{Žª¼=þìÉ•Kn„pQ Ðò‘EDyIñHY\lA\m#´¥x¬”#­¦V,õ œú¢@t¡¢.ˆ7  Öt¤¹±ú Ò$@BB&!³ÏÆ1 „=³÷ó›ïg½ë}'{O·OÖ—ä•_÷~Ƭüú{GkN*¥Œ¾¹í Øþ4âÓÔù*³êyöˆRÊhÙùûìéIÉPN鲃»Ÿ‘ÐS)åûþËåqm/õˆö$g(¥|å;¸Šê<ƈmšõ6͈oëœS)¥ °.ÙѬ;sááA‹wE]wg àˆß¨Ž€æqVb•V`Y< Ý•á1Ï©úÿAÓº+þR,¥<)J)ß©ífm¹ŠŠ3âÓ¼Áˆoo´pîsôŒh#.U)eÝ ø``0ÖœëâüÈ™ç@>ÞÀµ`€ 9$} áå\øÜ=}6Àº *ÎhÕY™õç¿Sì#ó\‰ò°.y–RFën*ºµYwF)åIéçªF‹ëÔ…-ê/ñá%Yoó$ÿ‡2<*º¥#›Ð° ,„‰×ëuz °e £D€ˆ2DxGw`èI»5º×/¢®¶õØÅ“𥔯ôõ‡ßñüÌ¿ÔåîÀR†Ç“ÒW)Õþöèn÷…q¥W*ºçÏcýŸè®?VÊ0kÊ”éSJ™gZw™]²ã…™]ËN±Çf.4b¼f\•ÿŠ&¦i:½†¦†ë"Çÿ}·ìëâ¥Ô¸!‰Cú¶rz9ø³ú¨ïÔ³®Òwò3£u×èžÓêvÿNE·ŠÍüÓåþ#¾ÓŸ›ßžpÿGæÕíÍ1kÊbnü½ß¶îóg¢»M2Z¥7xïäÿS¾:_åûÊöDß0ÅÓv #K"Pè8l& 9!Ôù,¡Œ–×Eµ£êkjOí4Ï6«‹Õ埴x’û†ku×ĈK3kÊÌšæ™fõóÜñÆ,³¶¼þÈÞ¹›Îh…G4‡ŒG…»¸V}ñ&%e”c´è ”ò•xë¼§”2ϻěêë¾{£ éèÈæV~~þĉÓÒÒ’’’¼~ýúo(**š0aBbbbbbâ„ >lïàZN/6 £ t€ˆQ†ïè[i=ÀÑ“ÐS)eV}£šºKžŽY**ÎwúskËyóÜqÕ¸£¯V)e´îfÄ$ªèÖN,WMü#®‘ͬaÆ8qbýúõÇŽ[²dINNΊ+üg«ªª²²²233 333³³³«««í]Ü)=½ám½Ðe £D€ˆ2DxGw`‰èI½)ªãÖÿèò`pFlJÔõwû¿´îÀjÐÑôÕ*¥¢Òn޹q~˜—‡fÿÈkdóÞZ<òÈÓO?m\üÿ`ûöí?~ü¬/-Z´sçÎW_}Õÿþûï¿РA³gÏnb•lâ¸ÌŠ eÿ*¬QJýä?“nîÕÒéå ’˜¾º/ž3ZtôÚ¥ÌúØ›žVQqçÏÌõÚÝ}ª'u€Sk"Sè86ßõÌ3ÏÿýK=|÷Ýw§Nøþ©S§æååÙ»aà¹ø¡Î7`AO†'ºÛ½QÇ-Ú)ešß–4|ƒ¯V)¥<±á_€ í&î6lèÛ÷»›T÷ïß߯_¿À7Üxã_|ñEH× $¾{„ÂÍhÙɈI4â;¨‹Û`}Ï…VLØ× TB8À*++›?þâÅ‹ýGÊËËÛ´iøžÔÔÔ²²²Ð­îáõz^l@Gè( ¢ ÞQÆXQwÖ'šçŽ7èhíep–VøaDp¡z4±¤¤ä'?ùINNÎðáÃýcccÏž=óݼ®®®uëÖ555M¬’=°—Yµ©¼àзJ©û²’oúA §—ƒHä+ÛsþÀËžä>Ñ?øŸÇëö?cž=Óç£Ug§ÖD&—îe<^\\|çw>öØcÓ+¥TJJJƒû­N:Õàž¬+ùgùåääÎh ***ü_ž |]QQøñœ\+p®À¸Wà \+p…f\áüù:ë…õ·M¿ ® õŒ–ÕÅ"üÞ|µJ©]{>×â»à \AÇ+äää\rP£BÆþÁØÑ£GGµxñ⬬¬§²²²æÍ›7räHÿ‘¿ýíoþóŸ7oÞÜÄ*¹ p™ÜË÷üV)uÿÉý{pœ`újwýoU.æÆßñiþÃu{sÌš²˜~9FÜÝ0À..½«±ÒÒÒQ£F-\¸°ñôJ)5zôèÜÜÜÀ#¹¹¹cÆŒ±w p§Àñ-ôEGè( ¢ ÞÑð ¡Î›`ExDíOJ_¥Ô7»¿÷éöf}Rʈb,ðÈàlŒeffÎ;wÒ¤I—<{æÌ™~ýúM›6mæÌ™J©eË–­\¹rïÞ½­Zµjb•ܸ̫Þ}àœRê‘)7Þïôr¡|åûνÂhÝ5¦÷ÿò¬Ýñå«ð¬bw ¼´¹k÷îÝ÷Þ{oƒ OŸ>mMHHزeËöíÛ»téÒ¥K—;vlÞ¼¹Éé’ñ)„Ð'©—òÄšU…f­+Sùê”2”'&Ø€V¢í½\“c¶®]»®[·ÎÞ(1¿‚“<±ž¤ÿð•ï=ÿųžöâ:Þ¡|ç•2•'†?›€$6ß\NàG@_t”ŽQ"ÊáeÜáeˆê0ÌŒmkÖVÔoPÊ´>‚Û¯´Ã#‚c€…0)**rz °e £D€ˆ2DxGÏw,'XQ#¡ÇG5b•¯Î¬=múj•R»_é†FÇ a’‘‘áô`:Ê@Gˆ(e £Eãñ¥ÈȸQÅ·UJ™ßžT¾:¥Û·k‡FÇ @søo¼Òù,ÈaÄ¥)¥T͉‹2ÀDa€ 9dì1ŒïîÀb€Ä aâõz^l@Gè( ¢ ÞÑ?¶Òz€áÅðz½F\[¥”YsÒ¬¯UJQ °4Ã#‚3LÓtz M3 =Ö DŽ·ò+þùEµRêÁµéy}œÓËA¤3ÏÕíÖhy}Ôõÿãü×ÿåIɈî9ÝéE'tîÀÐßÝ¥÷6îˆOSJ™5|ýúõýû÷ß¿ÿôéÓOž<9mÚ´À÷°›UdJOOwz °e £D€ˆ2DxGŸBáÅ £DDp6ï­õÈ#<ýôÓþûªöíÛ7~üø|÷ÏkÖn^lâ¸Í—E5ÿõAYb«¨Ç§´sz-WÝÇæ;°žyæ™À/{ôèqøða{ÿÜàÂXN/ B»‰û† úöíÛà`‡bbb:vì8yòä/¿ü2¤ R&X€Ð ᫬¬lþüù‹/<8f̘7ß|óÌ™3Û·o8pà°aÃöìÙº5À=¼^¯ÓK€ è( ¢D”!Â;ÊøÂ( "‚ Õ«¤¤dܸqË—/:thàñ¼¼¼¡C‡ÆÇÇwêÔiΜ9999óæÍ»’ 6þøBÃ0rrrÿˆTTTø¿ <øº¢¢"ðÓ ¸Bx®0dÈÇ×À®ý C† q| \áÚ¯pÉŸGí¾‹¿Â!C_W¸Æ+Ò÷»à ÖoTÝ¿‹f_¡ºú¬ `iú]ddd8¾®píW°~uÿ."ü þ®¡éw9WÈÉɹä F…Ì5í­¸²Àëß}÷ÝÏ=÷\vvvð+”””tïÞ½ªªªÉ›¸®r ¸vù»§R£½MÜJ¹v÷K®éèÑ£wÝu×âÅ‹³²²šwîwñBÍŸ!èÀæGKKKGµpáÂ+™^)¥Ö®]{Ûm·Ù»¸Sàý‡Ðe £D€ˆ2DxGkr¥û&îQ : @Dgó]™™™sçÎ4iÒ%ÏfggÏœ9sÈ!©©©GŽyíµ×-Z´iÓ¦ÌÌÌ&VÉ#„€ ¤|1øŠþ6#<+¸Pè86ßµ{÷î{ï½·Á^§OŸ¶ÎΟ?Íš5}ûömÙ²åСC¿üòK¯×Ûäô ‘ìšöÀj,ø˜-++ë -àZÖmVÿ.©]²îTÇ6Ñ¿ùIšº‚›³h6›ïÀ.'ð³9¡/:Ê@Gˆ(eˆðŽÃPúoâáÅ £DDp °&EEEN/6 £ t€ˆQ:ª‹[¹ë‹ˆ2ÐQ""8X“ŒŒ §—ÐQ: @Dˆ(C„wŒò¨qžøX½'XQ : @DgóX"Äõmcžüi{§WˆÜWc€…0ñz½N/6 £ t€ˆQ: @Dè(œaš¦Ókhšaè±N@¶ô‘/CÑßf„g% ݇;°àjzÜÙÄX.ÇXÐ^AAÓK€ è( ¢D”ŽQ: @DÇ a’žžîô`:Ê@Gˆ(e £D”ŽÁéñh¸ B1À€«1ÀB˜x½^§—ÐQ: @Dˆ( ¢ t€ˆN½¥Ø ÀåØ Š\„ç™e £ t€ˆQ: @Dè(œ{K±€Ë±",¸,„IEE…ÓK€ è( ¢D”ŽQ: @DÇ aRTT乿eaIDATô`:Ê@Gˆ(e £D”ŽÁé±9:›¸¸›¸ B1À€«1ÀB˜x½^§—ÐQ: @Dˆ( ¢ t€ˆN½¥Ø ÀåØ Š\¤  Àé%Àt”ŽQ"Ê@Gˆ( "‚c€…0IOOwz °e £D€ˆ2ÐQ"Ê@GˆˆàôØMÜ\ŽMÜ¡`ÀÕ`!L¼^¯ÓK€ è( ¢D”ŽQ: @D§ÇÞRìàrì€Å ®Æ aÂóÌ2ÐQ: @Dˆ( ¢ t€ˆN½¥Ø ÀåØ Š\¤¢¢Âé%Àt”ŽQ"Ê@Gˆ( "‚c€…0)**rz °e £D€ˆ2ÐQ"Ê@GˆˆàôØMÜ\ŽMÜ¡`ÀÕ`!L¼^¯ÓK€ è( ¢D”ŽQ: @D§ÇÞRìàrìíåää8½Ø€Ž2ÐQ" @Dè(e £DDp6ƶmÛ¶bÅŠÍ›7·mÛ¶wïÞ3gΜ0a‚ÿ EEE=ôЇ~¨”1bÄâÅ‹;wîÜô*¹KD”Ž2ÐQ" @Dè(e £D”A›;°fϞݿÿ7VUU}þùçsçÎ}òÉ'üqëlUUUVVVfffaaaaaafffvvvuuµ½k€$!p}âããûöíûÆož¥£û5þI4 #66Öÿ"j¡¾¾~éÒ¥7ÝtSrrrRRRffæÒ¥Këëëýo £>üðÃ[o½µE‹mÚ´™2eJIIIàY"ºVèþ²UY5`UUUeeeeffffffggWWW;½.44eÊ”víÚ}úé§OHb÷6l؉'Ö¯_ìØ±%K–äää¬X±Â–ŽZ˜={vÿþý7nÜXUUõùçŸÏ;÷É'Ÿ|üñÇ­³DÔŽiš<ðÀO<xŽ1¿Ïœˆ™5kÖ¾}ûÞyçÊÊÊÕ«W¯^½ÚŠŽZ0Y´hÑücë,u1gΜW^yeÑ¢E‡>|øð¢E‹V­Z5gÎë,µ°yóæI“&MŸ>½¨¨è«¯¾>|ø¸qãjjj¬³Dt³ýeÿª³6þ…î6Ï?ÿüäÉ“Lž<ù…^pj=hRã?WÁ#’Ø=~ó›ßø|>ÿ—{÷îíÞ½»ÿK:jêÀÉÉÉÖk"jç¹çž›2eŠùý_­tÔEÑ"¢.¶lÙ2zôèË¥£Žêëëo¸á†Ï>ûÌú’ˆºHHH8tèPà‘C‡%$$X¯é¨…Ûo¿}åÊ•G^z饥K—Z¯‰¨{ÿ²µY5` >|Ó¦MG6mÚ”••åÔzФÆ¦ƒG$±k={666Öÿ%5UXX˜ššj½&¢^vïÞÝ«W¯ÊÊJóû¿Z騋 ,"êbÒ¤I7n¼ÜY:ê(//ï–[nñID]¤¥¥5`µk×ÎzMG-´hÑâĉGJKKï¸ãë5µ`ï_ö¯6«¬víÚ?~<ðȱcÇ:tèàÔzФÆ¦ƒG$±k½õÖ[™™™þ/é¨Ó§OòÉ'ƒþÝï~g!¢Fª««322þùÏZ_þj¥£.”RíÛ·ŽŽîСÃ}÷Ý÷¯ýËŠˆºèÒ¥Ë[o½uûí··hÑ¢uëÖÙÙÙ^¯×–Ž:>|øë¯¿îÿ’ˆºÈÉɹùæ›óóó++++++?ùä“þñ´ÎÒQ —`]a&"º„½Ù¿Ú¬ °bbbjkkÔÖÖÞ·iüg:xD»Ó©S§~øÃæççûÐQ#Š1âüùóÖq"jäÁ|â‰'ü_þj¥£.ÆŒ“ŸŸîÜ9k»–víÚíÞ½Û:ED]ÄÅÅ¥¦¦¾üòË¥¥¥¥¥¥/½ôRjjê?þñë,µ³oß¾Î;×ÕÕùQ>ŸoìØ±ÿ†3vìXÿÞtÔÂСCW¯^xäå—_¾ÂLDt {ÿ²µY5ØÄ@ø•””Œ7nùòåC‡uz-hëW|IIÉš5köïß¿`Á§W„«“——·ÿþG}Ôé…àšäåå :4>>¾S§NsæÌÉÉÉ™7ožÓ‹ÂÕñù|Ï>ûìOúÓ´´´´´´ŸýìgO?ýôïÿ{§×…fzá…fÍšíôBpÕžyæ™]»v­[·®¬¬¬¬¬lݺu»vízþùç^®BNNÎÃ?œ››{òäÉ“'O®Zµê‘GñxJàJiðg%%%¥¬¬,ðÈ©S§Ú´iãÔzÐ Á#’ØmŠ‹‹ï¼óÎÇ{løðáÇé¨víÚÝ{ッ¾úªÿÓ$‰¨‹‡~ø•W^‰ŠŠºäY:jjüøñ^¯×zMD]¤¦¦Ž=:ðÈ~ô£Ï>ûÌzMG½œ}öîÝxdß¾}½{÷vj=h†àIì*G½ë®»žþùììì§è¨©”––Z¯‰¨‹ƒvíÚÕ ”ò¿ £¦Ì€Ç{‰¨‹>}ú?KGüõ¯½çž{üÕˆˆº(..0`@à‘[¯é¨‹aÆmÙ²¥ªªªººÚëõ&%%ÝrË-Ö)"jêZÂ]mV X£GÎÍÍ <’››;f̧փf‘ÄîQZZ:jÔ¨… fee5>KGMmݺµW¯^Ök"ê"ÈŽŠŽÚZ»vím·Ýf½&¢.Æ÷Áyï½÷h½¦£Fêêê–/_þë_ÿºÁq"ê"==}çÎG>ûì³Î;[¯é¨©eË–MŸ>ÝzMDM]K¸«ÎÚÔ]Ϋ¬¬ìÖ­Û‚ ¬§Ÿ|òÉîÝ»WUU9½.\Vã?WÁ#’Ø=ú÷ïÿÚk¯]î,µ0räÈõë×—””ÔÖÖ9räå—_¾þúë?øàë,õø«•ŽZÈÊÊzóÍ7;V[[ûÍ7ß,X° mÛ¶;wî´ÎQçλõÖ[W¯^}âĉ'N¬\¹255uË–-ÖY:jdÍš5#FŒh|œˆºX²dI—.]Þyçòòrk¬N:ýå/±ÎÒQwß}÷®]»jkk<8cÆŒ|ЊˆZ°÷/ûW›Uƒ–iš‡;vlBBBBBÂØ±cÿýï;½"\Bð iðˆ$v‰KF,//÷¿Žî·eË–ñãǧ¦¦FGGwìØq„ Û¶m |5Õà_èè~›7o7nœõÃxýõ×O™2åË/¿ |uqôèÑÉ“'§¤¤ÄÅÅÝrË-}ôQàY:êâæ›o~ï½÷.yŠˆºX»víàÁƒ““““““o¾ùæ7Þx#ð,µðúë¯÷îÝ;66¶W¯^‹/®¯¯ùä“AƒÅÇÇwíÚõ¥—^ ÿ·à* °l`Ýle^Ôø ¿øÅ/n½õÖƒnÛ¶-??ÿ¹çž›5kÖ Aƒ¾þúë;vìØ±cÙ²eÖ;¿úê«{î¹ç¡‡*--]»ví‚ þþ÷¿‡ó{pƒ;Ûla ÿÍÊÄ0Œ^xaöìÙÖñ­[·Ž9ò©§žòùôÓOùË_îÞ½[)5uêÔ~ýú=üðÃÖ©¼¼¼_|ñý÷ßßwà2 °ì|€uøðáN:YÇ+++“’’éܹsEE…RªG6lèÙ³§uª¼¼<##ãÈ‘#áûN\†€=‚°|>_àÇ^òˆõ游¸ÚÚÚÀëx<žúúúЮÀÅØ gU—;bILL|x^^Þµ_@ XöèÞ½û|píwK=þøãO<ñÄêÕ«O:uöìÙÍ›7ß}÷ݶ¬@Sì`7Ξ=û›o¾©¯¯÷o}Õà…_ð#{öìyôÑG½^ïùóç<þüìììp}®Ã ®Æ#„p5Xp5Xp5Xp5Xp5XpµÿK:¿êsQIEND®B`‚gsl-2.7.1/doc/images/interp2d.png0000644016036000116100000013536013373111455013510 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœì½{¸eEu/:jε»l„Ö "ø‚$ ˆr¯æ$|`i‰ŒD“`L4ɧ~J¸†œëÑø É{‚r¿˜ä‹ Æk”\0Äã —£Ä‹ÁäD®Ï4B|ƃIƒÚ†æ!„îÞ{κlz­ñXõ«ªµ÷îµ÷Zã÷í?Víª5ªæ\«æüG…#9‡Ãá8¸h¦­€Ãáp8ó߀‡Ãá˜|v8‡c ð Øáp8Ž)À7`‡Ãáp8¦ß€‡Ãá˜|v8‡c ð Øáp8Ž)À7`‡Ãáp8¦ß€‡Ãá˜|v8‡c ð Øáp8Ž)À7`‡Ãáp8¦ß€‡Ãá˜|v8‡c ð Øáp8Ž)À7`‡Ãáp8¦ß€‡Ãá˜|v8‡c ð Øáp8Ž)À7`‡Ãáp8¦ß€‡Ãá˜|v8‡c ð Øáp8Ž)À7`‡Ãáp8¦ß€‡Ãá˜|v8‡c ð Øáp8Ž)À7`‡Ãáp8¦ß€‡Ãá˜|v8‡c ð Øáp8Ž)À7`‡Ãáp8¦ß€‡Ãá˜|v8‡c ð Øáp8Ž)À7`‡Ãáp8¦ß€‡Ãá˜|v8‡c ð Øáp8Ž)À7`‡Ãáp8¦ß€‡Ãá˜|v8‡c ð Øáp8Ž)À7`‡Ãáp8¦ß€‡Ãá˜|v8‡c ð Øáp8Ž)À7`‡Ãáp8¦ß€‡Ãá˜|v8‡c ð Øáp8Ž)À7`‡Ãáp8¦ß€‡Ãá˜|v8‡c ð Øáp8Ž)À7`‡Ãáp8¦ß€‡Ãá˜|v8‡c ð Øáp8Ž)`ãmÀwß}÷…^xê©§rÈ!!„;ï¼sÚ9‡cf±v›ÎÆÛ€¿õ­o]{íµ}ìcO=õÔiëâp8ŽÇÚm:o>í´Ó¾÷½ï}ô£=çœs¦­‹Ãáp8fk·él¼ ¸i6žÎ‡ÃáØ X»MÇ73‡Ãáp8¦€Á´˜½uëzhÚZ8‡ƒˆè°Ã{à¾p›Âj c\-Q+ÁœnÀ?xè¡ÿŠ ²vÑðâ¹F,¶’C…D1mbUVl›–£ÔãÅ ‹JVOÉêóx¢Ý+ÓðºÎs2ýlqb9ørªâQ¸žâ9F¬šWùåÄú¬Ör­äö*_®åõy1ÅVê³Z·Á Xko&g‘ÉDKLPO¡c‚:jTñèð½»â–‹K4ˆLîbZŽ)6[¾ŽÚž©ËÅVª7¡¥šWù4ßþw*ÀÉ7Éã-«!dUà´Ãáp8SÀœ¾“|8!ÆH„hX ¡IU-—Óµ”£Zòb#õiŒœ¸êúÀÀÚâåbô)FQ"J7ÆrY$S ± ŠˆäêE8¨P\Í w4ƒk#ÖG:áriÞÎ4Žl¹RªŽ-ªÕ ‰åŠ•Ë•ªæ6RlLËáêa}4D­º·‚Öœb ~¤,5ÄÚ7{Ù˜K1bÕ× JÃÆqÌ…çcH‹-WÏûÈ^ˆ¹>}FŸ"l®í°¾1¿ð!ìó‚´ˆbŒ‚kŒQg1 Ò+Æ*J9!FDz¥ÅÆ9•U/©"á¤>›k¦þs%I!÷%gÈ1¢Ò‰måOÍ‚ø•Arš(©cYH±ö!3͘™&W·Ì.Wùr5²JåíÕ@9ª wTƒ†Ã¥‡0Eõ+¬vñ“U½T€rµqìg¢F{êV­v†ú^ïLª#5¶äžú†Õ7$ö»ÈŠñaãÑPäõ.n·EµD:> o)0±È åmJQÌ…ÿ_L£§ÐÕoÀ«f^ØxpŒñ#ùíܹ“ˆn¸á†#<òè£þÉŸüÉi«æp8Ž5ÄTŒ¦k·él¼ ¸ëº—½ìeÃâë_ÿz"úÙŸýÙ~ô£ÓSÊáp8kŽMù&«µÛt6Þ< VŃœSÐi]`ÅÂ@šQÛtq £ Òv» í¦\l+-»J/ö!lJ˱ú¤æEŠ‚–7I}ZeôH£”(A±6Útq mxi_ãr‚ìØj`1%‹µúði¶üœWô!j¥Íµ‘ê5i9‘C 9!''i‚•CX´“Œ"´òF©^4k’²cã1°÷ÒZÜgÀÈt)I7‚Ômyñ€NýQš–¹µ8DÑQ¬ªZâ–·­6Ôr¸×Ô1—Ó*“p/)è8úL--qõ䌹}LˉBÕ ƒÕÚtÆH^ ¡Ò¶%Œš-[ì ÍŸªØ˜"ÉÆÜ 䨢ðÉâ{aMG\T¥-RÏKš^&5F6ØTÉŠQ;ÚÚ0îóØ¢2ª¢4â±ÆŠYbÓ8§ÖÖȉ`š°#6ÖRÚŒ;f‹1Q¥sÅ”œr#ôò¦ÊSi¹ž}RFOQ­jy;kôU·¡j,Í#µ+¿þÊÍJÉAê5rçöt"ã½5´IGÞ±§Ðèk”ÇB¾ÉFÂünÀ‡ÃáØXhóM6æwü†:îÉñ*ª6KŸ£”C†‚i®XÉiÓú`J\Å+¯—âú’ä'Ñ@†!2V5ÇËŠŠÔ ¦X*r¼v^AŠ+û€¹Ù€åH†ËQÊ')ß«ôQÁ<©0¤ªi⨭òè&)hÀSº1æ®-Í”çq5‘gq#­Øàå®ÃöA:[Ë ¾gßÎF’ÃzN&7Ô÷ZÎpá\$1Ò gCDD=5P>•ZA­7œ…Ž’Ünä;pC=4¦}¼¿4€{Aϸ1߆ 0|¨É…!=2ÖžpÌ›ß|ØýØ!§œÒlÙòå§>uÿwN §VŸL”ûLLÎ;ˆŠŠT4¶ÈÊÄçêÇç¨x! ¢²œ¬X±DDŸ¼À‘ ¢wTÔ¦Ö1Ÿbþí:ã( n³#YUÎlS¤@¿bìo$k`ÀØ‹Ó2¦‹òKTÚr¬Ø¡¦2”6PÄRö$ŠñM"ã€Å>:üÜS0E¾ÍGS;…oxqŒX~[D¾S¶ÔõBNÇäD¾S.P\¢°™ýÊãéÙ ¾O_û"ýÅt‘ ‹:šNÚN¿ÍÆ¥½ôÐUtQ?†MÏÃã€ÕØ|Üqý…_ø÷Ï}î¡Ï|æ°3Θ¶:옶ë;Nž¶ë;~yÚ¬c¼iÇ¡ÓVauÐPû(Ñ8P0‰A$É$bEéÌŸD§NOù4íø>ÝÞSø>}ãÅô'Ћÿ‘þ¯†úNY·(Ñwèö=tÏ)ÝPœ ÇŒíX36 laŸ·sÌOý뿪÷Üxã¶oWo€)¢’™§ú>-páÛLÔ*9&Öx9D¦¾Âê $·Ö*úNÊ­ |9UkI]uJA2õ•¤ -•Ħ3jÅ\F- v=”;¹œRÇ`¹Ê)hÅñZ9JNp"?ð•"³ÞÝé¢"‡m±”X–ÆG› K©ÇÖDì…AŒÑ¶šˆ¨o$AÍùj°7&5%8g:/´@GD#»Ðýtë?ÑE|Dµ­šð!þ-ZâUO çì¥{öÐΖ(P³Ÿvï¦Û¥çÜNè–W…‰]¶·ÔBáaê˜}ÌØŽ5cÓ™û¾ûÝOŸp°ø˜Ÿø‰g¼ÿý|éK¶e [·‹jã ‹‹ÑO9t8SÅýÛWéçâSŒ¶Ò3žJoˆ¾f[j[:„hÙ;Q?ÆFZêh¯íõhzâ$ÞXî§y<=«¥…΄>/c;½m]¢ýwÑퟥÿ€vO>½‚oÀDDqiéÁ¯~uùó–'>ñGï÷îùä'¿ùö·Û–Ù¾ýäÿößRrî¿ñÆolß¾VZ:G"u{éÎå xu,]ð}v]i[n£Fúˆ¿£/|Þjÿ¿@‡-ÒÿàÿY¤‰ÂmÝoÌÀ‹ôð×è¦ïÑ×—hï6úágÐYÿ ½å:ÚñPÚ` °%ßd#a~7`~!‡ñ9í£õìë¯ïî¿ÿk/ùæ¥%"R¬¾õÖ¯2/*eÊ÷ÞËôD"ª°Ù›‰Z>ÔÂLX éŽ Î`¥Â‡Û Ã~pj§iDT©¦Årª2a%;ÂÌ\T“Á*• kYŸ&-dž3)±<ì§•êð*œQkÂ8(Y´ÆQµ…-²5qGö¤©ƒF}ž "PU±£ ˆw(‡i)„ÀOMàéLX¡“A8Ò¡šÑÑ‘–ï#èÃÒˆ4ï=êÛŠÌSa@›~„®èèߢÿÔТ|ÇDñ!Úy;]@D´”ôÔF¢EúAKK‘¨Õç4Ä@q@KDÔQÔ†Gx楖–dìS¼—¾þúúr×]´s7Ýþ3ôÖgÐ ?OÿuRzv0¿°´ÙÅ@D!œxÕU[žò”?þãý}÷=rÇ©dR÷ß¿ïöÛG•qmÿþd©‡_£0.…È<¥2aá”U¬°µ¯<<gÂ*[žQËf°Jék¬˜ØT rf5Æ j£œ&¥[Z#+%jñ4µu6-6›BK–‹‡YÍõ}hFIè ·IÒ&W<똜¦ñ£Jw\;êyïF焊Üðd|Nrµ´U;EÆã1>cC<•~w3=ákô+‘¤Õ™QO=Lß"³/=BA/øÉ‹°H.У–ÿÙPˆD›è0¢¸D7€Ñ/Òò”wÓ×¢{~ˆŽkÌyU%˜±kƦ³"<õw÷‡Î=÷¶½èá¯=ÕæðŸù™MSÐÞxã·‚v8ë§7N/øgº`};Õæúñè©Ú{èóÿHo¶ÿÿýËô#ü?¦'=Dßëh?ì©Íò{ûD˜±kƦS• ëÈ_ø…'¿ímߺðÂoº‰'¢Š2ûèÞÏ|柭8Þ¸go<`O£Ër–_^,u¬¼ ¥ØMÌ1SeÔ &¡•xXòyX3·¬JSµ†qT­V—q˜&Yœ“îH¦£b嫉¾îA¿`}”͸Jõ’~©ãRh goFiÆÜˆXljˆŒæé %}R}®£’z§ÓBIc´Õô5ƒþ7¦ “}£Sµ ²È†l^Qq/?©åi¤ïµÌ˜Aæx`îö{Ae«Ⲋ‡Ó‹G¯¹‹.>´”Îß=Ñà!ºíŸè DÔÉQ–)è%z ¡.J2¡§f7Ýúx:õ‡è¤=ôe¢~ =öH:ùNúXK]”k‰"-8["4ÔCÿÓ!´íŸé––ú˜ðØšÌïÌ3am}úÓäýï¿ÿoþæÁ›n:ìéO_^”îÁwíR;\sÏ=ûþöo‡E>$wëÑâ†pèyç5D›Ÿõ,":ôE/Šßÿ>}ç;‹ÿý¿?"†!µL‡¨Â¢ô¶µBBPâ„ùåŽ@® ³Qbò·^íp@¬ŽnRÚ¦Àá:BNDû:ê8N=JõN“d˜RÄlÃŽ`ÖK8 HrÎj#ÄïHѬI †;Öƒ¦TRj‹¹âh|¹Ëñý8 VKlì2î(ð½9ÈÚH½Ì)N8h©‹6ÓqÇÒ~þþAúÌ!ôäåª%zxýëØ4Ô÷tïƒôy"ê¨åùÒïmC¤¼uߥÿ÷©ôs§Ð›¾A\¤}ÇÓ/.Ñ¿‹þï†ú–èHúŸ‚ÞñEz÷.útKá'éMÓ½÷Ó‹ôðáô#ÇÓÿN÷|ƒnh¨ká“ÏXx&¬Ä–§=­9ä÷o&#¸ñÆo®ŸÜ¶ýð‡‡¥Ãßó"Úÿ±Ýÿ⯎|‡Ãá8€MôÔ@[¶ÒéO£Ó‡ÿüýÃ7è7WE~¤¥ÏÓ[žN¯y:½&ÐÂú§/Ñ»öÑžõM fø8ò=ºí‰tú1ô´åaºïÐ-_¦ÿº˜lèê{}#¬Ñ1‡ë!„ϰ¢= a¸,ö´åf¬cPçïöL8Ô{A·Ò›ZÉѧ&(‡[å7Ë‹,͹À·ð<ŒŸÍPîM În ôœ×®_.qt®FçËå²êa/hpæX.ìCΗ=J}^M4/¹\1ç –#QHÛMb  x𤨨S`êÅ ÄŽ‘“X®EËHM'X܆¿Sv1DÖº£÷éæÙ£ºH‘)ÔQÃÏfÈŒÂV¤§À;ö²c¤F j¼ Gf/ û±ˆ:©Ï’ä®{ÒTöÏd䌊¿®ÎnF!„ÏâeøDëdã›ß7`†$/†:üd²‡HjvMä ”L™ãÊ)h˜j ¢=¥g°Z}Ä4#šfÕr©e/Ÿ—-r9Šn-‹3aáZIï嚃Ë3aY/qà#mX¨ÄJƒtÐÕÉLXc¬ùòqEtT¾º£C ìtõ9Eâô¡ RH &™oZm ž£QeÂ'<D¦_:*¼WËnމÎ%J9ª[OqÀþ×QlÄÁèr6’¥Ï˜Þ˜±ó€«½À‡Ãáp¬óûìp8Ž…{žß XeÂR¶[~¶Ý‚ïår”‡¤NYŊؼWqR= CÊfzÆQiÔDÆHIäj›t:–5FâQ<µSù¼-Ù,WùUP–x“cSM5r¹PÔÌ„¥ä·gp–â…Èt¤tG %ï ÕQå¨*Ë`5¦e/—KrÛ¢¶áQdbc‰±Hq¯×(içFœxx|N FRµÑ¬3Ói³Ãhçê@m/3X MÔf0AöG Ü´h äp›´tçVÑVEhóM6æwV£x•8ÂOZg³™§Rr–£¿ÅV:l´k i°Jú.«cTÒƒ5'6Fòb6¶M¦ŒTX»ì$kSCØ¥RõðqC„FÁw—“«Uƒ¦4¸cz.öÜ$0k«^L´KV%õQ‘E¦£¸ &*I7eRôc hØdéDxrÇÕFóT1袢ÜGƒT@ú4Z“–zXmž1£éünÀ‡ÃáØXØ”o²‘0¿0¿­¤ 7±ð!ö£Š–‚¦2 š‚È¡£”/¤!(2Oe™mL±–ÇÃÆçTu´Œ4'NjâÔU™¹Èèá&MãSÔM¢QÀÓÄÄrHèƒÕ³ )h+0Ҽ؛³+t®‹Bf[v ʶgEôi}ä¼8ÅǼ½Ëc&B#Š:g– ¹)ð¾-+F™Š‹äYÁ0äJV²*é\MÒ¿:Jš¢•L;y&¬i+05pc~+91qà B)«L‘w”L 8Á+œÔñ0Ù®C*ó!¹SæiTÇ$?l¸â*±#1p¹p¸È…Õ[É4qQý,§ª0U«ç•æf³öÐÕc¬ŠP,WËáPáCâ;;F¿ÄÕëå²3¨­ˆ³¯4îñ$MA+±}£oD¾Ãõ*ìg˜ JúZ‰bÏA&Ø#Ež²ª—½ÞÈcHܵ‘HŽl&ƒUUЍ”zfšúra}Úå›ÒGw.V²#ôÊÆçgøjØR‘µ‹£}³ÆíÙ2Òüî²l1±Z m”´.¯êdÇЇÀw¸Ž?ö·ÔÉ0$ÁG±UÇÀn ºÓ‹û@Þ$~€Ô·ÞGSöÁ¤?M4BC½Ì…©(qž´Rȉp›OaK¾ÉFÂŒ9u;‡Ã±10¿oÀ‡ÃáØX˜±kƦSCØgMe¼P !0Ê.àÀ•A(«!“"*¤å(£/×Qúð¢ ?aƨŒœtæ©NÓ®·ö•gøAJ±&£– ¯âl$ÿ®ÄÊ(©B‹¾*ªãŠA+{W€´VNÊ8š5uS®`iy²0$ ÔÈb„£ k{(Gw Äö2, D£ÉoM @ÒÊc{dÊ—#L¹5¤ŽCÂ’ªþ)Az‹³’–´{Óh•Áª‘¶Ûžî>ÝPËçøá&VWOAÏØŽ5cÓ©€4u S®Ê`Å›mIɇ7|Ò²¬‰rr@K¸¢~”œBËš´4™ mж ­^zPÜQ©‡〜ªZ ˆË@W3ww•j[3‘ÌÚ¦T­Œ&WS?dÀ¢pgÃú¨~&×hCA÷ú鈃ĿjåT;þÕ2Žùߨ¥©HÞÐÛâ{ª²ŠG%E-Œ6i>¾Ös‡ùÝ€‡Ã±±à™°fþ¬ª-'Àx*)6­-¿Ô2»¤8´ ¡È“;Ù1Êý¯G'õÒè+6¼(â5ÜvÛ°iGŠü È XeŠú»!¿H¶œ$åªìÀë&üx~7`‡Ãápl0¬J.Ê}«!d50Ç0vÇ\¨¢ËÚôƒ¿h å(7} @:í>)ÉùIrP®7`;mN(5(wÇ-ïh™ÿÂÄaU§ÿ[p ”…ôÕTÚª¾*%SyG;ha2«@’¹…Ëe9^µì1±\Ñh^È]/7îÙÕDs£ðå$sù¬5w-aO/²‚’UîÁA¼)ªLXÂK[åÁh©OÆ cE9¨ÊËÁ߀ç¬äêøûºòÊÌÁ[yS«YÏ'æxæ)U×WÅaª}4Í…j šŠ¹G%‡4ZA³Ïëašr&ͨE&¡U9å[¾\öÀ£ÓäréG½4•­-Æã½ôfµsW…ÀŽ”.*!éÃÆœš :†TÊQõÚX^>a~¥¤5ÖèB/Q47«TçÐ\¶ R݉½Þòc¯/§¢¨ì¡º ÅN°ÓŠ0çç&Q/½©¹>-Ewå¹I¥ð7`‡Ãáp8¦€Ù:Á7`‡ÃáplTûM¯kÌñÌSaµÒZÃm¥:e•I¥T˜óä`ã¨JíT•" ˜„•‹MéC&J èCfš)õp+*šŠ¦£[ݤLæåú ´bFŽÊ„,Ö XÛ’AXTsTa“¹6 ³e+ÅÁNØæ NC"3JÊÐkà,o«(h(G¤Ð‚&j5è€$?,s¥Ÿ³¸óZ й5ôy8 3J£¯NhÅ9ñŽî2ÍïËH!Ðâh–Ú”8³75³I+Sw3ÉiH›«{¬gÌñ¬ŒR)«˜ÍaWPµŠ¶…Ü5ÎV¦F-³™°øY˜s>Ò –¾àµVt›Ö{A[Þ;9bc<¶FÅF¾J"ÁlKÍ%³dŠi•`kôn(quà`/YlÔ!ý¨%qgïv’Lг†9Þ€ 3aÅ\J&ÅRN('Ý‘0Ç[Nê.§¾”¯¶XC¦}µ(è*Ê7µìT3k›Ð*Õ1Ãü›‹›êˆo'Ìü#Æž z€WÀœs1ñ^&]›’SU,ϨE”¦fUZ*“ K0Ç0B!½åŠüÜ¢(©C”IXª«Øiq©EÒ¥»c»lC±g·{¤ØÖÙñÚ@}#´åE!§¼{1fkËš­Ù8‡c†1[[Ö¼ÛÀ‡Ãᘠfëq¢ ‡²Ï8FE”§ˆRÇòàÜI dÔ²rÊ5©&޶ÆÚìêq9@l¢nŠ—«nš¬_•MZƒ ¤QSølçîŠ ÐWhKÆZ\¨‰_²¦S®žŠóA‡¥‹*á—=d)Ž"Tú6†Œ‰:e6 ˃”j¢ˆjŒn»råq¼û9÷ò‹ÑPËÈu}ŒR#©ì^ŠR,ÑR¢¥à®Ká™°f¥ñ¹H ”ø©Þ? %ŠSE-¹Rk¨õ⸚\r†  ^4Å”ªÉxÜqrˆGë¢,m{¥žl™.9ÍFŽ¢v¹‘U%ØŠx_Äó[ ^9ÊA£®ÒBÜ3*›xp¯ç¹~±v;Ժ؀¯¹æš;wÞ|óÍgœqvÚiÇü»Þõ®+®¸Â6þЇ>´ÿþ}ìc{ÜãˆèœsÎ9î¸ãþâ/þ¢zv8ÇÆÂ¦|“UÇÚíPë‚‚¾þúë9æ˜å¹ѱÇû¾ðºë®ÛxÿþýmÛ~øáËÅÁ`pøá‡÷}ý¹’€Ãä\ŸªjŠÉOͺհ‹–´,'?ËÅ*þp¼–ŠLŠ-o9nPÀ…’ºš tkn^ºq1ûjÕãàI¶¤tK; ¦ŽrrF !ɬÄÚ¢è+(/Ú¹ Zi‹)hÞë(ñ å(²Z©ÄM,Ð9€3“‘6 õÿ@Q±ÐË/ÿñ– õ k¼¬:û#Ie«¾V—©F1Òz&)4«ñW‰µÛ¡ÖÅðwÜqÒI'ñÿœ|òÉ7ÞxãÞ½{·lÑ©?_ýêW¿÷½ï½à‚ ÞñŽwlÞ¼ùÏÿüÏ¿úÕ¯^~ùåÕ£rwvÀ=V‘–˜l¬ê8!•£j9°œ ©Ú•è³zLûÄQ-—ºz† Õç#wWiKB>ÀYojP‹)hJ±×q”꩎Šòårz#6Žýœ“£U™°TG‘+êŒZJy!6-.W_¢F;Y”÷eÅÞWÈû‰{AkÚ]fÔ"î§ÝËç/.65ZúÍP?Û ¬Ýµ.6à={öœrÊ)ü?Û¶m‹1Þ{ï½G}´jü¬g=ëæ›o>ï¼óÞ÷¾÷Ñ¡‡ú¡}èì³Ï>xê:‡c*˜FðÚíPëb¶é±¯}ík/{ÙËN<ñÄ÷¼ç=›7o¾öÚk_ñŠW ƒ—¼ä%uC|Õ^ü4Úñ´*y‡Ãáwíxè]—üûÊå„ÿgÌ?/~íxú˜ÿïø*]òµ•9NUÚ¡ÖżmÛ¶ûî»ÿgÏž=!„#Ž8Â6~Ó›ÞBøèG?ºyóf"Ú¾}û®]»Þð†7ÔnÀñ.ü@ünç°ã´ãcþ>R!„Ör‡ª§à×'tÒwÜÁÿsûí·wÜq‡rˆm¼sçÎg<ãËs[Æsžóœ»ï¾[-PÜ&¿lgysH°À8{ÌðOɵfˆdKS«ô)…-…ÏBN½ÍÇ.fárá«`3¥†¨]vQ,ž%Àå·“º(j¹ÀúT‹5·×z¥ªª–,W6*)5èjMs9®gø¨(«-ƒ>˲ü[#Ô;à05üCÅH¤j‡YÙè¶$‹z^¬]”Ý‚‘S€ÁjüUbív¨u±ŸsÎ9»víºå–[–‹wÝu×Í7ß|î¹çŽmüøÇ?þ¶ÛnÛ»wïð?·Þzëa‡vØa‡ ]‡Ã1OX»*D„~P°¸¸øìg?ûž{î¹ôÒK—Üï¾ûî;w.Û·?ñ‰Oœ}öÙW]uÕrÕÕW_ýË¿üËÏ}îs_÷º×mÞ¼ùÃþðµ×^ûÖ·¾õÒK/-1„_!ʈò-'gˆ% ùˆ9^E¢–ŸvФ)hÌRf™[@«ç÷ÒA!ÕOðÐuâ}¹3íâ½’:.dÚõÅ-¾+ð4cͲs9úÀùòCŒcâ/QË4€‡gØ‹R¾\jÙ¹òèK”cþ+ì8LL\‰])9Íh§Én¯(_^{}Ê·¸œŠ¬-ym¯kéýØpov3 !Ä_ÅMŠ>HUßÚíPë¼°°pÓM7]tÑE]tÑþýûO?ýôk®¹fè]Ö÷}×uÃ8ªW¼â~ô£ßùÎw^xá…û÷ïÿáþá?û³?ûµ_ûµêQùÔAœFE(”3æÎ”úà8–TÇÉõaH¸¨åOSí(årêæ%IÂòx**^®¬XJù(6ìG-££HCÙQÀ4£YI°ìؾZZm)]Œéå²§DYLŠÅúÈz²*½\@sÛX¡5Í46)´Ò4x`¬ˆb/g"s]u2º©—×~Tlœ ×}bív¨uñ|𡟤ôÆ«ªŠ`ÇUÅr9G;èÄ'ÓgâyE“½ˆU¢€>Y±©ª©È±ÅÔ4«–ëàßNm¹ÀͶr²Å‰;룞A¤§U”çF¬Â‹Õ‹uLʃî/zþuܤáÿ¬{^;¬‹7àé@±L)S>’`ö„T@e¶ªœ›Ål&÷Ê9Uëuœ$ÁrrÔ4“‹PÃæoêhZªÕ«à0YC+¶ª˜2(Ø"¾I†Ó´d,¥‹v1ùåɸ+«ï‚zKhõ‰…µPŸr§h|4oæœãIõ±«'´¥d˘»iSžØÖ+9Ws(0õ"™b:ȼ!b”FN¦§føæÝSà¯úGÒÔUb¶¶¬ÙšMxäv˜ãfKà®X5œªíÔÙ°ÊÕ«¢ Žœ¤Ø\>`¤¯¥²WE={—6‰–ø®”8VËÑ„°ì¨4k4/—Cê$‚–†‚V™°TÊ*e§—¯K/W0by×Î蓜KMF-yQB“Ì ©^y£^Yâ“i˜~ìØýæs¼;‡cca™°Ö¾;‡cƒ ä›l Ìñ|(û \Tm¬ñâN+wŒÆïcUÄRÿ¨]­õ©m©¼T¢,N&vU‹fä=é4«ÄN¼JŸòõ±HÕÖþø¦ØëÉìhJ­sÂä=‚úæN¼Î`aUÇï eºè. D"ÁVr-Í GÚ|“ „9Þ€‡Ã±±°0mVë"–Ãáp8ó†9~æÆ|”ÓŠd’A98%8Ô„¸à¤üŠÌR¹Š@`OöT€X¦žÍk_žÁ \Wƒ3já«¢¶ªâ… ƒÜ,Ûˆc±RËŽ¯>‡EUIT•‡ësósõ"T uj™øÐÒ)ñQz^4-ûô¼ÌKÇ’ùʇô4)ÝG[E¸ì}Z=)'â¿]8®X©W†MÕ=Ö3æxV™°(UÌ®¨Ž©Zœ;)ï12²ÖtÄÚN´PNiŽH&ž!e»8b!—`+¥OÖ8 r©¨­r#+ö0AeYƒr0¾i'Ë„•1usÀ»'¢*÷0Àb£ô à­I/f‹Z˜KßlLL„&j{·—‡,bGŠ^‡UøPŸKÔÅGiåoiLÏ«³µeÍÖlª ‹(uÔy•EÜî•©ÆÖލ2;áb©ØÊ¨­”‘ f^nªÌÚ¤9¬œ” 8TZÅ¢,ÊÉÞ]ü®X9x"婦ÈÜ]êjF8Jy&,k MŠ5Sh¹q”EÐR”ÀDlã²ÉÌ Â#Ì„¥fݧåàõ‰°¶“—OÙ¶'ÀlmYNA;‡Ã1ÌÖãDD.h@ÎÔ„€xKZ‚¬4(b’–8ð@+OÉ*L^Yg(qÀT6Ð'Ä#(&;J§ñª[gÀõÁy©AÓž ¤1×8ÊÃl¼P’Q4\1 |ñÍÔôâTÑ—~5"¼KAÑRë$åC(õ€eD-B›NøÕÃiFsqSw¶›Øµ?Pгå„5ǰ¸€Ë‚üX9å‹IB‚”]…+±> U&U´h©Fk8ÞªåJµÌ‹] }–‹m¢¥}&+¼ÙÚÜÝ…õáTvªÊ3k ôÉQšà®ˆ©*SŒé¢|å1«ŒõéÓËa’ Óⵌ¶Šé– `Mì…îXÉÞNlÌ?—ë“Ô³¾Ë:ÆoÀ‡ÃáØX˜-«©oÀDÙ!LîéC=Ó$X6%"?Y-f;³^µÀ ºÜP¾îÜ‚ÆägU®¢rV0cn`5àÖ±rR‹Pu½ÀUȦšó¢â» ßüZ[Žª‰­¡Ä[ãÖ›rÇÅ! àfÃûÜ·&é…´²[!±\U ¿(}wáÞ@»ôÝeýx³.6¸(ö9ýÖPµÀ™-¦Q'üw©êXº>•f¸ùÃoÀ‡ÃáØXð7`‡Ãáp8¦·Ï„4´ÒMhÈ!mÿ@v‰ò€“¨¸¾òc‹r©}È šRO/,I^ gÂ*Ô<[|]•‰Z5µK阺mìGù¬Õ™]€IÎŒR†Te ò®Prb¹>ò®£¹Ö15(\.<ŠâbÈMVÁ˜1ÖJ¨{¯wô‡À(œ© ¾Ï@&,eŒTUÈj¨Æ(—c:¦¬kÚŽmÀj¨rÖ>Ý>U‹s'™AU$ ú åË5ÏšNeU…])ˆàâ‚øœ&·ì¥Y%G6Ä£ƒìåSª*“p¡ Ø^¾ÔÍŸI饗 µ-NY…G´Ú¢g-¾ùý B¥mÒ Å±aöòÕï¿3FAÏÖã„Ãáp8sü¬2aÊÐ8Ó/–$ä°‰Ñ3Y…B6ÙM!ãjé2Ì.‚€ñ^µDÔ1 `æ\N‡—½üKdwW2¹UÖp3ñÝž@›o²0ǰÃáp86Ð{ËÆÃoÀÀXÑ&妥_†µòS!Í©bÏÆ¬wnjÐlZœBª6³>zÔ4yµ®˜Ë±g—V¤¾‚t9ù‰9Lì½,Æ,–31ó3aá"´"s¡µÅGêf 1!G·ÔÚ'åØÛ'zC>ÛrÄr9˜±rð  $Ain~Ê™,–Æ0#8„&¦MrtP,k©‘¦ƒb ç\ÎùÔq×kæ_ZTeF)_ö•0Ò@¬Þª‘rå¾ñ5rÇ;ùí5·“¨,ÔÞü4Q1sùäøønWC(îz-î®òbfõ¨¢Ô•ß]å?‰Uwû\`Ž7`‡Ãápl,ÌÖ–5[³q8Ç c¶¶¬ÙšM¸-Ø-ªâŽ€¹hb+΄•=DhUΫÚN¼>ºˆí‹¹8dî$­AƦ˜ê›Í EékTn2ï¡§¿ÖUÑ_@ÛŠÌn¦`9=4j–Çèe/¿½£›úq e^˜ø§ZyuT›n~pÚAé»ß–@NUf®ùÀoÀÉÈÑØæjÍ*Ê\4¡ý£8PD÷[Ù µTësð§ ‹Ö$Ü$ZZ°>)´Pœˆ*¦§©~Tš,—1ó»–^L=£¹R ¦kSªŽQ/½‡i±5GÙÆ£©ò.åPaHU³55Q[J P¯7 ’w‡~rÈeÂâ?}ªª[껬cx&,‡Ãáp8¦€9~S‡ñ0U\hŠ­ã£Êé .” IXÎ.VåR«‡È´r*»˜lÌ®Š I“„µÓLf2ªŠTI¯^ùáê¸héVP$ÂQuÓÊ_¯òüh¸# úÉÜ¥«²ìæ\„.–S¾8^¨ÂìW|©3¿¥eðD3‘Ô»œ”Ã<(§,[ŒÅ-“m-¯É1í¥ƒBºÌvlµ“¯³ì«[ÉuD³N·Ì.»â‡SW³6Þƒ3íß]|Ðver’U–ŒƒÆ´=ˆ0žVÏÆ UéSØrµî.ì$6\ ƒ¤|±{ø]Z¾ÎàP‡Ì—º ³•ŠÒ)h‡Ãáp8¦€9~Ï€™¬Ê×oŠ…Ùd4Ò¹²ä§b™’tq%Ó”¯òÙVƒ&ÅVÒn)Ž7›«(IÃÓy³\1NÊŸ2(Ô:!Oæ|Ò·e¼²aR~pÀm–Ê”&È`UuqÕÝô™ø.­³hÔŸ ÄV1䈥H‹¹eÇÓœì.Ma¶Ž#œã XxÓ¥é—Z.4Éa^‹J)ß*}2¤Ü*É ¹õªÅr&qrê³Xb)³\ÅræãàT•öÊ6‘×1Ð'''ÕØ:{ƒu.?à/;à½1WlÕ+4{Ó®Îo…5¹˜+ù Ë>=[¤íoÀ‡ÃáØXð Øáp8Ž)À)è§ Ñ#Å—寅®üY£&ˆÏ)·Ÿe¬G”®ª gB¹rV±¤ÑnR»—jŒÍW}Îú˜2j®dšåêeš©»Òeï™Tî¤*‡`Ò«2áƒ[:kz/\®*lm*,ªê[S†„Êm·(„!•O³‡s‰3f§ÙD!îce°9»Iiûì2×4A¯‰§Y;Pªjb!åCનlí«4ÊÄk—}UnƒòUëƒkWeaÕå³}ò-„ï®± †fjèVU»’ïøªè¿}Ṕ݌Bq 7)BäÇ:8˜ã7`‡Ãápl,x"ŽÙ@lØÃ˜dcQ’Æ)ÈY.‚,0å”oLÓ8˜ÿÁT­x¬‘ƒ§YJB98&3¯4 —¥Ë {+SµÉpHîYŽ7IPç(h ›#u+“¡Š±ÇGt”GE |nA §™ýã/ø2‚/QÕ—±J½Ô5*ÿºa}ªÎÀ˜Ì/½GR’/"ð¡êŽ)çÊ™´lËÕ¢¤VK¥*^+Õ8Û²p”Z&­PŸª«°Zë³*C¬¢> ov"À.p.–<ñí]ÕxâY—2±æk4eY^XDAï›q›l ûÖÉÆ7[>݇Ãápl¬— x÷îݯ|å+ó˜Çlݺuûöí_ùÊWpûüãÏ{Þó¶nÝzøá‡Ÿzê©·ÜrKíˆ=5ÿHÿñrUkÿF|aøg¼5$šðˆüÉ—pUÅ‹Uµ ûËÊ›¬ÒEÒS êCR°\ëS³zÉ+’Û¤gÔ“êžiCR-¶XùhDµ”etÓ‚õ!³>‘Fv¹À:}Ð\༢ü3“}ìárõF5¨%=;/P$y5ÕD’#šÚ^.¬O0rFEY¥Õ+µ+ÿ+Œav¨ua^\\<묳vïÞ}ÅWlݺõ²Ë.{Á ^pÛm·uÔQcÛ_y啯{ÝëÎ<óÌK/½ôÐC½í¶Û¾ûÝïÖº—Å!)b9ˆd3è~·E1ô£›5H9AónPìèìHÔHz(09†!‡E!Æ´Œé"j¬†0_, –`2ÕRÒÊbɶˆ"˜pAˆ(º¨©Y.;Jê0†Ÿ´Z¬OÝí$‹©!ÆÊá{ ¶ò¬ˆäêÉ*=¢ƒ¦‰¸…g!hõ G̉-¿ùõ/PZ";ŠÅH©‡òdÁë…ׇÒ'_áïñ(øD÷ ‹5Bàjâ»´*ìGÿ6Èè'RÏ^÷*m'þ& Ó#¢îw~U°v;Ժ؀÷ìÙsÊ)§ðÿlÛ¶-Æxï½÷}ôѪñÝwß}÷ÝwïØ±ã²Ë.{ÊSžò—ù—¿ýÛ¿½oß¾·¼å-UƒöÂlØs3Td”o È[†G<FÅÃÅr“f’e·tmRŽ:q)ˆ–Ú_Bü#¤«d1ÇlËÅ5fAÄw3mÒ³ÆÈXSLÉ©; A#6 IDATÌzbcz¹ðqC±æðüœ¾XŽ]u %ÌL3u½2ƒÂ–Þ]êh2Ð1»˜£ ¥üLûÜw¡¼cyßÏXy`KÆb'¶I—¡›F&ŽµÛ¡ÖÅl^gû¾ÿÁ~pÕUW½ä%/!¢³Î:ëÎ;ï|ç;ßù¦7½©m+®ÍÑùmýÇ‹õ¿íxT¹4‡Ãáp¤°ãjºäêUsL¸ÛþóþÆGØÿ¿{Ç}ï¾äþUÕ`µv¨u±oÛ¶í¾ûîãÿÙ³gOáˆ#ƬécûØo|ã?ýÓ?=üÏ™gžù©O}êÛßþöqÇW>è¿Ä'?7ùÃXK1-çÚË©W\1†k„×ê˜÷r¯ìíx WbI½gÇQKj哼bÈ¥ÂÑÈ—&Y+˜vûÔ/•µ ûz–nhD¡ ¤ÌeI€ªUˆ¬­J¡¥Õ1„– (hÓKyÔ©¹ˆW1N¦«l­¦jÓ h®Oµ–ê5¬Î\¦ú±€T𣋛» |¹2IâRò “¬ÅÂõûÿœ» Vê2 p¯Çÿsûí·wÜq‡rÈØÆ·Þz+÷a[þÜ4ue‹Ì½‘4\—6²RStC-÷¦nô—,Žýœ+FùƒË¢±ØF…z}¢Šˆ¢X=©€~P4«öc°ãÙ0›TQSй^€"#ê*E~¦Å‚*«pLSv­‘j‘ÿ§Y.Õì¸j£Âì4°ÛèÚ(þto0sKÉ¢¦|ÓCèZ|ÂZ ž½Ðøò¡¨¤IÅÞùcŦžäW# iÿ4Î#\»j]xAŸsÎ9»ví†*ßu×]7ß|ó¹çŽ"ú¹Ÿû9"ºá††ÿùøÇ?þ¸Ç=îIOzÒAPÕáp8ÓO 4ñ_í k·C­‹8àÅÅÅg?ûÙ÷ÜsÏ¥—^ºæ|÷ÝwïܹsÙ¾ý‰O|âì³Ï¾êª«Î?ÿ|"Š1þÔOýÔ¿øÅ‹/¾øÉO~òµ×^ûWõWò'òº×½®|ÄÂ7ãñ£búÕ0j®8J¯câÏx­|SlØ+UÔ;šsær$L0XhËG'V»'²Rlҳν螱z$©l£±åRÎçb"þœµžŸ‚ÜKSˆU~¡`”*‡RäÛ\éïšj¬æe‹å‹©náòõAk‚G,wf6 ”;EGyùÊo'MOêcÏBP7L_Íì]š:ö¯Þ¤ËÎ+Šþ§xnS‚ÃWª6¾µÛ¡Ö½°°pÓM7]tÑE]tÑþýûO?ýôk®¹fè]Ö÷}×uÀªÂu×]÷;¿ó;—_~ù½÷Þû£?ú£üàåW~¥vЇiÄ( Úì`+êáÎÔ§)è •"¨íÖXÎl×Ì+† ÅâyU-WÚi\¦ A+ÏêÔ¸+kJSV•‹µ£Ä ZšZNœ*ͱ?°æ™Y­ÊÖÀ¢¥&ÍóÔH=à†mõáèå5׫âZ׬³u/lsrøšàŒZâá¯X[;/@V—' ›x¹6,½v;Ôºx>ø!|9>cXô x]nÀhÖ…Ë¥Çìã?ÛÆå-Ç6(‹[‚Æ+QÀÖNÐÒ6ž¬¥ýOŸ®ÊNy-¦Y¥–“Ü€§qùÖBJÛƒÍÂˋހÿ1> ·)Á)aç:ÙøÖŰÃáp8YìŸF.èµÃünÀ2–`CZê{ö*ÖÊ<ø.(ä4Ò›Z†)[²’#2¥>*õUTÑD!m:U6WžQ«—EÒ¯¼ZŽ)¦æ%:êÀÑê•·¥Ž¡X!§eêE^%ƒd1gifÝúJ£¦*¦lÀ:E”z·€™°>B$ÊK¥Ì¨*îˆL-2Q³~1–#y߉s9-צŒš8^È^£rÓ;¸(Àà*ƒ¸3ËU>hÑמœ1/ÅôÓHıv˜ß ˜ç“êe0dMB¯ë“„K”¼‚´QE‡>ð]¤—™°‹£†"Q—Š ŒR±õZ½Q1«"–e6.e¿[ùÅÕ´—<9Ex­);HøÕ³t`QéôD¨¼(vh÷‰±(y ÇÃè½9U‘\[Ki9z`mƒÂœYvPµ¶!Q…gm¯&¿¹p”T¡«ºÐ@=Ý8ݱâv2wè¨GO¯ž5úŠRy:0x¡Ë#á6æwv8ÇÆÂ¾ú£Ö3æwæ¶„ _Ôäa š+†^E:ó+õêÍ”S£Æ‘Jˆ2q>–ÊŽ¼£,ê”9R[‹$³ÝH¿° q¨åJ®^/f[ù^©>«3'dð•h¨²‘B”œ< xJ/²D7÷|FA$C8ÆQµÃb†Å-æfíˆ}Z¬e’{¦CR-Ç›|£ÉuÔñh©¹@9¶˜;q É¥†(µ%¨Z*m™%¨ r«^ª1V­ÔGçó»/2wömE(óö¿56`Åc9#b¹¥n¸Ã9:G•ä®UQ0äjšŠ0ï#Ý]äÇ'm³>€Ô1”–Ç\¾vØOÙf%¹\b}‚J,*É=¡Ñ=yÒ‡jœ ðÃHª]r¡je^Àb“hiÙ8Tà ¦ •ªV飊!QeÅõ"äB“-Ç铪²ú`9êq1%6/ä¨ð¡UQ·,ÃÒlíY35‡ÃápÌ0|žð‡ð^s³âÉL¾ÈŠÊq+Ìù”Ç‘z?ÉwS¡^4ÎSŠ:–ƒˆWE±_ áh-™ÛFq¼|È–=/^åÂÖ_3®ºÐMŽ(ÄFí2ÝÈ+6jÜSh˜7uO9’¿ãRj} j܃í9¾œÜSr0åå(ÃZ}æDºåò I'äI°µ–ZËeµåÔ1èXQ[Ce[n@eÎ9Ó˜’-«˜ö˜¾»ª~©»bÂŽPŽSÐó¼óLXjãÄÔ±Üq ¨l#'cKN«äX;nªVmiåú<»"7¯X¸zQÛÅ#PÏ<¯9Ê»3ÿ©Û€Æ<÷ðßúØpWërJÓ’{Ê,PHî)®;iÛ„VœãUUj"åÄ2v{ê!gæ\K –ÒËŽ‹ŠÊÜ,¾šÅ–Ë)§ ­år0ÅÊ™ˆ‚ÞëNX‡ÃápL†äp8ÇAGç‰8f2–àMÔñLXŠ m…q”¤IXP£-ã_u)òû(P¨Z)G¤I]HÕŠi*/h3MÅ'g ¦IzÖ½< ÉFmÅ”IÇ€†µ†ZW9®Å4ƒ+ÎÑņ µ>šÊæu a»UÆQìDxóg”¢¬-‡!•G±1R g2¦ÓûÁb­4µ¥mœRª ×éØ%Ë•‡LK2×[vSÓÄ™°PT¸ñjŠx^eXôT”³™ K…ë #e„‡ kQ†/íÅ?É[OüÖê¤zRªtž’c(o)e@Cg¦+˜ß'a1/b^J£(k…·T”NX|6FŽ1¬ÊQd±jËOr´íÌUˆ$ ƽiþ)É´”묗™™9_ˆtm2zÇôÆ.lÀ8µ™Ø'` è_a3—0î³ÕR!GÙ×áˆÙÕK>®¤5·Úâ¨-`‰×ß'è©ZâE˜ü. Ìïìp8Ž…}Ó8Žpí0¿0Ï„ÕJ‡<žø‚d IJ³‘Ô1äTCÇäp𔯸ß6ª8ü59Œ˜ä`Øà(Š|^vš*õkªr¾\ÑäQ ¿xGñ¨ßÈ÷cC‰‹7N©OW‹ òzÅQÙ|ÏDˆbìƒIÔÅAÍKı„ £È@"*{R§ŽAî-+GñÞ ÕTa ­1}I´ì+ŠóQ}s/˜èN1ö½é8U‚ú(±@NÕa I’™žÑÔ&…#f2|ëS†éÉ ‡ùÝ€—ØÜi zdŸDm:þ$P W”±VñA`ãìQ˜öåo$k*øu¸@пP¼Vñ\"zL3×Qz¡âw¥>¹S'FbõŽ ôá{a'×¹£ØPr_7‘ÛrqDîÌOÈè$ Îøje´P¿G‰ÞO´›Ž6îHìòéð¡`BJ“¬j5žîØÀÀ¤Io•ÔÇdÖæ(ÈŒ’ ‚-AGEàwršUaH…Ë…RŒõ@,T  Ø>¸á0¿°Ãáp86ö;=àî슊ä^zsl'QõcdÊ³ÉøiÎK±”ò¹‘Ÿ= ^ •«p#ߤ[>¯¨ß¡”:â³úDs¤AÃjUVbñŽkòˆë¨ÿ£òdqõ ©Ë3Ö‡C ‹‘‚Jj­®–ÔG½î5!­<Éå qµ$߀32ë*XS¥ŸÉÅÉ=jJ‰²Ô1'SgúRÎ]Y{/j ÎV}É´Ê7šõ)¤ QR*;/y>1pŸ® ÄMGÀ´[æ6Õ7ã/­^»Óƒf§YèìáÒçó»ïaH}šbE§/ÀŽZN‹Ä¢TSr|Úè˜Q¯IÏKÍZ¦¾‚)¢&U/Ž9s¨§¢¿€MZ§¢yƒê‚|Γ‡UDé`vnîâ®ÙW¾” çœtj•ºëLXê™  Y-·Ül9 Üq5±l´ (9JÛs›MɤÄò¢âxÁ:Ǫ¼féŽê¢èÌ\Ró.=M›{«P=-Ǭ£.ߊ)èý†äp8ÇÁGï‰8‡Ãá8ø€G¤l<Ìï¬2aqVE†ëhn¹*·‹ úØ¢hcűiL -@£Q­$°Ï6(*õÔ2Aš±—”oßBõF¤—œµÉð¥3sñY÷,›T$TD‰ÕkåW‡iõTØX–xkKŽC92Q‰ŽÚbƒ¤8³¤ÚÓ”)WÔ&f‰[éB¢ŠŒñ¸I[ûÚ€± ;Á±I˜ œ «0>GÉé`°“nL¢ ‡ý“p'¯&Ê`e¦©´åÓ쀜âp&¬OöÍÖa +ré~Îsžó¾÷½ï¡‡Z-m&"5ì/¨"ø‹Ô(Š–JN/Qº£(1úòO©4p¡Bv”òÚœäärõ¨£@ËeÕ~6Rôª«äÈ*RrŒ®ã—]­|ÈÉ‘m}JNL®‘Ñ‚ùC֘ߵäJçä¨UWß!ULi œP,–Œæ¸£(ÅÒ‰èŃú€– œ&Ú{*—=ÒèO<»`9JŒ”£¢¿€ùÈpËyÄŠ6à#Ž8â5¯yÍžð„ .¸àË_þòjéäp8‡Å Vþ7íIŒ°"U>ùÉO~ó›ß|ï{ßû|àÿøO;í´×¾öµ/ùË·lÙ’ïÒʇUN³•ËÕ ‡iù¢¤ò¨õ52º‰dÔÖ€-ÇÅr5†òUî§©R ZbžV¬™°¸¨H$噪fÍåˆCô)ŠIVRe-g’m’,\T\qê­‡–ÃkËsTÁÚÌÑôêµÍh›ŠóÁ dŠL N¡UÎlg¨lsW$™dCcJ|29eXWÛçÊb= o±ÿþ|ä#W^yå-·Ü²mÛ¶_ýÕ_}ík_ûô§?}å’×!„Kâ;†Ee •9ÑÆiw&Ù’‡£Xã(°q긮j Šp^è ÀÚ\‹ƒ¯´>£žJäÉ3Fe¢¶ÀAùsOîð¨.u¢¶£Ç2µìUWè#:FµgÀ¬b½)‚Ž*Ê¥—ŸSrH5'ÕGÕâŽx±ê5³^ÉêáŽ3),;”.¦ìfBØ/ÆmJ°#\²*ßʱ:i½6mÚôK¿ôK—_~ùóž÷¼{ï½÷Ýï~÷‰'žxÎ9çìÚµkUä;‡Ã±—6¯üoÚ“a^çx૯¾úÊ+¯Ü¹sçÉ'Ÿüž÷¼ç¼óÎûØÇ>öö·¿ýüóÏÿô§?½ò!ÖKŒbUþ®‘»”D¹d*c”‘3b‡¢tÇ%Ý®‰‚ÃT$瘌E/’I¡%œuПÕ°âTEcŲvJ½ _oZ©^«hAEáH,Xoíß2ªU-UFn•ë*ȤÀ*¿•Iˆ&4¹$xAË_Myœe”„¹ZZÓYp³ŠÅUNѪ6IùBrØf° )9 F,ðµ¶NÚC±™ãŠò,k ¡œÏÝjmI´ê‘)†ežZc_NAWèSð[½ñ°¢ ø _øÂ•W^yÍ5×,..¾ô¥/ý£?ú£ç>÷¹ËU¯~õ«<òÈ—¾ô¥«¡äš`?{”¯âB—Òä§ey«Ž­v ¾IÙØIn¶—ÖY~¼‰B´ÚQ@B+@Æ’Ù{€iSÇÒ¶m³æŽWSW!‘¾šjù®dB+eê#’ÓËS™¨{yÌðOÔ%ŸÄóŠLAJ‘ºäa9HiØT=±§®Ê³ß˜„Mæ!n|ÁÃ@;ÜêÌJðT{:… XÓ£d’[åN;HR¾U‹3O•w$“Q |5uf.˜8L|'É„Õy"Ž!žóœç<éIOzË[Þò¿ñGu”ª=þøãŸ÷¼ç­D¾Ãáp8C,z*Ê!®»îº¿øÅm;þ‘ä„Nøä'?¹ù‡ÃápÌ*V´Ÿ{¥ÇÁÇCô¨ágÈ$#÷`{*@ª6ÂÔNÆWû»r*[Qâ5b+¼—¡×1`¤±zš!WËž:D!P슧ىCšÉL2ˆ 'ü’úà»BÏ«Ìv—6[)*[Ù€û&MÒÉÆ¢Y1h2Ù ›*ª*y#jeU–숋Vl9€æJ¦j Џ1ð¦&ä嫽…Wâ• |Ñ•Xå„\®ö^ÆÎð…ÓìͲ`ŸGèp8ÇÁ‡|žÞðð Øáp8½oÀ³™ K°!æÉ—;–q¼*ƒ•Ìu¥sfÉŽ"V9mFQ\±˜¦âT%7«8^tJ †ãíõ4…×1…³¯=ô^~«½ô:¬®*e¼—õ‰»Ò!Y9üj*ÍD7q>”Ð*ÊSTάi\yæDr‚`ȃrTOç·²‡:€3TK¢JrÑM¼ˆ3a9ÁÄ/õ‰Qpª)Í©¦GÉȬì |^}Z.r±™Žf𩯱FÐË)Ã~§ g<(HœðŸ~ñ‹½ÞB”µ/iHé)Êh™ ¶"iü?¯AŸœ"Œˆ½ˆsUrÒq"ZŽø±ˆ2¤ê+­:ú2-‡äƒŽX½ —Nè#£­zi%¹˜ 3K«8¨ -Ö¤BgdÔÖ(ÄY…Eelk*ê†AÕ²X1,¢0iÕÒŒB©"4eãp&>Ju$‚¬{¼‰3ÚÊ*µ  Ö)¥:ê"D[a}pXšæQ¹ÂÃ5RœVêCê™\ÁÕÓlô™ ŠòoöüÅZu ÔF!Gð­RóF!M|†äx&¬ä°ÃPâ*O—£¨ÙR½ ¦)_Ue9^Å9wéÆrH-är¬ÊÕ † I¥dÒ¤‰šGqj'K¾àÚÂ劰hc „zUL;X®>w6CŸPs×eè=Çl€ì\†Ã~½”¶Ý9Ê´\çƒõé¨êEqž ØN°$Géuʪ6èßÁ‘$É©êx¡^ë3ú:Eêør)±JŸF^¯ öÇ$󯬼=õìÈwk—ñÈ‚1±`þc/J–ˆC=–‰”^‘ÚÞlLñ°"ŸÄ4cb›F³aU*á&  {Ã$K]…’-1#ÍÁÍ1ulóvÉêÒŽ¦1¿DåÔq™[Y2XÙ¼T€òE™°Õâ V¼ˆlŒZ}Ôß^ó»;‡ccaßz:Jaå˜)—n‡Ãáp86 æ÷ ˜gÂjù)(ß Ý•saH]:C¢Ž±œr š2aHäB‰ª™À)«Tæ©´zQžT¢¶šËÞ§¯BGMjšVN“^½^©¢¡M“ÓŒ&Í„ÕK‹~‡3aq9ÊZúÄÕl$ñ§¨Y5`“®Õ‡<¥4% ¦¶ŠGŸïkŠYg4k[Äù­@˪R¼%HD¥©c)§K·Ä ti9v"jÀl—O¤ K³µgÍÔd‡Ã1ر Ø)h‡Ãáp8¦€™zš¨΄5$G,‡ iÅͤ à1ÉŠªðø•™K*@èØqçØFº+d¢¥VÀ@¦½SÎÕR=žÚI-WßéÔW|¹Tþ“â#“É‘q5]#Äê .ÉDXqõ7ÚÉ[’Û+õd­C’«Ç—] ÑJÎN‘¼š!gË®¢¿‚lIRÛF(ÌC"L}¥j;Y«£›˜â6„3© V ì'{â}ùÉð…¹œtmM|®ÞÝP®<1TÀv¬ºây©„_½\. § {gË k~7àNÌ]5‰qQþ¸ £]£3=%sE™jJ쪌Q‘:ÇÒ±ŸiYJ&wì)(»Šüé?÷2÷–بPG¥¬êH *Úš\J"I¤²™eÔ¶×É"Û¨ŒZÌ”zXçFÎ:ÊY‡¨¯õ­ Å2º)È]_èðSŒTÔ/ƒl”–]~¢¼q –•Õª§¾ù•'¥2A0O0F œ ?ƒª*åá¼pQlÆfA&“£a:‚yÙôR©*‚qP8œ©¼#¨$SUo®tXï˜ß Øáp8 Kžˆc6Љd^YF”¯ì'ÚöDœ mU Ö=uì©§¦‘\è@0Ò*͇¢mÕËa¯NJàï òTz/‹gÑhæ%éçÈ)9ÞÙ¼ð‰q{v…º"Šªm¨1œ¯”?u W]™ DðD­Lh%{õ‚.ù û.& tÄödÊŽ–gGQl‡9qA¼æÊÔ` êÕY ( ZÝ]€dVµê0@Aã|[dfµ¢ˆÉj @tÛQ€iÏ4æC®,ÁÈ`U~CT_ë«<Ž!§T-$á˰ä©(g< ÛÄÕ+¦ û§u’×q5}Ëö¿FŠ5áCK¬¨òШㆺ^L¤‘úX#âHWÓs q'M½>ÇCsªrõ4Õñ|œ½Ì„%‰.ÖØ’;µsŽWÊQdYŒt¯8Þôc‡ û ’ã 2JJ<³› V|‘ ´‘Ûªz QrqeUF-anò¬- ìvjÔeUO/9.4ÅZnv2êØÊÁú¨bLW)1XŸ§šÍQ…ˆÜ´œ&´êÒ£`9±8–þÉ‘r:¸\ŽÈ$ôLa~7`‡Ãápl,ìóãg8m‚J[&ÝÂøºGˆ­ñd£ñãÕ/ æ,7þÊä[€pŸVêÙ—¼Ä¼꣦i 2°zq̧qÿQxÁ\~ùåo|ã'Tá#= –†Ü@ ¾K[éHþD9‘ɉ2Ç µ~§'iU¿Ñ¨)ý˜:i‚Uá¡âW§;Švÿ‘nY"^ª'‡©TŠDQÊ¡ ÕÖF¹I(3j”Ûa4rF-ÉågYé·:ÌÃ%õ ƒ•R^¹HµØ ƒ+6ò~LìS`-Cª£*Æ1¡YaØT ‘ö<›ÐJÕr`[r¹…8é8hÔ³y©”I85„~n€Eœ «O´´úàLXض҇¤©»7dÂÂÖëòh«L ­"Lżv;Ôº  ¯¿þúcŽ9fynDtì±Ç¾ð…/¼îºë@—·½ímO|âý×ý (èp8Žé£§°ò¿ÚA×n‡ZoÀwÜqÇI÷ƒý° IDAT'ÄÿsòÉ'ßxã{÷îݲe‹mÿùÏþOÿôO?ûÙφP½”Cðc­$i) 2T4ÔGÁñ6ÆoV…‘ÄŸÕ;J?¤n«ß‰Å³býW¼–™ãé‚ ¨EF©ªN_ÌÅFéQäYKì 2aEýÔݨyIïå–7–¹#ȼŒŠëeŽVëx9ˤ*o)óméì`\•™K‘ºœ±WÚª¤Tò8D½ìBÔy”÷¡¢”Ë3ŠP†¦( Ëš*îˆÖ–XNÕfZªõJ‡!UÕãj5h¡«<8»džÒ·—i\˜Á yb,Å]kÍ‹°‡1¬Ýµ.6à={öœrÊ)ü?Û¶m‹1Þ{ï½G}´jÜuÝk^óš×¿þõÏ|æ3W2èá© vÛÅnÛñ¿Q\H‡ë(Û­É<Å;ê¸#Ó#9üç^üh3²rÒRœÓ¬ i©;‚šW“äN"ÿé [¡€ ¯Ò'%°¾Ê¨©Í¨fƒI¢|râòùLŽ9ô‰?Œ$z¤m:E­:GmI±’ÏsŠgfÁi!j±üîR|~ ⢈Ã!Äø˜+nLž¬,w­jcº¨cDV“~öÃrl8^þUœjÝ¡²%΄UžÁJ‘â£Ô†!êÓ©·ãºäxùÊðÝ w"ÚzñooÝñíÿÜqŃ—üŒ¢°v;Ժ؀-ÀƒÃïÿþïïÞ½û’K.YáOˆw ?›c—Æõp8Ç$Øqí8‰Ä/k‡0†ë‹äüPüþØÿýÉÞ²ãÍ[v¼Ùþÿß‘Eƒ¥±Z;Ժ؀·mÛvß}÷ñÿìÙ³'„pÄG¨–ßùÎw.¾øâ?üÃ?ìºnØeÿþý÷ÝwßÖ­[ƒŠé˜”UýØ*E«4¿Qž `Nñþ¥êq$÷æ´»á(Áh.ßM„Á£M;´Dù´¶âeG©g(V>ÉdË#"׼퉢Ê`e}s‡CÙ•›18ܼ߮©Qºê1õ»ÏÈyÊ´ AŽ-˜ŠKS¨ –Ò™¹ôÒÆ\B«m’•QÕxSÌ„…äHØó‰9§ ÄŽRš*'ðð*ƒU!é=V=Neƒ‰TLséEXšÆžµv;TˆõK°êxéK_ú¹Ï}î_ÿõ_‡ÿ9û쳿þõ¯ó›ßT-o½õÖSO=u¬n¸aûöí…#†Žˆ÷‹à Xks)«–T‘s¡JN¹Ø‹’ŠD if»ÑáC‚!7QRÉiâÓZêÒbÑ4±ØrHç#Ó™ÂÒb+–Ýè³È78¬¡&TPÙ-¦æUuwe7·–£æ•¼»¢|èåcF'xU‘k§:*òSs¡¦8º˜FkõêŽåúı@<Íì²õÀrM¬Où4¡>áÊnFêw{bܶUm|k·C­‹7àsÎ9ç¯ÿú¯o¹å–ç?ÿùDt×]wÝ|óÍoxÃlËO<ñSŸúÿÏ‹^ô¢ç?ÿùo~ó›Whv8Ç:ÇÞi8a­Ýµ.Þ€ŸýìgßsÏ=—^zér˜óÝwß½sçÎeûö'>ñ‰³Ï>ûª«®:ÿüómß­[·þüÏÿü>ðªý OÓ߀É߀ý ¸V^>…oÀ[âøM ö†Cª6¾µÛ¡ÖÅðÂÂÂM7ÝtÑE]tÑEû÷ï?ýôÓ¯¹æš¡wYß÷]×õ}}Þn™ K¤¾ÐÒ°ˆ–Ò¿¼ê7±¡ÿå]ñ9=OýÑPÇfKú(k±Œ?éd ‘ÚQÔÁ´R¬‹’~³j iåú$3+™TÊÙ»“nÆ"hJqé¨-¶Ë^ÙÉè¯È¬žæK¦2a©ßeX”¼ª—µÆ‚.²GP«,frD5÷‚nä 8X»j]¼|„6Å}Ã"x«zã†è]„EM,¶ò•½ÃåRb+^ôñ›ôdoäö øÍu ËÀ›=-Ð"sÂêá‹>^®EJÈÉÝ¥Òg4¼^vqWT¼ªÉÕZ›W(¬€z¥So®àU5«žzqLu´Ú–¿‘—+PõÆ f߀Á 1& Šå„O½Oà·5VÐ:ÙøÖE&,‡Ãáp8æ ë‚‚ž ºÈLEg‰‹ÿy¦es €l>¢²E¥9]@¼²¨œG$¹Y‘Ò@FH´–DÜQ§ò®™Ä£yÉfAŠm䬣¤¯O»$˜v.§ÖY1äÃ7`‘Á£¡ _ ‚ šŠr1#g’ÄNf¨P'ãòÚv å;S¦hä±Ç"/U/AfJie¾‘^.,)»€$¹öªÓÈ|,* · ?Ówi-;޽‚‰±4#͇¬9Ô¡<ŽÅ꓊Ò}!•­(qÁ §â²ÅTÊ*‚¤wÕ¡[L”ÜÊ0Ò(¡U®% º{¹ìªªž‚¦ýÕ=Ö3æxîF¿áÝ@ØTæ)s„;/¶½ø©UQ¹!%'P?ÐbG[L¯3O24E"™`+òb/IËÞdÊ”ù“?ËêöH}#š•å’Uª©^‰mE­HÔ¥ôádU žß©üy_’&ažO*ÊŒ’=NÕF™ªsIn‡Kú  ñ©,ú<ͧ‰¥µäQeÊ4)«ÔF΃¡Í8£*í7DQlóÒ–¬¢ÞEwдÊ?–þ1U6q{øA”E5JQÕ8±©Úìñ ¶—rútKœ KZPÞÒ¤šJ Ú›Ã!TGUL ¡œ.Wä%®V¯ ë‚9^5Ìïìp8Ž †UvÆ2|&CHs“!• K’„(Ë­ÒL;ÿ¬Â¢D±5Ãò«¹(äó°2uG¢V.‚ ââUòÁ‹zR'_ÐQÎÍŠïÕUê6¹}§Ÿ'—‹…Ä2&‡1#ÍûÚ£y܃ZxC9å«ÌŸ˜îÒE|ˆê(lIÊY,–ƒÏfX”++~*¢Œ3˜GÌñìp8Žv8‡c pðŒ`ïècè¤i¢“dÕ&Þ-,1—é¾i#ãÓ’ÖÙÄø—†º%™’b);p ýfX|Ð$¡ˆ« ÔwLì€:™ÁJ×3z¨1‰±@”” šâê t^8Ë3hô¤MZx/ŒšÜ—ØØ_}flíʵXxAKÚY‘ð:ŒM.G+Wä¹twWîÊÒ`Î⎌>QŠ*D½dQ†$3a‰è¦–Ùn`ÒƒÆÚ¬é”Ûn‘Q¶ÃúâHw”*â³èm@:¸žD• ìE›ÁŠ«§2j©Ž}º䨖X,—£2añb!ê{¬gÌñÌ~¾b'~ê"¯R-å^ÓGâV¼^ž×±„…FÄ ‘ 4â÷• gâ6×Hd M(ŽEDŸÈ¢:ÂzQF¯ê퇟ènLËÜÈå öÃÀtã[¾(Zß.ŸÃÃdX”%½¯“lœ*ª„ \=uâ}OrÓ•bņ#rô6ŸM•0ÝFœ‡ÍU´º*ÆuG•¬ÅÊ:«,²!mèÕÏK¹b2J Ú¤±-Y›‹kôAbkä“9R¦ª\m¥®H”-‘A]ú¡‚–…Ø—o²à™°‡Ãá˜æø ˜ùã…(òK‰À’U ‘ˆ×ejg-»À—Wñ™ŽmµOd™•ˆQÐÊ…•ø“lKŠ&’*d°Rêqm 2)q#kù |/sk(²š$Ã¥“ö€„¶J=1ki4Hr¼D±•/_A?tª•¦J¼v3}t¦  ¥bÌTôW#_.@¸—}Aw›d;8c/¨c’ù4Ô›t”Iªx¯žTæ{e1HÇ )T\ARŽÊq><&äÈêTG¥|6õUE‘J[f3X W亂Ä{mê«B*{²0¤Ùrœö ˜h™}á4ÿLD±¿IQ‹Ô Ä]/lEñ9mV̆Çô´$· â´" %wÝÉTSÆÕðÿ«”Uu¼$Õñ9Ãb †oÝj_Ô)å•=› eÒ.M¢*}x±Ó†€dDÚQTøl/ŸfT²-•ÔS<°PlØÕì´!@\ ¹Ú$,oÅ^ø"( B¯žBäY]•#ÉÆpR :C´ƒôR9n6Å]“áTœ,s›Z’r2vL1-u8“œ&ŽnÂù­@G¥êSE3¢üÚa¶6`§ ‡Ãá˜æø ˜=‹i/öväqo%cji|QQÙ*uQ§¹ÇF¾²4ìSû'KÎÙÒ’üK%ê¯bÆÍX¨FŸñRê@Y’‰ÃH:O}FbMj'¬£—NX\õJ×è\Ç —UOµäUJ·&Èu5hRª.Õ1•9ËþäØ Ë ú¨ˆä$é2Ô±ñcRŠýœm‘‚Øéœ>Ar¡H%Æ0ÀCúÜDʇ Ú¦¾‡:p±ÖFÑ ˜vÊQëIõðú”ao¾ÉÂoÀ>FÁ°RŒŠ‘D„@ bÍâ@lp¼#‘H°),-°rˆM3ÔP2au"*)nbìyЧˆ8•ÚÉžÍ0ÒG¦¥Q‰±ê"|H1¥‹aÔQ°ùtn$iä¨ VqA>Hçê aR¬Q'ªri‰'ÈØ7âË"Ôk4ÓN‘5V:´bÐØ‰½°‘³P”x+#W•Ýéß×:éì-þl&,ÁlË´bê™$ýˆ2«ýÿí}°\U•îÚçô½É ’(D áa@EBQQ°˜ ÀeAÔQÏA§¨©‰OFæÍˆc¤¤Šj¦,3êÐAKŒ ‰” TOgB‘„$J?B’Ûçìýþè¤{}kõÞÝ}ɽçÞÛë«Tªwï}Ö^çÜîÞç|k¯oµ¹ L`åã&¤¯:Ú·Z Š5AAkÊ7aGö&íé«.¶:Ø¡”Ù´¢V#»T ¦„%ÑÇ °Á`0&¦Öšm °Á`0& lž"àJXæ ´šŽ`‡«sØ5s5ØáêjhÇc::;ò5ÞËj%KNÉ]΃¬%µš:,*Ìçì:@%¡ ™ä–?Ê,¯©PÃMÚ5%ÄÁšc·‚+줲…²§ c ]£dïäRI¨2Å<²Ê÷¢‹­ÎÀE å)´CN$ìÈ 1/´Jkxd’Tð5ˆègâSÁ/æw‰?.žàöi ,‰K)a9üÀß½ƒ0‡(ÔSQ#ÞLÇnÓ:Y"¯&¶ì˜>”¨TŸÈJHV‘(ÆLìRSž5K§5ªŠd³ÄØmBÁJÌRàyq;âÀ¾D/À\ß Eûá bd†_y‘}"ì$µà§¬ñå+Jà?è\JÉS–ÃâGII&ŸÉ• kûzïðœ’v‚_pTŒjír˜Dâ䦰L³i- "úèp›WÙDx.-ƤÅHÝ‹ü#ÉMHÂ,Ü89À.—2+“ÞzÜk¦·žÅìHoÕÖ«–?¼ËÉ‘`'¸àÄ!6¡ŽÎ&"ĉp:–¬ó—b[åt’)¼5]ÚNºSâÀt (Yy+DGöAW?OÝ6u\¼Ë‘]bj)aõñl0 †É…©õÌÜÇ 0WÂÔU"‡Ÿ€]-¹‘>þ"§Å5¸·/²ZsVG¡ˆs³9Þ@.Ã\w$NE*Q ¸S·ñœ MAÕ:ÉÜ6_‹Gy ,ÊÈgŒ EWƒ0%¨n¥¸·K nü;ç,ž€Eý]<ÉP6ŸIðØ\*`·ì”Rëʉg\Å×»}®¢èe©~ñDŽb Ü ¿¦Ä³ª“ñGIAËÓÀÁúÛØÝ®f¤å³ZìÈîGª…š• S É f“JXôñ^¡eÁ)耽šôN›å.E˜—ݘ.Ñ%¬ÒAZ +Æ æøb} FSL!ØßÒ™<Ê)úÌEÌ4ÖcÞÜᨋ/ÀÊ#§¾ÙÐDéGˆ\ +±à‰ T´ãuLÈ´û .4üyqŠJX!—ëq ¢p½Ãä"A¼‹b ²¿DTàÎ’j"Œ+Oy¼’ªä÷ ?yx G÷¤àe²&G”ZdÁ©;Õ(q84¾r‹Áj*Ä;;®¾Ñ›´$‰ªIføsÆ•°´HVO½­)T—¸1ì6-*Ù”ŠZjp뻘L êS«°)a ƒÁPúø 8¡„Åî#¥ô–ôs÷6 ;®Õ+EiBŠWs¤ó.Çjî^Ï:‚í5þb{Tä†Û %‹…üôP*8„E J¥„XÌŽ`§å.'Q$ÀGývRPò[¤žÿÚ[T­¸«‰èCê‰ÓKSÒN2ú‘xLËPX¡eIIz9 (ˆ§-tA 6qÇÕþäî7E'¬¨—@ù¦@$ê w¬Oœ8/ÑL°Ób¤`’ua üµˆžˆ|tÖßÝÈi޾æDZë;L­'à>^€JXBúÊc3¡„U*;ûš”¢ÓÅ¢k<E­AˆØÕ[G: ¹ã’U¾dÓÔ¨À@o]¤1;%«| vA—9†–ciHj[¯çZ9þô‹Zèk`•.ùîòõäxíŠ:[~«ì('Ð˸·¹ÜÂ-Š:å[™‰e“y@'K0ÿbO;®Öy g ,a‰áµ´–ƒ0”jŒ…Ùh¢I’“—gM1H!QAù98Dk’96’ÚQà3ŠÃÝS¾üè¢NÅ”oÇy³P“ò×BÁ*­„Åíx¹x KcÊŸ˜{iE­.a1`ƒÁ`0*@ïÏ̶ ƒa’Àò€§-•°„‚Õ ërPbÁe(Œ•¶#µÄ~\n'§ÀøNˆcÔ™2*XÕa—e…ã•h…ô•¨b4)JV˜9´Ê–!Üé\±PÂÊütB^Šûíg²)*2ÎÇ&"]n fQ@;ñ”*è"XA¥W%¬J؆MÇ ÉNž2~š(ˆV"u Ñäœ\ ñ…¼ùù ”£2— ®{øãÊy4×HT ê¬Fv“vtè4ÚLFUåæá¤¢V—µèI)aé\£˜ÓuD¯Lb§¦•°@² '-»¶£5³½uüóÕñDL «jªÆ8 GÄnã_yÙ+ìˆàq⧃’f=úâA!/]d5‡Á? M†#Ìw–™"˜ŽÂš"X:H"Ï•åçhÀ[,m#ìè4—®üQMXS{1Kš­÷;ÑxŸgƒ…?¾C³Aå†%íÐLÏɱ۬“dUÔ¬ê‚ãâß(Ñ›)‘œ´£ƒÙ±`m3êˆu\y*#—s&âëñ2«ÚĤûE «ÞyÈ$B/ÀƒÁ`˜\(;™Dèã˜+a ÍßDâJV¹2ÉA æ¤7™)ÑVn–äæÝnº¨Á]sr(˼ÌYâÉE°­Õ¬DizÇK>älCg@³eꉩ‘4Å'õ|t)»¸86Å÷'Sɪê¹[%NP£Ê!U›”ÄU PL 8ùŒ2îeBˆƒ(j`؄̟z=Tl WéLâS>L³®œú&šŽâáB ‹Ú| K~›”oü(RTv‡ä¢Èº7õœ<Ð'‚!´—-j F³LôjA+~¹DW‰ ,¨Í@ñ‘JßJHh³w`tJXS ¶5¾<í'Á&Šb ¤@SìXì’JXh'èIyW]Ü,q µmÈQàËO‰ßNž¸â(ËàG¹äGÿäÔQy CÛNܰbþià³`šX€£¬é¾7ø¤5îj] É*¸×òhØ«õ/fG(a‰ @k7ñ¤7çñ¯ ²±ÅYã¢Ûú,Ê1ÃC¼¢$†Ãø0gþEŒ@'ŽG{S«Lêi%¬ØHRoÂ…ÜîØ7+—Ø­¸?=c¶u4;MJ‘¦0[Š,©1VÂÚÝyÈ$‚)a ƒÁPúø ˜S¾^í^n¾&ÜL(}•%•°ØM¹óI;N lQû¦ó¸ïÚ«‘øÀ€û@’Cü‘.Í…>O@a¬Àž·¬DëÐPÇAҤ‚òfsɸf™|nkª¶hÁŒ‚'Ä;kÉ¢}"|H–Ø|’ôV6›f%k›$¨ÅðôS%‡kÛyóžPÂòIå©,®Á$šé­Œi;ëøv+&¥š„» #Ó›½ÛìÃŒx.CɦKhT¥íp÷¼º°°i<9 ô&7w‰QhwL`ôñ̨ŒPD­¤V¦”°8u,ê§wS³t¦£NV‰þ «Ä 9º‡b†Å@MFæš/‘}ͰRIY V\'x˜òLYR)µ„ÿX¹Ö;\1ü€$?á‹(ÊÚ³å9`q¥Ò4§ì‹¤V†JXXŸXPâ@e «îär(Ê1!uìØ‡/ä ñxÖXÅ–Nψ倽:&Á_ST›Žó‰BûR\ø{’ùê’¸AR$ªd€Cû×m›>ÞL(aéæþRÂJP¾B *Þwr@(a%NÓãÈ2Þ¬'µÊ\]bj-ÀFA ƒÁPúø Ø`0 “ SkV/À\ kcÀe«é¬2 åÖ°Y$íˆà1§_:–þ°5W×"RÊ\9z[FíQ1ÈbÀÎ×2”Q ƒ¬%'N=RÐŽ‘}NRÓPí ”ÁcP À¸ý›!Wå)ã!á63Ü Š®ŠmÏ:VZ°Á„iH<(`Þ‘€°ãù¤5¦`åPÁÊK¾tÀgÐÇv/“L%ÊÛiQåY [í8ܦžñ=Ûœ»¦½ì}$¤§£.ٌŀuœ2Q5hÔ Vb—¯L bv´ôUl¤î-ÑÛDºŽïÔŒù2ÒJ ˜d‘†„—KØ)ðDŠÈÒ,*aÉf?¢`:õ*æÊ·Yð‘„A_ü® âñ¸¯ŒëïÕþ4_§·}¤ý‘“²ŸÚð¼D­Gnù ®³SmBîºBu'±w *ö`> ì²w\aæX¢˜žªý„øŒ$¥¦ô,-`Ú%ýI둯b„D†c…f¤ÚxÕ|#•‚'ÎEö&2}õf2á]·Í¤f–h&J0é®èŸKõŠB¡bF‘"&-GWŸäyu `»H%flÀN8©ÃI¼«{X5$ƒÁ`0*€Õž"`H‡wþœ¦”A¸ÛÕy¤|µÀ^G¦ØkG(ae8¸IA´£ýá7èÂ&L‹ò5ö Ô£~P#$`[*ZŽ\M’S‰yGÄo3ªyÆ‚e@Õú¤¯\<³ˆˆç‡sòÍ­Å(LJõ´ ÿ>””s>6‡'iØ/-(_¢œ›-‘ÈÅä+/¾K”/<{ª5«üzÊ=’˜.ì•÷mžþÚSÙY*‹ÒÙM€äœ;(XÅ)hÍ9'(h>Ø«®Ñ¥ëôÓnp·JXɺ—Ÿ¦°“¨Í ©ln'Ák;eÌÛäȾD/Àl;{pHùÆ•§„‚•P ü¢óðp 57Ô/‰ðaŸÙ@˜°$Ÿjثϋÿ`Âp¸j¸ÒÁzƒ V“”JÆ$gb•MüÁæWˆJ¶;”ˆ J8«Jd˜ßÜò' ‚U¦*Ì£ U&Ò gá]ܽ\öz uç!:u¨¹}§Y*Z¾•m•Hü ˜M”K}+°“ˆ5Yi—äNCÒ g”gî…‚N4ÓxE­xq=°—b R£ªëb zÆÄ:I‰L%P©$¥è¤É<¨.aå ƒÁ`¨S뙹`¡„°Ù|MJë*Ñü Ä^± ZL‘PÔúVìXQXuþÕ 8¿9nåîå\ì†m=ÐáCJ‰€]’qåLi ,Èg(x2óH,ã(n‡’†úÑ,Ê©ŠMXâY!r1iô!Nt¬ð˜râ“?«MW);çŠÅqÝïsn×l«©ãîíˆÝË]’Õm›œSM˜–¬[¯»÷'ÁHsѱ´VÇYºTÔ’¥,âŠZ‚-O|`°xŠ€+a%”§ÄWU(OHA(;œ:NÛ‰+XI; =)a‰MÑ`G¸—»ÀBÂõÜ9ödR`Աǟv_gSzIiºbÀœÐ× Và@æ6p³–½ vE„ CÔD”Ãy,*Õ'bÉâo$”°ÎCÝPôÉD&J8P4ƒÒ·U•x2XžÉû§¬é¹PÂJ×\B†<±z v:É'Êè&66‹‘m{S¤ía,þZºiª–7U›fƒ…òTšXöí^k³ZÐ*Æ$§¬ ÕB]Ü7 a4û §mJXƒÁ`0T€>~6 ÃäB½óI„>^€¹V]Ån®8¯Š IDAT›¯RÂbŸ7 ú‘+Z½2–ì”O ˆG’1`á^M)aq;ñŠŒ£¢ o¹§"¯Ái2¦T3º"“dz½×AѪ̎äŠÑ¬@.2~¸ulÀmØ9ç\‘¦œ>˰RBŽu˜EZ”‹^ZIt—”óbe†Ñ,äá>ðÆîîVì6IPKÍ,Kq%Û4즊^{ÉHsÂ!e2 HOÊ»F­„UàåJ(XÕñ4 ´SïÚN¡²’"ÂXÓJçŠQDtG±qz£`±CÝtQ§ «Ø ¶}D#@:$%¤x3$½Ç*ÛØáMˆ!6¢}‘ev=&ҵȉ]W"´ÜlŠ”)Ñ”i6"y†m ӎͦÔö(¼;½ ¤®,œ¦K­Ö­‘6t°Xh9$FŠÓ}žù£¾ô^³„ÙÄi2v›Ö¥âƒ³Nr$rŸ´‚Uâ´´ŒÿÌ:…ºf»?PþX$"èi÷ÔŸ:6Xû“ˆ ‹}–qE-×F°ïÐÇ °Á`0&¬ÃÛM'òs@ K<­ˆ´ŸZR ‹0 ‰w ò¬†iQk)ÎLåTkÚqJܽ\â–VßuœËâœö%l3&nÖQÍ1¾Ú“‚¾u¹êRÉ" BÐ uB¤°6Ÿ­$±,½šÇTÂLqú¹L À9ðIi]¥{Ó^€…¾•Hæi¾vH2çH2S/JX¼™!¿)`üÉä VPë*Ã&š’v œThfA†žµÐÛ‚´*¡N|šˆ¸¢A]Ê &/þÊ”o@m)ˆqòÂõA*a•˜Ÿ“ é+>¸¤2VÇÞa”—Ê\Ó”y°”°žfP4¥—½PňÂ;Á]gHŠu=#pØL“ÅA®ëIÊ76’’\¨æx\¨n†¶¯µ*Úsï5*jEMV;Мs÷YRp_×ÉòjŠÄq;µ|€f·˜Z1à‰’†´mÛ¶‹/¾xΜ93gÎ~üñÇc#×­[wÉ%—¼ùÍož1cÆQGµlÙ²mÛ¶§«ƒÁ`¨õýñ¯wŒÑ å êõú‰'ž¸mÛ¶/~ñ‹3gμöÚk·lÙòè£Î;W>í´Ó^zé¥óÏ?ÿˆ#ŽøÍo~sóÍ7Ï;wýúõx`÷3:çèµNÜ "¯;9¯i¬+Ãú»5Ô–ÀÍ̃HAs;XÇW(vAO‹úCDÄÍæPO@–+ÆÓ¤é¬‹( vkGx›ÕZŸ¡Ì…œ}ÀsòÐ,jìv€ê|Óï4iÞ-gäÙ•Œ²vjhg:´X/¢é,Øà( ²*Ül .Ä1Huîq;¥poíd`g„? O§=›ÌޝÅOsFšel¿Ÿþ;u´SðMãÓØåò{¯^ûÓ¬©ËžÇO3+ÙãÇʯbßl!öÍ"5º9Un§ìd–?tîANu²¦ut€?fÕÕö`ñÇã»àfvõ%¼£‘8å+N³®.?Ma'± º.Ìbß‘øi©Ó |´su¶ÜxlLÔq1rÎÑûcÁúNo ߨ­P‚‚¾í¶ÛÖ¯_¿víÚ¥K—Ñ{Þ󞣎:êú믿á†ôà[o½õ-oyK³¹xñâ‹.ºèŽ;îøøÇ?ÞÛ¬ì/w/³Q”°JTmÌ-µMЦR)X úÚµyM$wõ†Ý )‚ZnØ’Ï:àwùjˆ; yëÎéhY9˜(ð_p^ ©”JX&¼G;uHa %Dyu‘%~Zð9À"„vxªrøÁîܹsÍš5y.ëçuÆûÙghCŠmM¡ù_ ²‰„†²†ÈëÎfõ,޽NŒÔ³p÷|”òhs`$(Þ~ÒæWU%p`ØRÄ€aš@®9XEy…‚U,–Ýl¶ìàȔʟà:γ÷•œÇɑ⚵b® ÷TÌVk¾¡H¸§·÷ŒöÞ%úeoÔ× D J;)–”Nûióé‹ÛIø£ó b¹W²šO§ÓL5“3rt¼z±‘úÂÆ”Í^Ní4å®®&ú,p±ý~Do î0Ü ƒ|ôòö óO:¯/iì¯jB,À³gÏÞ±cgûöíιY³fÅÙ³gÏùçŸÿÈ#¬[·îè£{ ƒÁP5ªØ„5v+Ô„X€.\øŸÿùŸüÇ{lÁ‚CCCmÇŒŒ|øÃ~ðÁï¹çž%K–ŒrV®„%²ž”°8±LqE­x‘Ü?Ùf°‹t ɪR•ÊŽË]¥”°J4ïÍϺhõ ÷(‡=Òä2þ‘Ëp{%WÂÒÛ•tÀ<àß„r¤j‘ã-UÑÎ$çü¶ÖSMÈ}ðN/9^xbpÀ9gø4ÁL²¶ƒtvÉ(RÔq³ ÀëñéFÕTÈ”Œ‰Ð Ùçzîå#•؇·JcÐÞñkÔêÑ•áD·Pf$³ ²ð).ªo•–¾Jq×Ú6¡¥J7»dÚ%•-¶^+ ºù7ì´0‹iQ·†—ÎùÖ¯H_yçŠQ$Áö~ÄkÇØ­Pbֹ瞻qãÆûï¿¿ÑÜ´iÓÚµkÏ;ï¼¶ƒ‹¢¸à‚ î»ï¾»îºëä“Oý¬eë_¨c³ Ú÷/ØU¶ºzê•]%H^,”øzù®y`èÅl‰vÀ¬ !ãÿ<µþ•MOŽuåø/ ì_I¹gÿD¯§ŒõŠ®ÿ9u`{Ä¿ šbõûJÖ ³ŽØ?áaoÀ^1ßqìŸv€7Å`ÑKÂöøŒNºJèÚf8UÑŒÙqfidï4ÿi;Ýtiz~l¸Yé­ðÞIˆMÚ¿Ö# '-ÕÕkmYRSð¯9š !`g`3D»zXU«Ø„5v+Ô„X€/ºè¢E‹]xá…ÿú¯ÿzÇwœsÎ9tÐW\Ñè½çž{jµÚm·ÝÖhþå_þå~ðƒ‹/¾ø÷¿ÿý÷öá‘G©Î}ƒÁ`0Œ FöÇ¿1v+Ô„  î½÷ÞË/¿üòË/9å”Sn»í¶æî2ï}Y–Þï½oy衇ˆèÖ[o½õÖ[›–-[vóÍ7÷6«Ø<Ì©,Q˜oWΣäðÞy“ï^&Ü®°)ˆî›ÜNÀ}Ι*·À›eÔÜ º€ÛžI1ÒóË%6iÇý¡Œc¤=9¾[Öu¬·ãr)æ€"É¢JCïøö`Q_/C;©m½J¡Âá°»;Ãã»_àDÔã8à‰Ô¦0þ¹ˆîÿè§D/~0¡S”O²l¨âœáO”¤Ž-ìDÉjÕL#½êMuñ‘érźDâÀô,>ršýñq³é²Çq‚‘)Þ]ž³Óc·BM)Êñ‡sŽNb'>ˆ\À4¤¡¸ôcFÄ$©†ù ;¤¥ï…âf…‡î ;Âí^—þÔ’f¹´?h§æ¢’Žü4ÐDeÊœÊH¬+ÉÆ¦€’ÂŽ”¢ä VJB’çü…i i©%£v¦Ñ.ÔÕ½¥Ü9J;BB²{;âr%ý!.ùI; (…¢¤± h§šˆccgI˶À ;Ú,?ͺ2Ëzù‡+m§Pf¹{ca'¨«Ç.—÷p“]WW«uOܽ€º“¢|ÇþX°þïDYø&İÁ`0 aÕ ƒÁ`0¼Fôñð«­—\²ŠD 8ë¤`•ã]*Xåv ŒÈ ùwn'Sfù>¥`Ű6[BQK°cJX"z–a‘%´SæEÆ+´¶C*ɪ’7½Œq!æ±d,oà…È ®üبJžÝ”ñ,)G5n§†Aߡюwp^ÌYIacÀ%˜aZÅ­à ”¨„åÐlM†¨3Lãg©\ü×Ц£ªCžÝ+a¥Ó‡|ÄŽOjTuLÐ%2‚ÕÒ V¢«@;¢ŠQˆ9#QË;W°¿B¹FuèMWCêÅ'úxfº¹ïg§ÖUdd›ÞÀì讄±]ƒÛqÉuSü²q$fìh–7Åî–ôHp^lM"¦„%¤¯ ©j¿‹YçäÊڂ계냦˜Q쇊6<–wìôj¤pÀa·‹ØÉ„7êbBþn×îÁeW—KËf5û:)O%zaåîZëªé Ÿ¥Kô3f'=cG-q`—„ÔÕƒ~½\§j75{uñ(lºx/„Z#"Yý [€ ƒÁ0I0š†}¼s%¬ ’‹{Ír¹ÊÀÉ<‚›um^I+*ˆÚ¸w0·“ÇGÖÐ=1X<¤$”°<šÕ5ïeISÎáŒ9¾¿T~á`Ÿ·j8òªJA볚Õåí:±^NœBÁÝŒœ Ž±¦BÆó¶<åüýñ¢¬o†½œ/¥ž^ÏDré@ùæøÄÉ•°œ¢Ó±ˆ‚Øë¡…±ÚÓò¹*äËÈ µÉnÂãԱ딤”PžvŒ´CN5‘DB«!Álw*ÛMìQŒ4éQ +6iG%,(ë«øsÎk±ƒÒºâœs‰úVõúý¢„e ð¯TE­CÔ1û6†?f’ÓÉÐN‰Ô1Ÿ1¨í||–ÒÀŽðÜá%üH^ðè97«gaŸ”PâEàv„Y’eqàú`İ„gæñyåŠBñNÔgÓèD[~äMŠ’ž\† ëM‘^ì|Ê=¾ŽÊE¶1rÅšiì@PÊÄó?/"Rüy[W›ït>P¡ÇÛåàì5p¼‚ Þ¿é[‰¸ÙŽ3"›š4q`OvJ¤Ž»œ±í¤ñ.Øï€Mù=$#}?A2*E/ÀƒÁ`˜\°MXSBߊ“Ub´ÐÌ*ñ@ÞôI‰¨„V¦¨la¶ùš’þ2ÉA cÁcR|¤´òªÉÌðÙò@Rнߏ3†S{PÅ©ÚLJVåpNW–À‡Ñ „±Ô~à”ÀúÓjfØ+ªÊyÍ õ Kìµ$‡q²”ñjÎ"ž=;=`ʧX¸ðx`’d–âHV_è¡Ùõ~étoO¦wS –»'«„VÂ4•.{ÜýÞoŠ2í‚‚¦¸ôU£Ù^€ ƒÁ0¹0µ¶mÙl0 †I[€§¸)%,Ç^³ƒdñƒReï)þšOv—åBTÁ*-n%vw:RY‚æþDÄ­öšå5„ÜUO“çw¡¢–øòH;%Kg"˜‘2Wä@¦ã®cØlSÙ¤FVMJXD”1Â,îœrä£yPDy)u²øi¹Ï™öÂN†[Y\±à÷[YR–¨HŠXn~ø‚TÔ^¢†ÞÍÌ“U vÆŠõêRðéô!a'DìèŒ 8íxºN:“§£d•ÇI»´#ª/è^žm•*ê (q5)+¢Àâ„ÖU™Ô·â©G^if•£HC2 zŠ@(aqý¦¦!ñD#Œ‡H}«“pX3ˆE\E$)‰, Zîà€ÈÉN:´ÌýÂX¼éÕ`qõbB]8‹ˆXËI…©¨Å3^r+SÎ ÏÖ-OµÀBTJÁJ(F QFž/$äéCcÒ΀QŒ¹’Pæ‚0¸ü’Ë!fx ;¬¯ÃLÍIùk"™hDÉÞ@„50ðÆ0‘>¤ÃÇifÉ‘ú~›¢#;,é8sÂN²™HCJçéIc½ÚŸ„Gñt&—T°Í2Þ I ­þD/ÀƒÁ`˜d˜RbÐ}¼ó[¼ÒË•°§š©ZÌdE­}÷xi%,Â'WQª¸Y!’å: uq;¨`Eâ@Ί“õ’…Þ§ŽãŠZb—xJQ‹”¢–`ïPJÂÉ]¾Í=–7¨`åÐT´ ²W<›Š'ò‚¨6ï¥H3H…/Ù"z|8VHÞ!e)îÉÎt»ù¾¬RÙ‰sŽÉfu<0AAs™ªt]a±?Y(Xyô'M‰'¬¤0V|ÆŽåŠî¥FŠ””»J*Xñ§Üt/o é+ïܨԠG£Þ1aÑÇ pÉD…Fà:¤¬„´“×L)Úát\ÁJ„$ËKJ\pÎÚ÷•§]!OÖœpxl»ØýŠ,ÿ@xõĤu΄߯hr>ü]3·¥¯T­E¨õ¢3¡“•·Òþ$'¤¯49œè…%6©„%àÌBX7©`å;)a±[Zyà”z˜úx6 Ã$ÔªÆ`JXƒÁ`0T€~~fRXåtàFw ¶^ %¬L)a¥¬¸¢'Žr4«µbJXI]aV(a•J ‹ßq 5+áÞ€RØáî9å·Ã‘VÂ6sƹëZV²Ë^w5$N[L²¬Ê(ãœs.£íB «ä½J «ÕìI «Ä5oÙ ±Ó³­ ¨^T²pòÈ9Ã_WQÙ½Û—;e7orRÒWz«u ®Xï©¥±+´á¤£½^õò× Ž·T_"1862m'¡„¥G é«{=´ZŸ-8j%,¯”°x³kL)ÞºŸ`ƒÁ`0L.L©Ø(hƒÁ`0*@??·$Uœ£Àk\p¬Â¼ »÷(jÈ{•-‘»ê 5¥íÄ”°®á•£Yî‘J ŠP¾RQ«¦Ò;¸Y‘³ÄÎÅe°)Úy•°ÄÍ %¬~ºX×>¢$´œ1¦uEDrªBÁ*ÊN·k ‚ºeGÊ*èl‚¯Nuè©t„  xº™PÂ’e`R¾P°Š‰[‘´ÂX„Å•=ªgàÑž°èç¸J øX¼1 ;ÊœXLå)v¨ìBrXüä`–~ppÈ`/¿$‡ÅW^(aÕ¢]Ò¥ì¡ÌŬBjŸŸd’v<ÎHH­Cl”Š<ãÒN%ä •"ϳ’J¬b”e…4$n5s*Q "% åU+ITUòp ÔúàÅ‘œ¤ÖE‘‰R%±ßA å&(ñ4wiG;iö{=6E´nÍ&«ˆu<1XŠx&›AIVáM$¸*š)A«h…NšY"ÐL«:i]%šEÜŽ)aQ/ÀƒÁ`˜\°'à)çœ «Ø.èë"ÍyéÞéŠlÓ Èñ&ÐRt0Å»d3KöRô‘@VSN7…×¾kï‰^ö†&^ÕÔ.§Äv2UlR¸×¬¿+tñ3ÙÛr/´™ÞHPЮûÌfØ5оC Zl{NôÅ]'¨ìTo§\±°“™®‘øteÉ‘ÚlŒèNo ×—=RŒ!¨¯èÏ%‘KüÒ¥»…Å€§^m¾ ¼â.Áî¼€_ªjœ õª3†SlHA3„\•Ôå¬Ç&a=``_‹+ös"—æ¤.þB†šû³×΋}àÂN¢v…`ïÙ®$½5óÏÌÖ³_ds(ÆåøæUi+¡„U`UAóÚåœe.(o2äŠÊ†Yˆ:vJؤ EJ¤ÄyT‚:ǺÉO$2—Å!ø‰ˆÉ’º†¡Éà2ðýpΉ^Í'àD¯Ù=W\&‹1ˆ&’¼²)Ì&f„ßx´(IRÇÍ΀\qx¦!Ø[WMžRJXØì¶ ƒÁP¦mJXƒÁ`0T€~~n)ª8çx‹sy“8q.î–`ó + IÉaì–' %¬’“éÉ<,¹Èv (´ORBÙ,©„•¬¡å u© üâJX9šE®[æ> °ØšC;bF¢æîPd|2Õ‘ã-ªådlI5ÎÙ¡Ö•C«/ἘÔE ɽʡjÚ .d| ƒºG%¬ cœ°›)ÈŽèQú*ãÁ7%!ÙR‚ èÉõ/ËãIA;H€=«Wÿ~xxŸ)’Óº¢vÂX-)ʈ¨Ü÷Ívúý¼·°eKýmo[ßlžtÒœ+æ?üð.=²Vs3gF—”zvîlcáBÚ°Þùõ:ë}4}íÞÓf¼Á`0Œ–-»ßö¶ú¾{þÚI'°bEýá‡õHW«¹™3 ö‡´Öt_¯û¶?ûSjÕ¶˜ˆ¨,ÃOìÕå˜?ðºë[³æåÏ}n QcŸsë6òì³§¯ZuXÌÎêÕåðpëÁºIžÍ™C<7¹;vs4{=·•ˆˆ<²nz2¯R F 26´?P›Ml m³›ZLéMtµ™4¾×ºÃ>gU”@N"¥ ¥¨cñ\íR‡ÒÜlëxyÁöîÅUÒTÐj×|BÕþà¾*ññf¦6A%fìAÁJc¥ô6;lÃÖîǾ*Š’Þê;&Ϩ©ìñžfÈÛžfQ„'žhìIÎæÏºîºúš5/þýß7û›œóŒááy?úQ DD´cõêLJ‡Åi_íñÏâ(‹1Ø.è)¡„•Ñä«V-zñÅâ#y¢( ÚË*·ðóŸ—K—ò[°œ_ÃíÛAAŠ}º¦yÚÍxÈÆ§hϾˆ†P°J(aÒ¶PO¶Ý6ãxÅØç,ìÔ°«áÐ=}·*öH'jNp%,A2S’±¯¡–ßå+r^›2¹À´šXŒß÷g(Y%”°Ê •°ÐpÅüÀ µ8Cž(êàd&ÊÑŽ ÖaË»§ÖŸÁ¡ôIJ\Ì"Š:d„º&@’:¦ø¶Þ^‹D{Ó‰;Â>Òz‘¾’ƒãöÔä³ÎÙË \²ªÁpÀÁ«V…_Üñ‘õ:3³7ÊôÊ/~ñÌÒ¥×ÀbŸbûö‚¨P5·ÃÇ[1êïXÂ9úÖ·Ž=òÈéï~÷¯wìhÿÙxé%ÿØcœ5à_Ö‘×vcù /ЬYð4g6…@;^Ü/Ž Ãkƒs}ë[ù‘Gn÷»ÃŽm‡ø—^ÚýØcŨêÍud|4ª¦TÐÎஹfÁyç½þì³×ÿö·Ñvg5óG?ú±ÞÕ«G†‡_ÑïoØàO<æãŽ£§~G»ÚD™ ƒa¼1ãšk¦wÞŽ³Ï.ûÛØ˜™g5?NA¿°zõcûöm%FÁZO\ôóÌ•°è£=üê«üÔ§~sï½›ba H4zè¡íœ‚v®Æ“”¶o‡(sYãØU«ÂùçÏ8õÔúý÷"š7ϾtàË·0€ƒ’Y@Œ'u4¡Ä¾b™ØC*)(RX*ai;¼-²‰0}ˆKVœÉ=—#¿XGá0îžïE «`v<¶¿3dTBEŸTÂÊ9wZHrÈXTªqf[QÈ[Q0d¤‰o渷YQÇ5¶»Ø)E-`€EÓ!µÞ¤Ž=ž2©S«t²x“b]Nö«h¨ˆ¡óp"ü™NCQéŒ µÇ¥¦¤ ¨gIè[ñëQ&GŠ^¬wBÆ€Qúª„ÏOëKµëÞ{÷MÒ Ð†}âV/ÿâO-]*¸ëÒ¹zƒ[nPШ„ÅU´Jçˆï‚¥–c˜"hý!9fÆŠ‹~ò“m÷Þ»õ˜c†ˆ†ˆè•WŠ÷ 0þáõŸþôefdbŒ4 µö¸råîË/ŸvÛmµ«¯.^y…>ûÙÚK/Ñ 7°o nÂ’RS\Ú‰ð˜©:Y"¸Õ½d•–ÐY@ܽ¸Ò½"ÒÌý!ì1ò€½¢9/ b ‘JXJˆJ¬|¤Hü…<ŸÄî*¥<ŠZ$<±· V8Þ'µ(~ ðG!z “d˜_â;Ñ:¥!‰ùEì¶ë#“E–¤ÙíJ?T%¶äŒê@ôMe[±×©*q/Üîr5ùKbËSóuþ¶· ­X1ò“Ÿì¾÷Þü˜coÖ^yedãÆ}î=°xþùW~úS©¸†„…¾UBpîð}ˆˆf<½ñì³wÿþ÷»ž{n˃Žj-RÅúyná­o94”:<|hóÍÕ«Ÿ~d¿Ø¯×éŒ3^¹ñÆ™7ÞXt<à/¼°|zñµœN\^µX~óë—²j/&.®_¾óÊåTíÅÅòÇiùÛªvB!{ë[ÝÐÐàðð¡Œ@Þµzõ¦ýÄ'»„Z?%RÁ*ˆ®:k"Ý#¹¢íðÚ¡¬‘gé(‚.0 IHDñ"ÛN%)q÷d¸G8R(aq®8WîÅü!L4vêØË•°\'%,Q+‚O*.ïÂLÚ9ï@yJ®GF:o¾˜>$²w„–¨†ä)k†`Å…¨Ñ-õ&›fu2ÒZ3ðÁÍ>/ƒµ æ‘Z×Y¿I÷ýA_Á;‡ÇQwÍ4ÉœNgv¤®Î;Šõ¦2T³1Kó™•„3"Û!-J v‘.”¬úVZЪK(­¼²Ã’¶äÈQijX Ø`0 † 0!ž\÷l&")Éâ\hÖV]^äMŠÛI(ýÁ›rÞì YT3^Ò€"S´±÷‡ðq"-¡%wA'N3=cºéÐáH¨G±É¨ý=ºÚNTƒkÓ롟ÊNêÁP¡e'±¥ª¹É¸‡Cãv¹cß0èR›ºp´ÙýHjS¹¡Ù Jl+q¦¢7ÄýITMR[¯ùÈÄÏJÇêÅ <Ũ´#wå‰^¡`…›y3S¿z¼É' ñ®^`yÀS\ aþiǯMBëªàTižs£¡ñCԲç4.DYÃÈã)ãT‹‹âV‚dN+X¥Êà‡\nB“rå)‡fqŸ³Üø™!“<Âì²ÃgÔvøà:Ú©ãH6£¯ežU ÎÝJXMé«‚jù„V<ß,Š1”HA'•°j‹ît`²—µ°7U¡ ¥ÌðÓvtSË»Ø5„Íò‡_ii'DG¶w¯‹®vÈ]Eú_ãýF†RóŸß+µ÷_ "ÊšÿQCñª©{Å^»ä?q OÍ׎½¦½ë4÷GšåMw@˜U½í}nËß’×Gœ¥übŠ¿Ã¾‘žŠüùN6CèvF„Žy«ó—Ò¤£ø{Ѓß:Ö©Ÿ•Äk ;Ô?^bpâg.òk”Æîýñ¯7ì¿EGbò-À6lX¸p!gÑ¢EO=õÔîÝ=_VƒÁ`0Ò»EgòQÐÛ·o?á„ø;³gÏ!¼ð ‡vX—FfÌ8ðÕW¯ïÆ¢4¢(bøÂÌø×yÌ”C ¢r«F³BÛf7oœšœ8Ìm©Ú…‰ wwÕLT8cFÇ1sçÎÛºuùØû"±_¶˜| °†s=¯;w¾4ž ƒaŒ°eËÆª]Ø‹Q,:m1ù(èÙ³gïÀzÑÛ·owÎÍš5«*— ƒÁ0U1v‹Îä[€.\¸aÃþÎc=¶`Á‚¡¡¡Ø!ƒÁ`0Œc·èL¾øÜsÏݸqãý÷ßßhnÚ´iíÚµçw^ú(ƒÁ`0F±[t&_9Âz½þŽw¼ãùçŸÿâ¿8sæÌk¯½vóæÍëׯÁpƒÁ`04ÆnÑ™| 0mݺõòË/¿ûî»GFFN9å”›nºéØc­Ú)ƒÁ`0LMŒÑ¢3)`ƒÁ`0&;&_ Ø`0 †)[€ ƒÁ`¨¶ ƒÁPl6 ƒ¡Øl0 C°Ø`0 † ` °Á`0 À`ƒÁ`0*€-ÀƒÁ`0T[€ ƒÁ`¨¶ ƒÁPl6 ƒ¡Øl0 C°Ø`0 † Ч ð¶mÛ.¾øâ9sæÌœ9sxxøñǯڣjÐýuX·nÝ%—\òæ7¿yÆŒGuÔ²e˶mÛ6ž®Ž?F÷!ùЇ>äœûó?ÿó1ö®bôzqî¾ûî?þã?ž9sæÁ|òÉ'ßÿýããg%èéâüìg?;ãŒ39äƒ:èÄO¼ýöÛÇÍωƒÍ›7êSŸ:ù䓇††œsO?ýtÕBÿadddñâŇvØ×¿þõï~÷»Çü¡‡ºeË–ªýoôtN=õÔ%K–\sÍ5ßøÆ7®ºêª3f¼éMoz饗ÆÙçqÃè>$?üáçÌ™388ø±}l\ܬ½^œ¯~õ«DtÆgÜtÓMÿò/ÿ²lÙ²ï|ç;ãéðx¢§‹ó«_ýjÚ´iï|ç;W®\ùýïÿýï?­\¹rœ}®?ûÙÏ=ôÐsÎ9géÒ¥Dô»ßý®jÆ ý¸ãß ¢µk×6šÏ>ûìàààg>ó™j½ôtž|òIÞ\¹r%}ýë_s/+Â(>$/¿üòüùó¿öµ¯pÀS{îéâüîw¿›>}úe—]6ŽV‰ž.ΕW^éœÛºuk£Y¯×çÏŸ?<<1.V‰ž.Ί+¼÷Ë—/'"ïý¸9Yzº8###yž|ðÁf­V;øàƒûá* dY?®DÔŸ1à 6,\¸¿³hÑ¢§žzj÷îÝU¹T ^ËuxðÁãÇʹªÑëÅùå/ùÕ¯~õ+_ùŠsn\¬=]œxàøã_¹råüùóóùü$.ΓO>ùgögÇ{ì-·Ü2mÚ´ï~÷»]tQ­Vk\+ÔG?.À³gÏÞ±cgûöíιY³fUåR%ÅuسgÏùçŸÿÈ#¬[·îè£{+C÷ç¹çžûüç?ÿÏÿüÏeY6Ù±cÇÌ™3kµ)øëé“óº×½î¿þë¿Þ÷¾÷5ß9ãŒ3Ö­[÷Ì3Ï,X°`Ì}wôtq®ºê*çÜ]wÝ5mÚ4"Þ¸qã²eËlîô#½pá 6ðw{ì±  UåR%èõ:ŒŒŒ|øÃ~ðÁüã/Y²d\|¬ Ý_œgžyæÕW_ý‹¿ø‹Ùû°sçÎÛo¿}öìÙkÖ¬G—Ç=}rQôm¼žªûnzº8ëׯ?î¸ã«oï|ç;7oÞ,–pÃTÅÔü¤qî¹çnܸ±)°iÓ¦µkמwÞyÕz5þèé:EqÁÜwß}wÝu×É'Ÿ<ŽnVƒî/αÇ»1}úô³Î:kݺuïz×»Æ×ëqBOŸœóÏ?Ÿˆ~üã7ß¹ûî»=ôÐ#Ž8b\ôtqÞð†7<úè£|ÖC=tàxàãá«¡rT—UFFF-ZôÆ7¾qÅŠÿþïÿ¾xñâC9dóæÍUû5ÞH_‡Õ«WçyÞÔhd×\zé¥w0<üðÃÕ¹?¶èéâLù<àž.Ž÷~éÒ¥|ð7Þøýïÿ#ù}å+_©Îý±EOçÛßþ6ýÑýÑÊ•+¿÷½ï}ô£%¢Ï~ö³Õ¹_ ¼÷Ÿ”†„Ü-·ÜrÇw<ðÀUû5æèÇ8„°eË– /¼pÖ¬Y3fÌ8óÌ37lØPµGÕ q,ÿöoÿÖhŠÌŠ–-[V‘ããî/ŽÀ”_€CçÅ_\¶lÙܹs;î¸o~ó›U¸<~èéâ¬Zµê”SNyÝë^wà.Y²äk_ûZS•¢P¯×õÏË9çœSµ_c¦nBžÁ`0 ý6 ƒ¡rØl0 C°Ø`0 † ` °Á`0 À`ƒÁ`0*€-ÀƒÁ`0T[€ ƒÁ`¨¶ ƒÁPl6 ƒ¡Øl0 C°Ø`0 † ` °Á`0 À`ƒÁ`0*€-ÀƒÁ`0T[€ ƒÁ`¨¶ ƒÁPl6 ƒ¡Øl0 C°Ø`˜dعsç1Çó®w½«^¯7Þ¹çž{²,ûò—¿\­cƒ¡'¸BÕ> †ÞððßtÒIŸþô§¯»îº­[·.^¼øÝï~÷øÃªý2 =À`ƒaR⦛nºâŠ+V¯^}à 7üú׿^¿~ýë_ÿúª2 =À`ƒaR"„pÎ9ç¬]»vddäÞ{ï}ï{ß[µGƒ¡7X Ø`˜”pÎ]|ñÅ{öìY¼x±­¾Ãd„-ÀäĖ-[.»ì²·¿ýíëׯÿ§ú§ªÝ1 =Ã`ƒaò!„ð±}lÚ´ikÖ¬ùë¿þë¿ù›¿yôÑG«vÊ`0ô‹ “_úÒ—®ºêªµkמzê©###'tÒž={~ùË_ UíšÁ`èöl0L2üêW¿ú»¿û»¿ýÛ¿=õÔS‰hppðöÛoúé§/¿üòª]3 =Àž€ ƒÁ`¨öl0 C°Ø`0 † ` °Á`0 À`ƒÁ`0*€-ÀƒÁ`0T[€ ƒÁ`¨¶ ƒÁPl6 ƒ¡Øl0 C°Ø`0 † ` °Á`0 À`ƒÁ`0*€-ÀƒÁ`0T[€ ƒÁ`¨¶ ƒÁPl6 ƒ¡Øl0 C°Ø`0 † ` °Á`0 À`ƒÁ`0*€-ÀƒÁ`0T[€ ƒÁ`¨ÿÞ{–,oƒú)IEND®B`‚gsl-2.7.1/doc/images/interp_compare.png0000644016036000116100000006242213373111455014766 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœìÝwœeþðgfÒ·$Ù^XêRYP) –U8T°+èYT=Î;ýy–;pàÀ‚ L&Ã0¹mÛ¶o¼199Ùh4Nœ8qíÚµR· @.’à¹s禤¤ìر£Ë#§NZUUµvíÚ²²²åË—?ýôÓï¼óŽÔͶõ€¦‹÷Z¼xñÒ¥KÅåüüüÙ³g[,–°´ ¬"¨·b·ÛÍf³Ëå’®Ir‰ÜAX7n9r¤Ü­D„ž[­Ö /¼pÅŠ“'O–´UòÂ¥ûïU^^>eÊ”­[·vÿ•$ÒۺוܹZ+))™1cÆßÿþ÷K.¹¤ûÏ¢¤ ÷´]¹4ÊP“ i4êòÚ^‹¬\ZZzå•W.[¶lÚ´ir·@B4«²²277÷ùçŸGõ€¨'s<µÏÍÍ}üñǯºê*Û’_Äo÷ê¹ø¦½íi³ÙL&S—oAOW’FJ’R“ i4’.©ä}À·;ð_)ù,ˆì— è„ `%©©©‘» a‚¤Q†’˜„¦¤7n”» Š ½èôŒ€0“®Äà @(ÀJBÏêÈHe(‰IhJ ÁCV«Õ*wÂI£ %1 MI7mÚ$w/zOÑ fV«5!!AîV„ƒt%&J 0Hƒ°¢ °’¬ZµJî&„ ’FJbš’b¸Yð¢áâ-.A„Y^^ÞøñãånE8 ¸3(À ôD`%ÉËË“» a‚¤Q†’˜„¦¤<`%¡ä®;‚¤Q‡’˜„¦¤ô 7“N4ôž¢$‚>`€¨‚¬$ôL3‹¤Q†’˜„¦¤<`%¡g|’FJb$…žˆ†ÞSô„™ÅbÉÎΖ»ဉ8:ƒ Á ,€¨‚¬$ô¬€¤Q†’˜„¦¤n<`%¡dês‚¤Q‡’˜„¦¤„¼hè=E0HDº£’âE"–ÝÅ—V{ˬžÒ¯ËÃ'UÉFUŠI•lâ Z\€ðAVzÆý‡6©]pj*ú®äd©¯ÊWÏÚÙÚD¶1žLàa qÜà ‡ÂY‰)ùL)‰IhJ ÁCVzF=„$i©¯ê{Çþ_=E¥¾*B’H!$åÌ?{Õ\]‚Ê2LU<À_‰­ ¾ {¾Ùß8v°~Ò¹1é áøé ä3¥$&¡)é¦M›rssån…²ECï)ú€¡­œ?~Úô­[ðty$[Ÿ 9˜Ã•ömµX_íìÉÆ„8Nš(›Õj¥dé'LÄÑ`ä\7nØï:Ò£gqÖõ¡®"#p§FÅ\5!nÒȆéèyåP€;ƒ ¢SÞ’wÖVûjÏÚ+0lƒYkMiJ7¥ÙK|E¾òÞÞöé±EÃø½þ¬>àþ©š.6¦šÑ_@#Ì„„дvï’æ¹½T»2°ú2^µvÿEq_ßzYé­yõ]ÙçÄN[h¼ùÅ„EϘ7A{.CÎ:·mÌ:b¼ú›>}Ϻp]Pá~ùóêÿýÜÔ»,£ä3¥$&¡)©Åb‘» Š çŽ8BH©¯êùÚ÷;}Y[’vÏÅéê„;®0§˜Ú?-õU­oÚö“ûhàÈÈÆN²Îس=ÎáâŽáº)ñ‹ëÑ$//’YGp º3(ÀàÜ«}¯ÜW#îQÿ:Rý˸t“fþocõ]\é)ð–¾Û°¶Êg÷¨7KsY鮿œr™©¹ýr3î  pgP€á½†µy®CâCí¾Iª‚!é‰êßÍLè²úúÙç{ ëºÏºª6Ã0¹_ùøÏ¾¯³œ §˜Tw]iN2¢K€ èBhš|µGI·9V_UÁUÁÌ$õüßt·úB Œîþø®4\x}yƒ}û¯©;¼61°ÜVÖz_[SSPîî~ ;AÉgJILBSR °’Pr×éIÒÓÞòÏš¾²ufí¤'ªï›™£ëÙ×›!ÌÕ†‹ï‹¿NÇhÄß:voQm~ðÚÄA-;›œüÛ¬–’Ô`J>SJbš’Ò3ÜL:Ñpñ— ©å\ÏÕ¾+öÝ2^µnóÕ‡qÑœ¤´ æ±:å-Y^÷o»ÐÒû{nÔ-†_|_¿÷˜CÜ©â˜y—›FôÓõú òá4@;6ÚwŽœÒî›Ä6ÆÏœLõ%„ Pe.2ÞÇÄ=»œù+›¾ºácîùqâN¯OXùMí¡Bg{¯Ð`%¡gšÙî$mà›¾wîª-ùâƒ3µ“Î ¾YªÔGslK¹Ýë:ôIã.;{²Qì'öú„ÿkË?ÙûLÉgJILBSR °’Ð3¾£;I¿uìv¹ë—q4¿œ¯×²7]b Õ]ºi\ÒïsX£¸g‡ó§/š6_4Âpm@ öñä£Í¶Vw+u%Ÿ)%1 ’BODCï)ú€)ÔÀ7ýŸíu±k~š¨¶ ¿ešiì}hßÈÊ׿Tû¡•¯÷üÆ0e†arÞQû§ß׉ß;ÇÜu¥yHmhß bѳð"ú€ÎòcWËé¯Ó >5tÔ@]È«/!$_d¼-ž÷¬·oûÖ±gü9†[¦™Ø3?@^Ÿðþ&[¨îMˆ|”T_I¡ƒòÔóMß;ˆ5GGkYÕœÉÆNžŒdμ0þ&Ó2Úù˦ͻœù9ƒõ7^l¯E»½Â;m%Õ]/€@P€•eÓ¦Mr7!L:Oúc—; ÷—;9䢑1ÝŸs£ú¨R0Þ¤=s°@ÈG_ÿä>6nˆþÚ€Âïpñoo°VؼÝeJ>SJbš’b¸YðP€•„’©ÏI§IëùÆm§¿êc£tœjꨌ|îÜ@Uæ‚øëÕLó N<Þ©_sØ}ò¢†À{“üŠ Öº&_7_–’Ï”’˜„¦¤„¼h¾„AXTù¬ióÇÿ6ëˆÑo¼þ’Qñ3'Æuþ¬PùÉ}ìíú/yÒ<5´–ÑÁyöªÕíÒªYŽ%z-˱D£f8–Ѫ†!: «æˆZÅè´XæZ(ÀJBϨ‡Ž’îvþ"n«N óé¯hº~¼]pl°ÿàXÇ7¼R÷ñ£Æy·]jz{ƒõDióÍH œ_l«»~jgó)ùL)‰Iz’Ôëêšøz»ÏîâíN¡ÉÉÛ|““oròv—ÿ¿‚ÛÃ;ÝaºŽÂ±Œ^Ëè4¬^Ë´¬^Ãè´¬C¯mÞ£c :6FÇjȚM›rssÃÓ¶h ½§è¦D…Ïú”íŸÍưñ†iCRÃÖûÛV`o4!$Ô8/Æÿu5e5-7#]666p”PEHm“¯¶Ñg­÷Õ6ùj|µM¾ÚF¾Þîktt}æ±Ô*Æ !ÆXUŒžÕ±q.ÞÐüßxkŒáÔªè9£–®Äà c—ógq›«L×ybe9ý]3ÝÎ;v¹òý­|ý²úO5ν÷*óòµ5Ö†æÐßîoŒÕ³“FÊÙTÚ_U·ªÎW]ç­®óÖÔûjê}^_žx¼B—ÔÙ;¼ëÝ eãcXs,Ùb¹„8ÎÙbYsÇáj÷Ñpîˆ3`DxÜúÛ™)!µ{§L3޾úÂxy[ÅáÆ¯ö¸Š{R¸„GŒ·¹ëõÿX[Óäl>ÅarÛ¥¦ó…~¢.‹ šzo™Õ[nõ–[=µ¾ê:¯DÃîtF«fÕ*F§a†è5,!D¯eT£V1z ËtUÑœ.Þǧ‡÷z‰Ç'x}‚Û+ø|‚Û+¸=‚Ç'„íB7CHœ5ÇqæXÎË™ã¸Ä8UB<—¹'ÍÒ•˜h(]ôàU«VÝrË-r·"Ú&=â9õjÝ™À½jÃú›».=Õ,ÿ%žðï6¬Ýï:"îI刿ÑQûæú—§ù›É±ÌÝWµ3Y4%ŸiÄRYë-®òUyŠ«<%Õwpå–eIœž3Æ´t¬´þ &VÇtLŒŽÕªY&LeÉãœÁáâ.Ááæ.Þányè;y»KhròRœÖÇØ„8.!N•Ï%Æq‰ñªÄxÎËuùç…ÔP€;CO¦Ùû _íq5ÀR >§xú×$ÊÛ$‘ð+ê¿üÉ}LÜÇ~w½·<ùÝ6ßüåÔª™ù¿IÌJQËÔLè±z;ºÂ]Xé9]é.ªôˆNõHŒŽõ’æ+±±œ1†3ŰqùKK¯¹<ÂŽÝ?2²ÉÁ7:ø:;ßh÷Õ5ñ¾®ÉWo÷ùBÔÁ­â˜„8.ÑÈ%Å«’Îü×§âÂxë pgP€£žKðüÁºÌ%4.Öm˽mäðq,½Ðk>¿UÿE¾û¸¸GÅpób£.øÉ–Zñë«gÌJŒ„wh—@H¥Í{ªÌ}²Ü}ªÌ-väwSŒŽM6ª’M\²Q•hT%ÅsIFUØNa#‡@Hƒ¯oòÕ5ùl¾ÚF_m#okôÙ| vñ/ÒÞcY’§J6rÉ&U²I•bT¥šUq©j2-øÀï¼óΪU«êêêºß0਷˕ÿaÃzÿ6cIÜzÓŸoKÕDX‘—ø>jø:°?˜!äê˜KbOŒ^óCËj†ñvþ¬Äjp©°y-qYJÜ'ËÜbÏ}—btlz¢*ͬNKP¥'¨RÌ*æ>ëŠ'õM>1¶6ÿÏë"ÎwҬײ©fUªYåÿ(ŤJŒÍ€/Z ðˆ#®¿þú믿~äÈ‘(ÀmåååQ2Ól«¤¯Ô}rÌSàßÖ}1™<{’TkC dƒ}ÛûöÀ¯ã(ÍàtËäæÍ5Æp f%$U„šÏ4ü1A˜?þo¼Á²íÅ;¬Øu¬Èõk‰«ÁÞ­ßý1:6+Y•¢î“¤ÎJQc¸¶ÇPò†Ï“Ú&ŸµÞgmðú ³y07kùO”SMª³Ê_›SL=¾ !˲>Ÿ¯£/R0"ëÏðC‡ÉÝ„ˆ– wÂ$0©•¯?î)ª ³'æÚ{’üBf¦$sæ6xIóÕË|÷¯Çû ¹àôý{êš|o®·.¸:Ñ˾òÊ+Ÿ|ò‰?Û%ü_ÝO>ùä­·Þš4iÒm·Ý&îäyr²Ì}´Èu¼ØUZÝu®Šc2“T}S4}SÔýR5‰ñíTÜVèù! íÀ:–% q\BGˆ&p¿Ó-T×{kê|â«ë|õMÝÆóÄ?Ø¡–ßÄÃ¥˜T)f.ͬN1©RTqN¥÷É'ŸBV­ZøE •=wìÑI-=gÀtÚhß±Îþ?ÿ6gM|ðÚ‡g'ÉÚ¢®÷œ~«þó&Á¸ÓdÏpí˜ÀÖ™ýâ¸$ç¦ßÝ}ûG}$ÅÏ6ÍGß¾}«««OŸ>Ípº£E®C®£E.GW7êµlÿ4õÀ4Í€tMV²ZÅEVOBÜ^¡ªÖ[]竪óVÖz+mÞÊZoï†ÈB Z6Õ¬J1«RLÍgÉ qÍããZ}‘ †ÿé¡¥ DÏÚÞ.õUù·µ?^psŸ‰ËD¬JŸueã×OQ«ý¬-IU<@U<ÀW«z÷‰qM V‰~¶¥å°ó'„ªŠvÿ±‰wÔò M‚3ÌýãÃuïö_‡Ó¥Ój®›yÙœ™3:ÿÁ2Ä e :Ö euš(¿­<>ÁíáÝžæ››Ý^ÁÓ³!t-B´jF«a>þâë­ýÆérë´šßÝ;÷•×Þ i“Q€ÅjµRrKLjåë·.oÞ˳æÿÞòôM}µj%œ”x<|SÃÚý»j÷¨nƒ‹×»x–'z·ÀDçVþ{÷ê;.N£þÝŒ©‹nºŠgY^­âU,¯â|ª–î!ÎëS¹<¬Û£rzÔN7aVíÕªy­Ú«UûT]_ !m£ÃTXSYÇDê]U“cÈØ=Í‹vÔê#óç¦Åb&2è™V_$VsòTAzzzß"²ú€{éà~ºO>ùDì¥ÈËËKHHð/TbµZóòòÄ™Ä7mÚ4~üxÿo|‹ÅbµZÅaý²¿‚ÿéJOÑWðï±X,»<ù$¹ùÓä¬)cúšüÕ7BR$ÅÆ 0Æ µ¶¦²’ªãÇúㄆzÒÔà­«ã|^BÈ(BF‘vT59>Û°ÃéñBœnÏÛ_¿(«oŠD(,Þ²=ðN/ÏÿiëŽ÷g].c“@‰Z}‘|>~ñâÅüqß"BÏq ~oÔ~‘ï=êßV»xøô¾rMd!B­U¨(*Ë…êJÿÿHScï^쎯¾ùòˆÅåk¾F¦á¸ë†e£Hï—Êê)~&žµøÔª­s¯“–ÜѳZiÿ‹d0lß¾='''Tï%gÀ•xÂõœ$g®n$5ö kõõù„ŠR¡¤ˆ/9-”—•åÄå É ÿRY½îØ ±úBÜ>ßÚc'–W)¥H )IRÊT»Ôíô˜ª ÏÆÆ²–HØYàòMÞîâ']zôÓõNoë®?‡×wï»þý÷G¥k Dž'w=öµÓ×ú‹ät:çÏŸ¿gÏžvŸÕ (À¹NzJÜLóìWŒK?6)Cêwê…“BÁ ¾è”P^J¼Þ®ŸÓ•Š1ĘX¢Ó3zCó9Žhu |ÄÙf¦>‡×wë÷»ßüûRbXÎëe½-ð*ΣUûÔœG¯öhÔ Tn¯ÚáQ¹½*·—mSo$%°LmºÙÖ7É­kýÇÇp™\J_UZ2g–®¶Fß¾cŽ}ÇÕu­?“79qºíõ0AZŠN2g̘!]à jlذá—ã…|›)»xžß·o߆ BõEBVzVÀö'=è>!îáÊ3Gö—dîI¡®V8yœ?e N5U={²JÅ$&3æDÆd&F3cJ`Œ&ËÄÆ]û­Ý°aÃîÃGø6³þ‚pòdáëßÆÎœ1ãÖéæ(›¿0ø¯®Û+ürÒ¹ï¸ã×WG=N¬ÇzÝ܇Rͪ];çåíÙ-z~H£xLhEEÅâŋŇ/¼ðÂc=ø¯¡z£Èê=mw,U—-¤§8Š¿ñ­ø“þ¹òÝJ¶Ü¿ÇôóÅ›vQÈ&¯w:ø_ò'Ž 'íAÑÕ˜”4&5ƒIMcS˜¤Æd&=lÓ{ï½wüxË”ÑN§ÓfW+rùÿÜ6§yáM)&ÕosÍÑ4]e¯¿º!§ÊÜ{9~>áèèFÏX=;&[?v°>º ç‡”ž?5h™Š²wè)ÀTiäí¿·.#D „™|ü··^ì ‚µš?zP8r/þçýBue'‡1)iì9#™ACØ~Ã\t~¦*޹éSßÍú]õnoó|ƒƒo“-g°þ7ãâÛ[~G:ùê–Y½û;üê¨kêìRó¸¡ú!}´¡X\NZôüÒÓ,h8w¤ç ˜§½eÏÕ¾×üÀ£¹Ç¾`ì ®f‰rØ}?ïçÌŠ ;<†ãØþƒ˜sF²çœË$$†¬¹¡VUëý×wµ…g]ŽÖª™Ksb§ŒŠ‰Žål ¾-Ž¿:ʬÞëÕ?MsþýyÙú(èn†KÐAŽ>ŸÕlß"lóo«Jû¿tÎ-þ æyþÔ¯üyüÁŸˆÇÓþ1*5›=”=g$3ü\&&|ݺÁày²õ§Æoö5´ºa8ɨºúÂøáýzÙ.»ÿËIçÇ©2wG?´ÆnìýùCõÑ4” — .?;-äL‰Épõk·ú õüÞüÞB}]û¯¢R³C‡³£Æ²C†l™{‡eÉ¥9±ÃújWÿ¯®¤ºå‹ê:ï»­ýRÕÓÇÄï¯Sʉa½ÿå¤ó瓎Seî6Ó4Óª™Qu9ƒõƒ3µ!»ß ‚Eù#=gÀ¡];b9×ÃU'lóg:§æîˆ¦ X|»·ó‡óÛ¿•ˆa؃ÙóƱ#Fw4Fäèò3å²û°}ÓÞ†&gë¹;ÒTÓ΋“­Ø›pªj½ œ \å.ÒÁ´”,K†ôÑŽ¬9@§Q)¾ðRòCJhn†KС§SbGÃá\küÛl½ùùÔûšù|ü‘|ß[…¢ö{y™¤vÔX6gc¸ñçèÏjHŒˆ!Z^ŸPPî9Vì:TରuØ¿ËÒ/U3f°î¼Azªî³Šyyyâ*aÑ ¸3(ÀQ敯ßyêÙIKg1,“X2jÉèß õ|ÞüžBSC;OÐêØÑc¹1㙾ÂÞØ°*«ñlÌk<\èlûug˜¡™pŽaD]ø‡,ñ<)©öXJ]NjݧÊÝog?}’Õ£êFÒGÈ_ Cî p”¹êµ;7>ôþ´7®|ýy¹'/žYZÄÿ˜×îºLJ7q2{Þx¢Uê ¤^(³z·þØøÓ G›ù¤ !„cÉ€tͰ¾ºa}µ’Þ/ët ÅUž“åîSeî wG7ïú1„d¥¨G Ô¤KˆCÝ%Aî =˜†k>5Mµ}úöqZ› &Æ¥÷^xZ më ˲ÃÎe'Nad÷t*æHÓëÏ´¦Þ÷¿Ÿ÷ïp†dBˆ)–ËJVg¥¨û$©³RÔ† æòú„šz_u·Ìê-©ö”T{:š!2Ç’AÚ‘ýuÞº#S/ÛëwW~HiƒQÐ@!4Üu÷ûgžô9Ý„¡É½å£NžpÖ?ëôܸ ؉Ss”ü_ÑëÏ41ž›3Ù8sbüÏ'yG§ÊÝm©môÕ6ú~9åô?ŒÓ³¦8ÎË™b9c §S35£âñ’µË#ð<á¡ÉÉÛ]‚ÝÉ79ù;_]ï­môuÿW9–ÜG;¤æœ,­¶H‹ÅØ»˜ŠCé=Ãͤ çŽôœG½ÊÊʬþýÜŽæ‚aP«ÌŸ›Ca’Ø‹.ær& EW›»¯²Ö»ï˜ã—SÎÊÚ Ö0B¼®”¡’©IÆý»Ep º3(ÀQã¶ÛnûôÓÕOs ÑpÜuò?¸÷nêeìÈ1$bﶉ$5õ¾#§GN»N”v1*H,KRMª¬ÍÀtÍ€4u’E¢ pgè)ÀÑ=÷[~~þ&ØÎÀ½nûörÆFm÷¡tŸ©Jk¼ÅUž¢*Oq•§Üêñµ7h«›†˜b¹¤xU²‰ËLTg&©ÓUÝŸ3º¿ºèIJàÎÐS€£{öó‹&Lؽw/öGɲì¸qãöìÙ#W«¤¶Ï”HƒÝgmðÙ|µ¾ïö .·àõ â0.Šá8Âbв£c :6FË&¹„8.˜9¨£û«ˆž¤ô 7Cî =8ŠmXóå¬9×ñí}Ž,Ë~õÕW3fÌ« #˜ +xè¶ e_¯ydbޏãX_/aà¹ñ}ü+**dj´’ê+)`ŸpúÔ¼43I»ÐÿpçH}ÃeñèæŒÍ’·aÒÁ°R%Ù´i“ÜMÿëQq» ]õù´8³çÄdÈØ¤°‰ÖÏ´Jbš’Z­V¹› x(ÀJ­Cø_ˆÛÛGÅx9ÆäHQ1TLX­Ÿi+”Ä$4%ÍËË“» Ї¬$Ñy{ƒ½I(9íßæX? !d¦¯¬m ŸèüLÛ $&¡))%ƒ½%… 2ã-GÉ™†%É\} Kcì'k£$‡¬$‹Eî&„^àõç#ýµ„†M™G¾…UT~¦mQ“Д‚‡¬$Q8bH IDATêAË1ñÑÑ~BHŒÇì¬i’¯Ma…Ÿi{(‰IhJJÏp3éD؈C¹„²Ï?^ðo;5Ìã¿Kñrä\þÜûSfÉÛ0è=“nJWbp r ¼þük–ÆËBÈèXZF`(%ÕWR(À '! í×¼Îà`-æß€è‡¬$«V­’» !åvó§O‰÷×B4>] —mI;FIRJbš’b¸Yð¢¡÷}À Å=èýèmÿv¥Yõ×; !ùAH¹IÖv@×°Rðp ²9ûú³Ú¿1TOÅ ”JGIõ• 0Ȇ?Þú`BÈ@- 0PXI¢iòUÁV#X«ýÛ^–XúhüÛýTi$º’vŽ’¤”Ä$4%…à¡+I4ûç·OôÑ¸Ô !$†‹gcIt%í%I)‰IhJJÏp3éDÃð% ÂR"ïGoóGú·×NŽÛ:Î@Æ y(ñzYÛp ‚hÞ·h¾þœ­K—©9ᆬ$Q3ͬPk%»Û©fËš—þí§n.ÀQ“´K”$¥$&¡))XI¢f|‡PZ,n§¨†ñoûG`‘(JÚ%J’R“ )ôD4ôž¢Xq|[6ú¶nôo?ÆðÅÅq„x!niòBYÛÝe±X²³³ånE8 ¢ŠPÖr\’¬òoôWgÊÔè1Jª¯¤P€ABY‰¸]œÜ<ÖMšLÍ °’DÉ ØN‡PgóoúX¦<±õ,5I»’¤”Ä$4%Åp³à¡+ItL¾Ê—“3*å‰*/×<+‹k9ŽŽ¤ÝAIRJbš’bVðP€•$:&Ù ì.Ni>ý51ñq¬AÜI»ƒ’¤”Ä$4%ÍÍÍ•» Ї á&”·t—œé¨Á,  °’DÇ ØgÝ|ft_ÕY#°¢#iwP’”’˜„¦¤<`%‰†Q>ŸPUáߦ4©¹÷S5 e4$íJ’R“Д”žáfÒ‰†),0‡‚¥Ež×_ôo[ã¹§ïJ"„0„¼”øH £—µiÐV«•’oLÄQâ¬;€SšOY3ª/€²PR}%… aX€K’šG`õSc   °’DÁ ØüY÷ µßL¢"i7Q’”’˜„¦¤n¼hè=E°b‚û¯$N‡ÿÑSw%Ùâ9BÈÃÆ[ÏQ÷—³aÐCyyy”Ì:‚>`ˆ‚­F¬¾v-SÇB˜6÷ @䣤úJ Âç¬ERÔþe€X“ÑÉ×(y +‰Ò'_ÊJÅí’¦àðSzÒî£$)%1 MI!x(ÀJ¢ôqÿgŸÝG•ÒöH¥'í>J’R“Д”žáfÒ‰†áK„¥ž¥O‰ >?7Ñ? Ö‚øëGi†ÈÚ.€a(Ÿ½I¬¾^–Tš›/A÷Á, ’äøôéÓsæÌ‰Ÿ3gNQQQGGú|¾×_}ìØ±&“Éh4æää¼þúë>ŸOê*ˆ¢§™å¦à(KR{9B‰aô l|Ûƒ´G(IJILBSRž´¸±±qÚ´i999………………999Ó§O·ÛííüðÃôÑG¯¼òJQQQQQÑ+¯¼òÁ<üðÃ’¶PY=¾#p$qVUj»+:iP’”’˜I¡'¤í=}å•WöïßÿñÇ‹{n»í¶ñãÇ/\¸°íÁñññùùùýû÷÷Œ5ª¾¾¾ówA°"x¿ø„?°Ç¿ýÅÅqß1B.ÓO˜s©¬í€Þ°X,ÙÙÙr·"”Ú¼~ýúyóæî™7oÞºuëÚ=X§kçfP½sôG qBBHybgÀá(©¾’’¶:thôèÑ{Fuøðáv¾ÿþûoºé¦íÛ·744444lÛ¶í†nxðÁ%m!„P])nWˆ#°8` ”´Øf³µº+.11±£A þóŸÓÓÓ§L™â±5uêÔÌÌÌ'žxBÒ*‹rWÀšˆ£¹ïߥfêbBˆŠáÒTIí¯Ü¤=EIRJbš’b¸Yð"è6¤_|ñÀkÖ¬±Z­V«uÍš5xùå—»ó\¦·Šçåå‰ËwX­ÖÀŸ“M›6‰_&‹Å8¸ ¢^aüøñ²·¡—¯pý¹Ò¬òOB™Á¥p„m÷üÓÌF\ ^!%%Eö6„áÆ/{Âó þ¯®ÒStç¾üòKÙÛÚW討ÉH;|)555???5µå2cyyù˜1cÊÊÊÚ<`À€÷ßÿâ‹/÷üïÿ»óÎ;Ož<Ùù»`Väã÷îô®ý·{ÿP݇W !éΛ;CÖvtA©ƒ°FŒñóÏ?îÉÏÏ>|x»—””Œ7.pϸqãJJJÚ=”%°¸2óodaPLÚòÈ#7ÜpC—o>àHçó¹Ÿ~”ðçß¶ÅsOÝ•DÉÑ»7n¶¬íèšRaÖÀÍ#°úp^  °’(tì³:€MâèÎV!ThÒ^ $)%1 MI1Ü,xÑpñ— #œ÷‹ùÍw»vIüöóô„çšØ8YÛ½———çŸu$êá4(˜PÕú&àFê  h”T_I¡ƒäÚ.ÃзÓëÏ4@V%®€-4¶³ C—«*1iïP’”’˜„¦¤<`%Qä]wÕí,ÃÐeVdÒ^¡$)%1 MIén&h¾„AX‘¬Ýež4Ý“Ùñ4X‘ƒ°@©Ú.ÃÀ6U•(_‹" °’(qšÙ¶Ë0¤©’T„ëüYJLÚ;”$¥$&¡))XI”8¾£í2 ™Ý˜K‰I{‡’¤”Ä$H = ½§èŽ\g/ðød·Š¹6fÚú änÅb±dggËÝŠp@0(’PS鯾„Ú8Ö­b!™\²¬€ ¤úJ $8–¸ Æ?`eQÜ Øm—a00:ßå—´×(IJILBSR 7  °’(nòU!`Ž ³š’©JaºñDÅ%í5J’R“Дƒ°‚‡¬$Š›d§íJÀÝM˜´×(IJILBSÒÜÜ\¹› x(À !¡ºJÜn¾I…X„ +‹²VÀnw†Ì®föSVÒ`P’”’˜„¦¤<`%Qب‡6Ë00„dpIÝyªÂ’’¤”Ä$4%¥g¸™t¢a LÄ™ø}»¼kþåß>0T÷ÁUÆ$ÎôWóýò¶ BÂjµRÒá‰8@y„š€`“Š’ѽXù(©¾’B©Þ\eâ!}0À(ÀJ¢¬°Ï€«Ì=¸‰(-i0(IJILBSR 7 ^4ôž¢8 ‚û™ßÇÿèOóSštÌÓæûÒº7 "\^^%³Ž F¨¯«¯]Ç6éÃ¥pè4ˆ”T_I¡ƒ$Îef !é\2‹ïÀø…¨$Jš|5`¬*“šÒ§'C •”48”$¥$&¡))XI4îÿ¬X&Ž’Ñ“!Ð J$J’R“Д”žáfÒ‰†áK„¼¯àüâßþð*ãþ¡º…Æ›‡«ÊÛ*€žÂ ,P_U››€1 @`%QÌ4³‚@l5â£j“*–5ij±ÝÅ$ %I)‰IhJ ÁCV¥Œïj­ŒÏëßnÔ³v-“ÉõlB¥$ %I)‰Iz"zOÑiø_z?xÿ}2C³ìFó4ýøb.“·UB‹%;;[îV„ú€AIÚîé0D8Jª¯¤P€AmgÆ2 gCV¥¬€í®¬·«ÌC˜ôN­”¤Á£$)%1 MI1Ü,x(ÀJ¢”ÉWùªÀKЪ$Τe4=z¥$ %I)‰IhJŠAXÁCVeL²Ãóª›ø¨ÚÈuB‘2’†%I)‰IhJš››+wBL°Õ0¼Ï¿]Ë:5L¦ #°ZCVE¬€-,ÃPiRB2z~¬ˆ¤!AIRJbš’BðP€•D£øêÖ“Pöb´"’†%I)‰IhJJÏp3éD؈#¢4}±Z}`‡{ݤØïÇÇ¿–ø¬ e¬V+%Þ˜ˆÃSx°*KFõˆ>”T_Iá7#„k=k,,‚Ð.`%QÀ Ø>ŸÖQçߦÚÄeôj,$ J’R“ДÃÍ‚ ½§èŽBU…gÙÿ¶-ž{ꮤ…Æ›‡«ÊÛ*¹¼¼}zΜ9ññññññsæÌ)**êä`žç—/_>bÄN7räÈÕ«WKÝ<!Um`f1@'¤-ÀÓ¦MËÉÉ),,,,,ÌÉÉ™>}ºÝnïèø äççõÕWõõõ~øá‡~(ió'ÂWÀŽi ¸ جÊâ 8“†%I)‰IhJŠáfÁ“¶¯X±bâĉO<ñ„Ùl6›ÍO<ñÄøñãßyçvþî»ïJJJV¬X1hÐ F3vìØÿüç?’6Oq"yòUÞî0x›ÿ´òrLCœ:•Kìõ«ErÒТ$)%1 MI1+xÒàõë×Ï›7/pϼyóÖ­[×îÁo¿ýö< i{”.’'Ù©-,·«M\Š:™ âÛÉIC‹’¤”Ä$4%ÍÍÍ•» Š'm>tèÐèÑ£÷Œ5êðáÃí¼k×®ÆÆÆ©S§ †¸¸¸K/½tÇŽ’6B¨¡ø¬{29ŒÀ茴Øf³µú{011±£žƒòòòûî»ïŽ;î(,,¼£ƒ%m HGH¼«¥g¡Öl0¡úD5Jª¯¤¤-À3gÎ\¹reàž•+WΚ5«Ýƒ¯½öÚV÷}ýõ×矾„탩-·é|.ÿ¶KÍi^µˆ Òà{î¹gçÎÏ=÷œÍf³ÙlK–,Ù½{÷Ýwß-xyý®»îzë­·V®\Y]]]]]ýÁ,^¼ø©§ž’´…ʱ+`×ì,ÁICŽ’¤”Ä$4%Åp³àIÞ{ZPP°hÑ¢-[¶B¦OŸ¾lÙ²~ýúµ¼ýÙ×ÖËÊÊ/^üŸÿüÇn·çääüå/™>}z—o>`ÙYó¿Aû¾ôo¢sÝxãTÝXy›’ÊËË£dÖéJL4”.`ÙZñÙà‚íþíMb‡_9?[%o“BB©ƒ°€ªºÀ›€¹tUR'AV–ˆ|5ÆÑr°=!>†Ñù‚›4ä(IJILBSR °’Dæ¸ÿú&ŸÙ]'>Ô¥¤ÿš‘™T ”$¥$&¡))=Ãͤ ½§è–WÁ‘ŠŒ—ø·uÌÿ™5;¦ë¡sŠ€>`ˆ\õÅ-óš…ä$ +Id®€í© •šu"3©(IJILBSR °’DæøÆÖR€«Mê4.C #3©(IJIL‚¤ÐÑÐ{Š>`y^úbv]‘û‹™™7_ð˜¼í€0°X,ÙÙÙr·"Ð ÊáâÍË0¨“C0"%ÕWR(À”Š—Ùe÷o —„ °ºXI—•Žu§+Ù3gêb™TCFH^6“J„’¤”Ä$4%Åp³à¡+IN}î(¯·«LªL.4÷ E`R‰P’”’˜„¦¤„<`%‰ÀIv<Öq»Ê¬NâL!yÙL*J’R“Д477Wî&( 0EÝT*n;MF†0 "`%‰´°=^Á° ›šªWŽ´¤Ò¡$)%1 MI!x(ÀJi£*k½©Žzñ¡>­o¨^9Ò’J‡’¤”Ä$4%¥g¸™t¢a LÄ!—_ò+†®n^†Á¥fŠh˜f ¼M€ð°Z­”txc"ˆDŽâ"q»,IÕG•*cc œ(©¾’B†Þs[ Äíª}#_[XI"mlM}±¸mO4‡ð•#-©t(IJILBSR 7 ^4ôž¢X‚@N¾ôdVmÿáŽ.¸dôÍò6 Â&//’YGÐ ÇZïMnjš2ÉØ3Jª¯¤P€¡—¬EÕ:ïß¶ëØTóyÛ ,(ÀJQ“¯Ö—ˆÛå ªT.1„/QI%EIRJbš’BðP€•$¢Æý»jNˆÛ5 q\H¿K•TR”$¥$&¡))=Ãͤ ×0KÞ|qdQó}À?\àðÛ¿eë¹[×ú·OôÑ ›¿TÞö@˜Y,–ììl¹[è†Èâ®.·kMF[² ¤úJ zCW[.n»Sdl €B¡+I䬀X_+nëÓú‡üõ#'©Ô(IJILBSR 7  °’DÈä«^/©Á)>Ìè74äo!IÀ’¤”Ä$4%Å ¬à¡+I„L²SrêçØø/õ±\º±OÈß"B’†%I)‰IhJš››+wz¬²äØ¿[ñãÁ:^iÒ‡vJJàW§’DÈ Øö’“‹7o'„üþÛmåúX)Þ"B’†%I)‰IhJ ÁCV’õð¯Õkì/!Äîõ~´y¯o!IÀ’¤”Ä$4%¥g¸™t¢a LÄN•••ý³ú8ÜÿC½^wâÄÉôôty[afµZ)éðÆD)-z˜÷ñâCŸ_¼x±ŒíYPR}% çŽ8›üüü &8ÎÀƒaûöí999rµ @:8B"`ì ¸ÝîV;NçüùóCûF²' J’R“ДÃÍ‚ çŽ8 6Ìš5‹çù¶ÿIJìW_}5cÆŒð· d‘——Gɬ#Ò••/ Q©¢¢bñâÅU?ýPß| º´OVÖÀ¡â¿Ê×47Jª¯¤¢áÜgÀáTþÂ# õ^ÿö¡ëî3æñÄf³Ùl6?ñÄãÇçw:Ö+¯¼’ššzóÍ7KÚ6%’qÔƒ·¬DÜ®Ð%šc9Iߎžñ”$¥$&¡))=Ãͤ#m^¿~ý¼yó÷Ì›7oݺu<å§Ÿ~Z±bÅ믿.iÃJÆñšÊq»QŸÁJÜwAÏHJ’R“ )ô„´¿G:4zôèÀ=£F:|øpGÇ;Žyóæ½ÿþûqqq’6 zÄ+øj:âÈ׈ô 7“Ž´Øf³µú;¹DóÈ#\ýõ'N”´UÐS¥žòT«W|¨Më'cc¢C݆´nݺC‡=þøã½x.ÓÀ%£óòòÄñV«5°cÓ¦M⟋%ðþ¶ˆz…U«VÉÒ†š ‹Ê×<jAck¨’º þƒ#ù³Õ+¼ù曲·! ¯°jÕ*ÙÛžWðïQzŠî¼ÂúõëeoCh_¡£:B$#í2©©©ùùù©©©âžòòò1cÆ”••µ=8;;{Ë–-ýúµœ]us l,Æ µû><Í~ÿö±¤$ã­ꛂ‰ ¨–——GI7°Rc1bÄÏ?ÿ¸'??øðáí|âĉþýû·ú»Cê?@ [*ÊÅÍrur²QÚ!Ðù(©¾’’¶Ïœ9såÊ•{V®\9kÖ¬vÚwJÚHè’¡Ò&nשû`€àIû›ôž{îÙ¹sçsÏ=g³Ùl6Û’%KvïÞ}÷Ýw‹àì¶Gd™|կקT»Ä‡||ÿ0¼)=ÓÌR’”’˜„¦¤`éœò–þþ’¹¾yÖ¿Ïùݼ¹í߯ T±X,ÙÙÙr·"Ð ò(³›xÿ6Ï0ê´yÛ‚’ê+)`èLcù)æÌŸ~ÕCr¢NÞöD `% ÿ ØÞŠq»B›˜jÓhzÖú¦$)%1 MI1Ü,x(ÀJæÉWB´U-“PV0éa+ÀôL3KIRJbš’bVðP€•$Ì“ìTûl“PV³™Iña*ÀôL'DIRJbš’æææÊÝÅC†{+Òj<âCoR‹ï @ˆàª’ˆKL‡GES‘±±y´et)Éa{ë0'•%I)‰IhJ ÁCV’0z°—Ÿ·+uñI‰Ú°½5=ã;(IJILBSRz†›I'¦°ÀDYóÝ_glnž‡ò'c¶îº{G ÄmH@!V«•’oLÄáfœñ“PV0a ‘’ê+)`h_‰·2­Æ+>¬V''Q€BXI¹v±·"­º¥{Ó¸0~YèYë›’¤”Ä$4%Åp³àECï)ú€¥ðiÕÚk–mõo{XîËÉÿ7÷òDy›‘#//’YGÐ áæ. mJIÐÈØˆ4”T_I¡C;x"¨«ªÅ‡ª”T³ZÆöD`% Ûä«•¾šäjwËC6--¼C é™f–’¤”Ä$4%…à¡+IØÆý{+Ó«[&¡¬Ô$%¹ð¼µ=w8P’”’˜„¦¤ô 7“N4 _ ¬[ÛôÝÔ—×Æ8›ÿ_}wèÂùó°ø6Ѓ/ìU IDAT° ¬¬µÅbõuq*} -Ô„ °’„mšY_E‰¸]©IHK ÷,z&Ô¥$)%1 MI!x(ÀJžñM‚#®ºA|XÁ¥…JzF²P’”’˜I¡'¢¡÷}À¡uÔSPñù?/8èð?Ü`š>áΫ2Â~ ‘Ìb±dgS14}À>ÅÞŠŒ€I(+ÕÉɘÎFIõ• 0´Vê9kWBºZÅÈØ€¨„¬$áY»±ú´ÖÓ|½¥Q¥‹K5…áM[¡g­oJ’R“ДÃÍ‚‡¬$a˜|•'¼º¢J|X®N‘e`z¦™¥$)%1 MI1+x(ÀJ†IvʼթÕ.ña¹*-Õ$C¦g:!J’R“Д477Wî&( 0œ¥ØW8«\œ™„ñÏ¡‡¬$aX»Ä[‘YÕR€«t©ÉrœÓ³Ö7%I)‰IhJ ÁCV’0Œz¨´—'Ôóþmža¸”4NŽï=ã;(IJILBSRz†›I'¦°ÀD!ôƒÏßû¯Rÿv¥Ö¼sê#7L5ÊÛ$ˆ@V«•’oLÄáÐÀ7™*[&¡,S¥e$b h%ÕWR(ÀТÈW‘^í–«R0 @"(ÀJ"õ Ø%ÞÊŒ*ø°Bœž O¦g­oJ’R“ДÃÍ‚ ½§è•÷ë×^»ì;ƒ«ùÿÌCÞ?Ó½@;òòò(™u}Àõµ%bõurš¸4ôñ@û(©¾’B†f^âÓ”·LBY¦IÉLÒÈØ€è†¬$’N¾Zæ­N­v‹+¸Ô ùF`Ñ3Í,%I)‰IhJ ÁCVIÇý—ø*3ªÎž„R¾{è¹Ã’¤”Ä$4%¥g¸™t¢aøa…ÄçM›'¼¹!ÕÚ|Ò‡Y·ßó»±ò6 @v„’+s–%×6W_aÔò¶ º¡+‰¤ÓÌú*KYþÌ©â“Rb¥{¯.Ñ3¡.%I)‰IhJ ÁCVéÆwÔò ƪ–I(ËU©™IrNBIÏHJ’R“ )ôD4ôž¢8x‡Ý'‹Ö¿}É»ÿá–øÉ9÷^›jÆDÐÐ>‹Å’MÅD=èiù*2ª–Ö'˲ 0(%ÕWR(À@!EÞòÌ€{„¤t–‘±9ÑXI¤[ÛVWëh‚åfUq™©½Q7ѳÖ7%I)‰IhJŠáfÁCV‰&_u žÀI(+ÕIiÉ2OBIÏ4³”$¥$&¡))aXI$šd§ÄWÙ·¢eÂRUZf¢ÌËÓ3%I)‰IhJš››+wH‘·¢YK.Òf¦%`€´P€•D¢°‹=åýÊZ–ahJÌÒªe‚EÏZß”$¥$&‰Œ¤»víš={vjjªZ­NKK›3gÎæÍ›»óD†éì¿ó…^@V‰F=4TÅ:[–Ö÷I—â]z„žñ”$¥$&‰€¤o¿ýöwÜqóÍ79r¤¾¾~Íš5>Ÿï²Ë.“·UЮh˜ÂqC ÂÊž¹ycóo_ ýê®ápƒ¼­€^8xðào~ó›½{÷&%%îöÙgÿüç?wùtü.m&â©Tú¬}ÊœâÃ"UŸì ™‡@@ï¼úê«¿ÿýï[U_BˆX}Û½Œ¸Ón·ßwß}III111W^yå¡C‡Ú=¬°°ðöÛoOOO×jµ£G^½zu(cPCò±6§OŸ^´hÑ·ß~K¹ì²Ë–-[–••Õî‘Û¶m{ýõ×·nÝêv»‡ öÇ?þñšk®‘ºyPä­è[ÞÒ\—‰9°ê»ï¾{ì±Ç‚y…»ï¾{„ Ï<ó !dõêÕÓ§Oß¹sçÀ9}úô…^xß}÷íܹ3##ãÀK—.½ñÆ;zÍ¥nK©+˜V…Jv†vP$`Hû«¶±±qÚ´i¿ýíoßyçBÈo¼1}úôŸ~úÉ`hç çÔ©S/¹ä’µk׎3æÐ¡C÷ÜsOuuõÝwß-i •eÕªU·ÜrKh_³ÌY:<`,í€þ‘0ÐBФ‘‰’¤”Ä$r'-))éè §›† öÐCù·z衺ºº§Ÿ~zåÊ•Ç<õÔSwÜq‡xV}Á¬Y³¦“×´”º¾Ù×L«Bf‰¨,íÿW^yeÿþýü±¸ç¶Ûn?~üÂ… Û¼xñâ¥K—ŠW9òóógÏžÝ!…è·ÆçGVÌúøÿv.¶`Îÿ]€`eÒëõµµµZ­¶£Úým)îdæÄ‰ç»'Nœ˜ñÄ+V¬¬iŠ”——Ú™f‹¼ýË[æÀâ²ú‡ðŃò¤‹’¤”Ä$r']¸páÕW_}ã7&&&îÿË_þòä“OB† ²k×®+¯¼Rü§÷Þ{/ðÈU«Výßÿý_àÃK/½´Õ»äææ~ðÁK–,éf«ehpi­]‘xREEŵ×^ûÏþsòäÉÝ| ÓU«V‰Çäåå‰=ÊV«5pÑ’M›6‰X,–ÀIÆ#êBÛ†S•GÍõ>ÿ¶—c+Üòÿƒÿï¶Hþ,Bõ ‡Cö6„ádoCx^ÁÿÕíþ+„Ö¹çžûØcMš4éóÏ?·Ùl‡c÷îÝ×\s8`jÑ¢E .ܾ}»Ýn?qâÄŸþô§êêêÀW8räÈòåË+*****–/_þú믷½ø™gžùàƒž}öÙ‚‚—˵{÷îk¯½V¢Dááÿ€:ª#¾± ¥”””òòòÀ=eeeiii<¥¸¸xôèÑ›7oîþ»H"ŠmÚû¶ëñýÿ;öÂSUµ¹[ÁÚ±cÇ5×\“œœ¬R©RSSgÏžøuùòåƒV«ÕYYYÏ<óŒ×ë…Bïºë.³Ùl0®¸âŠüü|ñ‰¿iO:uë­·&''«ÕêóÎ;oõêÕaK~Ò•iÇO›6íüãå—_.îùæ›o^xá…-[¶´{|iiinnî²e˦M›ÖýwÁ(è^ÛºöÙI{›ÿþÝ“6ròƒ÷ÊÛ€H£ÔQÐ3gÎluÙÊ•+gÍšÕîÁ•••¹¹¹Ï?ÿ|ª/UB;ͬGð¦•׋}ÉCBøâA’}Bݰ¡$)%1 MI!xÒà{î¹gçÎÏ=÷œÍf³ÙlK–,Ù½{wàÜ—×sssüñ«®ºJÒ&)Zh»ŽŠ=e}–6êî˜Æ0 g­oJ’R“Д‚'ùÅÛ‚‚‚E‹ù¯9OŸ>}Ù²eýúõkyû€Sûvûºm6[àˆùvátïì-Ü<úí¯üÛZ5ÿÐ IF܃péJŒä¿pû÷ïßÉ,e©PDìÑrâß½–{1Ë0E¦„Ѩ¾a‰·!Axlûü¿+~<øïCÇ ! ‰AÍ =…¬$w©ÉÑôÚG›!¿ÿv›ÝãÕ÷ªW‰&p”$¥$&¡))XIB8ÃΟž|ÌéöBì^ïK»÷Y³~R2k¡&)%1‰¬IëêêFŽéóùZíïd* ig™€® +I«y={­²²rÅ?VØ=BˆÃã}yÏ.O}—Ï §P%|”$¥$&‘5é»ï¾[TTôÅ_ÈÕè)`=òÈ#|ÀŸÉ^^X¼x±Œí€ ñ<ÿÏþóÓO?]¶lY÷Ÿ…¡¯òBV’ܥüüü/¾øÒím)À¯wÍš5þÅC%$I’¤”Ä$ò%ýꫯFŽyÅWÄÅÅíÚµ«“#wîÜ™––öæ›o’€KÐ ÃØíö{ï½7!!!))é±ÇÁápÌŸ??11Ñd2=øàƒþI+ýJJJxุ¸üáp:’¦‹V¸óDIB2É΂ ÜnW«N§sþüù{öì þõC‚žé„(IJIL"_ÒW_}õé§Ÿ&„Üÿý/¿üògŸ}Öîa_ýõý÷ßÿé§ŸN™2¥Õ?ÝÿýS§N}á…jjjæÎû÷¿ÿýСCS¦LY²d‰Õj;wîo¼±páBÿÁ]tÑSO=õüóÏWWW?öØcÏ<óÌßþö·ŽÚvÜSxÜSšœÁ¢î7DݯëãÂ%¦°ÀDÝ·aÆY³fµZ‚ÛeÙ¯¾újÆŒáo#??ÿŽ;îð_Äây~ðàÁ[¶léß¿¿ÿ_Åß~øáòåË¿øâ q6$ñŸ†yõÕWÅúºsçÎË/¿ü¹çž÷ìØ±ãøñÇÛ¾»Íf7n܉':jÞ×öm_Û·‡*l0f&Ï4´þË£K žˆ"JEEÅ·ÜŸqb§8ö±lÌ >qÄ•«aÐk¯¾úêC=äßfYöž{îyíµ×^~ùåÀc^|ñŽ{÷~ÿý÷111í¾ÈìÙ³Åí‘#G655î9÷ÜsOž<éßv:K—.]µjÕéÓ§ýëirÚD”ˆ†sGœwŸ õo|“[úµÿai¢JXøèU¦¼­€^«®®7nÜñãÇ5šæE﫪ªFŒa±Xâãã ! øÝŒüüüôôôÀçžó<xWR»{ü?üðÃGýÛßþ6dȘ˜§Ó©×ë;ù%Œ3àŽà XIV­ZuË-·ó ‡O;û×bÈU¥ݮР>©RP’”’˜Dޤo½õVaa¡V«mµÿwÞyä‘GüÛjµzéÒ¥S¦LY¿~ý9çœÓîë´½'¸£»„?ûì³={öôéÓÇÿP<3îÈu¿™†Î “ˆê&8¦Í‡ë˯Ë{AÍ7^}ç蹃IÐkgРAÛ¶m{|ýNœ8qùå—?~œã8ñ7ä×_=þüýë_“&MòxÜê·h'{Ž?ž””äß¿xñâ—^z)Š +u=`ˆ(¶FŸÊrP¬¾•fUBz­ =õù矟wÞy­ª/!dРAÆ ûòË/wΜ9sõêÕ7ÞxãçŸÌ›^yå•?üpyyyeeåK/½TPPÌ«Ñ ˜"ßýØ8¼é¨øð§ÁÚÁê¾2¶‚ôꫯ>ðÀíþÓƒ>Øj!ä /üöÛo}ôÑÍ×ÑÊòåË !#FŒ:tèáÇßÿý^¿å¢áâ-=— óòòz=ÓlA¹û­µåO”,ÓðÍwÓ¿|kò#Ãþ¨aÔ¡k`È“TY(IJILBSRzà4Ä4³^Ÿðé÷uCì'ÄêkçT}#³úLu(‰IhJ Á‹†sGz΀{mÓÞ†Íûî«ü¨Ÿ»Ä¿gëØWîW.–µ]‘gÀÐ{eVïÖ›Îu«/!äÇ!ºlU–Œ­  °’ôbšYA Ÿo«#>ßuß‹;ó³µEiêê>!m](aêà(CILBSR °’äååõô)Ûi*(wOjØ“àµù÷ø8æ«I±Yª4=ÓúÎýÈÑ‹¤ EIRJbš’Bð¢¡÷}À±5ø–®®Ò¸›-{KÇ7¯ö¿×Sã¦ë'\s©¼Íˆ|è†ÞX»³Þí¦×m«¯]Çþw| !d(îP >ø`ìØ±qqq ×\sÍ–-[zýR;vìÈÉÉÑétþ)'[=„0@ŽZGN»žr¦xkÆ7þ$îÜxAL“žM`Ã5ƒdlôÂsÏ=÷æ›oþóŸÿ¬¨¨Ø¾}»J¥ºôÒ–ëX=-œ÷Ýwß’%Kšššü§w­B +ɦM›ºy¤×'¬ÛQO™iÛÌ’æÕ«ÜŽs „†I*Ñˇu?©ÒQ’”’˜D⤯¿þúÊ•+Ço0FŒñùçŸ?õÔS½~µ£GæææŠ+ ¶za€¬$ÝŸagËUuÞáŽãƒ- •|95ÎË‘Ö8Aw®4 zæ¢$)%1‰ÄIkkk322÷<ýôÓþ ÿé/s†xÀ÷ß?~üxN׿ÿwß}WÜÏ0ŒÏçcYV|Šø°;Oüë_ÿÚ¿­V;dÈüã’%ŽrXŽPIº9ÉNM½oëMzÁuí¿âÎ_³4i !WEüé/¡i:!J’R“HœôüóÏ÷Ýwzè¡¶ÿ$BÛ±BÇŽ»îºë^{íµ3f=zô¦›n4hÐÅ_Üîñ;y"!dÁ‚III›7oNOOß·oßwÞ™œœ|ã7vÔlþÔ¯ÂIK°áC˜Í,w+ZDÃøaŒ‚nåÝÖÃ…®Ù¶ÿœßø³—#/ÝšXš¨J`ãŸMXùÚ:|øðìÙ³ Ãÿ·wïAM]ëÀW’”ŠVAšú(ñADÐñkåˆîi{JÍíé8SjÑ‚­gl¯#W;¥ ÕZj+UFlõXï  ž©‚âûY“ ‹( ò0 ¤&@B Éýc×ÝÔ„-HvÖ~|¿¿ö^Ù{ö÷Aöú²ŸkÙ²er¹|Á‚aa pëØªT*…Bñᇳeee{÷î-//wº¼ý,ÅŠà“O>ÉÎÎ&W¬¨¨ÈÎξ|ùòPa[NWZª*G“¸«ŒY’0F™0Òµà.h€B Oÿy»ÉT×ÜÿbsL¯†lüi¶o['bÉá/^¦ÜÀ“Ly’&¢9ÓˆˆˆÛ·oçææŠD¢²²²èèèW_}µ££c¨å/^¼˜””DÎ.X°@­VgCÔ+¾ýöÛö ÇÇÇ×××? @‚SÐlòÔ—ìØ:~É ´ ¤vW ÿd{8æ§Xo„P ‡_œ8’ö(]?¯âI¦½bÅŠálè™W#˜M:Dñé/¦ ú{ãÍZbÖ&~ÅÏì)@ÍýÇ<ñLw„è"Ô™r O2åIšˆæL/\¸0sæÌÌÌÌçž{nâĉüqffæ¦M›ˆOóòò6nÜ(‰ÈgyåryEEÅ‘#GÂÃ÷oß¾~ýúálè™W#Â…«§p ˜ð]E÷œ›§ï³?O%ú#„B=ÇoðWy àrŒ<†ž¢ÇhíjlŸjüã½WÕ³|Bþ¾küþÕ˜ 0GܸcŒ×_ ß¦5N6÷ôx¾ï÷Z€‡olAfб¾kíŽîû…œ=5V€Ðù® õtþÃñgTsždÊ“4Ÿ2£˜M†zÍlG÷à¤ækBë1ûÈ×C#-#Špct®¯æž¤‰ø”)=.ܾ7a•_ÐÅþ{‡¿EOÌ–Í÷½;n«4}¬@„70`;¸ ÉjCÆ[?“Õ×ì)¸<Ãû?}–Bõ&ƒÌ&N_3[ßÒÕu…œ½2C<^:[$wc\®¯æž¤‰™)9â¯H$7nÜÂ… ·nÝúàÁÜq(À¬âôþŽ–ÿ7©¿˜¶ ç¾÷Y.p\ŽUøs' O2åIšˆ©™Úl6›ÍÖ××÷믿~ú駃!**êèÑ£ÃY—|­F6›-==ÝjµâÄŸpõ”ç×€¯çÙUGL׆‹þþêß|–â ÀN{È[·n½òÊ+gΜ‘ËŸr¶Œ ì÷ß¿jÕªƒ¾õÖ[îß:\ÎýÖ3øå¿¾±>þr\‹\é=oHæ›9sfVVV~~>ÙÒÚÚš‘‘!‘HÂÃÃ7nÜh2™ÐãÃ_ò$6õÂ41YYY¡ÌÌ̾¾>ú6ä~P€ÙmÏ®o^Sÿ«¶!48F5m¹î½ CJJÊÙ³gÉÙyóæÍš5«½½½ººº¹¹yëÖ­!âÈÏöõÂ4ÉÉÉ1!£ÑøùçŸÓ·!÷Ãnaô˜p†Ä=Nž<¹|ùrrÖh4Ž y¤×7dü£}²÷”59Üòè‰L9Œ'™ò$MÄÈL‡ê!M&S`` ÓcJNs÷î]ŠÕ.ìrZ­öÅ_ìíí%f}||îܹ3ÔÇ4SÐ!„bccígsrrúM&„PßààŽË7º&<Ïê‹2å0ždÊ“4«2µZ­äYe“É”=}útooo@ØÜÜ<ÔŠ#Zx”Ö¯_?88HÎ lذ¦m¹`6±ÉŽV«ÍÍÍ5™Í!ãÀ`þåŸ ~ÁøBs1þ¼Nˆ'™ò$MĪL›šš&L˜@LoÚ´éâÅ‹‡îìì´ÙlF£Ñ~\á'ŒháÑÐh4%%%ýýýd‹Ùl.))¹yó&›s?$‡­žøa8hµî/<‘°äC°Hiié¢E‹ˆé£G^¹reâĉÄì½{÷†\m„ Æš5koï2™Lï½÷Þ•+Wœ®Â.pÌ& ÄñÃÐl6“™-–Šc'9óÃÌ”óx’)OÒDìÉT­VïܹsýúõĬÑh‹Åä§EEEä´X,¶ïj¨v¡òòòK—.9>ûkµZ¯_¿^^^NÇFÝ Ž€Ù„|Éç2ðuB4áI¦|Hq¹÷áÇtlÔ͸pÿ0î‚&”——'%%9})Œ‡‡Ç±cÇV¬Xáþ¨ÌDÞi% ýýý§OŸ®T*W¯^ý /Ëtww¯[·®²²Òjµ¦¤¤|ùå—‰„èWOž<¹nݺ{÷îY,¢…baN¢¯Äp¡tñ­ïß¿¿¾¾¾óQ¯TsIð8okÜ\/¡7BhêÔ©ï¼óÎø€C Sá[&œ¨.[vê41Ý zaC.Þx€“à9`€B‡"§…ïÓº n},Ý ì3å6ždÊ“4Ÿ2£Ç…cGZQýž¾Ôf$f[ÿò—ðyÌzùp„ìn¦¸ÙѪýã.èI1˜"¢ F@sždÊ“4d F‚Yøþýû©©©~~~~~~©©©---¸#b¨ûÍ7„ƒ¿ÿ"Óû=¥ÏáÀH1¨÷ôô,Y²$::º¹¹¹¹¹9::Z©Trlð©gFŒGMNïÛú99awÈ|qxF *À………qqq›7o–J¥R©tóæÍ±±±ß}÷î¸á‡~øöÛo‰éožü÷bB„oøSÆÓÀ@ *ÀÇW©Tö-*•ª¬¬ W<ÌAŽG-òkÿ÷ì,„ÐG?Õô "„B䑘ã0r *Àµµµ …¾%22²®®W<Ì‘““CœŠzyþø×,a=‚°Oäå‚;@#Æ x„Baoo¯——Ù200àëëk?•SÜ~ I«Õ†……šLNþÞ^^çÿç¿£þù±û£¢·ÿ§öx’)OÒD)ñâMX£)À4‡€¿h*”  I*•vww7ŽléêêÎèÖÌù ár&>>žâVpooïsçÎEGG»3*£Ç kÀr¹\­VÛ·h4šˆˆ\ñ0ÓaíCº-®Â œ˜˜X\\lßR\\œ””„+ì†Ú—Ʀ^aÐ5`ƒÁ P(V¯^MÒ}ýõ×EEEjµÚÇÇwhxÃÓF§ÓÙ*•J## † ÖaPF555eee>}!¤T*wî܆;(Àõ˜U€ž`Ð5`€? @0€ `À 0€ °Õjݽ{·\.‹Å3fÌ8räîˆha±X fÍšàïï]PP`±XpÇå7oÞ\³fM@@€Ó¡5îß¿Ÿššêççççç—ššÚÒÒâþ]…"Óššš×_=88Øßß?..®´´K„.Aý%uttL™2…Õã©PgÊ¥Þ‰"S.õNOÝ ]ÙÙØïÝwß]½zuCCCÿõë×pGD‹ŒŒŒ9sæœ={V¯×?zôèÌ™3111¸ãrˆˆˆ-[¶Ü¾}Ûñ;i0d2Ù¶mÛº»»»»»·mîoõ£IDATÛ6eÊ”ÞÞ^,qŽE¦¡Å‹Ÿ?¾··÷êÕ« …¢°°K£G‘&Éjµ.[¶ìСC¬îˆ¨3åRïD‘)—z'êÝеÝ‹¿÷„ªªªÄÄDÜQ¸ƒD"ill´oill”H$˜Â¡‹ã¾ŸŸŸ––fß’––¶k×.7E ÇL?úè#«ÕJΪÕj™LæÞ \¢¸îرcÕªUÔ˰ˆc\í3åRïD½º¶;bý)è½{÷fddàŽÂÄb±cãØ±c݉›?~\¥RÙ·¨Tª²²2\ñÐ'77×þäÞK/½Äê“íÔnݺUXXXPP€;AïäþHFz7tmwÄú|éÒ¥žžž… z{{K$’¥K—^¸pwP´xÿý÷ßxãsçÎ ƒÁPSSóÚk¯­]»w\´«­­U(ö-‘‘‘uuu¸âq›ÊÊÊ3fàŽ‚F£Q¥RI$ܱÐz'Üq¹À»¡‹»£g;pf‘H´ÿ~­V«Õj÷íÛtîÜ9Üq¹žÕjMNN¶ÿß%''ÛŸ*áÇ珞——Ùl¶o1›ÍB¡ÐAÑ‚zïëêêš6mZMMÛ⡉Ó4ÓÓÓ³³³©—aÇ,¸Ú;9fÊÕÞÉq7tmwÄúï½——WQQ‘}˾}û-Z„)åä䄆†–””ÿKJJBCCóòòpÇåbP€m6[GGÇ‚ ªªªÜMÓ,--?þàà Å2läô«ËÉÞÉ1SNöNNwC(ÀÒÙÙiߢÕj½½½qÅCŸÉ“'WWWÛ·TWW‡‡‡c ‡.ŽûöóÏ?ßÑÑaßÒÞÞâÆ h1TÕyðàB¡8uꔛ㡉cš2™¬©©‰z6rÌ‚«½“c¦Üë†Ú ]Û±þ°\.Ç‚›´¶¶ÆÄÄØ·ÄÄÄ´¶¶âŠÇmär¹Z­¶oÑh4¸â¡U[[[BBB~~¾R©Ä ]îÞ½;yòd„9Á%Ð;áŠg”(vC×vG¬/À)))ö-'Nœ˜={6®xèzãÆ û–«W¯Nš4 WÃéd8ÐÙœeÁÕÞÉ1S.õNÔ»¡k»#.|ïÛÚÚÒÒÒ¤R©H$ŠçÌÅ3G?þøc\\\@@@@@Àœ9sŽ9‚;"—¡þuØØØ˜œœ,‘H$IrròWÙ…"S§ét:¼?›ýÜgu¦Î”K½u¦œéžºº°; µ=Їõ×€6‚ `À 0€`(ÀP€  @0€ `À 0€Áÿ¸Í|¼ý^ IEND®B`‚gsl-2.7.1/doc/images/interp.png0000644016036000116100000000316013373111455013252 00000000000000‰PNG  IHDR::3ßmtEXtTitlePNG plotË¥°H(tEXtCreation Time16 Apr 2017 14:17:46 +0000.Ñ‘_(tEXtSoftwareGNU libplot drawing library 4.4e¾†IµIDATxœíÝMŽÛ6`7s€ÁçèŠÇé%Rp€ GвNjYdWo»(ª "ª ´ ýÕ²DY¤Ä'Rï¥Öh(Úú†IS~ñw5M:ìbˆ!†bˆ!†bˆ!†bˆ!†bˆ!†bˆ!†bˆ!†b¨Oy!i 44ÐSÑ@)7 vÎ †¢Ë&»ÜÊf_^nMA~¹UMAx¹%ÔEDPD]¶Teª ?.1 & ÃI8B048n}ÐLbh>© huP¸:H® ªêµAåê 34÷âÿÿCÙê duP´:(\$ç¡.NÕ@'‚Uý$TPA%t¦‚r*(¥‚2*(¦‚*èHETP¸:HA4ø‰‚zÍP@ *HÎC·*m3 ÝB@* 6È2“ÎTPJÅз½tt€œNvàÅǃœ…D»y„¡ùUÒ©FóP¡@,”»@.';s\Æš ž¢G@ "¨eBg*(¥‚b*( ‚TMäA}£a¡¾Ñ°PßhXèö÷$RA’¼â3ôú A©yYòÞP9È£ |GAé ?Á1¶xGÅØ’AõÔ†÷¢ € © IUÖO¨î` óp G ʆ;h8BP¶Ðiwb  T$‚*`Ï *µ=¤ ¤%PÕ=&ÓKý¡s×î‰VºJ»±¡/Z%õß×m€…¢®½ º?I,$Z£ÐKáÂ~ ’íéÑ;öLH#š€š#šËÇÅV(›Š45i^dõþ8M£²«Þa賜€šKâæDwÐ'ašfPMÄØ®éÂìF bl×#Žf7š©‘úòðLÌËT¸ù§:ä*Þì} ÉÛµ¨Ú™Åþƒ¶…ðP¸Nhœü!¹Y¨•l*G%›òQÉf lT™’QÉf qÉf p+Ð8X'-w°Îy?µÕA¶i¡[²Í€ló#C·d›º%ÛDËPðê¡pt\¸ DPõ!¹*© œ J© L˜Á:ëŒ ëþzkÖÈyö£õAÖ©†Š=4ì냬SÿÝ ëDËPŸ¬íˇÌý A!C³Ü,dŸÖî‹ìBCFŒ €übldOÍ>Ý ²O"÷‚ŒÝ@RA‚ ’Dðé™ËCöËuOH_Þ…€ì—ëž0øïƒß‚>2Ê Ò÷PH *HAИõ‚ 1ëAC †Œ¨üa1d¬?Z+¢5¢‚ê€2‡ˡB¿²!0Æ–kýÈ\KçQ£,‰ìõ>i4Í@_µž ŽúWƒ ÉÈkÐBsˆ×Pò€ ÉÈ Šj(y@$¨ ‰†Ú¥†ðñ€À9Ä :í®ܱ] ÷mÒLóP!Ú•¦pÇv€žëê¨á‹#'èÃåd_à UMmž/÷$t}^Hè ¶Ô6Öµçø í¯Û“|DBj2ÛíñÒêÿ@b¯‘[ó?&¤ úæÿ ‚úsû»ª·‚RUàÖ³û±ö‡:îWUWõûUó?€cmybˆ!†bˆ!†bˆ!†bˆ!†bˆ!†bˆ!†bˆ!zè?Šqåñ¡)hþIEND®B`‚gsl-2.7.1/doc/images/interpp.png0000644016036000116100000000412013373111455013427 00000000000000‰PNG  IHDR::3ßmtEXtTitlePNG plotË¥°H(tEXtCreation Time16 Apr 2017 14:17:46 +0000.Ñ‘_(tEXtSoftwareGNU libplot drawing library 4.4e¾†I•IDATxœíÝÏnÜDð =æ º¯€„B„øÈ#pê¹Grè¡íˆ#‡<@KüHH™Hr@Í¡‚v¨*ÕBªê ±]{=Œíýã?3ãYÏ·^}£6ÞõÚ¿Œgæû´™Ì:¦\ „B!„B!„B!„B!„B!„B!„B!„ЪD$r@ À \ÈsC6.Èg@—æ³ù»4ovq`\Ôçz³e•ür–›¤¶Y”›lè,d Ðüh>ò2ZÈ  „B!„ÐmƒÎa ìà ôŠÿк¬É VÛGGQɾýB¤¶OžG: KcÈdŽ­ñÍäyÄäÒÀ F˜ÊóÈ>!y1UÔè&yBÚ'$OH&P3&À Úb»‚šÏ¡f À iB2È® iB2€Z# ’&¤!¡VÚƒ¤ ÉjU ’&¤!¡Ö°Ùš;œJ!ifÓ@žË (+ vŒ‚At;Èg‹böPN>ÇÖ>­Mw̱…EÌ mcÿu˜ŸBì¡rµ!YÒÖAg@Ðü(0idÉ’vwЂA’4&˵û…d¹¶’|{0H–"„$} ÉRd7$‹0ˆöØè ÉI2ü6BDIzrÏPwØ´!é›!0¨;#ì’¾…•ì¼…ÉÏ ·’Ï_‘m¡Kc¨s²¨FL1YHÿ“Bí½ÃAT µ/x8ˆìjÓ.Hšiǵ“K¤ø•ÔÞ=döû½@íq:¤Z&ѽAª59loPë„Pþ¡S%Ôª©Ê?tÊ(T¬ˆƒˆêšœ¬ODq0ÈUB]ó®u(s^*œ-¡ˆ¯ĵJ+Ej&ë<7äʵ }¯ù/TP+Ej¡W0PpôvEÓwj¨•";¢ÿÝCtOÐo»‡Øž Ùî¡fŠÔCÙ¯ÆÐ ÓÖèK%ÔL‘ï©:5†R¢…˜j¦ÈŽÆVר uÔè+%ÔL‘ÕA™:ÖšÐ?L[£ú«:(­?5‡š)òýÞ¡fŠtÓ¢c‡Þõ†/j¤ÈÆ A—\YÐï½kÔȵçû‡¹ šö†) Ê:'¢”¥~æ zf[ŒJ, ::¨öZ8¨–À ߪ%¤Q@µ„Ôœ‹Ý TKH`µ€j§‚Ad P-!é ¹9¦P¦Ÿ \-D¡Í§» Eçdª¼¨…ªŸÌ Jº ‹{/ÔåÙæáóš9¶ÎURdhÕkaõáPåC§òRÉl¾~Žmý¡S;(/Z¨’ÙÀ Ö"Œ­ Ê¹vP%Б@ Ú¼JF­£63Y4´ŽÚÅX ¤ò`Ð:jCKh}òh êÍCì 1[ˆm¶0µ…*7¡ˆ-T¹¿Ž´ ¶—PÐ[n -£ößnH3ÇÆ7gç3¿±›´ÓuA´øú šk¨|Ý·¯ÑæÆa–P Q{hs—6Khsß8K(«ký¡Í½õl!Ê—-n 1(È_þ·†ÂÕA¶PÌ—‘k e$ÿq·¨ä-ïõh EÓ Ä¿ã@GhLP± ®|hwC÷bA4¾ûùëØ`  ¢±£Ÿ¥ä'øÊµ°¥15yêû“n½R¯Úš½€@VeGÐkþ:_Äsͯ£Ãü½}Æ'Ųžé‡b:é$ÿ¹`’æÓ´§üεzΟÅ4ÿ™åMäp~CÒìk1 l*Ø…Ïžo–zß‹Cïg'oÔÐ9?ËÿÄ#³‡â™Oç 1²BMųļǠã@|¯,I“ÚúRtR@i eêÓ “ãûb(¹Žû‘hœ™›Æ^³ìÑ‘ö<þN€bOøh¸˜®c}<«AA]•wT@—FЧ~zœÐÝ:nQ#Ç«B$ΡtZ@™#Þ (ÑBwKèôó4- $+ ?Ï¡,Ö@•^ój½½–½–“¼×bM¯= Ÿæ<çêáÕCÑFÞi*¼à,›Š6ŠgßxŸ‰Æñ~:9Ýò2¹RCσrdÇobQ±›GåÈ>žNä#û“Ãbd?¹ó£8ôþ•nd¿ËXK®SqýÑbîLD¦Ñä0µ§E¬ý|ù‹Øœ2]¬Y„B!„B!„B!„B!„B!„B!„‚‡þ^s–ZÈ™\+IEND®B`‚gsl-2.7.1/doc/images/min-interval.png0000644016036000116100000003301213373111455014355 00000000000000‰PNG  IHDR€@£¯Z]bKGDÿÿÿ ½§“ IDATxœíÝy}šçŸÿž,"Òzå7nܳgOËÈ8;;ÛÖÖ6//O¥ÜJmmmÿþýø@`‘< ‹Ífkjj @ ±pEE…¯¯ïÔ©Sù@pqø¦ƒ•O›6-..®‹«êÑ—K>>)))çÎ#èáØ±cÿüóÏž={H’0ƒÁÈÉÉ155½sçΘ1c¨I4õèÑ#‹Å}ËÉ/Á¸sšššÛ·o···¯««#WMM½½ý¨¹åä—ϸ٢E‹úöíëããÃïH@SÎÎÎâââ§NêÊ›1îª'NÄÆÆ†„„‚Èßß?##ãСC¤ƒÝ˜Á`¤§§[YY¥¤¤Œ1‚¯©€^ž>}:mÚ´¸¸8uuõ.~#à¯0qâÄÍ›7/X°àãǤ³€ ¨­­7oÞ®]»ºÞ¾|%„#`ƒÁápììì† røðaþ¥quumhhþªOñoÜ‹+%NDDäôéÓ:::S§N?>é8@XpppJJJZZé ÿG8GÀͲ³³ÍÌ̺r™±æE$$$|Ãä3Ž‹ñãÇ{yyáÊ`€î¬ùªß}ûö È¡ßÂ<n¶xñb))©ãÇó6ÐÂW]õÛFÀßîøñã·o߯m¢º¡“'O>|øP®úmKøGÀ #;;{úôé·o߯m¢ºÌÌL ‹¤¤$55µo^ FÀßeüøñ»ví²µµ­®®&¨PQQ1þü£G~OûòU·7[¹reIIÉ•+WDDDx’ SSSÓ¬Y³444öîÝû«Â˜Ž=úöíÛ}ûö‘üõûï¿×××ïÚµ‹tŽç8Ú%**¢«««¥¥ennN:ðÅõë×ýýýÝ",,ÌÃÃ#55uàÀ|Ý|¿¢¢"==½“'OZYYñuCB2­¡¡‘••Ž$;;[]]Ê _bggçèèhccƒ²\}}½­­íÚµkùݾ|EiÏš5+00{I``àœ9s¨ÌÐíÛ·÷ïßÿçŸ&:²víZ%%¥M›6‘ò](‚®®®ÖÒÒZ¶lÙªU« ƱcDz²²:¾§` º%áäÉ“ÝÝÝW¬XAÁæàk8pàܹsIII<9ôÛ):MAs¸nu[ZZ:...--mذaÆ {ðàAll,5{°‹šOÈòôô¼sçé,ÐZLLÌž={xuâYÝña ºuë–««ë½{÷”””(Û(tìÅ‹ÁÁÁÆÆÆ”m”N#`!0}útwww[[Ûºº:ÒY€Á`0ª««gÏžíééIeûòFÀ_´páB‡DÇ뻄ISS“Í Aƒ¨Œ,FÀøùù=þü?þ  »ûí·ß***¼½½Iá¥^¤.qqñˆˆ]]]555{{{Òqº©sçÎ]¼xñþýûbbb¤³ð¦ ;‘™™innÎf³uttˆèÎÒÓÓ­¬¬bbbÆG$¦ ‰a2™'Nœ°³³+))! {)**²±±9}ú4©öå+pçæÍ›çììlkkÛÐÐ@: @wQWW7wî\ww÷Ù³g“Θ‚î‡coo/!!qöìY‚1º ‡cgg'%%EüY±˜‚&LDDäìÙ³?ÆIÑؼysii)õQ gAw•„„Ddd¤¾¾¾ŠŠŠ““é8BëÌ™3.\¸wï^ïÞ½Igá#LAdzX¬Ë—/Ož<™t!tç·„„„Ñ£G“ÎÂ`` Zp¨««Ÿ9sÆÖÖ6//taóäÉ;;»   i_¾Bµ3flß¾}Μ9ïÞ½#@x”——Ï™3gïÞ½¦¦¦¤³PAP¦v;&8SÐ-Ö¯_Ÿ••-dwf ¢¾¾žÅb±X¬mÛ¶‘Îòÿ𯀮ØÚ%€ÜØØhcc#//úôiÒYèÃá8::Šˆˆ Úóop XàôìÙ3444''gçΤ³ÐÛ¯¿þZXX híËW¸ éÛIHH\¹rÅÀÀ`èС‹/&€–üüüÂÃÃSRRÄÅÅIg¡ ø» <øÆ&&&ŠŠŠ,‹tš‰ŠŠÚ²eËíÛ·åääHg¡šÀ[m—ævûöm;;»¸¸8MMMÒYh#''ÇÌÌìòåˤ³|Ž 4##£Ã‡[[[ã‰I]TTT4sæÌrûò ˜7/^lmm][[K: € «ªª²´´twwïÎwöè©Ý>ÝŒÃḹ¹•——_¾|¹W/\hßÇ­¬¬ÔÕÕ9B:Kçp0=r666Λ7ONNÎ××—tAÄáp\\\ªªª.]ºÔ³gOÒq:‡cÀôгgÏàààÜÜ\///ÒYц ^¾|J‹öå+Ì”ò˜„„ĵkצL™2pàÀµk×’Ž @öíÛ˜˜ØÝ.ùm ˜÷Èf³§Nª¨¨hkkK:€@ =räHrrrÿþýIgô8¶J—cÀÜ222,--›o•E: a111‹/ŽUWW'åëà0ýhkkŸ?ÞÖÖ6''‡t’uêÔ]»v‘Îò]„äNX222ÙÙÙ***-K^¼x1~üøªªªŽ?(ÜÔÔ´pᆆ†°°0\~ÂíãÇsæÌQRRòõõ!ç»ÉYÐíþúôéCeRzôèqöìÙÚÚÚåË—ÓýÇ@/^,!!qòäIº·/_QZÀkÖ¬Y°`Abbbuuuuuõ;wìíí×­[Ge‚ÄÄÄ._¾üìÙ3wwwÒYø‚Ãá¬Zµª¼¼<88³}£tj—ÃáØÚÚFDD´,™;wîåË—;ý‰$SÐ-ªªªLMMgΜ¹uëVÒYxlãÆIII·nÝ’’’"…7„d zïÞ½W®\©¨¨¨¨¨¸råJFFƺòY‘öÐñ™222QQQááá{÷î%€—¶nÝú×_ݸqƒŽíëååÕnÑðo‹”Ž,‡`llܲ$!!ÁÍÍíùóçP˜FÀÍ §M›æáá±bÅ ÒY¾QPPЖ-[ ‡ 2mÚ´”””;wîÙ=„ä,h11±ŠŠ î_F>|0`@CCCǾf0yyy&&&ûöíspp à«…„„,_¾¼¦¦¦ùŸ"""‡¾Óz„d zèСéééÜKRSS•••©Ì 8TUUÙlöúõë¯\¹B: ÀWóôôli_ƒÁápŽ9B0íPZÀëׯwqq‰ŒŒ|÷î]eeeDD„‹‹ËO?ýDe¢©©µzõêk×®‘Îðu^¿~ÝjIAA‘$4Eé½ ×®]«  ðÇ6›½dÉ’«W¯v‡öå+°`166¾|ù²ƒƒC\\é,­EGG»ºº^»vMOOtÚC œ)S¦\ºtÉÑÑ %::ÚÅÅåêÕ«h_ž@ "t0´/Ï¡€:GsûFDD }y,¸šÏÉZ°`:ºy󦳳óÕ«WõõõIg*(`Ö|NÖ‚ "##Ig€îèúõënnn˜yæ° ›2eÊÍ›7W¬XA: t/aaaK—.ŒŒÔ××/((èÓ§««kóK?(wÉ’%}úôi{³hàF\t“qt ##cÖ¬YGµµµ%º…ÐÐПþ™Íf?žÁ`¸¹¹Ý¿?--MBB‚ÑÙ×rmm­ŽŽŽ¡¡¡¯¯/u‰ùCHžüÍPÀ ãáÇ–––{÷î]´hé, ä‚‚‚<<<¢¢¢455 FYY™’’Rdd¤¹¹yó:ýZf³Ù666EEE²²²T$æÜ &L¸uë–‡‡Ç¹sçHgavâĉß~û->>¾¹} Fpp°®®nKû6«­­]¹råÀ%%%---sss¹_µ´´d2™!!!Ôå¦0hjjÆÆÆnÞ¼ùĉ¤³€pÚ·oßÞ½{ÔÔÔZÆÇÇ·}вeËÔÕÕsrrž={faaÁb±ž?Îý'''\ÄÑ0ÍŒ3&11qÿþýÛ¶m#„ÍîÝ»ýüünß¾=|øpîå™™™&&&­Þ%¨“——7uêT}}ý€€€NoµÔC ?///##£¤¤$Òq€ wïÞ:uê† >,""B:´ƒênjjòööÖÐÐ×ÔÔÄ¥2”Y¶lÙÙ³gçÍ›J: ð×Å‹çΰbÅ ÒYà‹zQ¼½Õ«W766^»vMYYùÑ£Gžžžgè¶ÌÍÍ£¢¢æÌ™SXXøóÏ?“޼ÇápvìØ ®®N:t„Ò³‹ããã8ùµÄYÐEí>RRR† ²wï^ÒAà«555yyy :4##ƒtÚûý÷ß).JJOn(`è„´´tHHÈòåË /^¼H:@wqöìYccãM›6ùûûã9B‰S»˜‚™™™úúú˜Žૺºº_~ù寿þºxñ"΂$SÐ@“ÉLOOÿüù3¦£øçÉ“'zzz•••<@û 70|iiéàààæéèÐÐPƒ4|øp11±áÇ‘@oÓ¦MûùçŸ%%%IÇþ¢ÇÔ.¦ ÍÇåååÓÓÓ[ž¥!))yêÔ)'''²Ù訲²ò‡~xòäIHHˆºº:é8ðp#zäìVêêêüþý{î…ªªªÿþû/©H4•’’²xñb‹uðàAœ`!hPÀôÈÙ݈‹‹744p/éÝ»w}}=©<´óùóç;vœ:uÊ××wæÌ™¤ã@;øW@½ø±Rè&”••[¥¤¤D* í<}útñâÅòòò>”——'¨†“°àÛmݺ•û<‘®>>rrr¤ãPRRÒ<ðõ÷÷×ÕÕ%¾FÀ@K“'OÎÌÌ1b„––V`` é8T ÓÒÒRUUMOOGûB+ôYbLw÷îÝsss=z´··7®†î ??Íš5EEEþþþÚÚÚ¤ãÀ·ÃèM__?++K___KKk÷îݤðËçÏŸ>¬§§§««›ššŠö…/AÃW(((èÓ§««k§ï\²dIŸ>}^¿~ݲDTTÔÃÃ#55566VGG'55•ŸIÈHOO××׿zõjRR’———˜˜éD ¸è1µ‹)háæævÿþý´´´Nï_[[«££chhèëëÛê%‡èáááèè¸mÛ6iii¾å Î»wï~ýõ×k×®8pÀÁÁtàLAyeeeAAA]|Åp³IDATZ‹„„ÄþýûÏ;WQQÑê%—œœœêêjuuõ‹/ò'/EšSª««÷èÑ#77í ]„†® ÖÕÕ577ç^XXX¸víZiiéáÇoÚ´‰ûQH–––L&3$$¤Ýµ 8ðôéÓûöí311yüø1ÓðÇ?ÿücnn~øðá+W®øøøôë×t"  0tU||¼££c«…†††'N|óæM||üË—/·nÝÊýª““S\\\ëœ8qâÝ»wmllŒ·lÙR[[ËûÜüQ]]½aÃ##£ùóç§¥¥ééé‘N4ƒ†®ÊÌÌ411iµðÅ‹®®®RRR***'Nœh5ŸÌb±222:^m¯^½ÜÝݳ²²òóóÇŽ‚ãý àšššÆŽ[YY™““³råÊ=ð] _'7á$,A !!QRRÂ}ÎT}}ýž={‚ƒƒ_½zUWWÇ`0zöìùùóç–7TUU <¸¦¦¦‹›HMM]¿~ýçÏŸ:d``ÀÛü<¿Òî'a úå—_îÞ½RVVÆápêêê¾ó_]]Ýäää7:99ÙÛÛ¿|ù’WQ¾ßëׯçÍ›÷Ã?Ü¿í ß  ]%//Ï}]/ƒÁ ;}ú4“É”””d0ÏŸ?oõ‘ׯ_í“ÆEDDìììrrrÔÔÔttt¼¼¼>|øðɾSó%FL&SMMíéÓ§ÎÎÎ"""¤Cí¡€¡«˜Lf||<÷’ºº:qqñ–´úHllì·=øEJJjçÎéééùùù£F:vìØ§OŸ¾a=_%((høðábbbÇ b0 3fLyyyVV–§§gŸ>}HÇ!†®b±X.\à^bii¹~ýúâââÒÒÒ}ûö½xñ¢ÕGBCCMMM¿y‹C‡={ölLLLBB‚¦¦fXXNþ Y¹rå‹/>}úôâÅ‹•+Wþøã7oÞü믿N:¥¨¨H:#!oÞ¼QUUíb‚9¡ÅÛ·oÅÄÄbbbZ–”——/\¸PVV¶_¿~®®®ÕÕÕÜÿKEEEõîÝûíÛ·<ÙzLLÌĉõôôØl6OVÐÊÈ‘#[}=Š‹‹'&&’΄ñ¯€Èœ]Ìáp,,,–,YâääÔ•8 Z@,]º´ùV”ÎÂÕÖÖNš4I__ßÏÏW[çp8ááá[·n•‘‘ÙºuëôéÓyµfƒ!..ÞÐÐÀ½¤wïÞÜ÷–î‰D¦Ø8ððáÃÀÀÀ.þC ˆ‚‚‚Q£F9::úûûwüNWW×ÐÐЧOŸ*++ó6CSSÓ7<==%$$~ýõ×Ù³góvýÐm 2¤¨¨ˆ{ÉÈ‘#óòòHå!TüðáCGGÇÔÔTiii0|›¦¦¦íÛ·ËËË{zzb4 ߌÃáܼysûöíEEEeee-C^III__ß¶wƒîFx®®««svvÀ3pà{ôèÑcáÂ…?Þ¸q£‡‡‡¶¶6NÑ‚¯Åáp"##õôô~ùå—Õ«WçççŸ>}ZEEETTTEEåäÉ“h_à+ªG–«V­RTTôôôüßÍc ß­©©éÒ¥K;vìóôôœ={6®Ñ„޵üÍˆŠŠzzzΙ33ð%B2¾zõjnnîo¿ýö Ÿi——¯3ýôèÑÃÎÎîáÇ›7oÞ¾}»¦¦¦ŸŸ_«³išÕÕÕ8qb̘1‡Úµk׃¬­­Ñ¾À`0¼¼¼Ú-þm‘Ò‘¥ªªjllì°aÃþoó¯%%%íÞ½;--í‡~X·nÝ€H'ðöí[???ooo&“ùã?š™™‘Nô $#àgÏž©¨¨´úeÁïŸÐÝL™2%22266öÕ«W£Gvwwúô)éP@Rnnî?ü0zôèüüü¸¸¸ÈÈH´/J ¸ƒ œ©Œ݆††¿¿ÿ£Gddd¦M›fiiÉf³›ššHçê455]½zÕÌÌlúô銊Šÿý÷‰'FE:Àÿ"<µ‹)h @CCChh¨··wUUÕÚµk]\\úöíK:ðQEE…¿¿ÿ±cÇÖ­[7þ|111Ò¡€®„ê:àÿ·y0P(99ùèÑ£QQQ¶¶¶+V¬ÐÓÓ#x,))éäɓׯ_Ÿ={öºuë&MšD:ОÐp¡€‡*++ÃÂÂŽ9ÒÔÔäââ²|ùrYYYҡ໼ÿþÂ… >>>õõõnnnK—.8p éP $PÀôÈ 4ÂápbccO:uëÖ­Ù³g/Y²ÄØØ¸G<ŒNcbbΜ9eeeµbÅ ###Ò¡@Ø €é‘è¨y@øòåË… .[¶¬ù9] Èþù石gÏJHH8;;cÈ üƒ¦GN µ¬¬¬3gΫ©©-X°ÀÞÞ^^^žt(øŠŠŠ.^¼úêÕ«E‹-Y²D]]t(r(`zä!ÐØØ˜’’rîܹ‹/jhhØÙÙ-\¸£+²Þ½{wíÚµ°°°””+++;;; QQQÒ¹ [@Ó#'“ºººëׯ‡„„ÄÅÅZ[[Ï™3gРA¤su#………×®]‹ˆˆ¸ÿþŒ3---{÷îÍ«õ7?^sÁ‚¾yÉ’%.\ø÷ß•””xhLœ ”ª««£¢¢"""¢¢¢ÆŒÓÜÄcÆŒ!KhåääDFFFDD<{ölæÌ™ÖÖÖ3fÌ””äù†ÜÜÜîß¿Ÿ––&!!Ñé›kkkutt }}}yž ˜9A¸}úô)!!!""âúõë={ö´´´´´´455íÊ×7tìÇ111QQQl6»gÏž³g϶¶¶ž6mZ¯^½ø´Å²²2%%¥ÈÈHssó.~„ÍfÛØØẵnLœÐ}äææ²Ùl6›––6yòd333&“Ù³gOÒÑhãóçÏéééqqq±±±©©©úúú–––VVV£G¦`ë‡OLLlYâàà ¢¢²{÷î–%›6mzþüyxxxË’É“'/Z´hÍš5$¦GN膪««cccãâââââŠŠŠ¦M›fbbbbb¢©©‰«ŠÛjllÌÎÎŽOLL6l˜©©)‹Å211áÇ$sæÎknn¾zõê–%ååå&LˆŒŒœ0aƒÁÈÌÌ´°°ÈÎÎVPPhy··wBBÂ¥K—¨Œ d¡€é‘º¹’’’„„„¸¸¸Û·oL:uÒ¤IÝyšº¦¦æþýûIIIÉÉÉ÷îÝSRR266611166&xzù°a⢢Ǝ˽022rÛ¶m÷îÝc0zzzëׯ_´h÷?~¤òQmmmVVVÆýûï¿&L044œ2eŠ€<¡YBB¢¤¤DZZºÕrWWWMMM‡“pýúõV¯VUU <¸¦¦†ª˜@ ˜9ÚUWWÇ]HOžzôèÈ‘#­^Åt7Ä¿â×)þð%bbbÍCÖ%ÕÕÕÿüóOsŸÅÇÇûúúæåå}øðaèСÊÊÊÊÊÊC‡:t¨¼¼¼‚‚ Aƒäååù7¦¬¯¯/--}óæMiiiIIÉëׯ_¼xQð_}ûömþ‰ ªª:þ|55µÑ£GS|þO0™ÌøøøVóìÙ³#GŽp8##£˜˜333î7ÄÆÆ2™Lj“‚ТÇÈ#`è†êê긛ïÕ«Weee%%%ÅÅÅeee½{÷0`€ŒŒŒ”””´´´””Ô€äååTWW—••}úô©y=òòòòòòJJJÆ kù 4G¯=vûöí–%•••“&MŠŽŽ9r$ƒÁxüøñ¬Y³ÒÓÓû÷ïßòCCCGGǵk×H „` š9(óþýûòòòªªª–ú¬¨¨())yóæMÑ•––666¶|¤gÏž ŠŠŠ-%­   ++ÛRá222”‘‘!øß‹2åå劊Š7oÞd±XÍKGµuëÖ–÷lÙ²åÙ³g!!!ÍÿŒŽŽ¶¶¶.,,óÈ€(`zäYºtió­(»2¬¯­­4i’¾¾¾ŸŸÙ@p €é‘h¤ùa ŽŽŽþþþ¾ÙÕÕ544ôéÓ§ÊÊÊdÁ¦GN2ü+ º^z@k(`PÀ €@€  @ €0(`PÀPZÀwîÜqpp““ëÛ·¯¾¾~DD•[½¨Ü˜‘‘‘‰‰IDD“ÉÌÍÍ]¾|ùÛ·o—-[FeA@éS†6nܸgÏ‘æfggÛÚÚæååuúA< ˆÎÇÖÖÖöïß¿¡¡¡Ów¢€€á|!›ÍÖÔÔ$€Js«¨¨Ø¼y³¯¯/©‘—””ØØØ?~|êÔ©]üˆH{¼¼¼øº //¯v‹†[$plµ°°pæÌ™û÷ïg±X]üŽü+ ª§ ‹ŠŠ,--:djjJñ¦¥SÐ¥¥¥þù'Úº9J§vµµµ7mÚ´`Á‚¯ý ¦ €!¹¸Ý£Ù•••ýúõëôƒ(` žF‰4ÃÓ@€  @ €0(`PÀ €@€  @ €0(`PÀ €@€  @ €0(`PÀ €@€  @ €0(`óòò"Aà`Ÿ´…}Ò.ì–¶°O(&Âáp¨ÜÞ«W¯~úé§[·n1ŒéÓ§:tHYY¹ÓO‰ˆP“°[ÚÂ>i û¤]Ø-maŸ´‹»…Òð‡LMMµµµ_¾|ùòåKmmm‹U[[KeA@é§§Ÿ?¾eÉ¢E‹tuuÝÝÝ;þ ~—µ »¥-ì“¶°OÚ…ÝÒöI»„déìì̽ÄÙÙùêÕ«Tf”pnn®––÷’ñãÇ?~ü˜Ê ‚€Ò 11±ššQQÑ–%Ÿ>}’’’jhhèøƒ˜ivK[Ø'maŸ´ »¥-ì“vño·ôâÇJùADD„tA„ÝÒöI[Ø'íÂni û„J”pÿþý+**Z–”——ËÊÊvúAü(!Cé1` ¬¬,î%ÙÙÙêêêTf”ð¬Y³¹—Ι3‡Ê ‚€ÒCîÕÕÕZZZË–-[µjƒÁ8vìX@@@VV–¤¤$e¥#`ii鸸¸´´´aÆ 6ìÁƒ±±±h_è†pÒ9x(`PÀ €@€ €|ïÞ½eË– >\LLLQQÑÌÌìÒ¥K¤C‘wçÎ99¹¾}ûêëëGDDN$222V¯^ݯ_?ÜS¾Å«W¯æÍ›'#####3oÞ¼‚‚Ò‰þTZÁWJ»ø[@7iÒ¤£G>yò¤¡¡¡¼¼<::z„ ÿùÏHç"ŒÁ`˜˜˜$%%ÕÔÔ¤¦¦jiiùúú’Ežººúï¿ÿž““C‹¿m TWW9rÇŽ;vìPSS«©©!‹<ü©´‚¯”vñµ€hy#ŽgÏžéèèTVV’BÒÆ÷ìÙÓòã=;;ÛÖÖ6//l*Á'›6;xð`zzúùóç[–,Z´HWW×ÝÝ`*‚?•føJé" ¦ ÛíÙ³'é„íÝ»—{êLUUS‹ÐVdd¤³³3÷ggç«W¯’Ê _)]ÄâY¿ÿ¾ù@Eóã ›ÍÖÔÔ$Nnn®––÷’ñãÇ?~ü˜T  |¥´Åó¢ÍÜ ÷O³éÓ§³Ùl ‚[TTTøúúN:•tAyÅfbbb555¢¢¢-K>}ú$%%ÕÐÐ@0•@ÁŸJ[øJi…OD›pó!ë’’’àààÜÜÜ;w’N$(JJJlllŽ?Žÿ«À÷ÃWJ[|* ûéÇýCãKÙâãã]\\^½zEU(ò¾´[ gΜ¹ÿ~‹E"Iÿ©`XÓLAA!;;[AA¡eIqq1“É|óæ ÁT*ܺóWJñ°€nÌ}Šö—Þ£££SZZJe*âÚÝ-EEE–––èžÿWéÊŸ hhhdeeq/ÉÎÎVWW'•Y7ÿJé"ÀpWܽ{w̘1¤SVZZjaañ矚šš’΂kÖ¬YÜKçÌ™C*,|¥t/ ˆ'Wó•¹¹yDDDIIÉÇ_¿~íïï?dÈ›7o’ÎE“É !BpÑâo›UUUÇß¹sgË8FŽùáÃÒ¹þTšá+¥]|- üˆ?zôèíÛ·ß¿/''g``°qãF===Ò¹k÷þy•••ýúõ£>Œàhw·þ9_½xñâ§Ÿ~Še0,ëСCÆ #Š<ü©´‚¯”vñµ€hPÀ‡–Ç€è @ €0(`PÀ €@€  @ €0ÿÑ{œGžcIEND®B`‚gsl-2.7.1/doc/images/movstat1.png0000644016036000116100000047233013507751703013545 00000000000000‰PNG  IHDR@ ô¢9 bKGDÿÿÿ ½§“ IDATxœìÝy|w?þ÷Œnù’|ljØI“4‰s¶4mŽÞ¥-´ÚRJ)…î²Pöb/-Ç~ËòÛ/ ûÝÝ~aZ¶Àr-Ýí= ÷™¸GÚ$Mâ4wlÇ÷­‘eÝš™ß£ŒÆ3Òhä#ÖŒ_ÏHãÑèc¿#ôé{ÞŸ÷‡E‘Š;ßЃ5$° ¨!E ,(jH`@QC ŠXPÔÀ€¢†5$° ¨!E ,(jç"µÿþ/ùË>Ÿa˜¼'3ç`„P´ÎEëÎ;שּׂ­}óÍ7 ž/N5§c€"ÇœË Ãä;#çÀÂXPÔŠ1U__ïp8-ZtÇw;vl¾‡óJ<‡Œ¼Ý7Þ¸k×®h4ÚÓÓóÀÔÖÖ¾ÿþûú/±ÙlóýW€¹J4],•|ð©§žzþùçg÷²PlD³CÍ´ÑD³CÍ´ÑìA ˜» {khhhùòå“““³{Y(6¢Ù!‚f‡Z‚h¢Ù!‚f‡Z‚hvˆ Ì]‹±–þí,pÅžÀzôÑG·mÛ6ߣ€ycŸïL©.»òÊ+ï¹çžíÛ·WUUõöö>òÈ#<ðÀ /¼0¿#€yt.*°˜³Tµ¾ñoüæ7¿Y·n×ëݱcDZcÇÚÚÚ6oÞ| ÅÉ ÒÐæÍD³CÍ´ÑD³CÍ´ÑìA X¸MÜa¸ÿþûç{0#ˆ Ù!‚€ Z‚hvˆ Ù!‚€ šÝ=÷Ü3ßC€âe…ì&r´óX°@!E¡½½}¾‡3‚š"h¢ ˆf‡š"h"€…!E¡©©i¾‡3‚š"h¢ ˆf‡š"h¢ÙµµµÍ÷ xY¡{z`Ì;ôÀ€ ,(jH`AQÀRg³CÍ´ÑD³CÍ´ÑìІtX¡{z`˜]0¬¨¨˜ïQÀŒÌ]ŠÆ ©$°æš¸À…,V7;DÐìA @-A4;DÐìA @,Ì ‹ï°„ÀìÚÚÚ¶oß>ߣ€A,=H`Ì;ôÀ€ ,( Á`p¾‡3‚š"h¢ ˆf‡š"h"€…!E¡»»{¾‡3‚š"h¢ ˆf‡š"h¢Ù¡ ?è°B÷(ôÀ˜wè XPÔÀ‚¢€¥Îf‡š"h¢ ˆf‡š"h¢Ù¡ ?è°B÷(ôÀ0»öööÖÖÖùÌÈÜ¥h¬úA `Þ¡‰;,PH`AQhooŸï!ÀŒ ‚f‡Z‚h¢Ù!‚f‡Z‚`aH`AQhjjšï!ÀŒ ‚f‡Z‚h¢Ù!‚f‡Z‚hvhÃ:¬Ð= =°æz`À…5$° (`©³Ù!‚f‡Z‚h¢Ù!‚f‡Z‚hvhÃ:¬Ð= =°Ì. VTTÌ÷(`Fæ.Ec…ÔXóMÜ`B Š«›"hvˆ  ˆ€ š"hvˆ  ˆf…ÅwXB`vmmmÛ·oŸïQÀŒ –$°æz`À……`08ßC€AÍ´ÑD³CÍ´ÀÂÀ‚¢ÐÝÝ=ßC€AÍ´ÑD³CÍ´ÑìІtX¡{z`Ì;ôÀ€ ,(jH`AQÀRg³CÍ´ÑD³CÍ´ÑìІtX¡{z`˜]{{{kkë|fdîR4VHý ¦Æq\ ûý~ŸÏ7¿ã˜ž¹KÑØç⢠™ÐÓž:ð¬Á“£Ñ(Ä¢Qé)çñ0~¿ÇãÉûBûÅ·³ÕMÓ%€y E•¢f‡š"hbQI}ðjü‘û žÌUiÆ ¼ñ5°;î,h`0§ð14;DÐD Cw( MM¸lnˆ Ù!‚€ qrü¼‹Ðô¼ ‡¡Ù!‚€ šÚðƒ$° (TTTÌ÷`FA³C-A,*bhô¼‹Ð‡VqÁÇÐìA @Ínûöíó=(^XB0Ë”Xö-7± «uNŽF£###òS—Ëåóù\.Wö+‡F“¯ÿTzŒ,H`Ì2e–ãê{ìë?¬wr,ÖûöÛòÓÖÖÖòêêÜ'O&ßø‰" ç)'GöT€•` !,u6;DÐìA @‹Š2Å”j[´OÁó¼òiYY™ÎÉŒ»”ñ/>ûÊ”0|zšC„9€¡Ù!‚€ š]{{û|Š#Šâ|a¦Æ ¿XÆäŸ7‰c=Òã’ïw²5ËtN…B{÷nݺÕãñèœýÇkRí/I=_yÜþ¡›g:\€â ÑÈÌìæ.Eƒ ,€Ù69&?dÊ «ÀAÿ|vñù™“Ñ ,Ù+ÐÀ¬JDÅx$ýØæ`\¥ú§«2VùX ŠV?X° E‹ÕÍ4;DÐÄâ!ªÊ¯Fÿü™T`ñ¨À*&øš"h"€…Y¡{z`@ñÎ m£ô˜m\Wò½<ýh‡††Ž9"?Ý´i“ÏçÓ9_œžüRô˜qyK"·$À ÚÚÚ¶oß>ߣ€A,s˜R•o B*¼‹)¯•/+Æ#Âhwác(FÈ^$°fS¡ ¬B{`Û°:s>VÀ€…`08ßC€AÍ´±xˆ¡QùqÞ-ISe¤ê~ÊF„ýÇ Ì!| Í´ÀÂÀ‚¢ÐÝ忆š"hbñCs_µ#| Í´ÑìІt E¡µµu¾‡3‚š"hbñÀ C³C-A4;ôÀH`̦) ¬òê¼çÚÄTXH`À€Àl:K«—2.oúí&Çĉ‘Ç`2H`AQÀRg³CÍ´±xº„pM܉a™ú•ò3´Á*øš"h¢Ù¡ ?è@ Š–:›"hvˆ  ˆÅ£Ð]§QED6¬",>øš"h¢Ù¡ ?è@ `6MYBX6'=°m°ÀŠÐ†t 0{ø”=»üa¯/ï+¦WÅ6(XXBVgµÇqgq7ßãÚÛÛç{0#ˆ Ù!‚€  1 ³M¬˜±¶¼/™N¬©X<*°Š>†f‡Z‚`aöùÀŒðÇÛøoQâ™ïQ4åX4*ý”óx¿ßãñ¹”cûŒ¿aî† úšššæ{0#ˆ Ù!‚€ ‰B;¸SXÇ"bxG•ÍN|ŠˆÄñ^1bÜeÓ1Ì| Í´ÑìÚÚÚÐÈ r1w+uøåÄODñGî#"–H;OŒ»SÙèØöéY ¢¢b¾‡3‚š"hb‘˜FËx,©Ò\®1/¯Xâï""ÅÄã÷3uúoäØñYÆ·ÈÈ`zð14;DÐD³Cö t˜;e[²Ö~Ñ­ôÈc3¿”Ð{xæ€nj÷Y®À Ê áò%>)E”xö¼oÄT59.¹ÝÈŠ¹{`Ù/ºÕó—ÎÊ¥„îC³rXÈæz ¡RÔWØJáÌÁ‚Î(æ®À’9o¸—ˆâñøÈȈ<íc¦¶¶Öåråz• &_~Hz,ô Ûß|ÂRg³CÍ´±HL£kzM܉(Vpë@AçC¡ð14;DÐD³kooommïQ@‘bŒO’ŠÃd~‹ýû÷ƒé½«Nç¶mÛô^™J„î.£TBºJéÃãFöºÈ%þÈ}ÒÞ2Däúä?8?ö ýóyžßµk—òˆßï߸qcÖ“9Ž;~üx$‘ž:CkG÷èïW#ÆBÉ—~$=f*êJ4ò[Ì‹`0ˆFff§LÑÌ.‹T`É”¦D"!Ëæ^&iw²‹V¥k¯DQè9l[…l=LŸ•3eÕyÏ×.ÔYBèóùÊËËåV¢l‘ûšï¹ÜnÝ7àS»~.Æ#D$‡Dn}Ü h!{:ÌÝK+™L*ŸÆb1ýómM™êD¬"€šÒË@Kµ~ò-!TMuò7Ìbmlcf¶Ãwa!˜’ÕX©TJù4êŸ?eJ×Ö¼ikk›ï!ÀŒ ‚f‡Z‚X$ mâ^PMNN*Ÿjó_ZìÒÌ‚D´ÁšSøš"h"€…Y*%ŠâLX¨ÀšGhµhvˆ Ù!‚€ ‰B›¸”ÀJ¥Rñx\yÄH˶tCæünlD8‡ð14;DÐD³C tXªV*•RUÝç]B¨N`‰"1Ìœ €)=° T`i3P: ,UùUÖ—kM©ÀÂB(bHA-Žã€ôØï÷û|ó°žÕXª#ù+°ª¯OŒpD$F‚ÂX[]ØŽÔi¢(†ò3¦´2ï+ ªÀšf«i=1,‰ ƒ'Åx˜q•ä}X^ò•Kù}Ñh” bg,œÇÃøýª}m+·Íõ¶x–J`©Úš’1 Û¸Ž?ž.SzÚ‘ÀšØ-ÕìA³C-A,bt‚øôl„q—’Cw@"*°‰{8VÉßĈq•°õç ljˆDAè>d;ï⼯‚iÀÇÐìA @ŒãO¼ûé—ŒœÉi«ÊãSŸ:o¾®X–ꥭÀÊ»„Ы8twwÏ÷`FA³C-A,S;¸ç/¿¢+°´ ,#XDÄ.SöqG¬¹‚¡Ù!‚€ šz`KñÇïŸï!ÆR ,mÏó‰DBÿU¶&$°æ_kkkþ“ ˆ!‚f‡Z‚X ¦vp¯6òã=°DQœÞB"²)Ú`ñ؈pÎàchvˆ  ˆf‡Xç ¼?üò|¢0_BHDÑhÔétê¼JYÅw#†h»™N­ÀªÊzŽê"Út•(Š¢(2š]eb±˜6]e´«)³¡€À‚â[òcvéûúkõNŽÇ‡††2ç³lMMËåRžcŸãõƒd±–v !K³NÙÆuÄ0$ŠD$ §T‚ìz /°*a¸#µç1#gfífê9™9£´Šã¸ÎÎNŽK÷Få8®¹¹Y5ɚʚÀÒ–_i_ž+_fS.!ìi''Ö–ÿ—+â·ñ‡_‘Ÿ¦nùîpå*éqÖ´‰-•êݽ[~êõz—_tÑ9§Š¥XY+°åNXY'ŽŒ×ÇV5 £ÝDD©Dü±¿cJ+‰µ;¯ÿ+b,µÄ²˜µµµ¡XÔÔA³C-Aœü‘×ãÜgä̬ÝL•¦¬*ÈÙ+:›]RÍC².eÕ“±±±¬g*¯Ÿ+_Æø1ubpˆˆÄx$þè7™’Ì0¯Ïqåsý¦`>†f‡Z‚hvhÃ?[ôïÉ¥ö<.?W_ÚÁÖq]]ÒÓ¬iU{q©x(o™ù¬³T+k–òuâHDlck:E”x柤¶e›lk¯˜›‘‚¾fÌ4;DÐÄY! wÌÖ¥¤%„ye­ÀÒfµ8ŽÕ¹~¾Ì¶tcêÐ ÒãÄÓßU]‡]²v®wZð14;DÐD³ëîîF#³YaüžÜÄÎ?Í{¿M•ÀJ&“ãããgΜÑ/3Ÿu–ª0ÊZeÛ´>ËÕvý|F£³†NÏÖ¥²&° î9¨=²Îs öÀ""VÑÇ]+þÄß¼ÀÜAöj¶¼'g[wUréyO‹ží™ EqllL›ö*t…²~–ì’uY®öîoÅÏÿq—ÍlP`¢"åØñYÆ·(×™ñx|llL9÷¨««Sv3µ­Úæ÷ûÇÆÆB¡|°´´Tu\=°òѾ<×9véŸò‡_æ·¡ À Þ“sÝ|¿‘ÓTX4ƒôËLX*•H$ôOp8~¿_{ܾz‡ó†{¥Çɶ_‰~"ãáÔ;9.»{ÖÇ Zíííȵ›"hvˆ  ˆ³By»ÒuÛÿa*—ä:ÓE4xâD__Ÿ|dÅe—©:¯ûˆŽ?.ñx<êw4V•õ4ÕñòòråJKK•ÓålG–:ô¼pæ ô8þÄ·¼_7ÙvÚÅC³C-A¹'Ç”UÛVm÷s\OO|KÌívkÓ&Ú–ñðYd©–2Ȳ¬vªçõz³®Édª]·Ÿmaw&~÷ÿI“»~Ö¹ÑÔÔ4ßC€AÍ´qæÄ'Nžm”îp3þýóm¶)ù ‚ :BD^¯WùT» Ð`«¤¤$딓Õ{UWW+§=A¶4°5Ý©]î´jßrcä[Û¤ƒüáWøc»l«wf}#0C³C-A4;´áŸ-Âp&åºí;Låâ\gú|>§Ó)/ôù|Ú´‰j !9NeÖ…a4q/€(ŠÊ9œvóé\U;ïJ<ù$ŠDÄß- fë–Ïâ8!+ì4avˆ Ù!‚€ Μ²Øž­mÉ»±ªô;kKU`¯­·7ØÄÝétÊm6›ü*噪‹Ûí™i^® m+/±­»RÞH;þ뿱_t‹ê­—ÞÍ”×h Zøš"h¢Ù!{5+Ä'NާŸ8=yïÉ)§ÚÉ e«ÀAÙ»@Eå\eŽX'Åó¼üçc&ët0o‘Çq[±ôBG×»DD¢˜Üõ ×­ßžíÁ@ÑQÛ¹}¥M`iÏQœv–ò…eeer*J9·Q%°”ÃÓÙ Ðuó·"gX|Ç^¾c¯ê­ÙÚûE·j ÅiÊ=¹šfÊWÊ£3 ¢d2©Í¥UóÍ`0˜«`|¶X'¥œØÙl¶¬ÅôÛŒÉ7'«›.]&%°ˆ’oü'ãÎçµIwC€"¢®ÀÊ'Oyy¶T”j§M`lâ®ÌF¹Ý™)‡Á–Ûªí¶uWñ‡sv¿âO¿‹€‰zON9§R)›Í&-bÓ–_e= ò”zÍ5X,›½æ_¿K¾99ÞriÓ[ÿƦbD$Ž÷ƹ/ﻳëí¯+lÄ €¥Îf‡š"hâÌ);¸3³T¥J*L`i/¥L–);Á+ÏT]Ü`‹ˆ\7ßÑI`Úcð:€¡Ù!‚€ šÚðÏŠ‚îÉ¥R)å3iꇃÁ ÔTNÛ+«`08±Â: ,åÑår9ÎÉÉIsto yGÕÉ— x÷÷ÖLàkÆìA³C-Aœ9¡Û•‚ ¨Fçl ¡ÛífFškJ(¤¤ª\˜2¥j SRR¢Ü`ȶj»ëÓÿW fÎHÅÏý¿ô`:÷Ÿ"›u&sC³C-A4;´áŸÝ“Sͤ´I*•êêꪭ­u»ÝY+°´¢Ñh"‘˜ÓNXÖ™‹('v§®®®½½ˆjkkGFFäIž ¹ê³”ÆV^[P‹ÿ÷ôù>j(âp ,m}Óô–f}•v ¡²KÚ÷G¾2ÏóR¿v%„¥¥¥Ê©6($"çGÿVõŽÉ·ÿGäˆHŒG„ÞÃìÒÚqÌ.´áŸÝ“Sͤ F0äyþÀuuuápØàûƒÁšš9ÜøÅ: ,åÝápTWWÛl6¯×»víÚ¶¶6y¾Èó|®–ßïïíí•®jØ8°ù³õÕ•.—KçM“/þ»‘0Ú-œ9È.Ý0k¿œKɸ0Ö›~̰lõ2ýÓg+ep ¡ò…N§S¹a®V2™ÌUœåp8´oªb[þ¡Ô¾§ÒoqjXfQÐ=9íŽÉÇ Q4íêêRîk¬ ,£”;éïëv»›››‰Èf³)X¹&m>ŸOÎm‰ÄômùÜò;³n!)ާö>)=NíƉÖta±ºÙ!‚f‡Z‚8CÂH'‰é´[µ„zw°([ËÈÈÚn¹–JJOý~¿òí¤–ö-TÙ1Q“ɤTÉŸ·—–mÅEÊ–ãÊ/æ} àchvˆ  ˆ…Þ“ÓÎU€²ï•r‘uEáþñ’b⢪WWWÏ`èyä_Lgª ,"ª¯¯¯ªª¢³ù,íi*Úfy—zÚ7ß¹òû¿/pȯ³CÍ´q†¦t‹¨-¸ƒ;M«Kê`¥}U8îììì:«££C~!Ã0‡C™À’ßW;É‘9 m+.Êü§ßÍ{>>†æ‡Z‚hvmmmó=Ó+ôžœj’ ŠbÖɉDZãy|â}ãχSõÄ´s¯ ¾ùÊÐ/'£¹^;sV®Àjll”ž*'y: ¬h4ªŠS,+))ÑySûæÃJÿ8øÓï‰Ü 㫟Öð`>Ô-‚¦6¥J_Á@‹çye;ά/!¢H$"íŒ,Qnëãp8†ÉZ¥“ÀÊ»’Q‹]~!±6x"úŽŠÑ ÆSž÷U3äÌzOÎ`y8ÙíöÒÒÒ½¯¿3ú”Hâaî%ÞÕÑS"‰DÔ>úšðëkØ?šÁØó°N–r*&U`IMhjVÖò~‰voȼ»E2嵶妟ˆBêÀ³ŒІX`kzX4uÆ’kZ¢sçSZXhkKwÛ°ú쀡coÞ—À¼+ôžœvþPVV–µï•Ãá÷í~DÊX‰$öDަÄô¤ÂÆØ7ù¯žþ¸ °NKùGWý­W`©Žè/!ä8®³³3´l[æâûŸ18ZPQÞ[3BÍ´q† íÍJ+×NûmRK¹#Í%°ˆÈ¶üC™w9µÇÈK8| Í´ Ð{rÚY‡×ë•æ*ÁØØÏöü}RÈÞˆà’š›kÜM…Œ´`ÖYBMDäǪ6íÓ®ÀÒI`IÙ+Žã¼å篑/ÞþRâ™ïåªýâO±ÕKóž¶ tww·¶¶Î÷(`úA³C-Aœ¡©õö-yÏŸÓ–êVœÝn—3P³Re¤ÙV\”|ã?Óï‚–øš"h¢Ù¡ ÿÌ)§4¬)vþJ¥²lˆ,ÄŸï8”d½ÈºŠËK7‘Ïç+l¸…0wKÞ çþ'>ïJ.©¾Y:®J`¬ÀŠD"ª#:K€Ôœ"RµJ¤§¢×ß5 HI™\iš¹ë%ˆ©®ÀÑ ª#b´§iXÒûf½E—«KFÖÕJì’uŒË+Æ#D$rñ'¾Å8=Ò¢Ñ(ÄÎÎ8‡ñû=þ%ŽŸe|‹Œœ …)üž\Ö¹Šræ ÿÚЯ£™Â®&ïÚ «®'b®nºkek‹Çáõ8Kg<ôüŠ.uçwÞzë­o¾ùæºuëôÏ ±ÉT$5!=I<À½tYí6›MÙ‚ŒU` ‚ ½•*å³v/S šÀD àÇz’oýFÿa¬G~ñÖvuuÇq555###ò†€Ç577û|¾d2©½Íf05eFxö%"‰øÀ@ìtôä`´““ªºaMEºÏædj<ó&IÙ*°æ"E6;Û¼…?¶;}µ'þ^þ KT¥9]=‘Ê©jr\rt¯€ IDAT»±s@M§ZyOŽ)­b¼ù룵“e)Hâ냿é‹—Ô¸›.­û”t›-•J±I§§ä\d¯¨X|ðñ“b6U^Cô{éé™ÉÃc¾þÅåêEžF*°b±XÖ‚¯h4ZVV¦=î÷ûÏœ9#½$Ô°qhã§kkk].W®¡ŠÃr ¡ÿx®Ó,,u6;DÐìA @sI}ÃÈY¼b±ô@Ê[ÉÙ+:;_ôù|Y{HiX‚ hgY{`½5òÄÉДmþö?¿Ä»ªÜQ}ˆ{mÿø òñßõÚ¯k½cSåUòin“µ/{®%„¹Îײ­¸HN`ÍáÌA²h C³C-A4»`0XQQ1ߣ˜"7ÜýK#gêA+ïÉi€EÙ& ÊÖ»§»#™,M}Ù²Ë+ï²1é®MÉdRšy£™+ºV¡šJÖÊE÷½°´òÏUç(X¹*°´ °$±X,kËãñÈSRÁæ¸øK+vìЧ89žI` "Q Æ:[@ξfÌ4;DÐÄ\„ÞîQ¼¼!ÿ9šªmÊ6ÿËzÛL»„0œâNO¾¯~­˜Ü=ü蚊mï¿8å¸úýÁ_¼éynKÅõK¼«Iw ¡T)Æ0ŒNw}Êg‹pæÀ¬_³Hàchvˆ  ˆf·`Û𧎼nð~›ñ"h# °H·ë@ॣ·åã ¾eŸiýúp߸êü/ÿòÀ#{zê+Ü5e®¯}d•‘7'°ü~?ÇqÊû¢DÔ=þÖÀ“›ø v[¦*>ëN=*¹úµç:>11¡|š·*SZÉ”U‹¡Q"¢DTëÁF„ç€Ðw¤ óãe™öL¹¦ +°ò&°¤—îÄ,gŽÄ»w ÷ˆ”¥B<~9úóVße[*¯ÕYB( Õåre]B˜õ|ÛêÎîÕÅbÃÃÃòS‡ÃQYY©WŠ %_ú‘ô˜·n fhaf¯H*OžmF`Q¶)„”9>±ç@àù`…«æ«×ý;74I¤N` NĸH’‹$ „þü*Co:=&.òù|ÍÍÍDTçn–ïyùŽÞ^»¢ìþoÝßÖÖI„öt¿ðÚЯÛÂ)NŽM[[›ü’¶¶6e¢JÙB«³3Óÿ¬½½= JU ,RLƒÁ`{{»òâéË.Z)”ú¸«Æ ?ÎuÕp\WÀp\WÈ{…TwæGcknpÞp¯ô¿áMwÈÅk¾Üz·xÍWF·Ü9YŸ™:«ö5&¢ÞÞ^ÊQ¥¼©&!kk|<3í;uêTŒŸ<1‘ÙàomÅŽ%ÞÌ­K9{Å2¶R{¥Ë6¥Kúaî¾èqžçEQxöÈ/^ú%/f¯´ÒîK#Ï[ôÿ’LEëöïºnÿî‰uwÄ®ÿšôØuûw­¸¹÷C_ÿÇÜüíòÏ=àºý»±ë¿vbÝòiï5~Tzà¾ë¢Ãþ¥‚C"7`ÞQ¸®€+à ¸®0ëW˜‹òäþ„ÓÈ´÷´‰ÄéÉ÷ß}R>Ræöõº|°ÿ¸ªåÖ>ñ‰Oüî¹×ä#Ÿ¼ášYüTýþæÃÃ0<û³çúLSoQ–{üþóN HòéÛ¤ 1uÞe×l¼åÊóoQ]äàÁƒò„²¾¾~ppPz\UUµ~ýzí›îß¿_ùOˆ.¼ðÂÒR½Öe±ß-¯"t}îßœ×ü™‘ßnhoo_°¹vk@Í´1»D4ôùR""†-ûÏIrêí”wøðá‘‘ù©ÃáPÍê.¸à‚²²²“'OJ™,¥ÊÊÊ 6(LLLìÛ·OušÇãÙºu«ôøÌ™3ï}è÷ªô´Ä^qsÓWã|äÉžâ”æÛkn]Q¶…uPŸýÀËGã…tjÌc+ýÔš{÷sÏìy‹ˆêÝ-WÖßå`3•Pëׯ¯ªªÚ½{·êþê’%KÎ;ï†f‡Z‚&5yO½’;®þ2ãÎÒÈH¢*‚fY¶¦¦&k´ã²»•e4Y‰¢øú믫xëÝÑgä»h.»ç¾ëØR“nߤm!Þ½/žžL¿ö;WŸßP>G‰&û\\ôÜ«s/»vÑv<Nen~NDDßUž&’8éüå[ÿ—ˆT9,e,¿ß/'°².!! ©æ-Ågë3ÓDqð¤þÉ MSSÓ|f4;DÐĬø¾£éì•ÔÊT7{Eš*zí—»Ôs¶–Fáã¡Lk‰µ¾,Ù<¶²‹ªoÚ5üˆ||ïÒe[ˆ¨Ä]öé þjóÒKÿéù?“rXQ~ò‡ïÎþŽƒ±Ž¾ªþón[‰tDê´›¸ç¢zy®ŒJìÒrK8s€¬˜ÀÂÇÐìA @Í®mA¶áýröŠqyÝwý€X[®“ùH¤Wq©´´tù…Nû­µß௼$?eöO¯øŽœ½""ŸÏ§êÚ>4‘)ô®+wO{0y™x ¡J½§åcK¾²¼l³‘“³çû£Gå§ãããri=Ã0•••ò´%÷D499©¤æm†:e !6"œjaî4a%ˆ Ù!‚€ f¥ìàÎ.Y“÷ü\›ºÈ¤‰ÁLX<ÏË·%ßë{)Χo•ye+ËÒÐ–Ò ËJÓMÞµT^+=v:D´zÑækÏÿLæ}Å)ï;ï}aà?Fãé±D"¡|G™Á&滹š…)Ù–fÊÓøîÙïôQ ð14;DÐD³[€Ù+šÚ’m\¯“½"M‘ͬ~¡‹{FŸžš½²ß¾ño74^¢7žŠ¥/â°±>¯ºýÂ,²HKúÿ)ëÞQóÉk›þxÃâí^g¦â®¶|Éšòm5®&†ÒMÖS|⇯~=ÇqÊ«E"yãBA´ÿ ´ °ÈHÖ¢LK ©Ì)ewvÉZ3‰ˆçù¬Í­”âñ8Çq“““YÞËXKÅT*•L&cñØ;=ÏÊÇ/\üa;“Ù‚fkÕMn[I•³agÝmtv#%°ˆèºuwÖ¹—åd 1ôû¾²ç_Û¹×¹ðX® s½ÜÕË$°Ø¥åÇBú¸¤)`±Ë6êœIÙXFê s‘¿Á‘ß5ü?G'Þ’ä`WÕßµqÉý+ ‡2s§ÚrWîífE–¶´´ Hëþ.YyÍÒ¥_à¾cäð‰¡ƒ+ë6¬¨[¿{×nžç»Â‡^úô’‘PÿOvû/®ü^ P®E18ùÁÈÈÈâÅ‹å8Žëïï׎!VýyÄÚHà‰H=CÉ9æ°¸¦T`-ÎS•·üŠˆB¡P(Ê:S4˜À"¢d29<<|jüàd"ÝúÀÁº.nºn°7Ó~Ëm+ÝQs›ßU¯ÌjÉ ,‡Ý±³öSOõ~?!¤g±­Õ;ÆÂƒýÑL.9¼oüùÃ'¿Öø`Ö1äýeuL£‹mZO +­èOбIÆ­×<`à[Úš6èœIÙV‰Åb1ý~Ü:¤/ô”˜xmð¿ú¢™…bNÖsõ¢»k\rqO.CÁL«®<ç~ij¢è*°˜³Tõù|¾óÏ?¿ªªŠÎVcÙXÛyu>²þ³çÕm`ˆ‘þèËJÖŸ_±M~Õþ3»þù…¿ 'ÔåT±XL9-ëíí•÷â8®³³3kÇ¿rÏáb«ÓEA:÷÷Z8”› €!‚f‡Z‚˜UAXFX‘HD¹Ûà”÷Ò$°†C}YÏÕi‹½+½¶rå9Ųl‰ÝwIÍÇ‰ÈÆØ?·í¾Ë—Ü~Uý]KKÖ©.Ò:ý?ïþ»v yXúÅhÓ¨Àb\%™~ ¢ ô´ëžnJøš"h¢Ù)7õ[8fR•õÍ]HrM]ˆ(•JERÏõÿX™½òÚʯoøR«‘²íȬ2¥VÅK`‰Ù|íòåˆÉú÷µÙÒ‹H/¬º~YÕùòñÃ}ï>ôÞ½ƒÑ)Kc±˜rZ‰Däû@ WìÜÉœÒkm°2æRg+AÍ´QKŒG„áÎô†U®åÏJN`õE'…ì÷¥tªôUIœSÃíßó/^Rõ¨J‰‰ÁÁÁX2Ü=™©[^¶9ïNR$°¤‰Í²’õ­¾Ë®mø“ËW<™L²Œý²º;.«½cUõ–É´Ïx³ë™žÈQÕ¥AÐ_qpúôé¬+%Ó¿EáX4uR>û…Ï;| Í´Ñì`~1O¥Ÿ0,»D}/JE›®ÒÞ“²W]géä°ú¹Îgû4ÏÜr+wT_¿øŸ3½¹pÞÖð„b aÙÜ.2+ºÖL”””444dýûÊ“B–lŸßúÍ O¦M{(xaàáhú_LYY™Û=?º±Ú`œ#Bÿ1儌˫¾4ÿK ‰¶áÇ÷^PþH®×–YeÞnê}(¼òlÿƒÉQ"ꋜx¾ÿ?~ÛóÏɱÎp{JLÏJ핵î¥%°X6=…ÛRym«Iê«ED 1ËJ[o9ÿ+·4Þ[jO—t‰$î~t2¥ž¹êL]ÀÈÈÈ|kÊ; ,šº,B¹\@b–6ü뛌ÎÌLW­Ì»¾^»„P›ÒRUÞp'å(uÿ÷7¿ªœ!T¹_ßpO©Ý/É¿„P‘Àšë ,‹ôÀ’-[¶,ëßW®À"¢rgå·?ö«_ÿ»cû¥#"‰m#ß´ä/]6ïòå˧÷ïÏHófJXsH¹~Y|¾Î™)uˆ{5ʇŽßj)Ý(Ï»ÝnQå%uv»]®?r¹\òqeë`Ï[Çß—Æ{žîýA™£2”޼8ð°ËV"Ÿ¼¢lCÙKÈUä÷bÆf³e¯N-§²Ûí^{ù¥µŸ~nàÇ‚ÈQBˆî~了/ÉÚQ2™ôx<Úwá8îÔ©S‚ D"‘®®.Žãš››UfO³k©Å+°À¼„ÞRïÿÞÈ™Ñh” bgÓFœÇÃøýY¿RUغöݬ~ßîC™–æi€%m.¬:¨Miôë·ÿ%žÊTo5–œ¿³æv›i¾É0LÞÖÔ ,$° !ß™TQþÑyž¯ôÖÜ{Ý·ÿágþ\" §¸wFŸ¾qåý~?Ã0£££rÙ¼ÍfóûÓ H¿ßß××'ßut»Ýò¿CXõH`e×ÖÖ†r_SCÍ´ËQy“Ðï÷«ò&QvpW4å©¿"ŠF£¡äØÁ6"IÜ3þäõõ_f›´WLÖDUCCCWW—Ôî@ê{À0Œ( íý¡òÊ)1!g¯ˆh2ÅÉw;bZJ7ÓÔ›m¹LNNÖÕ¥KúY–•§°‰DBn¹`³Ù¤z±wÓfÿ‡÷ާ;m ÇÎ ¶­­Èì%”kꔋ¥ˆL/¥Šf…b !ß}ˆ^§pÓ±ÌÇpÁB-A„iK}ðjü‘ûŒœÉUiæÙÆX°žûž··^­<Æw½/?¶--¸e[Bh¤ÓÞ®×Neª¡W—_|QõÊ]d`ý ÛXVK`墜Js,–aoÞòE^HýáÐ/¥ã“ï÷Æl¢M>Ÿ¯©©éÈ‘#òkåI›Ïçs8ò„¯±±ñÔ©SÒ?ŽT*%‚\ÒŸÛ \BˆXøš1;DÐìA (æ C§Rï>aäÌéßÒ\ºÑ¾þÃê÷UT`9kjt¯‹Åxžwì÷‚˜NÍŒFûÚ¹7¶5ÞXWW7>>ž¹¬ ÄøðX¼/.DãÁÁ“Áãr7•¬ñØÊA°ÙloŸ~¡güTŽ÷Q«v5–;ªˆÈf³±,«³D‘+¥óå ‰²áºÝn÷ûý===<ϯõíŠwö„Ó °ö¿°Ø³Ê笉wÇùȪDž¦`:Tɯ¬í´¤åÊpš››íubpˆˆ(?úM¦${‚Òqɧyëó(æ!Z‚hvó˜‚C£sÿBìÁÏ–|ç}ÆW/º3Y$¶ð-‰(‘H¨r%%%ÊX–•‹r$¼zlïä§%ço­¾I{e#ý †P5ë”wåë[þäÝ“¯ŽD{¥§8ñ³”3¼µåšÚêÆ¬ç+WQ]]]ww·|$‘Hè÷Ïb«E‡›IƈH r}¾ÅÍ3úÅŠäõ9¿¥i³{¾ükûÅ·) ½™Vл( êtÖˆD"}‘ªf燸W·¯¾ŽˆTßï»Gí‹'"Ny{ôÉZwSèP׺%úíþÿϬv5ÃI1ND 1Î.1¬¼ÔŠò-Ò–eó&°¦üÆŠ›sª–Ïç+// 1—Tßüdô_ãB„ˆx1µkø;ëŽ!¢w_yzçêv®¼¡®|JªÈÈz@#XYpÔ/ݘ:”î/–xú»¹®Ïø;¶&ï0Àbæ1)NŒœ‹wá£?¼ÃûµÓ5ȯܖצ(UÎZ“žµKÅX,æõfjÍUeÝ‚ (JD¯{r0Ø-=fvKåuYGk¤kxJ¬¹mâ¾PXÊø)§\6ƾ£ö¶'»¿/Ýn&'Ÿ|ÿ§O¾ÿÓeÕ«/)¿ÍI"!™LJ‘› OÈS4ÇYò¬1™Lê'°¸àDªb‰k4}Wvò¿¿É4žgäÆ29®þÓ¼íÜŠ0zfÎ߃OEôQ&‡•ˆ Ãgwfؘ¯éĉçwžÏçË:#œ ‡ÞWw¾àÅÔó§~¾eÍÅÊï÷žðÑtöj q8væ‰ý=±ÿ!ù±_Z{;½5úD}ES³ã‚R»ïµ¡_Ëi2–±7—¬OŸl³i븕®|>Ÿòö©N‹ˆJKK¥ßÑc+½¨ú¦]ÃH?O ÈgNÄÇð8øËËÏÿÄ]—|U>.w¬—©f½4Ý&î$µÁ:ôBÞÓ”Ë?Îq"s‡É~áÇ•ýTâñøÐÐüÔápTVVº\zÅGÊjtþƒWc}Žm\GDb˜ãé€LEã[$=ÎZÅìóù²&°ˆ(‰(¿¬Ãá°ê„`0Xs¶=š ?uà'òV”]àsÔJ¿ˆêûÝРb a9*°fƒª–ü8—Ûj6û¯‘;DHºF9’¿ßVu«ô4‘H8Ž7O=÷ß{~°©üÃÍ¥èlUž²ëVÞ>î@ÀV¾XN`Uìû í3vc™ˆ]¼Æ¾ùcçšþ]q(~ˆ Ù!‚PÌAGºÎÅÛð©è>ãìzŸ)õ“tõìž>ñ²zÁîšœœìè設­QÍ+*Ê_:þßrmCŒHéæ'GÞ÷ø'[*×9Ãþ¥¥ëDÞÿƒÁ­­Ú^æ¨$¢/ú‚×ë•ZT\VwÇ+ƒ¿èž$¢Fïj'›¾511¡½‚Çã©®®–«:‚)Xʈ4çQN£[J7œ ·Ÿ Î:H‘Ä׎ýîŠÕŸh¬\!ÑNŽÏœ9‰Däð<¯j®QH+Ïâ‰rù§‰óÇŒ@-A„iSV`9?üç¶5—ç:ÓEt`×.ù»oÅŠåù–½ |ä¯á?xUz–lûµö”DíªÎÎN"òûýY«˜}>Ÿr ¡²%·ê»[›Àš˜˜X#¡þ{徉húNžÓæÚè»J¾ *•w !/ˆãáôK†ª±„pVäªÀ’&‹ë|;¸äPgø/d¢u2¸¯Ù»±Ás%‰ÞЉŸµ}'Å'Þˆ=r"ôîÖª›—,¦©)I#}ÜcåK¦÷+ðí/Y8ÕÝÝÝÚÚ:ߣ€éCÍ´€b¢ H`9¶ÝÁTæü*ŒÇãcccò75Ã0µµµú·4)N¼òñ)"">•xæ{ÚS¢þeÒƒ`0È0ŒrF8=Ù·§ï¹áP¯|𢥎ð‡zß’ž»¥2û%“«ýÎú‰dºG†µm?ï£Á±PoèäX¼WÎyIÜïæª«éìÔ@n°jcìWÔßùòÐÏ#ËK7ËçƒAm')—ËÕÜœ½Û€²\K[¥ú£]\ýñ¡XWŒO·fgˆa;/¦'ŠÂûúÊÕÿLD¢(jwÚ‡ÃápX¾ý«ðˆ¢¨íªêûîõzý~¿½b‡ó†{³þFbx<ùêÃÒc“V`óÇŒ@-A4»yí•I`1eú3§ì袿 +µyþô¿Â_ß$rƒ¹Nó.îíê""Žãr]S™¨òûýéÂjUo¬ÉÉI‘Äýã/T8j{WzleÁ`P…÷»wÿt÷?„ã™{f«¯ôÚË¥Ç.—+ )¯“·k$ÎÞÓª*qÚYu÷ìZ( ¬\Xgïv2Ûknýä–?æ;ž9øó¡‰é§o>yÓ’¯ØGßxçÞ¾7ŧooDO?ÕûýqçMËWüMAXD«˜f+uèŹMfÎ+|͘"hvˆ s• ,ç-ßbëVä:ÓE4|êToOú‹Øãñ¬Øº5ïõm«¶Gô™t+›¨oiÖã"‰Ïö?4ïUt²žkV~º¢²ü¿½=–œr?³7r¬7rL~zñ²ëîÞþõ½{÷†B¡p*Ø9qž9I„ˆèºÖ;œO‚²Ì ìŒóã+þìéS-)™ÒFÝãñ¨n™êÜùÔ_B¨J`¹m%[«oz}è¿l¬£¥dÃÚŠ%vÿ™ä¶¾ßJ'¼ß½ûôðáåµë8ŽËÚ‘·³žÀó¼*¥j’PUUåóùˆ|®Ûs´¾JD“¯ýTª›†;)%§¡6 Å£˜?†`"h¢ÙI,¦\/%‚²Ù`2ã«÷üéEþñ²Ÿ©Z.=à8.ë.Ì‚ È9†a” ,åF„¢(F£Ñ®ÉCíÜëDÄãw-ª®ùÙÑ3¡§¼àb_s«ÿ2>‘NÆioæM` ÃX´pXY+°8ŽÍl4P[¹h•Í’Êåß~únAˆ(”;xiEéϼûÿ”IJ"ˆ£ã··mgíòÁ¼X~¿|éƒn—ÔÕÕéßXN<û¯Ä'‰H8.Œv³ÕMyY€"’Jˆþôc†e«ò|‘å©·ÊÆ~ñm"–\ESg™½‘cªì³¥êZ&å¨.]t÷öo¼täÑŽ‘#¼å².Ö{Ë÷ÐÙJ¨{Ūò­›6m*¯(ï=z´ïUkn}ï}¹Æì²{¯®ÿÖu"ý+¯.¹¤¯êXçXz±ÞãûüÒeß~æÀ¯ºFŽ_PyÇVf·Û³æª²NxxžWMs•£"#;9=lm‹0tŠˆHø¾£¶æÍy^0+ø”8yvÇa†eJµ›Êd¨v\)`–µW¸¿ôs¡G½¨? ƒÁÉúLúÕív3 #§ÉœN§ßïÅbò—Ë¥ÜjpbbBN{E"‘$ß;þœô#‘Äñxÿx¼Ÿ¦º`Ùå_Øù¿÷îÙÏ“ ¿©êœ¼ßÝç²-œ–¶‹ã¸ŽŽå Lúg×\}þ•kn}éƒÿ‘ævævåºìËGóÙëKi±ôTΆfíKD>ŸÏµdu¯ë òZvîÔ™›òmþXz|û‹ìålä÷(ÂX·Ü‹Šñ7Ý©¾2Ád¼³’ýâÛ<îþX›êx<UΕ·L^•³dk)Û¸®âRŸ³Vêb~QËÕµ\OEOúÝþ‡O ·+¯|AÍuþ²jššueØå5k—׬U¿¢¢" J}>ŸÔ‡B^Ì(5h×®Ý3X¥íåt:•_ÉyexleòÓT*µ¥òZ9u¤ïWù¨t¯/rb[ÍÍ›—îɲ%S® ,ÕÕr#Ø%kÒ ,"¡ïXpnˆ“c™éJi%ÙôR%ªŒ•ñé eÝc7ÜÙ)-”¹Ýn–eå+;NŸÏ766¦_8nç^§¦[)ÙXÛ-|ùºÖ;b”ßéÓ¨ÀenVÕÎ}K}£Ïª”ó?)B@@žGJäæ©·lùReImÖë¬(ÛrYݧ•“¿ß~h$žÞ~Rš™Iût¥Ü;@Kus2ËÈ[¯ÎŒ¼ý%ý“Í«­MýŸ`.ˆ Ù!‚P´ATvpgk–å=_9),hFhßôQ×íß^w_ÿÖ/Jÿ‹^w_ùçà®ø«DY½|ÚädºTôäH<½V‘!æúÅ÷l¯¹ÕçTO\vϺÅ}ý#}¨áZælÁ”ßYÁâtÇSUKùXα,ÛÒÒ²ì¬æææ%K–477+ø|>Uã 2\¥|_i®É0Œ²ËLµD±”¯]Z~~æ:gçî1~ò•Á_´ =ÎØ3)0Ç#mƒ˜5¥Íj©&9†X‹×dcÂ>îEû1ƒA @ÍNõéçŒr B¦<{6@f<•kU¾ŠßïWN'¼^¯ÏçS^VúJ—Øl6åßJ$ñ¹S?ûIÛßwŽíëÊU…ãu–]¼üÚû®ðúÖÏ0Ä(weaYV›®Ê¿„0¨XBXŽ%„³D9ÉË;v;¼Ÿ¹øo~ð²ºÃèy5..ýËØÊ5Ïõ?”âDÄ É׆~}}Ã=¥v¿”͵_€ôTÕ'+‹i·¦ž2òõ×Ðc—yûK$ðÄêUl™Ô<.u†Yš"hEDa ,ã5ù’¬{N«ê€d‡¯É›J×T»ÒM*Ýn·”¦Q²±öxR½- IDATkW~¶L¨ky4ÎG/ª¾±¼,Ýñ4W"I9ß°Ùl>ŸOÕÏ"ëåÜ”t+°´ë U/q¹\ªÃ0ÚWµ–]Ñ=qLÕ^òv×s]eǯ®¾›eìDTVV& x+°” ,öq/Ú!„Z‚hvóÕ†ßx,2¼„P„3gÎ,_¾<ï»û|>©ú[â÷ûKKK•'$“ÉÑÑQeYt8Vf—ö=w"ô…¨ý©·¼Ž²ÔÙ}ZJ¾kë¿4ïæË<ËWÖolin‘§Ê/t»Ý®½m† ¬ù¡­ÀÒ·eée;WÜTåZ\î¨öÚÊ]6oƒoÙ'×ý5ËØˆ¨Ò¹è£+ÿX¾ IM<Û÷ —223SM%óV`Ùš·ÈëoÅp€ïÜŸ÷-Ї0zF~ÌH`)ó ÒÞvÆßK{ill,ëWíP¬k0Ö!?½°öZùñ’%KruNmôžÃâ¿Øè¿ªÞÝ"7žÈU¥J`ÿ´{`)Éi#íB€¬/©v56•dÒFÎZi¶#u¼;öé±üÛåê¥:2 ¬%kåÇB¯ù*°`†æ« ÿÔ ¬ÂX¹Jd¢Ñh__Ÿ‘¯?Q•ÉÚƒrddDùÅzlìÝ£C{â‰èƒàîÃÁLÉU$™)è¾lé­¥vß²’õýWÕ¹›ƒ\PÙ¯@õ¦ÚÛfz`)+°Ðk–h+°ü~¿\%WÅË>³õoÞÒûg;ÎmÛ¶;–ÙxhKÓå)Wø™ƒ?—žFø‰gûº†î&ºX$ª ¬¼ ,bm¶µW¤ö<–|û‹¶åæy @ј²„°:ûn€JÚIa®R##r}Ïâ2ݯ{W–1µR =Ã0‹-Òž/w·,µû7ú¯"E/­9M`ì¥444$•JemÅê÷ûÇÇÇå¶ ’þ«¢Í%ëW–_XåZ2ïÛ5ò?ÁDz*lâíZ÷²–Ò òGsXÕ°šöìF„b<¸ô Õf…0¥+ÏBÕW^®V,ãy¾§§§¥¥Eÿ‚ª/ÖT*¥ýÒTéž|cèqHtÙ¼µ®¥Ê-’•j\›—\Þ}¦ÛÈûfM`Ø…0ó] ¬Yò¬<)AŸÏ§\»W__¯ºÝª U2™EQ¹3eIIÉÍ[¾xñòËGBôù¾‡÷¾ë÷û•—¶·”§R)Õ¼<׺%ý6XÒr ‰N³­"×ÞÞžÿ$(bˆ Ù!‚P´A,t ¡ÁI¡ArÇ+¥ã¡=}‘òÓõ¾+äl”ÇãÉš3 ªîQò7ø,&°´?¦Q …¤\›¶Ën·û|¾åË—/[¶¬¬,ÓÐÓï¬ÿÔÒo^\óñ*×"ªr-þHÃ=eŽÌLoþ6˜‰F£Ò*W–jN2 ,Æåek›ÓODA8ž÷%E¥h?†`"h"LÏ\,!”ÚtwwŸ>}Zÿ?Õµ ,í½"9JŽ¿1ôˆ´ö?ÎGz"Gå>v›²ý%³}ÑÍ,£Îù‚ }_:t¨§§G>n³ÙTS –eóN`†'ÐknØl6ù–t;W¹Ê´¢¢Bu¾ÔÃLšl‰¢866¦l­ZRRÂ0ì/ýV‰«üå#éò¨”˜øþ+ÿ믯ùWå¦?¢(Ê« TåWd¤‹È¶>“&ãO¼•xú»tväÑh” bѨô”óx¿ßãñä½&Ù7~„m\gäÌs ©)Ï®êPäA³C- hƒ¨L`YB8í­©‰Èï÷ŒŒ(3MÊ›O’¡Xמѧå§uîæ:wfTÊ´Ž>y1‹ ¬ÒÒRÕÄ`=°dYXt¶÷–ßïWÞúR.$"'ë¹aÅ—=þO)!IDI!þ|ÿ·T^waôBžI|0òNרÑõ¾ËݶÌÞápxxxX¾` Pe¬xž!ï°Ù%k…¡ÓÒc¡÷Û²Múç•¢ý‚Aˆ  ˆf×ÖÖ6/ÌÄШü˜)«Ö?ÙÈBŽã¤–U¢(vwwOLLH¶d½ *]•L&µ ,éÎYJL¼:ô˸ žÞËØo[ó7ɨ°oðÅÎÉCËË6U»‡rd"šœœ ƒÚ{fR,åÆy×Ñ2U%„³Çn·Ë©T*%'§$YKãœN§|NGG‡üÏ”a˜h4êr¹†½óâ¿ G÷ þ^úQ"{àÅ¿ÞY}{­»ÙÁ¦ÓŸápXú—ªM`©Àb«›ØE«Ò7!ùdü¿¿–ùQ•æüü)±ô¯çuMK›@sAÍ´€" b*!úÓ–­lÌûŠ™T`ù|¾ÚÚÚÎÎNùˆò–…SÜkC¿Äô5¬ëâê)O(//7þv’YL`iýM£K¦ßËçó577KµZÒlÄívˈÈï÷;+ùŸ¿ù]éü(?Ù6òء߽Ф;½}Ñ×Ôß]bOÏÅÃá°òörÖm¤’ɤvT*ìâ5´/a4ÝF„Eú1ÃA @Ín¾Úð‹Á!ù1[à.„Yo¶åM)ÕÞn*ª[>Y+°DQIl~<Ô^!fgÍme|]Lˆí¨½mKÕu,Ù’Éd2™liiQÞ²Rm#“ÒU6›M~ë¼ëE‘F”MÜËÀš=Ú6XÊ%Y“‹N§S¾‹«¼+Š¢òßöÆ›Äóîè3ÒÓx*öÒà‘±ûœõWÕ.‰äJ`©À""ûúk³]E¯Ì1Ìa¬[êgDDŒ¿ùg6Æ·¦ÎJ'?R^QþÌ‘‹ñé/t†a·×|Òç¬Sž“«Ëï÷s'Oþ¤ &éq±õÀ’Ç–«Kyf®™´ärßÇxûôóò‘‰XfÖL ?ÛÿàÕ‹þÈç¨%cµr†XSú¸›o#B0£)X³ÔÄÝ8#K‰èøÄ;]áCòÓ­-W_ºêcïœzqOÇË›üW/+m•ëc¼¶Ì 9ŸÏ·~ýú·ß~[-¿4¯PöÏ›Àâ"ÉD*ý§(sÛ=NC³™X@ ,íF„F*°Œ\YÅ5åÛß;þ¬ò8/¦Æâ½/ <¼¸¡¡¡¡²¥«xžO¥Rykól­WÓ ÿfd0Æ!sM,°if-!Ô¾\æñx¢ž‘±xŸ|äúµŸ­‰¬VžÃ0Œj×j™²^‰ˆü~¿œúQf”ï>/»644ÔÕÕIcs¹\Ê…dl-€Êíø†‡*vuüVÞ[)œ >×÷ÐU‹>_ãj4˜ÀÊ{»8³%"6"€scê.„…U`L`é|QYB(0Ù‚¦©jåíø¦Óî^ÓpÁZבHTç­m6[yyùØØ˜Î9Ò;*gù· Ttp? °hA%°”‘H¥RR#éi®ædFXÇIÅYë|;Eö?¯>!1ô«ƒßiiùi™Û§­À"¢X,–kºœüšË7Ü«=ÇÇÆÆ”ÿ¸ëêêtîm ÇS{Ÿ”Uk¾–:ÃlAÍ´€â b¡ÜiÆw5sÍKKKŸíú/ù馦·|è‹»wíVž_RR¢“0ÊU¯4‹XÊ^ªy_¨ýQIIɪU«ä§ Ã8NåÍ3ƒÃPrØœm½ËŸXúîØ3=‘£DÄ0l‰­|2•.F‹ ‘ú¾¬îŽVÿÖ¼W3’À²->_¹!%¢äÌ4÷”·ƒ¤©iÄ"QœC0´ÑìÚÛÛ[[[ÏýûÎz,íãg-ªÊú£¬»v„DùtWn·Ãó—Wý“ÓžÎUW×twgÙjÐ[V!Œ—––ê'°‚Á ÇqÊFáª> ZÊîç` BZP ,eúçù¼åW”;UVV&ÿ;P.mmõ]ÆÛnò¡æÏÞ«‰ôþÓó~ßu?ÌšÀŠÇãyXŒ»ÔuûwµÇ]DýÇŽ ÈG–_z©N{TþðËÅ™ÀÂ׌Ù!‚f‡Z@qQ=#?6ÒÁf¼ a®ó£LðHÿ{òÓOlþ–a½^¯r›BãÜ•”Y¡X,&wàšFæhÙ²eÊW)ç‘*Ú¯ûúúzÕ—Ë¥Æ4*°ˆÈëõ–9*¯¬¿«/z\d„vÜöþ{ß}úØÄÛÒ RCYÖ%4ØÎ׿”‘9=lmsº»(Äû;y)ÇŒö®Ù|#»8Ïðf®8?†`"h¢ÙÍO~>%Nž]#ϰL©¶ÑôFz`i“ ƒƒƒ‡£²²R{÷E•ÀEQµxK$ñƒànù鎕7V—.’ŸjKXœN'SZ}ãOOÆS}+êJVÔ–V9“ÉÈ”ܪ2m¢XÙ±ÃápXþuìö¡Ú“u¾gôOÈ‘ÀšeÊm(’w¤X Ã,_¾<׿u¾ë|;‰HS¯ ýª/’n\Õ=vâ§»ÿáÒš;´/1Ø+Õü5•JéŽ)sÉE•ÀK𲄰z©‘—̰+×ùï½*o2½ª~cSÕJÒ|ÑO/¥ü"…BroTålrzKõóMªk2 SWW§:G5£F¹Ýn–eAXìYED¬à b¶Vßä¶•¼,#ˆüKg~yAÕõk+vè\ÊP‹ˆ]¼FÞˆ0ñ‡ÉŸÁÞ5Œ§ü$°`†æ¥ ¿Í´ì,­$[ž<‰‘›mÚíÚA8sæL0ÔnG¨ý~ŒF§, 윔{·³ ûᵟRþT[(SQYýG÷‡D´¯‹Û×Å‘!Úuˆ!c/¤ú¹ß‚N‹ã¸P(ó§QNé J`)û¶ê`ûuw¾2øóþè)éȾ3oø„ÆF‡zã?#êPý[O&“FX#3y_€¼f¾„pVz`%…ØÞÞ—å§W­¹•ˆ8Ž;Ð|³+ó-\34P^žÙ³å£ê×.ο)¡2ë¤üRžF–*¥ÿ*åÄF:YÚ"YyPõtzX Ãx<y7›‰‰ôíÖþ«<ö²wFž”2ƒ"‰ï=Ûà9ÏïT‚ÉŒ&°–¬¥ýÏLc¨:„À@þ“`A*¨ƒ;›«¨2P²¬ÛjWª²wÉ·,½¼¦¬AùSm½öß=7ðnG ûèçFÍÜoAHVJ`%R‚ÓžséœjËX,¦ÜÝ9×|.k&HµÁ¶j["%·ÓsEý]Ï÷ÿÇh<ÝÒbwÿ7.^RjŸòu†Xªl«ÎÂZÒV`‰"å^›p.a±ºÙ!‚f‡Z@qQ™À2²„PʍÀ:ÚO¥'‚~oÍ–¥—Q xçLøáýÊùå”þ%.[¡ ¬\ &°NŸ>­|ªŸoRÍ=R©”vB<+ ,"òz½Úm¨¹ÔÍ–ìþo^”¦âÞ±ç®^ôù\×1^5½qê¹s‘À*Î!‡Z‚ÓPPwÊ–ÀEQ•EÊ•ÀÊ*KËvÅ[ƒÑÌ aGóÚ+ôLðmÝé/Ùþð‡“3J2Lš¸ç÷Ì^uÏå-ÿò©š½)ÿAT¥ªi”¶%ïïïWMË|>_r$¹£ö“O÷þ@ꇕà£mÃ^Ûð¢Ì?î&°´Xzg;ÜŒ»TŒMñI1:Áxç¡DS _3f‡š"hÅÄTB ô§3,[•¿«…öæÌ›¸ ¢ wk"¢+Îÿ„MÏ¢z7}h$”¥s¥Ö,&°V®\yôèÑB_¥c¶XÊþÊ–Ûí^Z²ngíí¯ ýJ:Ò=>í¨÷´d½ŽÁ–mõŽ\{× Ë ;ìv{UU•ÞÞ5çS{—‹Ü ‘·ž¡büB!A @Ín^RÊÅIy;¸SŽéÊää¤r›‘‚Z锡$„hÛÈcr„:÷²rFÝ1Àï÷:Þ?¡y5­i(ÿá:G##áDJ=ìx<‹ÅÂáp*•ªªª²ÛíÇÉ —Ëåóùt¾g•¶—§qج0w‹‹$_;:BDÑß( ÁIS'ĹX‡CÓØL]Eg·%J¥R}}}¤Qᨹ°êúwFŸ’žÆ:ŽßZS±M>a†K ªÀ""¦¬:À"C£E’Àëƺ3%ü dÏr[Hµ©œ×ëU_dÆK?îšH¦—ØmÎËV}\þQ$©·½Îð„¡/èYL`ÔË·{ÊíÐH$2½mû”qQÞR–&µKKÖÖ{Z£éöó{ÇŸûÈâ/3”¥ÄÛhVͲ\{×yçy‹-*_½Zç:ü©w ,,!0yIA Ê ¬ uz(ËùšÉ Çq===rq4Çq‘HDþ©Ýn—ÿ;Ýãñh[åú~LÑ~2ÏäÖVìÔžæóù’Ž2"õ&ƒþÇ“±õ¼ºÒËtd2¹wïÞÍ›7º\®ÿŸ½7s£ºòþOUiߺ¤VïíîV·íö¾m¼›Í0H€! Y&3™dæ?™ ³d&ÉlÌ3™¾¶®vWÇÏø¤=X ì}×~=ʲ,¥5¡ö:ŸÝÔú…Úß9;v,|µ”2°Ä¹øñß¹àÿáÞN€ ™ñÈbéúå­®G?¹\ŸÛK4W¶¸V«e†ã8§~N³yIO09Ñ:èÞÉj«Y] X,–°ðø*>ÍÖE €èoÂs@O·*Sžâ¹ …A"X  ÷À¢ó÷ÀÊza0X–EVV‰Ä@øÜ®¡ÿ•Sgl»©ö3,kÏÚSnÀ›ºSß¿¦±ÅiZÙÌÞ²D9›L¤T®å)W1ƒg` z#¼ WPYY‰lÕ‰ž÷$#`Ifœ™õƒI~Ífs8H–21¶-÷¡Gû'/œ@»'aeöËT•5EñX½½½ÊƒE ‰`©C"XOùÓ™Õ8¸Cz~ˆŒ€%&põL!&sá3ȳ½þ‹h÷ÁõƒÒ¯D¢|ªÌ­Æa€j[ÊèatòJ Xããi÷eųD Ëår‘›)ò“wº7ÿÇ»½îP®¹>c,Cor•ãšJnÞƒ?º< àÓ9ŽË·&Tþ}Pœó€VO™§"Î%®À´§x.CBa–$ˆ¥Îž={®ü‹æë•99ÉœÀ n#•ùÛŸã¸(Ú;ú{™WtÙ~Í?µ¹æ¹\®¬R¸¥Ò÷·?rï’û×4Ê`E»¥=¥‰õ¢‚ °,ÛÝÝ¿ Ïóë÷¼ù~” @‚½5ò«ZCëêÊÛ=žF§SYèÍdºX©Í@ ÓÏÀÒÞðEÊì¦=Ë|Ôn· ¡™Ã0‹Ô©¡`¬ƒîWã\ò.i5Ø\÷·™ƒÓ,-8ÌZ M%x|áx,ÁërÖ¡·­ø®€ÃáP–—âxŸ%O™õš¯Þ˜êFsµâèŸï¹0Þ75åľõB*vµúÏlHÊŽv»}bbï?( q„ÕŽÛ9ž;?™Ì1@8êÙeÒT,®\ÆLGÀ’|Ô$Rö:˜úBòÞaZ•ŽJ „ÙÅô=°dŒF£$K´üÇz÷\œ<ŒvŒíõ¦¹Ú*šb´”ÞÎ:¶¬Ù¦cänhÂNÞõÚi)ð>[ü”¾€å0ŸÚve)Eäš0É”"úýYV€¸ë".`‰PÕØ˜=[ÏÈXW;¶ï{Žt½2ð˜?1ß"ö#$†B!­V›ë–M !@ Ê!âG»“;mxðQÐå4Å$¯hµZä/Ž(LÀw‰õk"¬ýº¤xP$MÝ4-hŠrZõþŒMF ÎÕd`y½Þ,•X¯KÙjܼ¸ú‘{—H^Z¦7ÿÌϽ|4‹1ÇùáÚfY¶­­mlllppP2kǧà4¥Y_uO¥¾aÿøË<$·oìE§¹ÎN'íù3U'õ $_5X4[‡Î! Á7‚¶©ŠB<°dLŒF#MÓZ­V¼ ‚Ç‘àå ?}ð¿Ñ`»®öƺiH­`ÕTÔÈ«W^?Ø`7RYú— ¥íù4"„EQj&ˆY¬?º”Û0"+s­×,¬XGQøÿ¼ðþÈsG{ööôôtvvJª!Ο?äȼINÙ”^•Rg B"Xê–ED~ð,É;&]Ý*£^‰HR•3å*Ën·ã‚MÓ‚ &v ãmU‹×Ͻ5ë3df`ÄKE!EQ”ÒTQq€^?ª¬ÇRõƒw¬¨•<Š|²²ºf°&íK±îß>¶˜¡¥ï°Äç™7o^}}½dX¦~·È¾þ–ú/2Tòÿ“îþÿŒ'“¾%•¬Ff¹>i!XlÚ¾V‘\†„‚!,HKŸÏw¥_’ç„àÔ­‡¢)K¥òùXbý ®EˆeaFNüh÷?üÍs÷ø#ÉRwšb6V߇«W n2^?¨0õ*iJ_ÀrLWÀÒh4¹¦•ø2`Ÿ?5gm2€ã…'vwåz¹\«ˆk+ïúÓ•ÿRoœ‡ŽðÀ½=ò¤;:à÷ûÑ"¤8¥óx<¡P(×”®l2°®J©3a!,uHË€" "n€E7.RÌóx{»¬ß2X,ËâiM4M‹½VÎûND“) >qÝ_QýF?–z`@•õ²ø¸«aõêÕø®šÂa_ä`wræ@SÔmˤ–"¿½ýolüæmó?·1Ubwnx2spUUÞЦ¢¢"sr¥ÓéÚkWl®¾ý·‡û¾ÿöÈ“½¡S‘hÚÊ_V#³\oU"` ‚ ˜ G±©ÿÁsÙ¬"¹ C"X –:WÞ†_ð¡µ7ÊâPÓ¯6ß ,H×"¢Ñèë§~û¯;¾x ûMŽOÝÈ–±[+uÒ…"5Ö€'5›*c,( ÏÀš(DÀ’©-[ZZšš›©¶ÿpÇ´ýÓw»ƒÑìš‘xzmm–©d½Íµ­îO7UÝSs»8}sø—“ñTl5SºÌµÇ°PàXtãbùÁ‘HïÚÃq\æ]L^¡ÀguÇqåÂG=o ƒ×µm›[ÝЗ„`,ùr4E™õÉ kMžX $`±,›µãµâ󨙳î<>Œº0¯iµ×V8m½aaÕ#÷.ùÞŸ¤þ¯.Ž3û;‹µ„sæÌÑjµEµ¶¶fV}F—˵eñö­®£ƒí ,5Šæ…‘” ÄüZ«QÇ|as˾z^<ò_<ïd\àó›šNçä¤4ßåry<žÚHmTs¿%ôÆFæQ—ëºßÚyôI£P±¾êüŒCCC4M㕉Y‰„Ì”—²8€¢Å$I!èžS“$y¹éèè -oKÁR‡D° (’ ¦e`) X¡ÔG2saF,ïk™nß’û੃üÑîíË>í0çl†`Y ©ÉÀŒ”êt:—Ë%VÏxèÙ©5°p8<<<Œ voŸ•iË-òæéÔ´{ûŠ:™‘*i¯µ~p1éWu~8Ð\™}!W§Ó‰ß·¬–¸Aõ§›þ±ÑÞöîÙWÆ©OúûÃ?^ãºÉ 5€Ýn¿téJÄ3™L2Ùje`a%„—ß«H.CBÁ–$ˆ³~äbâÀïÕŒ ‡Ã^'2µ~æ5)»]ïN™©iAùd`!Ýj(Øå‰ [µŽ‹“‡/ùΠŸ^÷7MÚeý¹^K] aJ ©gËÙ«ô,,kÀ±IÕétE éùðjMÜ¢½ÖÝÐú½×.p¼ç‡?w2×¹­Uæk*Ó¾ß<Ï{<´[[÷7íò\ô'}[/ŽŸøêÓ·&¦:F.m¬¾¯Þ8âñxOO×ëEçf½NTÓ e¶ 7€À •2óe¥©©éj¿´ ,uHË€b¢¤!]¿@vx– ¬¬÷5žç†—LQq½x7L$œ (Š&!ÄŸ=ò#’wùJCÝöeʼúd$¥}X1 ÏÀ+4K¦6â³c2óè–}4¦JÓò9êÇ碽ւ¬sÓ7/ÎYL!JW2èýË?»aλöÿᡟ'„8xCã;Oüúc×|**ÒÞ³˜Õ•ë ÈÀJ+!¼üV1\†„é@"X –:{öìÉ×ÈŒ;ýNô™‡ÕŒ¤2Úñ•ª"çºB!£Ä>W¸h·}¨çíïû»©)JJ°XÖ¸þ¦E?}útÖsEˆNÉ—Zô©pFü˜ìJ©Ø½RrP€…7â™_k€æJÓ]+U­sèšï=dgíw/z¨ÆÐ‚Ž õ Bœ×Ðϸ_á„ä ­?‹f™O˜§ VQ4"”Ì_ %‰`©C"XCÓ[º(½‚ ƒš ,˜’-²ZC&‰]ÿøu×?<ÕýOÏ÷>â!“#êæ–5ŒœŠ”Þ‚°òÏÀÊqÔÌ.ðüîé3ýúAqž#"iD˜5Ÿ]«ÕVZ³›Ð‘×:žžŽ@4ňR Çq™¿  ° ,SEê{ ¡ËÛܪ.CÂt ,HKløùñK3õêj2°äÍ $øýþS—ŽüôÝï 6˜Ú0ê,ŸÛøw ôû]•€åM­6’.„%D6Xê2°ÒJÅ¿¸©MÍ[Úß•³™Âfeo¨}ЦÍ~µ œöí=ìþ£äx®Iñq'ÂU!½¡‚ƒ;¨ÎÀ’ñvì÷Ÿw@BˆE¸”‰äÛus*æË¿zz ÂÔd ­„ðrf`ͬ€u§ºu5EæÕLWÀÊüìâ\kIÅV“&ÙÁ0ÆEwðqȈ¸¸ë÷û»º²ty.  ¨ ¬Šø¸BÙ!ŒõÌÔSÑ*LÜó°&&Gºç[ÑD™â5_s˜«!ý^–©N( XqŽñ%§+4EÕ±åœUò%„ú'«šå|Rõz½ÄŽ*ß5R´2¹uAÕwï^”µa4Áÿà‹âöáµb)˲hÝ8³‘ÙlÖÓ¦›j?»sàñ(³ÞÚÂ.>=²)µgý.b7X4©~á¹êl•W#‰€E „Ë@^X<Ïg:žæ+`}=ó YÃ^ã¸U¾3 °;¸EŸRafÄÄ]ÍìââhJqûìÆfV^¯ýŸèõz–eå<ÒÙҮʶC‘öºTç™ó*$6õ––Ö­°ßüÁXÒ¦d_çk¶¹kçÜŠ¿§··7‰ˆ–X¨¨°€ ,«G“r˜à‚ºvÅSPB𘀥ÝðIÊјkd$E»:În·ã·Zzþzå—S-`ñÀ½=ò”7’úÅMS /p°°öÚÍíwŠqËh4JnmŠÖ7‚º×TèµL¹e)ᔀu2°¢ ¾×¬q )jnuÊNõ[wæt÷øÝþAoB1®?@‹–íâCøTLD´hµi7Ô>xÀýÊök?µaîGξÐ̬|gôéPÂ<<‰$](Š Rî¾ÀÙÌñëœÕÒzÅ~é%„©É@š€5 wų.bòÐ#÷.©±éßÿýÆÆVñHæláÊ0¯ÆÂДèòyi<‰s­Üÿ¤ ­η^{Ö¿o":(î>ìñD* õK#‹y½Þ‘‘càÖŸf`ÙÓl°.kçšb¸ ÓD° A,u °áÇ,ÝÇ¿M×ÌÍ5’I$úßí.\¸ÐV›w¾zëÈÄ#‘Ô{[V¹eeÅ­Á„w2>±ùÚ›¨)3,ü^f0$-‰,\)ïúA(?k Kñ qa$ Nã Ùi’ŸÆ!V»ì8šô Ýß5±b«\ mƒÁÀ0 Çq5†–;þbCë-£õù|Õ†æk·½7ú[qXOàÄâŠMN}£Éd‚òÊÀ"·™R‡D°Ô!,Š!ˆiXÙ¬H$¢ÑhÄ;ofý`.DÙ‚eY³ÙŒ,Av_|å)Wš7W?@i¸P4X¥o‚lŠ„4˘š X “Ž Å8ǸÉHwÈÊJXþzVƒ¦Æ¦€M›6Éžt%Ðkè9cÏxxAè .n°ÉŒ—Ì£(ŠÊüìh €Úà¼çƒ?M1þå³?^Ân±ëjmZ'««ŽÇãE¦ÌÎr Xj2°èŠ+׈°.CÂt ,HK¼mø1Á“\ЦsdÆJ´'ÅV¿Y‘I ±X,@ Ê…Ïù÷¡ƒKÖÜX÷ τǢ±[4v*ØÇïeFcš¥Ñhä µ "5¡j(w«Ü²Ëú&f>ëÜPªäp>f !ÏÚ¶T­ßþÎ ÅñøÅ €(ĶZ–;õ âq„Ä©I?þEǧÎÊX–Tï…"°PòÄ©%PЦ±B-±àùóç8 &×@6÷\ ™"žŸåé}í.co°hX+]%ªW¯€•.QåkƒU€€…×ÎS=»¸2 »OH·ÍŠäÿYqª]©o¼¾æS4$Ïâ„ÄqÏ[ïŒ<ýrÿ£»†~‰eÉËCL?Kð,@(jòµáçݽ¨ e¯­\é½ä>¢(EeE¥ ¬¦¦¦–––1Íù8ŸÌ8aMÎ?»þ߆”º„–jxžGOHÓ´D¯PçàžZõ!X%Æå(!Ä ÚëT X­)ë@·²»ÉdB¹‚ãããÁ š×R7¶>ðì™ï‰;CáÎÞàé…‘…že2™äû,ÅB@ ”‰¯ó—Ž¡]Á?|r"ˆ· Õ+dÙßßo6›Y–UŸ…&v¸gÖ ïÛÂÔ„µRßÐ`šésJE+[Àª¶é/M¹Œú£mÕ +´”âöšs‹LÀj¯µ¼q2©3žž”,ùVS;Ù`š¿©ú¾wG ¦U …;ßýMÓœ¿“ŒEO»Ý^¸Ö—;‹@ WÜÁ®j‘,Ñžò²cW–Ãᨬrúp:ró¢ûÌz+®E ) þã]£ÑHÔ U–ÏÀ*gw(¿ ¬þË…·à™_c•‰³Úegèä ä™ÁIXa‚…g`ŽŽbÉö0¿zåÒÆuh÷ý±g/Žt@†€…¶K±„pÏž=Wû-¦‰`©C"X\á &ö?þ¯íÑgFÿb;ÿ=Š×z<¤^@(ïqù–ÂÔ/˜Ø5ô¿]£hÀÒŠ­ÈH"õ”LÜñ ,‹^*`¡m56X…d`aÊÀ*’+õ«ÕXv»Ÿ¨€Ë²|ó®Ì‘½ÁÓ¯vþ\"l…ÃážžžîîîL×UXlš–âøéP$$ ‰`@‚8Ûàó°$ !—IÀÒh4û:_÷†’?´ Zãõ ît-"—€%Q¬ÔX¤„°„É7‹aÅ nš€U«vÔjÐ,˜êãà ¡¯üx\À’˜[ñ<ÿê¯RTò}ÆùèSÇé÷tâB>/TÎÀÂ,ÿ˜üà+)V/uHKÁ2àJ1±ïÙðcŸ.çíFlA(æ^gY)ñz½RÄé&Ïó±xì”ïý—úþï@øz´BWÝbY’y–ŠÂÔmTš5íÂü2°¦2¼ŠäJÄ JþŸ³*w,˶···´´´´´ ÚvÛu÷·ÿ͆š-ªØhÓ¦Ì Ž¼³ü•Ì'ñz½™îŸª<°XÌËC<°r–$ˆ¥N¾$?~ mSEÅ0 PðZÇoБÍóï4ë­CÀÂod… XéXDÀ*м3ãÜìÖæ" Ãà_5]®ÏaÉóê,Xã²£íý] 6X2rZ­vŽcî]K¾€Ž„ÿzíkc“èH©g`¡THì{6üø§dÔ+ ‹êUOOªpGD"‘®®.õÆâH_ÀóÎÈÓÝ;f Ì*û6ÈH¿‚i˜¸CzÖXþXj,WKÆkH¹„ÿ°¹”;–e].—ËåjmmE+µsæ™W¯©Ü~kÝ—q ëŒÿƒž@Gæ“dÚcq'ã™%’VBè#XPÔä+A¦•:›åK´§Ëá¥ÑhNöïï÷tŠ» ÍܲäqÛ`HÕ÷1?}ú%„¤ aéÑè0žLN°ú=áJ‹Ü²§V«EßÅùåD0†1£Ž™ãÈã ±¶Íñ¿{’z°¢;jD˜kÀ­K?ÑÓßuÌó¦¸ë ï|qKÕ'’ï ëV_° þÒ±4õŠÑènü è¥k0LûFIå B¼óú|¾<^”ç½=ÿ÷oŒûðãuƶµ•w±ºê¬gåiâž6_ÄMÜ °Ôø@],b¬¦J£QÇ„cŒbÁ˜Ã,÷‰hšFÅÕl|É ù›4¶mu_xuà‰—ÌËûÐýRÑedÒþg²>y<—ÿ§lUÀhÄ/­ô@<*oñK „"¯Â+‡ðÓþí^Ó|½Ó’\GÁ{ì&‰îîn—Ë…ÿx×jµÅJ1áF`3q¯/w¬2°Ø”€õØ›2Áp8<<ìÃ|þc¯ —ôªÄÁ¿ s«Í´’à…“¯»Á`À¼Û“X­V»Ýz½~¥ãæ>íÛ+>Ô8wFµ”ò-!4Ú@£ƒD „HâÐ^å/ºÏçË·ß¡¨ ,uHË€+Äøž§põÊøgOiÖÝŸ}h ;ëaA$rÃdÜ=ío±,Ã}¬†Ã]4EWZÀö|Çߢ)ÍKG×Tno³®Ê´¾B(ZÒ<°ÒÔ.<kħ,`©)£ÃñG‘|f5hj¦^®H®Dš¢æV›;ú“ZÒwÿp¶ŽÍ9O‡ÃCC!”u/3QSãeY6×xN—uÅ΢±ß\÷ùWã…D¸à¾ñn¨y 0™%„H$CЦlÕÉ&ë‚À{‡áL‘DP0$‚e âl°Kg¤ ¡ÌYq>úæ¥_Œ„RU·-ý$Ú–¬Þy½^ǃß (!D£‰¤¸QaÔJ<=Ë2ùxXbÔÏÞëÉóìN•ãÚkÕ:¸‹,i´™tL(ÆÀ7òí—ÎuÙWƒ¿~s[$8™Yúg·Û[ZZÄY ØSsuåö¾ÐÙɸ8!Ñ<ÕfYEQT @ÓAA‰„Üw¢(K%jÄ#LŽSŽÆ¼>ÚŒÓÛÛ»téÒ«ûÓD°Ô!,®D!±ÿ9´gxðÑœê•,’ûÝ~÷+ý¡³§|{VWÞVcpÞCî=Ám¼½þ¡ ]õ›]¿ÁÕ«J]ýõµŸ¶hìOœ†rÂhÎ ¬iš¸Ü‚°x®ÄöZ+°ÝuQý‰6f&“ir2Ke¢]W»Ò~óá‰?Š»½ÁÓÝ¡c.Ó q·¢¢BlG(Áãñ ãv»=ëKÓl' Xbáe°Š'‚„ ,HK={öäQE˜ˆ SÞ¢éÊ&ùá—5‹o ÿj$’R¯ÖµÝêªZ$ÿl,Š¢ðeEw O*á¦1Ÿr±¥\¬+Rê™—hhêšûûç“5zßùÙ\#—5V,°†$ëŠ:nùòåx‘£Á`ˆD"­–åÇ=»Å#]ãm–U‚ x<Fƒ¾è e«**‹ÜfJÁR‡D° ¸Aä.ìãÇ{ÅmJoÖlþŒÌ`I×9Fƒ„u:V«çd}Á3ý¡³0íûãàOj ­ãÑ>Ñå*Ƈßùå5Ž[O}€ž§Í²j}Õ= ¥<É«„ÐbHÏÀš^ aa-¡˜®Ä|ç<ˆ“£ÊmFcV –°›ûB§G§fÿ{FžO8ó¬×€ Yí®P»×ëu¹\™nƒó'Ü™w)¶N»éA˜iŠ'‚„ ,HK¼<°xw/I9‰²×ƒFaé² XûÆ_Žt¡Ý¥×}aó?*>›ÄËëõâ7»‰‰ ¯7{^óÞ î=Üø’XÙ;¸CùXWDk,`2·¶5%`ɰãøÐ‚ÒLW§Ó)±è2^¯·Å¼ XCá .``, Õj³6ãÌŠŒ –˜Ê(nçZÉ$Â,$±ï·h›Yu•a}…ƒ= <}†¢(FÇ9!q`b~>ó€ÉøÄ;#©>>v]톪Ӕª4ÓñÀJËÀÊ¿ aa-‹Š‚¬ScÊ–DÜÄ¡€ÚXußËý&„pBbïØóãÑþµÎ;Ð$Gn¿ Îa² X©F„ñ÷~ @Q´³™Y¸EñÝ¡hò1À‚Œê¿°úCç.NF»s«—þÅhè´Ù…ÝnB·3ƒÁ`·Û{{{Ñ€x<îñxðç…B™÷µOøowò™ý}’e†ÜõþeC™XçU~ó¶ùjFF£Q¯×‹¾4z½žeY¼Ÿ¥ì«8•¥³³Á’aÇñáodX™Ó_±m]Wk×ÕzbÃÀ ü¥àÉvÛu^›W#Âø»¿äº“[8öz<‘p²‘×h¤ìv°´7|ëׯº—@ .ßÿ<ÚÓ^wŸüð±±1´ÝÔÔtnüðYßI§¾Á®¯ …Bâø”ï=±(^ E¯sÞ­R½5V°ÒfDUV=E8/ŸŒò‚ o‚™wV· Ù8Ï©~fåöxŸ<’¬ñ¼0Á- î3òó ›¶ruåíûÆ_DGÎù?ôƆïÔUÍûÉ ž•D"¿úšùßS&“a@˜…äåà—­ aŒ0ö{´[϶üÛ¾¯×Hov,Ë:Îq×b±€ßïGÜn·Õ*g[‰sßýâ¿ï8ŒfY."%„%ÃâÛ#÷.Q9øJfmn—›ÿ=öV—øÍëu‡ÂZ–eQÃ¦ŠŠ Ñ»Mø\–垉dè®Àñkn¶ÛíxŸò¼2°â{Ÿ†¤/<Еƒ•—žÅsç,Ó¬øˆº±Rò+u&$‚¥‰`p¹ƒÈyÕžSF›üüH$‚jÄ(Š2ÙôÏïþÁ˜hŠfkªôÍÕ†æãž·Ñ)Æá’²Ž‘±Z4ìX4­çà‚ŠµÕ…öØ8ò&î¼ c¨%1˜ÓMÜuºÂ¨õ†âà…‰`Ü)Ûà8_+—Vñ\‰mÕæ¼fVïuï½ä‰@œÎOðµUrãe2°DÚmkµ´þƒñ|Ò]a$ÒóÞÀsëœw«|Kh{†€À÷žˆíz\wë× {άO …A"X –:yÙðóã)Ã)Ew¸l%„Ý;Q]†f¾¼å;f½-빇 XÇy<<õ$ ÊO!þüÉã¿x¿'×£¤„°÷£Z@ \y'^ç/K;‚Õj¦ê½^oww7šfy½Þªªª±±1t”÷í³/È¿ÜúÚêhc³yI³9¹êcÐnªýìÎǃ /ÜwíŸsƒyT©Ë§_Ģe:TmÕŸNÊL£þè¢z¹g …Bø®üòéˆ?Š^ÝjÐÔØTù9ëç:RÖ…²P­V‹\üz½^ârÕÀ¶þóš_üýsŸôÇ“fŽ¿$€ £ JWcpii©PHQTæúŸ×ë펙¼íÉ/må’¹ú?a?!_äñO3KnÌõV5+·Ó‹å?@ f¼lø§YB8ý ,¸ýî? ]»®ö–Ÿ9¥¤@$ÉlNb0êêêrUŒ¡™ üèÓ+¾r½KÞâ ü ÖÕä¶eµ4Eñ‚»=þˆÃᨬ̩›êt:ÔSÓe]j+Fü}#þ>h³¬ÚX}/T® ,´NΘ[Øm™iþFÇÆÆðk²ºº¿Ì2‰¿ñ˜ ?ÞË_:N7/WñÑ P¼$ö=~üSÀe¿•Pf»fé6qÛãñàZ•¸€]]Oq|r­’¦4‚À‰Ĉ¶ê%KªÖû|~ü V«51¶›j?ûêÀNCãʆ­‡jT8¸§Ô‰–îãþ‹÷/íïòäzªp8ìv»qñåíñ fsNköOmÏ-J¬ÀW}÷]œŸQ›L&Ÿ/µŒÌ0ŒÉd’XƒÁjdoªÿÌ˽ÿyº#“›Ö¹¹úOœú´6Êñx<‹I2à$ßRwœ©ºá/-;¿+î&:v%:vå|£:“ŽXP¬àÖU)!<3¹w2>!nÓ½±ê^½N.˘aN‹Å@Éz›˜o•«blÄE¹áVƒæ¡ë[g™x@¬«Km…aµË¾¿kxAxõÄðç7µÈŸb0Än;.ó²ã; ý7@gà'$6WßwäA¤¯“[Øåf¶šÖœ=p?½yÃùR~è\âÐKâvâÈ+º‚¬ŽŽÒò¶¤!,uHË€™ ¢¼zá7õ @ÖZ-‘ýî?ð‚`Õ88!Ñå9‰Žo©~ ÎØ:히\ðÅF)Šþôºo†¤/'&1Ùuµ××~Ú¢ecÑX^Ÿ"Ï„ Ö“ôf¥[å8‰ƒ{é^‰‹êm³n"€‰`ìÌQ}vû£Ñˆ X:.3mM\?«25®¯ºç½ÑßJõÇÇ_|b¥ýæ¥ì1ý\$8i-t2×·£×}ÚÖñß{BñsI:5+Rº$ˆ–$ˆ³ˆDLð$뙀¢éÊ&Å3f¶ a˜›<æ~_`]W©oÀ[«eÅh4Ф·l6™?ÏqÎ M¢íùµ–Y¨^°®:ÛWÔŠ¼rLYÀB׃‘±.e· FÏOD†!uáõO𣉛µŸñz½’oæ:yfKNAÂá0~$‘HÈ XšUw¤¬£;twÿ£üGÈJS“òŸB1C"Xê–‘ïMì{Fܞثÿ-£^@oõjOx½Þ¬)º“q÷Y߇’4+pÙ—4›@ƒ±½ÁØ„wÎüj—sáéÑÓ’ÁHΨ7Î…ôžK˜€eÑg°®D_ݹÕi‰Z¥{%R¬›ëØy‡Õί‘kVXÆë*sÇŠºo½œµï:5úŸ¯žÏ:Ìå4Ý·¦Ñëõâ3øk·ÞQÿù¦ÖÆÎÑ“ÿóοx#É9Voðôžáæ46àU …$Wµ¢¼fÅm@Ñâß®ó à¦ØÚ|_W}§ BqB"Xê–‘;óNô™‡³<Àht7~ô)…ÅçóyýþÉú•â®×ë­­MûƒÏ0LUUÕž¾?dªW4Eß¹ø ¾Á4ªÒ\³¢y=d›í1 ƒªæ!›!Ïô3°ª¬Êóàé#ÉÀ*é+qüJ$`}pqâK[]2ƒ%å,Xí¼¸(€¸ ]@ß±¡ðÅ?ôÿ`kÍ'k -€7e‘¤¥ëõz»Ýΰ.Ãç~Ä]‚ øáó‰ƒ/ŠÛÂd~VIG$‚e b©£Þ†_ÈÓ f´„p<Ú×8Š®tlÓÑFP!`áK8( dÌDΧ2°ÚëÊÄ‚ _ˆ€u•Y>§¢©ÒÔë@0šxø¹“Y‡ÑUmÓ7ë{0jÍKÖ~nÕ?ÿüà·‘Ëé9ÿKž³.—ÜܲIΨë¹Ì [Ë´­æ.îøÄ±Wµ[?/ @ Š~àL–£ŒÆøgOiÖÝ vw`í!£8K£Ñ466v¾{$óù®_p«zÁ±Á4cx4WËÔ›hš¦i:«€e0²ò°²x®oœçüæmóåŸD$z½^tƒÖëõ,ËfºLfeãüòi´anê³(ú¸K,Aä,˜uUw£‡"æñ—N?á’ÊT˜›|}è§×8>²¸b.`y½Þ¡¡!‰€e±XÄ>íMe}oÜ©Ý)+Ï ,@ \1òup‡™ËÀâû`üE´”b×Õη®·ó°p,<«½–d`®Û—×>¾»K~ /ŸùÙá—ÿt®ä8šíUœ·Ö}鵡Ÿøãâ”QxùÌO7­¸™¡S!¶ÛíãããøÄ.³ô#sÝÏÀÊì•.nkVnO X‰#¯‹@ Jˆ,;òK‰z•‰4Àq\ר)Od$ù4”f~Õ _t, ܽê‹ZÞtŠ‘+ 5ªÃÛüY,–é X¥.„+š*V4©]ÆÏuœU¬vÙu:–ààâhà__9«eè¹Õæ]Û9_s€ÉÉI«5m.NQ”8ÉÉÚÒqqíZ*`|{èéáHrÅ üA÷ÎjC E5ñFMù˜º#ƒ/ù%>†eÙššüHæÕ•™…,q"Ø3>)Ô¬ºç:vÅ^ùÏôÿGÞNöìÙ#?€Pä–:$‚e@ÁAäÏ¢míõ_ÐÝñMã_¿¤ÝðÉÌ‘v»]¢4I¬D"±÷ÂÑîÓ‚‡6ýÛ#ÿÝ?ñªÕÀêõzÉ}G> ?ˆ+V‹tÒFe™æ••Õ+/X–uM1õª¤¯D£ŽYÕœúìßzáôÃϼÿ‰»ÏdÑ€pw‡Ã¸F z½^ kV‹a«Þ~Ký—±×S˜ƒû±‰7AŸJbý‰@ªh.(«mçkâ^Ò$‰`Y@‚Xêttt¨™VBèlVsÊŒ”:OzßE»­–µ†Vq[1ý rd` yå+ÎñÝcÉ%EÁ¼Ù*`‘ ¬«Ïõ åŠÎ M¾|tHÜ~å¤gmCÕúšäœ[첉¶].WEEEWðèyßAñàŽ¿\V·¡­a!z6‰Ü+™,‚l–Œ<ݼœv6ñã½ Dƒ™^*tó Ͳm¹>#äSêL(NHKÁ2 À &bühgr›¢ôŸþ>eÈ™”β¬dv%)!ä~÷.´Ûf]‰×…‰95¸…¬\X©gƦ˜™–N§“”Ø+®*z`]JýJ\?·òÃÎ üÇ ŸüÉÁ£ß¹¡¶BÁ_¢9¢KV+‹qGµÊq ««}o4Ù…` |n,Ú,Ìü’àçÊ¿ÊêŠýÝ…€(µ+¾¥A‰`@‚X꨷áŸ~ aV$~{ðiTù“ƒo|c#CËuü–„ E?«€ …Ðü¤Õ²üœßH¤GÜ=6ñæªÀz™RÌÀFK™X!èà9!0çdá²¢Þ†° +!A¬:Wûæ~ø _,™œKuÿÊ¿Œ¦ÖêÔXE É/qåúÁ!Ì«n–`°Š†~êK«¯ýÎîPŒ$ñ¥g»æ×ZþjÛ¼Ï4dùâš´ÖÕ•·½?ú;q×ÿõñ¹®ò£qmÈ×Üçop>hÕ&mV%—Mfú¨èB(¢Y¹=.#`|>ÿ80Yæ @¸ŠàX –±›•̼] ”}{³y)Ckñ™œÇã‘ÜSü~ee%¨ÈÀÂɼ[á©Ñéòo5%Ö̳¹=•T~q4øûCâöî3cŸýÙá%642{<ÔúZ®ÚL˲:Ž¢(”Ó …¼^/˲Y,Éö›_úq{ |îÂHÇܹsív{ooo¦ÜÉqÇqòßÊV•°ÿ°¡èHÄÏ” EÓ•ªò¶2o y XŸØ{ñU´» âºÅõkަÔ¨°Àh4æ-`, VI°°Þú_÷/ýó'SÆùáÀC¿>úZÇðK_[—9¾Õ²òRàTo蔸LøÞùzô€{ǵŸ·#‘ºb½^o__-ôcƒeY|f)AÛšÅ×ëîø¦äÜøîŸŠó?!àNœz[& kÏž=$Ý·¤!,uHˀ‚Ȧ,º^AÀ’8^IˆóÑÞài´ÛfY¥Õj3Ý©²¢è%yH’{Ÿé‡ªœÆ<°ŠFÀ*õ+ÑiÑ¡¤r޶}o2Àzj_oæø¦»š×´8Àn·{<|މDD§‚¬–ä{Uglkªhïõw÷ô¾´nñõ6› BFƒ¦4ñx\AÀ²VÁÐyq[˜P¸4¥A‰`@‚8Kàݽ $g”½4ÒV¶"’.+YW5TªNpfèp0š’ ŒåZÇm’›”zKr$¯„ó‰€E(rº¾õƒ‹î§÷¥ LÞPöx ¨­5ŸØ3ö\WàXæ£}¡3ý¡³¦ B86›Í¢A»dùZO³”x¤5 Òô<"9W¸ãoÿLÜ–¯"$·™R‡D°Ô!, "žE+e`É X]Ácœ¼1Y4öjCsVé!+™>ù>>Z­¯Ôëõ™§Ë¿âd$u-ž ¬rºšzúË«Wþóîa_Ζ‘î„Áår‰Û膄¬ß"–eÃá0²ædYö&Ç¿8ômq·?tvï‰7¯mß„æ-ƒA«Õ¢N5±X,k(Dš{>Ë)‚³Á2€±ÔQ” …‰øÞ§Ô`IÚÑJVJDxžWßJøPÏÛh»É´HËè%Ë!*g>’{EQ¨/s.ÎcV{íì-!$]KŠ‚§¾´úØwo¼wuªu0šÅJ¼ähŠÙ\}ÿ[–ü,8à~…’‹òzËÀ—6âQ4½Ó¬½7õ<_NÉu‚@ WnÆ,á´7Õø©Õ²’ wp‡ŒI!ÞŠ$3&W ¡Åb±Ûí’ b!XÄëòS[axúË«e¬¯Î I{g’u5[ì]Ó2…Ëåj²-¨1´ {ú_r»Ýh×h4âßåF„¶*´o#B@ LE 2qæè3Çßü1:’KÀ’üÈÍš®áóùº»»{¦À/ ¼À¹”j>Øl^œ¹ØVX–ÑhT\x#%„"dÆVJ,ŸSñ.zî`ÒQ"ËâN%Né<O$Ù¢¿OGNxß61¶*CSø Çsà»;¼ï-·ß* M€56&]Tôw×,¾ž²T 7¨¨"$•Fà…áóh®_ ?\æ–Ñ<ë‹'o40 +ÖAÆ:$ºC‰»¸ž•5+S„Òh4óæÍË,++@ÀÂ=°Š§„°ü¸aaÕ/¿pÍÉ~?:2ˆýü½qû,&`Ùív¯×‹'U‰ú¦F£ÉìÖÄ0ŒØ»ñx<+Û^ü©¸;¾Ð=qÊÉD*£Ñˆ?C~V>X@¸Üðý§$GT:¸g¿õÀTÉaÖ$¬ #'|ád§]m¬3ÍÍœ«(N?D$–dÁ/O0>êO&ž´L³S!]«Œ!3¶Ÿd"ÙíÕÑ”nbb".¬Xod¬ Ãôjî:4w?á}{®u•Yê°¼^ïÈȈ¤Á¤ XÙ/­fõÝjª}>Ÿú~„"„D°Ô!, "?~Iˆ&’²UË æ8.IÖ‚Qe³ÙÐJ¦Á`8=”J¿rY–+d›IDÃ0›Å¬XsæÌO—X™©K4«,¯ÄO­K3Öõ‡ã¿x¿G uçh0ÎñZ&éã.£oJÚ_fo­¡µÎ8w(|QÜ}¿ÿÅ[j¾(nFüä›i‚è5…0™‡€U–œU–$ˆeßÛ!9B;› ~¶Ì¢Â\êÙ¶ç˜ÐÀ0 SX–øËºc4qr4Z­»ªëx¦1bÈ›*ÆŸ[m¦ÕŒ–%Å2c#¨Ä¬OÍØ²–âˆK—⯎ãî^ûŽþŠO'ĺwn­ù¤(`Ùíö‘‘‘p8,žˆ&‰\‰”HÀ’T{½^—Ë%Î;5kïM X_ˆÕΕ<‰vËç)[UooïÒ¥KUÿ7ŠÁR‡D° ( ˆy`…B!ÜQ¨µµõÒ¥K ÃhYn(܉F.ªH&ÿ«÷À†að…Y=°jjjÄ ‰4¦Ñh$‡¢€åÇLÜm†bi’;®D›Q[WaôF Îñ£ÁSíÀsé›Z­.EQ™ß »Ý>>>¾Ê¾m甀5ìŸk0¶CÆZ÷åËÀš ,oHËÄRGÑ‹ï?‰¶µ7~™2±L{öñ)Ód2efo¨°cõƒMæ%05WÁWàï/"#ãžÿ9þíÉÈÔk‡ü²g¤h¯›½X@¬’ìO…,Íž… (Ša$34æ ÷¼Ñ“ìHØìŽti4ó€eY“É„,§Ó9<<,nÇãñ\eÀè™%ÕÅxâezáDô™‡%OBW·jÖÞKn3¥‰`©C"XÄ‚ÜÍf3˲f³ùƒ>¨®®~{ð7è¡ZCk¥>i×8‹aIšLEE’!ð`1{K¢X)zIàYÌÅSB8K®Ä…õ¶Á©Åä3ƒ“ ”æâ’/RVu’eÙ¶¶¶@ 0Ǽ°/˜üb™x£¾a>”Éd¿]ÊX˜€Åç#`Í’–1$‚e b©£ààöóã—’;ŒÖð࣠•6rAX,i^Q‡#SÀ’¬p˜ÍfdÐ ¾ðĨ¿_¯5z‚£î@ò²†Ò5˜æMÓ’_Ê£££Ycú&¿ù0Ù„¿u¡×£p'ÊÅl6À"`•z ­eè8Ç@4Á£Äû\àV"‘XÀ®9¢ß=M^<Ü;j Fõz=>±«®®…dMZÑ @ZE˜åI:â^ï@¸b¤ Xõù X ÕjN'c]J%Õ/f7¡mEOFƒ×ªONNâ&Ü`³ÙÄ ‰]…Ø?H’´/ŸÅ B(–¼…QTZv3á ° ÎòÖéQqûì°²» ‡Ñh\ÉÞÜ<+€îèÀ9ÿ‡ lë *€5X…–á²Â÷Ÿ‚©ß§tÝ|õ 2~®f½}HæN§—Ÿvÿå§ž•œÒhn×PZ iZÒÙ0 fµÐzçìØÃÏ„™`6· "`•"f=ã %m>‚QŽ5)Xh›ã8A€µ•w¼:ø„8±›ˆ^ð\Z©×ëñ_&‹E²žUVza–'é< æI0ãðƒ˜€Õ¸H~0¾h) XP__ÿN×ï|R°isL)'ø|3°ð]¿ß/Y&¥¦<JA<O^.ªÁ(ÇOM7Í:Ílö’¸*,¬³¡í³*ª°Àb±8ÂõÍæ%=Á¤CÊA÷Î9¶v†að'QÌÀ¢‰‰;@ %|_Ê‹ž£m'ù¹šõ¿Äè׳x?ÐýVæ)M¦%É7 ”î8=˜ýfWo¥·4ëôz=˲z½œ‡Ø0¯Rå‹–%DÀ*=Ìz7”ü©Šq¬Iîç~rÇq\•¡©Õº²sòˆxðˆçõ– óÚ[–Dãa†ÒЧèõzÜËh4â?ð'7ìv»ÛížœL]–x½±fñ º»þðþAñHìµGÅM¾û0ðÜžö)6L%3ŠÅê„"‡D° ( ˆüàY´-ß‚P’ô„,ÖÎîëú#:¾¨b@J Ê7 ߥ2D%ùib^XiîÆ"š Í’+±½.Uþ0ãÖØØØµ•· „/ÄùpBb÷ÐSÛ¸íø·QE–m “ã  Nåœ%,cHËÄRGÞ†oAÈ4.–*5–ä ~ƒ8;tÄ—Œghísrʤ^À:5 µ¸¢(ø“UÎØÖ`ÒÒxß‚ŸÏápÀûçw ƒMæÅz&u/ (Je3i|0MÓ23¬IrjäEÓ2°ŠIÀš%4Ø6£Flé'†|‘zÖ 3>_ Z-ˇÂ.LwwŸ}aã¼Û‘1(ÏóÇÉ«œ”µ*)`“c*,@ Ly~<ër”¢éD‚ìIY|>´õ»ÆHÕààà¼yóΞM&°Ó4Ͳ¬Ëåòx<⑬¹T¡×=–tE )êÑO,7êˆùf¨Íy#LÀ ä)`ñSu|‹+6[4Rm8ðœ÷3°ð¸ žÿEüuàñ‚Á¬olîšÔ¹Ä‹@ ®8ü`*mV¾~0áxð`wjn7ϺT«Õf–ʀ߰Ќ°e —Ë…f„Y’è_ò/H°òH#̸í™A…Þáê,ƒÁ€¾ k*ï´iS‹Û»Ï¾— El°¡È¼Ãè2¥7ÓU-òã§SBx²0š¼=Y ö:ã¼ÁÁAŽãúúúÐ`qµLœ–ˆd­<;4‰œ7[«ÌD½šDÀ*=ðÂ`TÁFŸäÅãq¤+1”fKõËØëÛ,+Ym5sܳ[gL:a¡ƒ¡pÊßÏ´Âÿ"Hß,º-%`ñ];::dŠÁR‡D° È7ˆüh'Ú.LÀ:Ðõf4‘,0g Îzcþh^õƒ~ßo^23Â̇òª@Ä3°,ÅÔ‚pö\‰ ëñ*€ü༠ÎP––Ö­uÞŽèz“§SqW¶Á*HÀš=,WHËÄ2†ïO5ò£¥ fH,¼] Bò3éYv¥Ê•–ÕoèîêŸ o}¦Ò 7ÀZÔ0«{N"`•y•âs>\]¦(ªÊдÊq˦êûo©ÿ¢hßanò`ÿø‰„÷ðÄkèÄ\–䯃bƒB¦u5*Wáz;šëªåÇŠœ¦¦œî9„’€D° È7ˆüHJÀ¢jÚdFÚív¼3ŽÁ`«ùÞ¿ª\Y¿·o‡<Ü!]PÈ:ÅTºbæ×d±f`Íž+ÏÀRôq—|—T XÐ`œoÕ:Äí½à?„RÎÀJóqW+`Íž–+$‚e b©³gÏž\q½y´ ¿I%„¹Iox b‰ÈÑÞ÷Ðñùì5@–µ•Þ‚pq½Mf$AâûPz\BˆÏÕ4Ãá#c]X±þ¤÷]ñ¡×Nýæ¦Å÷¢¹wGºV9n¡™°(‹ƒ®nãG.pqóD'8käO!32½B%‰`oq‹–°X–µZ­È$¢ªªŠeÙ~Oç…‘¤‘*Ôšæm#—&ð³Tf`EâÜ£»:ÃáðØØ¡h:öÚÀq‰»¢ ápx||Ýæ(*ºkXîôƒÝ´m1QÖì¹q÷3JVaX@-d×Û)îtŒ½×\—ì3_Ö¤´ U.fOËÁ2€±Ô‘±áOËÀš³Dñ©ò°ŽyÞ:çÿðÅ_}¿ÂT‰'sÌæê9¶ù½Þ¾Ìñª,’5c«ô(¸„P"`-\¸Ðív‹9“KÙ-ç|Æ…(LF3þðs'³=Ò™í zÔžn3QÖìaA]X†¢(”—'/`‰Vžˆ%U»_çøŒ‡G"=5†P•E<°¡¸à± ,æ2X#á.ˆ&£S–`mëÍÑhö[F%„$kšÂÒÂõKÂmh³’KÀb†¢(§3™¯§M‹ÙMèÑ×N>€¨Â~÷Ëâ‘ÎÉ#@Q”Áê$ã¥æÝš²ûå»*Ž'ÂL!øG…HR5 Œ6¼Z*+øyFsøÒ;ý¢#7-º73ßJeÖŽãCªÞñeÏk&\1æÖ˜µLr:è ûÃrùPEåšÏd"™hxÃÒúuh÷œ¿¸q™<°p¹x~à4Ú›ñÂ0ðųüµ_Ûzs®[†+œÞ‚_¿!™´•f¬mA0V`–x¼ªªjxxX<²¸bãißÞ€`trï¥AÄK>Ú:ç#fƒ OãŸnæã<ùž\mBѳgÏ™t_BñC"XäDõX"i’#üæÃ ½Eõ«¯iÞ‰D$§¨ÌÀÚq|XͰˇÕPDs¡Ùs%jº­Ú,æ^ üóKgj+rNÂáðÐPe`éÎ÷:O„PJ¸QË|íæÔwØçóáçÆb±eU›õ¿/î^ vDù;ô´)¿.„ª=°fOËÁ2€±ÔéèèXº4‹8Åv Ѥ:euRÊþ3y X#‘n¤œ5¶9Möù{OïÍzŠbÓ8ƒµ tU™H ÂiRD“6‚JfÄÄ]T‹qÍXK–²[_ûÞîWLƒâ„Dw°c¥u+~•NÇ ×*`´ÀÅ@çnÊR©x¡8!…R‡D° È+ˆiXJõƒžÕòÖ¹gÇÉ´)†Ö|jÝ_C¶|+5XÇû|½î䲤QK´=©yéõz–eqçxy¢Ñ¨×ëE.]y¾a^ÝzfÕ•¸ ÎŠŠðÆÅ|N ¤©TË›*¶´çÌ"tÙ—ÔØGüýÀ ‰óþKÙ­ÊX•Ϊ–%$‚e b©“ˆŸïËÏÁò°†Ã]h{ýÜ,ª»vØß[ϺÜnw®çQ“…`-n õƒÓ…X¥GÁ%„xV”x\²J¹À¶þlàƒ`Ì‘DHòT]£×éoÉ%`I2öÕd`ÖÀ4-åº×yP³üVå³0m„ÑÔ,MÞÁ]ýÚŸŒO¼~út|ÛâûX0 Ã0 ~_P#`½r,U?xÂÊ»»QܶÛí,Ë*žŽãõz=OÁ§®< ë¬/ÍÐS=ºë¢Œ€Euý‚{kÛißÞÅì¦ü2°H !@ \)rÙðó})ÇL¦é2X‘ÔÔèºÖmËç$ šOžÌêÔ  NÀ:5òy\D °¦ ñÀ*= 6qW<®¥ušîÌõTÃáî0ïŸÁ , ±*B¾ó€šS0}x\ÀRÊÀâ8-Kñ¼ç’¿üY\=ä5 IDAT“ó®•ІI+5%„;Ž¥êïY=Ç5Eò˲Ó9på™A—õŒ'Þ$ò%˲v»}Kûm²ä0ÌMvNäÙ…Xp•áð„Êî€ႾØhòÉ)z~írqÛívçlD›1Àš.$«ô0ë°ÂXXjޝnÜv`ð5o(ëU*œ÷ºŽÞ„:ñ%„b®ŠÂÁ‰hz×RÙ¾¾-­îW¬(ŠÂM³²óø0²5]Ój—ñðž=̪+±µÊüȽª–Ð!G‰h{õó??,üù{=ßþèB±§$˲™³Žm‹ïëÌó¼À€;:0¼èv/©¬”s@£¬Na"ÙI]˜£ôÍŠïsVE°,!,HKìd"Æ_HnST_Â,twƒ’i€ú ¬‘hj^Ô`ž+nx<žP(å«Ãó¼Ñh ‡ÃèH(r82OŽqÝãIãyÒ‚pF VéQ°Væñ¬«”[­wí<ñäDpLíœû]è?x€Ñ`û\VKò×!www#iÌëõf­é Q‹ €à>ÿϔޤ½ñ+”){å3@ f€XXðN™O1º2»[*B°.NŽF.¡ƒ²öë•sáQ£Ñˆù¹2àýo_NÒ¯rdÕ¤XÛøðs'GýQð†â¿ÞÛûg7äL'¬¶5.©[wb0ÙIê”ïýy݈‘ùåCÙªR– œÊ@  öÚ£bÆ+¬ˆ½"íú'LºÅÞ_°ÕuŒC"ê¬áp7Ú®7ÍÍ5L«ÕâÖÐÐÅbA¯~vhòG‡ðñc“QŽOµ 4‘„Ó†X¥GÁ]q°•9#Ô0º»V|þ÷þM1k·Kƒq~_(™„õäÿµÐ´±’n K¡”üuˆF£Á`íŠ §Yþ²Ð íº†;ó®¸{á»@×/Ô\“ÓŠ‹@ Ó„í”ïlFa2Çyà{^CGV6mZX—Våõz€¸Ýïç÷ôÞ9n4ežvשQ´}ÇŠº¼>-óå­®yù¬¸ûÃ]]ß*#œ^[· X}¡³}îÎÊÊJ‹¶U¡BâãN — îôÛÑ_ÿ¥úñŠÔrBΟ™â3«°"\À·) ªtÉ…=T<ˆ ø«¿svüáçr:¾“„3°JKš€¥pMREÓt¦#U®Ì,‘Mó·ï8ñë:í¼ ]5´YW"ëâhÇEè°i+ì7¹,ËÅ? ‚ H^"ós¹b1mk€%Â~›X%‡ÏçËÕ1„P–ꃘ—ƒ;Äãñž@ÇdÜ-î24sÿê¯JÆx<dQtl8þÓÃ!€NPGS¥iùòõ Wbþ–ààÜðäÞ‹îórV6U´WêÝQ1©J8âym¬É5(+æãî’‰ ,uHËÄ’#öúcy;\j†‰~ÍjFŽDzCB¥¾¸ä/e«5­âeYƒÁ099)=ŠAo8×C@ °fÒ…°ôÀ=°JXC«’°ZóÉëþjMÍGÄÝFÓB-fMâ¿7úÛ: Ùìñ2ÿXäêWÛ`‰$N¿-óÞÅIooïÕ~ „iA"X¨".`):¸@"‘è žB»[æßUǶȌ ©êãØNê§ Wb¾Ô±†;±ô½Ã=ùñËØ­h»7xú’÷¬Ì`ª:õ‰;µ[Íû!,uHËÄÒ‚¿”8ü‡¼N ÛU XòéW¸ÑÁP8µäVklEÍ—õz=:®Óé\.—Á ç×9à‰È¤˜!œ=>6=XjKrc-à·‹o)›‘ã/éozx¡/Aä BžOÜ©Ûü^¶¨VikØðƒAU±ûÄWNB*ë‰ç/¸‘M‹Ž¿­ü¡|}¡Édòx¢1¼‰XtE¤Ðî•8ÿÉ(`å$–<*…0˜&…p=°TÇ6åo%ÖE÷±« nc™™UÊ–ö7r-×G,€ X‚ sEì:xòÓi»±¥ ‰Ë›N§3NÀê{“´kÌ-IÿM¡¤L1¹<¬¯ŠE`Je±XÀ®/.1ÖŽz@ù­®>pUtñ_e¹bÞx X‚ EÒ<ÃmŸÏäØÄ×ÉÙF`9C£ç܇ɦU縵ü¡|}ÐÖ"°†…XhXoÔîŒÌ°rkÞ|SDÀªµ¬5é¬þˆ‚’¯Ï{ºÞÚJú'–t»Ý²,3ÉÂ)ÛÛÛ×­[Ç­Ù /ü‹²GD¬œBÁž dîà.èA þî29„)®×î0$ô ½J›®ÖÖ’6#°æÞ‰s#¾aúB¥Ñ˜¿E° íüKwoþ4˰‰1‰+®%éÅ3o„^øvª3nûB{çyÁœïÁe⇎ÀÒmy?[ÖÄ-Üêë{:ŽÉÉIÚ…Æï÷«úhXãî¡aÿoDðF„€èÝà¸ÑÈYNþfjZuŽÛ*>mÕEíh?ø9¥Æ®­‚ÇùO¶@+'‰K!\$,àÝÚâkŽŒüYÙìrÖ°DQôz½dâHSSS\Óàô †@î”…†/O{ÈR@A$wÁ\A;^ÏìËä¶´Áçó¥úTùéw¾O6ËLõfC~ÚsÆE`¡€5KðNœÍåùy:6‘`ÈéŸð„Ь)ß4L&˲’$ÕZÖ½3ù?a)NßxûàÛ­Õ;’X®ÔÕ•ÕJ} }Á§Muf¶z}Mý5 ùÃËÞƒËÄ%-`ný]ÈK¡­­M12ãy¾¢¢âܹs±cãó!E ¡ òŽ=ñüñŸËë?ìïZË_7äm[Ñûˆzf³™´C¡P8–$IÙä8.müG\–#°² X9ɬRo6–e“†A©P9ä% X°¦h'°FüÝ~Ñcâ¢úT¢€cccI,»ÝŒÑÊ5l»*;#§÷êw|8íu"Ke‘ÜGp@1øû$;Ùººu·¤:„kÚáˆsm×ëõ‡Ci·u½Ô>xˆ|Ô¿I¯×§½ z= f Þ‰sCÇ2«+òOôGc¯N ¸v¯Ní¹É0‹ÅívëYC½e}—ûˆ²× ­ÕÉ‹lrï^ýqÚˈѾá=³¿|d ÷à2q‰#»c“ŸäYMÛðÓ¢RR#°"Røço}ãÀ…?ªöO‡'Ž?K6ëø–*ó*ºåóù&''ÉfÚð+vÆÞ+1+k €•“Xç•Iþ  £££ô¿ß¯ØFЇ; ¥uEͽ øÎ²>I¬ÑÑÑÂÂBÚ]E}m-7K<»,AY9ñGòã_>Î5lMÚS„‹ÃêrÔF£QyD ¾‰_ÓáWÆ+¬3°b8ôÀB.­Õ|†(¬Ì¿ŠX'úÛÜ$u@·ñŽp–xüEøÄ¿ÏîºA®0è,Ʀõ¬Í Á¤|!÷_{äìÈ»ÚG1ÀÜÔðáHü#ŸæŠD"±¢7iÜ`ˆ2qǬì‘>lþô÷÷ßsÏ=6›Íf³ÝsÏ=ô_…D˜.Ãæ–ùy`e"`9Nbb§@<óèÃEQÜ\{=Ùìóœ&í¤V("ƨIѵÄÎ&žF,AÙ Ë!*üJ·éN õª§§gll,Õ™~qà1_(ê:¡c ;K>À“‰€5…8ä217¬cm‘¹BiG¤pÛù—m³——çp8t-7î|$Õ&/ZšSšè—úN.ä¯BYfˆÙ3m3,c-ÔîN’øRA«N’,ýß?‰V¯òXó ëFU¤¬.ÚZe_IïaY–6Ûú]#°–Y°<ÏîÝ»7mÚÔ×××××·iÓ¦o¼QÃqäx²}…¹È<«fb€•ÕVÝõdsÄ!,ÈG™Ÿ¼­­-zm×}A’.]”ƒZU¥A$GÁ\´µµEŽ¿(vn3Œáÿ'Ug•ÑA™ž8x¼ÿ-²sSÁ­V]¤(k«MÜçÞ‰sf}•´3,D¨°Ê~5iï=ûÏóôê©Ùlæy ¦¼ûKõ‡[w3éñ¹[€ƒ,x.p—2²gä¨&ÅX €K2¯hoo'íYE`½xò?»Æb«c镟½¶ä¾Ë>ÞêØMö³ÀÝPÿAUH‡ö 'kÄ…X—ƒ¬ XO<ñĶmÛ¾üå/;‡Ãñå/yëÖ­O>ùd¶¿wys"°2<¡(Š•|½#¯TÙ”@ôKq\”¤¢$IufòÌlau¬ëDß|.¹lÐÉêH.‚#¸ عs§x>fY¥Ûr7W·q¶'Q¬}çž#{ªí«ZìQ_ê´X¾8å†ßê9¶Ä–>ä¡Á;qÎl¨‰¹œš‹Z‹ö´gµa- щ͘{àèù·fµºMw’våT»FOdéƒ÷à2q)“Iþ mß¹€Õ3~æÇc"ÃÊ’uj~Ħ/˜Ž[¶½ŸšíÛ Ìeªíä´–Ó&oå–<Ý”>b™Y°^xá…|Þóàƒ>ÿüóÙþÞåÍeðÀr8´SÏóÄÖW%`À {¬ø`Ÿ·CûÌ6›M»S\GÚÒxoÚKEAdç0iëZo›ÃDQtù'O {n¬¿ ’VÀН!mdѹ\Z |tÅ;‘¾òì™o¿Üõí—»ºÇ½‰}> ³2r–jËjòÑ›çâæ¨IýTè6ÜLtF-^<" £ÚýA®XÒ:¸C¼ ZKYx Fü¿ùO¢}/¶› ¾pÓw L, \¯×¯²]½»ìA—¿žßͲ¬êX)b“Êë*­Öˆ+nþ£Ý™Y°NŸ>ÝÚÚJïY¿~ý™3g4)++Óëõååå<ð@ggg–/0'™gÂL,žçëëëëf¨¯¯'zV¢€UcYCö ùω²ZS£I[K‚-ª%mŒÀBÉYˆ XŒ£B£gªYš$Iou½$JÑYª %ÆØBhZk€Ê¬FwäòBÛ`}ûå®GŸéxô™Ž7ÏM$öt:t3þ1C€p8œö{¾Œk˜9ƒ,EN¼<ûkG¹"]1óMÆ^’¶†X¿y燣®þèiùË]ÿ`39h{,%„ªÚ¼úîê/9 Çq‰X<ÏWT$Ÿ;¥À¢ý°sVɺ€åt: è=………SSS©úßu×]Ï<óŒÛí>räÈ–-[®»îº'N¤ý–Dëw†a¾úÕ¯Ò)Ðííí.WÌþˆn»\.:ívižÁj¤"°í3$ÊUôƒ@ãêgèèˆÅU>}š¬[J’ÔÖÖVh¨´è¢³Æ°öŸW}#-Z…ÃáÄÿä«ÛÚÚhkììQº›êÿC&¿béæò8=‚¹û+®ä3(ÿÍõ_q…Ÿ¡­­Í=x|tq«qžçé,*‚ ò[]/Í«ko¥çÄ!"Õ5 Ç•à1åèÿÉE<ÃoûÛE¿†Ü=Ãúª˜€E¸xÉ«q…Js“U]¥‹H¡nOlæ‡eY~ë­·zf8vìXâ5è6î!{"Ç^XÜÿx†ùœ!é|&ç~Å~zb“»¿b¹žá‰wH;läÓž!­€ …¼A÷~jêrÍŠ;Z«w´··Ó+ă[Ï€eY•€¥ÌpR•›3 Úÿâ °f"°–øX,ȾúÕ¯&•b k0ÙvI7 ^¯—^³ ‡ÃV«5 frøO~ò“çŸþ•W^ÑèÃ0YÿKOŽÞùýh•ô=­e/üÍ5EQÜ¿?½§¬¬lõêÕ©úgÂ[o½E^ivíÚuàÀ·ÇŸ;ëz[ÙSi^u}ɇõltmŸã8»ÝNTËõë×jÕ›ïÿÏÀãWÚºí÷™>÷›ù\*‚ È•ƒçÓŲ;obýñ×itîèèWí ôþqøq¥­ã ?¸ÿÅÎöó¤.ÏæÍ›µÓÀ¿õÒ¹¿ÿ}´í—nküî}ëæð+dn<ýÎÀ‡?¢Úù¡««ž~X]‹³§§§··—ÞsÂùÚ çkJ»0¯òÎÊϑ֭[700@Š(!ê´ÍH}'½·Ai3yÃÝ_QÚºÍïe+šçó£A–ÁßÿSèÙ¯)mÃÝÿ˜—¬ÚL[[12ëêêÒ8!Ã0AþÒ¯ßýž²™¯/øØš¯66¬âyþÀ$ ¼¼¼|dd„ÕÔÔd4O:Eö”——777Cü{.aÇŽÚAXßx¡óž&™ýïiú—®Õè|%=‰&ëX‡Co599©ŠÉÒàî»ï¦E>DÁJ§†Ò§ªDÐyš¸«Î‡%Iª1SY„¾sÏ|·ÛsBYéL—uH|"¨`),ySA2#’=“Ñ6§KåJHºªyÁ‹{ÝTs­5ÏN/`ÎÊ Cè‘ËÌÎÆ¢Gnozäö¦wÄò^/^Jâåp8hhÌ¿Š™ñz› McïKSSStÉNAœN§ê„lm+[ýR9è >ý¨òG<³o^? Ady‘‰‰;mßt®Âó<‰Ÿ’eùž×ÈG ÖMžiŸò”¦UÙ&p—ª a~~¾êë†I;ÿ¡#°ÊÑ+›d]ÀZ³fÍÉ“'é=§NjiiÉðð+-´*CfU…«…°a»Ô¸ÂÀÆÞUü¢{ÿ¥ß¼=þètºY Xq&î½ó¼TA+I…™4[ °iõôÄN™†å`'¶yݪ» Þ(íŽö€¨B ¹¼T˜»wíc÷®ýÆ=±Eµ¤&î<ϯX±Bqù¬ªª‹Ž¯47‘}ÞÓ¤aQBŽÊ"$HT]ADž¾DÚl wú \RRBÜ™ÉÛhPòõ8c^7uÖõÑ/’er,Ã0ªø©T)„_¦VÁ`0¤Í‰rÆ,œÿd•¬ X{öìyê©§è=O=õÔ]wÝ•áá¿ûÝïvìØ‘…ëÊmhwO ý¼ê2X,Ã^[rŸUç »u{އ¥`&Xtb-ë¨.Ú_vAÈŸØYj$ZŠ ¹Žà2À=pŽ´YGeÚþôÓXY™¼è>‘£ÁöEÖ²5[$I¢çôÃ<)ƒN°æÞ‰ B%o2¢•IOHð%1bW2ëëë”7“Ö äÓAßYÒ–$)“/Õmº3q§ìÔÊ|A– x.p—2´€ÅØKÓö§¬òòrå¹Íó<™ôy:$9Ú‡7”òú’ÄUo£X…P#+­ƒ;¨<@1+›d]Àz衇<øÍo~Óét:Îo|ã‡úä'?I:Ðræ7Þøûßÿ~tt4÷ôô|ó›ßüú׿þ­o}+Û™sÌ3K¥7ÏD ªÌÍï«þb«ãFމ^^D÷{Oët:zÑ>©€ÕßßO]ÇTEÛ²,Mö'öG–q#ˆä 8‚Ë€‰‹±˜m÷+zng4ä³®ƒdÏ®¦;†Mêà®A\V!œ=x'. uE±ê1Iƒ°,Ë*n•¹™e¢¤©Ðˆ'MÌËË£§=ƒÁáp$žG×r½áÎG\ÛþB·íƒd§ŒX¹ÞƒËÄ¥ qê&¿(iÚA(1Z\<–{½±Èñ:Ëz¥›Ãáа«ÎSÀ¢#°PÀÊ*Y°òóóßxã#GŽÔÖÖÖÖÖ=zôõ×_·X,I;ùË_þõ¯½víZ³Ù¼k×®ÎÎζ¶¶M›6eû"sëRJ!¤ýøuŒ~£ãæ{,o¹Ç{2“¬uëâŒ~ª¡„6X¹€j‘œGpPm‹=i™‚YG` úιÂQg «¿~Õû€v±LûoG("»£KË ÄÀ;q¡h(ŽM5“Ú`јL&0°¦â¼ØôcÀ ÂÒétôj«ÙlV9¸GÑóî¬êó?3Üù¿É>i #°r ¼—8ˆKÙ5FÚŒ½$iŸTXô¥2' ˆžÑ@7ÙYoY3a³*+1ž#•€e2™TUþY‰H²<6çÑJ IDATãÅ0è•]Ò¯¦ÎŸºººçž{.Õ§´ËÕîÝ»wïÞ}.)׉K! ¦O!L”œçyô O"°+¬Ú…}J{Ø!(ùtºX€hZ,`‹ëijo*mm°A2@vÆÊë°|yÚþ*sÓÓ®·È涆[xs‘ t=ép8,BòWwrú¥™ÓËìF›Å"Ê¢MCIÌÄäâ%vg“ɤ8þÖXZÆ=ÊÎAÿÙÕöí2™ºè^ŒÀB‰!‰²w¦&Ã2V­Âô ÚX}¾Ó’Íò.0”Û QElpp°¶¶–îœ6+ “ŸŸO×îH5æ F¤èü§Ðb0êçû®hõ,$õy1„EQJcu<°èýCI?–dñ‚pœ~dÐ~À©À,AÙ" 1‹I'`‰¢H8Ž› ø/’OoYs8NÇC’X|fXÀøyd©ÐP2ë,¨27“#þî°·ÛMwN;aì%1+Oï„ÚýA®äéq˜Ñ›kAÚj3HEÚ:N’Å Ó±Òɵ–XäÝøøøÄÄ} JÀòz½ªgûèè(­T>îiKyÐó ¿Ê6—# É–<ËBy‚»I«2Ô‚{`ÑZÀÒëõʾ"ñ©?+;ÏLº]÷aÒ'é2f[[,ÊRF`åªDrÁeÀT÷ibÛÀ8*´;«f„o¼H6kì͵…«æp?Ù ãG¬¹wâB'`iz`AÔÀ®/¶é‹¦Ã É‘aÿùZËZ¯7îpíh,e{™<5 Ë’s˜-Y1§,x.p—,²{œ´[òüAp¹\v»]iÓe4èWZ†eÚÆ7ŒÅ‰×ÏÔT CÈ9ŽS=ÉÍf3½Çív;N&ÏòøÞž©©)'åieèê+:é%K‰tÆVû*±‚M–A+W±äqDÀòÅY XÙóÀ2 Jøe¥•Xý®sžp,3éÌOõÏ [\GÚ•àD!×Á\Ø™™å¥À¢ÅAÙwb8–?¸¹ôf¥A‡_¥åw‡õvl²¸¥>‰Ë5’¼йE`@¥¥Cد´|gk-ki³ H¥Œ [P)*–’EˆVî€÷à2qÉ"OÓVqªnýýýÄÈ,i– òŸºÑí9I>*1ÖÚôq–ðªUµ)§§§“†tì=;þè3 »ý™–¶¬àQÀÊ.˜B˜«Ìªá‚ Xô OÏäH†°M_X˜­$(ËÒ‰Áý¤O&F -`a‚ HÐn;ìl"°:]o‹RôInÓÖå¯áüùó“““ô!v»=iñ5ŸyêÙÜPcÿÒ­³½~Y@êŠ,ìŒóúà”?‘4:ÓE8è;'ƒÚ¥A’¤´é$t$Ú`!‚(ÈÓ—H[CÀ"ê•$Id eYROã·‡tbôMÒߦ/º¾äïå8ޮšÁ›ç&ÒwÒ¤Ò)„Ù¬\…öq÷¦óq_pwú ôÊ$mq·ÂÚJÚGúÞ íŒLÜ «IR´ìpP»?‚ È•N$${fô&–Ó˜F»Ï<Š%;&cõªWÛ® …ÂÝÝ݃ƒƒäñÎ0LUUÕŠ+’:¸Ë2<ôǦ¼Ñtò<ûÔC[ :œ` ‹IžŽ%o’,÷Nhaét:½>É^’W—ÇEõ¬€è$ O;“¡,,Dˆ ¢ Mg”BHH~Œø_;ó ÙoÑñ·–Ò¬³iœ'é˯Ñh¤g5<Ï;Ž}ã‰=g¦fL!ÌU¬T–ç²G`©1-`Õ[[L¾ @Ïø™­V‘±€,Ë¢(’kÁét^ºt©¤¤ÄápDŸ#œžqTÈ“²$M °¥+çyÍHViooÇ¢Å9 Ž`®# £@ô&{iZcT2)ìõœò†£ñz6o¥íªP(¤²Š(((hlLQõâÉ‘—O’Íoܳf]•Ö<ÑïÄde©u`ʯ´/^ò®*Ë×èl2™”ˆr–a+M«º=шÂ^O{‰±NÕ9§ªª®Œ ) •Kà=¸ ÀA\²d˜BHHZ‚ðÌðѰ]33r–[Ë?iÑ¥¬¬ÀqœÃáØ´ó<_^^¤:ÃáôæSÓѯc˜®ÉS¢¶òòòxžOõØWqÍÊô¥‘ù€V®2ŸÂù›¸§:YÀ3g+1Ö^ ô€ ò€ïl£e‹òQ$Q.I„žžåQÒÛÛ+B}}½¢a±ÅuâdÔN%ôÒ÷hW,ÝUïcËçb3ŒdƒšššÅ¾d^àæ:t B6P“³®ƒdçJëf=“G¦*äçk½ùÓÞ¥»šŠþ×­¸Þ0wðN\@Š-{ÏF_–ÒÚ`Æééè{K­e-°ú|[a@\ –2‚Œ£’ìÁÂÜïÁeâ’EvÇô˜ü¢T݈ Ò¬“ÈÎzë•õUQQ]Ëó|}}=-W)¯œtÖŽ K3kk*,ß¼»QÕY  €•«X´€•&…0«&î4tÔZÖ(ô{O‹,]:N"„ÃL4VTÀ*ª!j*~íñÄïbÌ< XKR+ÉQpsú%9m B˜É > 0Íöí_ñ'†œ~Ò¾£µŒÍÌfI Þ‰ ÈŠ¹ú¸W™›õL^X€7â ô•ÆaiXÊb aî‚÷à2qÉ"»ÆH›MBHlø,dZÀª6¯V»jÕ*§Ó©r*TŽåy^[‡¢ °n\SV__¯ÑY,Т"W1h¬4XJe@†aæå÷û“î×ëõôÉkÌ-¤=ä=’¢GóUe&!äJÎA²+–ÄÇðeiû+s;:üªÒÜd×€,Ëtž¸ÅbIåÝ®0H XÕhý€,ŠcV÷ø,,ŽÑU[c/E½ÞvUç´XlF`!‚¨‰‹Àše ¡"BõOvMy£NðzÖP¿ºÀ0ŒÁ`°ÙÔ>FoÐX×­J †,.•«ÐXÏ©zúýþÉÉÉ`0êƒÎ0̾ɓôDM¡8ßÐPb]Ql©tµ×ÏAMúÇq,Ë’Õû|}¡ÃPæ €$‹¾ÎëF f~u|Ø¢Zky¦@5‚ Bkú,•¾”ŠH$â‹L÷zN‘=k»bg –"ªªª´W,G¨€ÊíX|Y*4”XI{VX°Ò¾©ÛMl°Nm-ÜÃPY„X ñUq½ A@]…0½‰;®ˆPtøU¹±‘eâÔ Å͆çy’*H«Í”7D`]‹ÖR¬\…®BøÜ»ÃϽ;«õ½‹ŸYótÏ~nÛÍkR>SœN§ÇãIúÇqÇÑ+“ÕæEÀ€~ïi•€e±XèÃóóóÉ:?·j§áÎGTç—&z#oÿViãŒpIA’Õ‘G0ב…YG`u¹K]E(³×ÔÚ×Ñ¥ŽP(Dz¦±#¢,,¾3OðN\@¨ž ¯,ƒÆòœJÀj,Üðæˆ)(úÀ/º/zK±\ KAÆÌ3y9è9è“}cFÿ”ÜïÁeâ’%C,bßujðm²§Ê¬6“!–j&ÖþsÄk}µ­ÀbÐî,(`å*´ÖÂâ FîúÁÛÏ|öê=­é_Tèt:U~b­eÍ)á ¥=äëŠÈa£'–Ê3«¼¼œá #Ñ9"oÖgõß&™-+(¬Ç^:÷í—»~ðê…¤=].½é÷ûWm%›½žvb®i=°}ÜAâ‘§ÇAŽNk°)E%bïŠÀ:5xPš9CMa“‰S—HV"°X–UUOöù|i/ °rœhæ*;V>r{S&=ƒÁ  Ä+//çy¥ A’apÊß=î=Ü3¥ÄN†"Ò7_OGuòiÚé °•äÅ }ÜAdwL!ÊÄ ¬þXå™ 5;™iFUL°Àd2ÑËÃÃÃf³™$ú _ìû"IF¬\¬\eûÊ‚í+ 2ì,±²s8v¼Oîïýô/ŽK ÅO¹I›çùúúz§Ó9>>îõƹ¢2 £ŠÀÒét›k¯#V¿ïôŸGž¼§às+!AÀJ¿¤É0,_.÷([²s˜)W'?#‹Ú ä:8‚¹ŽùJ°\Ä\ ×ì~nôĘ/:uc€¹aÕÝ"À^;†âòQÀš/x'.,´;ᇯ^ÈduÝ 7ÖXZ.¸ßU6Mþ¡ÌTo䬠{΂÷à2qi"OÓVò=ÕK+-`¹ÃÎãýmd³µzÇpç”êå‘LZT–Ûív:äx_çø£Ït¤ºN4ÀZâ €uEÀó¼v )Â'¯­3êÙO<ùnDŠ»íÏ O'=¡JÀ‚øÚUÀq\SékžÝŒªà#þ‹??ù•ü’i.ß4Û,` «€X“ƒ€ÖÒ' ¹Ž`N#»ÆHX~ÄÄ÷ ®\¹R£ÿŸOÿ†´«-«KíÕ0×,JÀâÑk¾à¸°¬(6'î|þøHߤ¯¶0ÉG4ǵØwv»O(µ¢÷àøs»Ë> šëm1,žJ!ĬÜïÁeâ’B»9üß ž&;“` ‚ÐÓÓC²|A WÑ^îúY0rØM…+ŠVq‡TOc¥íKÓ18­ñ)`-qÐ Qó‘í5øüöGnozèº:²óôP’û\ÌŲ¬ÃáHŒÀâXî37üs~^¬§/ìþÞŸÿ×¹Ñãs°(, —4Aâ_C¦‚ÁÁÁóçÏ'Mô€q÷ð±¾7Éf‹}§òÜž£€…%‘%ÌÎÆ¢GnoRþ¢„¢$ÿänUOÕ”†çù‚‚‚Cy«ãF²³ßwú¢ç8dœBHÚ˜Bˆ È‹xzoðéGƒO?~ë—d'c/Mìét:é©‹ ~T±êõž:7~Œ|tÏU3 ›9N,mûÎSƒ.OÑk‰ƒXHîh-»£µÌ¶¿OI'ì÷ùC¢É÷˜ ¹„¡PhllÌ`0ðôÑ÷Ÿ'÷÷þÓ{WÓ³2¥Q6=‹ã¸uüõƒ¾³ãÁeÿ;ÿSnj0s¶H$’Tó%ħ¢€… ÈŠ4ÙŸ¸S£aܱ’!ÉxòE²³¹lÓµMwB²…7"`©,›yžw8¤[;õð õvSœïF`-qPÀBRb2põÅæ‹—¼ Érçˆ{c­úEˆäÖÖÖöôô@Â+Ù,°–ÜRþ'œoœp¾ªì „}/ö=~kù' ó¢šTFXU¤XK—ËE*† ¹Žà’Eì:xüã`M˜Š¹Pi(F*ëÀ…?žˆy ®áwÁ̃znXƒTÚê‚49YHZðNÌl«~ô™ŽIO&=¡_øäµut‡D¿N'Šâ®’ûžü(‡ $ùOL½zMñ=áp8é-CF«æ(x.p—ò¥žÄìlLÜßzʼnJN:Îðñ0À@²…7²ê–tMBi ¾ðÀT´(¡žcðáVƒ“Òr -D‹5•6Ò>=¬•-l4W­ZÉ<°”†N§`68nÜ\ðòiHòï»ô+²9ë¬ÉÁ´ý‘ËC’Õ$‡À\¢ˆ‘ÀÏÿ*sõ Â3V".ÿä¯ý+Ù,3®h°nä8N‰´Ÿ›€5,Ĭr;F`ͼ³‡ÉÀÑŠÕwþØõí—£F¨LX‚ ʴĦ/ºªà6²ÿ¼û¨º”jÆBFuTÀL‹ì%.uÈïÁeâ’Bšè#mýŽ w>b¸ó¶éšÄž‡ÃlŽ[ “$)(ùλ={Ö?XÎ×)mB˜Ñ°èʼnޡi2«j.·¢z•s`¢EK…íŽGóVèB„IQ¤«D,¥¡¼#ɲ¼Ž¿N”#$Ëžr†F†2˜½–õY:¬[·n±/™8‚K“Ы?–úOÍê%`ƒAú£§~ÇŒ.EpŒþšâ{ò”ž«€E{`¡€5_ðNÌ*ŸÙ½â»¯œ%ºF=¤ UM¡éþ««UN')€µÊ¶ýœû!t dMýéºðÍI¿"6‚z#c)=“bDv1|ù‚ÿ"dÁÁ{p€ƒ¸¤Æ{IÛ𯲥)‹ÌðÙ …ú½gˆïA‰­êÎÖ‘O5R5h§ °ÖUa¤^î¢ÅšÊ|Ò>£EHÅ0 ÇqÊŠådz»cèòÑ ¯sBˆ1ù‚,/â HsaÝïÿ‘|Ä­¾Ž[¹MãØ`0xéÒ%wé²ÇãñvŒ<Ú»—|´Ñq³M_ê8Ù8X–Õvùñ‡D%! ô[bK£v!ÈâR[h~ïÆògßU;Rèw% X4,Ãn*¸õѨñ€ïÌÅK×&íLn:ÞR¤S,É9Ì¡€… È•F$3dX¶°F»»bzEÓïÕ.¼¦áV³æT…Mèõzmïv…öØ+íº*›FOdi‚¢EKEì®>“.K!U–Ò&!÷*w«ß{f=ˆ¢(˲ö£‡u”Ã*¡ø²k Ä0péµvAÅBhœx9“ž~¿_p:35wB—Ú9_t1ÛMŸÿmÒª=½$Û¿_¦ò ÝnwGGG8öE¦_|’ì¯+hVܯ >NVu JRÍ`∠‹ËçnjH°Ž÷%/ÙISmn)³Ôz{@ù¥3¿ØÒœDÀ¢ËÀ7ìd~õÇby“öWè¶ÝÇ×¥½A\Ašì' ÔŒ£ti*ÃÐáW–‚¤l®»þ4QÀÊä’è„ë«1+÷@ Ñbuy>Ë0J!Âîqob!ÂDR™¸C¼˜Õ\zŒ 2L¢ÇÈYeYŽD"iž>œž±—F rÉ’äa‹ÒhùÈe ­­mç΋}ÈÜÁÌ‘Ó{ƒO?šIO ••á_ÓV¯àÀr‚[–ÙúöäsA):)Ô±ú»V?<=MýÓˆÀJŸ?èŒåb ÂïÄls}sñ×Þßâ F<ÁÈ¿¿Þ­ì<ÑŸ¤¤ºªˆ•ƒwì6ß÷ëŽÇ”Íçé3ÃGZ*¶¨Ž:yò$‰ Qù¼á}?O{mŒ½”-þøì~²Ðà=¸ ÀA\:ÈTþ`&½ßï§7}¢~(ί¬)h¤?UÍ[2°dNÅ"°ÖVbVî¦eˆJ!B¥­"L{ˆ*…~²Ð«ž/³Ö*mäA_´ü¬}ܧÐÇ}I€…\G0{È39Ds†­Yo¸ù¯ÒvkllLºÿ¼ûè€÷,ÙÜè¸EœŽ--hX¤šO*±‰f•Ôö ‘´àxøÊ]ÍÝ»ö‡´Zó¢çÇÝAú/³‚b\7C}}}KÅU•¦U¤ÃÁ‹¯$ž¼¦&¶¨2gT'ž œOß É2x.p—Òl¬P(Dœú¨üÁ͵שúÏ!«Ê'ø¢–5¼YÕ“s°4ÐY„Ú…2ŒÀŠD" ŽV²9èïTè㎠È2CvOÌëx†1~ì‡À¥˜öz½ª=ÁÁƒãϾ3ñ<ÙSj¬[cßI÷œW !õÎ_‰’S° C'$ ÂR±ÒëõkùXÚà±¾ý¢¤µê±ÌRÀ»0«þ‚ KZÀbŠëµ;«òE92ä?G6¯ŠÏ„„yKÚU7h¤ °ìè|‹` !’†5•¶ND fbƒ•ÊĬZëš6ˆ¾V y»$Yà2° ÑÇAœAöL‘¶nó{ÙŠæT=ƒÁàøø8É?bY¶¸¸ØTÕÄ­V¯:&Åãñ¶/2ýúè/&Cq^?zÖ°³ø^€¸ùy23 C;BF]‚,$ÇØPc?x! y¼OØÓZ¦Ý_¯×—™V9k@ô€78}føèºª¸Ò ùù±ê7îÒ5—6>P\\¬q+É®±ðþ_(mi#°YVħÖjwVåûχ¥h1e³Î¶²d­ªÿRãKbþ`N‚’†–ŠØTlX*w҇ü¾Ü¬³ù"Ó–ƒ£þî ScF)„µôhooÇ¢Å9 Ž`ö #°ô7=¬k½-UÏ<€3‡‘ œÑhlؾ=ó/"f=0êP©WpUáùzµËýÐ&µb£×3»,ôÀZðN¼œl¬åIûxzwNÇSciéš>¬ì9Òû†JÀêëë#mÁŠK-Úw±,ŒKŬÅïÁeâÒ!.…°¨N»³JÀ¢ëÖç¯cuêØRãK¢ƒ{N‚)„HÖTήaæXáP¸Šò’ètr…Ç3ŠÀ¢<°¤IôÀZЮH.‚#˜=h,ƚʥ= ]@: %š²§"‰c–¹ày—þ”7m+»³)k⩞ÒA4>]…°’ǬïÄËÉÆJÀÊ ¡òvTgYOöë{S”â[ŒÆ8%7í¬†áËct¥P¸e×XÚË@² ÞƒËÄ¥ƒ4ÑKÚL:,ZÀòF\½Þ²¹Â¶!±ÿœR1+çA ICsy>©Œ®"Ôî¯Ê^Nõj‡Ãáp¥9–JÓï;ýÜÀ÷¾½ïS¯tüZû+0k b·ã"Fnƒ#˜Eh+?€E¿îJ’ 3ý*Ð%Ž{¢ÏFgø››¿ûïáÞ«f ‰ÙCª8YHxOS¼/'k«lz.:î›ô9½iÄ&EÀ*3®0re; tŽÆ‰Å@€ÞE1mh9S¶’´ÑkÑÁ{p€ƒ¸Tˆ„dgÔˆ–-¬ÖîN½EÊmãÏ„¥èã45Wå7%öWEl¥À E¤®±èd‰aâ¢4S‘4˜ \}±ùâ%/H²ü•çÎçÇ’JÖWÙß³>VÙ]„ÁÁ¸(ÇSPP ´éW#ŸÏ'Ër¥¹‘ct¤<*L'_>õË[×|(1L”@{`É… ÈÒFvg%Š"~¿?­Š¤@û²ŸŸ>BÚ›j®ÝX³ ŠŠŠTW ªBú#íÅLI–G]±wõrS‘#OÇ®®È?5àY†ý «‹5úët:†aX`kÌ-]îè]v¸çõ5ÑØFQÝnu¬z(J,ñIÖ®”z+miô<×´cn?AdI!Mô<^P º4RDêÞñÇÔüVÇn½N-N ‚04ÇÎyž}WíŸ@˜ò†B‘èõT˜ysú”Cd ‚’ž– ›"`À÷^‰såXæ×ŸÞòÁ­QEÉétNOÇùd¹\®TèC…©qÀw6îÿÔùKíM¥­¦€2q†A–kH ²4 åàŒ´Äé“Ör_¢ºä÷ûG&ßC¬°<7u”ì¿¶éNÒ¶X,.—ºÔZª,½^¯J W1îŽM ,³A]ÄA–>j슀'\ÚÃ0ŠO\­e°Žõ½ù±ka¦§§Ó~ƒÁ Ù¬U©-k$m m°Y.Ä`¥Ë …B¢(ÀThä˜óÏd…©qµ}Gb¡äÄ·NŸÏ·w0øè3ë10gÁB$=–¢$ô‰£êÈȲì …BJcwÙƒï­ú–Â;x} ùôXß›çaò,Œy&68œo‰zd!hkk[ìK@æŽ`–ˆ3À²h«í‰v9ªðx H açdHŒFZËÖVÆ|¯’¾EÓ“B:þK;f†)÷ ¿Z ðN¼ÌÌÍ«ÜÔ``£9³Ó~ç«g~§´bH›ÌÒ)„Xˆp±Á{p€ƒ¸Dg#`ù|>¹súí?=.Ídç䱿%÷2À$ X‰°,;èÌtÖ„î¹ F`!éYS™¯ñi("Ýý£C¯|iÇ®¦"íó$}b€Þ o^ IDAT©°¯pÊ­:ÇÞ±ÿRv¾Û÷æmM:NeÓápð<wTA•ì‹NeçcÓZ2E.;wî\ìK@æŽ`–gc€•4+“o$.wǯv6ÞA§c[,–Äcɤ> „ÃaAȳ7ðêEúÀóc1×-4ÀZ(ðN¼ÌÐ…OdPˆP Kd®ÆÒrÁu¿zúÐ÷#bøŽõ«€‹À’Ñk±Á{p€ƒ¸D&bUY™t%{/{yøñK>zç5Åw›9$T K Ã0ý“™ Xk1+gA IÏÎÆ¢GnW;ç¹üáŸîë•d|!qÏ÷¾ñ¿¯mp8A ¥Üyž§“_Tþî³Ùì÷û+ÍM:F‘ÃpizðèÙ\ , B}}=­a±•Ò`´´jèOÿÆ–Ç& _®ßõà<2‚ È‚ {¦H›±hwž[– /^T‚§„ð¥ñ`ôë€ÙÕ¸‡î™4‹,-8NúM;‰8NòàÝ{vB#,,$Gi­¶3 (ig‡Ý°hÔ§\çÜ#Mù[{¼§D) 2È¿;òo.³2œÄý€„œ§".…p#°Y&ÄG`Õjõùg‡¿:œ¢w6æ_UkY«´#°ÉÞ:û§bæÈÞV]]rr’6ðY² €…¤§®Èüؽk÷¯­´ÿõPÚÓþÈ}?yçô7n®¯¯O9•èlª`±X&''uŒ¡Ü´’øauŒ¼Ýê¸Qi ‚@¿GC" ïûYÜé†-ªåV_7Ë_‰ ²ðÄG`¥™-Í-‹¶81õÙ¿ºbsq~Ý3iVÚTA…OŽh|ZéÀB$'áÍúú"K÷¸"’Ü>8½¥>¥ëœÓé$7i‰±vwÉGöÿ:,F%­?ýÕ¥ºjËjÕQi#°{)cÌ—nnÙ5ÆØKµAYúÄy`iF`ì~‡V¯ ¬qSÁ­Í¶mdO¢€Åó|â[gßD,Zâîl^]¡•E„ä(è…ÌÏÞ¸â[XC6/^ò~ï•óÊÓDA÷—Âü…¼SÕXbgë÷ž¦û¨\Qiw5²øÏσ˜¦j5²° Ý@®ƒ#˜%â"°¬³ŽÀEQ;|cÂ3rqê”Ò ôôzO‘®_õ>Uç¼¼¼Ä)`&¾ðâÉQO+xŒÀZðN¼üÐY„™Ø`*Í«>Òú¨IÓ…»<‡»¥°€A¬%ÞƒËÄ%B\ aê,AöŸy‰lçUjócͶí±7ǤsÕ[§$Ë´VM!ÎL–'…Ì‹GïXÕ3áûé¾eó[/žûØŽšÙæ’(ïT¢(V››`d`*4â‰V]tZ©šÿ±•IN4ƒÔ*ôê ·}~V—Ì´Èup³Ä<=°Àï÷ É+OÂþï¿ú·Sê­­[ ÷ž|‘|T_ܲµþFU†aL&±{‡™ªjJ;i4¾Ò>9àꟌ®jZòt}ã Õ™w6¥ùiH†àxùÙXcÿï£ÑZìÇf#`@-¿ú 7ç±—ÿJÙôvz#‚E·z—6…زF©÷¸Ò–Æ.p«ð¯Á¢÷à2q) OÈÎáèò…5©z:ÎóSÇÈæjûNŸSýØÌd±mÔ$Å‘ ­K ËWd¾|ëkž=:4á €'yð‰£·¬-à‹·5êØ˜vîp8œNg¢Åi(Òëõ¢(9k‰±n,Ð2ÈýÞÓ-öI¿ÔW¾>xíÃJÛh4æåå€xáx6Z¾0ôûÔo¿ƒðY\d7%`YÓ¨<‰Xìö$µrdŸØÿ¦.@çdŸ÷4©ÚÃó‘m_¤íÛ ‹…°èaÒh|¥ý‰XþàÍkJ’&•#H޲¹.–3øn¯–€åp8&&&ÈIJ¬ÃáàùúºÂU½“ç@ù¼ûèÇMôQÁ`P–åTAèÑS•RXhƒ… H®òûÿõý Gå$ÆQºäKq0æéŸGkʳŒ®ÚÒ\UUÕßßO÷ÉDÀ"+mP[˜ÄôY €…Ì—‹áëw¯ùÌSÑ•Ã7ÎŽ¿qv\io¨±+b–Ïó+V¬èîîViX‡˜°ÔZ×*ôûbm#BOÐ(¬ú 9­8*»Æ¼_Z¥T'”}®À?Ê­U è®z?[®6¤GÉqXs°RÙ`ýáØG{÷’M¢^À¶†[W–¬Kz”ÊÇ]5#äy^•ú­ðâ‰XþàÊ’žAr”Íu±¿ó탮PD2è’;lð<ßÐÐpòäIeS–e«Õ ×7¿ÿSvžwiuÜh·Ù}>ŸS)Ër8NG©@×¢‘°!‚ 9Nà‰‡ÄžwɦwãÆ{z Yey8;K¾®47ê™<†a†¡ df+`Õ €µ|A Yº®î§oö$:GКÿܱáˆ$';B qˆÈ×TóD`’;]‡”–$IDöRºÓnþ+¶f½ÆI“™\2[T¾HÎ#˜%6k``†œÝOìÿšbƒMÏÆÞïXÿÑKIª¯ÐŽÀJÊ˧F¥™§î–zG™ f¼:K;‹òóce­”òÊF½ycåõdçEß»<Ï+æ i}ÜÙ²X–<ŠX‹ ÞƒËÄl#žÙ|úÑThm+RÒxnÇ—`æ-Q ; O56=8ìŠ&ß° [enæy¾££C%ú+«wÚ LÅ"°ª 0kÙ‚²0ìl,üѹ½é‘Û›½²sÒzãÌ%UOUì(Çq‡£°0ö^·µúÒ>ï>‘£ot$êJÅ”×Á錟øwHí4!Oà?iYaݺäùJH®€#˜%ÄÄ´ÇÆÆAxéÔS¡H@Ù£ã Xý7ï«úb­e ðÆ¢÷¬ÿˆÆW˜L&m/žD^ ò÷`þ`–Á;qQØ\K XNžLÀ€ eד}Ó§'<£I,Azf cÉ{)cŒžV¸eרÜ~2ð\à f±ë`&Ý‹ÃýÑŸJz--‰6C(5Ö9‹ÍfÛ¹s§JÀÊ,…ŠÀ*À¬e ¦" ÆggêRMxB?Ûß«´“f*>Á’$ [,žç§¦b•æW]mÖÿ§/쀠äëñœlÌ¿ (ËhŒ[ÿ·Z­¤Tp«v?ñïÒx¬n«<Ù>ø´ÒÆ,A.'²'öp›Uq…BSSSºzμÓó:éöàö¿Í÷–3:× ¥í÷žiXÑ`àòÏL˜žž`ž9ãW õp\ø…Þ“&“Ö<ïÕÓ±uˆ;7”kÿÉE2÷q‡Ï•*&Cà ÉÒÏßúÆ=M_ ÝKQ¯ÈdF•JÔ­”g †þ𠆮¶¬7n‹ Adq»¤ïÄrÆÏýF̯…é^^ïRVy-̼èÍIÀB¬+°…çÞ-•DÀzîØðO>¶‘®E”Opiiéèè(Äû°0»¦èš##R6;§)Öôô´bƒ¥2m)..V¥Rëoú ½) ž&–<‰X‚\.d9sK’$^ª²/íîîfY6‹¢x¨÷õˆ͹.µUíjÜÓÖGÖXZ¶®L^¹•àt:„~r”6†÷¤ìOM¡¹µ]EeHæ>î`µZÉí©8µët:ŸÏ·Ê¶íàijJŸÓÇ«ó_)ƒ5ʦâ“ÊÁSÙdË%"`ýéGª/åj7p«¯›çÏDYB~qæa†;¾lI«Û¨[‹C†††èõ9:ì`Ê;Ö=~ff‹©µ®yX}(`]` !²ðì^]\h>t’f¬Vk]]ôöö’áp¸Éº ªyM'ƒƒ Ëò¹sçAôI´Q€)¬&mijR[h!s¦­­m±/™8‚Ù@öOƒ´1F+èµb£èüA†a$I"›n·{dd¤··WùÜô;dÿ ÍwAZöJû<€—Χ±ãIÅžVÌÌ:x'. Š»ÒV|Ü5:sG{Éy<ðz½M¶-妲ÿÕóOO£Aßi=° ÞÇ=‘Ð+?L{dAÀ{p€ƒ˜UÄî#‰.¤±¥ y|7ïþÇÿè¶ßv»]e^l³ÙHûHÏÄгÄXcæl——çr¹f+`yƒ‘IOôª :¶Ì®5ãBr°…GϱïÛTA6Ÿ92¤ÑY §jii!{ü~¿^´T™cµÏN¿­4ÆÆÆzzz¦§ãf–Imi“1Ï,®†ƒh-‘ vîܹؗ€Ì Ál0+wZÀJœ¨Ç3èëôD¢=zÖpmÓÊ˳½ª™ §/òVšgf*ö´bþ`ÖÁ;q±˜{0ŒD"̵%2rÑBŸ¢yóÒoÂR2°Ê5>¼û¼4ѧÑY(ð\à fñ\,kJ÷íõzUþž´—ñaʡβX–5 ýýýª£Ò X´V•ÃÄÎÒîÉ!0…É i³UÐAUŠ>ÕlÛ>è;§ìéõœººè.=“‚ ¨<°Ò XÀV˾è|TšàxŒ#@$ëÈÖíÎô£,UµÎ5Ö–^cɳy&bß`µ¦½¤?]„Ä™ÕN {{s¾ª\š7¬.ʤ‚ä"›kùçÞVÚïö:º®N£s~~¾b€n·Ûb‰ŠV&.ÿ¦š¾Ôóÿ+1îðä çk[ ïP,‡Ã1<¢ú¢ÈáßKc$1üêOòîl¾¿Ad~ÐXܪôÆêÃEQ¯×À”wìâ¥e'L­e-äåå1 S]]}þüyú(·Û­˜*¸üáÇ÷öкǽ¤][„ùƒË°¬ d*‘œJ¡ÊÊF2%дʼʪs(±9ÜëiWœ° ¡PW&[T# ´GÏ?Ù [fý“Af Åæ§QèG™ÑhÔét^ot6¦ÓéŒFãtxrÈ›Ïm©¼(iÈLÀúÕ‘XêÇ·•ýÝžf•‡ ‚\™ÌÙÇ}jjжæ\W±=hšzõÌï”ͳÓ›l[íP,IÏó&“‰X,ËÒw[º2QŸbËVžxHi‡ßø©áî¯0y–Yÿ6A…B–Åó±µ4nUš`7ºN—‰À¢ó‹òª-:f °œN'`.—‹°öuN<úLGª/­)@k9ƒ’”,B„õðS'îÚP^Î{~ÓI¿ƒÍÀ¬°n<%¼¡lt{NÌGÀгÁÂB„Y ½½‹ç48‚Ù€°`6)„F£Ñáptvv*›Ç•——¿xæç03Õ+Ϋ.ϯ‡ÿ…‘‘‘ÒÒ”KpðÂäés=Ç~ñ®¼ M"–x'.³òq§S`Âáð¥K1¯ÏééénýëãýoMxF@’ÅÓ/Þ\ö‰P(d4*«E)Ë@òbOw˜‰IWÞâ ÖîᬅʓDö:#ŸÖßðÉúÅHrð\à fiè ©NÃXlE³VgIr¹\ªd¶CçÖ[×+ CÂ÷uŽk|ZS¨U[ÉuPÀB²EØ3îýÁ«’v[[ik±%ý¬ˆ€5ê¿è§ÍœÍh4ªLÜ3ŠÀ¢,¬,PSS³Ø—€Ì Ál_‚p)„z½¾¤¤„XápØdÉ;ï>B:4Û¯™˜˜°Ùlt:’RCƒ'Þì%í»6–—¢zµôÀ;q±P|Ü•*ìÁˆtrÀµ¥>¥©œê•Œ¾yËËË \Þ‡¶~þßÞø;eÏïÜ€÷lÓdSee¥jÆâ÷û•ÀIA.^¼¨²ø€Éüü¦k>ÊüùûÊfèÅïÄÉâñè¶ßÏáߟù‚÷à21{ˆ]I›kÜLJ¡_„‘‘ZîžA`Ò3š˜?3Ú}šªñÚV5F`-kPÀB²E¨ÁÛG[v$¯Ën7”åUM(%Aîñœ\cß•h CÞß4` cÿ’I“iž‰È°Û“"’+àfƒ9›¸ëõzŽãôz½òº+IÒ›g_ŠQƒR#g­·¬óz½gΜI~®dœpýîð Ùüäµu™‹\6ðN\D6×ñý3UØÿú¿N¼ùèµF}úÂí*Š‹‹`KýîÆâÖóã'•G¦^,é®´X,ªò@  XN§3Q½·Ûíl½§àµ$€4Ò|úÑT_Íðåì®g{Áˆ ¼—8ˆÙ#C,Azzz!I:¶"`íÝKò+ò”üA˜°Z[[éÃyž§'=¡SÑ&Ë0ûžF•ÑòÎÆ43.$§A ÉzŽýç»×<¹¿çD¿K”äTÝþxjìŸ÷Ô ‚ô·"£"`ÀEÏñ5ö]>ŸOÕ#°Y¢P&îL~šéý(S,uL&ÙùFç³äÓÆü«XFñyL¢(:Nb©36üE[¬fÙ[]/Ÿ%•¬k Í·¬-™Ë/BåË ÍÅÄÇýp·óS¿8þÔCWÍê Ç‘:37¯øÈ…ñSÊÚtxò7]ß::ùÇ&ÓöbClEÍï÷'?…ÄWê6¿7räÙô=‡;guµ‚ ³%>ëšTÝœNgÒ7;˜™ºÐùƒ+íI[y„ò<___O àí¸ÿÜ„43¡ÙPcÿö½kçðCÜ,$‹<|CýÃ7Ô ¾ðþs‡{œQ"ýàÕ‹°ÝãÞKyH·ÛM¬‹7Tì::ù’$K0v†FuAQ%IJU´K)¢#°PÀBär0«,U !F%(ãR wÄ­¶ÃÓlÛ–ö«÷uŽkø›þåµuXaAT|öÆê{éd´ªÌ/öç騕¥Ij#øý~§“ÙP©ãÕ!Z‚ (/Z%–êU¶m¤r¨ òùÉãàÄmŸ.5Ö‘ódra†Û>Ÿ‘€5t6“³!‚Ì yz\)&ÃéÙ†­s8‰(Šî€“ά6µÀÌzYày>U‘™}çbùƒ×7Ïáœ,$ëðfý]ËïÚXNï<ÑïúSG´ÖÛG7›Fw± >¦àp8ÖLmm<¤lv{Nl.¸-ñ+Âá°¶ç먆YY…Ht†ùý,$޶¶62‚H.‚#˜ â¬4Xtn‰ÀR6;§‘j,-$Ò^E}}½ÒÖ(£ÖRaû‹]µi.Y$ðN\DX†ùÕ§·lûú¾Î‘ha™'g¬<“òO·U6pAU äÉ“'¯»î:escÁÍ£n!+ý)ƒ|hâwV~Že8 ,‡ÃÑ××'ËêpuƒÁàp88¾>ïÞ¯É/$ »'Âû~¦´1kAÀ{p€ƒ˜%¤Ñ.Òf«Ö0ys±šE±sä8ɬ+jÖKf²©¼ÐiÛðïëœ íë›Ó”xF–(`!‹Ã{֗ƬSc_øR쟕â~MÃm´€µÑq³2í£I+`ÎÀØKea@–$ç[\¿?™' ¹Ž`6ݱ9“Ÿf‘På3ë~ÑÝëi'­J~¥ÄÛ“Íw{‰}®YYøÈíM{6”aøÕ’ïÄÅÅnÒ?ÿùíW}¯àKïN çÙ**ôqaÝÄ=Úáp俯êo|í¾KhJ¯34zÚõÖ:þz˜)8F£1Q½³Ù¬Ìˆ ïÿJòkðO‡ßü9È2HcA §Ïì·"ÉÁ{p€ƒ˜%¤K=¤Í–6hôt8ããã$¥†Fų#ï’ÍÆâV9}ú %¥FÆÂjŒ–ÑàXfW XWZYW’=Þ³.– øæ¹ _H]¢‚°©öú<]4 ÁºÜ‡ûddƒEeÊè㎠H֑ݳˆÀJê]ÓG¤™Øz»¡¤Ü´Òb±žF£±¬¬¬®®®¾¾žHÿ² ÇúbXŸ»©áÑ;Víÿ»k|ùº»6–£z… 4•YŸ~x+Ǧ¿MƧƒ—Òåçùòòr¦Ú¼úöŠÏ´l'p¾î‰DmÝÊãñOêeÒÝ­ŒÉÆð3îbX»˜ö²Aæ†aà¢O4_dúŒë€ªC(Jûul!5‰X L[[Ûb_2/pžHHÌDUp:ƤUÕ[–eò¦Ê0Œe4‡ý”H Ð1ú†üM,Ë744Ô××ÓQW@ âў؋÷æ:ªW9Þ‰K„]]õؽkÿ|v÷ ÒgÜRRwëêêl6Ã0 ±â Š­ÀI†ÛWœlú:}0“EH X´Fg§‚V¬ÐÇ}þà=¸ ÀAÌt !£TŠ4Бã=S1¬Âf9§s¥½†½1÷V£ƒû• XÈ¢Ag×zÁ²› onù Ùìp½’â ÷d5"\pÐn ×Á\pâ¯,Д‘"‘qÀá8NY·dæ‚÷(éSg]o`MF£1UVDÚksÝÿcïÍãÛ8¯»ß33Ø ’Š)nZ¨}µeÙ²ä}·å-Íb·Í›´MÛ´Y{ok·IÞ¦{ÜÞ¶iÞÔI®ó¦©oÞ8‰Û‰Û±cK²eI¶vQÔJq—¸Ä`_3sÿ˜áƒ` ) Ëù~üñç™Áƒèã<ó›s~'·ã;Ršà™Xâ4Ö¦ 7§B ˜µŸÛ²eKGG‡Ëå¢#¨(Ñ ‚ ll¾©Ù–Ö¿NÞ†Ywº„V¥‹°ÆÎù!Zð¬0ˆWˆŒB#7aºËªÓ™nç:ÈŸ&ãÕ-×Ò:q4Î'AN…§/« ª&–ٱ ·©HPÀB®·­n´[ÔJ¾©Èùñ°Îä6}ÜÊ©NX 1Öx‡~µ %`É(`!r…‘Ã3dÌ8‹®€@lz0”Îæè®Ý TkBŽPX×t €… F¶€¥À0 ÝEAeY¢aɲœˆ'¶zî'¯ŽÇúg’c±X,™L& ò–ºº:2§å ‡X‚|ˆ)ifT3 ã5hgœ/k4”neØV»’´ž*+Ÿ¹ç¬`métÕÙÑ«A ¹jØ-Ý9âÕžqÉKíÖæ{ÈæéÀ»À¥ûõRBÈP%„š¸#r…ÉÈÀ2°èÛTrÇûÎù_J²ZWè2/Zdë„,Y†c”€um—[g2‚ Eá­µ ÈépRÊÕ:†®"ŒÅbkk³=„u&ðn,£Ó¯jjjL&“âp’$I’¤ÿlËj2–.Ÿ£¯„ 2¤™Õµ SßÄX:“A ÆÇe*&†fâêÇšØp ¨eXR³‡ª¼eÖV)(`!W“û(¬WONèOÞ¹ìA;W«Œ)1šH' Ý…3°š@ pµ¿2/0‚ NF ÂâÜe÷žÿÙÙ]·MèXJ5î]Þš|ó‘ÏÄÇ̱õ³ÏüEIöG´ËM5¬®»‘ìé÷‡§4î@774LÂbZ»š´%Ç‚2?Vð_ƒäÏÁ ƒx%'çX?h³ÙÈ“¹±XºSjKí²H0Ã&ê}Þóöß=5ë-¬ª[éXJiëšN¬,3ðL,}¼µ2ž i 4¤,EŠb€YS¿ììõ¿;1•¶PP2°h« —ÏÖÌ*Bdà9X`¯åàÎx;õ'Ó–ÍfK XTV§K+`²=°’)é¯~ÚK6ÚÒRk3R• €…\eò™a™Íæ:³w‘Mµ ”Aî UÆ‚ Î’Oâm°’¯ýGòå§’/?…~X‚\ 2LÜktfò<ïóùÈæ°¯ï_ýŸ@òê™Uu׫#†1l2-䊒áãÔf`i ,ŠÚkͬz˜$/)rUÑåã.^Æ ,A™ÎÀjìÔŸœSÀ÷g“8Ö\#eÔÖÕÕ¹ÝyŸº=ýVÿTD›9ö?´¶¨/T(`!WºŠP!Ÿ–Ò9~Yí5dÏÅÐ$I¢+žçé–º¡ðÖ3‰çžL<÷¤xfÏÜ¿=‚ Hdÿe2ÖÏÀòûýd©C¿úV8‘ö︡ñ!"Ü›Íf’`ŸûCe8J· D AšÌBƒ29,3k[îL/fÎ’±âÝS”d X˜… È•@¢=°ŒJi,»ÝÎ0 ˲Gf^#;Û–ÆÂi‘«¾¾~Ù²e.WîE þþåô•íoéìnvûý‘ŠSï«Ì­«Ÿ¸¯{ttôggqA€þ©Èùñpö…Éívó<ß%oxß÷rJN@8ÅÅ..¶//ð³ÊÇ€K½aß¾}ùZÞ"eFpa‘£|êðKd“q·øÆãþ7é´uתǗ¤6‘6dŠX)ÂþòDŽLÕÁÁAOóÚÁ}Y#®ðÊ <K¯“.!Ôf`i"˜SÀ€Uõ7œ A€ÉøàLr¬Á²˜¼Š%„W<+ â• £„ÐÈÄ]“£±³Sqµê…f“û2eÙõë×ÓWË@ P__O6ÿéWç¦gŸÔÙMýPúЇT!(`!W‡…ûڇ׬óý뻿>¥æ^½Ú3Þݬ•¥\.WWW—ËåZÛvbüeç…БÂ,:‹€K½ åFpaÞüŽW™w‹iý]…¼+)Åúg+£à–UooypppìI¥R~¿w¿ôäó§ò#}AC÷rÏÄÒ'£„0KÀÒD0Ÿ€Uon\l_~9vAÙ<<°Ýû(yµh÷¦eÀ™A@ž¹$Ç‚¤/!d¦¥»Ýî|9ˆžƒqáâ2?ûäŒåØ\9Y–5–,K‡}¯’=mŽ5^kú¦¬¾¾^s©&FfÉ”ô7ÒÎYOÜ·’¾#U XH©p´€urâówæ¥\.—Ëåº×ö؉WTk(ÒIÝ]cÊXÕÖÖæ,¢æºo´ìzäOØó¿•دAF’¿þ&Ù²ÜýY0Yt¦»Ýî‘‘QûBGI}Æèv4~ü†?ÊÑn"Û7:'èàŽ W‚ŒB£“1§€Å²¬Ýn_U=°ÂÇ·6Ü×Pߨ¬^ŠÍÀÎÌ6-#ä’?ýkÆ¥ú3Äb1ÞïÏ–óðv;ãvëô‚È8êº;¹®-…ÌD¤²‘|C «ÉàlC+p¹¥y…d2I2ÇÍf³ÉdÚß÷êLbLÙó¥!ã©^]]æ´ ÿDP­Ñ—Ãü…» M\@*°Rážõi7÷½ç|Ѥè°p9g®jÞÜXÛ:ºJ jÿ;?LOhiiÉù€‘]²ÖúØ×@Ž…½ßYiâ"ˆ‚þ…A¤p„ƒ?‘gF•1cuD¯ùÈ¥5ñ>gúƒËåâ8NSg‚ÈÎÛVˆcsÿFOâ9÷k¸ °ä Ù…p.&îf³¹»»Ûãõö¿LL€ %g,ƒ×-¿A¹>ël˪´€õê×Óû²ø ¾ô,ÖÇ9°L¬bëeYzñØwÉžeµ[×w“,–eôÝŒñé£u5Öä»=Dª°’ §§gýúõKk”qAÜ}fêþZw†aÚô{ß}çï”;Ðѵõ;Ý–ôd‡Ã¡ÿqŒ½Žq·È3—DAš¸H "s@‰àÕþÈÜÁ…4Ñ—zÿgù^Þ~–ŒÅë˜ .<Ï+¥Ðš·ˆ¢8=šíÎcæ,·¬|f½ÿÈÛ].—Ûíž ¥;]<óêÍŸ$¯dѲJT,éÒ°æ‰A¤|Á…xzOâ¹'ç1làšÇ³{¤jÖj¢(Š¢x&ð.Ù³méuv7Ìzÿiük&‚é{æÏݹü敪P¥1=EÊ<K}KÁ|–2¸yåC??ö½”$Àe~ðÌåÃkZ¶BñXÙˆpÁHDþ˜%žƒqÁ¡ÜÙÆNýÉš„{.¦µõ.ç§ÉM • ÙG møé ¬Åõ¶â¾7R‰ €…”ÊM׽뛉€õ«“ãÿ 6æ›Ï2ìG¶~æß^ÿ¢²y)zn,ÖGÜÜ °N½©ŒÑÇ}þàms¹ƒ, É7TÈ4Ó–]¢§BƒúÓAà““c±´Gék>BÆJ¦=’°Q÷ÒÄ ƒXú4f”j=°4dÆd2i²¨ˆ>Uo÷\ÓyË{ýo(›?;òÕ-×2ÀÌ!‹[¹CqùÔH$|>Y±,ÛØØhµæÍb†O¤N¨­îI'ŠªÏÁ ƒ¸àd”.*"Ëdá î&›K›5,–&¡´ ÿ8e›ÐŒ‚RRܶºÑnábI¦"çÇÃÝÍy{ÀolÛ¾¢qã…©Êæ‘™×hýŒ2.¨ç4õ¬R;7¯ï H•!&`Yîÿ³B¦ ‚p*°WYÙ\Ñ´±Ó«—L‘!`a:=‚|°ÔXMd­ÄH"UcÕ[N›Íæ|ܹæ#DÀê›ì9<°{k×msñÀZ´TqùÔ`z2” —«Æ:+KÝšb+ bY cƒ•ÁìÛ3ZŸ€\û§«¦\MGwŸyaa¬d2]çh¼@²Öau XxVÄ…EއäOÝ0Y˜†Ö|3ý~?íû™”bg&“Í¥ÎMÙoÉYBØÓÓCÆXBˆh@ ) H©ó}ÒÆí{ÏùžzåüS¯œï½Ìù®X,¶º~;ÙŽôFR<&`1îÆ^§ŒåXPö_žó—G ³X)G0‚E ‰Òl `Ö“#ýŠF¦ôq9K+ðé?H6oíúËèý4OQõƒô]4`+ bY #`eGÐPÀZìê¼yåÃdóÅcÏ$Ä(Ù,ÐÄ]‡¢,:«:Kñ¬0ˆ ]ªÂ6v‚î*…f0Ü#Jj²•ÇÑì±.Éž“3‹¶áŸ J›0 A )5º›KÕ§qA|òùSO>j÷Ù©œ“ƒÁ`³m©Û¢j^’, ¾®ö†]¼’l¡;‚ "û/ƒ¨.ȘÚF°äh CC_‘ mϲç=MÒ¯<Ö%ë_¯´ÉP^ AúÔóeù¸k0°à‘ÍŸ²›ÕÅO$z­÷‡¤îOÅlá»(èjºùWN:+Q‚ ľ÷ȘíÜ\øû#ÇÉxsë-Jý †œX´ ?f`!PÀBJŽ{74iöä[*Ë;: ë|è(§ uC6/Ç.¼?ýK D€¥iTÏó¼ßïÏ÷éÅf`ú¸#B!öZ?Á`dÏ÷“·¯þ-kÎyÝ3Ì:ÏtpÇ5 WtŠ @€î7ÚÇ›-~`}ë &O(ã¡àé‚>•3³MˈûUê…¿ ÀÛíŒÛm·tS0ïø]ÆÝb<¯ÒÉŽ R^` G¢JçœÅG}gÇŽKk6Bf ›…A¬0ˆeA#mâÌX¢dGP#`1 “3AaÃ’íkZ¶ž¾¬Þ1ž워6µÙëõÎí«fg`àã^ Ñ€:އÁášÛG—)xVÄDìOWê;¸@(€áHoH˜QöX8ë­«€¢2°´ïgSf`!(`!%Âðððúõëé=µV†¥sôt8)Ë«D:ÍÆ¶í/û¶2¾¹“&Î@Ô¶e°šNýŒ~Éà‰ê,LC›ùÆÇ ›[ÉdG)/0‚…³ Xû_—fsò=ÖÖzË"ÈoA3Ê+`a+ bY镱^ÈŽ æÍd2éŸæ»î³ó‹OŠ’zéð%F¿ñÎÿ²þ[]ÞÕ:ïÊÇÜ2°äÙ±\’*<+ â"ö½GÆì²ëô'+X§iÏ–ßSksA+_Ö¾}û”*ÂÌ ,°,!DJ„쟋‰­µ©« J˜ö¢†vï W§ŒSròÜÄñB>—mËrF=5Ï#T¸P(w0‚"‡§å¸ÚÞž±9gƒþü|XšúAe`˜~™õJ ƒX`Ë·ÃbbUa'’©´«Tv5™•†§y‡gå_Þ÷m—-r•coŸ9ýéT£z`YÖívç;Ú\,{Ú㦠}Üñ¬0ˆ …ÌË3£ê†ÙƵ­Ó™œJ¥b±ØtòòD|PÙÃs×Ú*ã¹y`¡’ XHéâuá1Á2l[MÚ”ýÄð~Ééw-^9·ïF†OÎó‚”Òåàn”~y2°ÆøÁAŸšûÉ2,° Í ‚1!–Tè°pN+¦Q#ÈU€a aÖè@–a:O¯d}“VˆN½¢iß\ÿÿtÔ¤ïí% é].írÀ0ŒË•·Ê¯hw <° ú,AâÅ÷ɘëÜ &½UJ(’eùl } ¶¦e+iLÁ0 Ëj•ÃBôÀB²Áµ/Rº4ÖZû§"ÊØJ®h2˜ß^»æ\P½ÎöŒøýj4u8š·p«vZv=‘H$&&Ò ÍfsCCƒÕš÷*)ÇÂoÔrEi¤ ÃxA*ƒ w¯äÉÀ:Ðÿ:Ù\êYoçÔ|c÷üéW‚|4ÖZ‰!ÝT(¡Ÿ`6›c±˜2.DÀ§­îæE{nèï)|Ôwa²§»icöLQEQÌç«5— ,ªËš¸#H5“i€u­ÎLžç‡††âb¸?œ.‚¹síGè9Çiô",ÌÀBPÀBJRêLã­-¢M5´9W² «ØÊ\ N‡Ç=Îfòjÿš5k4Ú?»h©õ±¯YŽîÙ#˪çC{{{ݲezŸ$ žïA* Òôˆå™*³8Í&g‘2#X ’o¾XI!I×nlÞ Qul˜¥ãàÄŠƒX.Ð6Xô%giÓ+²ØÐÇd2±Œ©Í±ŠÜ ÜM,,•L&óuž™ƒ€¶ªÎÀÂs°À .ÒÅ‚ °xžWÚ¸Ÿeõ¹]cm릶éiÇirBó-{~Q’}³ù­ ƒ—°’ çÏŒŽIjNÖÚFk;©»î=x˪‡•q2™ôù|ÑhÔétf¿Q’$zAiüt”3³‹Wª¹W²,œâVVûÏ$.ÊŒ`d8¸µ „\XSñáÉ ê(aæ,Ý [Æ¢“ê¦Ñ£HÕ’µ1k%‡A¬0ˆå݈ðûû†ò³[‹Þ}å<=3‹MNN“KÁ£k#<Ïëý)(K‘ŽšuDÀ:2¸ç±mŸg€,Y*‘Hä°dYξ—U}žƒqae±?Ý.™[–·¡ßïçy^’¥sÁƒdçk~‹a2ò²Eó XŠ ÿT(!Jê ZCÅbBï#,¤”ñ:é ,ƒ à8n‰c°NŽî'ÖØØ˜,Ëáp8§€¥YÌeFäø¬öõ¤xPéA Aª„ùg` DÒÙõ›Ûoâ }¡+*—ûI#ÈU„¶éüÁa™Ú긕]þ¬%Ž•ce|á±!ß¹Nï*¥fž¬´†ÈF„섯¬ôJ© ,AÄ‹ïÉáieÌ8êÙænýùÃÑS‘T@[8ÛMÝ»4²Sò-{þ w¬DfA!)]22° (!ä8®Å¾‚lžºôþ%~xž€K—.ñ<ŸýÆ9Xl[º¿‰8Œ6XR-dd`ï%Éâ@8}ÅØ¾ü:“Â8‹òЦ‹¬ù€iœ« ݉ ã5ÌÞéqŒy‰#ÝmæðànÈU¨#`eï, „zÔ‡‚T+Âkß cnõ-@•Bg#ƒÜËï#››w:,µš9š ,M‡Öl&(Û„&°YPÀBJ‚žž}{æ3jñÇ5X[¦:e3‘ŠýÛ¯¿821páÂå2 *Úš7j ‹°ÐÇòD)#0‚"ùɘmì4œ¯¹W¼»ÕB§µ~ý’ëé Ž±‰;½˜ËºÆ VÄr¡q® rϤ¶¦/'ä¾®£f-Ùyxh#`eÏ„º2–tÇ91þ®•žƒqþÈþËÂ{?%›–»?£3Ùív÷ÇL%Ô'| 0wdÚ·+h,³ÙÌèŠb—ù·è6Ê@ª ,!DJ‚öö‰ t~~!&îÇ1À¬«¿éýé_*{|á±§÷þÕmÞO˜u¡Éó¼ß¯MÝ×Üaæ\ðiÐ X²¬ÿ\¢âÉA¤ŒÀD2&‡|ê˜33®Å†ïÐ\^.†‘ñu]·›X3}Á)ÊÄ=Û ƒX`Ë…—{ž¸/GAM"‘Ðt1N$~>ðìQ^)æë›9»61!r§×æXÍ1&ÅyŒ¼äï·¤´o/JÀ ,}ð¬0ˆó'ùú‚¨>`c[×pko×™”¦ŒÿœlvºÖ®jÛ=-[ÀÊw@ņ_¿q Rµ €…”õõõÙ;3KE%åqåšúÁGL/‡úß‘~rkÓïè¼q.%„ž6Æá’£<ÈÑ€4=RH1Q“3‚HÌFÑ»•±Ûív¹\Òô0Ìʰ K€ÍÝ·ž†.!¤Äpä4Ù¼aù=yÁ1ÎÀ ée`a+ b¹°¹Ãµ¹£ÐÄ<ÏïÞa*’ ½“b{³Á[L&Ã0²,›Y[³mÙ¥Ø9eÿ³ûÿåw6>©™œïÁÛܬ*÷ÀÂs°À Î!!ìþ.Ù²Üó¹ìçô?8ð¯£þ‹m ËÛV¼Ú󃔤.f,¬ýÛ>›ó¨… XŠ ÿX=° €…”.™%„e`)ƒë½É–äyßQes(rj4zŽv‘Ð0 †m['žS‹½¥‘ž*°¤,†O¦N¼ZÈÌX,Æûýñ˜š¾ÎÛíŒÛm “ La§<}yŽö*fÌàu.^Ñ´2®JÓ‹¹Eh⎠e‚Ëåºc]Ë…ÝýÊæÛç}÷nh2|ÇqÊõ¡Ã¹ŽXgÇþHþúµ5»Ò÷“ ë•Ñ…0Qu‚T'ôC»†³¯°Aµ?2Sã6íÐæbr_ß+±døÌØÍKÛiiÈÝâF#`fÒW¶f°YPÀBJ:«ÀBeÀó¡5Ÿûaï? M« ¾Ã3¿j±¯`Öf³¹ÝnÍ5‹9Q%IbY‡8¶m=-`Áæû ¿!‚ W—Ôé݉ç´É 9a31æ- w¿3ùceóbøøÅ‰Þ%K–Ðo̰Œì€mßÇ~¥}ïÀ‘*°p¡PîTI刟Œ™mCÒŒ™²¬¹ƒÁb,ò0s0’¶ÉërnÈ99‘Høýþ=#̓ϟ2{¿×I™¸‡‹ÈÀ¢±Ùl·­~ðý±×Æ¢jÄsÿã«ÿ3›Ÿ}Sªy QWW—m€Œ§ÍúØ×dYx÷ÿ(ö:r”—&ûÙ¦eúß¶ÂÈA¤\¨†ÊÑH³Ž0¶Zàô̲oð$I ‡ÃuuÏ0³2=CöìXußêÕ«[½x<î÷û·>¨««s»ÝC¾ôŠóñëÛÚr§âïX‘£˜±‚Xñ`ËýÒgôÈL,ß4p»ÝSSS‘ˆÚµÐd2)ÒèõÉÆ–&^’@|üâTï²ÆµùH× àã^CÄɉpU¹'ã9X`!Ó‹õvÎ×X©T*ÛlÊÑÞs?—gÈu5®iªk€X,F,ö¬V+ËäÇDùáý%t@ ¡)9kxxø‹_üâo¼wÞyç׿þõ¶¶¶«ý¥+Îðððúõë³÷ÓYSFX,ËÒ6¥—Ëår¹níüÈOÿ“²gpæìoN?çZÕ©Êp%gØ †íØ$ö¾¥lIý‡«MÀÊA¤\¨†f:¸7èOÎÙ½+%`¥R) ÄñX?Ù³¥ý&˜½(Álƒå%Å¡yh:”ñ?Zµ²¹ ¦‚Xñ`Ëýf XzX.—«½½ýÌUþæ8N¹hЖ·¾©Ý¹f0¬Zì½}î:}WY€;U3XeXxVDÐd`yŒï¦³—=¡Pˆ°DIÜ}æ%²¹uÉÊ úAp»ÝJ‡÷½CÉxJ½±jqÙ~w{ŽÞˆ£££´añª­‘ ¦´¬p8|Ûm·}ò“Ÿüîw¿ O?ýôí·ß~üøq“© òýÌÐX†%„Àq\várñínÞØ1´n(¢º#ÿäÐÓ›Úw4Ö¶BI‘Ðûè®kˆ€U…>î¸P(wª!‚E X9ð._¾\[[›33'¢(NƇR²zÃÙP³¨Õ½”ž@”,u¾$_ò«mwÚŠûí«† V<ÄrG?‚mÔI­ŸDÀ"÷–´€eµZW¹·ë½þ7Ûö›Ùn·{llŒ¬^l6›Éd"ï- +-`ÉU&`á9X`@žI Xl–¦úÂápcc#ÙÜöõ@\55³VØÅó¼Ëå*°¡Ëåêêêòûý{ö\ ;ÿàæ®¿yxu®ézn¡H•SZXÏ<óÌõ×_ÿ¥/}Éív»Ýî/}éK×]w"f!ÕIc1&îÕACA)Æff›çA+§^X“büÛ»¿*ƒ ¬äâñ¸þຮ!côqGDޤ,¨™‹€Fxž/ðEQ¼=O6×¶^§?ÿ2D53¢±Öj·ä.‹F¤Li®·ZLêÚ{:œŒ&õ–Ç‘U$IІEßdZ,–¥® vNÍÓŒ ‘÷ÞPÆ.—ËéL‹P‹-¢­÷Œ,[õ XRH¾tÆ›#ËICö²Gcƒµç|:ýj©sS,œ8þüÀÀÝâFGÀ—ËÎE‡GÔK ÃÀÇs¥_!ˆ>¥%`½üòËÿøÇé=ÿøÇþóŸ_­ïƒ\u¼N 1m˜' +ùrÚ`)– SÝÖ†Èþ¾©“»Ï¾¬ä’ɤa!»ôZ2–Ž ;‚”Ee`å»,ÐE†¤R©Ë±ô“Æu-Ût&]?ØáÁÔc©4X†YL™¹Œ%aÑvÈʳ4ºÌ'‘HI¡»n+ÙóVïÏȘ6½ª««£KMÜ«¸„A*yºˆ ¬T*•]YLAð<üÌ¡‹Ó'ÈKÝuÛ ‰ NO§û;ë Xð_û†ÈÒÎnï²E5úó$›Ò°z{{7nÜHïÙ°aÃéÓ§¯Ö÷A>0öíÛ—s¿ÅÄÖÚÔÇ‚(bž9,¥„PyŒ¹¼öšVÇJòÒOÞÿf2/Ä˰Š]´”ÜËÑ€4Ù¯?¿ÂÈA¤\¨Šλ„°XBq~:qYýD†]ÛºUþ0%`µ/`UE+ b¹cÁÂm° SÀRÖ!tV,aEíVU«œ9;<£ŠæôEÌd2Ñ ¤â2°Õ%`á9X`@š¦2°<‰N9}?‰D2™äy~``à­3/(e+à±.ñXZÒD)_©Têüxø©WÎçûç¿ÞI[Ëÿó~+:« A4”–€å÷û2n*<ÏÌÌL¾ù&_ýêWéëWOO}2Ð/Ñã@ ÐÓÓ“ó%<•;ÂŽ;ò!³Š0¡ÿt2°Û½˜uOLˆÙgìf:»pÔû+Þ}—íØD6¥þÃô_‘ýUuþ (ÃhæŒ`ÙýÕ|%‚åþWè.!djÜúG Í¿t0üýþS0»àk­ëªµ¹õÿнGÒljäh±ÿvìØQ.±À#ä;Ý9«|ÿŠj>ù5ÌwÚkÔÓÿô…Hy K XÊšÇir·:VÏíþ–2 ïHÍf³FÀ2øï@ X—úÏçœVú±˜ÛtV¤eôWTù” –û_1¯#LOÉIu›aYw‹þr X011á÷û}þ©óÁCdçÊÚ¼~ÑhtÏÙ©'Ÿ?•ïå¢5VÓ‡·.É÷W —ÊI<‚ѾúÕ¯æ”bàŠ‘£eÛUÄb±D"³9ÝÚ\§Ó©Ÿü’³ñR1\ÿw{ÞëWo;÷é––ëåMœ:ujjjŠÞc2™vîÜ <Ï÷öö*+¿CÓ¿ê ¼£L¸¦ã–õÜ=†_cÍš5MMMús?ü‹ä/ÿE[øsëãÿlxXA>0?ø³ä+ÿ®Œ­ÿ³å?×™|öìÙ±±1eLÿÊØl¶Õ«WèãþÏ/}±wz¿2¾sÕÇ~çÆ/êÏÿô³Ç¾½{@ýñ Ÿ¿sy!Ÿ‚ Hñ?9õ/¯ª’Ðß=ºæË»VéLP¯ {÷îU6†ioo€¡È©Ý?Pö[MŽxàGž¦wß}—¨]Û·oQKŠ–/_®ßã;ñܓɗŸRø±²<øäþRA®Òdä j?tÆÝâüÏKúó§§§Ož<™½ßf³¹\®_Ÿùá1ÿëÊ3c}léWXÙ”ó8ß;ûû—Ï~ÃßÝÞþì§®5œ†”/WN¢)­ ,·Û­É·šžžÖäd!Õ†·6m;:eÔˆ0;‹¤_¹\.¢@u97 =£ɸÉ`É}ܤÔÃi甆JkjÒ †]•d{…¡`:£jÍbƒúAÈôÀêô¢1‚T ™%„Åy`ù|>²i6›””½6ÇjbåžHE_;ö<ÏóôE,;Kÿs[úú#'ŒÓQ))dÊÁ5ª„üXñx|:4q*°‡ìYY¿­¥i‰ÎBˆ^Éèð‰…LClr«§W‹µkמ8qâ®»î"{Nž<¹fÍš«ø•†žžž|-oéB_¸hK1ÀRðz½ÊãGuIÅLN@RLŒDO/unÖ?r!V÷\ù“´ ´Ûí.0•£Äщ RTC3K‹°jkk‰•©>Šz¥´)ä…ɰ ö+41–î¦ ºožNßͶ78¡fS A¬x0ˆåŽaçì‰DèŠBE„ZºtéÌÌÌÈÈÈòÚkzø=ÊK/ýòúÎ;‰=Çq,Ëgân­^w<+ ¢D9¸3FîY›¬áàÄË‚¤¾jãj¶xïZ¼x1øýþx<î÷ûÉ-’Åbq»Ý£þQòÞǶµµ{r,f,&ö–UÞÂþÑRZÖ<ðì³ÏÒÖ³Ï>ûàƒ^ů„|0´·ç}8àuÒXy/¯ :X@ZJ3ÀtÖl8™Ü­l„O XJ÷}ØEK‡KŽò G‰ç¿ÂØk5sb±ï÷Çcêm*o·3n·aÏÓÆ{Ùvã{à«‚N‘² "(G¨ ¬·þdZÀr8Òž5ùžR*øý~E½€‘Ȳ¿ÉÖe³›²Ó&îÞ¢MÜ«!ˆ±Ü1Œ`†–Qý.Ó×%Qý~WW—ËåEqeòúÞÀ>IN@8å?8òÚP J›â2°¨Õ‹\ežƒQž)¢!ä_Ûø£§¦ö“ÍMî;7¶*Þ•“§ò©Tª¦¦Æår ùÒ+™/?¸rMKݾ?íF‡ JKÀúÔ§>µqãÆüÇüô§? O?ýôÁƒ¿óï\íï…\qhÛZ ^:k%„`2™¬V«ò  Ã±î¤_°.Å.$¥˜…ÕS‘ °€aØ®-bï[ÊVò¥ÈžÂx²v'w)˜¬–R°t"ˆ”ÕA9”îôÌÔfŸˆÐ7дĬó”’&(øNòo‘ÍÖšîœ-&h¦ÃÉP\ýP§ÕÔPcÑŸŸM5±âÁ –;†\2×BÕÉd29M®Õu7Ï}Ã?¤u…•³€â-[”€Vª„°Ê,<+ ¢D•2ÞâJG4Qú~.Ëj.§ÛÒÜ]»­®.Cr¹\t)‰,Ã%ú²FëõEê¢Ciy`ÕÖÖ¾õÖ[‡êèèèèè8|øð›o¾I› UH#åå Ü:*iè§—@yÙx¬­ÎVe,É©ÈÉ à›ˆòÂ$™L7P(¤„2m°%· A¹± X:VLˆ(M¦E9µwò9b®gbÌÎu† Y†æ—~… HY°¨Öj5©Ëo>*Ù:'Ç‘…Ž®Ûív:Ü·’GqñT¤‡WŸÒe X†Í—3òÇ«LÀB @žI×ñ± K çÓVss³Ùleá7ãß÷%Ò™\[=° «¹±Ò0Œ'R³‚W¹ÖVZ¹2HePrÿWuvv¾øâ‹Wû[ %„×™~ü8w§ÓI¬i¼~oøgÊøÀ”ú]£µýþÖ?!“Ãá°²dAEÊ+*`AxÆx‚ yÈðÀrd`Ñ 6›ôRI¥R’$Ñn2 Á˜ÿ+/ýN,©7-b€™N¤;þ\çÝå²5~½ŒúA XR™0 ´ºíýSª›ÕèLlu‹Öm€ÆjµÒz:ÁétºÝªïr¹:::½áõ®[ŽÌ¼ªì<Ü¿º~{É5‡ ,†ÎÀJ €… e†ä"cÆkl—N X.—kÚ?õËÓOÅ.’mŽÕ-öåuc¥¶òœsú‚èSrRè”:g˜¸ï•/ –:7î…ŸiæO%†g—¬-`6›­V+)L$t"Fî/°ú&Ë®'t&$‰ÉÉIòÕd2y<éÒéÔÑ—•q)g`a±z¹Sñ”Qfp³,z%â(’ –e9Ž3›Í$÷JÍ9+ËÒwöþ5õÀdjˆ~i©scwíu†Ú7df`å4=5¤âƒX `ËB"ØÖ°Ff¢ú–Íf£½Û Ë–-£+w¼^/¬®ß~6x ’â@”S½ü;×yw)Vq&î¶êÍÀÂs°À ÊÓÅe`ÑÙå"¤^êû&­^y¬­;}Dëg` S)æÐ‹†€6üˆ(`!%ÎÏŒ·–6q_€ ,2¶Iõ­î¥—üýš·œ Ün}¢Ñ(]“Xˆ€Å¸[ûšÎ+ÀÉ}ûȃŽÅ‹×­Z¥3?uäi«„3°ª|¡PT~Ô–Qúï \, YÞ%“IÍ…ååß?ué½ìãÔ™=74> ¹ª›³¡Ÿ[Î-«òƒX`ËB"H'&eƒEp: ­TY–5™L‚Íî;÷M=¯ìŒöl…²MÜK«Ø ÏÁ  Êƒ(ÇCégÞf+Sßdørc’”bßÜûCª MMÇíŸPÊ“Y–Uñ|дùd`¡ ?¢Ciy`!H6Xáâ,‹Å¢©ôq8ĉ&‹mí¸M³Lúáã‚€x“}–1ݼèq3c…ÎtÐf`aâ=‚T,msõq'h|”é™]ÎfVM‘ˆ¦‚c±¾ìœ5‰4Œ-ý´¯Ú,)wä©t&8ÛÐ ÃóüÀ,¤Wrz¾,+ׄ¸þõØw/N"/y¬­÷·ý11×Ó¯€j%Ó6§\r´áGtÀ ,¤Ô©·›Í+ˆc©DJ"î§ÙhÒ²Ó\Y–µÛíJs ¸¡ãþV۪鱀…µÿlä©H*‚”¼>¶ªî͉;i n·›Îá/ZÀ2^DfX¥[Bˆ %ΜÜõ¬`Ìÿ­Ý_‘f{ô8­õ×Ö?Lùfc-öåk+}}èÎÓè…  ݈pÔ¿`–Åb‰D"cê¨YÛ:¢ìì¿Ýü ™h⎠¥45˜:øãÜ/M¤«ÿO›¢^ÝŠçù®®.úæEI¿JHÑׯžá“d¿ÇºäîÅ¿/%Ó-hôë`˜RäÛÑ ¹2 €…”:Åê §e< f?ùB‰Vw^E_“æ/ñžXR¼öÖ—€µ[û£ì?<˜-`)X†?úˆ¢HguѦ‰9ɰJ·„íÊŠ <ïB²‡°~ôþ7ë+`ö¡•Ÿ6‡s\ ŠÍÀš[Šb5€A,w ôÀ"cà ¬œwŒù,e°Ô¹™XC‘^`e(ÚÄÊÀª2w<+€j¢xzwâ¹' §±Þv¿ßOg])á5– %^û­^5ÙºîXü %‹œ`œEy`µÍà AtÀB¤$Ðÿ™i¤l°|a=÷B,ÚÇ}llŒˆY+ë¶±ÌlgëäÄD|ÀårÑ)¬JVΟ¯¤A³j4ÌÀ‚2ÉÀªø…BÅSñ¤{ 0Å™>1•« mú@tçAßÙý_#ûwmüÄbÛòœ4ÌÀŠ%ER"mæØÅõ9sRñA¬0ˆåNñXQ™k%c2™r:r’™‹íË&Uá¤øyßQ(ÖÄ3yö*$¦@X …²ÏÁ  ‚(÷2ñ´ΉÄÃoNü÷t"íû¾~Éõ÷´þF½‚B2°(7Ïù˜!ìÛ·oÎïE*°2ÀKÙ`éû¸k,:׉@<°  elçj×4m#/Š=]]]O:S# e׋fÕhœeu€yöÏâ4xT‹ HN䌙څÉÀzî½ÿg‹Û–?²åS±Xî3ÔPªž‰’ËÕ’;Ç2ºÓ)c22°¦‹.!¬««£W2r™b€ét¤xÝÇ‘wI’”sDSÍ>îRúHã ™Æzr¸¡kÖ$ß?øã±tK«u­×}Ꭹ±ç莪Ÿ•LI“Aõ6e˜×\Å)Tƒ‰Ì,!DÊÚÇý¿÷ Ì«"Åb±Ë—ã7u˜[k9˜Í–ÒÔ÷i ˜éÍí÷? ŒÏLJ°¡T<½Êa``Àðáƒ>Å XÀÔ¸e~\Ë?cÁŒ\):qA<°Ž½}vü(Ùù±ë>Ç2l¾V@ ûZ‘Dê›oöÀÀT„ìœOçiAJÓâ°pѤáDŠ .GÞÆ^Ç™L&ú¢”³~2/SKk7¾«ŒO]>K†í'˲d"IÇq²,çÔ€±×’Êk9fj½Eü…‚\ahË|Ó'òµ亷»î±±1âä ™øîîO·Q^R·âswü³‰³Ð–Á}ë’?&͹¹ÞjÉïYŒ ó,¤$:ý&¼Îôšì† Vge+jʼA׌¦»ióâúޱÀ¤$áþíÑîÏÑxžonn¦÷ÔÔÔ¸Ý7Ã4E—0W†€ån)üã>0ô#ˆ”>Á¢º X¢”úñ¡ÿEölX²}]ë¶d2INp†a4=L³¯EðÖ™©'Ÿ?¥Ù97,¨‚ VÄr§À.i°ŸWÓšFfb:˜ÍæB,úÞÒkm«3{‚Â4bò•žÿó¡kþˆã8rE‘ã¸ñññæææÜ•UU>îxVÕD™rj·>þS·(ßL€Õj¥¬`0¨ R’ð“CÿIö7XÿöÆ'­&;ä©ÔŠÍ”‘°’`xxxýúõù^¥3° a"¬×^'ßÃF0q¦‡7ÿÁ·ö|EÙ<9ºmÃVȨ6¢ïcÀëõÕ…P#`)kõýq2}Ü‹ðÛú Ñ RúT|éL€EŸ§9¬Ýg_¨b:Çr»î³0ÛçAÁl6k’=sòú©ÉìsnÜSñA¬0ˆåN\âN Xßx£oy“3ßÌX,6>¸£Óäq¨é ùªÿ4ë“¥ÎMÇýo*ã_ÿ^0>ÓÍì$¯*-e†††<æ Œ­J}Üñ¬*>ˆ2?&ÇCʘ±×é¨W šI(ŠÇã6›í­3/LG”,Ã޴豺Y“МZ•~ÝSuIþŽ[…P 6üÈœA ) ôf¼µ9–V:LFõ,·Û=::š3õ‰eÙmËîÜ}öERôÚ…gïoþŒ‰I?Õ4ŸÎ¹ìÓ!Û9µ2¬Ê^(TA: Œ2°èÚ^åô4›Í$©*)Äyâ¿É„›»ju/…LËd2"`½Ö3‘½sÎXÄjƒXîAÚÇý»oÎotÔÜÖ©®7B¡×›£ O³ érn:Éï‘duÕ±çìKgwz?jaí Šâääd,K&“¹W2”€UUXxVDº~m^a0Y’èô+…ÉÉIo³ûçÇþ7ٳ¹ÕeYDZÖd X&“Iÿ†e¡Ü=°]PÀBÊ€—{ž¸¯[ÎÈLì‡Õg$Ëåre×÷);§¦¦²ÂqÌïnÿ¿ÿçK¿+J"øcgBûÖ×ݪLp8tC(¤•O&ÙóAÐÏÈ-  AJœ¢J³3°†1™Lаu>xÈU/ V“ýá-ŸRÆ´ƒ»Óé´X,¤íCÎkÑÅÉHßdxö8ìîR;Þ¸ÜÀcAr§ØógÄÛ: æ˜L&ºH°ÞÜxGó'öN>—Õºž‘ðÙ“Üîk=÷€(ŠCC-‡ IDATCH$œÎù_Œ•ÊÀª& AJZÀbŒ¬h4š¶9::º{èÇá„ÚÉÊÌZ75Ü TÏåì{ýô+Èì©Zì%A ,¤ ØÜáÚÜaP¦wn –¸—ݾú·^ïý±²óÄô[ÝÎmVÖGsù.ÄÄŠ&§€¥ÿ°dˆÌË ,‹ ’,öð{È«·­~´Þ®°êëëN§ß¯ž°9¯EtúÕŽnï×>¼®à?Aò¦Ø»»¾™‚ž–Y,úBÔb_ñØê'5ô©Ð%eÏhô¬"`õõõE"àyžn¸LÈ(!D AJ i¬ˆ ¬l/v˜ ì½üs²¹®þf;ç*‘sÖf`!ˆ(`!%ÁüKÛ Ê†ñ ÐÞѩӇ>_Æñwt˾×ÿF 6)Y¸>¶¦îFe‚Foš–±V«—;A9œ>w‡ žOÀŠD"}á£á”šWeá¬÷¬{œÌ¤Kív»ËåÒ7È{½7-`ݽÎÀÀ¢*>ˆÕ±Ü)0‚7®0N-ÅSO¿¥ö¶ï›Q/J9Ó9  šjÛ¾²ë™/þèAQJ/L†S~§ÉM\œ'''=OŽ‹•½– S‡^”ý—ÀrÏçÁ<¯^Ì¥žƒ@ÅQšè#c¶y¹þä\–¼ß÷‚(©w4N³k­K5È#X‹…eYÚ8Űûf`Uƒ ?2gPÀBJ‚ùÿÌØ-œ×i %@¥±@\Ç>0ß3"`Ù-λ×=Fsœ¼§X‚ hÊ¿?à ,(U«² Õ@…GPˆÝ)°ÜÜ,³Ù,É~uóʇ\Ž´ }ßh¸ÎK¦¤ÝgÒy ÷¬oÖ™\ ÄêƒXîÁµ­u†I—¢$ßP4)€?.;<­‹jÍùR˲ݬÌfs½ÝÓÝ´ñÌØeÏHäìêúÈ„|=Rª aêÐ ©C/۾Ѵñã?¯œÁs°¨ø å•-` ¾?$›[Ü÷·_"`€Íf£ß[TVÇü2°*Þ†™ìÕþ²`Ð×Ê!_ŽtYB¾{K–MŸ;V<À±ê+/L*úd2ùÁg`1Î2ÈÀBR†>q‡ ò·"UÈ—59¦Õý¬ù¾ ¿“þY¦MR ¬w/L‡âê§,vÙÖµÖÿ‚Tˬ_’ÎA˜ú®®.ý¼Îì;LåvtcÛdÏ¥ØÙ‚>Þ–Ã+uôå‚Þ‹ È•C–剋d‹m2ÈÀRŠ… 11txæU²¹Ä±r©s#Ù$¹™µ’Ñ_Ø„â©@L½E²šØb;Èk@õ Ñ,¤r [w Më XV«•ɺƒå8ŽÞYooØÜžn8}>ø>‚ Ñ›ÄÄ]ÿ-Xa°¤hŠrp—e™>OIb¦Åb9ØOöï辿¡¦‰l& b’j±XÈ»òñëSéúÁ{Ö5Ij‚T#›ÚÓÖñÞp~Î ,ȰÆcý¢l°ð€Lw‚xì—†oDäŠ"û/Ë U“b.¦®Q>^WWw`ê%AR̬åï#ôdâÝ ™ÏõÁ(‹¾ójkpહr` !RôôôÌ_kÏÈÀÒ°†±X,šž²Ù7œ·®zäðànõ€‘žëÄ]ɤC³:Dw…‰ r©ìÛ‚HQ&“‰èÚ3‰1_BíÁ0ì>N¿‹î ‘»'}&´€u÷ú&™…SÙA¬0ˆåÎÂFpS{:ßêÄpÀp~>«ÅÕÙXÛªX¹§dár´¯­fµ2a˜œ¦ZÜÊ-»žPÆÂëßTn˜%ß°4t‚íØ˜=¿bÀs°¨ì U?ÇÉ­‡ÙlÛÆ†£½äÕ-î»kL9’:¿½{`|&855Eߤ¼55àtæh¥pq2Ýê¡Íƒ-‘+ XHIÐÞÞ¾¡.—úØl6€¥yÎk[¯[T·d28 )YèÛ`»ù*”–ƒ€µ D®"•A9,XѰé70+`EÓ6X², ‚ Ÿ7jÚ²+-`û¥å‘/ùw”xV•Dº!cd€E/NöOüÜUS¨L¬ù#›>WÇ5ò €…T´€E7ÂÈI¶aNÏš›ºw½tìQÀŸ¿<¼’¹Žžðd`A9XR:¤zßL<÷D¾Wé ,¿ßOÔ+˜ÍÆ¢«iˆ€u|x_8¡Î´rööšµóù†û.øÈøžªD¤ò¨±šV49χ@’å“#Á–ëAç+!©cÌŠûU$Åû“ãn‹Úü4‘H XÂ,€xñÌ3®hœŠ Ș[ Âñxÿɉ·Éþ6~|Ûº› 3Ýårö‰¿9=9Ïo8 At@ ©Ú îB…e`€ËáÝÒqó¡·”Í#3¯¶×¬±²éRìr²-áó1— ,k ˜,Jqâ`6hp† ÕL꽟ê½\“Ãí%ãí¹Z¾}þdgWÍ&Qæþýú&Ó-¶v|Aª™MíõŠ€'Fú–Ùlf†¸ø%`™Xs‹}ùHôŒ²9=K,Mjy6LÝ"nÙV±ï=YJÅ|ËïÍåAdÞ.`ñœHÍD’ 5yŸ(˜ÝúÙcCûRRâbäÈÌkÛ½ÒDQ¤kŽô™KSã–ªå³ñ3®Å~Ü«—;•AQHzQçuC÷lËê=Hv®¨½V–eŸÏçõz•=n·{hhˆÜ4ÖÕÕå4E&ôM¤½N—7ÕèŸÂ©œ V1ÄrgÁ#¸±½þÇï*ããÃ5=jX–¥×6KjVk rr½ëeL[‚fÛ*cÓæT uôå °ð¬*9ˆ²$M\$[lsÞBÅ$A)<|/(¨©ß ÃþÞŽ¿2q9n‘^œ¡;ÌüûÇÖ­iP6ôÕà ²mø‘y‚R,ÔÏL»ÇÑ{)¨Œ‡|Ѱk[nh}à‘”Í ÁC&Æœc‘¯3y·7>:OK’$Qó}ºBé X»P¨*&‚©ÞÝIJ©q›oûCÍ®;ÝNÞívK’šNeµZÝnw8œV—L&“ ò‹Gþ_IVçx¬­k+œ={ÖãñØl6·Û]SSCÔ+†a–-[¦³Î‹ â%¿ê7Á±L§wÁ¬Š b5ƒA,w<‚›ÚÒ“}܉ E/NÜn÷úÅ7œzIɘI\æ“.KPX9m•«™iË®Äó_Qö‹=o$_~Jó¹¦-»ØÖ5súK <+€ ¢4= IÕ&…q6húÒГAJœäß"ûo]õÈŠ¦}R’ü•N“Í›Wz₩s¡¾v±T¶ ?2OPÀB*Šv=-`MG7w佇ÌN‚ÍîBH¸±cWÏÄ>>9 2ȧjzí$3|­çÞ¢l°rNÁPÀ"c´ÁBRï=OƦë>d}ìk:“].—Éd"7o6›Íåré[DÎÄýàÀ¿î¥êWÔ^« A¿ßßÜœ¶ƒ©©©ÑJ90•fÕ®%n»Õ”÷ʃ ²©=mGÝ3%™cõ\ èÅ ½´p¹\kWl\viCßô eÏÅð±kî*+§- rAc;6²ÞvÉ7 r"’xîIÍç2VgeXR²ÈüXü?>L6óÕ*g.I¥ì ¼Uã›Ùñè–OåxKTøØ·Þ§Ý¯þú¡ÕÙÓ>0*Û†™'(`!EáÍf3Çq´œ¤#!Ù,öë½ÿúò32Õ× $959JúœG–e’ëAcXEˆ‚Dfý iÛ‡uæf£ÒE"ê:Où•sÿuøòd‚s.unÒ¼+ÐþÇv»wéÅ©´Öò&gQßAjc±ËÖTg& š¿üÂi—Üor,›œœ¾­ƒóØçy"©»\®ÛÖ=Ò·W°úÃǯi¸€1ôÀRà6? ½ñt¾W¥ÀD¾—™?âÀÑØ¿>$ÏŒ’=9,Me\ŒôòïWïY÷x­MkqÐ7ÞõõgÇBdÏÎnï­«òÛ#ÈÂR,T±z{1­V+Ý\VGÀ2›ÍͶ¥Ëj·ô…Žh^ˆœ(<+ßLcwZÀ —¢€UÉvÕAeD0£~Ðé1­½Õð-ôYÇ釖gïžN«WNKýM¿oasèSô)l(`ÑXË-Xý TJ« b¹s%"¸©ÝEŒi¾ö«s†ó¬5·wY •J‘*…k:n±šì‰T ")~<>Ðl[J{`é`Úü€_À’ƒóí\V"à9XT^¥©Øßî”éÛvÉZˇÿ6{¦&ò$¿[ÕÜiuÝ»þ·µó#¶¿Ý3I«ØÇ·>®}V‡ ¥ XHI°P?3…g`€Íf+PÀRÒ+®m¸7&†l¬ÓÆÕôÔ§c±¾@tša˜œ¦§ò XUa …*¤2"˜Q?¸õà´y ÙþÄtR¤$I>ŸOIFåT¿—¼Tooø“OÅ|"½.$%`]¤Z._P«2‚Xå`Ë+ÁMíõ´³²!ý~ñö®Ü/ÙÌö-7¸øš:3|¼Ù¶”d`¹ÝîÉÉI²4bY–îGaZ{«e×ôѤñ ©CªC¨\)XxV•D©ï}Z½2m¾ßö™2ö:ýwÅÄй`º̓›?i3;4sÎŒiõjûrÏ Ÿ½¾©® nƒWŽÊ“ ‘,¤¢ÈÌÀ2°46XúX`ãœw6«mwÆb}3É1déý·VÔlÍiz ™7̇ögCÁ0 ( JRÀB«…4Ñ—zÿgʘÜJA®úÁl⎎ºßÏ>znÕÜ®îÑ™î¾õ½ç|/ÀL ‰ófCÎøB3°hZl»Þ›Nòt öE<3—EœJ»a™s $JW+‚ÈzQ¼f‡3Of­Ìò،۳h4 ƒ¡ÓÁ¤üFÓ±úì¸'mZyy¹Á`‹ ©Ò`–e3õn^im½µb5¬â "BÀ ;kÁz·ù»v(ÏIðÂO^Ž'˜ žê‡‰ËêiÀ±Ü¾Ö^8÷sép0xºÉº#‹IŸ]ô§"ÏóRfV®'eœUd,úK$ ߃%@éQIIQ\ã.…™.—Ël6Çb±œŠ ’ó{›³»‚öL¦îMÚ«1+)PdE4ÁÈÈȪ\‡c™:·œW%Špq^ÉÇ=-+É9Y¯×§-àl:O™±~ñ‰„s¾×‚'OÌ?;é_ÆËVÏÀ²yÈX›ÖjEY/Š7‚bVëÀïäõØ¥õƒ ˆÞ£äÌáŽÛæ²ÌÇfM¨4›Í 7{0<–î0 Úi²›Vs©xƒˆ0ˆÅÎzEPϱÔÍçç¢Ý Ò8´é&2 ÷$űÁ¢,Q•ÛÔ0èå½@1 =zŠ|–%D1f‡äNÇÖnUž/í‹„Ï‘æéÍå[*ìuY'ÓXÚ°Ž;¶Þ/Ñ.˜…h‚;w®Ö¥šÊ,C³òê›ÏõµäNpƒSSÑ;¶Í:¦§§NgÖÕÃ0:.Mfjµíž]”ÆgýrµÑPèÌÇ;þ:3c?ë5Éͳz–Eë%„«Ad](Þ ³©uªþª1ž`Yݶ,;n·{dd„ÜžY­V›-ËZm0xÆ—S 8–»y×'²>¯ÝnŸ››K;Yƒûª×o±ØYÇîjpvŽ.HãÎÑ…kÚËsÍl©ØVf«ž N@RŒ…{·Çä ¯4Å*™Lêt¹o†±Wˆó£Ò‘¸0ÍT4¯èwÐø,J,ˆÂH',Þ2°ÕíD5Î…”K>L%mím¾>û•E±ŸZ–´We·:¹ô ¢ XH©Aû¸ÿà•A…™Í.î`½‚Á`Z·i½^Ÿ&`5Yw¾3÷k€%Ä|oø­ƒ®CÒaÚÕX–%7ÏF£Qú‚’ÈÀBõ‚ÎÀ2|äoØšœN1.—K§Ó‘DƒòòòL¿*o|ò™”üÖËm5Y¯–5KÝk:µÕن;ëò¾Zç¨_a&ÌM‡Ÿ_¬" Å>$Ó «•3°€uVòDÀòOAñ X¢5h,V±~‰D2™ŒòÁ©è9¹·åHÖÉóáhB~W:Œn«º÷‚¬;XBˆ”´{>¼;®Ö²ù¸[uÎ*SsæÌ×Gžô…gå9Ö%t½]À˜‡‰»Ö=°d}xa~L3 [Ö 2º73i·jáä‹“ÿ™eGv–a?´û÷s]*köÖúf`!²‘ÙYŸêJAR±rq%eˆs1ÜY¬þËÌÀR¾Î,lDˆ k‘6ÀRI.“QFB]‚(¯pËÚ«õY'÷MQõƒU¸©†(`!š`K °NL¨,Î$2}ܠŶ †µëËôŒœÐKF=þ]iLr=$h‹¶W] ‚æ,,V/vŠ4‚¢wxYÿeì`PÑè{3žçéäyêáP2Õuážý*5ÌŠÉdÊüX(HÀj«Ze«HƒˆÐ`‹uŒà®†”kõ™‹þ ‹¿%l®Úm7ÊIâq!Ò?#§x¤Éúê–ƒöq/…F„ø,J,ˆ%`©f`Éõƒ¡TÒV®úAèYb€¥•úAðû•rH‘ –"š`K¯Þ\¦Úm¾ù\¿Ô¬pÄÏO‡„J+›µÛ4!kg±MöË+LMN}…ŽÑ÷Þ~sæ éüý¿9²í£›*¶§ X4…e`­ 3@2@" z“òC.1X¬^ìié„ly“ÊdA EdžçÉ­Z”¾4ùÓÙØ(ùéÞºoÜ~·òívûüü<}&+µXÜT±Ê»ED„ƒXì¬cëÝf·Uï % MÏ…›Ësné± »³îÐÏH‡Ý³Çoƒ{ ðBÆYIÆ¥‘…ïÁ Ä‚H· dÔ3°¢|hrIý`NkI–fÜ`dd¤ÄŒÌU,¤ÔØZkWí6 o^˜ÿm\è7wîÛ^–µÛ4!-ÕB²`×3Æ2C­t¦Ý¾¯ÇÿÖ||DÿëÍoüÕ-?T° ±Äa~~Þãñäš ŒÅE–†bÈǸªUG)yh‹©P°ÒR HÖBbîÅÉŸ,$RŽìõ–-½ì‹ªÏž&`±,KgVf"Š00“êÒµêX‚lpvÖ;ÉÚ¦sÔ¯ `À¾–#DÀX8-ˆ˰iŠ•ú›ƒ°ü¥ `!ˆ¦ç.Ša97œ±8Ù²Fåù‘H¤Ó÷ ©¬woªqæ\-ÉÀÒR !ªWˆXBˆlPnØžZrœºMK¤ X™·© 0ûÊo%‡ƒ3]ýöïbñX® Æb1:dppÐçóåš hƒ… Ù©„ªXi7f’€5füû´zUn¬?\ù1—SéA"ÍËh42 £0 ÅdÍeÑ{¬Yò:A–MA6X;ö99i4’ öLœ„åd`¥J…’(!DMÁÓîõ;@q™s©î…·Èáµ·+Lî qG†,Q3°MÐÙÙy‰µö›vTýõ/»¤ñK]Ó‚(²Š_ i%„&“‰ô$T›Z›¬;†Cg¥Ã7/<ÇÄ íú«²^0‰ÐÖ‚BDH°æsM[/.}‘Õ¥H#(Ì¥,FÍÁ=SÀá½¹ç¢|j²ÖÜv]õï™õºÈ7¢(ò"œœHôÍóÀq‰gÇN+TŽÎGÈx-Zi b±³¾ÜYŸ²ÁRnD:NßhÝÞ·ð®tø“c_¿ïæï®ÈĽ$,|–¥Daô,³9Ü£Ñ(Y´¼5úk^”']æòk·|8ו£ ~dN^–p,³ ;##E Xˆ&hlTIˆ]u®hv•Ù sÁ8Ìã'†|{[r`AFV®›ÛCñ'¦}q9‹þ‹OñeìVçÁÌ™,[Xþ#cK½<~à]®=».¶^\ú"«K‘FP,Ä+³„ЙŸˆö‘3mö+•„e8ðù|™‚ò©ÿsgSwh'û'~Óå[ˆÑVÉAȵhAX¤ADh0ˆÅÎúF°  ,h÷\A¬éÀèßÿús7Õ|Æ©ûXU‹u”š¾K€R "m€Åå0ÀêëëÛ¼y³ÉdšNwyß çoÝó)=—3×»:$,n¥7–YŒ: f;v¬ÄŒÌUDC©ÈFÆétªOZUX†9²-µêzþ¬Ê¶aZ–Á`à8.sš‘µÜT÷NsÊÍêí¹_õÞÍœ©\j”åoÚGƉßü+ðy5O¼d\ú"«K‘FP J™ÂK;§^'>CÍU•Ô«d2éõf)Ô}ùüô}%ÿ~~rn©zUmk`6Q¤ADh0ˆÅÎúFpGƒ,.z&±¤ 86—ïi°l%‡sÁÉÿoðß|ñÔŠhš¸ã{°(¥ òÕÜÃápOOÇ讫úD‹m79N.œö½LÕK•ÀÈwb`Vk»kRÜð a¼[3LÖBŸÏ‰Dæçç_}çù×úŸ&çÔ|H—;ý z(,Mµ De°„Ù¸ÜH XoöÏ?ðë)+êc<é.6¡Pˆ>ôz½¹R¨DQlpoþãëÿá__ørR¶AÄ×g€Íö+É4—Ëe±Xz{{É•çææržG…þ}ŸJ¼ø}é0ñëoèÝ“çoŠ %‰œ£òò‹1Ù›ROȰfB£“!¹‘¦Õ¶Gõý‘, ¹FæP½ÞmfF£ËåRnDH¸zsY>ÓA bg½cpF^WtŽú÷4æLEñù|¡Pˆe¸÷Uþ®ŽÑ“¶ñpŸ¢$è« XÀrŒ½L\˜E10øjVã÷@‹ö'^úwƒó”š3žzÆ’îlàóùDQDáéÞòò}Øõž+ê¯W~–Þ%-í«öêdA ÑëRêÜXf騶Kû ^øÊ/ÎIçëܦOL’ÒZ†Ãá´¢BšD"±³þà¯ÿú·_¼OéžY|}æñjS«]/ßcsçr¹¶mÛvüøqòÝÝÝÕÕÕ¹¬Ü ·|)ñòAà€|?û·ãHÁ¿öÚ€ÅêÅN1FP˜I`©ÖBÆX·÷2®µl®pÖ5Ùår¹ÝYLñè ¬›wUïit^QgÚUÉr €ÛíV­Òúr IDATnfºÖc‘40ˆÅκGpg½óW''¤±² –×ë•ÚÑ0Àª¸s$Ô³±‹ÆFÈGÀ`•²€ ú§‹]ÀZ÷"+§ØƒÈw=r_ÚI®qwæL¯×ë÷ûà¬ÿ•ÙØErþ2÷MV‹JRÕKcX¥dì:(`!š`½¾fnÜQI'ÐJœSI¹—PpaO$f³y{õþëª?qtò¿‰†5íëÐï—æHƒ6›Íáp,,ÈK̉‰‰H$ÒÒÒ’õ6˜­lÕíýpòí_H‡ñ§ÿɬ«¨ gÅ9º~Pݱui–ØëKö¶Z÷ÔÔÔ[µ\Rõ©«›îÚ[Wð‹^KŠ1ˆHÄbgÝ#H—'Ïby>ЦÎÒ><%ކ{ °ä-@aaºØÝIÖ=‚ÈÊ)ö òç_Í<É6ìÈ5.6vÊû9l¶ílµíVè‰,Ñ«áÂR²áGVbÿ–AAÛ`ºÆÕ÷€¢€%-øâñxƒeëOJc õ’1q¼²X,ôc}>_V÷h Ǿ”z–ÎçÊÙA6ÂlaX´€5%å´J=kh²í°Ûí-‹äJ¤ò‡S–ÓŒ;@‚h›1õÑŠàHUgn'ãѰl»£jâŒ³ŠŒE¿JKATIv½’y2—ƒ» òÇfDù­jælÊî€Ü Ó%æCñÙ \œh6p™Þ)ëK)Ùð#«®¿‘ Íu[+î½¹æCñ½:$<7–EÀr»Ý>Ÿº\.–eÃápÖË êÌïÁóÒù‰èAX†eY–Xh)Á¤Áµíç¶\Ãw¿ ŠüÀ»¹¾Ï¤äYâà^¦¾YG§ O’q£e‡ŽÉÞW4@4u‡Y¯0Ad]°›Rk{ú#+·Û=;; ÊeDö­Ì,+ŠÌÅÆ#|ÐÌÙòÉÀbK®!‚¬#bp^9#0¬á–/0 ÛrMæd·Û=ÖÝíO’3‡*î4qVX¼ IãÂtèïŽÀ„/JNn®²±öFGu3°MpìØ±uy^›Q÷À];¸kÇ·>¶›cåÏîÁ™p8ž¾åèr¹ZZZšiiiQHÍM$°øÍá1ÖJ_$¢3±Pk8¨ ×¶ŸŒEߤÂÌKÉzEY-Š1‚+ÈÀI~l²_ù½+}K2°4'`c‘40ˆÅκGÐjL}”…bJùS.—«¾¾ž:Ìž&OÇâ‘8îQU“°J,kÝ#ˆ¬œ¢"ßý[iÌ6î2Þó ñžŒ÷<À”5dNv¹\çü©_v“í²ËVidqD9Ú=sßcgï{ìì·^è''Û«´U?ˆ Ê €…h‚u/V7¸–ÅÎÓ‚(vOdùЗ4,Ra¤p»Kg`1ÀÔRiù‘>Xz«ìv»é$,£Ñ˜Õ=šÀ8«ÉXôkEÀZ÷"+¤#(R[Q€€5‹ðrÒž1V›Z@±(˜ˆ¦,‡öJ‹1ˆHÄbgÝ#h7¥´õ Z aZ¹ô¶ê½d<‘MT“°•å/ú ¬u ²rŠ:ˆ´–n۵ʓ{§NO†¥1Ì.·JçÁ¡Ù,µ#Z3À‚"— ‘µ,‘ÙZ›ê › –‚€Eg`@e3ùÑX†€år¹*+S‹?›Í¦ÜÈŒq¥,A3Xré¡3°ØBº^¤Ò¯ê,í,ÃÁ22°,šËÀB¡3°‚Š%„ Ó¥„ød2¹¥êJr8éDò°ÁZ’µPôX²¾ÐXÜÖÃÊ“Ÿ;û×[¶8õÊó¦C™'5(`µ‰¬5šÛ@Fõb{ã©Srçé|Ò˾4¤ûäXLîþSkÞÌ#‚³Ñ‹q!âàôü‚¬ YªAµè›ÈÿRRÄ#b`Vsú|·“Û0©4F¢Þ²E¾†š€•DR\̱ŒÕ€_ ‚hÚÄ]5‹þÜãy¾Á¹ÕÄY£|b|d66Rij.0 ,Y>iX\6ß+Âlpâ½áTºÖvgjr®zŽÁÙ”€õ{‡k]&¸zsùÊ^5‚\R0 Ñ~¿½_l[í ,é¿`æìnƒœ6%‚8éO{¬Á` 㬞‹4t–v<°´Ad%]…¹EiÌzêM½§|>ßà"¤ñ, XQ>8•Î0ÀÔš7Ã0ª%„ ‘Tú•ݤӠáiÑɃXì¬{m¦ºÒ-eA±ÎBl°`4Üù”RXBñ—®{‘•S¼AL3Àble “Ÿ?÷saq²ÇX[gÛÜÔÔ¤×ë ªª*k=ÇÀLJÀúÛo“Œ€7UZWí@µ,DŒŒŒ¨OZc¶×¥²¢ºòÈÀRõÀ"XÐìÜNÆãáÞ XN- XZˆ ²4Aaf(þÔƒKþ=ó/ä§Lyª¡¤^ -BkXÒs,Ü +_CEç€ü °üÚvpÍÉ b±³î´9"¯£ü¢ÎŸzAÇë(×NÉ«° ¬…iP}Jm³îDVNñ1¬H"ôÛž_‘ÃmŽ«L&Skkë®]»†Éš~Š%gò½‰Žeê=9»Q­;è…(€ˆ&عsçz¿ØRcgFE˜ …ã¼Å TR¤PB˜æí•—½7ó¢4‹ô) X¢(2¹³;«ô&HD@ŒÄh1­íº"ˆ¬Gï:{ä¾\?¥ °¼^/uåóù¼^¯´)e`FRõƒuy×Àå&£AwÐ|‘|À ;ëA–aÌzNªwD1’PYÌpG$ªx<^kÞ ÀH*ÿ\l<ʇÔ=°ŒÆd£€d\ û«R/³îDVNñQÕKZÕ@çÔ±HBN§²è­¶ÝF£G]]]ÖV郳a"/7•[t¬ö2ÉA,DÌÀB‹k©°HcA{²5"¤QÎÀâyž¬ùX–m¯ÚÃ1rÊF(é{wòyz>˲RÆ/ˆ¢Hj³Ã0ì’–ÕZIÂBµC˜ìWø)• ©¼âx¸œ¬_,–) ,AXZE¨êãN/f‰„‰³–ëOˆã‘^Õ ,`œhƒ… Ë'þì·âO=òëK °Þ—6Î1?9œÊQÚd»œet’€­­­ts U?Hz¯#HÑ‚¤ØV›ª"<§fƒ•–EgQ%“I:ýÊ`0XͶjS+9óòàÏ^ìz,×ËÔ AÖa²Oá§ù´ ”å™èHL{HYK…IV¾ ÏÀB AR;½˜‘–KªÃY¬LŸÁ¥‹Þ A.%|×ÑØÃ{侨Ïï_j€åI›IrÌEG©v4 –­@D+Žã²VrÐXdÏAŠ-A cÇŽi!Y”nD¨jƒ•vÇk6›‰„(ŠÀó|4%?2 ƒaçÈôÄ`Bˆ€â¿ùÏ:NmÇdN($¯£ –F"ˆ,GP˜Je`éß÷)úf ¸ö«ÈØív‹‹Yòf³Yr‚ë©_­e3ò /Ÿ ,ÚÄ]›X"’ÄbG \IÔYÚÏø^–ÎŒGúÉ%Yá’zE*µ}>_KK‹‘²ÁJý1ß÷fÖçÒßðE-˜(£…"+¤¸‚î;™'• °¦£Ãq!"MœUÚ#X¹œ “qK…¦3°ü~A-Ú‘  Xˆ&ÐÈ× ÝˆP5+ÓÇJ¯×퉨Q°(`UT}ê…Éÿàň þôõ·Ö\Qåh€d` Ú(!ÔH‘e£ñŠT ¡ñžÒ,—ËŲ,)àµÙl´–äI,QoN5ÛÊ'ËO XÚôÀÒx‘|À ;Zˆ`AXi&îPalÔ³¦„€÷´C*'+«Ï` õ™œxíá\ÏÅÖmÓ]~k¿Éz …"+¤ˆ‚(Ì'O<™y>«a,L»yvH»qêÖlêÞ¤UÛÖÈÈHñ™!k –"HŠ‚f–ÒgÂá0ý#IŸª6·©þ$ÇÈÓQøõ™ÿ"sÈ|º}aVXW ‹Þ åÉRìˆþ)Ù€1ÙÔ+Xôº¢¥Ïóq!2“¯L­%uK–W a$uè´h1 A–f`…b*ì™X,ÃÖšÛÈÉo§ê3Òà;_Èg‚l/|„EÏܪM†[ï•þqÙ2°Ün·¤R†»ÉI²—GVÑx`¡z…(€‚¤Jã™P$®´ìc†.;±ÀÂÂBÚ¤rôZóæåw½Þ÷Ì|hV⥠,Y;h,¶f³ÊdA ‰œL&'#ƒ"Èz–ËPeæR•,…–:LZÌÀB«1¥I©–Ò{o¤‡ mƒ•€Å*î+’(`!M<’8ú92Üþã=Hÿ‹+sºËå2™L¡¤ß—ÿ,ÃÖ-îÆXBˆXH±‚KpDtvvjAk—^˜€ ŠýDW…Ý_<ÒJ'äKø|>’Ü!Ò"T0$c¿ß?66FÛìWœõ¿êÏ@RH<{öÿýØþ?¥¿uŠÑÄ]#D––#H`1Um 3 Ío˜¸ÑñÍçX¢Í~…Ã(7Ç'£/t=V` aÊKÐF–v"ˆ,-GÎÀR-!L°`±ŠÐšõÅå72L•©™žSp ¡&MܵD$O0ˆÅŽ"¸ì.„4u–T›‹÷†_ÍõA2?uÓÐíº‘Œµ_E¨…"+DƒALž;{ä¾´ÂÄbc–Óßði˜µO‚4ŽÇã >>AíÆå/`ÑõƒÍåZ¯Dõ Q,Y݈ð¹é|›Ï=°<¸ƒ·Ã»˜ÔúOUÀbU°èÕ%.Lƒ((ÏG¢f‰VX°XExaö I¹÷뤔{B~X”‰»&3°A`©VA&î4´ Öëž•ü:%ˆUVÖÃ,O±3%`ñg_ÂE ²Iž|Z᧺+ngË›T/‰DFÃÝIQ¾M°ê\nƒ\“QX–¶["ˆ2(`!È®i/¿÷æv韞“ß Ý‘¹pÚÌ´¢t—Ëe³Ù .—«¢¢"mòû·ßi7ÉgB±@çøëDÿJ&“*û™z#cuËc>).Ìäýû!Hñ!NRXÕ*XiX@¬ù”q­9]+< ,A4ŠÊÀ ,7«ÖÜf×Ë©âI>þë3“¥)V™ŸºéOÑzc+“ÆbpŽ8¡<AJ^QÀ2|àOò¹H$9¿ð9l°l%c“ɤüء٢iAˆ Ê €…h‚cÇŽ­÷Ki.·óð'ü9d°š¦ÉϲãýÉ·•ÆÉÎ wÜŸï/sÉÑB‘¢µ &ßûs»n4Þó€Âd—Ëe6›¥½7ù!‹K”7†~MNV›ZIý äåEg`iÝK‹6üˆfÀ ,ÉÉÛS¹/œ›âQa2d[ I½ÊJ½{S»UóBr8˜ÊQ·Á¢|ܵ… kíàΨ`AŽ®ñwÉa¥©IÇÒæäUBHUâ8-Z°A`©‰û²=°ôz=Ëp;œ©ÄWºŸð†g CÀZXXZ„n –z–]7‘1ßûFüWÄŸz0þÔƒ¢w<¿ß AŠ˜äÉ”ð¤»ì…™i[qápÂñÀ¹™7ÉÉ­ÎCôå¤ ^œC훸kІÑ(`!HN®hv•Ùä]o(ñÞpú‚, ºPÂívgIØßò~2îõ¦\!òhDH—N(OFâE˜ 2°Ô ° GÖ[©Š•jskæ£T3°¢ >ž”‡:Ö¨ÃoOA4 mâ¾ì.„RsäÍŽ+­:9*ÁÇŸ?÷ó̶ƒÁ`0WÓ4[ÞÈÖ,¶5䱟}Eê–<ÿ* HI#.LóŽË «Ûs³êCèô+…BðZ߯‚|Þªs6Z·Ós”3°.Î…¼¼†©ré*c):p Žh­«Kp,sd[%9|þì”òüÌ ,Ç“u&aë d<ìïŠðAiŒXÈ%F³¤3°Øjõ ¬L«sæµ³co“Ú wÈCÀZ ZjÖÁ]³ADòƒXìh!‚«bâ. X,p»Üב“ï ¿šéx¥ÒvfÝ®3O çóyì¥D DVˆ¦‚˜|ïiÒy“Û´—ÞΊ iw¡PH…Ï=FÎt8èu©¥Ã0@ Ë¥DñÏö=øLï?ý&µØ‚-‘",Dh­Xð~JÀz!ÃÇ=ed`U;›Ëä=IA†‚²gaÚÞK&ô÷Ÿà_K³DòD³\âUxV09ÿÎÜSä°ÒÔ”i€y”.qpת€¥Ù "ùƒA,v´ÁU1q—,hµ^Ʊò‡Þ¤d|~(m¦ ù¼*nç ™'…Í XZˆ ²B4Ä䉔V åê¬5¶4RëdšP(tvìíéÀ¨tÈ2ºmîC´a‚(Š™ipôüÌ—Þyßcg¿4eýÞZ –¦$HDk`!‚(qÓŽ”€õFÿü¿îa&×äH$2>žúÖaæÕùî¶Z÷'*9îk½ah®G…NouôÀBEÄI*+,ZÀAüíô£ A~7éYÃ5¿ÃÃq\šÎU`~u"¢]VžÅ²,Ù“Ó³†÷¶þ9Yi:3ö¦–lpg2™è»î¬îŸÜ¶ë ·Þ bd!ñâ÷¥“¼ö2°$OÄà|âèT§ñg_$ã!û–ðÐÏçkiiÉìu ‘¹‡H$^ìz‚¶ØvÙM®H$jüôõ‘Ì“E‘¥) Ѹ G%Ë,ÕöžÉ$xá+¿8Wà.0 4—[¯Þ\–kÆþÖ÷?vü»"ˆ0%}V«@,°ÒDôO‰Q9+ž1Ùg•j¯+zOòœÿµéè9Ü[v‹]_ƒ!må§*`ÑXš-!D3°&‹¦Ï²,튰ɳ‹XçÆß9hOÏcµÛí´€•õ•1Ùäæk|2ñê@" ¢oB\˜f•™óDãðç_‰=r_þóã¶ÊpÙ&Xô‰Ë%`eÉÀJúÎŒ¾A;ìûõz½ª€Œ%y"K“í· DePÀB4ßï×l¿‰wTJÖòEøÜž<ùµë 9\ŸËm5›*wôOKŃb—ÿõ½e*:w-GɇuŒ 0u!ùÎ/²þHœ#c¦ºÍçóѹ÷Y÷0ÉmX„žö¾DÎ7X·¶Û÷Ic£Ñ˜¶òS-!\XRB¨Ñ¯N|–ÄbG ´Ñ&îj] «€E{]Õ[¶ñÀ\ç^Û:&¥ã'‰4éP(TV–sß8W¿”×#g¸ïÏ9ù’£…"+äÒ‘ïy½ ù¾ÆƒùLËÌÀêYxGXtÑòj*MMv»eY²r¹\™¦%¿8>Fôë—铇är«Ûs¿7¤Ðè*ÙhŒŒŒìܹs½_EvnØ^ùí/¬ä ]ã ÿô›ÞûoÝ’kÂûÚo]° 7p|çý¯×«`¡ÅX= 7B"bdAŒ…ãzî¨h9‚H>¬cù®£ùìa²Õ›½^of¯«\ÖIïó¤_Yg;TþiÌ0L¦]]id`áÛ°À ;Zˆ IÏéX&)ˆMðIAÔ±9Ý Û Ã0óóó© 1s™µz.4 !>¨3wŸ&“ɬMÓ`w‹>­)K DVÈ¥ "ßS˜O“¯éP>ÓÒ2°‘ï '‡Îàñx*++•ÒéúÁÿuMóÿýȶ‚^íúrìØ1¬"Dr¢ ´¼V¸nkŽ7·ç33‹ù|>²Œ»àgÞ¹(gyüýÓ=wï¯o«´e}àUm|üÄü‘9HÑÞ…w¶;¯d&W‚10 ã¨ç.JG¢’©l-ä×Ze´A$Ö1‚ÂÌP>Óò1À‚EË—˜î¼KNÙÌÙ¥1Çq™wkyd`¥Êp4kâŽoÃXìh$‚6“Ζe÷`4é²(}je~$ ‚@kRñx¼ÅµS°`4ÔC X‰D"í ápXùå±M»SÏ¥1wDY —"ˆñ?|Š>ôÀæ¼­ŽÅb³³³ÁùÏžeY…-ê49x$|.ÂË… zÖØjÝf³Ùjµæ¼Gš ¿Ú3#HúU±€ê¢ X¢‚ͨ{à®yN¦ zÀh;ðà;Ó 1ˆÄùÏþÇÉ—ÿŸk²ZÀë8Ãû·}ôñ?»ü¯ouòûý òÀºjx"`ù&a],Y6âô€ú$¶f³(ŠªÓ$¬wfŸ"ùö}y‹ñ2X|¨N§K»×b¦°.„Š·‚‚ ëŽÕ˜°B1‹¶»’ÈüHÜìÙóîØ Òx4Ò³Ÿú‘(Ši9#ªX\cJÀBw¤á/¼IÙj3~ü “cçÏ “²¬´?‘Õ틌7Ù.׳FˆÅbY[%~}˜¬˜n*k¯Î¾ƒŽ Å X²š¸\.ú;雿»ë?”ó~_éžywÈ»·%û–Ëõ[ï|êÔOã|BIß`ðô&ûåÊϵIJŦAŠazŒõ×üãªÍ:ë¸ÚÎÚé3‹%s“çù±HÏx¤œ¹Òs3ˆ)å83Kµ~–f`ѾA4ý1TóqÏZB˜v¦ÊÔ¢ç >ÄÜBbÖ¡/'?MÛ]ày>šL¦\ÏÈ6î"ca¼’qД_$‚h ¾7åªÎu\¥:Ÿ–‰yž!×ÎÉÀJЉãsOOFS›|Y:öûý'×s…bɇßHÕ~òª"K¿BeTöœäÒpìXaeäÅÂÇ6ЊÕÔBº/#Áftî©9LÏù_S½8[žj$Lô,÷5®¥ÁÃ:FP˜I X†þ­ñž²þc«Ú †%w8iz1ˆ¢(ÂïQr¦ÚÔÚh]âû)`©¦_ÁRw‡VMÜñmX`‹DÐJû¸GU|Ü3,ƒÁþéšd:ª/#‡£a•U‡rcó0e òA2.ŒW¾Ú¥D#DVÂ%"ß›rpçÚÕÍ­Òú$ÐMÒÎK3ý‰™gƿ׳ð6ùQ•©Ùm¨Îú(š™Ð¡¿õ´ü4é¹»÷Õ«>Jkøýþõ~ ˆvA Ñ%\êLgíΕz ~`Ç= È{žóñ‰˜R¨¶.u[.Œž[ÙË\)%Á ÂzEPŒ…Ä…iù€Ó±¥eVš1D¦ð$B0áŽK‡ 0{ËoI›“YB˜OÖ’B­z`áÛ°À ;‰ Í¸¢ ,£ÑØÒÒR[›Ê‡]XXØQ{€öÞA©¦[ÕkI¡–l°4Ad%¬yE‘ï{“qר>Bò7 äê6.­s¢|ðé±ïÌÇRMÆ9F·Ëu}ö+ â?>Óûà3½>Óûw¿êÞûµ£g.¦ÔŸÛ/«Q® Ö&###꓊F·‘¤dðXS9#Þ°’€µ©nëfÏå½ór_¯0®P!lýv2æ×[ÀBå!NÂbí [ޜҷRš1Df«ižçCgÈmU¹±¡Ì^¸òBÍv!D‘°'L¢ IDATÑ%„Ñ‚,–e¥W¿ß/åR‰¢Xgê`V²œOŒ…{ê-9Û+«7"lÚ 'Ÿ–ÆÂðiPWD+c]bPnÓÉXÝlm‡ò|ÈÈÀÊ%`IëœÐiÒFúòk«>î1Ôȇ½Ãýr×ô½Ízµ] Îüm|5öR@À ,Y[Ü”€5Êž0Lh¯ÜCÆãÁ~åÉlCê;I˜è^e…Š „®d*Z”'« XÉdr0˜ÚÉßR¶/ó"+/!tjµ„ADb…XäS±º:U²˜‰î©KéLg|G!7ê>îMÍÀBUøžT‰"×~0꫈<,iaÓ·pœœi²î¸µîKê•^¯ojjÚ´i½Ãýèñ±¬—º{_ý÷n.·¨¾6).PÀB4Aggçz¿„µÂcM%k(—@³g+úûfcu3.y71aJEðZSJ8‚„õŠ @µ d+W*`{çbòJŽæ†=wfZ¯¼„P³Xø6,0ˆÅŽF"¸Â ,rÆl6““ñx¼Ý|ˆxLG‡i{é4TKYª„PÐR#BDY kÄ%Xy8¸CÞ%„Ñht66êËý Y†=P~»Ôyjkk[[[iõ*žž8‘Þljc™ïÚñÈç÷Y¸ß†” øgh‚ÆÆ’máY’¥"`5x6ëYCBˆ@(±0«°×)Ìçv$}r…¼0zŽ­Í™Ì¿Ö”p7ëA‘jAȘÇEQ¤%ªw†_"ãFÇÖ¦šÖÀ\xff†~ÔÊK5ë…oÃXìh$‚e`ÑýÑ$HV0¤Ï›xg½uËÅì¹Þé{¥ºº5ë5“Éd,3¹ž”­ncL6110+zÇwö´—DY kD¾‡vpÏ"`ù|>¯×+Ýn·ËåÊÓÄ=‹õNÃçN3'÷_v¹\™_ìš&7e6ÃgÞ× 7l¯<²­²_Hs;v Ýè\ €…h§Ó¹Þ/a­pçí½¡ÜØ0¹ öMQ°ØúíÐù‚4.ž…}w®ìÅ.ŸŽàa½"H—š%Šb<§oNŒ¤JZ¶xö@ee¥ª€•O ¡/\&îø6,0ˆÅŽF"Hw! Å îB¨ð©¸Óy-°ÆÂ½/MþÔ¡/·é<›ì{ ¬™aqÑÖpzzº¡¡!×u€aÙúí|¿Üd>­Ó†€¥‘"+a-‚(ú&¯= L¤’Çu®õÊ´™>ŸoppÐçó‘Ö––îH±#PXLeö| Ò[šF°â|l.890sn6$'ÒsŒnkå^(++ã8Ž~`</4KS) vôÀBDÛÐ¥C¡Â=°>+MMÕæÖɈ|1,‹Y1!´Çý~–eÉçíØØ˜ÝnWhGÃ6î&–0rö(-xd}Iž;{ä¾´“\óå`0§ôz½D½‚Ål¬î(`!Eˆ8“o aZú•D,{oâèO^ûû´óuæ‹ÁÇ9’Éóóói{³ªV0–ä9§ÀbÐéØìKIA°Z&în·ÛçóÑwã°Ëu°½wv¹®j—!‰x½^‹kÚM¶õ„‘3Ê/AÖ—¬¢\û¡|+Š"ÉL”È*`y½Þ®¹Tqâ¡¶r¬Ò­úoÎLƒÎj§éšöò|^ ‚;hâŽh‚cÇŽ©O*N °LÄ!uÔÛMDæ³uÛ`q[F˜ìƒ¤Êõ׎Žàa]"(.ÌH(À˜lŒ£Bar.ëh÷™ç[í{È-™^¿¤â/úŒj ¡¿HZâÛ°À ;‰ Í”Ò¤‚Ñ‚KÉ—ËÕÒÒb³ÙèŸÖš7WÓkÃÉ…áÐÙ‚^$Û¸‹ŒùáS 3/%‰ ²Ö"ˆB¶?Ñ<ÜÓÔ+ÈðÀA|«ç¥o¾ðg¤.«¹Vù²?gIý WB»kØKQ@» qdCQ¥Λa@úæò…‚(²92@§ÓY‹C_îOÌ/ðƒ³][k®È5Ÿ1;زav€O=lÃÎUÿò¡„#¸AX—Ò-™Ü%†g{gºÒNêYc½eKÖ.Zòs-}ªf`-C BÀ·aI€A,v4ÁÕ2q—ËUWW×ÓÓCOøPÝ+ëÊÎ]8Ùµðú`Pî!Øx³Å¶ò†mÚ ¢ÂD¯ 1Fkþ_#4Ad%¬EiUÃ1&;p[Þ—9Óív_¼x‘ÔÒr—&@"‘ ]h’|üß|±ojI†W…±ÁÈ;^O8Î?}j’–Xý öR@@ AÖËØM:©…/ˆ ‘¤Ë’ó˜eYŽã*MM’€ýÓ °uÛd @íZ/ A–Á’úAE,ˆÅb™'ß{‘Œ=ÖªZk×W˜tŒžÈR™æ ÃÐNêXEÑ‚A„`7¥>©‚Ñå—JdµÄ®pUW˜/ã,CÁ3"ˆ0Šê|¦¤\3È0ŒÛíVx^Ædg«Û„‰^FÎp›*¿TYDï¸èŸ’ÆŒÑbúý6çÖ—Óé¤S® ƒÕš®ÌŠ¢˜H$ ÐhÙTNAZã—Ëåv»é6Õ ,ÿ’ ,ÜøADëÐ]—á•vÆjµ¦Õb€Á`Ðét}y­e399=AÆ Ã(`I°Í—‘±0tRy2‚¬túÛ°KA½€h4*9!ÍÁ]B²ÁêŸî|æÌÑç+MÍ×V}¼Ý±Où% Î†Éøúm åRb €…h‚ÒvðØ ¶Á"‡ýSÒÆf.èF„Âhaö«HiGp#°.\Ò‚°ð¡à™hR^À9Íe{®¦» ¦y¸4/ÒÒÒâr¹èü‚¬¹]4Å’…oÃXìh$‚6UB¸â ,p8Ò«™ôz½¤jmu¤|¬O޽åeA2[Ǧ?5%`ñÚ°4Ad%¬zi,¶yòäp8Lfí¡ ñx<žŒþðÕ¯ ¢¬vYu®[ê¾xsíç›­;Í&³rãÈ\êYšË׿öA.¸“Œh‚ÒvXâãT°Ü†*=kJQÆü“þ‘gS®ùl-`­[ViGp#°>Xt a•J a¦€Õ8NÆWoþÇêèMNú–Ìårщ>ŸÌœ ¿0X^È´Ê"œJ51D,dMÁ ;‰`AX,˲,KçŒdJZ‡cnnŽ># X‘H¤ÞÒáЗ-$æ ÁÇßó>Às;‰DB9Å•m¢3°ÞSù­. ‰ ²V=ˆüði2æUŒÞÒ,AÒ,Û%‰Ä#ïüÛÔÂEéæ­Ÿ²'«¥ÃêêjåÆQoªËS½;ç¦H9v쾑\ €… kŽÇšºãeù£ÑétL…±a<Ò'ùÍ;]×v'dTBI°õÛR¨S C©}!¥ŠHe`±ŠX<Ï“õŸ”0œŠIg`wÜ.M#Q¸kòz½äVíäDâ»o…üy¾f-w!D‘ KC1•4(à8ް23°2-iôzýb¥6³Åqð¹§¥óݾ·bÉÈ5w±Œ.kåÔ’çmM¹|òÏB2:ƒÂ|YV’Ùvàb|ä§Ç¿~nê-ræÈ¶;ë~¿¼Q-¿¦JËJmåꢖ"Èšã¦2°¼aõ ,h°n%g:' ú|¾´ùŒÑÊV4Ë{ì¯ãO=ÈŸ}i5^8‚¬%|R˜“7aògœ zñg4Y¼;ÿ 9³µöŠ*G=,°2ûjee, ¨O¢Ðr‚ ˆ„*! DUvÎ CñÏZBH7Äà8ŽabŒÕf¿ÂÈ¥n¡ƒ§_˜ü„ËšxBÃØÊ˜²ù ÆÒ»Ê"Ⱥ#ÆBÂd¿|À°ªí’B¡PÚ™4§‚ÉÈÀ¯Æ¾E«WUކßÙûÇô4£Ñ¨ü,¥…  €…h²áP’”QÖœZ ¡´l±îfùí9ŸðÆ'Àçóy½Þ̇°uÛÈ8þëŽ=r_ø›/ÿhå¯<J;‚KAaþ"ðò½ 㨤»§û|¾ÁE$Ñ–°]ü©‘əÃí·Kƒ<3°h..*`i7 ߆%±ØÑH­T ažX ‡hUKEŸÏG,kþ@Íçœæ22a"ráíÙ_© X =,DY «Daø4,ÚT±5íôr%+ÊXÞøäó?%SÒ&½ùÿQg–lÝ%”,A/Χ¬Æ2‹Ú/ ¥ƒvâȆbdddçN• âÅM•zó*!g­1m‹ôH'‚§®ð|fff £–mØ'Ÿ^rþøsbpÎpÛ}«ó;¨QÚܬuÅà\âèCôaf˜ŒéúAI½"Ɇ>Ÿ¯¥¥…,þ|ñé—»ºKY±8MeW6_+ó°Ün·Ï瓞bt!õO_ÝTéPÙó¼js™ò„u߆%±ØÑH9–1¸Hœ^#qÞlPÒôU3°¼^/ý+‚×ë¥+݆ê¯|ðÿöò—Æ}CÒ™ ÷.Ìœ­¬¼^ù¥²Í—Á‰_É—: ‡?­<­ÑH‘•°ºAFÎ1Û¤b€•H$2u[’Z%‚øÆÌã¤ÞJ-å[ïØòGm•;ãñ8)ãÕétÊ›pÓ ±xRžì²èéŒËÒ=°JíÏ)RJ{­°¤„0.„Ò`“}ÏRë&& …B!¯×ÛÚÚJ4,ºa QŒýì+¢wÜøÉfÍs-K;‚µŽ îh쑜r*íàîõzéRY)ñ0‰@(é{aòÇ¡djgÕm¨þƒ½£ãä·X.÷4¤¾„^¯WÅñ`jaúßÝI·\(:ðmX`‹íDÐfÔIcÉ X™D£Ñ´<Øî¿å‡_ýå§gÂc ‚øT×C¶]Ëd,BA˜­¬¬„´ ¬Áõ÷q×N‘e³ºA¤¹¦‚ °€ÊÀ:ï}&v‘œ¿y×ï]×|WßÈ?ý FæRéWM¥˜~…ꢖ"Èš³¤ aÞV£u»ž•¿ÀBIñ«¿ßO×r[®1Üz¯üïƒJ›¸ÇŸûvòTÊ*AÖ ¾ÿ-…Ÿ2T–(Ši?F£óóóQ>ôüäOhõªÎÜqsíLŒœQî¢E#iXœ£:šRn3µz… Bc£’2‚Q3uÚ4a˜<,ikàóùlFç­Û>KÎŒ-\ømïSiôù|ÝÝÝçÏŸïëëóù|KޤjµD##©„l-%¤ìÅ@bþ½ùçÉÉVÇî½e7÷öôÅb±ÙÙÙ4¯Oåg™O=Kƒ °f`!ÈšSxBchs_v~N¾í¿::Z[[uör10 b4{ô¯KzÇC`«7ëö~Dù·@ÕGà…‹äˆËÖ‚p~~~ffÆ`0@ DßœýeR”·±œy¯û–áaÙKa``Àãñɪ`!°MPÚ¥Îe`KThµí&Öp¨ó@Ùm,£þžå¶\£?ò‡ñ§þQ:¦•ç¯ ¥ÁÀÚF0ã‡R…!†›ÿ¸%½ü¸ŽÔSÓo0 &“éí¹'g©¬û-eû8? Àe-± ÷Þ© ·WÙòyˆ–Á·a €A,v´AÚÇ]5‹þÌÌúùI*¯¥C·Ûµ« èõú+=¼:/Ý«¢Þ/?öÑì¸ç¦í¿k6ØÒŠÄ¥ŒòêæË’/HgâOþCö—Èr–ûžãvQþEVŽv"ˆ,›•QïNžxÄOŒÉšã¬b\5i3}>ßÀÀ@ ï‡åê€<îô“Ã+=2s©m³P(D/~Ô¬¹ÏÀòûýNg!A,D#”öZÁc[N !”sÍ&ÎåCã#‘:K;˜Íf·Û­pÆYEÆ¢jy/» J;‚5 ?x²ÌÄV´?ñÏJ“ù%™ƒaÅáÐYr¦ÆÜöá­_˜—ÿ°C¡Ïçs¹\y`ÑôNRVuÑ Xø6,0ˆÅŽv"h£¬XV®úA—ËE7€´œ,ie¢Óé¬:×.÷µ¤Z*>ñÞž?÷³ÏþšjÓ.ÇÙæË`QÀʉÀG¾ûqë×ßcÜéWX]´AdÙ¬<ˆ|WãάX^¯—¨W-‹\¢7pœŒkÍ›ÛìW¤M ˜G a*«ÁS‚XØKQ=°dÍY’,@Àb€i´¦ Úgb#ò=ž´EdŒ£’Œÿ¥ÈÀBø¾7ɘk?¤<9 Ò‡Ñht$ГdýË¢s|¸ý­–Ô¾%Ïó]]]çÏŸ¿x1•¢•k 4ž%–"R:ä•€•†”“Õ¼HKK‹´2‘I¶;ßçЗÓóC±Àã'~yÉÉÉ9K]>Ï(ú§"ß¾x•ßAVŽàÈ<ɪ9¸ç"Â.†Ï“ÃË<70îr@ïÞåQB˜ÊÀj,+Á ,T¯0 AÖ‹3é¹h‚€XRÇyKîf@i7ޕƦ^xGK*³W€°.M !‚(@`q›*O¦w2 ™LžLé_›\{:Ú¶¦•®Äb±ÉÉ%^oyg`QXÅŸ… B((‹î€–?™9Y°(`qŒîÖº?é ¾u>ðz0&7ßžë™MŒ0 C7ëa«iØ÷)—Ë•õ¾]˜H¾ý˜4æ»{ô¯hßOY D_VKÅÁ=ý‚(ëSe¦Ú cc朂,º aIf`!ˆ(`!š ³³³´µv·U?á“¿™æCq‹!çn‰N§£×v¦Ô—ÜLô"€À¤ÕXeÂ:/µ€Uò,yÖ4‚t«˜‰D2Òïž¹Tëý›Ž¸\®\Þ+„|¬h‚'K@–a6UZU¢qðmX`‹íDÐfJ} >qb|ÌÍ53‰ÌÎÎ ‹eã¿=m6gY¨Üµ·®µB壒ìÃéYÃçáÏÜüåo¿tßÙ±·¥“¯ôÿòJói‰[Ë/ìþ¤”ƕ劢ùÇ@òô³òä§ÿ‘ë¸Jwù­Ê/cÙh'‚ȲYyEï8ëößÅV¶€nË5™3Ýn÷ÄıãÌr)éúÁ]Y.KEde+ž¦m¦Ö•½‚”*(`!š ±1Ë^D)á±&|òÚq>¯w+¥ûêtºDBnVèЗ¬¸ñ%f\úJAPi2½$ë’”–|Kžµ‹ 03Hv2“kPZS¦ÕÀLìb8¹ õ¬iw³J—D>VÿtHXTŠ›Ê-&}^I[Z߆%±ØÑNé ¬_žÿå‰q…É\Èz¶ÒaT°X–å8NÚiEQÇn¿ìˆ€unâíÍ W9õ¼†5ýÑ…þòrqî"€(FÿýÓÖ8É”5p‘¼ÑN‘e³ò T–áCÁµíÏ5ÓårY,k2r!˜“Æ£k¶ì’³,›ÖÍ&Qo„¬^j\&ƒ®°—¢À¥ø‹¹óÎ;‡Ãá¸óÎ;i›’L˜ .Á+DÖ’ï4QP#Â4¬rc=9œ‰Ž@†Ëu&Œ£ß;bp•ù+§ä#Xò¬]ùž×ɘmÛœÒÆIZý Œ„ºÈ¸ÑºÅnu€Ûí¶Û•,«òñÀZâà^ü-߆%±ØÑNi¬ÕâÂt(Ÿiôíw"‘h¯ÚÝZ!zŠ ž÷¿‘ãq9aìåæ?ýè䥔œóþóCú醆«…v"ˆ,›•‘ÎÀb=*mÊûÊtúU³m—˜P¹ûÎÃ+U?¨¼#^¼ z…(°æXÁ`ðúë¯ÿô§?ýÐCÀ÷¾÷½#GŽœ:uÊbÉY¯KÆ#Hi౦só!Å—Œ{ï cãh¸GÏDG6Û¯T°€Ó1V·œx18Gçd!È¥„U °23°FÂ)«½ì iWÃårµµµy½Þh4:??ŸéÞ’OVm€US ‚ Áj\ +ý#:+z½>•³Î‰„Ùl¾qûÝÿþÊÿ‘/8:GNv8÷©>yX)÷¦r4ÀB6k.`ýèG?:pàÀý÷ß/ÞÿýçÏŸ衇þäOþd­ŸA´ƒ›ÊÀò’¦&2–|ÜUK€qTÊ€èŸF Y/VâàîOÌøãr , ÜκäGÄ<Øçó={–TÝÊO”‡€ÕGe`m.‰ ,AÂUme÷ÞÜžÏÌX,æóùH ”Ñh¤ýÔ'üч_—{Èä™E/c$[Ãv÷6½+˜ð@BˆŸõ½vdÓÝÍÍͧN’ö­EQt8Ê—5ÜüçãOz_‘=ý/AÿK³vk)Œ­ ,$DÿˆòJ›±—“Ô¿\ÐõƒMMM Ã$“IÇÓÕÕubæYA”=úŠZk[2¡ÒQ3°D™5°žzê©ûî»>óÉO~òÁD ¡)ùRgº„p.X €e¬gVðƧbL=Kª"ï–Æ—Àǽä#Xò¬QÅhP¸Ø)0 ×v@ar,“¶1g¢#§}/ÇÅH(‘*©6·–»«2år¹jkk‡‡‡é“ùe`¥¬Žj¥‚Äb߆%±ØÑN¶y¶yòœìóùHs ·ÛM÷õFˆ€50³œBXð:ìNÌËFì¾£•sÕ{öì1 äæ?›LŠvÔ üè7lÿz“!<—çïE#Ì«OÒR‘e³Â ÒXŒ«Fyr"‘ ûÊ:®µµ•üh:>Ô8A;û£Ål!‰‡.—+ ¦õ®)(«±¬4,쥀(°æXçÎÛ½{IÏÑ]»vuuuåšÕÕÕz½¾¦¦æãÿxww÷¿@D”üZÁM•zÃ…•êY“ÇX½x$ÎDGò°.m#Â’`ɳFúß^^™±µ[›ÒÝÔÔÔ”48í{i4Ü=%ýä§Öm¹|¯**Òý€óñÀ¢KÛ«K! ߆%±Ø)Òº\®–Ehõ ê\f³AÞ˜ Æ}jkÈ&`@‡c¿ž]4±ñ¥¡G^8÷ó¬3¬žÁëÿJd–sÿ"ÎŽä3­H#ˆÐ¬0ˆ`ÑõƒCj»:ÎÇ^ÿ¹²1ŽK_¹ÅyÐ`0H­6Y–mllliiÉ\Ø”Õè)ÍB쥀(°æ–×ëõx–ܱ”••ÍÏÏçšÛm·=öØc@àøñã{÷î=|øð©S§TŸ%Óúa˜¯~õ«ÇŽ#s:;;ýþÔ½ý#zì÷û;;;³þ¯€WXö<ÙJs]!³ùH…)õ9N X ¯a2”¹B“Ãùÿ€WØhWxñgd<ëHmKf^Áçó€7>9î…¥0À4Ûw¾÷Þ{Y¯`·ÛÓ:~¨þó¡8É…4¸Yãÿ'ñ x¼^a]®pölg3å³C’°”V ““dßààààà૯¾J ÚéßÂívk÷ ¾wr÷=ҿصd¸õ^éßôeOë¯ú¹>ÉÀ*ÞXà.ÍDê˜qV+_®4ä5û¬Â†YóßAVÈÏÞ½çßåUÚG¯¬{ì‹9ÛñÀðððÀÀ}fšë{¦ïÇÒ¸ÞÒqkË8 TŠñÇ¿{ü«ÒØpÇýÆßù¿Ë{å²lDßdøn$%„¦?ü±þÚÿE~záÂQ¥Z?·Ûíõz‡††àØÌctʽD…±áîŽ{÷îÝ›ë¹Îž=;3#¯yÎ{¹9p*8ûNø¢ßz¡_ï¬wœù»÷/ãDÙÜö­7Ÿ:%Uýü û~g_½òü‹/ö÷˰F£‘^óODú_šüiR”“­lׇë¾Ä1:hjjòûýD·’’ÂÒY›Ñy IDATÒÁ »»{bB~1,Ë>|Xá•=¡¿Ø"O®h¶~kPíwEˆ=þÕøã_“ƆÛÿÒx÷ß+Lž˜˜ CUUUÛ¶mKòñÇßûá³ÿ#,imuÜ_v;TWWoݺõÔ©S»víbY&''ÏŸ?O_ðòË/Wî¢èþâS$râ_o®v*Þ"È:±vnu/G‹mÒ+v»ÝóóóUU)ã’¹¹¹´œ,>ò‘|ùË_^݉hc¥î8àYA !4{¶’ñLôb’W1€„K^BXò,yV'‚|2yîeaød$‰†‚¦·fdû&Ì üà H­¦ÆÇljïƒÏ瓾>ÂüÂ@ •u{UÅGëÌíάcô‰DÂçóÑ73Çúæ^ï“P¦§}@ÆÂk#ñ…˜0›ç«. ,À·aI€A,vJ2‚­V2¾‡ ½o¶c]kÙ|÷Ž¿xôÜ7B‚q__àøÇAXXX ê,Úre Xô½† ¢(*lõ³eÀ0 Š ÌÀ«âX’Üh¬0ˆ¢—òÀr«x`Ñ%„F£qx®ç‡¯~mÔ{œ´êœ—{> ¥~GG‡¤^@f–²ÜB$AÔ+£Ž­r z…l8VYÀʔٶoß~úôéo¼‘œ9sæÌ¶mÛ–}A¤$)ùµ‚Ç–*!œ/° !Ô»[,{8€˜öF¦TŸ‘n;(úÑ QA9‚ÂÈ™äéß(_A˜ìOB Î æÊtT_q04>ŸÏd2Ñ®¥ä¦¥ËwL¹úÕmªÚl¿@¾3‰Åbäf&Kþåãç¾ó‰ß¥a€ø6, 0ˆÅNIFpSeJÀÈ£a¦¡²²rÛ¶kçáâo:ÿG:Óé{µÝ±.OÈPÄAPêÚa03ö yOˆÞq¦¬Aùú%ÁÆJ=°(wÖ]«<™þƒ $ç¾ýÔ_$ùÔ:Ÿæ@ùzF¶µ’þVéôp«Õʲ,±g†6ÒÊdI By-ë´ÖÔ‘VYÀÊä–[nyøá‡iëᇾí¶Ûò|ø£>zÕUW­ÍKCKí5_`B0™Ì­ÛÎŽ½-އûUŸq‰€µöXHi“<÷rì‘ûÔçå ܸ·ïš{aq•–HEHˆ±ž@ÊeÝA”2àåßK¸Ç¦<ç‚(þø·Cyvsχ’°AÖZÀÊ'K¡†tëþÁ©ëq>¡¤¯áD»c¹‡'dÝÆN°xžWn;Ë–7ñ‹« av˜S°D,¤ !ýù|ÿÓê•ÓT~À}G¹œÉü[õûý™&ž1ÖüŸÇ²7ͼ0j ÜXVšî€:2¢Èš XŸýìgwïÞýõ¯ý _ø|ï{ß{ë­·~ðƒ tyä‘#G¾ð…/\}õÕeee£££<òÈ¿üË¿<÷Üský"d­Y"`že4·Õ^I¬±p $ý8+—¸„)mÄw™d؉Ë/rÝÿNø¦%„ØpèloàxBˆJgì&ו GFGƤÓ“‰½ˆŒç¾L §‰½eWU}y^µWo.Ïg‚ ÈÆd‰€µ‚ ,‹Å"•;Íe‡·Üñ¹ŸKç;ý¯¶Ù¯dYÖb±„Ã)ƒê¬>†™–ò‹aÊaà¸4fG¸Õ—ltª ¡ª€EJ'#ç&ß&ç¯j»ùHÓ=#ƒcôä̾×ë¥ÿ†EQôz½ïÌï{ì¬êëlðä4úDfÍ,»ÝþòË/ÿÙŸýÙ<GŽy饗¬VkÖÉ÷ßÿw¾óÏþó~¿¿ªªêúë¯?vìXG~Õ”>~¿_Ù°°Øq˜uËð‚ÁX2Á z.§ü”¹ò3;ë†,Ç­¿Ã´ñîˆ×7r.½rèv»«««ik^—ËU]]­ôY—déŒð–J½²šì÷¬ÿ˜Óênkkóù| ÷Dè1 ¿}GÛ7~}³Ëz#¾ÈVø6,pW;E9ƒVÛÀÛóI–gBÚ½/²–rG÷tªpÖìëúÐ[¦ìžö½>ëÿðºÏѧÐb–BfsCXóH³CÚƒ¡Hg°ÔXÌ$Êi˜ï•Ä8+Àœ3\Y–• ¬«s'g㩼-˜'vÿL¦’kPÀ:>hhÕ°ˆKÑ Ñã~dEP ±B…Ó2;ï~å Å XV«`šËÖ_ô¥’“{Fß×°€awìQö$ÿ$[ÝZøÝëQ 3XÜhÏ bÍ®`¾çwLÛ?¤1XUôQ___WWwåÊr¤¶¶ÖáHE]Ãá ¡ä‚•Æ&¾ëC[?í´ºÀãñ(Ëõ"—n)øÈöúõõeÜR·¯Kÿ€oÃ"'qµS¬3ØYë"îÑ}S:Ã0&“‰îÔeee*¯Ÿ‡¶~úË¿¥Ô°ñpßwÎü÷;ªŸlp¤j/B!u¹b¦€•g–¾€U¬3XR,fÔê9¸' Y–E9qÒ›v¼¹¹ýÞŽšMMÉÍ<Âó¼ d‘Ïãñx<ü©kéUÀß¿·ÃaÉ.{ÝÖY¡óŸYµ z…h€‚Ü ŒÛ`±,Kw$Q,h)Û@¬ cG³ŸL_§¼Fœ°äÀ\O )nä`z1qê”æ©ê;‡j…Üjµ’6½þCäxWå¶Çwþ^wS–¸“~ËüÎmm­3|ï‚ Èbi¯v¾Ý;­l÷ðq7›Í*Ëív«ÆT¹ê?»÷«ÿñî׈ûa\ŒžùÅ£Mdb̰TX•T–B¤Ä‘…´€Åò†êÏ o‡Å”ѧ™³<¾ë Êv¦\•™åñxH²9ðî…f`¥m°¤éAÝñH)#ÓX­ ¬co ÑT}˰ÛöÔ².]EÈq£çhÕ7¤Ü;ª]Úã¤Á ,dEÐÓÓSôZûžµ•O}p-}äühàÅ3©¯I_8ý›?³¥.Ïó t'dØz[ç`¨GyèèÀ›mÕr=cVw,$ïÁ¼Ü![ a¦‰ûéé·ƒÉÔe9Ö|g÷£\ðîp`ý`NJჴèÁI\íñ vÔ8½©Oã¿}éRS…#×ÈH$2==ý`;ë4§~®“v4™P¹ZÌîªG^ûd&…7'¾ÿ¸ûÈHY–Uß/`0‹jD(Ï i.â,3‰’a¬ ãÇÉvWÙîÖêîÌ1*K÷ÙO ¦Ó¯¶7{ÐÁA2A Y477ëZåÜÔÊßÔºàÇÿ/NŽ‹ÎÀÊl©«t'Q¾ùZœ›ˆ€õ~ÿë¿¶ë ¹ªi,)0Òµ3Ò|èÆXæûOㆣÑèÔTÚú㸪ª*«Õšup,³D¼‰w¿¯ìÊ(`­64Þƒ ,MëUVf a$zoø—d÷¶ÖÝv-] ° R ¤ENâj§ˆg°½Úyl õuð­7ûµ@ݹ§9õ‰)<HÔÚZ»Ý·\ VvgbÿøÎÍ»nQâœX,&˲êt#Ö‚ ,½F„E<ƒ¥Cá“(Kt«Ù…°wìÙnsmÉ!ÓVÖ„*ŽPXmúK†ÅÊÁƒÑÉ XÈŠ ¼¼|¹oaà)[wU ¡ª¥®‚"`59×›Y‹bä M^ž<Ó]—ÝÍÍèB˜<™V ¸-÷[ŸøšÆíEýþ‘“'ÉnEEEûÖ­¹[dï°¤)ýÐYQh¼éžMº-Á€‰û‰É×"É9eÛÌZ?°þIí úBT–¬œ”æi‘“¸Ú)âì¬Í¯šéÌd’XÆ2°vW><—ðŽF.)»ƒÁžŸûçÇwÿ.ÄbY|8”²Uyd`ñ –O¢<7â¼ç¦“KöÎE0=76LåjqŒ©ÆÖ¢úKV b Bã z…h€N"²lÐ^ÔôOô\(ñŸ‰±496’ƒï÷½–k<ã®!&«òÜ4ÈRòdº~дãaí§ ™Ï®Ã7oz98+‡íñÈjAÑ–Îz ,˪‚A•€ƒg½ûÉîÆò}¼«4™ a‚ È2Ó^³f0+g&“úƒf`˰wÖ>YiK—n½|îé÷μ100@2ÓiŒ Xyd`!¥Œì#ÛŒfú]?Xck±YìYý­è ÁÌüAõ³Ë ¬]%œ… `‚,´€eÐÄ]ÙhwmížR¶¼ùÉ[¿Ä±ÙÞËf+cwËa?€˜”Æ.‰ýó_· kÚú öÓùý~zW¥JdaØêVi´WÙ“&û¹¶:§ «9H—ê„SÉdR¢©JO{_'Ííœkcù^ݤú¶Ø‚Ad9ØÓU¥²òÌDøú¯®H² }^q..—Yb噕€Îöѵ_üÁ…¿ ' ÉÒÎ|óáÆ/:íYRÀ •òk€3+™5òÜ4Ä#™5H)#ùŒ`ŸÔ½žOüó±@ÐàìlåKÙÁ{)  €…¬Š5ÚÓ¦ÌfæXF”dÆ’II6±Z_VDÀbn-¿óÌô;ÊîgÞêÞ”5ÀbÜ50qEÙNø>9nÚþ!í{‹F£™VÜã•dkÚÉlD¸ºÐxÒ&î gâ®ú³ª„0!Åß›ù @êWŠÛ\¹Ö½›a˜¼2°x'f`å¤4?H‹ œÄÕÎàëª . ÜçÚÚ´Ç3 c6›éï†a¢Ñhƒ½»Ë½ër µæqÁ°Å¹©ÆÖ¢:Ý€¥ø¸+@üåÿÅÖ伫͑ˆïü£‘ˆ²+Øí ÏkdÍИïø-Æ­SÜ ~&{Ò¾ ßkظ08K…FfÖRemÒ½ò¯¡?TB)`öR@4A A– †r»ÙŠ€,ƒNTiúûÐ.TîíDÀº8}ôrßŵë25,º¡H·Ô5ÀR¥_‘B¦¶ƒl£{ñ@w!ÔóÀÊš¥üÀ8>ûÒ\‚Øi1·WŒÎHS/åUX‚ +˜;º«þ÷kW•íý§œ¢°L&“’·²«ò¡±ðå`RäÞ_=¸æóªs”[ÕBôƒÄ›ÿ¢5 2ã`÷ø¬çÖ´›n~ÜØXdÅ!‡…äñçÉ®i{–Œ?…ÞñtÿÁ[Ë軳_š5d G¸©µ¤,쥀h€‚,'‡™ü8Âqm‹n_Renrš<¡¤ )~vì½êŠÚ,ÕˆÀV5³-9û *d X¢(ʲœÕ¢2}eZÀ ¬baa¼,Åk,rõ2U<¸Á}[­­ Œu•öbBAU¾î*–a¬³Ão(®»ð`±XB¡Ù%ß fÆz{õÇ^ÿ¶RH8½—"vA2”á ¬‘Ð!öCkõ’<ü$¢Ê6[ÛÁuçL㢬:[;¸\®L£7žçAA–á*•õû÷v8,:š×ÞµUùÞ?‚”(`!+‚"öŒÐ†wša~yR׋°dÚ]Ûz„ýÊîEÿû÷ÀG3OÉ*`qzõƒ‚ LOgY5M$™f« óXiKžBk5¡å•OVf ¡$IÉdòØì‹ò|ñ`¹¹zGåÊvÖ¶Ó*¼AìBhˆ’ý -&pW;8ƒNË–&·RE(ÉòK3îÐ2Æ w·ÛÍ0Œ PoאּÖÏÆÆ@y$|¹Ýµ`ÎxV^ÿ‹ÂûŽêB®?…½ ¾G¶Í{? 9–le{ÇO’Ýz{tttd®"{<ž¶¶6ŸÏwÍ Æç]Õœæo>¹µ”ý­d‘ €…¬J6Úó8ÒA›/”—€%w•í:'¼£ˆÓ±¡‰àµ6P{:Ð%„m,Aúûû3eH&“¹¬”VU+0¬b/ÍŽ@"f«ö Y!ôÀ* K–åÿ_|"u`öÔ¢^ÁüjÒÒ XdÙÚñÂÛÊAôq_EäzÊ‘ˆ©ygl.àtô¦ÌâÓàé„”:èàÜ Žš¦nV(–Œ%S ì63§ë{ZÊ”ìi1“¸ÚÁ„ ¬?ûéyãçZ8æž@ ²2Ý c¹uµ;ÎŒTvG#—êËÚ’É$ɽE‘^á[$~¿_%Šé®Þq»iË|ço-ÕÍ …¡ý6{÷ÇžùJ®G«Ó´û1eÛçóõ ¢ÑèÙ©áDꈅµ·;·€v–,/°vµé,"¢ «?A®?CCCË} ËC^X èB4–aé|–·zJ?zíÚ5#9S*xž§5Z5ÓX„$3ÈÖ´“ƒ2 X«‡\ïAº~ôÒ¯ ÛÉ•àq²ÝåÞÅÀ‚ux]ËG½/x¬Ô¤d?H‹ œÄÕΠÂëª ;q..gÜÙ~Ù _ª¬¬¤Ã!ƒU„R XºXlÇîôÍô[›A Cûm(]ÔxÔ´û£Œ-» %ƒ|Áì®uï6³†a´3°ú¦ƒ$Â÷8ÌmUZ娈ÂÁƒõ!¥ XÈŠ`óæÍË} Ëmâ®+`A† t•íf™ÔÁaïÕK©Z-I’&''é…#£·äñÐÏâv»É¶†FfnD(MõçûìÈr‘ë=(½d[× 2}!>9%q$ÓéÚ©¯[B8K· ÄúAMJöƒ´˜ÀI\íà *ÜÑ]U؉Áx5jkãmdñc&6lqp™9éKÅæÍ›ó°¸ö]¤c8ÔñÈÞRÚoCi´WãQó¾Ïäzh,|YHL)Û,íwß v»];ðø@:ýjg+:¸=° °„A–:£Äˆ€Åqœ*ršÊ›믅Rùù/ý^wÝ6˜M$~¿¿¢¢‚çùÁÁAú"<Ÿ3•F’$ò Ãð”#ÚÒx+Ù>9t@fÒÓÒf`™×ÑÐ]g`½;õ£¹Ä,9¾«òCkì]YOÉ«„°»"‚ ìrÄBËíéz襳ßWvÏͼWW}]¬Ì °Z·gVR{¤©>9è5Òö¤d‘¦ú“G~ldä¢ðîûcS÷,LÀ ÷FŲmãœÍÎ dL ¨¬LÅhû/NåÇçr] ܃ê¢ X²œ,U̽kí»GþFÙ½:wr+¯ÓT®ìfÆ^¡P(×SÐ%„… X´ Ö"‘Ư,Õ¥V r,xžE9¿˜Óó°”¿´k¡s#át€¸¶l÷zwv7†aôMÜ©÷Ez`!‚Úì[ûðËgŸVʸFç®<3J²ùõ6q7üXì\ófqà$€,‹ýÇL[>°´wULˆö߀<¶aƒiÇꃴ€Å­Y¯}"`]™;N¶»¶±=?tÕ›õ¸:¸#È’€XÈŠ §§g¹oay°[8«)õ6Œ%¥H\g1«–ÂÆÚ[ëÊ›•m Ä+sÇÈ)™±ùJÎD••ËKeÉDÏ [Ó®ý¿0±D-N¢7DÀ½`dX®÷`¾VBŠ}©±µÜRõá\ãuÕ+ð.ÈÀBK‹’ý -&pW;8ƒಚÌ\*¼ ÇÅX2» UWÞ¼¶n›²-ƒ|y>ÎYÚ ¬žžž2°@eƒÕ‡U„ZHSý7àYÄž,. d`…’þ±ðer0kG…ƒWf4®†î²$`²"hnn^î[X6x§eŸҌ„pÂnɾª£+ ĤøMO|ï½ÿ©ì^™;¾•¿‡F’¤LËv ,ZÀ²ÛíY3°õŠX‰ ‚PSS“¾Éî=–‡ŸŠÅbÓÓÓ™Ú˲ÕÕÕV«5× ÈþÉÄï*ÛÒDQg`Q–iëlóÖ\#c±˜×ë¥cèÚÚZ­×0äM¼õoʶÁ ¬\ïAº !(!<#¼J¦¬7Yàn«~ŒerþѰè ,=°4)åÒ¢'qµƒ3X‡yz.•X#„µîì_pwtøÒDÊŠ¨oîäþ~–á–6«¹¹y``€>"I’(Š˜×±;ñæ¿(Ûhƒ¥ Ýðú‘<ûšúÏH– °®Î öíM|W[õ:b1ît:‰#G$.žJ[é.» bpïÚªBþ%ÉÁƒÑOÉ XÈŠ ¼¼|¹oaÙð8ÌDÀò…ãõ›Æ`ø)™LÞÚñgÞÿf\Œ@()ŒE.7Ø»³ŽÇã‰D"³Ý a«ÕÊ0 ÇqÊj¤,ËÉdÒd2ù|>ºž ´§&[¿ÖúÄ׬—Ž ÕIFååå;vhüiKž(ê ¬XZF4Ýþ §*+€xx€²•í¸ãt<ˆGod ¤©ˆGÀ¢c‘ó=¸ KÇÑcÄ×wÁŸný³Ñ³×c®ÑoDÀš ¦k*]95;Jûƒ´hÀI\íà -`ùBñ\Ö®Ö»þóð7Âñ9ˆˆs#‘‹ÍŽ¡PˆHNM¾5(//ÏLéJ&“F,²¿ò~lah„ÐÈ”€eÞûiÆSŸk¤j5”㸪ª*<ˆ¿ü÷)3²ñKÒÌ[•Ö”eߘ (ÛŒÝÍðk´nR–#‘ˆ r_ð9xçºGÛ×´_»vÍëõ@{{;™å£¾ø|ò`gëëG§ÂAõ Ñ,Yfò²ÁÒˆŸ‰D,”hwo½è;¢¹8–KÀ€p8œgÓéWŠz&“‰sŠ€¥}“„¬‹¢Z² 0嵌­LŽÎ€“ý“Ly­Ág\]ÐXŒU§1Ͷ@Ù”$Ië•´ØÙšöT¦,‰£½\›–h¨u“”€5*„Ä\?Axsð‡’œšô23¿¿G5Æl6Óyd™j&^ª§:š¸#‚%´ –/”3²˜l·tÜÿVïO•ÝCÓ?3ÕXl^‰^Ahkk[¤r”)`% mÑÎzÖâ`âa`ƒ3Þÿ|Š©©7ÚsyÇ#lƒŽS1A—Z?þ×LEc®‘V€+'N)Õ©®®Î½^ç…¯/Hm÷¼ÆÞõ_ÒÏ«J¿ÒôTD"²,OFóMiÌœåÖŽ8­eeee‡VÔ42þ½+éÞ5·we:w!²4 €… ËL^–†f‡Ah·ï Öp¸7"휺 ¯-`‘¨Ëd2Åb©uQƒ>î ™¥‹`Ì«‚©ë”S5ÒÄ®,Èh”£BõÊëVL°ˆƒ˜4z!»€%Kñ—þäì3"{G“=¯ÓQæµi20˜ëçÁÉþƒã‘ôšêîÊG8F­7Y­VZÀÊÛ MÜAŠº)³v,tG÷‡‰€C¯g[ôÅ3Aðù|×CÀÒ=ËçX+»ÊÆÏ(»‡þŒ÷ ¶»KGÀ’œ×z,v†oÐÏP2“‘°Á´å~"`%{^7kXš(õƒg|o‘#;[îpZˀ㸆†U‘Á¡«ië¶NìA‰ × 4qGVÔT¤ÐA›Æª£‚FV8öûý5¶R´%ÉâÕ¹ô:‹'« –ÊÁ]ÙÈôqçyž¾ŽãFFFT—’$)«ÚeDÀbëºÒ×)bwª„0³Ó³ Õë¦û2² éϹl°ÄóoÇ~øåØ3_Éú/þê?С0ŒhqÁüσ̫íïÿ Ùnp¬mrd‰ÅUydº‘hB”‚±Ô_Ç2nf`iQʤENâjg°0èÅ<_8Ë꡵²{{ó^ê€|Ú÷Æû3¿ ût3å8xð`a„ªu4‘\H¾ñÂN\ÐXlu›v, xŒÄÜæûÓãϽ rzÁOëM?µk2:0IG¡÷nxœl766Ò:©,Ãaª!f`-ì†h€²"(åRç¥*!$_êkÝi†+sLjñ$TWW“mãV¦»ÇãQå‚íÝKG“ Ó¯èÕ3CVm'Ù–Æ‹ÖÇ}A áÒg`mLÎш0qði[¤Í™IMº,˪G/ŽŸ¼æOÇ…Û<÷f½ˆJÀÒ-!¤ëy‡Y/Ê-uJùƒ´hÀI\íà †ÁB…?¸÷ïî[û¤’r¥puîdBJ0Ä`»0öìÙ“ÕK÷DI’Â5 X²PBm€ÅÖvèŽÏ[ÀjßɸRú‘œûÓK¹ùf`ò¦ûnjØÝU›n¶c6›Ò¹c½ão(÷zæõkÊtïÑ»a ` !‚,3tÐ&h®:‚¦€Ev×öãÞW$9 ÄÌXøJƒc­òPUUÕðð°²=å;qu."û·4Þæ¶Ï·P¡Ö-éBrPY„E‘^TvUb=Àb±"DCV}id`Ñ%„zXKž%ÇÂÉ£?Ó½Gà̉¦íÓU›„ÆtƒðÌPþ§þl¯±wUÛšËËË3E¨“q ×y3·á.4é»x1«¸©piâTïxz…socccuuõÙ³gU·%`9QÀB)N–ê«EÇÕÛ;Ö—ß~Ú—Ê‘¹8¦XÐÛÛÛÝÝ]˜VÖ(ň€e6›v~dwJæX·n»>gs=¯¾O X%”E{k22°è53C€ió}DÀŠž|ytë“ÀÄ‚•¾±Ôά›üõÞÈód{ãšÝ]µ[´£ƒ;‚Ü(PÀBV,Ù¬{ÞiÔ¸ôº’®ÍüƒÁ³JñàLläZð\µ­éÑïú.gYâ Ççž>üõw.ÿò®îG§½~'Ã;Mа2 &Μ9³oß>ú-`Ùl6E\I’t:è-ôÀ’'Š7‹òÀë—‚ÅÎÖ´¥Ö9³5"LRõƒæ}¿q¬éC¹Þƒ¸\.zÒiá©gäð¿¿ûWdw½««vKWWp§-`Y3(`åE) 8‰«œÁÂÈ+‚ùõ¼Î²§}oÈ0ñÅ'xK„Ãá¾¾¾ŽŽŽ4¬Ã‡g4"`©Öötû2åud[*)+ŸBUBœAëd”Og¡÷=ÿ·2€9ì…ù8™­íNk í½ ¯Ó}i>ºãw´Ÿ,¹a €…¬J9ÚËkÕQCÀ¢m‰Ë;v™î9:ð†²{Ò÷ª Ò\›ãT€¡ÙËß;ôw©[²Ô¬uïÞ.n±‚²™¸-£7p¨Í¹ÕÆ9Õ-éhÏl6sG$QuRÉÊk[™’$Gçdÿ$S|%QŽ…SÛ ËXt"Ý|K€mØ@ÂDU#BÙ?™<÷Ù5ïù䞦Í—RÅîŠðMDž9ú¿ß¹ø<í³¶•¿§¦&ÕFÀd2©:Qª«ééiÇ“ùcLˆ>}hN ä ýNA²RʤENâjg°0z`é”Â|8ä2yÖØ;Ç"©Lí+c»«V¶@aíwîÜyäÈÕA#Xª/8ýJO=0Œ"©È)D`sÆxÅm ¡+`©^Fƒ½°o~ð±ÐÝÒø%`¤dÃÑS ЮœõÎþäÔ·Ènƒ£»ÊÚ¤1~*ë›NåÔ›9vWoä& p%ÑMÜd™Y*w»ÝþØÎϱó–ÛÄL¦zef-•–5V.‹n"ħŽÎ¼øGÏ=òßúSQJfz`)ËŒ=Âþ#3¿TZÿdædÑÊ…Åb¡ï܈øÂÔy¡L· ´:óêÂF2°T>î m°ïýÄTȶng5Õ+ȰüW&÷ßþ³ýA«WŽî:{°T® ÃÌÍÍÑG‚Á`ö††§¿òãs_ùñ¹g¤»[b‚ H±R@ ¡²ÑUv9Ø:-¡  .!Te`é‡:f+ãœW:Ĥ<7cðW7‰˜ìMm3,[Õª=¼€Õ;Ó–û5Íåà.ÂÀÀÀ/}×%9qÌþþ¬±ŠBR’ÿèÙ³dy[s¹ÃRBäuÕ+D°d™ÉkÕQ;q‰`·ÛëÊ›·×ß•ùP£mwåÃiü£O´þåÇ:¾üÕ¾skÇt+‚(% ¼õöÅŸg-!<+¼}Âû †z‚gÂá°êôE X l°ŠÒÇvp·ëw«Q­:ª^ÃÌ×T>î &Þý>Ù6ïù”öSÇãñÌ ¬¡ÙËg‡¥Ÿ‹a·òwß]ûiŽãÈͨ,Žãc¶¦çF™ÑÄA¤XYhân´„š-lj).*††‚Ù»î§`+ß ,XXEX"6XÒô€âÎ le#˜sšÜ+,`q›ïÓx4«€¥¨WûÎì*ÛYimȬ¥'þéè“#·ubý ‚\_°„Yøýþ’í7±È ¬L›!˜wzdÛo?”Ó×ÜÙt÷ƒí¿52œÊjq:Íuퟯû‹{Ö?vèÂëצ®3³±1zóùÓßÞtÿídW‘Q=Òû*9xdö—kœi×*•€E«`†,ÊK/ ,=´3°zzz6mÚät.¸Î ¬tL/ Ÿ“®Níp&ómO€æ{P•~±XìgÇ¿Or¯\¦Š;kŸPì“É$©ÚP54˜?gG²4A¯pb ¡¥üAZ4à$®vp £°BàS‡k{o µ rÞÿn³s£’^˜‰{ eÅHåš*ËÈ) _óËK’0Á¶»ÅÕÌ÷}÷ÒÏÀï÷»7Üeyø©X,6==MŸUUUåp8¸î, >>ŸO„S¾×bbªªÀÌÚvT<ëYbIéñoyátZylª°ÿÞ½ú}Y (`!+‚¡¡¡Í›uŠ˜ŠO>«Ž™€Ýnƒ™ µ¾s_ׇߺœêq³»å¾ÿzÏ_ú¼>"`ºj·˜Âeƒ0Q1Ø<}Ê÷ZBŠ@ âÛõgµ’B’Éäó§¾sdòEúô¨zoê'wÅî¥ÛEgz`‘]cV‘g`ɪ˜N¯!hš¸ ‚‰DNœ8Q___]]MBvvÍ:ªa?iD˜ ìÛM›îeîñ2ʲ,Š¢îz˜ò6´>ñ5+À•'hQ²lýz¾®.׉¾øÄåÀQ²»¿ÇιrÅ*?::B«WmÕÎ7¿¼§­ZIÑ=° PÀBV¥íyæyOðG²¬å†Ä²,iç§àp82,Òëí±Ý¿sxð•HTck±ÙlÛøûŽ{S¼òÒc;?DZ&Uý ê¶ L]§<˜Êô‰ÿâ¯™Šœ]`"‘ˆàóE#ó¯¡ÝÎð¼êuÈ…yï§éò†!Ǩ ,kÞ–†©(Š×®]¡½½ÝIe`eB÷ÌõŒÅbtð×#ì§í!6yî`€q8ÝÝÝ™q^Ö ,]z(÷Í(`åA‰8‰«œÁ‚QÛ`UëŒWõe®µµÞÞðè»#?Sv§¢×~uáé'oûbÖsUå~4ƒƒƒY_‹¥KK!K–¥é²g$+3‘ÍÈ KÞ†Jí§êQ¯×ëp¨WAÉCW_!»›=wzÊušÐX•Ø(yIÁnˆ(`!+‚öxgúkO·ù±eÍÀ"õƒ¹0›Íäë?‘H(½¥4³ãXîñ›¾ðÍ7¾œy…FǺµî› ¢¢b}äÖ3Â[ ) þÈì©¡woj½kI,¶®K"Ö«ÿ 5 Sô3¸ðÊT6+møn0t !Øt<°4,žçgff2}Ðü~¿Ïçswï±<üTö‹šÌÜÆ»È^®÷ ­löð¦Ã;§ÉÓQ¶hçxšB¬´ÙêæF·ÆHDE‰8‰«œÁ‚Y …óhDH¸½å‘±P_ŸïŒ²ûúÅgv´ïYW·ƒçùééiú묬¬ r°fÍš‘u¯Ð°Tî`4‹*!,,Ù7 ñÔZ#ãªd]sýÂ2°ÈÛ. ŒŽŽº\.Õs½Ü󃤔šârsu‹s“†å™Â X× ì†h€‚,?y•ÒȲœ)`éfY,²TÇ•ñt`G¦v´ìû½»ÿö»ï}-K'ÅØM®=Õ+5‰•••ccc®í‡•Gß¹ôË›ZïR`AaVm§þ E#];Ë!`A4 ,HÇSWWwõjv›0¶ºÕúÄ×q—é?Œ+sÇμ@Ž›YÛ]µŸdƒyÅ3“Lwݧ“e8?J X¸þ† RðyÆBª ,°Z¬u~ößNþYDœI–þeÿŸÿÕGþÓãñTVVÒqŽF¤D‡(,Ë’å¢|3°Œy`QXÅRB(½‰·ÿ-ëCÒì0ÙfkÚ˜ëgFŒF^XíÁáp¸¿¿¿½½<×lpâKÏ“›=w2ÀdØ*fƒt ! XK ªWˆ(`!ÈòC XϹ4ô8ÌŸ»³-s¤ ô*_0ÌŒ™t3°²ú¸«JÉö®¶»»j·|ãÅ?šë˜Û*³q©eee&“imÙ."`õŒ¾?œˆÇÓÃ"2°nŒ€uúþêø·dð†&Ÿ>üõÏßù—ÌÂÏtž¸ ú ×jµFæÝ ´u“3°åŒÕ!Ç ÇÂrØÏ8Vý²xáíØ3_ÑÆÔvd5××°òòÀÊ%;úýþ«W¯VVVò<áë¯þA<™ §&O»k,4Í ýWJç"r]A Yôôô”²ÖÎSAÛsGGž;:ëëËöuW©Fú|>:„ŠÅb*ƒm0•ÕÇ=—€7Ý¿æ³=³NÌþª£lg“s½r˜eÙp8,Ër…uM¥µq66²,¸üË­ž{ÉÙ Xܺ½9Ëß‹ÅfffÈe†©©©±ZsjÊѹÄëÿ˜º™e°`A á¢LÜs½ž¹t¥¬d} ‚ —ÞØX\Jñ,cº»îSµ¶VÝ'* „ðì‚úÁrF«‹:¢¦Ä?H+­B` IDAT‹œÄÕÎ`ÁÐ&îºv í;Åb±Äãñz{çfÏ=Â~åàû}¯=¸ùÑè‚/J ‹–Tl6°®‡0åuò|c>Y/ëò!#ÃŒ`A¡yjÈŽssssss熎½<ô¯áø9¾É³e8†aò*!¬.C An(`!+‚æææå¾…å„ÎÀ"ü¿¿¼øú—õ­42Sè ÈÀJ&“$˜cYV%ù|¾d"¹Þ}Û[§ËÌÓׄT›êî²Ý‡b)ψ—_ìÞº‡…–,³ Ÿ??55•ÚµZ;o»MëILønjÍÓ?) ã7ÞÇöÀÒÍÀÊŒÀèìª\ñ™îâ!MÖ÷ ×ëU&k26H69Ö­±w‘]«ÕšK™*@À:G9¸oj@¬ü(ñÒâ'qµƒ3X0‹/!$m¶ó÷F.{cc ƒüÓÿ|Wõ§é‘j”¢‚)ÛôJ˜Æ)Éd²0¯qPªÓÖ¬Yg䬕Œxé ‘a×UÀ"oCmÙq6>öòè?‰rzL‹sSwÙn0™LŒæZ8.F©;±šX§S/%Ø ÑßlÈŠ Ä;Md°Þ¸0uðÊìž.Í–„ Ã0 C,*†1bâN¶•¯v•1D®ïìrK ½›L&É’c›kë1ï‹ )ÞÐä•™Ón¨§Ÿ®+/èëktJÁrlÓfñê‘Ôý ž6m[N ¬…›¸g}T!sAXƒ¬ïAR1é'ël Š[s`AAÖ÷&°ò£Ä?H‹œÄÕÎ`Á,(!,ÈÄÝb±(Y†ÛÉàõ‰ÿPŽŸ>ÔÊÝijkÈH ,Z£*\žÌúA0.`ñéðCÆ õ:YÉÄ#tb»å¡/›ýÇ&·övÞÎ ‘xÆn·ó<¯V˜€EÞ†*KV•žÕ7w‚V¯öu>Ò&ݪx¼0ÀJÿ U ÖRƒê¢ X²üÜÞUùÔ×*Û¯ôLžN%¡üù/zßX˜„Åó<©êÇSQQ166F¾’­V«ö’dËÀÒªÌ -`™Yk›kÛåÀQe÷Ò̱]žGè§»ÞY1ød[¶Kºv¶=¸ä·¤Ãâ2°r•ÒŽ³YC꼘ïM)ODÒ}¯kííôBEUú½÷* ÜAJ‡…%„‹ÊÀ€Gw³{ÝPࢲûþÄ/\óy22çêGáÒkEkBY’eYEÝ•¶¼¨Š}G!9ŸÑ_ÛiýÄ×5{èµ¢¢Â`BÝÞ…z6+++m6›Ïçóûý ƒ<:O}xëgîí|âÔ©Tó뼬J4ÀB X²üìjãwµ¥Ù^û_¿£l¿yaêÀ¥Ú Ëãñ´µµ©¾¶éÎHÕXfÖ¼NMÀR©f46›Íét*úW›s °çnò<¬¬b)-^äÕAÆ tˆ#I’nÔȵl%ѱ8tfÉïG—%4q§u8Á`JË+++оé‹OƤÔ_ˆ•³WXêè1–j ˆ“HΧKJ—&R7Ï0XBˆ RBÐ~ FJU_1Ši}pOã£?¼2"˜Œ‡{›)ÏH$B÷¿›˜˜ðx<6›çyú+uvv–lG"A²j%¹¾mXt–,¬úF„âå÷È6×}»Î`QTYægŽÉŒUs§ê]¨Ò¶è”+—ËÕÔÔÄóüåË—C¡7>L¦.b1ÙÙö›!½²hÀ‹jAX–ÓtA%,dE€¥Î„Û:+ïÙPóæ…”Ó—žíùØ®†Üç"‘ksDÎøÐ:S®‹oQÍ2e,%Úëíí€Z{›…µÅ¥(„“o|¼Ò²†<­²] ,UZ¸nÔȶl#ÛÒàrø¸/(!\”€E‡wN§“Xye`e¾Ãá°”OFÓéW ®.€)~){sssôî·÷÷ÉöY&ÞP<žLý¿š*YKk ðƒ´ÀI\íà  ý™_@ ¡Ùlf†>XkoÛÖ¼çôPÊ’iÿänªxh}ù­ÄÌÅÑCƒsçn©ü°ÇR Ñhtbb2z=ÓÑ‘$I™=òr}ÛjD衬՟u‰°ÖêXªBά­“3_Ãh4JÏ Ý»P•¶•¹Äëñx/]ºD§_mn¸Åb²%>Õ` ¼t ¡Õ%»a  €…¬0Ú£ùóG×ëø ïø O{è™JþÅ[s²<›k°ŠÍ˜~•7øAZà$®vp †.!,ÀÄ=3Ý[ÅÇv~þÌð!Y–@”“GfŸ?+¼Sß¿'½¯Ý]÷)ú"‚ о¢*²|]ª0’oN XÒj°dY¼ú>ÙãºuÞ … XY‡)(K­dWzÍŒümTTT-`íl½2 ³´o~–j”Y‰XK vÃ@4PW#²ìì骼wCþ¸lôyõµ!U áÌÌ Y<ÌlAH£¤bµ¶¶¶´´¸ÝîöövÇCgì7Ø»Éà‘È% Ä²|=°±lpZ8ËŠ*LÔ«“­›o¥'KÒpî---òâ2°dY&‘´JÀ"Žñx\#ÎÓE‰Èe'(÷öÊMô“ɤ-¦îP†o ëzëÓlA,AR‚§Œ„Œx`©2°2 7“ÉdsE׃›ž¤‡õ †ÃfbêËÒ]qr=DPbz>ËH´Ãz(,ßê°¤Ñ rЫl3Nž]Ó­=^•¹¦D,ÊKª@Z]g3zKÔ`ýZ,–@bÆOlr¬i[ÓÈWÀ¢=°\XB¸Ä`7 D°d%ò?]_؉W X Ã/fY–ûûûéGoË\(V{{ûÎ;•%, l ÝÌ|}Ùtt8*I(ɲ,‰ê$IÒm˜¹ŒF§ód’¯€l+UExí†W.΋>H?J+J²,æã.B__Ÿò—àOGÅÔ­ÚÍΖÊñ¨FúÍócý¾üêF7a‚ H)A—.U||÷ï?Úý»f&‹Ä ƒ|ÒûšÆõU©ß$圠ŠU²Þ€6 Jý«ÛK¼tlskoFçg¦*Kqg§/ûûû3å*–eéÙjµfö.$Ч“³X–‰^$Ç»k·;­e°( 3°äÆ%„ÈŠ=#Tìéªüÿ>¾yfN_}ˆÅbcÓ¾ (»ý‚¤ñEN { ´xÐÀb±(6ðv®l»}4Ðòhä²Ëê!ž\Ç]IE#=é "I’*Ä1"`qÍ[“‡ŸKÝϵ37ØÀ@^\B Â2úQŽãl6Ñ­¢Ñ¨FJ yª E'ci¬µu[í¶WÓŽðûÿ ßœNÛ·ßÑ]uKG…îýì][¥;Q¤ENâjg°`¬&ÖaáÂq¢Œ%]V­8A7‹èGíeÛiüâþ©gfc#À'AꡱȕñÈÕz{gæõM&S[[Û… ÈWªÍfÓý_Ðñ•¡Bw5p&“ ‡|ˆ‚YÿYV&y9¸C¶B• ˜kIÕd2‘×¶¬¬ŒD­<ϑ˚Ífz¹”ŽX®Ï‘í- ·)(`!Ȫ,dE€Ñ^&ü@—þ ˜õú^øÊ;‘„³a16]ý‰HNKÝ8¦¥lã¼€#áK®D»~VfŒh(«eù2°’qÒg83˜tBŸ¬«¸DÀRe`Ùl6óÏÀʪ^À$U?Ø]·Ce– …AMŽƒWf/Ž/°lWˆDØ7/ˆ¡D*‚,·›ŸûÝ›kݘl]ÀÒ"'qµƒ3¸<³"`€/”аTXŠâUÀŠF£eæÊ‡þk¯ÿËᱝ}{òûc‘«Ê£'¼¯>ÔÐÁ€º`ã8Çãr¹È7©ê0+ù&Ã2îÙ7 Ë’’­jÑ?kEB;¸O•µ'´ L³–ê?‹(Ò²ý‚{<§ÓI,U¬KÂN!<3R¶`6ÔÞ¬lÓ¡£nŒº@Àr¢€µÄàJ¢ X²ê©¬à·4yŽô§|Nùë=:Ëwº+KyA XÍ®õ‡à—Êöhø²$§Ã‘¼¢:žçÇÇÇIpc6›52Ë °8ª„P:+xg=•ºg- r>õƒã¿“µ„ã8z:òòqW*@út18¾Bv×ÕmÒ± 7"ýà¨÷Â/]™ŽIÆ ®þò#P½BA²Â;-cBêkK'š*´2ˆ³f`)•¯EY–•–ÄÊW! ÜÆò½ÊàŒ~KfbãÑK¶uY¯¯² Uß0Ï{½^ò½É0ŒÝn'x³†:ƒƒƒápØf³1 £è;¬§^T,¥áʰ¤©þä‘ë J&¤©ÔŠ—Äšú’nipP„¶¶¶\–÷,Ï“LÒ–ê,ZÖŒF£d$Çqä¡“Cäùè´ÊÚèàR–˜µr@õ Ñ,)¶5—ḛ̈ðà–Zíñ¹Œ·Ýn·‘ D´bRem´s.Å$5.E¦bƒíЮ<”—€¥,£Ñyû‹x… X~°ƒ³’ ÍÄ#§¿ÌÔ7,¸3ïû S®ó"k±ÀÁ]§!ä“¥”¦Ÿ'kff†V¯à½éŸÆ¤”be3Û[«Ö] ¦-…¨ôǯ…<œ­¶4•ÿî=íÆÇ#‚ %OÙ`ùBq‘CÀRŽ“¯Åd2)Šb¦2Rimlvn¼JÕ‘ö½ÞXß “°ŒX§¡¡|uZ­VÚ23axx˜çy¾ÆRNb²Äÿ"ö¾“ùŸe[¶™6Þ Ü v;H!^Ø{æ+ÆÇGªÖJ&+̘æŠß23°xž%¯3=•ô°÷¶p@®Íô<ž¼–~…›‰Ž†‚¬ PÀBV~¿ûM,†mÍéààô– »BÖ/f“ÉÔÑÑ‘¯,°8ÎÔä\9pLÙŒœ~lþ¡üòêée´Ìf@4… X>ŸÏ·» €?ò`°âŽ­j5Ýúqcc³—hš¸++Ì©K1ŒJÀ2RB¨Ä—ápXÕüràèp¸—ì>¸ùSkR&b.&ÿÉù©W ßúÔ6«5È"ÁÒ"'qµƒ3¸hwŸž»Ê X&“‰H¢(抶WÜ?:ŸJŠŒϵº6ÓŒX@¯{Y,•‰;Ý‚†çyŸÏGßO,›˜˜°1vbú˜8ðÝ\ÿ_ÆÉ›v|ȼ÷7¸M÷äs ©U Ön42,3Ëãñ8ínB*4,2/‘x°wì9ÞìÜH¦5?+”ޝPÀB XÈŠ`hhhóæÍúãlmJ‡ËF¬¬XUUU¨W°PÀE±Å¹‰XWü'ES* (_‹Ž$´Çg>š5`UÅ‘®ìtÓ½“,Ï8pbQVž-³6mT!UéW°ÐeV7+ÓôJ!˜9:û"ÙíªÝòðÖÏÏó£SÞ?yi„îwɱ̖¦òÛ;+VrÐRåØÓuƒ*4Kü -pW;8ƒ‹§¼„žyXe­øáíõëêË”mAÆÇÇéG£Ñ¨Ò%Pläúô˜kÚ˶÷ÍTvÏo¶¸6ÑNX,• %ýì‘H„þ†Ž—q»~cC¾Ä»O'O¼àú§ñlô.Möå5>X·Iÿš’¤z=•¨†^°4+°È<ž~/)¥ž×c©)7W+:]™H×f%)ɤQ&Ë0èµÔ ¢ XÈŠ£½E²¥ÉÍ2ŒâCte2Š%šÖ§Y¬‚é€, 5Ø×–[jüñ)¥ä«çŸ}òæ?„ü,Z„ÒvF0’¥RjA°ÙlñÊÝÛÈŠ8pBt ¡+ëñ\=ºX™-À !Å÷Oý0)§–FífççîøsŽåÀãñüýÁK³é'½Sí³ŸßÍ;—§®¡ÁÒ"'qµƒ3¸è ¬çŽŽª1è„EÈ7ëĵýä`³c#¹“¼Ò¯|¡8YX,w˜8Ì._jP½B4@ AЧÕÔUëº41’,ŸÜÚ©µ —õ»¹`Ëb±0 £¬\ɲ Àl,ß{hú§Ê£ï\úŇ·}Öi-»~XF,•R#B]]ض{bëʆajjj²®Ž¦ˆ‡ã¯þƒ²) œYÍÂF äUBh-PÀRŽg X&“‰t˜E1‘HäåÙÏqìáÀóÞØ9òÉ[¿T]Öºsõ¥_Æ;×Uÿü÷oqXr&^!‚ ˆAxÍL–1!¢ñ(ÉÜQôBNYY™×ë%»åæê6×Öþ`ª ñß›ÍÎ$ K¹Nb—çŽ@›k«nÇqô³gj1*ß.…`í¦‰­O”——ç Ãä¹™äÉäÀ”²›x÷é,`Ñ%„Öÿ5Sјk¤àÔ;ïÿ¸Óé4èà… XÚ–X%Jˆñž‘Ãä`‹s#ÌG›ôäæÙ‚[Ó È ,)¶5—+œök X™X&“‰vÍ †aÌf3‹tº¶Ÿò¾ç šˆ¼Ùû“G¶ý&·ñ¨¢Ç,^ÀÊÄf³qMÝ#ìo+»f³¹S{ÁG–ï>-‡Â4ÕÇÖvê>Kvd`阸çú¿äÊÀ›Í ¦ž"æ%`õÆ\šIç—ÝÜ~ßž®‡Èîô\,šH=c™ÍôÂÞŠê‚ ²$Ð& †Ú’ÐÁÆÜÜ­X¹Ýnz¶xîUzÒyããýÁÓ®í ÉÉ+¾S¯¼ùíÓÃï%Å8™y¡³|»½^î®ÛÎ2éú2U–ÊKuoY ÂíìÝ[ª»º¬¹mÄ“á?Û™zÆ3¯È)Æ]£ñ",!rXƒ)·P°Ø¾Acp2™4¨@å°Œ,pÒ¨Æçzv%:7z$šHÉ N“§ÂÚ@GtpG•ŒV}/‚Ü0<¸Ü·°êÙÖLÛ`©‹ÂTd~7———k¥k£Z–dÓ†ò´ôÆ…%Äx^Xª¶A‹/!Ì ý:¨3gaضé[ê/¼Šp¡‰{™ö`í ,úJ^a:LÛ‹çyº¢áÒÜ‘CCië«ÖªuÿeïWéñCÞ´inK¥Ã¥Y©ŠÜ`ðƒ´ÀI\íà .†Û»*ŸúàZú߯íN'ûŒQÏótjÇã!¥j´„499I{½gy,5›jn!»ïN=÷êø¿šþé³×þú¹žo|[Q¯@”—„£_{ùwÿüë;~là-I–€úŽˆsªBU(B;Tªn¦ººZÛ„”kÛÁ6ÍW§Š‰Ä¡g5/-´[ݦ{®Š5| 2Z| ¡,˹NWþ*ôtlP²í23°PÀZvò2òGJ üí¬°ÔyñlmÊ£¡Ùl&E ‹ìšTYY©êa·Î}óùÀ;ÑdüïËgŸÞVq/yT7@QÅ@JP’ËSÓˆ€Åóüääd$’Zyã8ŽçyúžeYN&“ÚQ ×¶S<ÿ–²½÷¼ºÏÀ"Q»wI–.ŽŸ86ø¶à÷5±[xKÝiß›§}¯“¼£ú¿Ý÷ ‹iAÀ}m†°ª LÙC®øAZà$®vpî6~WÛˤc¾Í;aûÓ_g§­­nÌB • }µD"¡ ~à¾î'ÎM½¯$aÀx¤o´<˃1ÿ{WõÞÕ_uÕnýü‘L&gãcg}o ‡/üví_ÕÔ¤£T¡ŽÍf£Õ4·ÛMœ Œ$J›÷|"öÌW”íäÁ§-|Q÷”%6ÀbkuœCUyU™iV&`Ññ¡Æâ¨Ùl–déÔлäH‹+åw–H$dYÎKÀš ¦Õ·ª2°–ì†h€‚ tÖÙ¿(ÉÚ¦’&“‰þ¶^¤€•iefmûºy­7µHøüéïÔíNÇ=ºR™DQ4.`)ûèœ2ÇSQQ1::ªìrçñx&&&è³tí¢¸¶é§XŒ;]BhÕ)!Ì×Ä]E Pñõ½~þG'®íŸ‹¦Bç“ðñÝOÝ”Éþ‡÷Ãã¨R;äMÿh®@ A¹ŽÔ{Ò‹(c¾j”ÇãÉšµ¤a`Äqœ*ø€–êµ{»:pù…\g¹ÍU’,“>Õñ+“g¾úóOÖØ›¯ù/(G~~á·vìÎuP(DžšeYZÀ2’6nÞó©Øs’bÿqiøÛ¤ßìoñHùXª×6‘HäZ}\ª , âCØ; $fý‰i;ç¢Kf"£?}ûÿ°Çe-o,[›L¤^öx<^x¶ ¼ z…h€‚ õ[­Û:ˆ@$.~õg<¹½$"‘ÈÄDˆŽöÏfz`ÙÌìÜgÈæ)ÓT‹eÙ‡·ÿÆ‘Á×ü/ˆRòÇ=ÿçšÏsŒ ”fZ¥Š¢˜+¤Èùe¦SѻʬêÄx<®mƶßD¶¥û¸Ë±t["¦P+—‰» dQæÝëI”Ÿãÿ÷Í?÷_S]V¯,œõ wÿMkew擎PVc…]ûÎAd1Ô•ÛH“åé¹xR’Mzß²®åTÀn·vïW·­¹ãÇGþyºH!‘Hø|>"`½ÜóŸ™êÓêþo÷}£«vKÖG¯Í.ðÀÒ¾s䃤ENâjgpi1±Lu™EYœ“dyÂmäuÖNh‹.4™L<Ï ‚ rÅRVà¶4ßJNG‡züû­¬£ÍµõþÝ©®ªaøD$ÂÔÛ;ëíÛ¶o›Ž ½töû§‡²›ýêÜ>Ôð{æzí›t:Æ,AA¨lÜÛF¬ßcœZ¶YÀ8<æ{>§=Fº![Ó®=8ó?‹Å X ™‰fµZ3ˆô¿2þ¯0ôÿ³wæñmTçÞ?3£]–-Ùò¾;¶'1ÙHBVI(!P ¸”¥¥ e¹Ð[ ·½Êe齥иíméÞ¾ÐÐR a ÎFö؉c'qï»F–µ/óþ1ÊÑñl’¼Ä’x¾þÎŒŽô`éÉï<ç÷HŒç·wàÝ« ï;4ôá9gƒàÙ¥—Ñ6ÓéÄ“‰o ¡ƒØB˜]à‚”””LõR¹%XÀš(^þèL,V^^ÞéÓ§É3F£!4§xÙª×|r ²yxŸQ•Qk¾llXrƒ%ŸR6Æâ8. Š+°”gÅû¸c,׉]¦1 Xqy`‘ïN­Vãª{¹ ,‰—;Ÿ¾÷;:ÿqäø¼Q›>¯dÅÙ®æNç)þŒÅóýu/˜Ëä&ÓN˜¸CV‚_¤)1ÙN8=/`!„ºÙè¹…Pàõi6›ãZ­–wP«Õ*•*[Wr¹îþ)µ*¬brF0¬ÎSµö…'ÞúÛ›|ÁðÄhÄ„P! wõm^_p?M)‚Å%`ñ•Ô![ùŠÒ]?§ýn„ÇvcK,è¢YÌôqù²q}cßBˆä3+IwK£‰èM˜ç…Éô{Ûö¼Ó4üy²8³òš9ߘW²üÄH#9mA7I…Û"„†œ‘7•iŒ£Ñ3#uuuà'È]„`œLÏœ’‰ÿß=ÜMÝÈ‘™™)8ƒ÷âýËâ‡ò2 =‡¸CC~Þ÷†/ Û˜†'.K®Kù@ Þ ,4ÚËÓ¼7êxIÆ,`‘™·‚‰»œóýyÏ 8ÛN×[~zã–»Wþh]á·¯-z¸Ú´Ðª-þÁU¿RP¯Bmƒ„T`%ðEš@“ˆà„“ŸAØ`±J}uyäÖrL&×èõzÉcò>b¥‰BÔš™ŸºöÅ™•ÅiÓ¯,¸çò¼Ûñ˜Ao×1öSåIFò';ÆÖÉ!•ÎV¶"–‘ï[?Žk¼¿746ÑGM[Ë”‡‹å*IK`šy5ù4LlUBÁÖ‘zòŒŠVgj 24ý¦á}èüÎÁLcîÃk_øÏëÿ²¸b-EÑä Çå['P¯  R‡ÕÖÇ®ªŽe¤×ëeY/iµZ³ÙLÖx¿y  ¤a IDATóLŸ! q¿ü¸å'7F1 ׇcK«Òß{éŸyïž@(œ´ŒÞÜü³šÙ¿NÓÊ&úâdNÁ×3FKp&ÎÄ+`qçG/ ¹…0š9Ie‹Ï¶ù-,ˆ¸3ÀšÔ™|¦­ŸmßÿË¢‡ŒZÿ!X4yK³o i:'£@iÖPïpø MZt ƒ`ü>îÝã°øþ¼„lÚ«×ë‡ø>r¥R…–Šÿ¼îÏ»wïá5šiióÎŒ„³‚c¶K³,š<¹IF2«‰%ýà¬Z›uj[ŒƒBÁ†‚Muc. ´¢óýé¬"¤Ž²]Nr ¡x˜Ïçô‚äQ®Àœét5ûBáE5“ÎüÀêç3¨¼“'šFìÛí? r£fBQô·/}jFþ|ÉŽOÀ‚-„pA R‡"‹>ªÒ„!­¾ÉþÓ<•¹iwÿþüëÏÎ>ñÕF­Ò×…J¥b†SH7ôòì™^¹iÓG9}áŽx½®ÖþzÃYk†Ø+°ø†ƒâó±T`Ž…!º""`iºO؆†,¢ê³¨Œg !y> œ<:ìqäé*Ðùl›o.¾·iÇÍt‡¯Ìÿ6ByÝÞó¾vFÞü¥•ëÐèÌRÒ¥‚¤mÐ…?é³NÍ@ /0¹{»íÑ,¹bdþ7N M– Y^T !DQ4þ^lýê@°ÍîD…P°®ÿÍõß¡)‰J†at:y+eËb±´¶¶òÇŽÂù‹îÌ2g(ÿdŽm ;Ê{ßzÊðƒ+0ÊÁ='ÊþA­«³³³··×l6˽߸*°ZF"û•¯™‘7Ÿo-¦2_d^uØ6Jæ»bæM¤z…DaÏ‹°²MP°€„¶:_xäúOóÜzIñã›ø%&›Óÿú¾Ž»V–)Ü­®®N­VË X¡ùóxÕ¯ÿûŸ±þp·»O›Þ¾vî*Fú‡?vw¹õºX*°Æ°…pX“EiM´×b|#ƒ~”Î/ì;†¢5W}Ñ By#ÒÆ½…0Ä…ºÝ§Ø›~]ßÀ·C*6Ô,ÌZÏgÛ]lëëûþçXG¸Øj{÷ï®*üÎow>˺ø3*Z}DzïSˆBy<‘ y¼$mÄfRØ?˜€Ài ALv ‚Ψ-„6·ÂHå ,Á=þácYvxx˜|jddD¬y .çý4ùc-c¸cé£/ïûR z;ŽÛwÎH_Úå>å :ýœ7Äñ‹:ê[§eGÌþÇq”L_cÞT4üŠˆ ]óÃôiZ¹0™Y}ý³uüq°aǘ‹°H+ªRôÀbY¶££ÃårÙívÑuaÝ!.@Sÿ>vþ¯Ý1±ºdڈȗjÍ+ÏŒö‡Ó‹6wãÂïnH*b_KQTœX `M<Ð P, !€l/ÑÐk˜»V–ý×ûÍüß~ÐLÖK xpÍ´Ù³g××Gœhšv8,Ï\²®à¾·Úÿ›/ùvÛö¶l_^µ^òž±W`Å.` î .k¥ËƲš¬Êô®ð6¬}¿CE1ô:S6™½ +°âÛBBÁOúþBæm¡vWc§»ù˜{Û»wÈ9ÊÈß~¯óeO0²i±Ö|©Yøã¸*°Ú‡"ÿr÷¾HSb²œpòÍñy`)T`±,+hšŒa |Bv»=++ ) Xçï‹Ë–/*_óÅÙp¹ÓaÛööBœT–Ò…B†ª9æÕ¹º2^“›¹àE%‡áN…á‡æÜi3.¥N~Æ?ôþùÕâ’7§ÌùêwH>…âH+Z BñT‘Y‰?a„?äðvô{Û¼íýžvw‹£@_yyÞ*J¨ *°Ú]Ç\øÎ}6ß:§y4¥ZœuÍöžß#„hо²ü›F˜áa%'µüÊá øám•z £×(¹õcºa €€€4÷]^ñÂÖSÁ‡jîy|³° 1fvaúÌt7™Æ…B!›Í&°†Ñ© •¦'ìá&ÐÛO¼‘PVŒ&.k5°âÂ_÷—°€Ex`QñT`1*æ³Þ×êOˆ ž8&yR½²j‹k3VáèT`‰Æ(¬¶JV`©Õj†al6ÛÈÈyž÷ˆ”×C‘І¸”[ðºw,ý^CÇ.ÿ0B—\ÉÑå:Õå:UiZ°<ûF¿ß£€%¹Ø†;ò°,;¼òþŒóV°å@°å€ô$(ŠÎ©«Ï õµàã¨X@@lW*éå : mí÷¶³¾^rèrŸþ°ë7kòîÔ2‘u2Š¢ºRËÈQ|<;w_TNæK…†é%†Ym®ã™/Ï5”Šç@*bä$£–_2À‚ò«Éºa €ƒ Ò”f®—ËÈ­õ½Ñ!„¢iº&} Bᤰuàä©^iÍ%v÷1o!$wÏñÄ.`Å2LbJ_lá¼.„"*°P4,“™™™–¦$Bùwþ³÷"„8#pð]õÒ[Fm!TìBȲ,Ÿ¹À®þÍä’£Y“s÷åÿÁ¶úNÙü`$v¾`hU±eÚ5sï4‡Š~»÷©.÷i|É"ëÕéj+ÿNÅB &X |‘¦Äd"8áäeèhŠ qB¨ßá „8-í…t•A1”ã¾üC³Ùl±„b¬À•;sò—nÿ¬Íuœ˜®¶–dLçü4¹z4B œµ…—£8Ä®»4°Vnna(F !¤½áIWCtûöPÛ1ßö_h®|HøÇ…úÏâGQ+°$58>³Òh4¸*?Àùí{”oeóõü³ó——çÝž©É÷GnýÇ{ÿð†4´Þ`±¹BȬÉÍÖñÇ‚ §©Ì_)¸›FŒÏç“Ü@&¾O·‚KìàH$q .< ` d{‰É¥Ó­O_?Óé•^—ûŸíg<þ BèLŸ3­ –é•ÌüHø´šŒeXÀ:Ðú‰ÍÕo1d“ÃB¡8¥ˆEÀÒjµx;€B–É#®ÀBE°ôz½GkîXt7>£«¬Ì*.V¸qAß{်¿¨/¾…οµ1²ßü¥E(r‡wôüiÐÛŸ2©³Ö}{váâgv–/*6Ì<3rxî¬ùÅY•¹éE ­B={vUîív¿:àí@•gU›ñ—§§§‹?„è[‡ˆ-„P•xÀi ALv ‚ŽŠ¦²MšÞa/B(Äq=vO‘%ʸ®ŠÿSP©ø¾’Ý™É=e XøE†Y’}]°/¯ŸVbœ™®¶æææööŽªU/++kó×ÿîógù‡-ŽÃ¬s S¦©±àE%u"àb0, c.×~í§œc@<ÞëõNíQŸÝÇ?ô½ù#õ’›©Œ\r gëD¾pNE¥eQYMGab!ŸÏ§ÑhpŽÑ<¼ßÂéeÖädk‹­Úb«¶ð°}[ÇHØ}u$0ôÏÎ_ÌÌXvÊqÀ‘º1B•çàüPœ(ÒH©ÂN£ÑHã‹Õ.’A'T`M:°(J<ñÕrOn³ok'd»ZÝw,”ÎüHøô._?ͬÉa}}¡`(ðçÝ/<¸æ'Š,¨Jæ@ry^§ÓÉ XâË%}¢î"œaY¶XQÀR/»-"`Õo#%(Åýƒ¼¥E¿·ý“Þ?»‘îHF•ù+ùwëi:¿³’¡TÕ¦…‹*.#{Y,–ìÌÜ5Ü7Þïú¿ç[š}Cäç[¹ <°€ CEÏ X¡n6º€%¶1âàT*$ß™¦i•JÅ'Ç|ñB„Ã0zÆ´6ÿNüTff&_׃_Èb±”¤¯ë‹_Ù½¡çßÕòÏLSŽäÜbÙB(¨ÏÌÌä/×\ý=ñ`~yÌ™³bvçŒÏ‰â\vÏ/ngf¯&‡…Û#B îr¥aüyÞ(=ÄÛ?ÇOͱ\¾0{NØÖ—ÞûþÙWñgó׳Ÿ*¼"C©+Òæ*XÊIJTÀ‰®áÿxë~Ö$ê XŒ‘uµ¹XÀÚÚÐóÐÚi V<|zG!ª&}éžwø“Ï}º­á¯_™Ù”'ikKYCUÀ’4ÕŠZ™?0 \É´Ûí ݯBt麸6Ô^BÁ€çOã§”,„аࣞßyƒåȬÉY“÷4•9 ñ·ùó ÃæÀgêf³9¯ðI›»Ïè·â>;ü‡ãóùð‡ R©”KG|¸ϨUAÒ\ò3t¸sJ,å*°¼J¥ °B¤ÛºäBñ«[­VN'§–”\µõÔŸø“{Î}P“¶Ì1nºÂ²,ÿ ŽD™‰ßïg‚œGYš ;¾ë- î,ÙóJøõÛõÛå.‰j€…+°Ðy¿ü³ÎcÎ@XÈS3ÚK+¯ÕÒFÜ’ ¢U¹·ïü{Óð^…¢)U‘¡ºÜ8§ØX£¢48“!ó:£Ñèt†?LÉm,ËžìuÕµJüïdéìÍl”x/^ðÅOÛÝ‘§¬iQVþ˜p@À»Ýý&’Ž+ksy=|üIc¿Ë4Dë%Œ3ª*ÓÅãíl؃óoû_™–3»2§–(™Åbâ® `Éy½ P®À ƒ8%/q:Ê6Xêå·y_,|ÒÂ(±Ñãö;?êù©^U[ç/θžá›ɤV2[=Ÿ©—#„Ž9"°âj»sŽhAX åW |‘¦Äd"8ŒjDƒ€%W ’$÷šùý~½>\&)` ^_’Ζ¬Ýqúo~΋rúí:?žnZÌ?Ų,ÞÈ&ÎL|>ŸàÍè½æµÖ¦÷ C-QGF5À¼(i/Å'.—‹C\ûséôk\´¸¥%òê@€¦è%Öë²µÅ{Þ pá7¥¢Õ×Ï¿;4¨ñØC(˜­-ÑБ*<É ¬ÂÂB<Ém6›í‹v÷«‡$Û¸Šî»¼*롵Ñ?&èB$mmmS= nfä›Ê³Ã;Ñ<þÐÎ& “Xd¡)Õm 3jMüÃ`(ð¿ÿÐá /Êŵ…PNÀŒ±°\AÀbYöäÉ“’:š¸»wí5%ú¾Uit·¿$wI0|§éI§Ò9™«¾³òY*"‘³Z Oà?4ÒúANÄ´A ÂD¾HSb²œ F5"d£7"T¨ÀŠŠdål°ÈÔ‚ôÀ"¯UÐÎÒtéUé ñÃ=ýo¿Ùö“Ýýoõ{ÛÉa’–àŒ`•.F‹£™¶å#ùrL,9Oƒ!’«ø|>Ž èÞ¿£ç6_’¡™+gߊFwýéH¥iÁº‚{MêL„P®®ìýøê9_Ï5–æë+ õÓIõ ÉXåç‘«¹sÄê†/Á=—•üØŠlT`M uuuS= q , !¨­­ê)cáÊÙ¹¿ü$¼t¶µ¾÷ÊÚ\åñdV—¡µÞµâG›>ú>ßDyÈÙû«Ïžü·+^¢(zÌ[U*î=$0ªˆ±K.çã #H¡ŠlrIJlQQ‘Âm‡8&Nz×aò¤îîW™šKÑù…Vþ$^'|mß‹M}‡ðà*ÓÅ×͹ÇbÉdçˆäl£–P‘ÄXV«UùòsD–*°ø"M ˆÉDp2(0G‹1T`Q¥Ñĺí]2‚dwR¦‰e ¡‚€¥V«gf,k´ïâ!„ÐH€mvìïtŸº¾øß$_1Æ3Êåä‹¥­­W‹Frg÷¬z4W.é⽺pz ÕjÍf³V«eª—)܇ÌIÒÒÒFFÂÎë]öÖWß|¼w¸ƒ¼°|u¶©°H²´…×>Øîlœfš—“VˆF°d&)`Åâoe÷DYº“„¡©go˜õØUÕc¸ˆðÀ €±³î¢ˆ€õA}ÏÏÑEÊãÉToddd~ÕÊ+k¿öAýÿãÏÔwì}÷Èï®›wט+°øB}<<Ì¿„ßïïééÉËËSo+_Y²ëè€!d/^ì]ýŸþ¤1¾kg×x=Ö¤Î\•{›NkàM7ÈT/®-„¤€ÅO¯Ž¢>ðÀ¦„QXö±Xãœ@,~QAý—ÂúÛ…YWgi‹ºÝ§ú<ç°ëÓ‘Á·ªïCƒAñ±>¯yOò݇HyxÈAþÁfÛrX¶®èúÅß*É W0)X˜ááᎎrÕMr#g\–Ùlv…"‘zèŠêëGï´À”X@B[“£Vµ¢:"6m­ïUl³ÙÈ=kÇf³1´ê;«žÍÐgò'9.ôŸþÈæê_‹‰» •žœQ…1ÚF „¼^/¹€ÙÚÚªP‡e±X´V¶t)BÈ•5íÌê©4²ù´ÛïÜuúüpAæ•:& {Ê’9Ùx*°zb[[›rYûPDÀ¬Ä¾HSb²œ FU`Ù¢{`Å.!‰‘Œ œ€E¦rX é‰Q•Qk¾ôŠü»n*ýž ë>ïýÿ‹dÖÕ¢V`ñ}Šå^7 ‘ÕL1®ðEåü¬¸÷:ÿwgëÛü:\½ý3¼ —¡Î^_ð;jŸ\Vy¾*Ëãñô÷÷“ó$%»ÆrÛâ£-ÍËŒ:¸`Øíö©ž¸€€$°Õ9y!}¯>nìÃÌë}«ž¡Ï{œ;<ìÎÖ-âar)  }o”S¾\€\–ÅbÁ]‡B¼›y·Û-nPˆáÛ V®ñë-§¯x6¤Ö+”zìÚá „t£Ê\b˜ÂÖDm!´ÙlägÂqœÂüBmƒ‘3”@VB_¤)1ÙNy:úüŠQ¿ÃqÊãÇS%Á¸¶’ÕÍ¡ÁÁA¹õ!•JE®„ihý¼Ì¯à‡{ÏlûËÞ_Û÷R]ÿæ^O+yaÔ ,É3AFDŽø ‹E©]2&ð¢X§»yØ?ðöá_Üû'Ö×{ÚqóœkY“­+!³)›Ò¤ ÿv‚Á V冉eÓè3>kZ¬.iÀºa €€À¸¸¼&Ö4⢤•$8Õ¨É_pÂ{ñù†Ýî CŸ »â!³a­Vk2™***Ž;†s&Ç#î'('`!„‡ú÷ŸýØåsìí|¡÷-š<Ö׋3? Q3Ó—ñÇdÁ—ÜÂx=°Èi­V[ZZª°M`ˆ(³Ï„2ûD¾HSb²œ$ÈF„¿¯;çÕQÆÏ+5¯™Öt$#()²È™.Y,–eq>`6›Ö‡$;^œ¹NCë3Œ–ÒÂòí ›YßÙ†ÛÕÿæW ¢)•ßïç8Ž¢(¾œÊjµ*x`‰› JÒÈkjZì–ßïqSŽý’ÏÎ2¯ )BˆaÁŽN9+###??Ÿ<ÃÛ‰â‡dÚ …H+–M£ŽHb“>Þ=`b©««?A@Ø$r²€¤àòšÈRÞΦ ¢»*™ÆÙívR“R1šuµ·â‡'ì»ýœ‡·Kçl<ÛÕüÑ©¿‘göèà'Ÿ÷½!P¯Ä z;ßë|åÐжdFΟ•DP…2›ÍF£ŸT¶Ù XGÚw¹|«/›¯‡\·Ì×O3kÂù¤ö$—êÅëE¾M“ÉTXX¨p-T`%ðEš@“ˆà$A6"œp^ßÛ%#(é.·g¯7/;Y‹-FRÀ2ªÌK¬×Í·|åê9_¿ªò›xG!ëë;lû!Äqÿ#ÞÞÞÎKN XbÇÁ™ñT`á͉]]]­ÎO0\ªfФ­)¹]EiBZÚPmZÌŸ'“:¹¬&ªù™ *°Ä¯"fp$²* X‰¨W€ `0^f¦g›Â‹W¬Ë¸MºÛN§Ã+c¡PHàuzÙôëÓ´áÜÑrÿ½ci¦ °þvàå@HÖ£”GCëóôb; „Pˆ c?þbð=•J%°l®þ†Î/¶ÿÛçÍï!"YDQ…s#rSÁfKÒZ«¡o·Üø}Õ%ÖëSâ‘«´Š·‹¼§dMB X°€ Ky›‡l9Øéñ+eZ,RÑjµ‹Eaÿ ¯añ(› +,>y<ž@ P`¨ª2-Ä'ØÏ:\M!¿ßÏo–t»ÝÁ`P\¢Ž,&…Dõì¤-f\X¼zÕÚÚÚÚÚêp8NïÅO-*Y{ÍÂÛ¾1çÉ MNMÆ25­Á¯%¨¾Ÿ +¬pp€¤¶0^( ]:ÝúæNþá'ý—)5]¶X,ÝÝÝü1˲dM–N­_Rº~{óküC‡èÓ¯äé+¬Úb‹&×ÖÜâ ²ƒÎžì´ƒÖÔØÿ¾°Ä0«Û}ÚÏyÉÊPg¯ÎûzºÚêŽô{ÏùƒÞ èöœ!­%Nï)rT-ÈXå :Û\Çm¾îu¿ðt¹}‘6Ø­ƒç=€Ó;µZcIK£Ñèt:2SLOOçÄåW¾›Ôæ(DñåWêìEÖ« õ¢˅ IDATÓÉÁd'—ÒEM×hš¦išO[C¡¹#2êZ¥ÍIX°P \X–Ue=vUu,#½^/˲ø7N«ÕšÍfI÷ß}~®ßáE±.ÿÇz¯_P wOÞ¡¥¥…HQ”ÙlŽt­›ж€ät:}>߬«:ÝM΀!Ä!î³Þ×ÖÞ?44ÔÔÖÐÈ~áD³%·(ÊÙ/Fñ»@ ÀÏ$® ,~sbˆ ú:»\Í}žVþ<…¨ZëJ³Ù¼bÁ& qF*¿ßOº+ ñe5øx ée5AbIX@B[“M$ûôäÀ£ë”²L³ÙŒ¬žž²;!˲eê¹iªF‘žÓ=î–w BõIß0[[²*ï6È3¢îíqœëu´Ù|=&µueö¿h=BHϤ•fñƒ«ÓU¤ÍÝݿŠoßû´ãõgk»ÏòJÞÿ£oö°s4WñKˆ÷(|LQ”Á`Àɇ¸OÎl^Â|¥Ð\.°Î9Ï÷–NW[׿}óÌÈ!-­Ÿž~ M)%^cNõB*• Ï„\eU«Õʃ¤T`%,ðEš@“ˆà$Q[”þ“gÇ8˜÷ äÅ1npÓö3üñëûÚyK.‚EEE­­­¼äñxøò(ül,?Á’ˆ,£Ñˆ=ãN§ßïWÓºåÙ7mïùmˆ !„üœ÷£žßíì}ÈÛêt5妕ŠïÌÿÜócÈóYYYb¹Íï÷«ÕêP($HW”½8Žôumïþ-Þ9È“¯¯Ì2„í«r­ù^W›ÔÕa&ª‹ÔéúúúfΜ©|9YeM¬Äºa €€$í%;w­¿äÅÝáöyŸ7øƒ!5#›y9‡Çãiii©¨¨àóK›Íæw‡®+~äÐжFû.É^6(D]b½–BTNfþâò¥üM<Íf#‹ŒHŠ 5kóîüg×/ƒœ!àü C;•_¥¡ko»úLž~šY[¢®ä¸ùE£ÑF¡^¯çOþogÿëíÎÆNü¿ëçݵ0ÿJÁ [Fp?%T‘6פΜkYySDïE½^O.®Êeɱ,ÿ’× ,å¿A)`AV¢_¤)1Ù&·o9nY\Œ¬é±»ýzÙ_C†a222°.688H/OTEQV« XÝÝݼ¢”¯Ÿ¶0ëê}çÏXoÄëvŸ9Ùw@P¸ÎO  4)F#®«â…*Ç#°ÇâÍÑå³ý'·uýÆr ÎÏȸGÕ¡$P%é;F¢`â®lëÉ3àˆ¤ˆP•h@7 @ðÀ`¨)0áAOàÐ9%¬‘‘ò¡ÝnÇ!ŠÒ,ʺúê²4²õü˜éé—di srrx§ Þx¢¦¦¦¦¦FáªLmÁRëõ t*CQzeº632OÓðÞ}ƒïnnúÙgÍá$ç¯6_ÏæÆ÷wmsXwбµëÿÚ¡@зùÀ/6íü7Ö©s‡»Ý-øaEÚ\Á«“¤ ?à8+°ð±@ÀR¾ÐFz`¡ Hz.™–Y™“Æ{üÁwu+ÏÌŒ¤CCC X±#¸P«Õ’¿òÃÃÃX—™™±lAájÉ›ü@¼àB¡P¿ø¼Ø²“—´ÄnYH~aÛà©7_«WêìÙùKð› .##C°áQ2«‰%¥!ÇÞx`%;Ð P*°˜.žýú¾vþø³“‹+2•ÇG%K[xuу«cèô¯{ØßŸmɯȟ®A†æö†Îá–Ao'…ÐüÌ+ôzý¬Y³—[,#•€i¦ùÞŽÆáˆ“ºžI«N_lÕUÖj¹4–e]á½ôv ®}óÀÿ-,[mÔšø ,»¯o[÷oÜÁ‘Öáã¢T´Ú?Ú]¾Ã~ªkxÓÌŒ¥µ«´Œ¾ÅqÏ5sô¥éj«Ü$†ÉËËœ‘)w ™(Ùĺ©ÁÍ‹‹žýGØòõ}íw,SªûÈÊÊ:s&\±e³ÙÈcOÔBƒÁ öÀ#7Tß×1ØÒë9+xÊæë9ã8TiZÐå>åðV¥/¤ƒÀŽ ˜@ ÞÈŸ8¸óøý~±gVcÛ‘MŸ~Ü98Í2§Ò2§2{N¶±­øež¾¾®®.Š¢pÅ=†¢(lЉ‰Z·…+°âõÀ‚.„D€€$à‘ìÔÕÕ-¯.ÀÖAÅ ,,Kgg'ÖVŒczz¾Úg,GsB|;ê³gϪ Y3 —"„ü!¯šÖšL&É»iµZ±€EîÎ[˜µ~È×ÕëiÕ2†Ù+k2–ª( EQZkOOBÈ J_WðíÏz_ow5’7qxlo~õ¶K¾«ÑhþÁ»ã†ËÊ8Äù¥z#†¸@»ó”c–®°×uŸ/7\¤ð˜L&A½\Vçp8$m\Iä–ˆ£z`îBy^‚_¤)1Ù&·ÖGÇûú†½ÍÇöËEÐh4j4^` ƒ½½½ø©‰ÚBÈ0ŒÂ/µN£_•{ëÖ®_§«³KÓfuºšZÎ7¥9lÛvfäP·û B¨žýl®eÍ4Óü––I­*Þ ¬`(p´}÷Œüy !t¤eï/vþ»7©½Z˜ÿ•®zZî=òÕñ*•ŠeYÉ­ã°&îçÎ+-•ð#!·‚$ ` d{ÉÎòåËUg†ðÃÊ–Åbt8ÂêEaåÅl6“î ………dN#î­¦µ!ƒÁ ùB’]‡4 öÆ¢)æ²Ü[TgÖ̼±éø)<†\lTQšÕywøW£­u¤þÌÈ!þüÇo^6ýZ­J¿­ç7®à0’bšyN¦%kÿÙñoÐÝå<Rˆ*K›#y-îcˆ‘Ëêý%QH‹•ÿ‡ˆ…ÊLX¨LTà‹4€ &;ÁäbVaúEÅÇÚí¡@ˆÛ¼¿óþÕòk9ì¨Ü†ôC³€…í®ð=媇4F£Ñ1i×—?“§«À aœ;ߦ!4°Õõon`?[d½¦@_%¸¿µP|ÉT`ÃmŸ¿¼ãqš¢Ë¬5•9³?=ùŽ/Qf¦/[7ýëQßiiiiì~í±”P)t!¬ª¾k1ýÒÄ›ÄVÀ €‰á¢â †× és»e[/›ÍæiÓ¦áÂ"ŽãHŠ,žÏÎά°Å5%IKpRϘ.¯¼± §gŸljr;ÊÈXŠ 5K³7˜ÔYáÉ„‚?ÝúÐãoÞäðG ¼ÒÕV„Âï«&}éºÒ»¸üùû/.M---ªôLšÂ[ X’ùeŒHfØ4MGÍ¼É ¬ ¬|)Â-‹‹ðñk{ÛFÚl6¹ý}cÞB8<¯V«].¡cúEæË4ô¨t…¦ˆº$.ðqý­Îco·ÿlkׯÛ¶ù~±€…»Š_·ßÑÕÐù…äTçZÖ,²^C¡XÿÉ&÷» /`9½·/<^¯aŒZX™€¤!á¬Ûo¿=''g×®]S=à‚b·+‰@âÃGp^iÄÐôð¹(1%,\‡O–ñ’ D!d6›É“‚&}$’–Z­d6|ÞI.ljµZA\“UbœY[´D|Ûò´9K³o@ˆÒ3iÕ鋪M‹B~¿Ÿ¿0äçjÍ—ÝPüè‚Ì+ïYñÔ 7mùÖÌç×ä}#O_ï Ó骙F£¼›Í†Å>’ôôô¨û‘L†Í X ƒ‡ì`âž Ài ALv ‚IGi–aÕŒlüðç[Ë1BÈjµfee Nj4ñÿ]Z?Çr9œ¥-úJþ]ߪ}®Êt1•ŸÜ:¡Z­¾õ’GTtDÄÉ1]œyÕŠì›Å‹Çù|>¼0¨cŒs2/_V½.ÛT(Þ(°ÄcÄ0 SRR2mÚ49DAÀRøöø¡°í}šV¥Q%ÜÀ_¤)1Ù&#÷]YLúëÝv²¹ž€1o!ÜÓl6óbPnn®`¤\¹tMú’}Õe9·^]x¾¾2×\´,{ãË<€7Éœ²|çìË{ÞÙÞó»-í?m`w"„€dù‡¸#ݟ⇗×ÜpéôksLE˲7ò»iš7Œ— ©À"Íúúú”¯ °²ÓÁÁ=ᨫ«›ê)‰ L AmmíTO|ç•V´F„¤€¥P%XaãÇà6‚:N!Ë7~Fç[ü6¼¬C¦†~¿_ÎçB«Õæg”^1ëæON¾½¸bíÊêkŒ!kc£ì‚­×ëųE„Lf2™Í­u:àEc° §M›u‚€¥ð7hs-P~•¸Ài ALv ‚ÉÈuó Š,ú›!äò‡þ¼»íÕ?¬f³¹¼¼Üf³õõõ vó¹ÝnAávŒà{ò±žeµZ†!«Š$Ë£B4¥º"ÿ[ø!o*:ײz$0tÚqPò’^wk¯»•?>dÛVd˜nðñܯ¹ÃuÒá ÏM§6ܼðAZo·Û 7´IKK§z…Æ*`)˜¸OŸ>]ùÚ²!`%à(ÆÜ’ ŠB¼\s¢Ëá „´òÕ:iii8Cr»Ý@@¥RÅREfrýy4 ~ Œ¸Gµx ¡Ïçà ðU]×Ï¿ûúùwkT:„Î;%X¸(L,Nq'Ø(Nà,‹Ífû¨qàôP!¤Óé2‡FôMÍ_»¤¸8SÂóU€¤€%0…ÃÂþA uQÑÔ]—–=õNx-êçÛN;½JMc|>cG‡üq×nÌÌì•4_“>„úB÷¯®HOO'Œþþþüü|³ÙŒ›!ªÕj±ªe4ùƒ¥Ö ®Àp—;Üa¹Ä8sØ?Àú„¥I!.ðyÿ×þ•\T£išÏ¸š‡#îW—T\¡SëÑh«,É•Âx¹ðX¤ƒ;ôV€ä"Ev‚PR<õÔSdýa}}=¹uœ|Š<¶Ûíõõõ’OÁàpå;d5¹Æð·Š?úË{;î@Ó4)?ñEX¤€e0êêêÈ,„—®Ä–ܻܨR©:Ã0õõõdêÓÖÖ&WÅÏS£ÒiT:þ…$7*b¼^/ùÆùÙ"„ÒÒÒùÙÀÀ€ÀµÏ¿#³Ù¼¯Oõƒ#¯r¿zÈýònÛß;óøæ†ÏšúQ Ñ”°ÈœUò6"ϳ5(©þŸ„;Ààp¸Ü!êî¾´\Í„”Ïô9ßÜ ðßÞmþõAÿC,ø9ž¨ÿ>iììéìì,///+++++£i:33†¢(,¢Ñ³*÷V‹&/ÏTúغW®,¾k]þ}¤ó&fÐÛy°›Ûíö…Ü]îS'ì»>ïÝüIï_vlét7áa—M¿–ÿ$I §@㉅¤VÔ;D°îp¬©?ôDJÏêÿI¸Ü!)îðÔSOIJ1hÒÖ&$⺉ñ–ºº:(Mjp7¼²÷íƒá6y¯Þ9ÿ®•e W566öôôðÇ•••ÅÅÅ»víª͒%Kt:ÇãÙ³gF«Õ.]º”¼ªººº°°Pá%<(èQ=kÖ¬þþ~ÒaåÊ• Ãô÷÷744ðg²²²†††$¿XøÜ‘< wîÜ)ÉS\\¬×ë›››ù‡¸²}ÿþýxï$ÿ” Ã`YYYyy9yæo_tÜö«ýØ‘ óøúéÏoŒnèv»÷îÝ+8Ɇ ƒoìÚðJøªkçå¿ó„‡=Ài ALv ‚ÉËM¿Ø·yçTÏ"̃k¦=¼ÄtîÜ9ò¤ +èêêjjj"¨TªÙ³g9rŸñÝóç\œ“³oß>—ËBÁCCBþtuV·çL»3\tFSŒU[Üï9Ç!éR•dU?´ìEÞu´©© §+UUUEEEã|³Ç¸VK¶b$ñz½»wïæ5M À6XjµZùÏðÉwŸ~7üÞtmͯ«ãÔÉÁn·mO.8LžD#±Á •9P ¾ä@¶—ìàÎ+1c+^¬`0ˆÕ+š¦ùe½ñl!DRåQ‚ ,Š¢ø— —:N§Ü—’xÃÃ0‚2~š¦qåõzÉ·€/gYVPùÏ7±Æü½Ù«éìÍlŒŒ±9}?ÛzJ¬^!„NtÅÔö[ÁKáoÐæŠT`™ PiŸ¸Ài ALv ‚ÉËw.¯Hk[Cß#K£ø`Šw,ªÕj¼ÁGËè#N”NhÄ\œyÿÔ4ÓüwÞ~¼Où%(Š$9jµZ sáº-9mkQÖÕéjk¾jQÖ57–<~mÑÃ×ÖÜ»aÑ]3²ÍH_2ײæëµs²VñÙWKKËÀÀÖŒÄ]qÆÆØ,¹a4MG â¹…Ð4Þº9.$ WEcácØl˜ò”””Lõ€qAFp^‰ùÆ^þøÀYvf¬‰ƒÍf#—ÎÈÂ(RÀb‡“…N±Xb½I°W1 Úl6>ÛS«Õ‚m}bœN§X„|GF•JÅWŠ…B!rÎøZ‹Å²¬äÖ€gß;‰ÇÏ.L_?'¼ùòjëÕçÏÌ,4î ßüD×ðüÒè ´J¥4Xä,…¿AÖ[“ø"M ˆÉD0Ù™Ú^1;÷?¶œàwœè q­ØÌK¯×“)J¥â5/qÝ–œÒ¤¦uŠ¿Gž1htYz{{دÀn·Ÿ={ŸŸò+4Ö-„ü0(2ja a‚Ý0NÀ­êË tšHvÈÎ+Xÿõ~ó-—áÖÔ±#°ðq¼XbK¡±«F£‰*`±,+0¡`Y–l.‹r»ÝZ­'UäךÛíæßš\Šy¼søÝCÝxüÏþ¥öŠÙ¹r“™Yþ÷ÃáÁÇ;ÇR¥R©øDáoLÜ“ø"M ˆÉD0Ù™Ú.(3g¥iø nƒ#¾ƒ­ìÂr‹Âx ÿo6›ÅåZ1JBè¼½)`‘ë‹äšÜä X1V`I¾)†a¢qÐ [P¯` !Ì àÃ]Ã/¤dç$)NÉ XbûR1†T¬xG-¹Á1Ú` °Ùl¤¯î{NýäŸM •㇣¯Ïsi©¦ÀD#„³²²$—%,N'мp{èXÜÙ§ÜKRçbF9ˆd Bd5‰H}}}mmíTÏHP@ÀÈö’A³MÚÿ¼~Ö9Â?üèDßG'„«ˆ³ Ó—WeñN N§spp? …°±:’IP(Šr8Qûþ<üÚÑ· ¯.6‘韤=’Zo¤(ª¢¢[­K–ŒY,–®þ¡?î ¿A½^oì°Ûí¤gV«ÍÖ76‹_zÀá}ñÃÓXõJÓª~õõùŠÎ­!¤×0åÙ†3}Nt¾aTw¹ ,…¿AÒÄÝ [ø"M ˆÉD0Ù™ò–d¦ç™ø&Îþ`èßß<õ’ -U`Ò"„œN'™>‘È Xx‰Ž‡wpG¶K,WÅXE®}b‚Á r‘Zþ¬4hA˜ˆ@7 @°˜î]Uþ›g´ÙåüøÆí†3Œ´´4RÀ ¹Çqœ\–†ùÓ®¶ÿûä,Bè,¬°0!¿ßϲ¬ÜUâ ,¾#µrÕ•Ùln÷g¼zèÜùn„†dƺbnÅ£S3ïþë’%•™QG"„f¦óŠ­a¼[Þ€/‹ZáÀx¸bv/`ÅH3zÑ·¤€%¶;˜kl[Y–=ÛçØÚ,4©P©ºsš‚ 6©õ‘ÔÜè†(“CS/ß6wåóŸÉí¥ûèD_Ý©ÁåUYH±3 ЧuÉÑvû}:ÌïïòóV P½ÄVŒ®X»[c˜¡ôTô›÷/¾¼&;Æññ6"ŒWÀ²¹À .kgåÄÕ§k8uŒ\–à ÞB5=`fl­oÄŒm ¡ÍfÛßî~õ[êÉXå?ØBIX@B0åŽÀ8‘Œàòª¬ÿ½}î¹Qú¶Ö÷m¯}=õNãG.GY,–eñN=£ÑH=AÀb]þ¯ìsï2³¯Óó¬èë„b¹*F/öm QlVcDES¯}{áú9y±_o#B9Kîopt BÈóø"M ˆÉD0ÙI„®ªÉ~ìªjå1]¬çÏ»Ûøãg¸PZÁ©S2•€5QåWh&îmöèÊ2°…’°€„`Ês`œÈEð¾U‚3WÏÍ_ñÜgüñŽóEX¼±úÀÀ@GGÇq%%%d‘”ØL )fi‡¾þ›§ûF𙆾€ËÏÔQ<¥ÄéZ,Xmƒ.\ê¯fèï~¥Òëõ²,‹&jµZ³Ù‹¶¤2ëÚyQŒÛOŒ£KÖÁÝI8¸CVb_¤)1Ù&;‰Á4­ê'7ÎVÓ:àÂVŸ •••!ùæÎH~ !EQ¸íŒF£ÁÃÄㆠ#‚Q,.ï12vkXÂ+.` ab’:2°€€ÀeyUÖê™9;Î{º?òÚ± ñ³6›Þf³•»ì.&r»Ýýýý¤†EQTFF†aˆÖw÷!$Qút²ÛwÕñBèpO`Y±Z¹ XÀŠEu"»\/©Ìä“N–eëëëµZ­ÕjÍÌÌŒj6?fÈF„-ýΨÝîQÅöQ:pp€D£(S¯fh0„trkZC2 IDAT ŠZ¥ÖQ%P B.רùP(„}B†¡ištIÏÎÎîééÁÝn·œ©hsÏÈõ=‡Î±¼ëâXÞËØ,‹ÅÒሸT\U¥ÍÐR!•J•••cý²ª¬X†P¯@ÀàBóÔu5XÀ:Ðj;ÐjŽ8µçŽ+Ú!ú[ËŠ'B4M«ÕjR,‹¥k;!`áî×f³¹¨¨¨´´4ÆUÄ1#hDøÄÛ'²M²I›ÛíÄ¥a¡ûOãý’>q‡-„¨hª8SßÒïDqjpÍ*Lr‰J%°G8•’>¡,Ëâ§]¡Z†Ö‘Ò1Ýc9{23sTÙö!×ÇzùY!„þû¦ÚÜôèB’ S¢(*–ÜÉhJï}Z­VÄkˆ~åì<,`m­ïýîW¢¼(iAQTÔ ,ÒÁ}íy¬ Ìò*kÔ~Ûî±T`u±îawxccº^U`U,ŸDA$~@°HtÔjµ 늋+kó&p2r\1ûBÈd<åñ4"›€u¸ÍŽç–Äd;°¸"â¿/~÷X¬ÆÑåWSÑA˜DÀ†P¶⬚q!<Î/›aûâ¤<ÛXß1Ì·ô;UHôÄŒ±‹°æÇTµ¨"“¢ß§¡sxÄÀ•br¢U,kêÁÇ‚ýƒ¤6 ` A}}=híIM"GШUÇyT9‚@Œ@Sb²Lv’+‚d#³Q|Ü%MÜ•qz§zÃRMQµÅ15û3ÔÓóL¼GU0Äle/e‘/þ ¬a|,°’+ˆÄl!‚’’’©ž0.R&‚|Ûž/z…R(‚_f ˆ)1Ù&;ÉÁ¸Ž¡ëh»=ÄWR!T—µ 3Ê+†]„ñ X'‰ ¬‘€•\AÄÔÕÕMõ€Ä, !€NÉD0٦Ă˜ì@“äŠ`\Ç `e€Ç'³xaƒÕŸ€ËÄ»”*°’+ˆ€°á É(ÏûÂ+°ðqŒX<—X{b¨À …BøØï÷+vû»íþXÍÐÓrŒÊãH%À É(·°]zÛ ;âT´lC>b“€5ÊÁ=_…Úâ ƒ†qù‚¡nÖóãwujÙ—s»Ý½½ƒÁ`¨nêÌ>áÓëõrã{ìžóûÑ´£š‚ øÔÕÕA±hRLv ‚)1€ &;Ád'¹"hÔª²MÚ¾a/BÈ u ¹Ë¬¹Á*•Š¢(î¼öãóù”o qõk^iX*šZPfù¼y€øÔ;±_‹¡áè£BÕH´ L® bÀ†P ò-–¼ßÅ_–<óéÞó{ôî[UQ*/`¹Ýîîînü&FcµZ X—ÿ'ÿlâsÓµ=ÿ³>®‰=ú·ú¶žŠë’1ðïë§?·qÖd¿ p±Ûí`d–ìLžDXÉG¹Õˆ¬_~ÒÏ¥n„ìÑG!„šWw_æÅÓ2£7bw õ P,€ä£â‚X˜Çåàγ²ÚúØUÕ±Œôz½,Ëz½^þ¡V«5›ÍZ­6–k—WgÅ;1’°€„6«';Ád"˜@Sb²Lv’.‚ ¦WÈÜ’¸+°rÒµ?¹qvŒƒY–µÙlü±Åb1›ã~9’¤ "±“ îQàÀ—¦Çï??ËÈñ:=°fZ‘EÖ- & S€É“hRAú @‰-t,%@À˜r&O¢¡'ã¦/v{¬mP€Ä"˜ì@Sb ALv ‚ÉD0€ @ ´µµMõ€qLv ‚)1€ &;Ád"˜@/ ÇŽûÚ×¾VPP Ñh n¹å–£GF½Š¢¨Xnã°‰½Ãø_tjïÿ%!6ßÁB¸¼ñÆ>øà~ðƒ 6äååõöönÙ²å¹çžÛ´iÓM7ݤpaŒÿrÿ?ðÇp‡ÉV¾Tªx`)ñ¥ú_¦„Ó§O/]ºôã?ž={6y¾¡¡aÕªU{ö쩬¬œª¹aP"HÀ)MàÀTòÒK/Ýÿýõ !4{öìxॗ^âRåv»|ðÁÜÜ\¼{ŽÜFwôèÑ+®¸Âh4Z­Ö{ï½×år‰‡Q Ÿy晲²2­V[]]ýÊ+¯/ÚÙÙùÀ˜L¦òòòïÿûGyò‡ãûßÿ~UU•Á`ÈÈÈX»ví{ï½ïÜ&vJ˲gÏòì{Ý I*¨€_*-3U©««[¾|ùTÏ;Ád"˜@Sb²Lv ‚)q²™>}ú–-[fÍš%~ª¡¡á†nhjjBQuçw®]»výúõéééüü/÷æææ+VüèG?Ú¸q#BhóæÍ{öìyíµ×øgñ0Š¢î¹ç«Õzçwæçç8pà›ßüæsÏ=wóÍ7ó7,++{òÉ'o¼ñÆÇ{¬¢¢âùçŸGòÁ† ÊÊÊþõ_ÿµ  ÀápìÞ½ûå—_þðÃãšÛÄN ò¬Íf‹? a<˲X/Óétf³Y§Óù†‹Ål6íZØB¨X0Ùèõz›Í&©Œ¸Ý,—Ë…¢(êÅ_|ä‘GÈø_î·Þzkmmíã?ŽŸzæ™gžxâ ±€õÄO<ýôÓxØûï¿ÿôÓOïÝ»Wüê6›íâ‹/>sæ ’—L&Sgg'ÔÆ6·‰æìÙ³­­­ .0eeeåååc»¶\ýõrOíØ±—,ñ|ík_“ùo|ƒ|¸dÉ’ææfþØãñ<ýôÓ3fÌ0 Eeffž;wNyJ3gÎüÞ÷¾×ÙÙ©0&êÜ&vJ@\€€@tJJJø’"1gΜ)..Æ ån200ŸŸOž<Ä”••‘- Þg÷øãïÞ½ûõ×_ïïïç8ÎívƒAåÉÿõ¯íïﯬ¬¬©©¹óÎ;ß}÷]q¡PÔ¹M씀¸PMõ!„êëëkkk§zÀØ&;Á‚˜@“ˆ`²L ˆ“ÍêÕ«ßzë-I¬·ÞzkÍš5ø¡Z­–»‰Õjíîî&w¨uwwKޤiÙš›Í›7ïÛ·¯¨¨ˆØÒÒuòåååo¿ý¶×ë=yòä¾}ûž}öÙ¿ÿýï¿ýíoãšÛÄN c±Xb,f2<°Æ3ŸI, !())™ê)ã"˜ì@Sb ALv ‚ÉD0€ N6?üð²eË6lØ hDØÐÐðÊ+¯ìÞ½;–›¬^½ú7Þxì±Çð™×_=Þ™¸ÝnR ùýïã…Z­vΜ9sæÌ¹á†JKKÖxæ6æ)!„Ìfó˜MÓyHøñX°'2 ` AFFÆTOÁd"˜@Sb²Lv ‚)q²©®®Þ´iÓêÕ«øÃnذ!77·¯¯oË–-Ï<ó̦M›ªªªb¹É“O>¹råÊôôôn¸!ôæ›o666Æ;“uëÖ=üðÃ/¼ðMÓúÓŸbq@_¹rå=÷ÜsÙe—ååå ¼üòË+W®œÀ¹aJÈø%°Ä<°ˆ‰[n¹åÃ?ܽ{÷Â… Fã‚ víÚµuëÖ[n¹%Æ;TWWoݺuË–-eee555G}饗´Zm\Óxùå—B³fÍš>}ú‰'b)wzúé§ßyç¹sçšL¦+VƒAquÕxæ6†)q1YÝ /$“×£€Ieûöí>úè‘#G¦z"$òܓɓh  Hêêê¦z À¸€&;Á‚˜@“ˆ`²L ˆÉÂu×]÷ùçŸ lÙ²å[ßúÖ#<2Õ“ “Èsû’“ µKPÉÂ[o½õâ‹/Ö×׃ÁÙ³g?øàƒ·ÝvÛTO*L"Ï-)˜<‰&¤°¦ØB|I H`³z²Lv ‚)1€ &;Ád"˜@ …I…Íw°…`Ê-„$ EÝ|óÍ’OÝtÓMEÿþã¼b€€@Üìß¿¿µµUp²µµµ½½}*¦¤8 ` ÝnŸê)ã"˜ì@Sb ALv ‚ÉD0€ ^`î½÷ÞŸÿüç‚“/½ôÒ}÷Ý7þ›ƒS Ü£À+¨¯¯¯­­êYc"˜ì@Sb ALv ‚ÉD0€ ^H(Šª©©9yò¤ÙlæO²,»`Á‚'Nèt:üïôüãÏ>ûl}}=B¨¶¶ö‰'žX¿~}ssóÆ9BÓ£ kB¡ÐE]´iÓ¦Õ«Wów (*<ÿüó¿ùÍoº»»KKKzè¡x_rôèÑG}t×®]z½~ãÆ/¾ø¢Ñh”T (Šr:?üð›o¾IÓô·¾õ­Ÿüä'ç»ßýîÿoïþ£ª¨óøÏ *j *$ R!¡ Åí‡bJX«‚?ÀL覥y’ô¦¶(k!.G ;ñK=pÖ¯«e›¸ˆ~5OŠù£R@<‹‚šˆìJšiˆB"hÂýþ1gç;qåŠáÎŒÏÇ_s?Ÿ™ÏýàË1ï>wnvvvcc£Á`HMMµ··—ÎÿöÛo£££Ož<éââ;{öly¨Ÿ~ú)))éÓO?uvvž6mZ||¼ƒƒCkf{Ge•ÇÏT»ÇÚ‘ë0oWë®m¿J?°èHÒø¼yó<==—,Y"5®Zµª¶¶6!!A¾O/,,œ0aš5k‚ƒƒM&ÓW_}e4÷îÝ2sæLå°Ÿ|òɺuë äDQœ;w®³³óo¼áêêZTTôæ›o&&&JOà*//5jÔòåËÃÃÃAغuë‘#G6oÞÜRkÖ¬Y£Gž4iÒ•+W CXXØéÓ§'MšT]]m0f̘a4A8{öìÈ‘#W¯^=a„²²²W_}uÆ /¼ð‚4”‡‡G\\Ü´iÓªªª–.]úØc%%%Ýu¶-ù¿ÇÿÏŽâõmäþ™üôœ)þoYw-,K(`Б¤;ñ²²²àààŠŠŠÎ;ÿþûïÌËËsss“ïÓ§L™%_¸víÚ¯¿þzÛ¶mEEEÓ¦M;{öl—.]¤®›7o<8##cüøñÊVlll||¼<ÂîÝ»ããã AˆŒŒôó󋉉‘{W®\ÛR+==]ªO ‚PPP0nܸÄÄD¹%??þüùÅÅÅ‚ ¼þúëO=õÔ{ï½'uíܹsݺu_~ù¥ù°W¯^>|ø¹sçî:Û–PÀj ž¬áíííëë»eËA²²²ÜÜÜ”'?~<$$DÙzìØ1A†îåå•™™)wefföîÝ{üøñÍÞeÖ¬YÊ—Ï>ûlyy¹t|àÀf››""",LxêÔ©ò±¯¯o]]²ÅÏϯ¢¢B:.(( •»Oœ8!744ÄÇÇ{{{wïÞ]ÅÞ½{_¸p¡5³E[èaï;°t //oäÈ‘¶ž¬G‚ZG‚:@ˆ:@ˆZG‚ZG‚:@ˆI¾ÏÍ͉‰))):thzzúèÑ£•½555]»v•/¼y󦣣cCCƒ û÷¨¨¨x衇~ûí7©ž¦AÅÆÆÆfÊ’{ííí¯_¿.=JR__ß½{÷–v`555‰¢h¹Eº¶k×®·nÝR^nggרØ(ÂÂ… ËÊÊ’’’ Ô£G†††nݺµf¶-áX­Y¥ Xt$ùNÜd2 2$$$dÏž='OžlÖëîîž——7`Àù‹/Ž5êüùóÒË€€€‰'ÆÅÅ­X±";;ûôéÓR9IYÀ2¿å—]\\Ž9âéé)wUTTxyyµTÀjÖn¡¥oß¾'Ožtuu5§ÿþG•÷š•––2¤5³}ðB :¢(Æ>úèŽßµçïï¿k×.eË_|áïÿÿw÷,]º499ùÌ™3)))Ë–-Sn†j   ììleKVVÖ=Ð’1cÆìܹóŽ]õõõÊ=_7n¼/ïËôP| j™Øœå;q¹·  `âĉk×® aß¾} ,سgψ#¤3›šš|||ª««{öìY^^Þ©S§f#XÞÓT^^'}ð0''§  àóÏ?oû¬Ó§O'%%Mœ8ÑÁÁ¡°°0%%Ezˆ{dd¤(Šü±Ý¦M›Ž=š““Ã, ;° s§N²õÐ&$¨u$¨„¨„¨u$¨u$¨„¨BÏ=÷܆ ÒÒÒÜÝÝÝÝÝÓÒÒ6nÜ(W¯A°³³‹ŽŽ®ªªŠ‰‰‘«W­7hРÜÜÜíÛ·{xxøøøœ8q"55UùÈ-« 2d÷îÝÿú׿<==ûöí›°xñb©kÍš5Ò ƒ.--eVÇÐCðªeêUMM£££­gë‘ Ö‘ ¢¢Ö‘ Ö‘ "AØ·o_tttII‰­'ò€btŽÿÌh j ê!ê!j j ê!>˜&Ož|øðáÚÚÚªªªíÛ·Ïž={Ñ¢E¶žî?=ì]b¦mÛ¶¥¤¤œ:uª±±Ñ××wÁ‚¯½öš­'õàj¿J?°lŽBçòòòl=´ j ê!ê!j j ê!:¦‡½KìÀ°9v`àE =Eqúôéwìzå•WDQlûøm¡c&`óy¢-(`Aø°ºÖ‘ Ö‘ ¢¢Ö‘ Ö‘ ¢ÿþ÷¿ÏŸ?߬ñüùó/^´Åt€{¦‡§Gñ ,Z"ŠâªU«~þùç´´4eû»ï¾;lذ™3grOû¥ýJ4z(ýPÀ %¢(VWWûøø”••999I×®]6lXii©ƒƒƒ|O½k×®„„„S§N ‚àçç;a„òòòððð’’;»?|Š«©©éÉ'Ÿ\½zuPP4‚(Š·oßNJJZ¿~}ee¥»»»Ñhœ?¾|ɉ'¢££óóó»uëž’’Ò£G;ÞÑ‹¢XWW·p᜜;;»Ù³gøá‡ ‹/ÎÎÎnll4 ©©©ööö‚¢,`yÊÓ¬¼Ùô¬ª%ß”ýúMYUkãl/x;¿àÝ׺kÛ¯DcéOè@¯^½¦L™²nݺ%K–H-ÿûß_}õÕ®]»ÊçΚ5kÍš5ÁÁÁ&“髯¾2 {÷î 4hÐgŸ}6sæL嘛6mêÙ³çØ±c•QQQÎÎÎû÷ïwuu-**zóÍ7ûöí+=«¼¼|ܸqË—/ÿì³ÏAغuë[o½eaÎï¼óÎèÑ£W­ZuåʃÁœœ|úôéÀÀÀ„„„êêjƒÁ‘‘a4›]eamü>ÎS雲ª¿í<Óš÷ê(>V°Úö.±Kjjjm= XµŽu€u€µŽµŽu€["Ý5—••WTTtîÜù÷ß8p`^^ž›››|O=eÊ”ààਨ(ùµk×~ýõ×Û¶m+**š6mÚÙ³g»té"uݼysðàÁãÇWnGŠ—Gؽ{w|||aa¡ ‘‘‘~~~111rïÊ•+ccc[Ú•žž.×} Æ—˜˜(·äççÏŸ?¿¸¸Xøã~( PžfÅàæ¤÷:TKVì8£ªVÜ$Ÿ“}¬»¶ýJ4<ĪðÃ?Øz hÔ:ÔBÔBÔ:Ô:ÔB´ÌÛÛÛ××wË–-‚ dee¸¹¹)O8~üxHHˆ²%44ôرc‚ >ÜËË+33SîÊÌÌìÝ»÷øñ㛽ˬY³”/Ÿ}öÙòòréøÀÍvBEDDX˜ðÔ©Såc__ߺº:e‹ŸŸ_EE…ùU&ÐöÁïãsJmø!QFãG}¤üf@™¿¿ÿ®]»”-_|ñ…¿¿¿üréÒ¥ÉÉÉgΜIIIY¶lÙ½–i‚‚‚²³³•-YYY÷4‚M 4èÈ‘#Ê– 6Øj22 XP…¼¼<[OmB‚ZG‚:@ˆ:@ˆZG‚ZG‚:@ˆ­ñöÛo›L¦¹sçšwEGGðÁ›7oþõ×_ýõ×Í›7/_¾\ùÌõ©S§ºººöíÛwÆŒ÷úÖqqq©©©™™™—/_¾|ùrFFÆ™3*zryK-Zd4>|ãÆsçÎýõ¯­ªRÑÇýzxzÏÀ %–ïš•½;vìHLLüî»ïAðõõýàƒBCC•'¯_¿þ­·ÞZ·nÝ[o½e>‚å/졤¤$:::??¿[·nááá+W®0`€ôŒ­»ÎÙBK+'`á4Ë-k×®]½zõùóç]\\æÌ™óþûïÛÛÛ[7”îµß«‡?Äê¯ú°oß¾èèè’’[O÷Mû•hø!è“'O>|øpmmmUUÕöíÛgÏž½hÑ"[O Ú@ ªpêÔ)[OmB‚ZG‚:@ˆ:@ˆZG‚ZG‚:@ˆêg0bbbÜÜÜÜÝÝW­Z•˜˜8sæL[O Ú ‡fîtš©IDATßñB¨©©qtt´õ,`=Ô:ÔBÔBÔ:Ô:ÔBlŽg`YB ÀæxP° j°  yyy¶žÚ„µŽu€u€µŽµŽu€%¢(NŸ>ýŽ]¯¼òŠ(Šm¿#ØŠvgg` '¢(zzzY·n]AA²v3wî\ggç7ÞxÃÕÕµ¨¨èÍ7ßLLL”žÀU^^>jÔ¨åË—‡‡‡ ‚°uëÖ#GŽlÞ¼¹¥Ö¬Y³F=iÒ¤+W® †°°°Ó§ONš4©ººÚ`0̘1Ãh4Jç{xxÄÅÅM›6­ªªjéÒ¥=öXRR’ W®\:tè®]»†*BqqñË/¿|òäÉGyDøcÕ©õow×Ö=ÍüŽnn[qkÛßî5èöÓ%,®kØ ë®¥€e ,$Ò=rYYYpppEEEçÎÿý÷æåå¹¹¹ÉwÐS¦L ŽŠŠ’/\»ví×_½mÛ¶¢¢¢iÓ¦={¶K—.R×Í›7œ‘‘1~üxeí&666>>^a÷îÝñññ………‚ DFFúùùÅÄÄȽ+W®Œm©€•žž.Wy Æ—˜˜(·äççÏŸ?¿¸¸ØüÚ«W¯>üܹsÒË]»vÉsøÓŸþ´páÂ×^{Mù's¯ow×–Õ3—QÀj ž€Þx{{ûúúnÙ²E„¬¬¬€€777å Ç Q¶„††;vL„áÇ{yyeffÊ]™™™½{÷?~|³w™5k–òå³Ï>[^^.8p Ù—!FDDX˜ðÔ©Såc__ߺº:e‹ŸŸ_EE…tÜÐÐïííݽ{wQ{÷î}áÂùÌ__ß´´´ÔÔT¹zeõÛÝÕ} èaï;°È÷ȹ¹¹111%%%C‡MOO=z´²×ÁÁ¡¦¦¦k×®ò…7oÞtttlhhaÿþý=ôÐo¿ý&ճ„?n>jlllö¨,¹×ÞÞþúõëÒ£©$õõõÝ»woiVSS“(Š–[¤k.\XVV–””4hР=z444tëÖM9ì¥K—‚‚‚jjj<8pà@óîéíÌkMMM:u²b¨–ð ¬V¬ƒÒ,¨©©qtt´õ,`=Ô:ÔBÔBÔ:Ô:ÔB”È÷È&“iÈ!!!!{öì9yòd³^ww÷¼¼¼È^¼xqÔ¨QçÏŸ—^Lœ81..nÅŠÙÙÙ§OŸ–Š2*;ÊF—#GŽxzzÊ]^^^-°šµ[héß¿ÿÑ£Gå e¥¥¥C† Qžl4ÇŒSUUuêÔ©Õ«W›pOo׫W¯ï¿ÿ^~¾ çÎ{üñÇ­êAÀG¡s?üðƒ­§€6!A­#A D D­#A­#A ÄfDQ4}ô‘ò›eþþþ»víR¶|ñÅþþþòË¥K—&''Ÿ9s&%%eÙ²eÊ-E­”­lÉÊʺ§ZR__¯ÜصqãFeïþýûÏ;7eÊ”9sæ”””ìß¿¿o7hР#GŽ([6lØÐÆ1a=T¨Z&X¾G–{ &Nœ¸víÚàà`AöíÛ·`Á‚={öŒ1B:³©©ÉÇǧºººgÏžååå:uj6‚åXåååqqqÒsrr >ÿüó¶ïÀŠŒŒEñã?¶³³Û´iÓÑ£Gsrr¤®«W¯ìÝ»×ËËK„ÒÒÒ‰';v¬W¯^–gn¡eË–-±±±6l6lXeeåúõë«««×­[Ǭ;b¸ož{î¹ 6¤¥¥¹»»»»»§¥¥mܸQ®^ ‚`gg]UU#W¯ZoРA¹¹¹Û·o÷ðððññ9qâDjjªò‘[V[³f C† \[[[UUµ}ûöÙ³g/Z´ÈÖ“‚Véaï;°P›mÛ¶¥¤¤œ:uª±±Ñ××wÁ‚¯½öš­'…öÅ,èÜŠ+l=´ j ê!ê!j j ê!ªMXXX~~~mmm]]ÝÑ£GïZ½"AX ‡½KìÀÒBÔ:Ô:ÔBÔBÔ:Ô:ÔBÔ:ÔmïÀ:~üxTT”“““(Šw=Y4Ó3€juDË`0ôë×/??¿•ç›þ¨]ç•ëÐíy­ÙHfÅf36ê!j j ê!ê!j j ê!j ꀶ?BXM,—Î;»ººFFF–••Ùz:°)SjÍÛ…††:t¨¾¾þâÅ‹©©©ýúõ+..¾ë°°¹ûTCjNuÏÀj&33sçι¹¹í4%¨Ü}.`‰¢(›lEëÒ¥K^^^ׯ_¿“€Ùßßáîû~.>!ð€SãCÜ•²³³Ÿþy[Ï6sŸw`YAù¹Â   yóæ9²OŸ>?þøcVVVjjêÞ½{m;CØPGìÀÿ§Ù±¹÷ßóæÍ¾¾¾Ý»w5jTYYY^^ž¿¿LêÔ¡ßBÜ+µ? 8 XP5 XP5 XP5 XP5 XP5=°~øá‡°°°ž={öìÙ3,,ìâÅ‹¶žîN4£ì%S:~üxTT”““S³°$–##P•°"«Rå:4}úô¾}û:::>óÌ3;vìhvËPýî"ËPå çÌ™ãééÙ¥K—G}ôÅ_ܶm›ò–¡ÊÝ5AÖ ¶üòË/¼§˜QUî˜ ËPÚS[BÔ|ëúõëcÇŽõ÷÷¿páÂ… üýýƒ‚‚nܸaëyáîL$·“©: †~ýúåçç›wYŽŒ@ÕÃBˆV¥š=ú×_ݱcGeeåš5kV¬X±~ýz¹—e¨ –C”° ÕÌh4>ýôÓ¹¹¹×¯_ÿî»ï–,Y²råʸ¸8©—e¨~–”°µÂd2Íœ93>>^ÙÈ2Ô;&(w± ÕϺ˜Ú¢IãRRR"##•-‘‘‘ééé¶šZÉÂß=2U9óì,GF *tÇȪT¹¿üå/MMMòË'NxyyÉ/Y†š`9DËPƒþûßÿ:99IÇ,C-R&hb jJrr²Á`0ý15–¡†Ü1Aó—J$¨VÇÔÆ5_À3fÌÞ½{•-{÷î;v¬­æƒV²ð7žLUÎ<;Ë‘¨ Ýk‹U¨®®®K—.òK–¡5 ÑÄ2Ô  .ôéÓG:fj‘2AkP;Š‹‹½½½kkkMLe¨-%hþR‰ÕÃê˜Ú¢æ Xýúõûå—_”-•••...¶šZI„GyÄÞÞÞÅÅ%""âÌ™3r™ªœù¿V–##Pj©€ÅªÔœœù%ËP‹š…hbjʵk×¾ýöÛgžyæƒ>ZX†Úbž ‰5¨7nÜðóó;räˆôRù[ ËP,$hbj„Õ1µ1DͰ:wî|ëÖ-eË­[·šýÿL¨Phhè¡C‡êëë/^¼˜ššÚ¯_¿ââb©‹LUμöa92U¡;°X•råÊ•Áƒ:tHnajŽyˆ&–¡F(ŸÅ|ûöm©e¨-%hb jÄÛo¿/¿TþVÃ2Ô šX†auLm ‘T!##㥗^’ŽÉTå(`é@k€ÈªT­_~ù%00ðàÁƒÊF–¡¶Ü1Ds,C5»téÒæÍ›}ôÑ¿ýíoR ËP[Ì4ÇT¡;vŒ5JYv¤€¥-–4Ç2Ô„ÖÇÔÆ5ÿ-„½zõª®®V¶\¹r¥wïÞ¶š¬3uêÔ¼¼<é˜L5ÇrdªQ¬Juúé§Ÿ^zé¥åË—3FÙÎ2Ô–B4Ç2T³~ýú͘1ãŸÿü§üU’,Cm1OÐkP…Þ{ï½Ï>û¬S§NwìeªŸåͱ 5¡õ1µ1DͰ† râÄ eËÉ“'Ÿxâ [ÍÖ1)¶s“©æXŽŒ@5ŠU©B?ÿüóŸÿüç”””   f],C­°¢9–¡ú >üòåËÒ1ËP‹” šc ªÐ¹sç<<þ¼­g„»8pàÀ”)Súôécooß¿ƒÁPVV¦óÌ3ünkkë9çœ3|øðõëׯ_¿~øðácÆŒiooWÞ bš¦©Ýâþð‡x ‹Ñ—/_~ÑE}õÕWôßI“&ÕÖÖþç?ÿáÏ_qÅ#G޼ùæ›Õ6„õ¬|Õ+!Ä·¿ým9IpæÌ™W]u•üù«®ºjƌʛÂëEÜß}÷ÝN8ÿ»bÅŠaÆÉ8餓V®\év3@PÑÜd×®]G}ô¼yóø•Þ½{wwwËŸéîîîÓ§ývzõêåõq)pE`Ò´|÷Z¼mÛ¶ÒÒÒ'Ÿ|òŒ3ÎÈrS===šêZ] ÇÄbê ®Üƒ8†Ä1 ˆ!A ˆcPÄ™3gnݺõ‚ .8ôÐCn؃ÎÄp •R‹[)„›7o>ï¼óîºë®üàòëƒ Ú½{·üÊ®]»ŠŠŠ\jä’|°¬¬lÍš5^7B…+Ö–-[~ô£=üðÃcƌѽuüñÇ/[¶L~eùòåÇwœÍ€“L&ù_ªP/`mß¾ýüóÏ¿ÿþûÏ9çã»\pÁ”)SäW¦L™2nÜ8åÍ€Ü Ü@½€uþùçÿéOúñlúîu×]÷É'ŸÜ{ï½÷ÜsÏ‚ ®½öZåÍ€Ü Ü@½€µtéÒñãÇÇö¥©©‰ÞÝÿýçÌ™³hÑ¢#Ž8âˆ#ŽX¼xñ|0`ÀåÍ€Ü Ü@ý*„)W 8òÈ#ßxã å¿ ž ÜÀ­UÐQ^^îu€Çp€8†1 ˆáq ʃHÒUÊçú@-èŒ!AöÄqaÅ‚ÑN@Ä6lØòåËg̘µªÄ=,PRÀ `€2 `€@ÀÚ‡7üú׿¶úÀÕW_]PP°iÓ¦\¶*ÔÔÔxÝ Ä1 Ž!A b8@C€ò BÀòtÆ€ {‚Q[*g5°þÏÿù? .\´hQÿþýM·½½½¤¤äôÓOúé§sÐ@°8ú裿øâ‹©S§–––zÝÈ5¨• vìØñÒK/Mš4‰Ô+Sú÷ïÿÐC½øâ‹»wïÎeÛ,pƒh X¿üå/ï¸ãù•Ûo¿ý¿øýýòË/9òÜsÏ¥ÿÆb1ú—à¯üèG?:å”S^yå•\µHº D¦ ˆ|¯Sžx≓O>yüøñ'Ÿ|²béÒ¥/¼ðÂòåËéÝ?üpüøñüaMÓ¬œo—]vÙœ9snºé&›ßš;wîܹsU¶>;Î>ûì³Ï>ÛÃÔÔÔŒ=ÚÃ% Žáq b@Ãâ”±§§GÀ•sÐC‚ì‰\ ¬™3gþõ¯]°`â´ÓN»å–[®¸â zëˆ#Žxï½÷Ž=öØ”¿»råÊŸüä'_ýµÍMœ8ñ/ù‹’6+áî»ïž8q¢×­ ä :tãÆS¦L¹òÊ+½n ä÷j`EË%„¸ð §OŸþÈ#hšvÈ!‡°z%„رcÇá‡îd#‡~øöíÛí?ã­ÝɈßÚ@(A ,pƒÈ XBˆûï¿̘1ÍÍÍsæÌqïWøà”SNq½­ábÆ ^7(q ˆc@C‚Ç <ˆ°<1 ˆÀžh X×_ý¿þõ/!D,{ê©§~ó›ß466Ò»cÆŒ™:uªüùâââwÞy‡–‘yõÕWÏ9çœÜ´94œxâ‰^7(q ˆc@C‚Ç <ˆ°<1 ˆÀžh X7Þxãå—_^\\Lÿ=î¸ã.»ì²o¼‘þ;~üø |ðÁüùüã·ß~{ß¾}c±¿øþûï×ÖÖŽ?>—-zþˆÕÞ @¸µº¡ZÜ[…QÇ5×\³páÂE‹˜~ ½½}Ĉ£Fú÷¿ÿƒö‚EaaaKKËã?ÎOÊ :¸'àDË•’‰'®]»ö¦›n²úÀM7ÝT__?qâÄ6*$ÔÔÔxÝ Ä1 Ž!A b8@C€ò "…ÐÐC‚ì ”±ß~ûµµµýóŸÿ¼ù曽n ð)³gÏ~íµ×~øÃ^rÉ%^·ÅÀ€j`ÁlX²dIeeåÇìuC°@H!)I$ü/À!°@ލ««óº @ˆc8@C‚Äp€8†åA„€å ÁêŒ$]‘Y0Á "È=°@Ž:t¨×M @ÃâÄ€ †Ä1("R=!X‘N8°t+ˆ ÷@À9¢°°Ðë& Žáq b@ÃâÔQÓ4ª^ŒE¨rL°:#,S‚D{ `€Øx°5°ÈX XÀ °ÈX GÔÔÔxÝ Ä1 Ž!A ¡â›o¾‹Å.¸à¯â.¡cPDX^¬ÎˆBS‚D{\°–,Yrã7pÀ±XÌønÌ€m~côèÑ^7(q ˆc@C@胑5¶BÇ( 6ˆ°¼"X1"WÈt VAîqEÀºòÊ+üñÇ[}@Û7Ú RÌ›7¯¤¤ä–[nñº!ÀuêëëÛÛÛ½nHݘáö D XÀ tmŒÇã^7€ ‘ïÆFW¬XáÆf+vîÜY[[;xð`¯\çšk®yçwf̘1nÜ8¯Û쀿DÖ­ðœØ€+$€X G Ÿ9 Žá ”qŒš×#”AtHhꆄ>ˆ¹= }£€Ú ò9VŽ VgDwS‚D{¼°9äÞ½{2äòË/_½zµ'm9ùÌáq ¡Œ#M£s·Ê :$4²HèƒY9ôqŒ¨‚Õ#r…L—`ä¬qãÆUUUíÙ³gÑ¢E#FŒ8묳>ûì³”ß2–~Åb'N”5Úºººææfþ¯ü–üwsss]]é[ض€-` ØB@·@SÀÝ»wz/°'[ÐMúºQØ=¤¤Hw/°l!Ý-èRºØ‚Û[ ‡1»ví ô^` ßÂĉM…á1Ws³c±ÔÛòÉ'g̘ñÞ{ïe¹Qæ…^¸úê«Ï<óÌ>úÈë¶w9ãŒ3jjjþóŸÿ\~ùå^·Ø1yòä믿~äÈ‘ .ôº-äŽíÛ·ãßBÜ~ûí^7ø”ÒÒÒªªªïÿû6KŸPÜp¼¯uÑEÉÂ+²¬ ‚ âBÇФ•9$”AtHhj`…>ˆI }£€Ú "…Ð+‚ÕC3–©%XA¹Ç{ Öªˆ°a8†ƒPÆ1"·ÊL(ƒèЈ•¡bh"eOèãÔ–W«3¢ˆ»)Á "È=Þ XÓ¦M;ýôÓ½npO<Ñë& Žá ”qŒÈ­2Ê :$4be胚HÙú8FµA„€åÁꌰL VAîÉÏñï3æ†n=zô¸iÓ¦W^yeÒ¤Iï¿ÿ~Ž› dÐM2î¢@ÔÄÊà‚HhÂç<†$`CD$~ÔâŠK.>¯+D?a„—_~ù„Nèß¿ÿgœ±zõêšššáÇ»Ñ Ñµ$¢Ý"Öþ‘Ñ„ ¤@›6е1{Ýÿ2sæÌ[o½uöìÙ^7øW,Í zëœsΙ>}úÎ;ãñø¦M›¦L™rôÑG»Ñà7Pª? Žá ”q¤‰`tw‡2ˆ ¯'ôA M¤ì }£€Ú ò9R¿9&X1"WÈt‘ƒ¸`Á‚Gydþüù¶ø ïk`ˆ0zôh¯›€8†ƒPÆ1jÁPÑ!¡‰u胚HÙú8FµAäG)°rL°:#œã¦ÈA${€  –Dt@¬ƒ"¢ Џ' ˆ{JHÀ d `¸UŽ˜ôôJM `'Dģ𠰀X GÔÕÕyÝ Ä1„2ŽQ»UešX‡>ˆ¹= }£€Ú BÀòŠ`uF¤š"1"ƒH X G :Ôë& Žá ”qŒZ÷PÑ!¡™Ñ†>ˆ¡‘í }£€Ú ò9!É'«3ÂMlŠDÔÀF `QXXèu€ÇpÊ8FäV™ ešX‡>ˆ¡‰”=¡cPD8°¼"X,Sä "…€ „Æ•R‚XD DXÀ p`¥0 @ˆˆ×<µè• š@ÀN€ÄŸXÀ,#jjj¼nPâBǨMCD‡„F }#Ò+CÇ( 6ˆ¬[iš¦p³ %ÁêŒxcŠDÔÀF `1zôh¯›€8†ƒPÆ14¢†CrÄÎÎÎÚÚÚ+Väøw„fÒÊž(‘^ú8FµAd+ô'¿ßVg¤QLÓ4œ'2r#ò¤,a "·Êòõ×_—””Œ7Îë†`FB#5H!NàQ I+2s`­Zµª¼¼üùçŸw¥MÀk `4¿ÁÝ‚{Ð<²»»ÛÛfhšFQ†€åØ_€D*)øê„3ØÀº †3+hâ‘îÔnÍš5Ó¦Ms§QÀc `¬¤t`âBǨ9°rDŸXašñ‡²'ÊpŒB,BÇ(àR , `¬¤t`â|LJ~¸¤¤äÅ_Ìr;Q°rDšAvuuåøwu„)çÂW=Ñ Â,BÇ( 6ˆl¼ŠÎä‚Õùô€Ô"“} ,Xá/Y¿~}mmíæÍ›³Üê"¹ Í=Ÿ²kƒÿA°@4A !pB˜ Å.A¦ïtOÔžhF X¼„&p¦²È3ÏŽQ@m£6ù‡uFùª–ŒD¶~§µÝì±¥¥e„ ê</¡y=d3}+] A—àk¬œ@ D¬BR"_}u…œ={vYYYUU•× BQ ¬x<þòË/úé§Ê›</±Q©2°pÃà<ôVÀŠˆ©' W‚hÂÆ+8°€¾u`-Y²¤²²rÞ¼y^7DE¬x<®iÚïÿ{¤ô†X GÔÔÔxÝ Ä1ø*Ž)SQ˔ܖr|ÕÝ LÁ²!ôqŒjƒÈ'ˆH!Tޝz¢DÄú8FµA„Ë+Ôå!ÌÛ¥QtPÃ<,v)QU !ýQYY©¦‰ÀS `ð›ŽQ@mQË+Ô}» ¡Í¬,7p{zzhìPRKøì8ƒŒ€rÄСC½nPâè9i-Ìg…¯âhc³ÊlˆLPrD>°>q`… оê‰n¦`Ùú8FµAdÝ*:{°Pg„Ë "Ï íûÑìÙ³KKK'OžÌ¯XÕÀ‚+¸"`-Y²äÆo<à€b±˜ñÝ 6\|ñÅ8pàÅ_¼qãF7ÚüFaa¡×M @='-S’¾Š£?<-ëxD¼LîƒÈÏ0QK¾ê‰n‘^ú8FµA„Ë+ÔQË ¢Ãá~õêÕUUU .äWàÀ 7®XW^yåàÁƒ?þøcã[­­­çœsÎðáÃׯ_¿~ýúáÇ3¦½½Ýf@øP"`ù ›Uf¬0_á“UÃ$`…ôJMP ¤Ä·)„dSòCw6LÙú˜ì®¢'™LZÃ&ß®X±Âê­§Ÿ~zÔ¨Q&L ÿN˜0aÕªUÏ<óÌÍ7ßìFK d¤µ0_ P^+LÇWødBh"ÁÑH‰o,ÏXŒÃBjª| ¹ß%‰üüüˆ$³G‡\×Àš9sæUW]%¿rÕUW͘1#Ç͹§¦¦Æë& Žž£Äå«8¦¬…UMÉ}}âÀ ÓLÔW=Ñ Â,BÇ( 6ˆ°¼"@QU ¬ë®»®¤¤déÒ¥*õÿãa ,¢CËø”û]<—g,p`…WX6¬X±bذaò+'tÒÊ•+sÜ {Fíu€GÏQ"`ù*Ž)k`aBSrDÔÀRޝz¢D¤W†>ŽQ@mùêî3߇¨3ªªUWWW[[»k×.Â,¢ÃBjª1…¾(÷AXá ×¬ÆÆÆ¢¢"ù•}ú¤»Pºuë&Ožüî»ïzݧLŸ>]1xð`¯¢ŒãŽ;N1lØ0ã[?ÿùυǼ“í|ãß qmÑ¢EªÛ4MÓ®¿þz:Â?þ¸‡Í˜9s&5㨣Žò°À ƒ ¢`Íš5Ëë¶;{ì1:ó;î8¯Û|Êüùóù~ü…^Èx;4‰š9s¦ª†]tÑEBˆC=TÕ3†Ÿ– 8Ðæc¿ÿýï…cÇŽåWîºë.úâ–-[¶nÝ*„0`€bÿý÷w¿Õàÿក“kÖ Aƒt~«]»véˆ#Kcˆp¥úª'ºA˜‚eCèãÔ5°¼"@QU ,c ó,ñ<…ƒè°–Õ*„BˆD"A¯÷ïß_D>…°³³³¦¦ÆÛ)œr-`üñË–-“_Y¾|9)Ç Ü()ØàU_{íµòòò… *ß²’’R¹DÉ*„¾ê)W!t8-óó­òĉo»í¶úúz…ÛÌ}± ¡r|ÕÝ LÁ²!ôqŒjƒË+ÔU­BHz„B‹ÆúÀÕÀ²Z…Þ%+Üˉ¤ä»ßýîgœQYYéuC²%×Ö\0eÊù•)S¦Œ7.ÇÍ‹éÓ§WTT,^¼Xù–é¶*@SÌÀ)n)I¹ ¡Ã ‡Ÿ‹ænß¾]¤ÿèoÞ¼y•••«V­r§QiãËÏJ%Ð`hÂö·:|îÀòƒO'c–¼ !½^PP‹Å‰D”»$Åô¾ûîëèèðº-Y‘këºë®ûä“Oî½÷ÞÆÆÆÆÆÆ{î¹gÁ‚×^{mŽ›T¹ÜÛfä|(yX>+å*„Aw`µ´´P)ët¬^x¡¬¬lîܹ®4+}|"`«õß:üü@øU«†/…P×‘êø€Y…ÐÏbeº„{dŒŽ€î8FµA„€¥œ9sæTVV~õÕWö Pg¤±¬oß¾" %(”)„Ä´RM«.ÊEÜCS‹‹Ÿ¤UbiSXXèu€RÆqçÎÂ5˽"îšb*q`)ïJXÆYEX;vìȸj¦½€•û‹ªO¬0É"á}Û+•î8FµA„€¥œÉ“'—••}òÉ'ö PgT"`)t`UWW———Ïž=ÛsQž5Ù "ô1Mӌ˅Òå¼¼†é·DðSó½n T€ÕÞÞ®p›¬‰ÔÕÓÓ“ŸŸ?hР;wæåeûØ@‰€¥—XÎíf¾58PdZq3ÝomÛ¶mÛ¶m‡vؘÖSâ ¥Áƒ‚o{%nK9™®ö3´Gýúõ*XÙ_cçÍ›WQQÑ«W/Ï,ݯ),úƒlV²€¥s`…@ÀâÞH$úôéãð[p`€9s`å 5»±±Qɯ87%å KGdX²€•›U'Mš4lذ¿ÿýïi}KÇ5×\S\\ÄãqºÜ«­ÕÖÖF¸qÁ¥ÑÕ)¦ñÑP6ø3…о–¦i»Ý»woذ!‹~øábß)—q– ?C³o€oE Ê©¤u²s“B¸nÝ:‘ug¡¯ë:²S}Õ €D DXÊ¡ë‰Õ„Œ‘S3Þ/cö\ÆÐ¹ÊSnáƒXNòÐ5M357]…0]Mh}¨õdSĽ   ‹Åãñ@›C!`”±sçNº Â%ß’_1¤ý€} ¬ÎÎN)wïÞM§=1³ŸËXáÛ´2:{iIqß³g¥ñf9­¤èÈ,y}ÿ¤úªˆˆ,|Âú.ÑWdöDÇÏÈ)„þq`Éx›±>75°äXí ¬ÅØ¯B˜™ˇVf)„tóóóóóó5M ´  äˆ%¥ìãÈsTÄ.è9(â.üäÀRÞ¹14Þëu°è+X)CïsVQQ‘HdÿÀÙ4ˆd¿Êà·tÐ×åŽ,ŸoÞ.À&_O¸GÆ0EÊžpÇ1"¨ ¢ìÀ‚†¥‡¬uF9…0ã+¤Â"îF–ÍX爵ÈA4}ÆùÊ+¯\xá…/¼ðýW>%Ô:°Œ)„=ôÐÉ'Ÿ\YY™ö.)%V¯^½è”óv"—%°@ŽPR:°Á>ŽdýBttt(œ±±€å·Â)S¦Üu×]K—.µÿ˜K5°²ÙZŽk`™ XFÿ¹M÷”;ë7kþüù¥¥¥÷Þ{/½ƒ 9©EÜ3ø-F‹6Hóÿ8°üël÷Èè·^éáŽcDp©–€ýPW! PgTRÄ]ù*„ré¯X¦5°xY²dÉ[o½U[[kl¤QÀʦˆ»1…píڵ˖-ÛºukÚ»¤”lV!ìÕ«WŸ>}„×¹,É÷º€ðÀV2™ìêê¢Q9{|›Bxÿý÷¯Zµªoß¾§œrŠÍÇ\r`ùê†Ð¾–NÀ2dˆ0s`óAÚo¢F}}}UUUKK í¬–)ìÀʲ³Ð£9£€Õ¯_¿žžžD"‘H$ÈŸ{¢ãë :ѰС°¨ "ȇ«%,å«:°rSËTÀÚ±c‡ü–©Kö(éRÓu`ÉÁølϲI!díË«¯¾ÚÒÒRZZzÀ¸ÐR·€   T…×wWX§nß¾}õêÕBˆ††~qÒ¤I%%%/¾ø¢üI:°ŒTVVÿõ¯Íìë8°ŒêŒnVÑÓÓc¬k`…ßn•©ÁÍÍÍr aj`©r`,jF~~¾çÏîü&V+)Yd )„JpèÀ rw:°l²ÌXÀZ¼xqiiéý÷ߟ寛b:ˆè,y6bZKçÀrx zzz(›RÞ¾qjä XwÜqGYYÙ_|áB3]ÈÍÍÍ^7(À>ŽìÀÖ ^~ùå%%%+V¬pþ£9¨•kþüù4+•¬õë××ÖÖnÞ¼Yþ¤óJäNPRËÇ;vÔ××oÚ´)³ ¦,âγ€Eú”M ¬´Œ6ò‡³É×øâ‹/Þ|óÍ5kÖd¼‚ÜÔÔDŠž,ÓÎèv aïÞ½=°ü&VfC¸GÆ0EÊžpÇ1"¨ ¢ª! 0XêŒJR=w`­_¿¾ªªjÞ¼yYþº QžÉð:q`Ùqw8;jmm¥I¾üyŸX|(2«%Ïâh_¸„qP€€rĆ ¼nP€}eËêú^WWW[[ÛØØèüGÙÔã«XŽäÀ:t¨PçÀ¢ ¬¸tÛœY ! ØýúõûÆ7¾!¤,BÚŽnDáQÖ?5°ŒqTåÀŠÇãÆgSôÊ!‡"„hjj’,‡)„)wÖá­r"‘¨¯¯_µj•Õ” XÔ˜l,«ÓÆÄd2)×}H§½ûÀÝÓ&…0-¥ZhóòòDðe‘pŒ´îŠÃ8ÒeÖó§÷Àµ–r.Ë ‹ª’Bå,Óá9/Ë“å¯ÿøÇ?JJJîºë.ùWd–QÀ2u`É;°B(öu`AÀ £Göº @öqljjB 2D¤)`µ´´,\¸ÐTV s XÊÝã™ XÔþ¾}û’(ÃmM×ÈŒX«V­úôÓOyÕm$­­išÖØØÈÕÄŒqt.`uÖYEEEµµµò‹ò j4aÑ ÛA$„hmmu#…Ðá’O‹/...>çœs¬>@‘UU‹ÈËË+,,™½…õ¾[‘p[ÀòÜEͺ,î‘QŽTÐ¥F{Æ1jÖ_þò—’’’×^{Íë†8Bmg”‡!奢‰éüÊH€.ªJЏëXÍÍÍK–,ɦ=2Î,Ucñ_|Q[[Û¿ùWL,n›½K.âN)„Ùq7–õ„”8M€•1¹o@9‰D¢µµ5//LIVRˆ©€5þüQ£FýøÇ?¶ú<[•ß6Ó —îÔÁ^À²r`¥û+—\rÉi§¶hÑ"ùÅ̬mÛ¶ <ØêÎ}Ñ;wîlllÔ•{—ç”VVQQQ^^^GG7縈;í`CCƒ\¯ÍØT…,!Ä~ûí—Ös?ÝœOPLŸC2S§N­¬¬t²Ä¸i !×Àbó¹ÃV)‡âY$è(¹= ÔkSÎqèÀ n8°ZZZ®¿þúÌ®·ÆoÙ\¬\r`™Ö·ÊÀ%§fæÀ’Ëïò‹~s`eS««« VzhûâIjiiiÑ4­°°žœ¤åÀZ»v­bóæÍÆ!PwÁµ¹Xÿãÿ(..~øá‡Ój6ÿbZSLj¿~ýt–i aÆ,ÈåUE¦é56¢ƒs–é(9.ìóbH*((0`€¦i,Ù;°Òªå0…wpÅŠ¦ È677g93°Òš¡*°þô§?•••mÞ¼9åvLXþ©Y$(@j”I&“Ô‰¢ãÀ" ƒçõbÍ;³°|^KÉÒã>!Ü#ctXNâÈÝ*:)„Á°ÔvÆH X<jlltïW:°tQU"ñëj`‘¾¹¹ùÖ[oMwSi Xº]6í§OŸO›B— '5°LX6)„\Š$å)TUUU]]ͳDc ¡ç×´,S«¶µµy®Ê¥…7Ö!‡Ò»wï!C†\~ùå«W¯ö¤ ÇP ctlâÈ,°Òªe#`ñ7åÀC3§t,ä²q`éR•q×4ÍÔ•M !7ÆGz]Ó´”ÐFÀ"}Êx{¦°äù‡J•+åDÐa ¡Èúy”sëw¿û]IIÉܹs­¶`µïVA´°h;N¦;|º»»uó$'R²Û„©4x¸GÆ0EÊ'q„Ëç¨íŒþ°jkk«««•HNü˜-Kç²=Xº¨Ê¬ŽŽŽêêêM›6¥»‹k8L›6-Ý–’XÔ­[·:i=¸%;¿°°ti†º3.âÞÕÕ¥3‹EÁ%‚fÂò@À7n\UUÕž={-Z4bĈ³Î:ë³Ï>Kù-cé÷X,6qâD¹sÖÕÕÉåiå·ä¿›››e)¶€-` J¶@ƒ;°¾üòKã4M£ (Š555Édò믿¦ÿ~ú駺ó”ENÈ7mÍÃä1òŽ;î(..ž8q¢Í^èR°¨býW_}%oMjjjxp]»v-oaäÈ‘‡v‹SÆX´··“jÍš5rd9Ìy4YÀúì³ÏLo–n6lŽÜ<~Ëa¢ÓA·`%`Xº½à¿‰„ý9iz«lÜ ­—-[fzt¬Œû…nVÁ–q «V­ª­­mhh°ÚB<w؆ ³§´ìÀJ¹òwé€477Ó”ÎèÀÊý5Jö9ÒߺNFj :Y9 {¡j Üe–/_ܽHk äÆ ú^d¶€åý¸úê«ÇŽK“®,Û °\Ú žZøíHf¼ÙÕÚÚ:vìØx Ý6˜:°ˆ/¿ü2­½E(*øÐÝÝmµ£€Eo­Y³fíÚµ|ð…>`:Ý5¶‹¸ÓÇèWHÏ2­UWW'/ÕÍf¹J]{¿úê+›™ÿ÷ÕW_5Í¢ ã@÷ôô|øá‡6{aú·òY,'[à*i<‹[ºt)lÁ‚ïÅĉM…áš×<ñÄçwžýgüÐN€=Ï=÷œ⪫®zôÑG…¿ýíoŸáöÖ[oå×­[ÇW¤›o¾Y÷ZƒïÔSO9r¤báÂ…V øîw¿+„7n¿ò׿þUqå•WÚ4ûÜsÏ¥Ÿ¦"ôyâ‰'„7ÜpIoC‡¥×/¸à!ÄÏ~ö3ùÃwÞy'ýÄ›o¾É/î¿ÿþBˆúúz«ŸàáI'$¿~ 'ÐëO=õ”óß|óÍô­uëÖ™~à”SN¡¬_¿Þ~S4ò=òÈ#ò‹ßùÎw„'Ÿ|²bêÔ©š¦566Nž<ùÕW_Õ4íÚk¯BTVVžþùòô¿ÿýï™gžáÿÞqÇò6å‘U÷sFzè!!â.»ì2«ýíoãmnÝºÕø<Þ}ñÅíÑž_ÿú×üC—^z)M hüäYg%„xöÙgu¯þùçôõX,æðGiVqÜqÇ™~‹„­¹sç¦ÜÎ{ï½Çß±c½Hõ JKKõ«_ !žþyù+mmm¿ùÍonºé&‡M͆c=VqÚi§ !ž{î¹ü"ÈŒûî»O1jÔ(!ÄYgåus<¦¾¾žúÔÓO?íu[rA2™¤ÇN?ýéOÝû•Ï?ÿ|Ù²eîm?cèÂNØ ôBãõôéӳߗ ÷Ýw³ß1þüiÓ¦mÞ¼™_¡ÓiäÈ‘Æ?ÿüóçž{îK/½¤ê×sÃðáÃ…óçÏçSåºë®Kw#4õB 2DÓ4yNõ¯ý+­Mѵš1b„âˆ#Ž0ý¤¬ÏŽ3FHÓàaÆ !ª««ùÃ't’â”SNqÒ†!C†!®¿þzúïÁ,„¸êª«„>ø ¦iÅÅÅô»ßüæ7é3rÅú‡zˆ^üÖ·¾E¯Œ9ràÀBˆæææªª*!ÄÅ_lÓ€—_~Yì ïšlõjllt²;.Á·>ú¨óo½ôÒKBˆË.»ìøƒ¢¢¢‚n܈?üPy;…kŽ÷5°.ºè"YØaQ6qÔÕÀ2Íàg²-™œ$Õ[¥rw›Ä%c !ýн§‡áÌj`‘¥ˆ‰}½! yòOP;mò¹x›JRu5°ŒqÔ9°¬ÐöáºLCÚe =5lÓ¦Meeeüã…äÀ¢gzò·TÕÀrXmGÞ;Ó,B—j`Ù¬}cµ¨ oAÛë[Ôa "m¿oß¾ùùù𦙮êè$…PîeÜ0ûX»víª¬¬|üñÇùõ®®®ÒÒÒk¯½VyúŒë ×À ÷Èõ"Ä1j)„­­­Ô÷]M!lmm½âŠ+””SÛå^óåzët*‰Ž)„wß}wii)‹;Ú^ÑÄt[¸pá¬Y³èy'ÇQÓ´ªª*Ò,ü‰œBHdpq0®BÈo—„vÒ‚fkV=KŽ‚.…¦¬ò2H!äTJcwÎ'p^Äà°ˆûÊ•+­vV>Þ.Dhš>™¤ªÄŸ—u œÑ£G{Ý ›8êj`™^Üm,rU¤,âns±6q§©€<£êîînlldmHdº !m¹oß¾4¬òœÃa ¬x<žRMàFîܹSn•ÔÀ2ÆÑ¡€Çé¢mZK^L‡6(ÌâBF'`eSËa1Tùô`C„ Ÿ™9+âN‡ÈFÀ»o "kL¦?—Awa°¬¤döðsE•õë×WUUýûßÿ–»›Â$‹„{dŒNw'qŒš€Å×W¬îîº &d¿)µÑÿ5°èÚ®VÀRXÄÎ^ƾèõ)jDZ½½½´´´´´ÔÊöÈó"ƒ‹ƒi ,r«¥;ø:/ân%`% z\*‘þÞ±c‡“Q€NHöÂëj`% ¾°˜qçÓCN²³Ÿé G›rú›üXŽ_ôö2nL!tþ-Xj˜6mÚé§Ÿîu+ÙB¬ÂÂBöì,y¼!ë?øbãÆº¯èЏ[¦­­­FgÑõ /Q”¼}‘iw€eïÀâ×u¢€)<­L&“ìŸY XVÏÓøuûé¬Õ=Xfq7U¸çÀ"Sºq‘iYPSXÄ}ÿý÷ïÝ»w,K$Æg6 XFl–Úéé顟–75}úôþóŸÆç¢¦¯óh*%,Ö«Rf‰’•›@ˆx¤.¼ð±cÇò=dÔ,îøn XBˆI“&É%iü@4,…,€e¿ìõ)]ýG>°úôéCz“P'`‘”½ËêÐmÚôÝmÛ¶ŸãrݨíÛ·Û7 ««K÷p—þ çâ‰D‚÷x=ù3º¿¹ÓuuuõôôôêÕ«W¯^6^x†X”Ý©ÛYyjäíÚY XÆU,{ÆŒóÚk¯544Äãñ¯¿þúÞ{ïýÛßþFUÆI ¡©—¬ï}ï{}ûöݹs§î‹X|Û,ëOó+¤Ƀz6V¿~ýòóóóóó{zz¨a¦–ÑåDÀ’ÉÓ2%)„F:°¬îÁŒ6oú!ÚÁ”,ú¢îh¤¥à8\ïŒöŽj(Ø 7i9°fΜ9vìØ‡~Ø´Á´×VËߘ®ê(2°l3ššíï¾ûî[n¹…— Ð5‰0¦šª,`ñqc+Ý9tJ¢ãë :Ô¬Y³ª««–ÕExîܹ§žzêW\‘£ö¹LnXt!J&“W_}µ<Ö{¬,ÉØÅðw©ÇÍš5«¬¬lÚ´iªZ脞žžÚÚZ¹ §î]! +ÂvÕ?+tEÜé‚Cõ@³°Òu`ѯó´ÊèÀ…Ñ_-u)r<·¤ ÆàÁƒ…ÁE…Þá4oI™BØÙÙùÕW_õêÕë /4îlÆ)„ .,++“Ë“e‰ÚÂ8@@À²g„ /¿üò 'œÐ¿ÿ3Î8cõêÕ555²Ì ÂJ¸+}D›8Z¥®\¹²¢¢âÍ7ß)„ä×=öØc©"£naúJJ XF–QÀʲ–Ø;²Òü‰¶æ\À’w§¥¥eË–-<É–<-Ëlõ\+ãX¸ XFK®‘M ¡Ã´2:òV–¼Si XõõõÕÕÕË–-ãWäYíµ•wݪVÊÝ·ªe/`É›¢Ÿ6FÜÔ'o/`ñ­£Ñ¥\À’}=¨åg¢ãÀ2Æ‘ËroJéÀjhhX²dÉâÅ‹]kfNÉY !ý±aÃ*”1j;c¤,&ÜK!tîÀâ8òÐC}páÂ…•••sæÌ1~]¹¾À477—””|ï{ß3}—в€¥ÊE dg™B‹Å¸j„«BžVXÂA,]í×d2IkAЬ£§§‡N0Ú;Ýc9RÜŒ)„FËFôY·n]OOÏQGuâ‰'нÏMŸ=¤%`­Zµª²²R^GÇ[o½õÞ{ï9·«Û;°>úè£êêj«o¬Ã?\@À²çœsΙ>}úÎ;ãñø¦M›¦L™rôÑGç¸ ÀÂ]é#:ØÄ‘XºÂE‹•——ÓâF«µµuÍš5}úô9ᄾùÍo C!qwèÀêèè˜4iRQQQyy9MöìÙÃ×z20«r`,Ú]H± IDATšií!‘Ê5|øðÃ;ŒëG*t`µ¶¶ò¬Èª–ÃBn°€%;°ÖÀ2u`eP‹N›PÊ,c aÆ,Ùnfl0­8i5sR^‹+•š†p"`Á•3Â=2†©Ü¾=¦UéÆÏ¹€E}mãÆá(›K‘¥z©X\ˆÓŸ¬D"A KËÕØØØÝÝÍqäïʃl{{{WW—®¦Ô2†~¨««Ëôà´<òHYY™H_ÀÒ4­»»› 6ÉEÜIâÉÆEc=mßøÉ̬”,> …$¸»ŠX|p,ëéé¡£JÛ§[+ CVFx†·O+kæçç'“IúŠ©€UQQQRRòÔSOÙìµÐêþ¥««ëÒK/ýÑ~ôÉ'ŸØlDÆFÀêîî>ûì³ÇŽkõX”¬®®.ú %œz›™.Þ×À„‹/…¦¹u< ,]º4™Lžxâ‰}úô¡•nu ø •sÙdÅBhšÆöµ)„²€E¯Ø§Ú×À¢ñüÏÊ•€Åö+amPçFÚ?²³r`ɫʬD"‘L&mV!TëÀÊ2…ÚIÕ(Òz%«uÆÛ;°œX]âé¦R³wRÄÝy ,WXA°ÂM˜Êí§‹Q®J™BÈ7Øò;¸ðP®|ùª«Ðþ“=>°øÂžý]k[[_äU X|ò8t`QŸÒ4Mž,éX´ËmmmO?ýtAAÁu×]ÇŸ” ãjáÎnjØá´×]wÝ7Þ(Ò°hû}úô!AGÓ4U)„ùùùté¾à‚ Ö¯_¯ûdJË4…й‹FyC-‘HÀTTT$ÏCLXÜéè:t`ñö?þøÝ»w744È·¦æô•+WÖÖÖ®[·Îf¿è­N°¹sçÒŽ;¿TÚ¤r#~.+Ý|ë!,€¸ˆ».…P^û̘I^[[+„8õÔS…Evºî‚ëÄÅÿ OªlR•8°LS:°èo€EÖ²t`É5àMï’É$·Äa ,Ýl̨)ðÅãq›"î²òeãÀ2î,yþ{ì1ù),jö·¾õ­X,ÆÕFj'•x—ï…4M«¬¬¬¬¬´Ú,}Ñ=+ûXi9°ì‹¸Û¯Bht`)/âeY$X8¬LJŒr•C–0[Ì$ˆð5ÁÊ~¢µ–³”v™‡Ø[êvìØQ^^þàƒªúi'ðI˜½€%kFª,>yø',±ïdIW‹,šÊÛqOÀ↙özhľ3IçP›ûöí˪Âüüüÿûß|puuõ£>ªû¤qv¡«%;¡øP;¯%?ù6:°t–½‹zŸìÀr"`ååå 4H—üajN'/¿}ñ2ûìí·ßÖí~JlX| ¥+`9|PÚÒÒR]]íÜ,æ°@ŽðUqM16q¤‰ q7°Œ,YÀ25÷êX)¬x?RÔ ½+,,<è ƒ‰„nM:8ä]—§#MMMeeeeeeVB’•kÿý÷4hÈL·VJËØu«šz¸Œ–qÎdŸBèdÂíÛ·óä 5°l÷ȩѪ3ŠŒ¬ 6¨obÎák‚¦iî%§È¢lÔ“={özè¡i%ÛÀæ‘êñXCCCEE?ŒÉ X$` ¬´j`Qc¸3êX´§ííí4äÉW$oX¤Î¸!`eéÀºä’Kî¼óNav̯X¥ÊGÕèÀzàÎ?ÿüY³fÑy6BÇçÿ,`ÑÉK7â8,âοÂZ°x¶G–ýÉãPÀrÞmô\>…ŒÑ·Z…0-ëóÏ?;vìøñãu¯+ŸéÙ äˆpLÈ€MÙ¥«ešBÈ×q£€eªbðc«@ž6‘*at`išFV{{»±v»ç5°LXT[Q¾;Ê2… .ŽY X,mð$Cì{Ûæ°VZ)„ô£|$Ór`õïßÈ!Â0¢vÒ ,o„Ó ­æ=V¬Y³fíÞ½{ĈÂBÀâJϬBh쌙¥:t`¥UÄíW5°l ÷È–1Ž X;wîdeßCXƒnVW¡£J“‡lX[·nÇã~ø¡’†ÑŒÂ‰€EgHÕ»³A¹€uÌ1ÇuYœÆBç,î>¦5°¼r`™ X²‹æ“§²€¥0…P¤rŽËhš–L&)„òw¬ùóç¿ÿþû´”“,Yd4:° d4FY9°ú¼óB~Å*…;N–¬Õ«Wó|I‰+ƒBªÓêPÀ¢ߺu«îŸ}öÙ………/¿ü²Ã]ÈX GЂ èXű­­-ôíÛ×´–©‹+¸Ëë}X¥:t`‰½6+®%öÞ]777Óø¡i뙥Ò–iÂ!O;ìW!Ì £òШ$…PG%–\§@ì;}q(`­Zµª¼¼œŸÅ9°¸o•iï HÀÒÕq§ƒCÓ ù|H)`X,÷ð+¦ú,/ñ“ËØuEÜíS»»»i­X´] aÊX4ÿË€_O¸GÆ0EÊc3®%2M!\¿~=I üãu‹ùzB.,cÞwºpPTiQ°Ž>úèX,¦ÊRš‹;£i ¬ööv£€e_¢(ìXªReËI aGGÇwÜqÓM7é^w.`™F!‘H°DeêÀ2Nø¡2ý—ÿ—þH«–•€EŸOYÄ^üЬ”Ÿíµ··Ó¤=ckéÒ¥üw–1n§R#ãñ¸œÁ0{öìÚÚÚ–––Õ«W;Ü…,€PÛ¯„}úôéÕ«—7²©UWW—L&O8áùÙˆ} aÊ"îbïˆØÙÙ©s`É:£)XUUU_~ù¥ü¢ªB£äᆀeL!ìèèhlläf˜>V2Å*…PXr ¡€%§®[·®¢¢‚ÝÔö½bêÀJ¹ aÿþý)7SçÀ’,S–Í"2ÂL0âµ±…ÅémUSL8°ŒèLRƳKޔͺ“r*eº«RO¤š¯´ûé XÆ ‹Åb ,°ú@˜Xá&Ê‘Êq ¬²²²#<òŽ;îøôÓOŸ}öYWë¦;ÄUkêÔ©±Xì'?ù ]ˆèvÝÏÖÆËËË'MšdõÓÁ°è>öÐC0`@<WòÄÂ(`ÉÏ`Œ5ÅœÔÀ¢=e–Rå]™ X<åÙí½«©©éxâ‰'t +Ëê ¢Ž”–ñÓÉÃ'aÊX§fìÀ²O!4-ZoDn§ŽU«V‰½ÑÏY ¡nÂ´Š¸ë¬gDEEý!WÄsXp,ú¯œEH×DÓUé[ƒ¦íX‹¸ 3–Ëêþê©§ž*//ÿì³ÏäÓ°Œ)„:{šØ»ZŸp `ÙéM¡!™ôeï½÷Þ¢¢¢{ï½—> *…PŽ ·¹­­­§§‡ž¡éV!d•“Ž!ajwrèÀJéõpžB˜–Ë*…Ð(`éN`W,ûB‹ZE' a‡ltöÒÚ̦sèC9$‹™Þ¨Ó¡°šyÓBK½zõJù(xŽÃ^JrœBH=®ªªª¬¬,™LæFÀêêꪯ¯_³fé»òóåæ]]]tTi¡DÀúâ‹/”Ñ× Xk×®­¨¨¸ï¾û¬~š-±¹A'`-^¼¸¸¸ø¢‹.ÊxSýû÷§ ’2X6,a{ÓžrB®å·"î}ûöÍËËãÓàÛßþvQQQÊKÎÇyꘟŸßÝÝmºS|}ÐÉ òA–-KXÛ¶m3êVö–Îeº ¡i ¡ó"îNv‡áíó+V”EœlR…'t’ðA÷-[¶¼úê«ï¾û®ÍOs°6oÞLlܸ‘uÿ”uúU 䈚š¯›`GÙ%ö.*GWF›Bº²¨a_ˉ‹Öì£ß5ÖÀÊÌE#Šnþm¿ ¡•Ha“BÈØ XTe@×râÒK/ÅbÏ=÷œqhH¦'r´©µk× ‹F« mÊŸ¤™(%{–ÜZ!µÂZÀ¢E'—-[FÁµ÷z$‰îîn¼M,:8ýúõËËË“u)„6ÖŽ;ªªªæÎ+lϦ°ŒQWÄÝ>…PVMw‡îF¬XV«RO¤wéì5]…Ð&eƒ+•ß'[p ÷È–UgRG3þ¡ƒ¯½(4µ··Ó³–ÜXK—.-..¾ð Mߥk-ç¼=tÁçûs…,¡È„¥°èhìܹӦæ ý=°jjjÞzë-'r!_Øé7Ö××ñÅü(×§Û~%e°xÔhoo7>´¹iohhàÎh_ËèÀÊþø±â©€@~~>M\žõ(6mÚÔØØ˜2%“ç¢t¦µµµ%‰¾}ûöîÝ›¦[¦]'À6–i áÏ~ö³K/½´©©ÉT’3—uJÍñt#>§s,Úq^ Á~BSu@.ãqw«XPUÖ‹l›ÿú׿Œß²I!Ì  X .?~üĉmöÅ(`Ñ C7€p`°1zôh¯›`G‹Æª”]¬iÔ¶)„Xò¨ãЕ²5R7ù`¥CdäÀ2 X<°é,šò€$O/t7„ôS±€†d’lècT1ÄhÆ.8°¨I¤iZÕÀ¢w V‹ì è°ëµ×^;ùä“)ñÐþV™óÅÞåu5°¸´™NQ+`-[¶¬´´”÷ÉÆeìŒNXY¦êV•ftEÜé]:{M½T6ó9{‹g`tlƒ.‹„{dŒNwŽ£¦iUUUUUU65°R:°¨šxZ ÐÝ>åFÀ¢‘V’l:è á‚‹2º»»•§нx²ÄTÀÒ4Íè©áŸÎ>‹ðç?ÿù…^HIIöðoQhèxf¦àpq7X\±T¾€ŸòümÛ¶mÜMX´qÏ‹¸sí~…'“ñxœÚ,çᚢs`ÑÁ§‰ýk:þ:q`¬í۷Ϙ1cêÔ©ÍÍÍ),ÝóQjŒîó¥Ãª–.…0‘HðT_~àmt`ÑÈX,FÛY§Ê?DÑ¥f&`õôô|ùå—±XløðáÂpÝþâ‹/***žzê)ã³L!Ô­BÈEÜi7ucFkÙ²eBˆsÎ9G@À S]FåTv^# Â6…С‹T ÂXK®8˜®ËTÀʾ–‹ŽÎe#`ѯ˜NwŒ–NpQ•B(»¥LX}úôáù„Xt$åÖŠ},›Xrƒío•9Ó†KH§³š÷SEÜyæ$Ï„l,›ùº\Äݨ1ñ4ª–VEÜu,žmÛ¤öêÕ«»»»µµUv`e&`Ù¤Š}s L?ü@tЏ3­­­¥¥¥¥¥¥ºú;€ů÷ôôð½Cø»Ô÷Ý+š.C»Æ«£è k9]J!dÖÁLÄ3ÎÂÓy+jjj***æÏŸŸq yê"„Ð4ÏW,ÚÂ×_ò“ºB3øQv`¹!`‰½ÏÀlžèÐ^Ó¨-ß?›ÖÀ{wÖ8Âæ¸–q’À“Iã"ŒVÐ…‚šŠ“ZDÉ ¦#if,FÉÌnܬÜZÝlŸ“RÀÒÕÀÒq§X±XL—Bht`Ñu //OçÀr˜Bh_‹ît¨Í¬õ8©eüÌ×_ÝÙÙyøá‡S´î:I]É´zšÚUÙEílhhH¹’0Xçž{®€€r‰iADÒ‚Æ!¾èËšŽ©‹” ÓB«"îº{r*CÎyFKU ¬ì¬lXtH˜±Á6ÏëäByÖ Xtü3.â.O2„4ˆÊ–Ø×„åÜeSKn°ý­2/A(özÐäòö"W,SËxëâR ¬ŒXü¤×¸ñd2ÙÚÚš——GçXcc#½k#`YÍç4M£Cá0…Ðç5°n»í¶âââiÓ¦yÝoˆN !ÃpË>…®K–,Iëwi›#FŒ¸õÖ[EnXš¦é.¤W,®Õ¯_¿öôô¤t¬X¡«nóÖ[o•——¿ùæ›·ÐÔ%Ì,û2IiA[X·n]ÊO*°Œ¬ìÃm°lžèÐ^åååµ´´°ˆÉCœB(öî¬ç5°ØÔ̯Ð4©««‹¯òqؼys}}½îêA«Œ1‚DºþФÚ&…03/0—H$L5 ãsMaëÀâ‡ÊV5°tÏ«hj±ß~ûé&9F X|xÉnŸB˜L&›ššòòò8›D˜¥ÊÏöÒJ!44:¤Ç{,…L,ˉ+]‹ÃšH$äçý:¸‘¼ï$`}ÿûßßo¿ý:::2¾§, î¼óÎÌuêêêÜþ @üò—¿,))Y¾|¹·Š#]…¿ûÝïÒS XBˆ®®.] ¡é³¾àêX&L(**¢äð‡z¨»»ûÔSO•GÖÖVžÇÐS)šò’ÆáÜE#«nòáU ,ùfãÀ¢Y‹î†J~¬ÄÜ~ûí¥¥¥¹ä’K~üã»ú+ö&Ê0ÁqtâÀ¢ÛiãFèä?ýôÓ>øàuëÖ­Y³Æy¸{úDÀbQ›Ú3oÞ¼ªªªúúú”Û|öÙg+++»ººæÍ›W]]mªép-g°ØEdÃBf#ìÀÚ¾}{cccuœ§ªZ…Ð+KW‹o+4M+//¿çž{L×S3…Yz:°XÀ2¦vuuuvvê:Ñ•H$ø»óçϯ¬¬|ùå—6ØŠ”5°Œ)„¦5°¶mÛF›’OÅeË–uvvsÌ1p@öEÜuƒ)mP~Ø)×À²q`ÑäJ'`qiNù³)â.?óf§r2 CV¯^½È%lë¸ÓdR¾’k+V2™ÔºNRecTCCCyyù_þò›BnIÊ"îl]Ô=^Î¬ÆÆÆöövÊ6l˜Ø»˜FCCƒÍ¡P¬èÒÙÙyÉ%—P÷È€r/b%`­Zµª´´”Êd¨¢±±±¡¡aÀ€üÚa ¡ó"îÆUÙæC×è‘#GÊ›bhT‹¸ë[ߎk`éüÌ„¦i]]]±XÌ*…P˜Í„™€et`qké§ÉÌÌBO,~¦D­5-âNÿ5u`ѯ˜ Xº½àBÖé]SýkêÀ{#‡«K"UÉfÕÝÝ-˜çÁ´#¦)„Û¶m£„ʶ¶¶+VÈP>8Ƈ«º)‚±Tº–£k÷îÝ[¶lÙ¶m?¶5¦Zq'Ë/ìÅ¢­qþGg]aa¡Îe•BèDÀrXËÏ–¦itælݺõ–[n;vì3Ï<ãu£þŸ|ò‰¢µµÕ4=AÞ½{Çb1Ýãý°âDÀÒ4ÍT) X 0`ìØ±Â,‹°¦¦¦ªªÊôÖ‚½t}ó\Àª­­BuÔQÔžÿþ÷¿¥¥¥S§Nµß`[[Û5×\SVV¶nݺsÏ=wìØ±_|ñ…üd2¹{÷îU«VѹÔÕÕ¥K!$RÎiËÊÊÊÊÊøÝ­)íÚž={(Žx£¬RÓ*âÞÖÖvýõ×ÿù϶ú•åË—WTT¼ñÆò×ׯ_Ÿ²²­©€ÅÉÝiÁ¬<°¬¬ŒLîòTdÖ¬YŸþ¹Hg™Húúa‡&ÌX·Ýv[IIÉ;ï¼#7€,ìø˜s­£KþƒD@UUÉL7e“Bht`qR…ìÀ¢üÁÓN;Mì=Óè]¹–óBS‹‡û¶¶6Î~µJ!¤}¤.¯{:k*`±Ë8îË©ü¼Š‹‰}u(£KWë¸ãŽcï¿MwS–M ,¹Þ“½€e:ÕB¦_\\l#`ÉLJN yâj“B˜ÒEè \g–bóæÍT¯F°àÀîòÆo,]º”þ†€¸–ª•€µ`Á‚ªªªÉ“'+¼—à,îX,F¯8I!ìîî6-â®»Û;°ºººd3”Ñ5xðàX,¶gÏžžž:8äÀâsÞ>…ÐTÀêîîÖ4îÊ„Y ¡n/Œå‡lj` !ššš¨´G~~~ß¾}eáÉFÔ°r`ñL#–Í*„²kþüù .äUNXœÕEÿÕ¥êX´j¯•€EmvRKì{ª;I!ä“„þcÓÂööv9^d¿"øo.f¬‹uÊB]ÞŠÜÚŒ,¹Î:/ÓÍ åŸÖI–µµµô•´[·nÝÒèRMX|ÿ@ïpÀyyyºˆXMæ„˸®¶îþY“¤±±‘ Œˆ´<5®òñÇÓ¦å·U,»œœ¤ ‹c¾@ÑrN|ðî&L(--;w.¿òá‡Ο?¿­­M‰këÖ­iM l,J<ï¼óä§J)ÕR¾K_²d í‘δøüóÏxà´^»0K!$R:°ššš*++ŸyæÝõm§œBH›ÊÀeåÀÚ´i“î ÛX[·n6oÞ¼ÒÒÒ‡zÈíö!vìØQ_____ŸAußÂãÕDŒÜBÊfO Ó8®\¹RìD †éš+CºXNRSqgÑA˜ Xýúõ£Ñˆö÷àƒÖ ê,y#ÿ¢H•B(ï²€¥s`Ñï¦%`Ù;°t5°t3 ž€ÒÁiiiágž:–_~ù%ÝÔõíÛ—ìŠärçÓÞÆÅç{ÁLçÐÙ8°ìS{ì±ÿüç?¦_̞͛7WUU9—œøjÜÝÝM÷FËáȨ–ºº:ôáÀRÇÑI ¡0»Û‰Çã‰D‚¼Æ¤Åó­èÂȃû´iÓèê×ÞÞÎ×®ŒXÏ<ó ¥ä;Ÿñ^è¬ 6¬ZµjàÀ£FÊÌe/`1ñxœ/kÏž=õõõòq˜8qâØ±cçÌ™#¤X°JhLB´¶¶RÏÍÒ¥it=ÔÕq·°8ÇJ6ƒ5ê†nxî¹çxG:::>ûì³”Vmmmyyù¤I“ľ±`£®ÈHÀbý—,~D8O!¤¯“4P[[ûÈ#,Y²„ßÕåuê¬Áƒ/X°à½÷Þ“[hïÀr/…0­U¹2‘œBx饗>üí·ß¦WdKÖdVÊB¹_ðÍ €•H$äË X²ú&¤šJÂpHíS5°4MãU5åZìbïãCyBûHW] ¬Ûn»íöÛo3fŒn¿V®\)»é‰´R;;;éºGRŽCkÅŠ>úè›o¾)öžc4ËêÕ«W¿~ý’ɤ|ÊY9°’É$ÿ\f,±w¶,¤BÙX—2…´ª={öÈF8°rAkk+×éð3×_}qqñ«¯¾ª|Ët†ÑåÒ?)„«V­ªªªš9sf~‹/ÎÇTÿãÐ%2°t¼þúë&L l”ŒXºÂt‹¸Û§öíÛwÈ!BÊÓ\W]uÕäÉ“i>a,âN–ѵvíÚÒÒÒ§žzŠÜ틸›¦¦åÀŠÇã4¾îºëz÷î½bÅŠ®®.>JÜ*Ó¹nª6âÐEåRÞXr6M ¡€U__Oö%ú¹>}úPÁ8y*oŸBÈç·„¬vº!ÆÆe|«ÃFùì³Ïþð‡?dP¿Ù!ï¾ûniiéÝwßíðóFmhÏž=6+*áâ‹/.))aƒ•)¬¬3fŒ?>³bÆ,.„^Àb XÆcùꤰÆ?nܸ%K–°kãÆ³gÏ~ä‘GèœB˜±€ÕÓÓÃ˪:ÿ®•‹ìWcÆŒéÝ»wf,¯…Á†fœØÐP®K!ܳgÏE]T\\üÒK/ñ‹³gÏ®®®&E÷l†¹ˆ»Ú£>ZЧt` iÆÂ'Ø=÷ÜÃWZ!Ä‚ ä¯ËšC `)°¸›Ó,ÞÁ¦¦&'9ªííí‰D¢  @–äGMº‡d:kõêÕßûÞ÷®¸â ¹i X;vì ž} !e÷îÝeee¿ýíoù-›BÙõÎ;ï,]º”„Wa&`ÑE#­UeUËJÀ¢†qe]‰Oj¼nÊY a^^^OOj¹µìÐ×¥RÏC’Éd[[[,£èë¬+®¸¢¢¢â;ßùŽn¿„Ù­½’2…}š4Ä2ĸÀ¢Þë>øàæ›o&õ™úÝ‘GIoãeåÀRwȬ–ØWÀŠÅb½{÷–Wê4 X===---ôÓ”)ÜÖÖ&?†€eΤI“† ¦Ê›ó“Ÿü¤¨¨ˆœ´~féÒ¥õõõäpQ aºz@žC]77Kð”+÷¬-[¶”””üà?P¾eSkäÈ‘±XìÝwßmjjâç™J¬uëÖÝ{ï½t³d%`uï]ÞE,S–îrœ²ˆ»,'‹¸³€E&öŒX6–} ,S–qìqèÀ’ ©€Å9•ŒóX¼ 6?f©¡¡D Ý=اŸ~ZVVöøã Ç,‚?É…®~øáû￟Î"c ¬¦¦&ùEw&ôïßÿC!¹$ãBS–.…ΜÃ?ü€H$ÍÍÍòW>Û剩08°¨`–C‹g®¦Ø8°lj`ñ»·Ür‹|ò°K®Â,¹å:–\Y9c}åË/¿,//òÉ'u‡…g´|”ÚÚÚ.½ôÒ®®®={ö455Ýxã¿ûÝïìׇ~X]]í|u<º»v.™jC®–ÁÒ4­ººº¶¶ÖX(Z†9PgIéÀš3gΫ¯¾:{öì ÚßP X3gÎ,//ÿè£ä3®% X………yyyt·ÿå—_N:uæÌ™sçÎ¥-ìÞ½ûÎ;ï<÷Üs¹ŒiSS“¦i”ÃEú{gggZGûÝwßås&‹t¡þá(¤T¼íííº;y†ç'Ü+íXbï…ÂèÀ¢{Q~b'öޒ鄉”,UƒTà\wç,gsë6bt`ñ ¶aÆçŸž¯¥ÿûßÿ䯳hü!Ú&¯ œ X‹/®ªªZ»v­ñ-S–QÀ¢bNæÛ< Ð5аZ-WHý´16ÝBö¯)t`mܸ±²²òñÇçWœÔÀÚ¾}»®˜<   Ò”&ƒU)dNXrr™X:KN!LéÀjmmmoo§*boö\{{{,ãrììÀ²°ÚÚÚ4M0`€ìÖ—•üdÑx*Ú¤®^½ºººšž?éR>ø`9¿Á>ztnÓÙ(;°ÄÞÎ(Ÿ¨ÜB~‘ïÖy¦d“BÈUF>,Üae”hçκï.X° ¨¨hÔ¨QôŠ XÔxXæÔÔÔ,_¾¼®®NÉÖh¨¶ñÈyKMMͳÿ—¼ïªÚÚßSR'½NI 4CDÀ€r ÂEP°7¤¯¢ˆW¯‚kàÂEED:¤E:DH!•ôIŸ”)¿?Þ'ëYìsæd¼~Ï÷ýÖ<“áÌ>»®µö»ßµö_dggÃx«ž¥\§$êÚµ«øËs`¥¥¥­Y³æÔ©SøsñâÅo½õV5´jqqñúõ룣£Ÿxâ‰ÿ^•þXEEEiiiûöíûÓo€R !ÄX—–– …Þç \)|JY¯×»»»ÇÅÅÑ÷®$q'—‚\ÕX×™ÄÝÓÓ“3°$‹ì?À¢B6oÞúÎZúÞ{ïMš4I5Db`u¢ù4 F£ÆÝ¿õõõÕ°œ…R¢ ^Ã61°T¬ýû÷–u]¨âÞòKEk9°”»?%«¾÷ÇEK &Ð``áËVXP:t O¬´´Ôápxyy‘¡ÊÀ’BÑW¾¾¾œN ,eÛ 1¬««“<LN®IDËÄ^½zurr2¢}}}½½½›šš0OBCC¹—Îå£> š={¶‘€“XÒ²ÍÍÍ4vJ–€¥¡8€Õ§O|‰ñB·ðN‰-Ž©U^^.1°x!ì_sîÿ& ûOWÀû¥K—.X°@ã\Ñf³Áh9°þøPC–.]:}úômÛ¶¡&RÀ¼+’™™©}°Œ’Û`!cT;’ƒŠk3}üë_ÿš5kÖ| „°X,‹-Z¸p!,ÎÊÊÊ‹/ðÓ3Eiºœ‰`]ºtiÓ¦MíKmÞV¡É©qÑÃu–L‡Ã±.))A"zËëçŸ~ï½÷œ‘þ¤Œ-0óçÏ?t誦g0¥XRwBg ,×C±¹•Bÿt‹ sæÌë«oÛdôèÑz½~óæÍô &Ù‘#Gð¡­VAAÁm·ÝvðàAg8ŽÒÒRNÖŒ‹9r ðzr¹råJPP‘!5Id`c²³³±—†N§¥{âÄ áÄ·–û\‡ väÈ‘VëÀ ‡ÎÚ±cÇĉcccCBB\*QÊáǧNªñÌ_`Q®òòrŠêº7räÈ   ÊÊJÕùÿÉ'ŸÌž=YZòÈù÷®äÀjjj’XªÀ\' ÅJ ,Z©¢ª¿÷7Ön·Ó"tÙ­Ä»–J“l”ŒÍ æ’*©ü§Ÿ~Rºm•••‰‰‰J¬ÖuÑ8{úé§'MšÈ£%/9¥ô'Íy Àž\›%Z…_ý•"ûèT©¢¢‘0ܤ+ š¾úê«eË–![p«r–Ãáà šÊ€E+ˆ@äwÞy¦pß1VVVÖÖÖþþûïï¿ÿþ7ß|ƒ–r:Fè?0šUUU¨CQQ*F+ΰøÿ¶I8€…Êøúú¢|š$™™™+V¬PX´~é¢[U–ä`ðø&ÕA¤•””pß8°ð^UÅ¥‹¬*¦´+ ,hÎÀÀÀö1°¸€¶•E ª±±QrêÚŠwSŸ“·I+Å•B.üžA!e,âÎÞâbáôéÓu:Ý–-[”º¢] ¬6…¢BCCñ|mm-r<ýôÓtÚ'e €H ,T^b`¹B(œho¬ šØ$ˆÆé¦F!ì¦ÅbÑ``I!„ªPµ’¥¼0Š„iôy·Æ%K–ìÛ·¯GB À’šƒ‰‡¸Nwww¬µúúzNDh5”òO”ÿ5Ö¹sç0Z­X˜¾y”È!(,,|àâââ¸_·nÝ?üðÛo¿á¾}û¥þï @NÂ$C¢ !DAA¿@[ÊÊÊ’““¯\¹¢á¸”——777¹tÀjll„ÿäì$¶´´Ôl6çääh[úÆÆF8”ðÀ(¢›@.)±‚âÌ™3q…yyy•••cÆŒQۤŠI ,rýËËË•ïu]._¾œ––¶k×®ÒÒÒáÇøá‡ÊíS«Ö±cÇÖ¬YCyL]*Ùf³‘‡oJJJ°gëÕ«öTª /Æ×ŰJâYHßs‹ÎC‡jwíXÚ·J ,*Šn# ò§„JçÔX^Ê—¬>ÅQ*S_áCPPPÇŽGŒñì³Ï¦¦¦®_¿^¸`ñ·HËÙ•XÎBù’ácbbŒFcAA§Ññ{µÓÒÒÒÓÓ[e`¹žÄ:…Ð~ (Cee%ÔXhŒÝßþö7¸žd¤222¶oßþÊ+¯…´•åp8àŒÖÕÕ¹’‡X´ õGMÿ¥ `áUÓÍ@‡WUU}ÿý÷Êÿ%–+¬?öŠüên!„Ùl¦¡-¨¯¯×(󫯾š5kÖìÙ³ù—?(Z<æ’’ ŸªqàÀ¸.R!iiiGŽiwTÂ{ï½ç,ïì/_&ÿþ÷¿—.]êbª ÎÀ"!•ô³`‘ò”JSe`aƒ„>¤’+**(÷ ž—XØÁÑåÈã|˜˜È3Ê‘I´ À×7RL±Ðd`ˆ|êÔ©;wân%oood\Öét¸Þ«  ?¼zõ*&áΞ= xuâ× ¨ÿápÒŠÓf`™L&777›Í&Á%m°àðèt:˜ŒŸŸŸ`-X° ¢¢BÀR^jß«Pü ³EÀ*--å^ÓŸÅÀr`mÚ´iÒ¤I<*\)X€={öLLL<þü´iÓD[X\Àâ¶âJ,‡ÃAoÁÌihhh5%åJoS!èív»Ü^Ž‹!„½{÷¾å–[êêêþýï‹?#–*‹œU‹X)))ÙÙÙqqqwÜq‡’EP”ÑhÄ"rÆÀr=„P¸ÆÀÒ°°ÊÀRj (a‹ÅB½á«¯¯¯©©)++óòòæNýöꫯ&''ïÝ»WÀRN XÊ畸^RRÒ‚ „ËUV¦¦¦Æb±èt:Ìežþÿžü¯°ÈŸhÀ"OEã®`:t(++‹À#»ÝŽK¸.\(„())9sæÌ©S§Ú‘«hÓ¦MÉÉɸÔI[ Îø9!ÖyrV«5??ݺu®èͱcǘغu«³gp†¦zE”ªœ={+»žÜë%?Xõ€‚jNå$¢ÍƒÄÀ‚%–xéBˆåË—_¼xÑYþ&ôXuuõ˜1c”èÌo¼Áÿ$” “Šû¸×“EþPQQÑùóç8ðÌ3ÏtìØ´µ+W®Ì™3gÆ ­Xo¾ùæ¬Y³èŽ!×£õ„>¤¶”––bæwìØ?þDJÚ,a|-4iÒ†YzLÉÀ ­€ÔÖÖ6772%ØŸE ׋ó¡ÈšÂ…,„Ò¡C“ɤÓé° UX&L0` me`ñÖ Å)^§J#‡ &äääìÙ³gÕªUC‡…C©LâŽï%4>·ÊÀ¢Ëï$"Œ2„ЀEW5©2°P1ɆI!„€¥ÊÀâIÜ!ÎXd>ÛBwA#‰{eeejjª‡‡Ç¢E‹x†ËVXÊ“U¡æJ9°$O׋~¢¤±H ,žË¶Õ[ñ½··7HX„UÅÄÄØív¨GTÆh4êt:«ÕŠÞ(++Ó``ÁÄ´ƒ…:ÓöœÜªª*U¸?wÞy'm_ñ«}ûö]¹råË/¿¤t×$me`•””`€‡‹œehc°n»í6½^ÐòOTm:Z››Kùþé¿ÈN­Y³FùC²Œ’_ž——‡EÝÐÐpðàA½^?jÔ(ÎÀZµj¿gðÝwßýâ‹/ð™l N—/_æîÀ"¨HÕð]¸p¡   99™;o´“çªFC¾ýöÛ5kÖðÊÍÍ]´h‘òÉššt> W®\ùòË/ÿòË/®¼‹3°P”ÃáP¨”ĶÉÅBœ‚þIR\\ÜÐÐàãããíí %Æs`‰Õ„Næ#râĉ´´4ÕüД—וæSÓ0¸Àâ!„:ujjjB@€`qµgÏT5::*(44;öüü|ü0??¿¦¦ÆÍÍmÈ!7ÜpOOÊV™A®5M*)$Pb`yxx %ºz[h‚Ýùý’Ç߸qcmm­ÀRÎv‰…Å+qxñ+àD­†J–N§Ã¹æŸÎÀ"ïmÿá‡6nÜHßBˆ#GŽL›6íÃ?¤opvÛ·o_^½zÁ_m+€…i‰)M!„°Ó``ñ¨ ÀmÜ (gN«!„’‰Û`øðáz½¾¶¶VOõ$ì`« ,“ÉôÐC !§¬`IŠöåÀ’è9€…#™™3gêõzå'¹ˆAAAXSJ<›Íæp8\°¤¦ÄÀR !$®:šà,tNƒE °è¸ íàÁƒ»víÚ¿»,Œž>}š²N·JLÓ8$æJ•¬²²2¤-CWjäsÿ÷ä €ET”V‰!äÀ¹ÂÀÊÏχÉ$–ŒèÞ½{wîÜIΓ¤µwìØ1þ|m/gÇŽ»ví’HõBqÔiµZ1M• ,.YYYË–-k5⬡¡áøñãîîî:tÈÎÎvvØ ª¸Ö2dHPPзß~+@µç©Ï©U–ä9I¼ôììlè¸-[¶¨V’¬Nuuµ2ËÆÇL7Ñ E!6ñññԄÇ/^¼xÛ¶mªïr&ð“Þ…«Ê&Ož¼mÛ¶5kÖ¬X±â™gžÑ°ìv;Èwí¸¯ %#¦Z `A™ÆÄÄDEEÑÛ=—ÐÔÔÔÐЀœ-4ér+Õºp ÀÂ+¸ª‘Ëh4Â(–””`öj‡½CMÂÃé´ÐÐP½^ïííëN¸“ŠÏ'OžfÌè´‹/Z,–=z„††BIÂfee=øàƒsæÌAhê?ÿùÏ·Þz 3„l€…T Bˆ}ûöIÍç!„Ôçª , <ð}I q%uŽÅb™2eʬY³>L_¦¤¤(}!2¾œ…:»xï3g`akkk5ÎÃ[îb.3°p×·o_þ$,¢e9€%1°P>jôj)/¯+ͧ¡ªübßÚÚZ½^Oñ_nnn`H!„˜ÌPAEEE¨jtt4@Þèèh‰e±XG`` ?ÚH ,.ª ,Ò<Ò=ƒÊD¢½–^¯ç ,)„pîܹ‡ƒXôA5Õ—Ùl6›ÍP€)U«} ¬øøøÈÈHáÀB‹‹‹¥n·Û­V«^¯'?PJâ.1°”‰}?¾~ýúÿüç?ô îŒ&èƒëz!dΜ9k×®1c†`!„PG›ÍöÉ'ŸètºG}T2IX)˜ ôRûmŠ"T®tWBñ.Â_æÌ™SZZºfÍ???BÉ¥9% ®¯st8uuu¸íá¾ûîÓëõ gŒ3 8¯â¹1Ú!„iii[·nEg’[â À‚ ŠJÎ’2ÍXew¡p,U¬gžyæÕW_0`€¸V655ÕÕÕQÞU°œ…666bª¨XÄ' çùnèÌ™3Ú!„$ÊXLõÚÚZð£W¯^-4¬ö1°à?pší_FÂúß`ac£ñd›XDš 9äÀL~ã7œX›7o^¶l¸ZÎ*X‰A?~f›®¸Â^ëòåË4äÊ…wÞy'33³U  ¹óÎ;EK`„§"vÀºtéÒO?ýDÝH'Øäz^ºtéèÑ£f³˜)eU垀`ˆ+1°”‹“Gó­X±¶“›:.0Šp•$‡µ¹¹¹ªªê¹çž#ëËCkkk <==oºé&ÑúlÙ²åõ×__µj•껜 õ¬§žzjΜ9MMM“'Oþì³Ï„UUUÄOVÐóçÏcÛ `¡F£…P}._¾\SSŠX˜‹åĉ………˜Î,Gz£PÓïÜðó ?|†öÄ+¸âÓ!4 aaawÝu—Åbyíµ×„"„†_ `yxx„††’ñƒÛGGʈ< ½’Àïp8ÈQ°yi9°4XJ(P\€…[«õz}@@),:A•ŽžÈeÑétûöí‹‹‹Ã‚ÅLº…ÐYwÞKüa¡ÆÀ¢”)¨ÍŸEœ˜³fÍšgžy†"›T,$îèÈ­;g`¹žÄ]À¢ÌÁø¾®®®´´î‚KÊŸ* ,.ô+‰E·ÆHu;üE¬ ª ÊÇL+))1›Í:ŽBiÚ_Ï-„ø•dyéÎÀ:xð Íf:t¨ÄÀ¢5²oß¾mÛ¶;wnãÆØÐJ ¬]»v?~Ù²e‰p¤©MÖÀ333á¼ôÒKØ“S»$*„p8tê‘‘qäÈÈçææVVV›L&Ø))ư®®ŽÐ Ò`uuuãÆ»xñ"êŒJâ(»¢¢Âf³ÁL¬X±â®»îZ¶lYuu5.}‡O¢œe(((  sKÉÀÒ°jkksrrÜÜÜt:Ý‘#Gh–ª2°ŠŠŠ>ûì³»ï¾û§Ÿ~â…¤§§Ãwâ9 ív;¬ªïF¸ã.Xœ•PUU¥š¶ìzBÑü^½z),l”+×n„ŠŠŠHá`]¨Ò«1Êm°xÄy­ÕÕÕ‡ÃÏÏï¹K 1°°…+..ƈÄÄÄÀ¢“6b`ñž×:ôÙh4’bÄ—€¥LÊŽn‘X’\'€E°;XÛ¶mÃb©©©Ñ!$)-- Â&‹û`œÕ¦XBˆ›o¾Y#sss3 ´Ùl’‡/ѯDkIÜ!ÅÅÅ4¦h'*¦§§ †n¸ßÀ)ã`¤~óððàÖ=÷Üóðç B`‘ûÁ#¼šššp ´–Ø}ôQ²bm°Ze`©†â]T[rhÑ@`©2°`v|}}éFN‹Å‚ØCƒÁàïïß©S§æææ¬¬,U–¸6² ÙŧŸ~úî»ï†Vtv !Xx;¶o ,êe¡`Ž%Q …B&Mš´xñbØPÞ3ø,Å ÍB!„^¯—2Ì’äååa?E¤9Ñâ5Y, "€E;×X˜3555ü†4,ô¿äžñúH¯ù_–ëÀÊÍÍ0a‚ŸŸŸŸŸß„ \¼›`„›››*C›K›X$pakkk·lÙ¢ÓépÅÏ™3gh/¹Ñ|ç¯*6› Œªòòr)SÉÑ£G?ûì3‡Ãm2™ˆ¢…”"ôsz&l/¬   ÜMQ„§N4hRꢗ´¬I“&Ýyç@m…‹ð;”ÆXf³™t´ä¨¡ ø%%%ä;J!„$Ä“*))Y»v­^¯÷ôô<~ü¸ª3é¿ýío‚žÏ;÷ÑGQø`6›/]ºäp8ºuë†ÞÆäA»ÚzçF¸oµk׮˗/Ÿ‡-Ûºu+åÖêPRR‚%:<*søðaâËûí·Ê]«”ëƒ>øÇ?þ¡ì)„+ÂÅBHdd$ .œ%E[óí„Ýn§É¦ÁÀr`=zT#߯’=âÜIøi-ÌÆÞ½{ !ŠŠŠ(„ðHIIyå•Wà¨rµ€F\k.¹–#¨èRw)ý×_ÃÀ¢Br­9‡W#„ôüR)„î¬-+®M· `©î<ù¶KÒ]R,ÑZ,ˆÃá IÖÅ‹›››»ví*‘RðŠPXžžž~~~…ÉL¨œ’E( æÐ<„½ËÉÉIKK;v옒e6›7nÜèì@׋”Kƒ…ù/œXRNO%€%Z~Iuc Ð3Ý»wBüñÇXÂT ÀâîEJ§hœÕÜÜLI„óBJ⯮d`IY&ø3B(Ø)¸F!„óBT3¸‹ÖXAAAtIºÀ¾|Ð'¸HM°Q×vfvv6æ!æ³Ë€E®Qf”‹–”ÅLÙ B(þ?a`ÕÖÖŽ9rÀ€999999 5j”ªž•Äl6wïÞKQ; X­2°¸PPPÐØØ˜žž^WW×§OŸxxxÔÔÔ‹ã"€5bĈÈÈÈôôôK—.Ñ„“x4G]·nÝ™3gŠŠŠêëë‰{/X,¾5:t(}.,,¬¯¯7›Íά)À$''›L¦'NàLòÉ'Ÿlnnž>}úƒ>صkW°Š´,´áV«õìÙ³:Îh4–”” Î×_ÍH»©cÇŽuèСªª*33sÓ¦Mv»}ãÆ7n¤rÈe¡ )‰; ÁL_ýµÅb7nÜØ±cGJJÊ•+WžþùùóçÓÃpèǧÓéΟ?Ï»‘ E‹•””ÔÖÖÒ™Íf4¡{÷îðÂ9€•——ç ¾Qšxø’8¬^½Á‰Ð§*9ËeKŸÛDÂ"F.…O>ùdéÒ¥ÒÔÅ"â›(šÆ ú@­ÿúë¯{÷îݱcÐ!¬Vk\\\\\ú¶}!„P|Ú!„'Ožôôô8p '³tïÞ}„ زj'qç ,!Ò`ùùùáOØ âø@ìv; ç/Ѐ¥Bõ-ňqKÊIï" ½á:KBQ=¤I0øL:}ÂKFcß¾}19‰@ÊëÌ“¸+­—‹I܆”9°œÅç«Xûöíã;á„•‘‘±xñâÅ‹ ‹•9°ˆ)Ƶñ—_~4eÊ¡°ÈµRæÀ’,¾[“ú­ªªŠoBĵ¢ `I[_)„Žë1°8ÜL_r¼4¸•Ê$îÊ”4Âeð©ñ:‰%®°xÏxyyýýïBäææB¿CéuëÖ dÕììl¬& ·A#„°¢¢bÒ¤IRÖElrø~ âçççããSWWçì(ŽkìÌÌLºu7//OÀ²ÛísçÎBÜwß}¢e¼öïß¿}ûv^gŠ"Ç—”Ç _¿~=tãí·ßž˜˜XXXøÁ¨ö€"77‡öða|ðÁ€€€ÌÌLzLÀª®®–¦HO½zõBÜÐÙ³gëêêÞ}÷]Ú`Ю/??Ÿô†þ?þ¸÷Þ{ÇŽK>ɱcǰݥÎt8Ï=÷×™Üøâ ­¢¢ú°¦¦&++kæÌ™ä~¼óÎ;RîsBi-KcccUUÕÊ•+éâéI|h N‰~I°®9ÚBËSÚUbDèúó61°&Mš4dÈî¦rA+ "à °H Ç¤Xø‰ÀŠ‹‹›8qbbb"6“ÕÕÕ\ó«XJŠ-^¥³[…‚¥ `555)Èĉûôé#˜¶ÊÀ¢eb³Ùh’k0°èyø¥)š„(ÖuV~~¾Ífsww'°ïæ›oÖ Nð9#¡ÏÎXJKò.H}Qž ü)Å Åé‰2„Ð`0"€.¢F©†ÂNqUÜØØ(XèÕªª*%ëÂ… “&M’.¯¤9°jjjŒF#Ùn MWB%%ŸU,J€…?%K“ÈXm¸’ ?¡Ä ÚIÜ!.«M–jw¡æ–»»»GGGó$kªk‡ Z>ÁHÀ¸pK:xs ËY#–t;–¸Àª­­m 5Ñ!4™LxÓ€×\ƒÈùçÊ_ `}ú駃^¸pa`````àÂ…  „¸ªVeæÌ™ÒýJ)..®¬¬ÄÔo•5hÐ úÆf³åääà{Ú@_| ¡ø³ªªjîܹ‰‰‰ˆ;hjjÚ·oßÕ«W7nÜ ‘0ˆcÇŽ•””PJÙÇsÉÓ—7ß|3}.((xôÑGƒ‚‚x¾C.t ‰——×”)SÇ{ï½÷Å_üöÛožžžV«õ›o¾!î"°$Vq+.]º„{¦,K\\\TT”Ãá(((ؾ}{VVVdd¤Á`ÈÎÎnjj" >¥ÝnGd{jjjNNΤI“&MštìØ±†††ˆˆì‘~ÿýwéÄIƒ2ÅÔ©Sï¹ç!ÄìÙ³cccW­ZÅ/c‚EìÓ§OÇŽ- 'OQ9•••ß|ó tVlee%|°®^½ÚØØˆ@?«“;¿‰´BK}}}SRRˆGRTT$Û;t`bb¢â×_¥xCgR[[›•••-X©©©%%%¿þú+XƒuøðašPå”GŒ0µ;wfeeeeeAŸ: !T°(±°”!„x¦¨¨¨±±±¬¬LR¸h%Hr%–h°È ˆDÊEJ£¼¼|ïÞ½Ÿ}öÏ2ë ÀóH"[A$3ÏCáäµ/¾q…% `Ñ{µCÑùܮË***âuà ,×,¥AÕ``555Ñ¹Íæ^] ð]07W:±Ä¬t”ËY¡” ³N†+IÜùöë²²’ÆZyOá•üÕÒÖ—ú Õ&yŠIII?üðÙe8X ,8dX˜ëa³Ùôz½Á`ò¡ðz ×,¾“-æ›r`UVVž:uÊÍÍ x_×7Ýt”pnn.<¹ââb”LEO´ `avñæìÙ³§oß¾7n”l(Žå•‚âÚóeоNj.\¸@d"%‹¿ñ“O>9|øpTTÔŠ+ÜÝÝ«Bùãþ«`Q,¨¾¿ýío)))nnn¯¿þ:@Xh~”ÀŸªª*œd?~ ¬o¼¾ 8J ?Léð§w`9sæ‹/¾8}ú´2:áÆotww?}útuuõÏ?ÿŒÿÚ½{7=ŒÇЙ}úô‰‰‰ùí·ßÞyçz#߇Àâ”Æ'Ÿ|òüùó0¾©©©'OžüøãùJçsÀl6Ïž=ÛYÜ=üÄuX´Š)¥#!„¨†Š–A§öºÎÀ²Z­ø•3°Uƒ%™ !t8’6èÙ³§^¯/--…ÿÔ B¶@•¥šK0ŠBs4X˜–Ú!„Âù–ìàÁƒgÏžÕ°èBÜrXWW¯낺WÀÂ3´Ø¡u‰k‚ÙÂóª:$Ô”æåå… êÙ³çŸÅÀ’t>=ÀX‚]BBVzzúŒ3¾üòKq­ÚWõ‹xs8)ë Wæ>)“¸‹–ç­#šyTT~‹±¨¬¬$ì€EL-íû%ð ~ #åÀR†7‡ Xrhù.ØY!î)Âçv0°œXK#<i¥»` ÚKùCáD”x‚3‹‡'デ‡‡››¶L•Õ«W'&&¾ûî»xŒº]MÖ°0|0ýx‹3–jØ FPFvv6l« ,dÐ*€E÷‡ÐŸôùÿ,ëÇœ:u*ÿfêÔ©—å‰HÂÓÓsÚ´iªÖÕ«W‰¸¢ÿþƒ¡´´T5 ~uuuee¥Éd"ÏÝ••…ÙF †=q_§©©‰Ð>ú(-- ™³È- “€µ***€ªP6qDGbÍ´ÊÀ*((|I(„Pñâ‹/êõúõë×?ûì³Bˆµk×>ÿüó'NDþ !DXX˜———Á`°X,k׮凇” Iñí·ß¢zõêm˜ŸŸ¿dɼ¢sçÎV«533“”2µ÷èÑ£6l8tèµ „ÿØØXxc¿ýö›hÙ +,Œ º:33óøñã~~~cÇŽ7nÜĉƒƒƒ‘ØûÊ•+(ήyÂàr—‚û¦%%%Ðؽ¨2°._¾L£ z¹ª˜Ífîi™L&r7ûö훚šÊ÷3þþþÍÍÍR`¡C‡ £££ïºë.!Ä’%KbccçÍ›§ñÒuëÖÅÅÅM:=ß±cGî(H‘zÁˆˆ½^_\\ÜÜÜŒ½\XXXee%í*++ív;R !ˆ@Y `ÌÚBÈÑzTLÉÀÂ3ØI655I  ø,½^<„P´Ørzr`qÖ3Ï<3cÆ žIÍ€EoQ’I ¡€™ç ,LûÿF,~D#Ësoój‡¢Ïù¤‚_%i!žKéë;Kâ®ÁÀRX‚u²6«¡¡W ¶+àGˆ¢eP`ÝQ«Õ ™³BÕ$î¼±°ðÛTCiç!„|s«d`ÑëÈI%‘’¸CœXœEÂÊî¼óÎo¼ñB‰Å})”ƒžÁ÷ø¬ÊÀ’X`\Ð h5TS÷îÝùÜ£MÆ%//Ïjµ0õäñzC† éիר±caÓ9 ÀD\\œ`•••I|Û®]»?–ÏÓ :yòdrr2ŠÍËË£%ép8>ùä!ÄÌ™3…B Ž–/_>|øðM›6I÷æ"„سgMøüü|²SJ^·råJt—Ùl€5xð`ª³”8z2##Ãb±€vÇwìÛ·oðàÁxl+>ó]ÐÞ½{1a¤Lö¼|)‰;ÊD9žžžÔoRU©|° ´uëÖ/¿üR§Óiì<ù8~üøš5kvíÚ…Õ¡d`yyy¹¹¹;Œ,¨/›Í†EÚÐЀÜvˆãæ8c`)C©Óè´’Ü'e,áÀRe`Q0²` ,”Y]]–‚^Àµr)èõzn˜Z !„"òõõ%(¶M9°8&B[6Þj‰Õ£G!Dzzºë ,gf ÑhÄOxǺ`‘–SÞR­ÁÀúËB{õê%š³ˆ¡Á3.\HKK£-°vŠ$%€Eýz :Ç]ª ,N‡é­ÊÀbçÎø_XœdàJ!äÿ‹XçÏŸ—®SéÓ§v¾Lôæƒ>¬°~ûí·ÄÄÄÄÄÄ•+W:œöíÛ7$$Än·óüß$Pš;vÄ´-Qßa- þh"ò3î@ƒ\¼x1''‡*vöìÙÿûßBˆqãÆ‰kXÇ—xȘ£·Ür‹`l,rüýý{÷î­ÓéPTAA ³ ÀŠ?~ù$ ÓétXöiii¢ÀXB7íÙ³‡~Ñ9k×®=räHhhèã?Nà=9ÔÀO>ù$;;ûÂ… äÑâ€466Ý ËLBb9ñûï¿w8wÝu———W@@@JJ n£Cl. ,((°Z­‘‘‘îîî†PSS³~ýú´´4ø(XZeeeø3..Î`0TWWcr‹ßð•™™ÙÜܬ¼óK)€]ÈíÚµ+ßdöìÙ“Ž¾}}}á:K~ NŸ¦L™£>²Ùl?üð“O>Y__?þ|‚Õ0%NŸ>¬[”êLÑbÏŒFcXX˜ÝnOKK««« ;v¬`t€¦¦¦ÔÔÔÒÒRw:tŠˆ3°\°Ze`q w“,R¸<Ñh¡Ð“ï%„HOOÏÌÌ$'˜‡jXv»ü’ŠŠ NáDÅZ°”Ç,‹XÄÀ:sæ FAüXÚ!„âZËY!ú¼U‹pU–äƒÒX·ÊÀâìqÁFWn>ñðŽ;Ìf3¦³Xt¯%J£øAÑâ÷8 !Ô¸…³Zyè*4XðJ%¦¯$ g`ý¹!„ÊddÕXèNtâ ,h ÔAJèK —>ðm¬ÈÈHœ%r]áçç×±cG„ Š–øAqído¿ýöùóççÌ™£ÓéòòòЊââbÂq JKKÑ|ž@]ÑÐЕ•e6›KKKÉd¶‚~ýõW»ÝŽÙ’——÷î»ïÂíÝ»7===::·©Hß#%%åÀ«V­7nQ‡D‹qG‹0Xpgy!(`a3yÛm· vÝéÓ§½½½o¿ývq-‹,là8¡+D éÏ`*TÊÏÏ'ãNÄÞýë_%%%;wîÚµ«`)XBˆ¨¨(ô¡´§’BwìØ‘­`ÅÇÇ£‹~þùç5 8%E5Й‘‘‘ÉÉÉ#FŒhll„•¤ >\´œQ)Ô•+Wòóó œzÿý÷©¸]¾|¹Ùl2d‹2ܯ¡¡t,]ú!=ã ÀêСî0ÁŸ`µ›e±X”ð™*€EL›…ב=R !Œ„%iƒàà`ø]°¿®3°È\Jv“”@dd¤^¯ohh¸zõªÕjE—ÖÕÕ9ô?ÞÐ>®3 ;ÁG IDAT‹öϘ™» 6²áááR/Ñ+0íy䑉'Ž3F(ö¨€Å 7XJ‡„ʧ„ÜãLJšrÀZ·nݬY³’““û÷ï/ÔXâÚs e!fX………hZCCz2**jøðá|«Ø*KÀÒÈ%Z*€E ,h„žà Àr8x¦¼¼Ül6ó'9ÜŽk„âPD¾¾¾èFwwwš'®äÀâF¿ÄÖ!”xÖT²+!„ôCå\’¾Äu·È€N…HV3»¥úO!tEý€½*í#`"y!vÁ¤¬T¯&Ñ``!ÌÂXäCJ“&`ÏÑÅXºG’? `ýÁÀ2›ÍÒÖ:88Xûvdø:8=ƒ1aÂÜŠõè£>¼°°°¡¡áÅ_|üñÇAð6l†œ>>ÇG%Ô××ãiÓ¦q óáüùóëÖ­ûøãsss7nܘ€0tcMM ‚V1óû÷ï™àîîN¥Q}ðvLËnݺðÅÑÕ””!Ä„ bbbª««®’ë }Šn„Ââý@–Õj¥2é8Úë…¢L`‘ËÍÍ剱322ð=Êwww'7±¦¦&66––j2|øðûî»9Á’¸; !,,,äz {°óçÏ£0œ:‡·+ýŦ¦&hXèÚÚÚªª* À1bDbb"²ŒÑ±_Ýxì:ÜjµrÀ‘¾¯®®¦ÐÕäûÂÊòšƒw‰Ÿ§§§{zzr÷X©©©Ü®£žŒîææ†»JUXÿ={ö,µÄÀJMM•€!Î-“äìÙ³Ü@òí ÆÇ&LÌÍÅsƒz˜²¹‘œššÊX¼†è:43Dº…[ü„ƿ◂edd`þÃ+%ª‹"ÍËÊÊΞ=+åï.„bÚð¬jÄÀâ{x<†ÅÏŒv)Ê´€ª ¬ÔÔT 'á³ZŠœå­àÛ ÌöÈÈH ¼ÈîñóóKKKÛ¾}û¨Q£„;vä[Dz­ðôôìСCss3tQee%7UUU¹Ò检¶çææâ'n¸ ¤á“6=a„͛7¿üòËBˆÇ{ s@²üVø¤¤$«Õú÷¿ÿ=++ ý€eޙϢE‹p¤Ÿ}ñâEƒÁY]]­Óéòóó‘)£´´´¶¶6 ??¿ªª cSŸáÇC}]ºtÉjµ‚„±¼& ~½wTTTTTTCCåB"Ö,&HUƒ 2§NB²Fs×®]a322h> ¢ÊÝݽ[·n]»vU#E{”–ššJ^úÙgŸ555Ý|óÍðÙâââ’““E ݉iR!e\ƈÃÃÄLƒ—’½fÍ«Õ:|øð¨¨¨³gÏ"+‚¸“gdæÌ™Ã‡‹‹C4+—ÆÆF°˜)“1AH´.0óÉ‘¾Å¸` bÐ;c`‘ -;"X1¬¬¬”æ$°”I‡‘Ê.üW©©©‹`^I¤[9"i·Û9âÀ‡LÚmq/55•°ÉIMMÅgt8„EÒ€¶§Ÿ ]€E»?¬DÀ£ðÞ…‹êeÈ!ûöíó÷÷§:ptŒï›ÐêÔÔTn» ÀB+ˆU¬,Ï®K—.A3DGG£©Ó8€…YMî+‚Pü€=õôô¤I¥×ë+++‘˜§@ïÁÜSˆQö¨ÎèR 4!•Lþƒf8÷¾RSS©|´"""Â××·¬¬ :JÉÀ‚öV !Tåf‹Kaa!9¨~øá7ß|c·Û/\¸@­ CÍñóS§NàBÞ5é°0²è+¼‚2Òòý…4«1ý LÐø i9Ò3=zô8sæ õshhèÀqâ‚‘OHþƒ²sHàL’@zh|¾çž{<<<&L˜ðÝwßáR2”/Å’U…ó†VàTØh4feeñÃKÎÀµuÔ@|àCÃÁÉ7àËÄb± òN½½½-Zdñgýúõß=pò?p aûÄáp8¤Ê[±bþŒ‹‹knn¾÷Þ{AZùå—_à >œ2áçõõõ[·nÍÏÏ_³fÍ÷ßo2™–.]ãééÙ¥Kø+YYYP Xð²Bø¶Ñœ†{ñË/¿à\ø•˜˜øòË/?ÿüóz½þòåË111€®ð/8Pth,„ KHHÕÜßß“ì—_~ÁóË–-ëÑ£Ò࿊‹‹y0&Ѳ~èꊡC‡^ºtéþûïç›Íæ .¹Ã²‡wVBBÚÒ«W¯èèèÆÆFhçøøxxf‡#$$döìÙ è=º¥›„C¼tà?’B!wÜq‡Édjll„+i2™‹Ú⺨ÌÌLwwwT˜+„¸ûî»ÝÜÜ>l6›¡`A§ìß¿9/èÈ‘p¸,:t œJ]»võ÷÷3fŒ——Wmm-ìLvíÚµdÉwww̨ââb^ÿ¬¬¬%K–¤§§ãÎ;£ à'lIIIÄÀŠŠŠÂ眜ŒææÍ›«««Ü£G®]»RbÐy2”‚‚‹Å2cÆŒ7ß|“´dEE…Á`èׯª·téRôXXXuøwÜ؉Á±‹¿óÎ;iÇ×zmðàÁèh“à‘ÒP|Ô Á,¾Ñ%´‚§V¥Ëhé½xF !ŒGO¢ObbbøA©QªÙ`¸/#FŒØ¸qãã?Ž/1°hó““Ã};l§#""ìvûŽ;à …PRsq­477c¿ú¸¹¹ùûûK 3Ü\hÞ“ô"~bL!„4±²`Ú«««©ô?MB%߸_¿~T8ÜJΠ&VRR?{¸Œÿåî‚•TX|S—@c-%%%Ñ©;ŒŸÁ`à\trBB;ZV¢e2@e=öØc‚AæG'$$$ðt‡ááá‘””ÄX¨ê—Ÿ¡ú¤B>ð0µ‚EDDZ"7]#„°²²’Ö)¬×0t‹6€…iç±ÅbÁ¬à=‰Ç°Xà§ò…&®)ª‘””DGñéééÛ·oëVb`ñVà·°¿¨!4•··7Q„P¤¤$“ÉôÓO?7î@ üð¯F+8ãp8€´Ž;–,²øÐ<ø^"½¦Á`€‘‚±kjj:þ¼N§å™¿'L˜pìØ±.]º<ýôÓ¼'©æ”Þ%$$äÃ?;vlyyù§Ÿ~Š~@"""Þx㌌Œ×_=66ÖÝÝä»Þ½{GEE%&&†……555]½z5)) Q—.]Phà£GFŸøúú‚ì‚9 ƒӉà‘“&MBà"ãìì쬬¬   ¨V“ÉÔ·o_›ÍÆ/&„í.\ÿ¤¼¼}:¼)–¢[·nÛ¶mËÈÈxê©§ÄµÒØØ¸ÍÝÝßÇ'˜~À7ˆR×òtDË* $­…͉Á`®ÁºÀ7P8aÖl6Ks݈2¾444PþM°ø¯nºé&›ÍFÚ†b¤X4£P½„„g ,!Dtt4Ô>W>pŒéyŠn¦†Kv“”@`` JÀ¿¾¾¾Ø.öéÓšGÉÀêÛ·¯2+6‹Ô´¥ÌÊÊjhh : é>‘X\_¡ÏQÅRðÑ$Ñëõ˜¦GÓ¿¢Ì†âÚ!“¶Ü&%%uBò@’’’ ÿé- .Ôétމ%Í(¡°¼¼¼Ð·p)¡vhž766Âú@íð:ðžç`JNJJ"+))‰,”z¾ÃáÀ¼2™LC† 8p &-~ȽÈÈH !äùsœÈòªÂùªü5'ðY‡ÃQQQ‘€áÀ¿è=nî‰E+K´$ñÀƒÍ%-MжºôâÅ‹wß}÷›o¾‰ ­ÐétpfÐJ }.…ÒnN(Dò@ ñññèsçÎ=óÌ30š¡¡¡Ü CÍéÖ&:>$ÿÞxRRXY LRaa! wT¤Y öT7ú“<00ÏdZèL^ªU«Nœ8m FYnQ‹3˜ÄÀJHH€_^^¾iÓ¦¿ÿýïX ÒõdÑ¡÷¢|-PÊq-€ÅéÔX%€Åɰ}úôáçý˜ðü¤dÑ¢E@fPàÁƒñ§jÛÿù«¬ÀÀ@é ¼¼\îäL$Êàç±cÇN:µS§N¹¹¹;wîÔ©“ÄÀzùå—ï¾û˜Y³f‰–¼B7ß|³Åb¹|ù2V`FFg×KaüÎ ¸D”ª|÷îÝpŒî¸ãŽ’’’ãÇ¿õÖ[&“)&&Çžï¼óNMM ©_|±gÏž“'Oæ¬H¸p¬%öã=÷ÜãææÆ÷!c¤Cž+Và{BáºOU¸ݾ}ûêÕ«7lØ@ZX,¸Ôݺu£ ={öl,<(¾#GŽØl¶ÀÀ@h:£Ñf¾Òô B(„0`* §™™™(¡¤¤$55Õf³ 4Hy2æçç7lØ0«ÕºbÅ ˜C›ôêÕ롇ª««#p"¬Û²²2€ß:t óIx"4’×ü>wî®&Á¯”×iÏ;÷µ×^[·ní=€ËÛŸ„_ÿ„®Ã•»ví*..†¯ ¢§§g§N`Ï$ëôéÓ´gFŽ|*¿W¯^&“)((hĈ£GF``xx8mÏ8‚&Z8ݺuÓëõÓ¦MB †ž={Š–ÅØØXÌø²4 ð´“¸[,îwÒ/ä• µ$îxFb`ÑJ‘r`A”)hª¨†8ËE#+©]˜L‹Åb±X¦L™ú†+!„ÄðçãÈI7¸ÁJ´¨5s`9 !Ä(K|x^,€IpgZ9ËuÓM7‘Ý%·©9°´o!¤Sëššš¦¦&`ª!„ÊXMMM 7ÜpƒÑhÄ[èü…¤»ºxg›r`)ãq¨C”j„¶õÂÆÆF>ådwźBˆqTMFA3¥!••Xž«¦¦æ§Ÿ~š7o˜q­&qç„=qg”6 žžžÿùÏÈV2°¤B è·Ž;¢½’,„¸zõ* Á¬ŒŒ ‡ÃÈ7fG­««ëÝ»7¸ú¹¹¹tbi2™¶lÙ"% &!£(uZ@@öß}÷]ss3.N5j\U€>¢*:|ø0";Ù‹–E4}úôQ£FÁ‹Ø´iSxxxLLÌÓO?~¦úàÃ:¥‚mdSSSNNÄ€€€ûï¿ÿ7Þ8wîÜܹsŸ}öÙåË—Ï™3Ç`0Üzë­BˆÝ»wSgŠ ñ’ð """ºtéb4q5\¸ž={2y¯®\¹‚q¹á†žzê©Å‹Ûl6Üö(шD ™K\»fÑ ÜÝ݉ÿ+ý\ !ô÷÷‡ÈXÁÁÁ¤‡É¦K§5‚™iÄa©2°ø«­V«‡‡«®®®k×®^^^_}õP !äW¿ Ew¾úx=- ï:£ÑèïïÏ,þ“ö…Ò«Ðp'|}}¥Ä…Ú!„R¸7jµµµ˜Z4Ž6›¤$î¬D²°ª ,!ìÚ%=ƒ¢’R,ˆF¡Û.ä5S¸‚ݺu{饗<==‰©Ì%®ç1†h{RR’Ñh,,,ljj"°ŽPØe¡ækñæÍBªæ¼——סC‡Nœ8š(m·³$î$nnn <ºhQ¶(/.Ê.ºÀ(@›9»…B9°8B#9ÉÊX555[·nýè£ð¥”Ä]´øüžžžK—.]ºt©jwÊŽÄ÷$1ÊMåÀâý‰%¦Ì¥L1A­ÓNâNIëÿÄBj‹ÄkQ}F°YEçÌ Àòä𸸸iÓ¦=òÈ#‚épt ’Åo¾‚ðTÀBA«IÜ!Ê$î<‹ÕJª$ïŠÿƒ!„½{÷æ×ó !Μ9ôEÀŠ×ét.BÀq¡LFBˆ+W®üþûïîîî&“iÀ€Ë–-CRs’^½z¹»»_¼xñêÕ«F£QJ—#®½3H´d ><66644tÒ¤Iµµµ8u å;½Ñ£GÏ;÷¦›n*++{î¹çJJJÂÂÂ:wîüØc%''Ór A<9pÕIÆ¡¨†††œœœ•+W !vîÜùÊ+¯À…UX­ _?‡ãñÇŸ:u*h½QQQ”;ÉÇÇ'22ö>$$„Ζv`,(Õh—.]àÚ.X°·@B(„¸å–[ V8,- º X¹È’,^¼Ø`0,[¶ ^51zV¯^ ‡@P$¬òòrBšH[Qù˜>>ø³¶¶Ãeå,‰»´_%Åûå—_âB!q­ÑG¾×éÓ§¿ÿþûªš£BXTT4zôhø¢ÔLå1°¿¿?íUs`I¶Rj­tél£ÕX±±±žžž«V­"˜&v«9°Pø?þ¸sçÎAƒEGGÛíöK—.q\Uy±¯µNjޏÀzâ‰'V¯^ f%u# _BóóyE-­¨¨ðð𠥃Xú_NUÝÕ*€%åÀ „isÀ4hмyópÂq%–”œrü¤X¢eÓn©Ñhœ7o¿9 5äŒ{gIÜ©&J,®|$‹ô€ò€ÓÅ$î®X8!¨ªª"ÅE!„Ò“Ô ‹ÏŒ‹ÅbijjRÞŒ$ ¬=z|ùå—o¿ý6€3v• ,ÔíñÇŸ>}zmmmbb" 0‘8€%„¨­­•r «6S8°èÌO°ø\¢HdVÿ)òWXãÆdýúõãÇwñ瀧 7ÎLž<_‚¶=ð–-[„÷ÜsOMMMZZÚܹs¥ÁóòòÂu6v»=""ÃC3ÕÝݯ 6>ÄÇÇgff–””jKš¬kÖ¬Y¶lÙÒ¥K…k×®-Ô­3fÄÅÅ‘µ&,ÕµGg°o¿ýöÿøGeeåºuë_yåÑ¢Û`3æ–[nÁv}Mð"ò‘£ÂD¿-tGᆄ„@ÅÇÇ4ÈÓÓó‰'žf4dȬpOOÏÈÈHrõã&1°ð_AAAF£±²² nXC‡7ožÍfã÷% !¼¼¼6oÞƒü÷ÄœÔétåååÄÈÈH/ ÀBLœ81**ŠªšŸŸ7¨¾¾žë‘¢¢"X©‹/"¥TDDD×®]‡ ¦ªï aCBBÐ3/^Ä™p^^Q—ñä£> wÜf³UVVÒùR• <Ø××·´´Ôn·S§ÀêС´˜ÉdŠŽŽvssƒ§ÂÏÞi:uîÜyôèÑBˆØØØÍ›7¿ùæ›Ô'QQQßpŠ?‰E–TšÑhD‡H¹oyÉ·JIÜ;öÁèõz¤g"íl÷-„øßððp„Q=% E)¯)ä>¨ÀR2°ÜÝ݉±Hî¼š„„œVX¤®¹!·Ûí¼ùJ–haŸ­°4XÊ$î<‘¿ê-„Ê™&X¥qþ‘*€¥ÊÀ‚2áIÜE‹ßl³Ù’““qxÃCQ²Ôó€EªÚ ,©2®3°èž(>ß„s‹4çĉ©J`)É$dÎ<<…Bk3°„8Myíµ×êêê&Ož|ûí·O:õĉ«V­¢ŸŒ9R¯×úHÀB¨†Ò½;wîÄ.€ÖŽ’EZ `yxxh'q_¹rå™3gjkkùÕ™BÀ"Pò‰'ž@ 2¬ ,)„P1`À€Ûn»Íd2!€kóæÍ· `õë×oæÌ™ÊK 1-%¸GÉÀ‚fˆŠŠÒétJ›n2™0ot,X˜¥ !߀, +žWÚ\þÆÈÈÈþýû/]ºôÁ¤/9oWFüI†leºT2°P T¢JhƒBUX”¯K;X<Ã`0|øá‡K—.¥å£šÄ, ªWCÚívÂõ(„PYs^[UáS”î¦Bøùù9Ë©Q®nI¸ßëŒõóÏ?ýõ×HR‰™© `ÕÔÔ´)‰;?$& €þùÿ‘5cƌÇ¿õÖ[f³Ùl6ÿãÿ8räÒ”¸"À*/////÷÷÷ÇŒïׯàx„À p’I–F:1ÚŒ‘ÇF¦+00 kõêÕ¸y‡ŸéA8€¥œýBˆ[o½uĈÞÞÞcÆŒAÄ,ì° ÃÅ‹U'™`mذÁl6¿òÊ+[·nB|÷Ýw¿ÿþûõ0°† ¶ÿ~ŠFC;ø IDAT×2°à2†‡‡‡‡‡ý S„V +âãão¼ñÆñãÇ‚IHH€{Ý¥KNG'c°TX:.$$—KFrÜ•òúë¯O™2eÑ¢E©©©ð\!:u:~ü8ZŽŒŒôõõ¥+###1^ÑÑÑÄ{"?#wï½÷êtº‚‚â:qmrDK¨vØ&±Ø:vìh2™ŠŠŠÐðÜÜ\J‰'ï»ï>r =j·Û1‡é&MjZÿþý‘8Œx1’Œ3¦¬¬Œ®l:=ûì³Ò®•æpçÎõz=vJ¨¤ê-„J[E×»r7]º…¢ `ÕÔÔï%ÙÔ¶†j3°x!V«µ¤¤D§ÓI»#“ÉD&„»;í``Y­ÖG}Ôjµ¾ð #GŽäÝÎcÓ$áäR2°<==± þ“¬ö…J·º¹¹ét:|5Xªä¿eF§Ó©2°¤Ã"N¥–®dâ.=^!ÝùÕ* Ã×VV}}=f…”ÍD(À ~³¾!„—X¸i^ÙoX°ª ¬úúú]»v¡‰ºÑˆH“J5„P5–¢ŠB:°ôz½w Z63Гme`·Z¸`ÑIÏe§Õo”ºåøñãË—/'(BÁÁÁÄÀúñÇÏœ9…«!h“ÀS€;“˜˜˜Å‹Ïž=SÔÃÃ#66Öjµ^ºtiÇŽ‡cĈÒ@À(DDDâÙqx£d`Ó$–2„WX `ѓРÏ<óÌ;ï¼üþûï«6-44tÀ€ ØÓ&ü¡‡":sppðÛo¿}ß}÷ÅÆÆb8±Ž‡¾ð <Ü> Àf³?~á…«G;v,..®¯¯÷óó#E„DT¿ÿþ;và¾Aƒeee€…‡©>x ã^PPÓFFjP(h¢-ÿ-°Hºté2oÞ<$ä‚(X´fiÆâ~4£Ñˆ´ÎXBÿ"4,Jó$1°œXuuuuuuÄdÁ ¡SCÉËEÄ·Åbn|á…æÍ›G“ªU–³ÂÚÚZ‚]€•Øív777½^¯d`aJHp‰âÓO?å),Ož<‰ÃÈììlŒ¦*€¥Bè,« pÕ¦Â!C†$$$8#:)u²Ùlƶ+ Ô~ÁÌ™*‹€~q-€E†Ô·ß~{üøqÑÂ/v`9c`Ùív¼XJá¡‘KÀRÖYáããƒ= ôX¨¹+ ,×Cñ"IøÈJ.ê-„âZ…Q2°xòJ%ºÁ‘”ËYaûXÒ-„’[òÔSOÍ›7Ôu2°DËJ¤úh‡bCê¬(>EÑ`©v‰‹ÆZ™iš††TÚ»wo¬,è‡ÚÚZ,g ,L` K#ùÏ•¿ÀòõõݳgÏñãÇ;uêÔ©S§'NìÞ½[Õ^ª &´NDyåÉ“'wìØ>xCiiiÅÅŇöôôÝ×™€EKLWPP\–M›6ÝsÏ=ÙÙÙJ†?¬/€OUK‘’’RQQñË/¿ §)ZÒÝÝÝÏÏÏd2uëÖ­¹¹ùܹsÚæ"">úè#‹Åb4ívûüùó`9‹¹URvp GEK122’XèjƒÁðî»ïJKŽX÷Þ{ïc=vÛm·uèоæ?ÿùO³ÙÃì²ÛíÁÁÁݺu“–Uwþˆk]5d8qâ Ü ŸqÀBïB‹R) ¹¶X\A}òÉ';wîÄ ’tèÐaéÒ¥ÈÃQ;%€ú•ŸŸzÒK8°´CUs`9 !,--u8>>>èg À’Xz½ÞÓÓÓn·Kñ_éB4„24g`ì‚™ lÚOÉÀÂ%€õÝwßáZåàÁƒ¸ü‡òa e½j¡€e4%n@@Ž‘è„L5„033s×®]üæ5gdaÞŸù®©©éÁ¤í+ý–ÂëÚ”‹dÔ¨QÁÁÁéééýû÷‡r–Ë€Eµ•,~‹œôóVX؆`™+;ÊÇÇg*[¶lijj"Ëëz,L{<¯°<<<0a<==ù®„W@´$»B(„HIIÉÈÈ€z‡ÖR2°ÐEÎ,UnN»,î®`>»ÂÀR¾Ï455ñæ´ À’‚º´C9éU) KBHƒîp8øóÍÏÏïòåË™™™°³ÄÀRºyÂ5‹’¸µBøÀBtîÜyË–-ÕÕÕÕÕÕ[¶lᧈ­ &&%À¢ÿ½ÿþûÉÒ÷ìÙ3 77wõêÕ6›mÔ¨Qð‡âæ›oÆDWXO>ùäºuën»í¶úúú)S¦pÁªSž„p Qn³‰Œƒ?q8†³ á<„r‚¬X±ÂÃÃc÷îÝõõõd½\êLq___삃ƒ½¼¼üýýQIêêx@*aĈй!!!?üð§Ÿ~ ¸IIIpÉ)Bøùùᇪ!„Bˆ½{÷¦¤¤Üzë­ ÖµO¨ßüýýÝÜÜÝó÷÷7™L¯½öZzz:ç-X° ###%%.Y²$$$@gŒJÖäÉ“£¢¢~øá‡•+Wj¨9!ÄSO=•’’¦°(­,wr aêxVx`µiAbcc‘?K¹4$K¯×GGG#Õý—v,áÀÂ&¹{÷îØHˆkíåÀ⹨$›úßË…Ý]xx8ͺI°†úàƒºÈÀâK±uª6^Y[×s`yxxðôÂ…BÎÀrBˆÎ§œ²xÌËËëã?^»víM7Ý„æSžj&­e"g‘`ñ^ÉšJ9°è9K°”!„±±±˜Ø9°$=ÉIp(oá7"VZÊåŒ%¯6€¢Ãá²r(Xxê‰íS›,!„Õju8MMM:ŽüQgÉÚÄÀj»Jžî o!ç9€‹‹‹Ñ'v»ÝÝÝýÞ{ï­¬¬>þ¹çžÃgýÿcïÍã¬(Îõñê³Î™}™fX†}Ù„‚2hŒq :áÆ¨ÁD'Fq‰WÃõªhT²˜ëzuo6còÉD—|Œ~ˆ&˜q‰’ Žh"Nˆ ›È0Ãìëùýñ~çýUÝuª·sºûÔóŸÃ™>ÕÕýv×òÔó> |æî»ï&„€ ’%%%°¦‡c&Üæ£´´tâĉ—\rÉ/~ñ‹âââW^y¥¯¯ï¤“N¢ÇÇ´dÆH¥ è­™]p0m¤À‚K#„̘1#ççç_vÙe .„„©üA2ÒÙ‡B!ÔÅ@Š;žîhhh Só”——C·*XBn»í¶–––Ûn»ÿ“‘+ÖÕÕýéOBݲà…À(+‰»³OŸ>ãÂG˜©“vA3,@`Í;÷ÿøGÊ'=208œ_á&÷¸ WUU…Û±óÅv€Ã&]eÏž=’)„DÀ«ˆD"˜Ä+°t ,FåÆ.„H`áT[[[SS³páB\lÄqRCCM> ,ø œ 0#6XF)„±X fï¾ûî¦M›~øa]‹ž–ÃôaF)„„3ê¾ôÒKׯ__ZZ  *°øB>@ôˆÄ² {MžÀB – …ÐHÐõÀ’W`ñX°B 았ÀBÌ» 74K`Áòi2™Ä&¾Pf=°pâÄ+° OMŽO!œ>}zeeå+¯¼BŽŸÃ1¼¼  … ÂÌ1ååå(ÞXgžyæ×¿þuøL/‘€vì‚ .ÀGÈ”‹t` 0}útz™Ç³fÍjhhÀ§ÊÊJ¬Ìi§öÁ¼øâ‹ÐY K—À‚ ' ~íQ`IbéÒ¥pó/»ì²”[ôàÍ5ØÒ½­Š999` Jwî555•••‡Þ½{w,ƒ!èæš››»»»‰¿¿ªŒ‹N!¤ß8(MF}«©ÕG€L !XtB—À‚÷R]ªK µdXF)„@`¡ Æc¥¥¥£G.))aZäxzŽé)x±' ¤¤¤¤¤„ÞèÝÈ+‹AC 5\›ÁrZZZZZZàùçX„µ2B9Ȥ–””äææyö‘ãGòP휜xV¡>4Çèd᪡nô¦.ôeú(ü÷ÜsÏ­¯¯gòÜu×]=ôÐÚµkÇÀâƒîýãÝÆWwb/ †À¡°Ø©ŠÃ+:t»(H™8qbJ*ŽŒqºeD`Áéè-E˜B³§€Q`aù4e-… ¬ºº:èðt=°èBx˜]™ 'ÏR¡1‡<…ý ÞáóÎ;¯¥¥åW¿újp8’——G7>‚BZd,’X‚B8¾ð ·ÝvÛ­·ÞʤÊx`ÕÖÖnÙ²†Yt !y0øJBË ,MÓ†††N‡B(ÂA óWÝ]Éñ9ÜfO_€.¥ë…S/Bhä€ÀÅãñH$‚ vžU‘I!ÄÀáU¥2X0Ì‚ƒi+vü.„EEEº ,œ| Üô`CÃT݉'Ö××_uÕU¼‚I!ð)„ð4ÂöÄ| œ> ,ü+sŒ¦iuuuuuuØYë¦N:uöìÙgŸ}ö¢E‹€š7o^>¦èu~˜xG"šÈt°Â˯t~=„ÓN;/m†j`ç‹ÅâñøÀÀÌÒ™u¦N8aÛ¶m¸Å-êêê5kÖ¬Y³ÆÔ˜>®^½º  `óæÍ)F¾‘_BŠŠŠ ˆH`͘1ƒN?O‰K/½´¦¦†éèÑLsêÔ©ð£9þæÀ-Ež `¤Àb,xf¢Ñ(²60N€7öådŒüà-¶0ŠàX………uuu^xa"‘ SM)°n¸á†ÞÞÞ?þñ‘HvÔbÎˤJîBˆ ¬Í›7·¶¶ÂC[%¶¶¶ÒciÖ‡Ÿé¥.^¼¸µµõå—_&H(,£BÜhÏXSSSSSCwÁäx ~˜ŸŸ\‚@U]]½hÑ"X¦×x˜~ÉCµËÊÊ–-[¶fÍpŠ /ŸYf€G*Œ;ÕÂ*v¤{?é@oÛ¶ ´Wº€k1R`}ùË_®­­=xðà¹çžË {«W¯®¬¬üÞ÷¾‡¥YS`‰ °u£˜ý+Èñ¡¤#C]™îرƒ&°mI&“¨XDòníÚµ›6mª­­1cFyyùþýûwíÚ¥K`p ………F–Œ–e B]·Y]‹‘eÑ•¬ªªjmm¥%F% °àWtiÐCg*&° 72áØ±cÃÃÃ………⟾|°±æ ,¾ä¼¼<77 ‰Äb1X†¡&\L¿Ëº ,.bÉ(°P˜O7x9ôOt—Óæ¥ßŠyyyyÑh´«««¨¨Â&ðòDBç„NàWux€¶œFyyùÞ½{é^äŠ+®Xµjúš#PÿLL®UN:Œ¢Ì`šyÈ`ßÃp8Œú”Õ«W¯[·†&Ë–-¹™5‹^73f̹çžkª”Ê£¦¦&FÖK‰b`Á`°±í¹@LXÌ#tèСo~ó››6mŠÅbÐPZHâ#„Ìš5 fÑ«V­zæ™ggPÂ<‘Hdܸq°ÚSUU•——wî¹çvuuY[ö7O`¡ ]-¤b"d$™4iÒå—_θ€iš‰Dé•fS¡äÞÞ^± ›N!„¡F4E;jLëz`Ñ Ø4³þiÇ x¢d2 ý"áñ†é(:p‰S‡‡‡#‘ô¯óçÏŸ?~[[ÛK/½$V`!P GºƒËH$—ÃtŠ]wZ«Ö}}}t÷ WâD‹’H$°×çMÜé]yTµ½½Y¤/þ/Ö´öÈ‘#¸ßó+ÂX¸3&±šBHF88"Ôê‡B¡ÜÜ\8ÿè–––644ÐÇ‹X¼‰;¼4e´&YPP …`”©{FŒI.1õõ¯ýk_ûpíµ×¾üòËS¦Lyçw`BRVV)ŠÐnÐ=Ú”)Sjjjª««Í®µ@Ï8sæLMÓ’Éä‰'žxÍ5ט*áòË/¯­­ås¯häçç÷õõuvv†Ãaf„ÇvøÇãÒh§Ÿ~ú¢E‹x2‚Ç´iÓàÂuEgÕÕÕ;wî,--7nÜßþö· .¸ÀT5¢Ñè¦M›²fÙ²e`ÀŒê°âââÒÒRx‹ikþüùßýîw è—^Ã}ûöÁk8iÒ¤™3gîÝ»»KÈ‚7^‡úúzø4Ýùùùíííôp‘7¦‘„® =äXŒ­Iuu5&•òÉ'íííŒvO7…°¯¯¯§§'ò4¼×dóº”êúê–À´Oæç磀E7….OÄLÎùBü!­ÀZ·nÝ}÷ÝÇ+°p¶9sæLp.'Ö7¿ùÍÙ³gÓöpXiiéW¾ò•¯|å+t­àò‰¼G„R`P%Î$zìÕ%ó‰ŠÄX‰D~ó›ßTWWïØ±^m]öO<<;½hä.OŸ¡K`1Ó ‹&°òòòph„®LM ÐJ´µµáräȺ¨¶¶6hf±nµµµ˜Å²råÊÇ|Û¶m´GbÛ¶mÄ<°2<ÿ2$МT"‘À; “B(žèÑ›ü½a ֊׿WWW¿÷Þ{0U³Q@ ìÚµ‹;¸K‚y¼q¯ÕÂÂB\¨ 0€ØÚ‘H$úûû{zzàçeee “I! +%!HF(3bBHÿ$³ ,ŸX„âââÇG£Q¸;‚å¸%K–„Ãá¡¡!ù•. ·¦èP(ijWĆ‹˜ÀŠD"0BJ$gŸ}vWWׂ Âá0,]"agÊÁ²~ýzñžßŽ@À^‘ãW/'°B¡PeeåÞ½{uS%Óƒ1cÆ8pà_ÿú×c=6kÖ¬ /¼Xê6cÆ è„0û•71%„ ã#1vìØ·Þz«´´nÔ“O>iá¼bà3Œ“ àïöìÙƒ=…Bœ$CCÉÌ{F–Yw2²3—.tX¨6‚‘Gyy9ž4%WÄû) ÄF×HH·çkK§”Ó› ã‚*áX¨K™BÈ€ûÌ(°Œ¬W_}?CK7@‘HÊ×%°x,Z…uÎÉÉa¬—_~ùðáÃøš£=IC 5CŽ÷ÀâSéûƒŸsssMXš¦õõõᚦÆãqfÃxúWð¡¢¢BÓ´®®.8ÀH%™Bˆ¹¨8RŒlòòò༉»Ì¬’O!äMÜe,MÓ ÛÚÚ,(°£FºóÎ;ÛÛÛÁòIÐç~îsŸ?~üĉKKK‘À‚ÅŽŽŽI“&Ñ‹ ‹/†ýÌzÆüüüêêêsÏ=÷»ßý®@J`tEâä}BHAA¨JKKŶ Žà¼óΓ\É+((;vì¾}ût;P °JJJ®¹æ³¼à‹_üâ;ï¼Cƒ#%:½±¦¦¦µµµ¬¬Œ6+())¹ñÆ™aذÿ~xŪªªpc999½½½ }£¿‡—¢   ½½½££ƒ¾KüÖ`’àX4w8ãÚÚÚðìº ,´0/**úä“O^{íµ¹sçVWWãó£kân”?H8–Ù«³O`ñ ¬ØÈ.„ÀC1´…^RRrôèQT`3æßøÆÀÀÀ¥—^zß}÷Å@XºÍBˆç]·n“{ Õf¨gúòq™ÈSº›ëéééììÌÏÏçnæyðàÁ§Ÿ~:''窫®ºûî»óòòèMìEFvÜëêê‚–G÷¼(‡¤oŽ)Voo/P¢ô«däE+°x+??Ç«0æë ñÂd ìe:::hR?ë’†«V­züñÇ_zé%z<,‰H$‹v¸&Ç{`é¾\4Å+é v!Ô4vrˆÅbø':.2)„b¦ýp%=›‹Œdƈ;; °@¡·°~`š šÀÂO`Iž.‘H´··Ã‹L¨9¾| ¡)V,Cƒ|ü«˜Àʈ–ÿ,èüzzzþð‡?üñ d ®ºêª÷ßÿüóÏ·v® &”””ðΦ<À …Bâ±µâBDyyùÓO?Í|9f̘‰'þûßÿ6«À".pFfQ^^^PP`³`ܸqH`áË/Y*°æÍ›wàÀ^xaxxøÞ{ï]³fMOOϨQ£lVy+q a8†Y“x½Ý&ÆŒsÑEE"ì`åêÃ?Ä©24Ê‚BèçŒRN âíÍ*°ÄÐÝ…XŒ­,‘&°ø&;™LB§"6bÊaÀ+°x‹1q ?BÓäøTGZDŸTw—@£Bp°¤ >0"îîÇôµ¼‰;dè´··3ÎVô85¥ ?ó ,± + ÐSš¸kš‹ÅpŘÒ××700v¼Lš*S2²sWWðeJ#+‰À²9C`Á—h`Ç™‘¢î»™ŸŸ=/¯®ÒÍÞeŽáXüêÜÎ;‘÷è2Š‹‹mX¡P覛nÂÿ ¬H$rÕUW•———••íÞ½›ŒL ;::ÄK2ðì³Ïê.9|K0Õ·NŸ>݈ÀZ·nÝøñã‘r²€p8ŒÙÄ€…  æ` íñÇO©¤FtF¼±XL×wÚŠ¿ýío¿üå/g̘qî¹çB[FÍöe$•á#œ S¡ ï½÷JKK–½ IDATo¹å–Ï|æ3/½ôÒ_þòÂX8¬…öùœsÎ!„¼öÚk˜¬€„­Ài€î:.ã%yu‚B–™ÿ9¡<°x–®–˜À3fÌÑ£Géžî;ßù0jÔ(ɧ$°tX¼tXô— Ë ñc†ôü1h0‰Dª^æÁƒ‡‡‡§OŸ~ýõ×  ¨ V`àÙƒ[!6еâ ,‡Ã†GÂRY__lø(Ø™TWM=½\DáÅ ¬‚‚‚p8ÜÕÕ$ôªô²+Xº#FP¼nÛ¶ š&³¢]”ÓÚL!¤H::V4…Ï|¸¯¯¯¹¹™P¦e²aú1iÒ$™]º!LééÆŽ»k×.&ý™‰#O`vÚi[·n¥ ,õÁœÄ²‘#°ð3,²BÇ×ÝÝ Þ©§žzÒI'ëd¤ÀЭ“®Ö¯ýk2²Mx¯uÓÆe®Î‘BT"0&îxýRñÚá=€d7~üxH«…Bü4ø]ËËËy_gIž…™‡ƒpÃl !XºË+°`ê+¤‰XP¾.ÕÛÛ ­Àb^F‹¯À–——ƒõ0ŒCÆoD`éŽC¡P"‘èììŽÃ‚‹ÒÙÙÉ iì{`2Vò)„0ö`ö–!N+°è§®E)'ÑÓ¦Mûøãßÿ};K„{þi®/b\àÑ%Ò >Êó¡³ÀÇX Àb^7OSÒã4¨0ÝZ’L+°|¶ ¡—½)w’)„F˜O`ñ ,¬vÊB³VJî¸bt^"§À¢ÏKFzÀ¾¾¾·ß~›¯Àb^Føm$¡G×|ï,P`C­ðz®£wy^¯5 ŸaË)„¼–}‹I!ÄaÕ‡'°œU`Ñô%}·SN¢q#BÝñ¡<ŒR‹ŠŠðÎà%ã’˜)Ö±cÇ>ùä“p8Œëµ,#wI‹'¡  aÆwåå'@¯“Y–—1wî\ñ¸SµÛ†\Ðvhšfʧƒò·¿ý ´µµµ¯¾úêÆËËËÿô§?ýá°¿¬=nܸ–––P(¤›Éå…GV™P²ÔÓÓ#pp'»šJ!,,,Ä DFŤšµ=&#ûÇ1væÄ`0Á¨cø‘hJ+‘Hື}– …RYY‰2ZãCŽ´µµ¡sj]– Å(° XSÞmø 0q—ÑÞ‹=°èÿʧâ n™À(°P"­"ŒBà%›¸ã\I†PÂ=¤SM)°d,^Eß]¼»ví‚f•†ãĽL ]†ÙÝQ$‘²gt^N!ôp|á…â—L‘À‚K—.­ªªB^ÂqàÀB1ÜS`Ño4×]wÝ´iÓ^xáT`Ñí¼ìô;HÏÕ±uêîîFBX°õá\ ûÑý¦üò¡ÀËŽ {Ìp8Ãé÷ÀB{o,iš»¥)°*++?ùä·X¸Ã#s–”ú¸CSXt !Þg,¥”¦¬Ý»w; d,Êøñãkkkq{¦kš¦{[)„°b<×5qg,ÏT ¡ÿà,eMåk¸ªÀ¢QQQ±uëÖP(d–õ@ÚôKKKÿó?ÿ“I7³†P(¤[Žw¬ &àÞÏ„îîn±œÊZ !C`á÷Œ‰ûÀÀýgÁøÖˆÀ22±&„tvvZN!„ejû–‘½ ZYY ¶¦D˜Bˆ ,]"RWuÊ)§<õÔS´‘]–Ñ.„ð'°4MC†T×Ä]~û³XF ,ú\¼+ ñ´‹5 N ¹~‘H¤¤¤dË–-4H©ÀºöÚk;::@-‚÷Ÿ'°Òàe´ !&6VWWøá‡‡BK¾.!ãVz Xbܸq?üðyçgt š¸_{íµ_øÂ˜¤0˜N`†,Ö¦ObwF°-å«¡tOÁ+°º»»|ðA^ÊfîÄד˜q]À›ç5LX`ÿmooÂéß´iÓ€À2kâŽgaF­8V¤ ,Ýè€á:LáÆ@ùBZåT !Ü@Re42çX0ÛÚ¾}{2™œ5k–`l ×Å8Õò=>*èeŒçÊËË+**Ú¿?¯ÀÊÍÍ…Ë„› ëÃ?„œ/7X­­­CCC´ >À~”ü¯ÀîííÅý’»F£Qø íÜØH$" °ÆŒóÎ;︪Àª¨¨ )KS ,$°àñpƒÀÂpØT`Á6ÇcÇŽÅÛÈìöȪU«~üã3%À‰`aÛèM¡£Ì¤Î˜}?ÊÄÝ€^Ç‘ÂÁÁAKT å¶+‰¬Y³Æ‘¢-ZäH9ð&înŸÑ ma'…0¥”ŒãfzH3 k9Þcž®€îÁ]]]–Sãñx8†ËìB(H!„Kf<°à© œ ˤäææ•£.#w]ÖØ±ca/*h–8…ÐÈ †VÝÝÝpëtMÜSæ¢"Ä ¬ &ÔÔÔ>|¸££ƒöÀ’T`ac5gξwç«'C`ÁI+**>üðCØ tãÆp<=Ü1òÀ“Þ|óÍø%C`¡ìN’Àâw“ä×Ãù›£_:…6U$„L:,˜èj\‚<åÓÝQJå Ö®]ûo|C,»¦Sy‡>†Ø·oôiðÀ‚Ø–Ê(°x¬#GŽ|ÿûß¿à‚ Õ  ‚é#5Mc²ád®NÆn6Ñpoé,lü9xiã7,Ë ,¨M`É·~‹^Y6å…—é”@Ò –¯Œê†GF£Q(VUîxjf+H!¤ÕUð!///''çàÁƒ¨Qà ,¸É€¶¶¶£G¢±‘‹žIê §£*¸¢üü|݈VOOO2™dî³ÙB ß‘Àêë룭¸h׎º¡À‚†‡‡W¯^M_‹˜Œc1Ú»w¯ÍBÞ Ø"±K2“jËÒcÆŒÁsé¦ ÞDàUî‰ …füÊ"³ï m)„YĸóÎ;ïÁüò—¿l§x°ÝA0ÐÔÔ$> ªªŠî†ÞQ`ñ–å”XmÓ_ÒÄ Â…9áÌ÷ŽX8\¦&zñÙ!±txx¸¿¿L¥„ch«ûï¿ÿí·ßAÀN ,y– h˜¸“)„„ºáÄ@%O`1XLórÿý÷·´´ÀLÌŽÖªU«øhZS`ÁÂ4†)'°x–€ …Bðv£Ó4-‰$“I(J·…¤ÊÓ¥b±àC ,¯X`¿}Ï=÷¸Q”=£#P ,±téRž½b∖n ̼ŦË”ýlmè·¸®®îÝw߯.æWd¤G8räÈÇ [0c aÊQ ž¥ººZžª“ñÀ(°ðDpÏi ŽLðR¦:è…¿ÍÉÉ©ªª*)) œiè¦BUñA‚a€¤–Ñ.„ºË{`Ñ…oŽƒÀ(°‰|Ò9Ú‰p/ã‚ êêêN9åúKA !²Tt áóÏ?ßÚÚŠÛk"•——¯ÜdܘvÁËËË;õÔSÑ …¹^ ¬)°€À¢o\‘Ñ›…–.Sc6…þŒRð¹‚ÿÒ ,ü¯YK¬ÀÂbéüAbR[GG‡Mw™B ÙBx~þüç?“ãXº)„º“Œ‹Ž2“B¨ëàßÔÕÕ­]»–þR)°ü‡%K–,Y²Äf!ô¬)`ò«”»ü„Ãáæææh4Ê}³¼‰{¦j‚㪂‚‚ŽŽ ,è gÞè,º}¼Û ,£*MÓp¸oŠÀÂbÉF)„š¦ÝÌx<ª™”&î„Ñ£G=î¿ÄWQQñïÿ›Œti(Æaæô:›)Ú”Q`Á©M¥’‘Ñä—1X´˾€±u #ͯÅ+°h ÍÎRXüÞíÝÝÝðÛ”VÊBp Ôÿ3Û)À~”PTzRáßüü|ôWUUÁ®L`kíµÂÑ£G;%Úåajÿ;Ëðò.„ÁGSÖ¾}ûà™w[…Tú ò­b~~>#;vleee[[[oo/*°ÈHïÇáÝAVJËÔ®ÍNy`Á=nL¼]FDF²ÌrrrÀk7]VQQÊ™™ÀUVVB£*C`AÅâñø–-[¶lÙbx#8LÜ1 ³gÏþàƒLy`õöö=z4Ãà!ý ,AÝè „q@ú`æe¬««ãÍÍ*°˜ƒX•••---mmm@`rÊ)¿ÿýï׫[1 žÐuÒ· Xº¿¢XÄÅ„ ¦=°ðH:ˆâ«†Ÿ§t9ãŒ3víÚÅX¦<°p%Û)«¸¸¸­­Þ…W`Bû ÙàÏ›7ŒÐî)SQ`1)„ºª*ð=¤‘6¬@Q$¿ìŸU˜6mÚ¤I“ÆÜÙ„wXH,ÂPÛ‚–`†ŒH›ËT !l{<<< ]ˆØK·]sdÊ­ôúúúdLÜéŸèXðAœBH?in+°cHrü0‚I!´æe–ÀâŰºXPš¦i+W®Ä›Ëk) ,¸ ˜SÙQ`Á¥ÁZ@`ápg``€~yiúUœBhÍÄžBÓ ,,¶°°®÷½÷Þ#Þ#°•B˜f –î_y4ÔvX±XLwìÄ›¸¡‹ÇgœqàÀ믿žŒt4Ÿ|ò þ•6qwƒÀr6…0//gØ™ÂP(ÔØØØØØˆ÷S—ÀB÷nMÓ˜n%ƒÅ{8Æä&#éTÌÂFBˆKG³gÏ&#óOÉÂÖÖÖÒÒÒÙ³g;«À›¸§T`Ñ‹F%%%•••ôý”7CÈ(°$ ,èà K…š´µµœÑz<³gŸ©šÓ ,ºœqãÆmܸñÊ+¯ÔýÄXÌÛ$I`áý+ø†N!¤ \µjÕÁƒ_zé%B=$)‰™Í‘ !O>ùäÎ;1U`*…ÝÍJ!„ÑK[[[___4M$¼+‘H0›ZŠ ¥K÷EƒÁ5:˜B¨‹´)°Sà-ÐÆ+ŠÇQ ^š_áL$Sù]·e^!ápwžLI³+Ïb–neÀ >y` Fx8€Æõ(‹.Ír ¡x¿ä=°R*°!¥¥¥8†/=úÝï~r웸èðɤ2 ¬Ù³g=¿DŽ@àEßRÅ0SÊ©S§644|ÿûß§.N!„7Ôš‹_OK&¯'‹UVVˆŸ6q§$À‚ï½–BÀ“£išR`¥fXð [S`Á;hÔ ÆFvB …Bx^˘‹MFúAmâž)KÐubõðÚÑAïXYY|iÄ1Á‘ضmÛG}„¹x@`åææòÃuÈ"”O!´O`Áb8¸Õ‡N&“)SéÛxäÈ«§§'= ,üùÌ™3[[[wìØAh¡ËQ`á)øZñ ,dÌ9rXF ¡v,Ú‹®XUUÕ–-[®½öZÝ_hšÖÙÙ \9sEbÒÇ”‹I!,))©¨¨€1X ¦WÚ,˜ÿšJ!ÌÍÍD"½½½ N²¯À‚GñàÁƒdddËX999¦¬šš|ÆÆŒƒç ‡ÃÿñÿÑÐÐûf,Õ`·Sü•îYx+e ¡.”V–"À ¬æææLWÁ—ðމû¨Q£ qGK&…M{ÇœœZ(‹ÐÞL‚s¥„©B"G`Áð]w &V`1]> ,ø,P`á.„º)„6XpÞœœk)„8ŒX°`®`ã¤kãÆ`HdA¥;‹€k‡ŒE™B<ï™gžyÏ=÷lÚ´‰þ9‹>2¼&£Fª¯¯¿è¢‹èŸãp'‹Áñ4‹½¬” ,ÞË”‰;!äÀ¸ í¦Â_‘À‚yEž{È8•žž†¿EEEb„‚e0q”$° A–BA' l~~>Îaº\†À¢W¤ ,))9묳fΜiV%ïàN„–Œi¾a=zT·8ò7Þ8å”Sn¿ýöp8FAª£;éç~kéÒ¥kÖ¬‘·¾B0--ziÁ—p߯_XXØßßßÞÞ.™BèééÙ…G<°hÕ _ £À’iTù§œ"ˆy}™555¹¹¹xûí·‰œËl ¡‘–áp8//oxx˜Ï=$©XXC,&…>ºd˜U`™ºE¦R±2à¿é¥1 mŠÀ …B¸ÍâØ±cé‰ÃÒ¥KëëëAh)P`Án§ðÙÂ.„F)„ºPXYŠ›¸[螈æW4ÆÿÞ{ïÇãñ¾¾>ñ*üxZÆœ6*°¬MŸªªª¶oß.h ?þøcšEp?´BâBü 9^õÍo~óºë®#„¼úê«Dâ%¶Âq,qG——wìØ1ÞA™ŽÎ´iÓ^ýu~¿HݱBú$|EéÎBy–Ãxë­· */£ÀZµjÕ–-[0ÛèÒK/=|øðĉ+**Ž;öÑG¥L! …B`Íÿ¥½2y¸äeô àÏé5Nü SI™F•ïA0Þ×ׇäД MÜñ¿³fÍÚ¾};$͹‘Bhä•………À­ðI¯ápØèý•Q`¥òLY¿¼ËB¿lJE)((hkkÍ”åB—%“IÀ8«À"„Ì›7ï•W^!\ !ž ,BHQQ³¯7 øÁŽ+mXŠÀòlâžÎEõ Á;&îd„ÀÊÏÏO$}}}°¥…Qs‰<aˆLy`Ñ ,ÞÄÝY¬h4Š­­Ñ`z#>ý+¾2ð‘+ eGÅ«¨ŒR<°œR`ÁÑZÅZ !ŽohKÓ´D"A–;kâàXp] ³~ Š$° pÝ)%ÎÐ÷½¿¿¿··îɲeËè±h8¢À¢ƒhÊ ÀŸ,((ÀÇ2ùƒÄVzzÆ lß¾Ýòè\!%˜8JXsçÎݵk×Áƒ¡'²¦ÀŠF£t;it:¦†°mhެ)°PÊ$©À*))innîèè Ç)a3…È)°~ô£ýä'?1*>ærp7LX2,¡)0KóçÏŸ?>þõÛßþ6|˜7oÞ®]»¶oßž2…ÊD ˜GXš¦9åÅ£x,™FU@`¡‹ŒìŸ#¯ÀÊÉÉ™;w.Þm7R¡2@`™2ÿ*,,Ü¿?p+ºo“Ñ"–Øëç?ÿyww7¦3ùºR/y–ØÄ]¦<°ÈÈSjSOx__Ÿ …0š““óÜsÏõõõ7N²| ¦£ÑèèÑ£qúC+ãˆpBBHQQÑG}D¤MÜ5MH&“š¦yS(Š$p ¡‚5d|~EV“€À"#{²5—tcG/ÞJz`!÷AÜQ`Ñ_¾ÑñI‹I³2"°rssQábTÛ”XF)„ü>ÍF)„Î*°2V$áǬøÍ‚ èï™Q—³&îÚÄ=¥S$ ˜%°t=°tg;L*^ZJù†#Xô[fÊ‹þ ½ë%Í ¬ô 77wáÂ…¦R·ì@ÒĽªªª¬¬l``öß´<}æQ̬è ¬)°+åK …æÌ™ó©O}ÊTåêšÅäôtbK<,¡û/šÀ¤Ξ={ùòå ,pÀ’ Áö诿þzÊBrü™³—#©ÀÂÎÑòX¼ËÚšÿ”b—D¬pSÖœ9s°@£%%;)„4ûcJÀ 퀑ÔHwÁ@+°øÁÒ²eËÖ¬YƒËpü‰ö~¥âªËl !½CŸ5ž‡z¨¡¡˜kÝB|À‰Ä¸qãjjjäg.óæÍ+((˜6mHïáKF%v%Æö?%%Àzè¡¡¡! &îiðÀR ,oÎ[ ˜KÁ<5¿ºì²Ë-Z´lÙ²ßþö·d„ý1j.i+''wà–ôÀ¢SÝV`Åb1`7Õ£{\~$ªK`!-êŽ IDATÀ@÷€ƒïqà…}9nA…‹¥F&î|õ$MÜm*°ðJSz`ñò+2r·KJJjjjèï_{íµ¦¦¦õë×ó×e8õ±cdž††<Â(…~éøcxÀœM NªKùá@þŠ6º)˜ñ „*a !-.K¹ ¡M–¦i¤ ]4ŧ‚&°²M¥Hœ|òÉ7n\±b…î_ñE5jTUUÕ'Ÿ|òþûï« ¬”Ð%°èi•¼”UWoMJ–5R !±Xlpp0e !¡î­n ¡¼+e ái§vÚi§Bþïÿþ¾±àÔ)†¤ ¬×^{íôÓO'f,€# ¬”#4gX20R`Ê‹ÈXô&''7Å«®®6šÇÙW`ÒO`­äá¯h–ÑY\U`E£Qôš'°€®µ³„p饗BèÉÜðœœÈAAo) MÁÒ¥Kѱó=ñžöiÈXHAö÷÷ÿîw¿;|ø°7SEâ-X»†)˜…wLÜ !‹/ž9sæìÙ³Í*°p±ŽXJ!äRNX¼-—ƒ ,ÖˆXH` †¡¸¦3¨gJ_=ÞK7…Ð)ÖW\ÑÐР;‘ƒZéX0î¡Ü“'O>묳t¯Ëpó[[[‰ñàØ(… ©ÀÂïÑįž ¯‰îlöÀ"#C®¶¶¶¡¡¡x<.x³PUÒM!ô;uuuçw~cÁ ÅìPI),,ÄIH¶)°TÏ 0q\¹rå–-[èÆŠM`ïÒþýûI&XDZD+°À :ÉBk×Úû)„£—‘>’.éBqÔÒ À_þÂ… #‘Hss3]ó”e4MsÄ+åM^Å£ø5™FU—¦áXp>ÄPBnn..ÔB‰*°Œ °ˆÁj$l*°t=°ˆÞæk( °h p’ŠÀrU%¾4Ek¿¦_sh!5MÃŒrT`Ù< í>FŒGþ4RXL¡œÖÖÖÛo¿½§§'//ORž–¶B¥Àòlân´© FÆçW Ž2Vaa!x½3–d !*–MÜ™“ãË¡—$°˜Ñ›€À‚ŽA0ŽÁ.A× 2Õa݉¯9¾K+))illÌÏχ“ʤZV`%‰ÚÚÚÚÚZÝ#¡X]»ŠÅ‹ŸqưbÌ€>^^8 O`Ñ ,|7>%“/GF%Ø…9’C`•””ìÙ³Ôâ£ÀÂ…M:…Ш΄ªªªÆÆFú&=V÷Oü]‚ÂÑ©³5sss³V¥zÆ`ÀTc±tŽH`\U`1K)5/ R*°\z‰Ü#°ø_‘îL¡ €»ñ™Ï|¦±±‘‘ 3`vÑu’VnnîܹswìØ&ЦX¹¹¹bK~ÜÚHdH$zzzRŠÝäX2)„2/#–ƒ{øÄb±sÎ9g÷îÝcÇŽÅÃŒX𦵶¶ÂŸ q‡Ÿ±cÇ–––¶¶¶ Ø%¼^Ú%MteË ,šÚÐ4 þ ,øSFX„òó’ß…`ß&’.söñ-Xj˜\ “BˆÒý‰Yü{äÈhÕåW•¥°‰»‚5xÊĽ¯8…2zôhp ÄÅ:biBžM``Y!°¼ À@!M`é.)°4M«««##[GɤZV`‰ûiA áºuëÖ­[gô«ÜÜ\ zäX°ýJÊÁ1~æXpj]µbÑ¢EGŽÁᯀÀÊÉÉÁQ câ#O`¡³ !}%[ Xø+FUXX¨iZÖX Ù‰‚‚žÀrI¥kânY500pìØ±H$‚ºªÀJ$@1è¶Þز J¸í¶Û®¼òJÔÅ` ¡ü°Áhc–ñãǧ”À¤ÁÄ=e?¸dÉ’;vìܹ“˜$°Œò —B(°{ëééqPÅïæl-…ŸÒüü|Äb±ûî»9¬¾¾~ÿþý“&MâK *Œ~p!sçÎݶm›€]‡Á¬üŠPÃMÓŒöÍÔ,•íÝ»—è=’)„„+j°¤ *6Xò)„gX³gϦ¿t–À"Ômq)…Œ,ýó–òÀÊ:X¥` Þœ_AŸ-V`ŠÀ¢X’XâBú#VÊÂX,ÆwŠ2 ,~å!°äXŒ‰»îhÊ. ÇR¦ÚQ` ŽXb™%°`‰ÕŽ þ¤«VC<ÿüóddF"$°@488˜›› µB N'C`Ai¦,ÝB ±–I!äï’.…³kpÊ˶B…ìĬY³>úè£ÊÊÊ4(°þë¿þë«_ý*íìCÌ+°Ð‡±µµ5™L–––¢¶ÈÕ—HÓ´ÜÜÜ®®.Ë ¬9sæ {E„)„Fà”ràh!SX„%K–<üðÃÐ ¦Ü…þ¯ \†ÑÍ,((øøãe,MI„XÖÖ<°§ËÏÏïêêÖ½×\sQ iˆ| Oé7Þxæ™g~ö³Ÿ5ú­ ûúŠŠ Sk·p£Œ3MXÌOÈñÃ$üײ *ÖXÖRÃá°ý—”¾d$°>ÿùÏwuu5êé§Ÿîíí2eŠÍ³XH!Ä‘¶) ¸ÝœœÉ-I=°å-XÕÔÔ¤r%,Àkó+ˆ#­ÀXðÎ>W`év¨Ìg¸-iH!ÄAƒ`C=¯À§"…‘Re”B¨«À2J!455Aõ1¾+‹‰h‡À:pà‘ÖÐ÷Á¨æغ—¯;\àcñ”Vww7úÈ ¿Ò}̘])?³)„F ,ÉX[0q'#7ÉGT`Á_.\xàÀù¥AÆXÕ3fã¸mÛ6ø–4—X%%% {EÌ+°°gò‰Ë ,¨ª‹ …Ð(ˆü‘òCŽŒ{`BN9åü,£ÀBóÑ€Öððp$18;òvišÇ{{{^¯À’yé´¸D"ÑÕÕeê)"ÇXŒÜþ³Ÿý¬€½")°Lå’ão”ã~ –,Y²}ûv]§|â¾ +fJe?.d̘1ØÔüà?€ÖÔ‚<˜aªL aJK×Å ðÀ@²|Ý•u°‰»£[CÆçW x,q !|°æ…Ÿ"‰D¢³³“¤×K—Y+°Ä)„ùùùfX ¥+¡+°V¬Xñüƒ¸©ÀJ¹–%0qƒÙ°Y ºFé2&î„ëà iZ"‘èî#}ƒl8Ýßß´îl-Eà‚-ºeXp.£BË ,˜u0²B͈yÆXÕ3–㘖.,+°xËí—6qÔÊ H!4 "l]OOÉ,(°Ü#°R^þĉgÏž-ŸB8cÆŒ·Þz‹XápïIee%³Ý B’À"„$‰ÞÞÞ´y`Ñ“kÖøÃöööÉ“'n°—ø0Xp‰ÅbÑht``À”ƒ;9þFÙ!°˜ÿ2¿‚+*((X¸p¡nå‰yVzRY?ÀÈ¢üÊ ˜Dû)„üªÀÅ_ü©O}J²nš¦ÁóÙßßoö2…@i|•B¨ÀÀS»"dL܉%+e !}°vÀJ™B(O`¥T`MŸ>½®®îä“O–ôÀêïïGA5M`Áe*–²KÃ2uÓâì+°RŽ×í(°àƒ–8…>¤ì•áÚS*°E`‘‘çY° !yn¡ÚK< •Ù…`ŠÀ­ó'Ë ¬Œ ã–B–cܸq0ËŠD"Žg™ `MÕÛÛËlAHÜW` °cÇŽd2yÒI'Éÿ ,S“«n¸¡¾¾Ö ˆßR !gžy¦L5 ¨¹sçÂ]”@6 %ÈÔJK›½µ}ûö–– ®$¦L™²páBÐaY&°,(°ÈÈ0À,%V`ÉìBȬx R`J588hÍü7ƒÞØ4XºXFïš5,BH<Åb³fÍ2[=·EX °4鯃gàBkð¦‰;´ÑfSMy`¥2 ,BH(²#Ã&zü –‘pÚi§566~ík_“W`¡Z ¬ÈH½$N$º4,A×ÄݾË=Ë”+ãaFާ¦X° ø¤2œ”'°à¯Fƒ xn­y`ñ)„ð_ ±x‘Ê+°àHE`)d3âñ8ø¾¹”?hlmì+° µôËK‹Å Í1µîuÇw444àþJ!$%£ÀBË0§,IIµÑJ(Â9#œ½°°ÐÚ¥»õ &ÔÔÔØ]c/&Y›´vX¦LÜÆJL`‰oã]wݵuëÖSO=U\U¸-öSMy`9’B˜NVv!$©]¤Ç+3“a°Tà`V{{;³ Ž‚ ¼¦À‚8B ¼‰³)„º»M°¡¿± ¿"î§‚.þ ¯ÀB̘1£®®nùòåFµE œ)âñ8m+.*Œû5}þ¢ÚÛÛc#;ê¦ÚW`¥\мå–[®¾új†w“)!$C£jS…Ûë¤\w¹õÖ[=ʯ ó ,úòe44S#û»)(**ª¯¯×åžR*°ºººà°N8aݺu«V­’9£KÈ8¥zÆ`ÀN«««<˜ÎüAB52fXF)„Q`YCiié±cÇøŽ8eÍ mˆ7v!$„,_¾¼¨¨¨££C|Bh¸ÌiÊËT ¡#÷%º $°Àî——'(Vw !‰DâwÞÏáp˜®¶Úð¾X¾ l—éêõôôè–À{`Ñ…ÿõ¯ÅÏPIôXòwûô‚BþùÏ’‘£GÒ%úH÷`Xv&„¬[·N÷ì¿¿÷½ïÁ7>ú(|sÛm·%“ÉóÏ?þÛÙÙi¶ª÷Þ{/!äšk®)))!„´¶¶ÞrË-„Ûo¿=™L®X±‚²mÛ6ú'¿ÿýïát‘H„/âýìóôÓOÓàô†ÿ“×_=üê‚ .0{™’hll„S<õÔS2Ç/\¸rÞyçðöÛoãÅöõõ%“É'žx¿yôÑGá0ج}Ò¤I–kŽ$ãÝwßÍÿuíÚµ„¹sç •ðµ¯}r×]w%“Éë®»+ùä“OÊTà‡?ü!!äòË/‡ ¿øâ‹Éd»âñ¸Õ+ûÿÖoÌŸjkk !_üâ !—^z©ýs9ZeÀ×Ùm¨ž1ð]{ì1¦ÃJ‰ââb2"·yë­·ðû¿üå/„+VÀ­­­îTÙu¤ â·¾õ-A®‹gŸ}–Œøu: X¾"„¸ñì=öØc7nüûßÿ.8æôÓO‡ tww;^/¾ø"!¤¢¢Bæ`™ò³ŸýÌ‘a$æn………’ÇC:!dùòåöÏ.7Ây>ÌüiÆ ð§çž{ŽùÒµO<ñD2™\²d ü÷Oúƒë|W\q…#U¥3dÍþöK_úüöÁLy0òq⹉§°nÝ:BȽ÷Þ ÿ}ýõ×q c4…I&“D|ÖYgÉ =öX2™„q!dýúõf«OÈ«¯¾št“À‰7AsoI¯åµk×Þxã®VÃG°‰;̱,ÀS)„¦â¨iÚ¨Q£8@Ë•m¦Ne(ª²ï?dÔÎŒËBÚÄÝ(…P÷Š Žùùù]]]Àª0‡Ñ÷Öš‰»{)„Ö<°[ö`9š¦ÁgºùeÌ2œòÀâÿzÓM7xâ‰Ë—/4þ×]wÝÚµk§NJ™5k~?fÌ™ ˆw!t$A°7|ƒ*Bûçr–íÞêƒßÅѬ‰;yµ¡»¡wyËøVžN!e1{Ýl ¡Žf=°Lá /¼ð ÅÇÀE•••¹çw‰0å%ó2:k:« ò÷!Çb±þþþL¥zÜÄ’ŸŸßÚÚJ, K5Yʃ!ÁH!´EEEû÷ïÜÚSÂN a<°ŒH+³Çdlâ®`ž"°ÌâÏþs$ùàƒðq'¡kâÎ\µ«–Qg™H$ÀM_@`ÁJŽ‘Ô6[èv!¤=°ŒLÜã ˆX,¯™¸[óÀ2rp§Ë‰D"°îâ’V<7ÝB-Z´hÑ"q Ó¦M›6m|¦ï°$…»ºG`Åb1¼ñ×åƒñœ{ü¦Yd–ÀRPÈdöŠ¡PHàûNw§Ö5qwdè …¶oß.8»"°2Ë ,BH(¢g5Q`¥„ VD|§À’A: ,S ,8»kÞ”)SMiU‰D{{{š ,Xæ‡)æOžÚ…Ø#°°b¦,)°îºë®»îº ÿ+câN$,z@ˆåX6qGSW—î$µÚÚÚÇüàÁƒ»wï¾óÎ;o¿ýv: YúÁ X !mù¦` –©7`-ŽtµÅvç)©yJ‹W`Ñ&îv,˜ùÃg(³¯¯ó™‰xt q„+â·b$N(°ÒB(ù:Ü{ï½ï¼óÎYget¯èæ×A¹-Ž [ѧÔ¨Q’"ï©«Àr{æ©,ªg |GË ,BHaa!ÝBF•2ˆ–w!t£¹Ë*«¤¤dÍš5'Ÿ|²ÌÁ2/£ã»ÖÕÕ}æ3Ÿ‘ÿ ¼wiÒÃB—.gíå%‡-ŒÛ)„dä½öÅ@>…HXJÅâæ›o~ஸâŠöööŠŠŠÕ«W755MŸ>=ÍÕð,¼,0 QÃSO…µ8ÒÕ–W`aê‘ °ŒXpÖ²p+:;;±4d"tó Õýè^Äîˆû|¤À2›B˜ŒÅ¦Úœ-8H`aR¤dþ ¡Ðù2”œÛƒi:…0 ¶)’pª=±Õ3¾‹£m€EF¦šP`¥ ¢Öĉ7lØ0aÂ[5ÓƒŒÈÚU”””äääÐ麇êêê­[·J,ó2:K`Y€ƒ#yLž<ùõ×_×¥_¤O( F›ãª ‡yiH!„‘°RÐËç‚ûŸ6+XX °ÜóÀN<¬Xi]UÏ ø.ŽXØy1éêè}‘L&5MóïØ5e-X555÷ß¿­j ã ,&É;y'\ÌÞ»4Xñx|ñâź(°!‘HdhhH Àr|ãs˦±ÄL ! „Kü8™òÀ²ŸB4KA OQ Až ùB:-òOÚX➎ϠÌüá3š¸)°ðD‚Ñ- íB¨iZAAÁÑ£Gý«ÀrdÊ3O›–Sì8…;?èÝc±XOOC ¸§Àw½ñÀÒM!4«À¢¯ˆ9¯" “÷9 ,BÈäÉ“[[[:…¤‰»×<°ðQ;v¬äO¼ À‚<#•B¨ A8®ÀòéFɦ`ÁËUœtÒI½½½^`Ó|Ç ³Èˆ–) , X„7Þx£¥¥eòäÉŽ”‰DÀŸg!‰‡=°Þyçøà”+=XïLº2K`©ž1ð]•‹GÊ zJEijjÚ¾}»…Ÿ`CæeLÛ²|§À"ÜŠ—®ï„SWÃ]£úˆa6…ÐïL!üêW¿ÚÑÑñ£ýÈ耙3g.\¸z;)„Ð<öööšý¡)x…úU@kc„+Vdº ~…§ÖâhÁ‹Î´J›K<”¹í¶Û6lØpâ‰'êþUàåT aWW9>…P`â.N!„8 X„H$baN’†]Ý@4íïï+°ñÀúïÿþïÌš5ËN!|ýåðÎã‘ÙVõŒÁ€ïâ‰D Í‚‰˜ óÉ IDAT»®+VÊ ÂæÈýýýQ`)èBæeôˆË/Ö#<ÒÛÛ J# ~èÔ(÷=°£ÀÊ ¼ÛÅË«ñx\¾á²¯ÀRVv!À–‚exŠÀ²³)„ñx:ž4XâÁÄœ9såÅ;øS)„ÐǤ=z”RZZªû"¼(1eM•žBÇÓ±‰»# ¬³Ï>ÛÎÏiXðÀBo]+=Xï<h`,àùçŸbØ(Ä ¬lH!$„9rÄ;ü»‚5xÄË;)„â´;zÜuæ7¼s–ÀrÄ+ðÍ":¸¯Q–‚Y8…PÁ20¿2›Bˆ£Ãô¤:2”I©À‚³Ø!°èÒÀYW£Ñ¨¦iÉdR’Àâ³Æk¤'…ÐqìÌõÀrøšXV`1W¤X™­‰‚B:qê©§š:;/†À ŒK---ć›N*0P)„ Ä ,´ ø¡SWäˆVöÌ£Á/ØÁýì§öôô8U]dKhý‚+°|çáxj~e-Žò ,è«°ëòT ¡iØ…þŒ»vww½» [Åïå¸Ë; … ˜{%H!ôΖOÛ·o_³fÍâÅ‹U ¡(,ûȆ8â;ˈ¶£À’ bQQ‘b¯<™8ªBò–‘¾wjqøðaÉúðÈ6,ÂmèTÑhÔÂPM)°²V`ùÎ!Â;ðeÓKÓ4±0G—Àòˆ‰»iØ… ©À‚cúûûu/ŠñÀâÕà$»X‚BïŒ8W®\¹uëVS?Ǧ»»;™L†Ãa¸ÌŒ˜¸{çñPX ö‘ q4òÀ‚fdppxc”bÙÄl€L3®À‚a¡wRíXΦΘ1C²><²PåˆC+ ˆ¯…üA¢¬ìD€X –aMã)оHâÚ_&…Ð#XbH*°ììBHÆ]“É$1 °˜=yà¯tÉ*,–#X™òžD·R ¬ÌÖDAÁË0òÀ‚z"õ)øW`mذáüóÏ—WO»@¦fOsä¸ âhm‡SE`e#¥À#ó+¬yÊ *++ëëë«««á¿ÁH!¤—ÚW`Áº·î•'°t»=› ,ï02Q`9¾Æ•~D"‘p8<44Dôûtš¸{çñ@« ˆXõ)ø7q;vìØ±c3rj]ȧݥG…–J!”K)„J¥ ‹§¶··+ãkðÔüÊZ±K;¸B&L˜ÐÐЀÿu5…0//±9w6…0666’‘«ÈËË‹F£ÎXØCXº]Ä‘§ðh(óù„N¨««;ñÄÓ_=]X{ãñ8ø¦ñ}:XÞy<2ÛÀªž1Ȇ8ŠXügß!‚˜ ‰c2œ…¼jIìå!ŠNbO°y´žJ!„ÑÛV¶„Ö/Ì8€Çž={2]¿ÂS–µ8b”RÅÀÕÂp8Ìøh:›BH©«««««ƒÏ6lèïï¿çž{,ndâÞ×××ÛÛ …tõ,pŒîEA]U`y‡¡ õùϾ±±ñóŸÿ|ú«§ k/#ŽíÒŸB¨XûlKK˼yó˜’- m ,ì›í(° Žñx\à» Ò4Í‚–§ Èx`y Ö^F|lø|ÚR=õxd¶U=c0 q„¦ƒ1À"Ò«fC³2qT)„ ¼æõÞ{ïIÖ‡‡üµžÚ#[)°²¾˜5YÊ+2]¿ÂS–å8B¯fVuçwÞyçºEçn½o åB)dá.„*…P!ðKÁ2™ÿS6+°ÈÈ…ïò‘Àâ7Cp{¤¨X „z‰|‡¿þõ¯ÍÍÍ™®ˆ‚>ìx`)di؅Е‰ÖÅ_\^^þòË/óêìì\½zõ‚ >üðÃ?üpÁ‚µµµÝÝÝnTçêB–2° OíBh9ŽS§N]¸p¡³)„Ž{`9¢Àr)L¼Ë¬sÏ=÷±Ç«««ãQ ,âíËwÊ+§çb=®ÀÊH¬UÏ dyƒ1pÍò ’qœ0aœ9s”Ë›@,_7)Y ¿îB¸sçN£?ýèG?ZºtéÍ7ß ÿ½ùæ›ß{ï½Gyäšk®q£&~DP²”¹€exê‘ðBÝóÀÊžB™8f¹Ëû)„Ny`B"‘HÚXÊÄá…UÁ>²<Žž¥XF–10Pq V¬XñÀo/"*!€XÏ<óÌ%—\BsÉ%—<õÔSi®†—Œq€‚ƒP÷<°|aâîl ¡Y®À | !C`eâ¸X+(¤ÁP`)((x*…пðk ¡;wîdLpN8á„wß}7ÍÕð2”‰»ƒ`˜¸;7&œö÷£Iÿ.„Ž˜¸ å ¬,$°Ò–B¨X A‚z‰œ…2q÷/¨À:zôhii)ýMYYYkkkÊjzؼy3êÜÜÜÜÞÞŽÿ¥ÿDnooonnÖý“J‚@`ùô*øð¿¾¾ŠŒ”088ŸC¡PƯ¢½½=ãu`’õ©ª,—€µêììtã> …]£À2utßG¦„¶¶622!ñà{áv pᚦyö*à{³%0”OW$qõ*Þÿ}øœ““ã;‰SnliÓY‡­[·:rª„Ì–ûý*,—€[6ùº¿øè£2^U‚ýà¯~¿Š,/¡½½}îܹ gu–¯"{Jؼy3ÍÏüìg?#„¬_¿ž¸‡¤›àËF£ýýýô7ýýý±XÌl9ƬY³ 4¿üå/3]'ñöÛogº ~ÅwÞ Äe—]–éºx"Ž=ôÜmÛ¶9UfUU!ä'?ù‰å^ýu¨UOOSµ¢±iÓ&(¿¯¯¾yä‘Gà›O>ùÄli2q¼þúë !«V­2[x00zôhBÈ„ 2]CX{ýë_Ãcsûí·ã—°Óücçj§ƒ¾¾>8õã?îê‰LáŽ;î€Z]}õÕé?»ZTûÈò8N:^¢¯~õ«™®‹udyÇ@Ñ׸öÚk !ÿó?ÿãcWEóm2Ç—””0z«#GŽ0š¬,GPSçΛé*øžç{!ŽÙœB¨io$d!…P&ŽéI+ó,¼oâníeÔM!„ÏÊÄ=ýg÷B‹ª`YGOR,#˃¨8*ˆ¾†Ri2LæøÙ³g¿õÖ[ô7o¿ý6jŽHPÆ By`1pÏÄÝû»Æb1\-&"»d‰T(Iõò3hâ®iœB™¸+( ÊÄ]AAAAàË,Î:묟ÿüçô7?ÿùÏÏ9çœ4WÃ˪KÁ2ÔüŠ7ÄÁ]]%°}ÀÏ.mAH²^•UVzXx E`)( ê%RPPPPÀ]#Ü@º)’Ë/¿ü•W^¹óÎ;=zôèÑ;î¸ãµ×^»ì²ËÒ\ /#¨ãÚNÁ<õHx!Ž^V`…B!É|j³@~c‡À’‰cPIx?…ÐÚ˘Á]ñ¤*…á…UÁ>²<ŽÁP`eyÇ@Ñ×ð«‹vÅb² ^|ñÅ7Þxc„ &Lؾ}û /¼àÒð>…§Ø ±bÅŠLWÁ¯ðÔ#á…8zÙ˽)°¬µŸ2qÄ-”xŸ¿³ö2fV'R ,„ZTûÈò8zj”bYÄÀ@Å1PAô5Ò@`¹2ZûaMœ8ñw¿ûç T ¡ƒ` „{ ,û)„é$° ‡po =¾Hž…÷XÖ€ý´§-Ö*…PA!x†KAAAAÁ>`Œ×ÓÓãÞ)²tiÝËÀI…"°nð5¾†ïˆ}µ¦:U%À;Ð)„‹-jmmuï©Èr+¨—ŸYÖ~ðƒîîîòòr·O$Õç*(Ø„b`á¿B;ê8 ¹¹9ÓUð+<õHx!ŽÞôÀJ$W\qÅ 7ÜàT•ð ¬p8\RRRXXh¡4™8fy ¡÷XÖ^ÆÌz`]tÑEõõõžò Èlë…UÁ>²<Žž¥XF–10Pq T} ¥ÀÊF5…püøñ™®‚_á©¡¡âèÞ.„6 ¬‡zÈ©úðàMÜí@&ŽA• IÂûXÖ^F]ëÊ+¯<ûì³§NêLÍ|…Ì6°^hQì#ËãŒÂ,b` â¨ ú~õÀR°O±¢¨¨(ÓUð+ðIð‚Æ qtCõÐCutt̘1é¯À²™8*ñv;líeÔõÀºð ©“‘Ù>× -ª‚}dyƒ1pÍò *Ž€ ¢¯¡¬lD0Æ B= Ü °–,YâTQ.aÕªU­­­é¤“æÌ™S__Ÿµ{Áx_e º ¬l†j`l" ,ûPV6B¨G‚§$iiC$)))IçW®\¹råÊtžÑS°¿1¥7–Sé¨~6°Á‹µ‚Bz F) °úúúÜ;E \–‚ ®755eº ~…§ø/Ä1¨ïH:á…8zÞW`Y b(‚–D)°™mOÔ› dyƒA`eyÇ@Ñ×Hƒ‰»"°<‡ š¸gm"’}xНñBÝH!Ì6x!އ÷=°,DXŠÀd¶Uob0åqôÔ(Å2²<ˆŠc ‚èk¤!…0PI0Œq€‚ƒPuCÒï+°,CX4T{¢ `ÁP`)((((؇"°²¨. ˜KÁ2ÔüŠzGÒ€X0¶ðBJ² Ú›P£@aaa}}ý¾ð÷N¡†kžCP²T>³exjhè…8â„SÍÀ-à qô8¼ŸBh9ˆ`ß®X€Ìš¸«71Èò8càšåA TD_#‘H444ÜsÏ=îBMÿ<‡ ®«|fËðå…8õI'¼GÃû ,ËA|æ™gúúú&Mšäl}|ŠÌ¶'êM ²<Žž¥XF–10Pq TÄP–猅,á©]½uCÒï+°,cΜ9™®‚‡ Ú›PW…´Aé<‡`,d)8õH0P7D! ð¾KÁ¨öDAÁ&ÔK¤    6(ËsÀî?`éQííí™®‚_á©¡¡â¨Ríà qô8¼¯ÀRAt™m`Uƒ,c0XYÄÀ@Å1PATCMÿ<O±bÏž=™®‚_á©G qTÒûðB=ï?f*ˆŽ ³ ¬ b0åqôÔ(Å2²<ˆŠc ‚¨ †"°<‡`ŒxÌ;7ÓUð+W1Èò8C•åA TD1å95…PÁ2‚ÊiZ†"°Òï§*8ÕÀ*(ØD0,_ ó‚ÊßGš_1ˆD"%%%yyy™®ˆBá}–‚#P‹F 6¡F) iƒ®y8†öB¾˜ƒhjjÊtü O ½ÇÂÂÂÖÖÖ½{÷fº">†âèq@SìåvXÑd6G[1Èò8C•åA TD1å9u5xÅŠ™®‚_á),Ç`@Å1%¼¯ÀRAt™]!PA ²<ŽžZf³Œ,b` â¨ *ˆ(Š$Æ8@ÁA¨GBA!ýð>¥àT« `ÁP`)((((øŠÀò‚ªÀR° 5¿RPH?”‰{–@5° 6¡^"…´AQ$žCPÇÍÍÍ™®‚_á©GBÅ1PqL ï+°TAfXÄ` Ëã V–10Pq TÄP–çà)¶ÂAŒ?>ÓUð+<õH¨8*Ž)á}– ¢#Èl«‚ dy=5J±Œ,b` â¨ *ˆ¡,Ï!¨)„EEE™®‚_á)wÇ`@Å1%¼¯ÀRAt™{« YÇ`(°²<ˆŠc ‚¨ F (’`  Y B= é‡÷ ,G X›P/‘‚‚‚‚BÚà õ÷¿ÿýÊ+¯,..Ö4ÿ«ÆÁ:øAU`)X†*(¤ÞO!TpªUP°‰`(°|W(’‹/¾¸¼¼üå—_6: y<ܨƒÝ𨽦¦¦LWÁ¯ðÔüJÅ1PqL ï+°TAfXÄ` Ëã +˃¨8*ˆ b¸b©³sçN7ŠÍ€Ï‘¯ºX±bE¦«àWxŠÀRq TSbݺu3gÎ\ºti¦+bDGYÕ³ b0åqôÔ(Å2²<ˆŠc ‚¨ Fæ=¡¨¼ž2qWPÈ,]ºÔËì•‚SP ¬‚‚MC¥    à dÆe©²²2Ž3æ‹_üâ?þñŒÔÁ³€î_`) ‚±¶©   àA¨VAÁ&¥    6d€%9çœs~ó›ßttt¼ñÆ‹/^µjÕ›o¾™òW¼õ»¦i›7o¦³d›››ÛÛÛñ¿ôŸèÏíííÍÍͺòB  Ô À§WÁ—€õõUd¤„ÎÎNø‡3~t(3UU‚ýtßGß]E–—ÐÔÔ”ñ: ìm»»»Ó_‡Ÿþô§Ž\…*!³%À—~¿ Ë% Àx›|z[·nÍxT öK€ý~Y^BSSSÆë J/aóæÍºD q š«êš–ºü‡zè©§žzî¹çl–<ú裗\rIQQQ[[[¦ë¢à $“IXÞüè£Æ—éê((((ØÀîÛ·oìØ±™®Ž‚‚ÿ°eË–›nº‰²{÷î‰'fº: ™‡{Ž]–}šmíÚµ4±§ Ràû¥Äù ÎB5° 6¡òpÒ»,I’‚ålÖ!`ðþÞí é<ÊcXAAAÁq¨nWAÁ”–‚‚‚‚BÚy™OccãòåË3] !¨ ,:±VÁ,¼3¿Rq TD§ÁV1Èò8C•åA TD1ÒÍ’ÔÖÖ>þøãؽ{÷wÞyûí·ßu×]i®†—áªÂYìÙ³'ÓUð1¼óT¨8*Ž€ ¢SÈ`«‚ dyƒ¡ÀÊò *Ž€ ¢‚®X´+ãuóÍ7ÿò—¿œ3gÎÿÇÞÇ7QçÿOŽ&i›Þ÷EK)W‹Ü—Ë!T`]\ÑõZ\]WVPõ§®»_ÖׯërÈ âWAÐU@P–C( ÜÐ(ô¾›¤m’æNfæ÷ÇÔ˜mKË‘’dúz>|ø˜ÌLfÞÍ« 黟ùLppðøñã/]º”——7lذî(#@‰uÖ Aƒ|]B«©©ijjR«Õ¾.9Šr„è-………%%%¡¡¡·þÔQzxŽî¾U@víá!Šr„ë–)u:™ÖjòäÉ“'OîŽ“Š†ÿŒµÿáëÄ ÷M¸î¾fê€îÀ*+4° ˆãBh`ù±^B˜——çëÀ £8 G@ˆ"€Å¡‡ç(ŽIÜ{xˆ¢E!Bç˜N.÷ó uzÅrssûöí[TTäëZ®jݺuO<ñ9¹\îërÀ÷º¯#¶a>"€K ˆc4°üŽX/!‘>²2 ƒÏ®ÐÝð/ßë¬üü|_—^€Å9ŠB„(=qïÿë_ÿzÔ¨Q ,è¬JŒ$ |Q£8 G@ˆ"€Å9ŠBä(Qé¿ÿýïîîõéÓÇó"Á¯¿þúÑGõÜÿÑGݱc‡×Ëqèö»îÞ½;''Çý°°°pðàÁž;ÜvÛm.\èî2 PñÝ©±±±_¿~‡r¯‘Ëå‡Ãs‡ÃÔùq|ý"@׺¥ÁÄó²î«¸¡¡áW¿úÕš5kÆ“‡B  ÇºÙKžëkjj¦M›öç?ÿyÒ¤Ižë###›šš<×466FEEÝd V7ÛÀêðB¿ÚÚÚ»îºkÙ²e¹¹¹möÏÎÎ>wîœçšóçÏ8ð&˱òþ$îæç?ÿù›o¾9yòäö[ï¾ûî7z®Ù¸qãŒ3¼^ˆãõ饆 öÒK/=øàƒnmii=þüˆˆ†aÚoípoEˆbÁ‚C‡ݳgÉd*((x饗^ýõÅ‹ [‘c`áyþ7¿ùÍk¯½æ¹!þ¿¹×#Ç@1þüóçÏõÕWF£qÆ 6lpoBˆogùòå÷ß¿°!ŠE‹}üñÇË—/¯ªªªªªZ¾|ùG}´hÑ"a+r û÷ïðÁŸ|òÉÊÊÊ¢¢¢I“&Íš5Ën· [¢?ë¦ßô¯;ÖöoèþfÙ²e<òˆçšGydåÊ•¾ª®Eûo­ÎsDÊ~âÿý¿ÿÇqœûá¹sç233Ýbà*..Žˆˆ–‘c`ùÇ?þ1gÎþ¿ßWbéä³r ¸û¶!"–e{÷î}üøqá!B jµº¬¬ÌsMYY™Z­–‘c@˜0aÂúõë=×|øá‡ï¾û®°Œ‚wÓ¿ÞX 5iÒ¤½{÷z®Ù»wïäÉ“}U\‹ößÖ爔ý“Ùl r?Dˆ«¢¢"::ZXFŽäÌ™3ýû÷7ü¿¯"ÄÒI 9„|pÏž=WÛŠÑŽ;ÆŽë~ˆElllûV\\œ°Œ‚J¥Òjµžk4ÍwÞ),#Ä€àÝßô¯7Öh`ÅÅÅÕ××{®©««KHHðU=p-Ú[wž#RöO[·n6l˜û!B Dz½þàÁƒcÆŒùŸÿùa r ‹eРAÇŽz¾¯"ÄBDñññ2™,!!áᇾxñ¢{r ½zõÚºuë„ T*Uhhhnnn^^ž{+B D“&MÚ´i“û!B K–,=zô¡C‡ŒF£Ñh|ø°°!œóçϧ¦¦:N÷„(8Ž›9s¦çÇ›™3gºç¾@Žaüøñ6lð\³nݺkŒ !ú ïþ¦½±À$îpë544Ìš5kÍš5ãÇ÷u-pƒ„wù†††O?ý´°°péÒ¥¾®®ÃŽ; ÿøÇ?úº¸Y;vì?~¼R©LIIY´hÑ’%Kþð‡?øº(¸ǽýöÛ?þxlllllìoûÛ·ÞzëÕW_õu]pƒV®\9þ|™LæëBàºýýï?}úô¶mÛšššššš¶mÛvúôéeË–ùº.¸K–,yá…6nܨÓét:ÝG}ôâ‹/J$hJÀµ €ï•ÈÈȦ¦&Ï5QQQ¾ªnLç9"e¿RSS3mÚ´?ÿùÏ“&Mò\Q\\ÜC=ôÉ'Ÿ¸o(‰ /¼ðñÇK¥Ò·"ÄÀuï½÷æåå ËÈ1 DGGß}÷Ýžk~ùË_?~\XFˆE§ÓmÛ¶mîܹž+b X³f͆ fΜ9sæÌ 6¼ûî»ÂVä&Ož¼uëÖ>ú(===--íƒ>X½zubb¢°!¨› îzc €Vvvö¹sç<ל?~àÀ¾ªnLç9"eÿQ[[{×]w-[¶,77·Í&„¸FŒ¡Ñh„eäJJJÒÓÓDä^@ˆ‹÷¸¼9„ìììη"IJvíÚûͯF1PÔÔÔŒ1Âs͈#jjj„eä(&NœxàÀ“Éd±XòòòÂÃÃÇŽ+lBˆêf‚»ÞX u÷ÝwoܸÑsÍÆg̘á«zàÆtž#Röæç?ÿù›o¾9yòäö[bà:zôhÿþý…eä:™q€b Û²eËÏ~ö3a9„Y³fíÚµËsÍÎ;GŽ),#Äât:׬Y³páÂ6ëb HKK;uê”çšãǧ¦¦ ËÈ1@­^½úÉ'Ÿ–b€º™à®;Ö®¦èò=£Ñ˜‘‘±téRájç×_=33Ód2ùº.èLûo­ÎsDÊ~bèСŸ}öÙÕ¶"Ä@1uêÔíÛ·7448ŽêêêuëÖ%''ïÚµKØŠ”çû*B “'OþüóÏëêêGiiéÒ¥KcbbN:%lEŽÁjµÞ~ûí6lÐjµZ­výúõÑÑѶ"Äòé§ŸN™2¥ýz„(V­ZÕ«W¯¯¾úª¹¹Y˜+%%åŸÿü§°9ŠéÓ§Ÿ>}Úáp”””Ì;÷©§žroBˆÁ»¿é_o¬ÐÀây¾¬¬læÌ™jµZ­VÏœ9³¼¼Ü×AÇ:o’vž#Rö&ØÜÜìÞ!„Ü{ï½ÑÑÑ2™,11qöìÙßÿ½çÈ1µù¸€ÂþýûgÍš%ü0&''Ï™3çÒ¥Kž; Ç€P[[ûÈ#DFF*бcÇîÛ·Ïs+B £GÞ¹sg‡›b Ø²e˘1c""""""F½yófÏ­È1 lÚ´iàÀAAAýû÷_±b˲ž[¢ßê¾ßô¯+Væj¥øƒ˜ z24°À¯¡~ ,ðkh`€_C üXà×ÐÀ¿†ø54°À¯¡~ ,ðkh`€_C üXà×ÐÀè. Ãøº1@ À;Юè&h`tžç}]€ àÂð+æGž+…‹Å2wîܨ¨¨˜˜˜—_~™çy«Õ:oÞ¼èè興ˆgŸ}Öår¹vðàÁQ£F)•Êôôô?üðÖ9~ ,/[ñ?j¿ÃÓO?}ûí·—””|ÿý÷‡úÇ?þ1þüQ£F]¹råäÉ“'Ož\½zµ°gQQÑ}÷Ý÷ÜsÏi4š-[¶,]ºô»ï¾»•_ €¿a0²À+¦í'+÷†aV®\¹`ÁaýÑ£G§NúÆo¸×9rä™gž9sæ =ú裃~á…„M;vìxÿý÷ÿýïߺ¯ÀÏ à7°ªªªRRR„õF£1<<¼ÍšÔÔTƒÁ@D}úôÙ½{wVV–°©¹¹yРAÕÕÕ·î+ð3h`xGç ,Žã}ºW*P˜ À;öìÙ³`Á‚ÒÒR–eÝS_µYpë|ÍÙ³gÿøÇ?æåå¹\®1cÆüéOÊÍͽU_€ßA ü.!¿†ø54°À¯¡~ ,ðkh`€_C üXà×ÐÀ¿†ø54°À¯¡~ ,ðkh`€_C üXà×ÐÀ¿†ø54°À¯É¼~D†aÚ¯”Ëå‡ÃëçÑó~‹çù6kV¬XqâÄ ¯Ÿz¦}¿É»8ŽËÊÊÚ´iÓÈ‘#»õD JÝ>ÖÎ;ãããѽ€Óí ¬+V,\¸°»ÏbÕ½—æççOŸ>½´´T&óþd[Ðto_iåÊ•óçÏ¿–î•L&cY¶[‹€nÕM#¥ºq–N§ëׯߕ+W¢¢¢º®ƒéöéäáÖ@”â€Å9Š¢ D)ÈQ£h Jq@Ž¢Ñ}QvãXk×®½ï¾û®¥{p5ÝÕs:ß|óÍÀ¯©t[ÅQŠrä(ˆR4¥8 Gq@Ž¢(Å9ŠFàÀÚºuëÀ¯±{p5ÝÕÀZ¹råÂ… »éàÐsøË =  D)ÈQ£h JÑ@”â€Å9Š¢ä(w !ôX?þ¸¯K/˜7ož¯K/@Ž¢(EQŠrä(ˆR#tÉ_zœè¶øƒÁîë*àf!GÑ@”¢(Å9Šr D)ÈQ4º¯½ã/m#4°.!€ ,ðk"l`1WçÛª|xv€ë•——çëÀ £h JÑ@”â€Å9Š¢ä]ò—™§ºé"Iÿ™ZË*è˜+à¡{pcz\‹a«Õúì³ÏÆÇÇ»/ëëðú>Ï•5j”R©LOOÿðïvð–––—^z)+++888<<|Ê”);wîl´sçÎM:5$$$&&æ©§ž²X,ž•X,–¹sçFEEÅÄļüòË<Ï[­ÖyóæEGGGDD<ûì³.—Ë}¨šššgžyF­Vgdd¼ôÒK6›í&^ä/׵ݲK†yüñǧL™2}úô°°°NÎî^YTT4nܸwÞygúôé—.]zðÁ×­[wÇw´?ݽ÷Þ›žž¾pᤤ¤–––£G®ZµjïÞ½žG»|ùòøñãÿüç?ßwß}DôùçŸ;vìÓO?¶2 óØcMœ8ñž{îillœ3gÎìÙ³ 'L˜pÏ=÷455Í™3硇Z°`pÆôôôÅ‹ßÿý:îå—_îÝ»÷ßþö·N^’ZGq­ýF^ÊîÑ'I‘™äë* yyyãÆóup³£h JÑ@”â€Å9Š¢ä(Ýw aOl`-[¶ì¹çžëòìî•>úèàÁƒ_xáaýŽ;ÞÿýÿûßíO§V«kjjÜ}±öÈ# 4èøƒ{Ó믿þꫯºX+W®t÷§Ž=:uêÔ7ÞxýæÈ‘#Ï<óÌ™3gÚŸ¢¹¹yĈ%%%¼ {O¶|sÒÔÉ·ØÔ¡ÓF¨}]xX^;,Ã0eeeééé]žÝ½²OŸ>»wïÎÊÊÖ7774¨ºººýéF=xðàÅ‹'''_íh ÇŽËÈÈpo*--ÍÌÌt7°ªªªRRR„MF£1<<¼ÍšÔÔTƒÁ@D6›í­·ÞúôÓO+++­V+I¥RÏ ÛÃ,è&h`yí° Ã8¹\ÞùnÇI¥Ra¥B¡p8ž[% ˲íOWVVöüóÏïÙ³'==}̘13gΜ1c†0¿•û2™Ìd2)•J÷³¬Vkpp°»Åqœç„Y®v^´hÑ¥K—þö·¿õíÛ7$$Äf³©T*? z܅ЛÚt¯ˆ(""B¯×{®)++s/‡……ÕÖÖò:ì^QFFƶmÛôzý¦M›ÆŽ»téÒßýîwmö‰‰‰©««ó\Óæaûå;œcžˆ>ÿüó>ø`èС!!!DTZZÚán7@å9Š¢ D)ÈQ£h Jq@ŽÐ¥žØÀj¯o߾ǎó\³nÝ:÷ò¤I“vìØqíGS(ƒž;wîîÝ»7oÞÜfknnî–-[<×|öÙg×_2‘Õjõɵ~ýú;@{•••¾.¼9Š¢ D)ÈQ£h Jq@ŽÐ%4°ˆˆž{î¹ >|Øb±”””¼òÊ+:νuñâů½öÚ† Ífóþýû§OŸÞáq&L˜ðÉ'ŸTWW»\®úúúeË–M˜0¡Í>‹/^¾|ùš5k4F£Y½zõÅ‹o¬ì»îºkÑ¢Eõõõæí·ß.//¿±ã´7hÐ _—^€EQŠ¢ä(ÈQ4¥8 GèXDD>øàÂ… Ÿx≈ˆˆI“&©TªÕ«W»·fggïÚµkóæÍ±±±K—.}þùç;<Îk¯½¶}ûö!C†¨Õêñãdz,Û~tUß¾}÷ìÙóå—_¦§§0àܹsË—/W(7PöªU«„òúõëwáÂŒÀQù$îáÛo¿}ñÅÏž=ëëBn&q•™3g>|Øh4êtº/¿üò‰'žxî¹ç|]ÀÉËËóu àÈQ4¥h Jq@Žâ€EQŠr„.ù˸§5ë‹/¾X¶lY~~>˲999Ï>ûì¯ýk_pSº¯½ã/m£ÕÀ\B=XÐüü|_—^€EQŠ¢ä(ÈQ4¥8 GèX·Ã0<ð@‡›~õ«_1 Óf¥Á`ÈÉÉaY¶ýq …">>~âĉùË_ª««»¥hè©ÒÒÒ|]xr D)ˆR£8 GÑ@”‡Kh`ÝR'Nœ(//o³²¼¼¼ªªªýÎ~øaUUÕ_|Ñ~Ïó<Ï[,–‹/¾ñÆ---C‡ýüóÏ»£fè™ÂÃÃ}]xr D)ˆR£8 GÑ@”‡Kþ2uzO˜Äa˜ÿýßÿ­­­]±b…çú… >ü7¿ùç+Àq\¿~ýþùÏþå/9zôh›ã´­Îž=;eÊ”ï¾û.;;»û¾€«Á$î"ñä“OnÚ´I¯×»×èõú;w¶¿´ð«¯¾ÊÉÉ™6mšZ­>vìX—G2dÈsÏ=·lÙ2/W àkh`ÝR‘‘‘³fÍzÿý÷ÝkÖ®]ûàƒ*Š6{®\¹rÑ¢EDôôÓO_c[jÖ¬YôbµÐ“åååùºðä(ˆR4¥8 Gq@Ž¢(Å9B—üå½r !Ïó—.]š2eJii©\.w:YYYyyy)))ž¯Àùóç{ì±Ó§OÇqYYYû÷ïOOO÷øàùçŸïä°Û·o¿ãŽ;:?5FpòòòÆçë*àf!ÇÀÒÀ6­4|*c¤£ÙîѲÎ:+d2¢ D)ÈQ£h Jq@ŽÐ%÷Ô£F`Ñ{ï½7oÞ¼µk×Î;×s«ÓéÌÌÌLÑ_XV0r":z˜ÏʯÂO¥8 Gq@Ž¢(Å9B—¼ßÀš5kÖ®]»<×ìܹsäÈ‘^?‘h´bwþüù‡~8)))((())顇:wî\›§¸©ÕêÑ£G¯[·î– 7¢Vkúê»"zký‰ -Ÿå¼s`KV¬ƒˆJªôDT­iáxžˆj5&ß– >!³µ6°†°É‰ÒÖÌrFNDÞå³²ü€÷XO<ñÄÚµk7nܨÓét:ÝG}ôâ‹/.^¼Øë'«-[¶L™2eôèÑ?üðƒÙl>~üøØ±c§M›¶eËÏÝø•––þñ\ºtéÊ•+}U3\‹¾Èw¹8†!—‹#¢ÇÆ6J>3\ODÅUz"ªªkö¬Õzg©ÍÙºdùé ¨µåìð)=„÷XJ¥rëÖ­ß|óMß¾}SRRÞÿýÍ›7Oš„™;®Iqqñ3Ï<³ÿþ… ¦¦¦Êåò””” ìÛ·ï™gž)))iÿ”ØØØ{î¹gãÆï¼óέ/ÄÊsê>èßPËÚÇÚÇkê:ÙÍdqlÚ}‰aè¯ÏŒ#"µ’›=¼‰ˆƒõÁJ™¶Éb49ªê[X5^…‹Üæx³gKFD—JŠ|Sx~*Å9Šr D)Ⱥ$뎃&&&~òÉ'ÝqdÑ[¾|ùÓO?““Óf}NNÎÓO?½bÅŠU«VuøÄÁƒWUUuÐS¤¥¥ùº„€ÁåŸaÿ³—ˆÈf•NýåÕv;}Qc²:‡ ˆ{ô—¯Ìœ ∈{‚b]q•ÞÝÀªÓz§…KP‡#°HNDQñÑ>) ¼?•â€Å9Š¢ä]òþ,¸ûöí»ï¾û:Ü4{öì}ûö]퉧OŸNNN Ç ÷u ƒ¯«i]¨,ïd·sEZ": žˆ^z|äoF6¶n`¸>©aDTR¥¯ìt[µÝU´š·Ô\{mÈ1°(m¬°À{4°„9°äÁA¾© ¼ ?•â€Å9Š¢ä]ê–XpÃ*++333;Ü”™™YYYÙ~½N§;|øðóÏ?ÿÊ+¯ty|®ì _Z|³UzÓ»$#Ë×Uܾ¾µ£ÄÕTÇ‘¤ã? œ-ÒÑ~±D4°w´£ÞFDÄI)#^AD%Õúªz£°s‡s`qÍù¼M+‰Â£[-B<‘Êε.×T²‡Zÿb1Ì^«Or:Ô˜ z44°‰çý ÛÜ»pôèÑsçÎíò|i1{`·÷+»QRº‹ÐÀ‚€fµX›ôJeªæ›ùúZ&)Eز~{ÁŒI}¢Ã•ÂÃó—µD4(+–ˆÈf!)ODœ]* f³ÂmDT\ùÓ%„ß…µo«ïæ/ |ÃÉ;U¶XÚvïWÂò0"͘G&XУ¡å_ÒÒÒJJJ²³³Ûo*))ILLt?äy^øssó·ß~;þüýë_<òHçÇgz÷‘Ò]Þ­ùf0½ûøºèX^^Þ¸qã|]EàêkÞ¯Íí:¨W4ßÔÈW• ¬ïNT-^}ôïœÿÀà§î¬Ó[-ᡊŒäp"âë‰!ž#3Oj¢ÞJ#½¤Ñ·ØU OÔl´Yl®`å½Eó¬ˆxëu4°c±9ÌJï¹F2`±.îòÅP ©¤ègÙC|Ux~*Å9Šr D)Ⱥ„–™:uê_|Ñaë‹/¾?~|›• ÃDEE=ðÀ üúê«?üp›‘YmH2²0â ®þñ¸F|]Í©–à§CwK“Ñ ®ª\2z<ËñKÿï"2Yo­?ñŸU}R#ˆhPßáÔÖX%%b9j‘IÔÄ&Ê뤅¦ÉBD© j§‹+«1ÔiM™©ž§"ÎID¼µ³{¶ˆÃbT9äL³µ%ŸË·¹ËÕV6¥7¦5 üTŠrä(ˆR#t “¸û—E‹½ûî»mÖ¼ýöÛ?þøÕžxÿý÷‡„„lÙ²¥› €ÿÂÕÖ˜U¥zîÍ£6úq÷-{‹ŠÊ›‚×½>5.&øDAýg»/QŸ¬PÏ6sÆZ]!±$eTáDä²Öν°pÀÔuR\(µŸÇµñDÄ; ä²ÜÂ/n§Í@DÆ0I¥­«¢b˜ÐP" 5sN—@†–ÉÌÌ\½zõ”)SÞyçêêj§ÓYSS³jÕª &<ñÄíG`¹1 ³dÉ’%K–pw+ èáÊKë ¬”ˆ6ì¯8`Žä›td6mÙ[DDñ³ë·÷Þ4쯵}fZzϰöža-üÂÆÿ}¥iU³¾Œˆ¤Òàè°L"RØÍ9¿²g &¢T©%Ib!¢Í{ŠÖl>[Zm "ŽçyÖ¾õtäû‡b4-òëšëØv¬xë¯þî¶¿sZLDäPɘà"¢ ª¦5©­¼ ,£³gÏêt:_W ,¿3{öì}ûöXò·¶û"-Y}”8û;bßú&áb’·\k+//oÇý²}ñŸçºé5ð-§SØv‰ˆŠjXïý·–Åb1›ÍÁÁÁ*•J"iýëKYYYß¾}}[˜·pV3¹”rbCˆˆ‰Ž%"Rªh0ÄÇÅFù¶<𼻊rä(ˆ2pY­VaA¯×Ñ©S§n¿ýöΧu†ž ¬0oÞ¼¦¦¦iÓ¦}÷Ýw]?º_Ks¼tS¾%˜ˆ"ú8cosÈ+W.Hö†ÜFdNŒbö î-KÎ’§ߨã ÏJ42’’ËÅØ-DDŠP’ ‹Ñ§,eÙŽþÁÕwDX¤Ä§ä4%θÏ‘ò’jý_Ö#¢¢òf»KBDºÙu݈°AÏQ¹–q8Ù ¹´Ëýý–Á`¸té1 ó³ŸýL.—ó<ßÐÐæëên _UΕ‡–—«T2|(OÄDÅ×|–’ybIÞb$¼ý€¸ ¬ØØØ¨¨¨²²2‡Ãa4ÃÃÃ}]ø)\Bþô§?={Ý+Àí·Ó°ÞÖÜXhV2 žá$"ù'í­‘QHVèWãBkrGJ§ÍN›!üs"â5õDÄW•“Œ'"’©Y(Q)/^~j›~@¹]J<1uµR 3id*¹XŽˆ K›…³kZd¼CíÕ6èy"r±LIeë ‹r–÷Õ‚<Ï £3›Í.—K£Ñø´./h¾t‚ÝûUdQ%q*¥ä¶aÒ;Fñ©V¶nŸ«| ‘”Œ™@'Ìf 54»’’’Œ"Â|XÐ 4° ƒ8§Lºvõ¬î¢³¬™3¶ß”g;ó¹ù['ïj©•[9Il„ë¬éçÛÈH#UÔ‰H@D¤–„OabâH"á›tärq…gINDÄH•$f; azõ–³|ŠÆ%ì¦1Ïß9¦—û¤ùÅ­‰h[d¼³ƒª:ÔØØÜdjƒ}ª |íçç'ÿnËô§·Yí®ë|=|eY"’J¥ôã sá»T ¬Fk=]N Ú72Äž(ÉB¢8óQ¶ê+r™yŽ!¢KOÔñõã@ðî*ÈQ£h ÊÀ¥oÖчÛ/½±rËÚ/‹ ,èXÐÊÊJ_—àc»-GW>=c¿Ô~“†ml]¨•Qß$ûŒ&Ó/ „ü40*$ÞE ,’ɘ¨â8^ÛÀ]8ßzõ¶TÉÈBˆˆçÒ)Ó…[B¤ÆP©ÂÁY«ï™’–öð/úQa™YØAk "—•8'ñæ ¶n[·7•wøUœ-,á~ìx¼ùÑù¥ÿ÷}q¥žãù+Íߨڼ·Hßb¿á—ès¹\DEDÍÍÍôã§U»Ýè[9»ˆ¦Ú§L‰ËAD¼]KD’ÈÛ¤‰wÚu©Dϵ¸Ê6¹Ê6£‡èðî*ÈQ£h ÊÀRU|úüɃÚÚR"²˜ÍDT¥±¿÷oýå*›ÙÆY,‹ÅâëÁOa,èÀ Aƒ|]‚9x'Ùùnr×ȉH- 6lD”í ¢ju¬EÙ¢qÂLUA ŽHÍ»ŸÅÄ%ð: ûí×¼AÏôUòd#©’$r’礥éÂ"êÚ„P)Q˜ÉPµÿ3.&fõ_Æž/à‰¨¨¦µÓ¤1ñ¼³…QDqú lÍn"¢ä»¤¡éíKŒM#:-,Í."ÊL(©Ò7.^}Äî`Nö×wôÚ«ÖÜ ¬¦¦&³Ùìt:Ý}+FÓ}s%ðU\Ù÷CIF&5Ý˧°Û‰(]•ž2¹uMKDÒÄ\&4ƒ;ÿ Ù*UJ–Ó#"ï’e>|¸Z­ŽŠŠš9sæþýøÕD®°°°°°°±±Ñ‡5ü8«ƒ&Z#g ¢>òTƒYÆÅFÅÙhÆc”JúÅÛˆH¥±áfÆóB"IÿAÒ w ÿ1‘á^©m‘ÔÖÖ6sIDD.sÒÐiLXxj¯‘9ãJÆfåN­–…êŒqyžg·9©Å&}¯qýyÇeÞõãøê«4°t- ÑC“¢2Žˆýzx¿ôH":v¶VØá‡ü:mS` ÒX2™,22’ˆ„5QQQ*•Êáp444t׉m6"’dö•dö%"²{ÿ¢K‰ÝAD*…šˆ8}!¹Ìä²TÉÈÕD$ # q#ëû{iò/ˆèºfñ¿<.K€[‚çœ.ˆˆ,£Õj‰¨¾É‘–¨ž÷ÐÈŒIqíJ1 SZZzêÔ)\Km åïÞxã÷Þ{oÍš5 ‡–ÉdwÞy§¯‹ñËËËëz§îÁqœ0öÊ· ­+G»K¼ÓÄ™eŒ4]–¤·ÊÂCeÂÅ\l3ß"•ö·QZr(ÇpÁŒJêñˤ¤µÞ‘pÚ ’ñÕŽ¬ å-EEEEÆL–d¼ËDR©dôx&FŸ2àîgb1çû#ŽMšx{›´-²0§eõîXüUX§Ï¥Å+R’csÒ¸‰iØ€¸~éQDÄñ<I% Ëñ»òʼòŠuB«Õ í§›!Ü…P&“ÅÆÆJ¥Rá›$<<<==ˆ®\¹b³ÙnºÒðvIn.4Ìýлd+Éç\% —…2ÊXa«$4Œ4TS*—„e “¦çå&Úege£Ä»Ç„«ñá»+xrä(ˆ2€8Ì:þÇOȵµµDÔÐìŒ #¢ø0–ˆN^l8p B¡0¥¥s­Üh`ù»wß}wãÆ£F ÎÎÎÞºuëâÅ‹}]ˆß¸qã|uj›Í&\æÅÖ \_&´®líF`5qž(J% krHcÂ[gdlÿºþ· üÊô¦ÇìKDjëÛ`]v›JD …ÂÅI´®Tr™‰H2j„³x…óÜ_x›.AmVI?¿]}Ï ETx¢\‘Æ$ cY§ÿiVGsu‘4HÝ?MÅ0̤Á!ÏNi!¢ÔDu°²µæû¦ô%¢½G˯ýeY·­`úÓ_~º«ƒ¹í;¤ÕjOœ8QPP`ïtàR•«a¯õ˜û¿*Wé„»Êd²àààœœ‰DBDááá 111.—ëØ±c‡6¯õ×JèX)”¤PyKœÜÁ‘RÆ[눵³ ‡ˆˆ®$’‡D“$ZžˆHDDÄz¹†&Îð/Ó. ß-@hÇï®àEÈQ£h ÊbmѺ—Íf354;b#‰(;+‘ˆÊkMqqqÇgF§ÓùvRð7h`ù;½^Ÿ””ä¹fÉ’%>ªàVp£±X,^ù‹ã¸²²ëdd¿Ê$¢%áv‰Î!‹ “Ã¥b\’°ûF9ÆŒVÑO€ED<Ïž={¶Æíä¡!ÊÌÌL"ªwfð.3ñ¶Jás¼µ.ˆ‘GIÃ\Äê¸æøèÖK3ÕvF`±œ–m¾–9°ô &¢!YCµD$a˜¬^‘BÍÏ>KåèhEKÃÍM-N’)#¢•-<<Ü¢r‘… ³9tôß`QKKKUU•F£inn®°ô"¢ø¸˜ØØØ ™¹pƒ®†ˆ¸–ÒBÛílcœæz"J”ÆQ=Û˜Óz¨þ¡6"Ò¶ÈÂYVÇ6SWs`iš¬ýRUDÄJÃôvueyieeå/ÆD¦'(z%†¥%† ïp²ygjÚ?·Fcj¿²Ng&¢²škÊÅó²ÁÎ{‘ª+e3òLîÿTÅmŽ<Ï»\.†a¤ÒÖÁhqqq·Ýv›ð0((hĈÉÉÉDÔùP¯k¤×ëÝ7äæmV"b”JF¡¤ïx5ŽâmæÂçE×r.gQ8x"b Nh`É‚Éc–$DMD!VÎÉ9©‚ˆxïÀ2Ñq{á)ûEïz&½^_XX(Œ ÷d³™‰¨¤Övèû‹cFd?÷Nѩ˦„X5©Ã¢bBY›ƒ¯Óš‰HÆQSSSUUuêÔ)a¬6œNg—“H˜Íæî»ÛÜb2_]X½zõ½÷Þ»aÆ©S§fggO˜0¡W¯^7|4Îx…o)öby7‰Q÷‘„eùº è@~~¾¯nH,ü#$e]¬Tv®î4TÙ/NucG³Ûíååå,ËÚl6¥RyOätõXQ’pm]3%EK‰(J­L8lkÉîàJ²pa%ÖK$£0æ¿XÍÍMDÃq\SS“„á’$IbBBEu}}“=ÒÖ`j®Ó³‰ÈÚR§ JÆPI«KŒ !"¹”Ï F`ÉÃ\\#gà»%“rÁÊÖ?T\°åË*ˆ¨MÅË"‰hò¨Ô“…õÿ9^9íöô6ÏýãÊÚ;¦o¯HÏ•Âm K«¯©å9êªó–Ëj""{ït"R”–»lmÿÈ&|ú‘J¥ÂmÂlîn …‚¼ÑÀr:.\o},|*R*IèÇu:–‰³Q¤$¬™3 ß*]já̱.¢ †‚¼©œˆd}ž`+¶¸G`‘Lf’†8X§µE.é®X§¦Ý:®u†ø,yZoY²wOäÓwWð"ä(ÈQ4¥_1›Í.\Æà«Bcz÷Š÷Üj³Ù‰MF§®Áî²4¬R¥œ"Ô "*«5dDÛµ-²òCr\¨p¯§Ób0 ‡®P(Ìfsdddcccee¥Á`ˆÍÎξZ1<Ïççç«TªÊåòîþÚ¡»¡åïXPPpðàÁC‡íرcÑ¢E#FŒØ°aCBB o)¦öÒä» ,¿”––æõcrú&þüi"’dôaRÓ¯¶›p XtC&©—´‘#]sAdÞ¤!¿ôì\\»ââb¡÷a4•J%˲˜âJý_æ÷J ›÷«ÁíŸå"–%Ž:º aã#°4ÅEȈHFDÁ!*"Þ‡ilç(TÙf¬æ¦F"ŠShb3'œ;²MʸäÊ`"ŠOJ«¨®ob“\U_-­›ÅDD ÒhÇÕ¹t‰1ñDÂÆÊD¤5ÉÂYŽãœî¹:œÄ½ÅìÈHT‘šmn‘FòÄ„¨dÊàðÆÆÆ_ÿ¢o¿~ýˆhÒ¨´·ÖŸøÏñ*ž'ÏXÛd9tª:øãSkþç§»F¸XN×l%¢f£Mßb>jtBh`1 Ãó|'—òÄs6+ Åò,•–³¶¶wœñ¼~ðj¼ÕÀ***²Ûí?ýÁÐ} ¡Th`uv|o!¢A½ØÎ Úºd±)Oƒˆ­ù7oÓ‘$H¢Îdúþž‘ª„.W4ÿ_uÂÒ¸§IÏ…‡ya,Ïî·—’äNÕhúñ»:YWãÒl3ö¹;x<XÝ¡;Þ]áÖCŽâ€EQú“ÉtöìY÷¿òj]›–ÑÂQS‹«ÖTW[EDqá­Ã£b“²Ò£Ï/)«1ülh2åää¨T*©TzùòåšššK—.±,k·Û333KKK…Ok:Îår]íSbCCƒÕjµZ­'OžLHHP«Õ111ÝöÕC·C+Èd²ÜÜÜÜÜ\"²Ùl .|ê©§¶oß~‡bÔ}¤Éwy»ÀǨûøºèØOÃO¼„#®ü›RΕM¾Kzõ–0+¾¶"¶¡¦<+ÇFz*,,ÌÉɹޓêõzF#, †¸¸¸ââb¡qS\^§–5WVˆ:h`¹o>Ø~Vë%„’ˆKÚZ"ŠTˉHEDýÃ3+¨ØÂ…dR£U}úË3~úò9Î`la mÞÅ^8>@©±1ÑD …„„„+ÍjÖ5˜ØÖ ï¬6'ñlŠ4v~þ›„ò„˜ÞD4ãgQñ±ÉGC‹<”ãƒ9±Ð5°ªLýÓTD”h)åT™|$'Ò`’$7’Än1o©Ø;)!&¤Ng>wY3¤_œû¹_}WÂrüîÃeK›ônþ¦i²°?ž´´Ú0l@ñæJÎxYX)Qg1¡? ºN*•ªóéÌš¹…ÝEDr•ZÎsNblFÖÄY<'»5 ,“ÉÔÐÐ Pw_ÿ(ÜvQ(y‰“¨‹–™³Qš,áÈß*]²Ø IÄ[û IB{#a1,ÇK‰-¿ùÓnÖJqTW£ýá²c’‚ˆ»Ù¹á,¼m›ù€„˜;U£y¢fÎHDO©ï˳!¢2Wíeg…‹o;æ¼Âëï®àÈQ£h J_9wîœÕjpu6Ÿ·ÐÀRZÍ?ôg†Ô]´Û%—²‡iµZ³ÙÒÉÛ«©©!¢ˆˆ½^o4µZm}}}ß¾}†a-·g«k;®Ä=ðªƒXÂ%„Òð†F©CäD¤RÇQoUj¬Øá’÷aúË~vùÒåó|³\.W*•.—‹ãøP‰^Î8yk„(DþÓ‘ãâËÊÊt®dñãy‡pô IDATU¼M“¬¿ÌÛã4Ue½ø1}L£³ÓI.ÏÎЕ™žOpºˆˆ'†!ÞÉZÛ‰®Õ…V¸E+µ;ÔiÍ2ƒ]Ê–Ýa·¶ËÂV-ëûû{&e®ýüü†¯. yñ§Ö¶ÅDÄñüòO¾¿xª°²NkŽRË f–åø²j}ß^¡ÁAœ¾€­ùqòïäŸK=XÂß‚ƒƒ-K'#°ØÆ KYÄñ‰ç63‘|#ß›köl` O÷bËétr'å>l\\5r½,|ëß­\0[·Ÿ¯ÝMD¬vgüÁõU ×í÷IVÖä<ÏÄ;\Dd–2Däâ;¸õžQ¯SIšõ-AvkTe½‚2¤‰w*£ú‘ÓÅœûáÿ³÷Þqr]õÝÿçÜ6wúì´í}Weµê’­ê†lcLlI'„` 8`À  xžøJȃI0O~Ätc˽É*¶Õ{×jWÛë”Þo=Ïw¶HZUË2óþC¯Ù;wÎ=÷ž«¹g>çóý~Ýù|îãwÍcò½‘D±‘Þ‘ÄÑSãv«`6qvtôEíÁHvNùΕev†ÿäóÏŽ†3TIg“¨Úiù¡ ÈÏãÀ iQ—¢ znçhðÀ÷ŽT¨„³‘x<>YRÐø¼ €E‘eùbòt&“Éýû÷'Åõ=Ji__¯×k”†T'3^Q ÁBÀóIÊ/ÛÛrÛgžúÆÃÛ_ÚÚwv³F,cw06 zRO_ T#¹ÜÀDÙAbkˆdSù¥­}]1cÇ})Ë«»Â;ŒºB•$Ô”$UÒ¥j@(š»È‘“7¶ %ª'sûhm*UŒyä äÀ*Q¢D‰%Jœ‡ÉåÉɈcñØï¯Ø~hl,*൫«k÷îÝÛ¶m;vì˜.E)#P –Rê€r÷”œ4»Ö  k0qöá¼^ïìÙ³çÏŸ?kÖ¬êêêyóæ±,ëóù†I${öìÉårV«µ¡¡aöìÙ~¿R_khh0ö4lbLú^âbГ'µà´¾ÊÇ- Xè<üðÃË—/öÙg“Éd*•Ú²eË=÷ÜóùÏ~r‡ 6¼ñÆ‘HäŽ;î¸ï¾ûÎÓT‰ÏöíÛ¯TS™á®þ¿\ÞYÐXBW®@ÏmÆ1ž(&’#>¸¨nâÌH~€ ….©€n8ÖuÝårY­V‹Å¢ëº±&“Ëå$I2q»…Kff0ìLF*TÕ¡OnOéY´!ÊèÏý>œ’½N€‰:›E0”¯—5âdÇçšvµ˜Ö—›êêêjÝÔÏÑϸ3ιÄR5ù)‹ÅâõzU”5š‚nÕ#{¡Ig°2Ô§èE;Ò쳬h†½N÷ŒK¤Ÿi–ÑuÝÂf$ÂCPHªŽ­½Ë\w;@eO!©yÓñ@M¹}ÝŠzYÑ{¹XîÙÍ=î\Ûô·Ï¦¯l+Ö F²eîk<µ~Óo^ìèNüøñÃPÒ9™ùʳ³^¯ÍåO›X"ÓºŸAPšxcýÏ/4g$&+1™áøáÇ‹®½‹ !$„ðú¾9^ß;ll<ÔpÛªú›¯«°õÀˆ±=Éz<ËàSw–3„xâÕÎÑpfsOÅ-×רlæ@ä´ !Z Áõäsï k1N€§OÎ9±|úýå0¹´œ `Ò~1!„¸”(Ât: €R‡ù€¦¦&BˆQëPÓ4JéTwÀáœÀ‡on°Y„}ǃ݃ñémÊTQ¨ÊN ¼›uâ‚i°ä¨.P ¨Â“›ŸýYpVpÀ²¶òÿüê Z× `oºèòÛÕë(~€–‡–£”|k½eÇ¡QÒg{3™ª“}Ž'âU©2áp¸x @¥%ëmáJ}»–xg)ãµAi¯JCùV×âò»6äwõ«£—ôÁéË“ûöí;xð ¥Ôï÷ïïˆh¯Ì…ã2!Ð4͘å …|. šV-" ’Ò,Y8×hdÍš5Œ©¬Õ_Ð5?ë€3ÓÖÖ¶råÊ+V,^¼xzA¿ßodmŸÌxeLK¬+‚QBj0˜™LLvu( Xè¬ZµêÑGP%•JíܹóŸøÄô&ËZ,–‹ÿm_¢ÄÛMŸ:º!¿ë‡ÉßhÙ€¾FÛ«+¬Y£ŽÛ¹s`‚ÅxBy|’ ωœÔ¼¿º×ä2K’ÔÙ9ƒíål4MK¥R„£ÎˆÃá˜~ˆI @<9ƒ€5=õÕô×)=À¦ñt«ùc·ùˆ;¹ƒñx®¯¯Ÿ»dW}qÌ9 Àµ#‚}Æs·`ÁA\.— :…V~;[{W¥uö>›@N%„j©6%šà7ö¬ ¹d2 àõCÉê2)ÃŒMnÊS–Ï¥,m+'½Q#G{4‘Péµ®XP%ðìÑSã†O-Éš]C…é#·x®o/WTý—ÛL‚o±ÃÂ`ýÝ‘‘#‚/*ÅŽI-/¬Í(Êw>U¿f¾Ãì*ãòÀ¤çîbB1“€5 kb`X---­­­ ,hhh¨¨¨ðù| «xÐÓ¬£iÀê9e¸¥ÀïN7aeh€Xx'.äÀ¢Ê´2…’ &*Æ3_»§æýËÈŽ;\bަiíè2 r´3¥d"„0-·³× `Í¢ò/}¸º±ü¢ëSu65™ÏèÖ€¡¡¡îîni03'REä §+Q¢D‰%J¼«Q©¶·PÌ?P8«xÑù1¦v~¿õêÕk×®]µjUss3òGºÆ¬›“›ðæ{½^c~I©‚1¥~v1ïÕŸÝ:kz›„g•¬®4FaÉueЕ Ú¤êL$1†¯%«D‰3ðÖS 1J³ù†YŠkwH_œ€Õ=¦H„8p;5è#£‚ ¨ªz1OC皬¼k±X|>Ÿ!`¥R)Y–óí+ÈdfhMÂô©gyÒ°4v\<.^×éBË6AœÒ¤X–5Žb@Zt`¥s XœN§Õj5®cccCCC±HôãÞϨ&·DÍ<ª ­Á2–,jF„³(„S#Ó›*zÙâ²ß!3.?šš°&üDò Pí-^Ç»#”"š,SpÃÒ[ŒF²n êqòiuå&ÂÍ“;§'Z+¢ª*¥T§Øvʪk2¦%JH§Ó”ÒB¡pèÀ!Aã©Ü/^ o<¬ÆÒ„R8ìS=4n‰Ë! ýýý”Ò'Ntvv‡›ì€Éjgc螪ªNw` R1‰xyµÊ†öï¬ú²X²°ýÐh*#ë”ÈÒ<€ƒ¿áR¹ž«0 ÎÓ[*§¤ œî™þVÑzÆšÛÛÛ !«š ûŸ¨û›uîxžë Å|ùš”ÊÓ×zçJ÷_­sέ3¿g±M×gž(¥“ë1MÀÊKy)MùÙo:8EQFFFò£é…†Öcžáááóô¿ÄåQJÔrmPÇkƒÒ8^3”†ò²9"ŸÊNÔ:»úöù1¦vFÔÇqÆ‹ž¡D:+W{˜F¯IÊL¢hµZ ++c¹§ö(†®klpûöí`ÄY†ë¢CÏNéP 5J£$`]Q4]Sš×WÓ„U°J”(1o=•€ ÀB¡•Íæ˜leÒŒ €ž£ !¥ÔøÝ>:.ˆ„Y°›ÎPÇ, ¦åE:F;“!dΜ9¢(2 c£ …åt^—fèÌé!„Sb–QT΢±§X7ÒY…%øsê ÅŒWJ“!„ç° Œ|(êíí=vìXÏž“#új‰Z”3 ²Rç7å´‰R¤¬Y#<@bjD¦JŽ(Š¢ªj® ›9‰c›¢²Œ|€hq0 G4…òr6`~«À±žH*+©ªn· ÏX[°F(E"•·Š,C´;›Žµ[v®Y³fq{“¯°uÿ±Q•²Tœ&`Çå{ÕpxÃ4VOO¦i&·…0„êºÊæûJÿ뇒¼m~K­3=mDŒ¡¼¤ÂD"qäÈ#ÚÔétêºnÔ%œ ²6â Ï%`©ªNÈ„€UÈ€(b"5Ø"[’à®››<þj×GþñÅ}ý•ñX.£ç»M]›µ×v Ts>žpª4^{U l¢Rôìšf_F@„+PÔ£§ÆO Æ5U6îŸÏçt: ÁÝk<­.áæåžÆ Ó®¾ÉžÓh–_ÜVõ7yVàsñƒgÖëþøš¿~\V´Rá$˜÷+Ôde,ËF£Ñ«fÂ* XïnΨ1ÅãK”¸:,žð4› ÚÜ’l8§K’$MÓtMÉ4£a, €×‰ƒ±¥õcá0-/Ò V Ó,ÇB&Ÿ=£…LNP(Ìð ;=‰ûÔ³Ü!4éÌë *D8§&5åÀÒ¨9œå\;Oâñxêêêêêêjkk‡ªª£ .­{˜-fÓh@y…ߨ9% '³7tIËrì¸ÜÓ£ aBã Æå*§€š¬Äá„ Ëâð ¬ZæöŠœ Æ4V$‘Ÿ[o¹m¹{xx8T¹Iµß2Jï::æ°0L$jŽc¨Ó¬ÍñF×ÿƒÜÞZ€å¦œSÆœÆÊdVÅÄè …D"Á°Ìc•¯wVC4ëáS@}¥Ãé°te¦¨Z˜<—K !L¥R±XŒeÙæææÅ‹ûý~¿ßiÖùX/líÛq8`”JÄ$8lXÖ\QÀº©ÀËÛúŽ÷D¶¹ýïÖÿ~ýÀ±ÿ¶ÿõmþßìcÀÔqïg™‘—µáçµÀæޤ¤HyÇÁ `ËÞ¡÷ßÿÌûï†Ài·(++póââm6§ÎÜžš)†R€Þ‘L]…í…])ÃÃ{÷î˜Üç·/XÚÂe³SÊïd÷‚$‡5}±²²²ººº²ZÏκ®hYVÓ´S§®vq™%J”(Q¢ÄÕ!®§NÊý<áÖš—àÒXÆdozÞt‡N†,¬IðÙÔlA‹¥”‚¤¾¶{ÌØAÓhZ+°|dÕ¢ª3eEŸ]u˜iÃ*2aEõ^@ÿèÐDÅš9ÃÁ4JyܯÙl6¯Ûx"—q!‘×p/éÛ"`‘³x;ŽR¢D‰··.¢+P”Âbur1&ç!4~'"Åßù‘ ›“eTSMD ƒsX”Ò¾¾>MÓz{{÷îÝ«ªª gXš1!`BzF F!ÕgX‘§‡âÌBA#ªÕ À-&Àð“•ãf¤hÂÊ8_°á¹©ªª2R2 ‚@¬¶šÌx(&ÛÌlD«IinPì=Ëäd’gaÁÖÃ9rľPL©t)P1&Fm2ýàmë&m릡p€{€L"H³ƒ§Xå³eòÊ!—P^^^QQár¹´7Y:z£n;ÀDsŠÊ€œ0 =În·“Ê3F 1ž›º±UʰóU²evñ¿ž R±Úï÷ëºÞÝÝÏçŸßthå<;Q`FCÅ4X“w¸")b)…è” S9Âè•цi•K\®Úe‰·•Ò8^”Æñš¡4”—G4;ð§ ›M„ÇåX €ÏþëÑ «T^R»KÚ*ó ŒÏ®xô™ãc©P\6‚…Æ"²½F`$¾˜N2™kÐà-.­½µó€¡)+…R¬+D8àáÆ¨H ¸Š—ôír`ÑÓy›ŽrÍsôèÑ{î¹§ªªJ„ªªª~ô£GŽy§;Uâ‚¡¡3Óè\* UXr2bµ9€8“@ÏBh(S=€ÀRJI8š*€ Y€säÀ ‡ÃÙlÖd2™ÍfÃxr¶ý –`2dÝp`3X†‹€`š›ZƒžÖs Q ØE5¶$¹&Ex'=;Œ‰¢„— ÇqåååDQ$¾ R׸gxãþ„ë°fö|ÿg§~ü|ôŸ~6ì>u¤¡ç¥J, ‚1Åɨx yÓgÉÐÒ6<¯mx~ cóˆ´–Õ(MƒÇ^ƒ–ŸÛä°óÈ˜ËÆ¨·Í©w.^¼˜ã³À”»y¿‹`Ò ŠÎ rÑ•f{kˆ ù\1~RÀâYšÊªÒét___.—áäh€’#I9›ˆ±Ê,kÒUéÞïwç×C#ã’¬ê<1ÛÈIú©ÁøôÂg^mBŒ…µ³™œ¯ÄãqLÄåÍH0’›°¨Txb¼¬#J_Ù>àî¥.9½{÷nÛ¶mN¥ôïܴl^CÈÝ7·|æG®uóE+æÙ_ÜÑgaÇuŠf¦üzhÛ¤=  °²,+*ÓŽP,Y0V|¼Î)‹bô6hxMÁ-Îï'C©¤ˆ§5#[ÿɾ€Áìþw¾ôϤc h‚;×µ*q¼õo×”ÆñÚ 4Ž× ¥¡¼#„œ,h:ÐÑw9³ CÀÊår‰Dp`Cóy…€$¨:M¤%»U0ÙLìÀŠ+ššš  kšfJ01îísm?ßéýùær/æ·üË„GŸÛßµ!¿«O5´¿G¬ Q)¾ôëSϽÞcØ¿¾£úÎU~(ÚT¾!`퉜MPîùâã[ày>[jÖí1á¢z~ûx\ö~ù‘½½ìÞ{½€,/ûd,Aåun£Àɾèû†Çcyk…frÒÝÇc„\.7™*nH œTúÏžq–(Q¢D‰%Þu órüËw2OrÚà%<ߥ¾SŒ9ÞÁαñhw@›7@?Ðë·©®o%7ÍÊ´U¾ó›‘·{DZÔÇúß~4R×9>C»¬ u®,€±ó9°ö /:z‹3Cc `ï±àänCÁÓr`¹Ý:cXJå>‰ݯ<®…¶]ÌÎF>/7J@Z”aY–¯Îõ¼@E§Ë¦¢¢"z½Þ[n¹åŸÿùŸçÌ™ó6èZ塇úÜç>×ÞÞ~ÆööööÏ}îs?úÑ~øáw¤c%þÊ}K³ŸÍpŸÚ·ÏBË]×4MRh£»PåPl9œú„‡¼<Òá@çXnn¡Š q¬£—Z(I‘ü€©~ýðdz¬†ñ1½#ÁLì?–P&æXDvÓÁ4szª¾€/ZN„ Ý¡ì–DÀ¨9/Ô”¸9ª~˜%²¬0Vm4iî=4óQ ´ÁÍÜ`¼Ž…êSáóí|ñ¼…ç¯ÚX-Ü^þ¯«´Ž›g§·tÚß8e³ ºÓÜ÷fv:“/Èz¹¦‚Et°^¨‡üþ×Z“¡u€YÖûÔ±—Œ‹ºÙ©qBÑl2_ Àee@—ä“£ûe ph¬”B(ä$¡pT Iæ ÙBpå r® fœóÈôÆ2ywŸ¼ñÍcëî¾×Súèp1tt4>5àXÓ–Cq*B0§[&.ï@°ø‘ »ƒ.wå¥^1"3zƒDSÁ˜vžTÆ‚RŒæê}V#ãùòhfDr2 UΖ:—ŽÑ5!Ýv*Ïi.BØD"a(b=½ýU¬@y`(TUÿÞeÖß¿í(;óGòé¶{[– F^PF¥:sžñI–©)h9óÓûGE÷ÕO®Ê$‚w¯rTƒiË´[K6‰9^ gsÕpx|$×Y4 FàM§•¶|<ž '@Õt’¬­ß2€,[eÆ3|+U‘6ì 3 öËó²µvÉÌR’+èT Ñœ À±îè~{ @í-ù|ˆÜlЦá¶Ñ­»ŽªP°=î¡Ãå]k"wU.u.Hc¥ÐXqfÞº%J”(Q¢Ä™œŸÍ`o@¥S $ùŸ-»#“ÜŒÌŤ¯f5¹6šA3ŒŒ:›¦ !»†´×$h)ÞW­øüÍam•ÅU4·M››•ðx‰%³Õ¼P·iÖVmMbhóÞDŽ9-…v­3¹°‰T@½¨´ø$§?n~hv¤wXÃr‹/š|bTgˆfMGz§:iñX0 A5 ÀçäÇS\‹dU!Èåõ2¯̦O–lï±Q¡”ðÒžt À®l†Ó=ÝÁ²tEÖÏL!FS #°;:T³YÌæ G»ÆCjÖJ©Amp³éhoö¦…¢¦ uÜ]™X¼+™:0|eîäéܶÌÖX!¼[¾'/»…'žxâ½ï}ï»ý,J-ÿ¾ÛÏ¢ÔÂ/~ñ‹¿ù›¿y·ŸE©c;€wûYœ§…+29?›èˆ‡ÿrô‘­õ›“¾ÓËîTþ‚l’†"›`t©Ò©’x|SÀb1…S CæVfP@R¶ú„ì­sS+êBšË‹³”ÆJÙ•ÑE~iÏ 'µp¾à±fËå•§·FM¦ÔPx\Óô2—3ÉÄ’Ùg¶ÅDYŽcmVK"™þí†aŸ×“H¦Øí¶l6—ÊJÏ툅q*lò²j„bòþcWþªþáó¡ú—–xŽˆ.xvðNcKõ¬˜Ï5éÄ.ˆßš½®F.¨¬‰©:Ç1*§eÇӬϊ½‰XÆ,ìü?o¾ùÄÛ×yr2¬?òÈ#Ï=÷Ü«¯¾z¾~«Ñ“wf³9ÏX$+ŸÏ{½ÞË«k¾ëÈØî£·Ü»+ÆŠ•+V½Ó½(q&¯îKo±¥îWVÙõþ®6M§±¾7ß·@M cüá¸ü§5/àúeߟÿàÑ]gœÑßß{ˬÆò®þP­Øgä†@ ¬"j<€#½Ù½áñÖµw-?øåÁd:¿¨­¦æG5M{óo«ç7š>û Ê_Ï€pÜ!‰ÏêüBzzFϲz€Æ8ÎuyÏE@îÊ·-µÝ¾ü2óÄ•(Q¢D‰×0Wdr~‰Tîë?xÎmÕþíÛ ùÜŠ¯üë’Jþê<Öºð‚Ÿ-ìÜør@ú«;*ÒñàKÛG^9îüÀ­ ý^ûÿn{S¥ùµÏíC©“U–…cƒŠ©Ù'ɰ§iù{22óÁ›RßË3:}u…)ÿ*¡g&5ZM² rë#«úGS_ùô­MuÞ³;ðü¦£¯¼yâÖ5szÇû†£Ü{ ztKS­§¾ÚóúîSw­[pÇóu ÿ÷ï¶ÏŸ]5ËÇSß¼ÿŽêrVK™¤S:ë(˜f]‘‹ùîbùŸ2ô)°½I¿FA,’~˜He-"é°óüŸ5É}¬cÇJþ—ºÄ3&…*d«þ)NÈB='ók7ý€¸Ê„ü—·IÞy»B§óÁ~ð+_ùÊU8Ð3ºÕ.†ÝGýúÀ•íÌ[áï?¶´$`ý¢S˜SkzÏ’ÒH]$ÿ€#ôß´ŠcÁ ]MU–tNKf”¿háF|æÃ0mmm Ã8|XŽÇŠfø‰ªQ~NEöùû{ïûòÝqÛž#M PWÉÜÙbìýýŠÛíž\Ô:¹‚*É*€¶ZfÕ¢âoãc'À)êYx¡µB_»Ì®Ç¸¶ N;êvFZ5× ‚'T]6:f;u]yuå蘻½}Ë¢(uÍsýÍ-ïÜC¯ø¾¸ÐÍZ»ÒVUØxÒ‘égÍuÑÇM‡Æ¢ÓqçõvÀÔ ea;}”«W ¿Íââ[w÷æ ÔzS›ÖXípÙ§UpùjõñÑël¹ýÈG,PËŸ„ ( ’¨.R`ÈêFïI‡ `ëÑ´ÙÄ޳ΪÈKª¡Z¦$vÝ–˜ížÉ†&Oc¼PJjlòŠ…nRop|Ëißo³êµ•³í™¼¢¨šÕÌs,“ÌHË[Y¿ûÒ$]·nÝJAX¸pጠþ 6íŽÈË:‹ äÉ_Ýê»y±‹Ë4vpÆ£Õ[f)kxì„ÚBµ¥/ÆÆ>¥DІFý€¨6”¦mö-FÊÚÊô1±BÓûdç3/­g¯¶Ý¹³pd$ñ£Ó´`ñšND·hÑÂÑÑѱ±±-ΊŠ)5'¡cK œ¨J 5ñ$%[99ž³À U£D’¾ÙñäP{Æ}t]e…×:§J{áÕN¯“ KÏìÈ]ÿµÄHoþÏÐ –RW Ëphé²÷߸ìî{¾öÒmž9Q Ú‚Ùîîá,kV,áyÀWÃë×t϶Ébµ?4kÖi·d``@kCCccù%ÎÆ™þ \ZÅ*Q¢D‰%fäŠLÎÏàõ­]šË ³æÍoàË~6[9rÜ” u‹¾ò ŸuÕ¹£i:]ô`äý7øÌö§Fkò¯w>»ñˆñîõ³XHÂå±ë*š}ÑQa¶6,®?utØÒP«0€ ÐµË+1ŸÑ¾rÂB³XÐdíMõôöszÀ]7·Tûm~òøá¶fO$pÏí ›v“¾á¨SÈ?WÌ÷¯]RýúîSÉDìÎëí£Ã*€%Õレ'>ýÖëíÒiìß§…¾gÙãÊ™r$A%ðÈÜ1/Fl ý÷zêW†#÷}\7YŠ¿°Œ*“Ó |«ªºsgR'äº9ô‚‘4˜@ÚZi팴V¢ÑD•M€õŠÝ¥gs5¬’µê2¨««ëíí7oÞÙoõööVV^rþƒ *ÿþcKßZ×®$+\扔x[1þË^®L ©Œ\H:pÀ^ÿ¯ï÷VyLݰ'üÚ죟ò\ÎB4  ³³³­­ yÙ{Gs€©‚ÈYÅÂxÚlÑ}ÿòáÀm?mMD$ÊDæéÆÆÆ‹ìI41‘,|" @2-pX4†*€Ð?8²p–ÛÒI•TnåЬf[¹w¸‰¯ÛÌk¬®‰:Éh‹Gæ†l>ø§ÔvóuX ¸z0¨™ö*@r€Ï´§ŸÕ¢ g$³7‰Ø‚¼¦W\½+JñBúæ›l½ YS±@cµÓeËp9­ÄR€æGØíöx<Þà¬Tû!ªÎ5 Í2,cimËÿmV;_?D–¶˜n\Ùþ³§@—N' ¥ò ´âô$8ÌZ*Ïõ jí2ÄâôÅi=m!.”̈%òÜNÑítÓ—*`1 ãv»gÏž=ý1|6ÁH€BH©⬷,q1}Ikþ„§où¶˜SÒúGTö$Wÿg`xš¢¹ÑLY#ÎDX]µ­V_×Éá4ݹÊÀ°JP\6oÞQ¹9Ô T% @, šiÝš•𛛣Ñè\HTÑ(Q-Ä•r›ÃCWÊLg:s-"Wî±(÷XFÆ¥Æ*ñG¿‹¥Uûí͇ø+̪ciun¹€JÑúFÇ3?ºÛã2¿œà@åÚ*Ûî#ÁÁ¸õ&¾Maò;ê»nï^ ›šš ¾Ád¢wcºS¢D‰%J”¸R\ä伫«‹b6›½^¯Q¾æ<œì<À^§Y €òÅŽãñÍéÎж *Ï#` Œ&[l·.w‚26òËâ cÿÕn_6¯üåsï]z\LýÄZóóo°· LŠžÓ VöÌ~V¤@}¹à™-=ÆÆ¾‘ä¾t#€õ›»¿ÿó½ !,C–Ï« gtôE «­Ù³¼½À!UÓ·PgÖì<àùLJ¶~zpþg?²È˜ÀLN]þ¸ •‹½õÄ ÖÖ I©Æ¦f·“÷¹*wï;´ví †½`ddÄétNŸ9kšVVVfâ©BIOPhµÀBd…BÁø­FÞíÖ“O>¹zõê ïWb·ÝvÛúõëg°Ö¯_¿víÚËkv媒ã©ÄÑu €a.SÁêJ¤²rß4«UXÆf__Áp @lX”‡%¥ìø¦“ïýÛ;DyOOO(²Ûí>ŸOQžcûB@¹ 2¬‰küˆ"EÊýƒbQ ½äÇÌx·S De'ŸÉd‡ªªcccÇy½SSåP( ¼¼z¼#(þt§÷á¦ap0AP(¬o£¯í̈ӷÎ{Þóž§žz* *ŠÒßßÿï|çÁüîw¿{ÅtmóÀüøÇ?>~üøÛ?þïÿþïŸøÄ'Œ? !?ýéOÌfóÊ•+ÏÞ¿D‰ËÀøyyúÕ‰ÞèW~øf÷PìC7z>vCÅÜÕ ÇTù}kæ»ÚÅ7ÌÊx="Ö;¬•••F}Ò‘‘‘T*ÀjæBi@¯°¼ ϵ~ʤvQ“ÈFÁ%gt`Çò'ûbǺ#’¬%Ó2§E[îÜý³—B=£“h‘\ú¶†N®BìŸÏ rßXþ[í9™–ä a„ò)¢RmýÖh…E@þÀ,èr¹Cu[Õ\–95Ȱ‹:Î^áy°,TÕ.^™L6æ´YŒgMõb·ËÆ0Ù}Œ¥ ÍêóùÊËˉš ŒFÁ;Œ§Yb!"®[¶xýåMK„J"-p™5G™!HK¬®ýA£á €ùUùÉN5˜e2áÀrØŠ– ’̈' ¢Å5è>Æ©.kWl¨ R%­¾ª'OêÉ=Õ•WfI‡a }ª,&M+J2 ›ï°K²&€Ç„K¢²Ù°z™ó”båõzϰêkëyÂé &Ñ@gDäSÏ‚³ÞnnûŒÍ"¸¡µXA¦¡z*Ìv$ŠS#ÅòØ™pðT&“cIÅã*Å&wæ  ªÂ ``´XÄZ¢ÅúGŸ 8-£âä,°P¸„"ÜÅ‘ùã°êêêÞé.”¸”ÆñÚ 4Ž× ×üPžkr>88¸k×®îîîT*ÕßßÀ˜?œGš¡¹-°IíùÅñQ®ÄG£]]]sÍÎê*8J)~ú« TIÍØBOϨY`TU©áûÐ B+pÙ‡M R”Êqè,2 ë4«œ˜Üà,˜ ÍʤèyZœ3ÐTRÛº©)0H#a0"€E Ü×?yÝ×?yÝ7>½âî[ZTUÿñㇷ°p¶¯¹Öuý‚Jsš<„ {0Þ='sš<®k¯ðâ›}¾ówóª\Êu ¹ç>ÛwïŸÎ£ÿñÛƒÌ,*E[Xͦc£c¡¤¦ÑŸ>ìÈ0~— ÷ªªšILåýˆÇã‰D‚eY¿ßªlì°oìsD’“.Áp`eÓx›XW^ÀúÆ7¾ñØcµ··[,–µk×vvvnß¾}É’%Wü@×6ÍÍÍ?ùÉOn½õÖÿüÏÿQettôᇾá†>ùÉONw`mذá7ÞˆD"wÜqÇ}÷Ý÷ö¹Ä5Ã[ !üųÇt„6íêYØlU) yW,Þ‰§ œfç¨Í¤=ø«á¾¨½ÏÝÿKáåõ!¿ÝûZýÑÿz6 jô'Ïÿò©qkÒÎÆrãyI¯0+À]¸DËU‚LIióªò¶öØ” 0ÓˆhÀÆâÆ_l>¯TTº­ªJù–æºJ7`²úÀY‰à‚&ÑB¨Îh( ƒ¥TŠÊHše,Dä'ŒEåååÂIj\d—EcE¿U$:E&]4Ááœs*¦dŽ:QPô'»E#’·šÃ„÷jÊåµbBfÏŒ_NE‹Ž¾€ƒ'ÃúéAîÁhÀì·¤èÆÿ€MûâMÕî€0_1Õ>ÁÜâhy¥ûg@µhlW™¤A4B€ÙM¾Ã½ÙhJà°²oì{÷Ïïûìîî§­’!`A1XDà8ç³ú;NCü²ÚEìÿcï=ã$;Ëkßÿ»SåÐÕ9NOONM4’F£€‚x$‚ÁÆ Ž#0Ì國9Û‡`ðÁöõχŸåÈŒ¡Q@9Œ&I“cwOçîêêʵÓ{?ìªêêžž‘F&ŒFµ>uWíÚµk¿ÝµŸ½žµÖ£>úTw²‚~]èQmé£! W.Éj @og´º‡æ† °¨cö îœIfìhc „4§½ä2* ¬öN?Ð?R®_K•ÀlÜÒ4-N{Î_ÿ%Våx^x%á}u\ø¨¯ãÅú:^4¸è—òlÅy:.•J§OŸ~á…²Ù¬ßïïêê,ë¬5³;½Ï¼÷¹cÎÑqÿ²>ãw­K;><<ÜÙûØ;zºšÅ¿þÁIM•÷=›îüKnj¾ê¤3[N|ø·6¨Šø÷Ÿþ·~ãæ?¾ë­¿¿} è=íQÓrJ¦ÓÓ tàO?xÕ×>yýu—u¿ó–¿~eEGfg?°uÔo(úHÇ»ÊÚ¶\34GÔµŠüDQÛ|Ð2욯ÂB8Yöx9™ÌäL`d"72‘<^캵:ðÈóƒC'͇ÿyÏHÖ–ÉØS3NØç !w ïx©Ü|8:2´B ªç}‚~1Êì<šuEà… Ð¨:,Ô©j¼5Ý]ZnÙÚ«…E½+àÓÃçĬ œ¼®´@¢Ù¸zy·ó ¬–6E̪SÓy °ÿÉz:R€t:HY&°V´Í*°ºƒ²ú¯ð8mÝL{VhŒ— ,Ïè72‘Æ“yç<½gRrèÄÉ™ž½ŠÓcY`eo"Wt€¢éî}iJÓ”Q{ Xd)€*˜XS¦/…[.ÍfN¶€’ê2MÍôÝ7.„Tו¶ãžÈýnð¥GLÊB0|*Ð9k´¼/+Á€ï¹bSÉõ‘pP]ôvé>ýWüÙ7_Þ›o‹[ÀâÖ¯Y|ÍÆ®?þ½Í­a@(ï›If¬†DXè¤#­²ØÊS`µ¶ú…``$ãÑ|Ŋο$L/ŠÑköz¨XŽãœ£n^Þâ×3먣Ž:ê¨cA,XœK)3™ ÐÕÕåÍZY´h‘—Hp.Vi ø¿ÏõéšøÃ·´ê®‹Åúúúl¿Ûðýéû—ê7~ö÷º®\{h¿áœüVµ¹åÁ{,eú€°…ˆtLë ÜÌq\Óͬ´ÐFñ¤ÛBFÐzß¹«÷Z™*_ï KÜRÆÍ½°÷»î}R€}hŸP}nEœUšì žxç]–íî>4lÛÔði½•žÜê¾F¿O[³¤ñ7—i‡P@ëËîþ­_úãk¥cV>QøÙÛ7LJÉv¼8O„500pìØ±×CxwYåkTÖN;mɬ´ùƒ'“¿~iîäH H§Óããã%[EÛpÛ²¬£GJ){zz¼>'óßÞw¤PÌœaRJ³ç5§Àªãçˆ5kÖÜ}÷ݧOŸ¶m[Jy×]wÝsÏ=žõ´Š¶¶6ï‡`0X(ÚMuœ¼›Uåü¬oß(ä¿{sóUk#Ž+§ã€ ²8<½qe¸ç…&™=aŸº§­­Í»~,_¾|bbh 9€¡—#º…¦µaáqisÞÖäT¹oph ,9~:•L— M6†`ËØwdbbÄ §Íi[šj–¶Ú}KZâ'ß#–YˆÚ£c% Í°QµÿRÊýÏʬlcO°´¨ d`Õ´)ÑØ „ roéH0ìîî–‰Ð×ËnDØ9ÀK¼€âH+ºDm¿q¢åÒCA# ø44ÀÂÖt½!èØ.ÇOžÂagXäcA ˜ÉæT¦X2HÀ鈕9EÐåàbÑòáõ¶i@j¦ø7ßÚL† ÛƒYV°w¢&¡ÿ•``$-”ßý…³ß¨#“¹§S¡€¾ym[¾è?}>ÕÀ¨3´Xå.±¡<ñÉhÄš‚½Õm°+Q—±†+û?®Ðu]ÀÿþØÕ/|ûw>þK€g¾åf VIš’Ì»J(¨ñØËÄÒû„„ý@_‡ÿÏß»hËêг·Í¯Yüû·ol‰+½aìÓïÙP›ÀúžÛ×þë_¾ñö–^½©hÝTJ–ŒøÝÂ×å¦à1’ºŸæ† i9#ã9 Ti¤–°zzzTUœœôJg*% ÷ï|þ"¬×•«Ž:ꨣŽ:Î çÙlÖqœ`0¸lÙ²«®ºjõêÕíííÞ…ø¤ƒÓ_¤å¡}üÎÍ-͆_ʺl²«ÿh"w¢¤šºËLAíi ¾÷M­§òÝÒÊÈì‰Ú—OM%5Ã4*Ñ8@2#Bݸ–›>&ÓGÂŒžG¼Â!g„(>û@áéagbÚMdzeÑ“Ït÷˜GþÏÔ¿tßÿ$ðýmáœ_ˆ‰‰ñÂ$€S&°Ü©ìcßüäMC^ŽÄ¢Žhoœøò_{èÞ÷Üÿ·}ø]:w%@;ÔöÕö¯XŽ j ¬|>ßßß_,½¡Û7d)ùâPàï°ï~ÔÙŸ¿xêÅd&ïl¿"씲¶#ó…©S§!ˆìôðàà mÛ‰DbÉ’%^"ÇOž.×ÏÃ)ýg‡Ã”òsjz`ø5•UÇ/wÜqÇ»ßýî[n¹%•Jýª¥Ž‹¯.Ë´l3;ò¥;ݸ)®(â'ÏO7G ¡0®å)°žù'Ü&Ý>6®O“5þŒ’?ÙÞÞÞÒÒ’H$F'2@CÈ|zE%¤jmÒ I%T:o³ØäTÙýdWÒˆvî•’ö¨)„:ŠŸ66•:V¾Ò[)õ’™> µAûðÍw^?·bQ*ÊSöÐŒ›]¼xq0 ½|ið:`Ò+ œ”)Í¥êP»·Ÿh»ô„ÏŠ€^“MÞÀ¡c€’Y7 ëÀL¦@E<Õ±ýº .гüáÙ”Ðx¤L­Œ~)÷Åo>ßcÇXæ–ÂÃÕxYZÀÈäùýa81E¥YK`=ü쀔\³±³%ü_wŸþ³»ïnz}¯¶£ð¬g!Œ›å&á5è^ÄrØÑØ,‹T×Yj&áTNo8"TUäsº¦o¼º§9üíí+–Û…ßøÎž’´ü¦œ²ÔHPtý\¦Ô'žxÂS`I †&tMx ñµášå·ö5Ý~iêÛ[ºÛ( ®ØÔ‚`Õ­e2®1d©ZXø©‰ÁÒPdzz.ªË”¦až|Ò+q¨”€¡Pˆó'°^W ¬'žx¥©mu\Ȩ¯ãÅú:^4¸è—rÁâÜË*ŠF£€¢(­­­B¯œ8‡ëÑ#ÑAkÕnk½n}TJwýóÏÈîu¸wÝ#/öxÆéëׯGâÀL)d»¸É=µ/?x*ÝÓ¿¦‰X3)%¶ p'ž–¥)Ô€“h µ3…õ’òí¸ø~îáïç~¾´ʉeˈϒûÌ#¥Ôh<ã£ÿ•o8ÕGT,„Òœ"zúÏîÜ lÛÔ5ïEBƹúîN ¡µ{»Ú½}éÊK€ãÃv-uøða×u¡¡¡³îçb,M=r8ò?žlæ„¢>¾/ýïO !×­êzÿ¶±ñRæóyUÒÓ@jjÄ;-µSà|Ñ.ë•À·žoÀÌ{à K¦E]UG->ó™ÏìÙ³'ÿª¤Ž‹žRXœç×ÃÎ݇Ö/ñ¾`ü3ÿÐÿ£ƒã ¥rˆ¸}ò[¸¦ãoÊ«ŠcÈ·6¥€ÿþݶ¾²¼Ô_WWײe˨Èjâ ðë;•ª¶ê0:£·2çûYª!îUì:8´Ç-/:Jqr}Ýqà讲Àxb:?:žZáK¬n/GŽç3‘R*¥-Š}%¸3‡ÀŠœå­å†U§ç¸<»KéîEQ¦®Lº3Š¢¬\¹RáóWN¾âƒò…_Ú5–#=®*'‹@Pøj‡ëµÄ5àÈ`P¢2+ Ѥs%*X͈ 'nŠè,ãóû}þ¥=¿s O1lچƲ@cÐn6F¨$UUÓ¯Î/Ëu|ïàêK;˜K`=øL?ð†-‹âAÍ´ÜcCÅ|Ñ5—|7·cÀüælš©*C8ÏŠZŸÒ¸ î$•.„ˆ5 ¥¡*½PŸ¢-{kxü…¡’4ý%9a±FͱuëVOe Ë•J0ŒM{oG(蟷±'È’Å…£6®oŒõZ‹VŠ Ð¶55*| j ,¡¶´½&ç©ájBܽ0,Oÿ›ËyÎPé8ŽÂã@Ï7ÇýuE`mݺõW}uüP_Ç‹õu¼hpÑ/å‚ÅùÌÌ «ŠsÇ“— ¹ÞÞîÛ®N\±*‚"È쎤SʲUê¶sͱÞÁ© ?~8öÒ®¶\hŒ/Ý齵郥FÀòûE¬é 5½P"}Âv€¾è2 ¨§hkºn³o5pÊžvÒÑŠ+bi·®¼É^ Úoßpɦ·íãÕ*PJXé_»º÷×ôI`½Ü©+Q¸±¤§Ir`Rznƒ™™™½{÷¦R)Ã0EI&“Gõø¬‹¥©©œöol ú•á©ÒÎ}§6.Ê¿qm:ÑÚ÷ö ©‰dùÖéÈ‘ã÷ïQ€±¼'¿ªþ¥ŒgöŒè~]þÕ{Šàé‘R¡¢ÀòÎÛkk auÔñZ‡w:/V.—+å&% C)ýdÿ°Q8b†ÌN›@Ô°ŸV±S©Z›a£i=ažŸS ˜œ1ç=â%auÆ-áo¤_Öйòµy<™›H­Ma4ô6•€ÉaÇÁ™œQ6ź€Ü™C`›zÊg©Ý5Y°Rµ¶´á eÐ,ÏÅ‹Åb]]]¾`¥*g”`ŽKu¥… Ü"Pü Š‚â⺸­‰06£NX˜ÒŠ„ )1«À²pI„l`QÜô:xå£R ìw;ÏðD7„œˆ:ôk¹‚54–ÍUl€^Ö™ø—ì>>õ•'Šs:‡òNg·]Ñði'‡f’3E P²ŸÚ3¬ñ†Ë{BûžöZy1Õ ¯Ô=}YLDqªº›ClÒýòêÓ!µi jEx¥ÌÖ‘"Þh®˜¦ èB.¶€cÓE×ô›rJúTË¡lÛ<; a%i]zÉšË/¿|Ùá}Šã°tKøšYš\p?zåoÏût#Ðä-[Ó#«ü=–…ÝÛN y ¬9–W©xÄœã8RJUU½áGç­ÀêÂ:ꨣŽ:ê8 ªÅ¹ëº…BÁ£W<Ö¼ûs[÷½¸_הÅöŽŽàÚ†àÌ8 l¼\½eûß»y¤I‹L¦îõ?ÿ$ÐÑh<Óß$Ígð2? à”NŒ‹¦¨øC!|> Óz;j$ZHi¾J±@óPUÅqßâ¿öm¡7ýöÈŒ™ •Ê+Öo Ýpµµ‘ .[%Ñ4n{ïUþìæ4 Í4È?ûÐU^ò<àíG- ü}ÁXWƒi»M ?~<™Ljš¶råÊ––)åñãÇOŸ>½{÷îáááóõ¼ÐáZÒÊDÚÖ,"ÔwÜvÃ÷>ùÎûNüõ;•P¦‰%ñ1àäHa߉ÂàX°€–ÖŽBÉþê?¿àJù÷ÿô” 7®LwuÅV´:EKì(”X^X[]UÇÙ0/gîõ;WÇ/®+å•y]×ܽ{7ÈGvÍÄâÀ[oïY¡–I3€Öó-ØT7¦:¼<´uC'°8 ÓG7¹k,­M>PµŠEÓZ MëæyO7Kf\ 5:¿ Õ³„¿ÀÎ/ëi¨}jµåªòh5Ÿ%žôÉ *¥¤!t#"˜›-X'vYíŒ>\LÖ+ˆw++°¤ÕÔÔ$„ð ÙÙ„ ¬²kaË”VóÓZ´M![h• ,³¬ÀÒË ,Ç‹?94GeJÐ4MaÛ¶ëºÕ¬WG`y¨_ÁꨣŽ:ê¨cAT‹ól6ûÌ3Ï<öØcO=õT¡PPUÕ3ïWq áÄÄD6—³lyäÄÈÊ+Ì*¸Á †â_{Ãþ+{Õm7†W­ÚÇ7ÎÈÃnr ÍdÒç)°‘(€n8ŽÒ¸QíþucýŸ* ëÇtÍ_~Ö2”hL çeQÉf„”"C, )e6 oo ÙÓ­z5iE%Í€´±ó͉`8x.ÅúB箕ò„îk.™|Y‡·lÙÒØØØÑÑ444øýþt:}øðáãÇ{Jó‹ÒšŽD#ؤë†Ö÷;"ÔêG Š@û’øD:ï|÷ÑÑ““¾ñr970^ºó‹OŸL}õŸ_x×§~ôo*ðÁëÆQô+;ÀÓ§ìr_S70 Îé*ø/¢N`ÕQGóq^Xétúرc–e¥ä=N.銛/OÜÍʺøŠ€ˆ,ñaEÕ°­5K#~iç7¹Û#°šýžK­Â©j›nci­å< ,ÛÌMçUUȪ«®Š¶˜uHÉÒÎ-í™ãɘÎNÛ@kk‹ð%4Uv6X®ËèKEGŠDØÑ¤¼ ¬y ¬ËåÛ¢Vww)¬8–¦/6ïàec‚‚@¨àT'<*ŠR QîV9EæY]<V^€@ eI»¥­½úVÉ0"> ³qMOÕ±ÈðÞ«&?ûÐ=i詼©à#T˜Zû®ÌŠk”øìÍWoèAh *VPïÃÍB˜r3ÔÐ.Š©ôPI×…ìÕó›V·ÿ|ßkßó¯þó ª"ÞÿöKä东‹i.py,×Û´zµÑ÷þÈÛ–:~@ZH¯¥±èªËâ— €Òº aÌX1§ RQ`©( J¤Ëv~‡ïìlÜk7àωjVUE ØÕ4h H·<ÖY,„YéÃh_-ÖõÖu…ôÆÍS`Ù8Ë{€#ýÓÀÐhù<—*tgU„U%°¼þÛ«³¾Npѵ¼NP_Ç‹õu¼hpÑ/eµ8÷ZDRJï‡h4*æ^D…ªªzÖ~ïÛ¶'''9²ÿ~àGÏL_±B ²èX^;Ó/Œl@yv[zËöÀ›Þª:NȯvwO¯<–,%“…€OŠeiÑà¥jHÛÒzß©¶ß䕎+ t¦ ,Ò:€HΈÄÐu¤Ä2ɤ"Qà‰'žPû–{C›¤7…Ð)–{¨ ­Ù$‡óÀ\Zpi‹LgÊ·]]=¦ ‹Å®¼òÊK/½tóæÍííí3˜ÏŸ·ÿゆ•4]bÑ€bhËÞ§„z¥q󲆩ºìЀ}|Ü—Ê:Í÷ÓçS§†ÓGRÀS{†‹–{ËŠ™å­%¡hW,Q€çú)+°|þ_¨üŠ:UGuœ‰'õž Þkccãßß7Y(¹Kºã€#œ  Þ|‹t2(ºð5iBUPJº°Ì5Kš€£~ìœÌ –²“GÇ}BИO`Å5×o¨™¢ªåfåįɱӮ$¢-.Eˆ¶¦r“ª3n½(¦!pÍeÝs²&¦r£) ´·· £D_c 8ý’´FàB¶vÄÍ'>yøŒDãÛûüÍ­TJ–`QVXs÷쇹B@u¤-= a *~@Glì–D‚D‡â‹»€/0S²4å)°š#6%®ìÉýææé%á’gµ«¼©Ђruá¿o¿æN·ÍüÑûÖùuÂ>h˜Àîƒc€÷÷v6–G`çX§‡¦%¢Ã0µÔÔ›¯]rÇ;/}Ë K…"4UùÚ§®Ó¶>÷à‹À'ÚO´süòî|kfDZ™KŒeWÊv@ø›cË>Úôå ïöcÞÀ`£Aä) ü³Ã•å«”uu³D…À ¡Gº`ú”ÜÐZb‘ùB¹y˜ÍÀª!°ÇYÑ”8scáoXÈB8ìL˜”µ`oWîú@ÿöõ)\UèqÒLy1U:rqgLÓ”‘ôáSÉÏ}äèðS>*•6¯eYž¾L×õrùRq?;.ú –× êëxq ¾Ž .ú¥¬çÞÐùÎÎÎ+¯¼rË–-«V­:sãêÕÙûuttôÅ_ôr¸ÿãgS?|jêº-@A–ÂE  ¾rRA¹ÌÐÑh|ñþ8 óC€]˜² þb¾ÌS¨À\Á—°]¼‰LЫµÁ¢D0$  K%™™¡¢ÀÚºu«/ÒèµK½ ¬²üÊ; æÌ«9u^ˆ{EbI›Æ&ó@(êŸpßøÁïí=<xBr]×W®\ÙÚÚ å~Ñ@ZYÀgh@"^¾-F\[ú@iÜäÓ™žNÚ.YSNO˜¹‚ýôþÌD2¿÷ÈÐ¥"øðMãB¿|©¦vªBÑÓð/¿ûsEÀú%A¼®úËu¼Æ!šÔ{6xWGMÓûGÓª"<ééHÁ-uŒ"Hhób'}B·4HËZ³¤88vÎÍžÜ5Ê›J×"³fÃ,C$4] Ûb:01£¹ÅÑWþAÆ'F¦˜Ò÷­ Fùð #f奨¨À¢U× §ÑƆŽg4 ­9‚P=´¸±ô¿$–˜.,–XˆM+ˆà—eÅjõ–íêÕ׃@¨èz¤Æ|Ô(°æf`a–-„^ˆûÖæ5­ßùÒ›÷ÿÝïüšâ‹º€’@¦¨Éâ¤âÞ±0Ác9Læf`U+ Ú öŒ›½+}èžyÿuYopdk(¼tl Ø´ª™\ +/‹ÏRtç)§Gf€N¿%§§Ö,iüô\þ×rãÿøŽþó[o»~)àX·F’wvŒ':rzŸ}èo¤•Q‹ãþYƒ¤ÇUÉb¹5'&âäðDmåGº{Õ_ÛîXÕ:ÒZ¸s¶Î»½=´4ÎaQ„NúI‚@T:gn)Œ8Š.­Ì™„ïræÜž™QèaÇœ˜Ÿÿ4–Ští'~è<¶cõ3ý¶23£²‹;cŽ+ÿõ,Ý=úó@ó@ù#—;Msžëü3° ë)XuÔQGuÔ±ªÅ¹§qƒ~¿?x—Ýy˜—ãžÎd–––»ùÞ§’{rñ†f à–Ê ¬PYEMÛ/‹ËZôçLýìXƒ4SØùáÑ©†ˆøK…rÁã•ÄÎKu\ÀÐe+™e‹´v Tt‚¡ÊS&™ ”X€q\§@%«ŒW§Àrç*°`I»üä¹äÕW_}É%—ì?2trhæ-ûÁß|k·[ÓLóæÒ\l ,;S´D8  ±Yóé ÙÇ‹»Oˆ¬]Zë\/ýtçŒ7Ì}Ç3ýÀçnÿê;—·yÆL=ó¯h-mõ§3pÂ1~‘¨XuÔQÇ|¸ç¯ÀÊ—\Ûv;[#>CŒáQ Õ“ù@Êž2Ÿ0LMXV[S¨1æá°Y IDAT›Î«Ã“E¬ìcÇÂ@pmZµ%A2€ªm1xß?÷üßÝûÊ?ÈÔÔ4Ð3š ;aµ…ËW¾ö¸•WE^UBo{¸lQ8:TÌ›Jȯx{Ûˆ.n2á´Æ .`–‡›ÔͰÐB-mê¶•Uë8—K¨>*«Z ¡êÈŠ…p«%¼r}G8hd™ÅP6.ª²4YqÚ”Ê{³¥:GÑVSa$l7' Ónú¨5økˆ¸Öà `Z°aU«ŒMåÝ3Ô;žüŠ3XƒãY Û°drV ÔÓõ\Š2›‘Î n†Zc«,ŽÉˆ}à+îäs€¬‰  l!ä ô3/tLĺªVe3Cèáî2ëÔ°|A—Aèa^k´òî ÖU¢œãî‘n58a=UÚK…À 8¹¦IÚÜ;œî]óÈÁM‡‹ÿî^ë/ÿÇòð½Ýåx¬g_ +OK—šo•ÀRUU×u×u«Š³W„zŠ{uÔQGuœÕâÜ#°üþùˆk1/Ç}|"44¶üŸï¶¯Oy“[,+§ÛÒÕUO'UI*(o@xC¯þöÑ6²0<8œjôÜ!fÜl¹„›«ÀÒ óXz‡¨*°A @U®tò‚¡rSÕ.8#;܉gª»õ,„ÎØãÎà½ÎÐýÎÈgè~gð^™9~®sçÌ'°–v€ã§3ºnøýþýGÛv¿øÍçOžžy.FV2§ÇÂóç_?QÜý¯Ù?XxFiܼ¼u¶ y|¸øð®ò9éN+Z²oZW9KŠ.5ÿu+2À?~ÿ€K÷=Û¹äøñs®È uë—„z¼z¯!œW–wãšÊXÀÒÆ?2G`†(ßóû„n©À¶O„µÀ‘vö‰ca ¾®‘TÉ” ¬ËG|>ÙŸôýÃÇ_ù?ÓøThŠùnÚÔôµwÞ¹õD»~H„e@wsŠ’WÀ>ô7ŸºþàçoZº­œž6€‹›¼8F´¯É¼$ÅM \X ,±å/逩¿-RU`ÃB¸€«l!ô¬r”³±X”fÆÍ·N†ÐCRѶPd6ˆP .k[;XÆæÓEÕ´e HÛ*°8Vf’Jí ÂZð*DXeþêõqô¦ž×ñZG}/Ô×ñ¢ÁE¿”Õâü•XórÜ»üÎgvíŸîl°ßº!åMnqs9À­(Çýsûd¡pèiñ5Æü»N©Ïœ ¹ùáþÑì’N?à“.p_þ±rI\K`9Ž8ªð+>¡T2°B"ШÆCÅJl¼G`™%ée`E£ÀÌÌŒ„¼ZRq-gð^7¹p=úÉJîèCUêÊ£±¬Ãw¹3Ïv6¤;ÏBH,i Ùù’;1žÌ± J…£ñP%°.ªy;;‘óš°Tu6€uÄ™FœI%q銮r) èÏ̤ó³bEˆÅM5ž¢£ß}ÕTHwzvG®¿PóYÀúy"“É|ò“Ÿ\¶lY0ŒÅb7ÝtÓøCï©ÚUÜ»wïÍ7ß …ššš>ðäóùê³Bˆ|>ÿþ÷¿?‘H455}êSŸ’R …;±±1øÃ®*144tçwF"‘Å‹ò“Ÿ<ßÜÜ:êXÒ<ÏßËÃkïLΔ€¾®²d48<‰Aº=! #€–X†0,½ü2`Ͳàà°69•:4â× VZ N@¯0Dšüñ-íŸþúTkÔž˜qŸJÎ?`sÚÙ±ûÉýï¯ßóãÞ;2Ôï=þø‹y`Å¢h÷Òu·Ý|ÙÖí1 hÙ@NOÇ""Ð&­Ìu+rk¯wŽ^:뛼þòžòÎõèâ¦òÖ¦EùßÜ"ªGu¡ J`ÕçL õ²ÃíΩÀ*w«Ü Ë–TWX®%¡à©d`iB…òtBY>oKûÕÃcþ}G§,Û\ŸæÊ,Ö.ÁH™sBôk ,M£;§û„ž±&A¢…¯é–Õé»?³öš]@Gs¸½) ÏwžMu:Y:}¦)³™y¯r¾HÀãQƒ q\-,íjÇ-jÇÍsÏ^j4P…²"ŒªÞÒ ˜•¯noa¼Á6óf È+P` g„¸—ßt!(›wrgíƒNùG“,J­L'S3Èeí¤1&‡YM<^®W–GË?øü¢ï’"Lé^{¦‹JUJ¥r¹\¡PH§Ó/{_QÎÀ:÷F ~Õ‡PÇÏõu¼8P_Ç‹ýRV‹óW®Àò.ͦi*ÂÍœcƒàŽm㺮 =(ùàË»š7+&‰™Xß½·ï·olþé‰å2?4:íl^AÒìX%i>WzÉT$ k-„Ž Ø >aÌúøÍÐ-—9½Á`9«§GQ¼Ô‹‚A$vJì ûЇvÄC;â¡Óñn¼ ,;/KÓ(†Úy«Ú~£Úy«’؈kÙGþÞ>únúHùt•¦dn; (°„îˆ[ÀÐxÖ²Ý#§‹ŠàúåI d–ÀRUÕçó¹®ûêf+_˜VfºJÖœ²kØ™&œi[5V]ýÛÞƒ—¯msçgMþ áÎþ.4aCöï®™–’ÉTùDÍ΃ú N`ý<ñû¿ÿû¶mïØ±cffæäÉ“ôGôõ¯}Þ6G޹ùæ›o»í¶'Nìß¿íÚµï{ßûj7øÐ‡>tÕUW?~Ü›ú•¯|åƒüàå—_~ôèÑ;wîܹó®»îªn|õÕWoÚ´iddä‘GéïïÿÜç>÷Ëøœu\ìpÏ'Ë»:çê8¿Ð諹Tîs³§˜«À2ËX&°¨=Œ¥µgö§\I×rSÑ¥êºP«À*[ëSÁÐÖ¥àñ]ƒóŽÁkÂüøÑ={_êÿgô×>ü i9¹‚õÓ½RyÛu‹E¸WíÞ®4nÚ²8÷©·øþðÚi  ¨/„|úºOë«>¢¯ÿÓï¶¶ %)¿ïõ—uWÀ×q|†ŒG¿ùÍ]Qá qªG7 ½&G)[Úú–¼ÌKƒ! Tpk•S5;žµR¶ @Hi»–)M×' …JBSu?–´íJm¤5# à E ]í¼UíÞ®vÞª-ý}µý ÜéÿôÞÈ9uµÿKnr€kÔ(°Ð"5<ž=:0m9rQcie[èšS^„1XV&Uò¶3KeÜ\ÖÍ.î„3ÝÛÓði€¯TG -išC ÅFø½µ“ÀHÊ¢ºæ·_.$Ák>øàÐÐw’H$Þüæ7¿ùÍož·Íç>÷¹}ìcúЇ¼_ï¼óÎT*U»Á† Þýîw _ùÊWn¾ùæ?ÿó?Ï{ÞãíóË_þòwÞù‘|ÄÛøÔ©SÞápøïþîï6oÞüñç8ÂT*5==}Ž ~ÉhhhˆÇã/¿]¿\Èó±zWÇÁ±<Ð×d*iäKvPñ¡…QVfù„‘Sïe@"¦²ÚÐdˆöØ€°½1s,„ØvVl\>õ»{îÄûÞ¶^'Üé½Òq'ŸG¨Ïv€4Üé,>Ý_2¼)6/ÊwwUšªqSé—Ùîô„DäU!¤ Â3…9¸@Scx:jN×-k.¿Jñ !»Úíw¿mº9bÛŽ:çð.(:N =J9êR%W€…3°æ B¥³M!ôÀ)¬B¸¶éù—Ž gÿ`cit¦Ë¶£å- 5ƽ¬›¿ùê ?zr䑃ð¦u)ƱCþlX&¦M+÷¦ÂˆK++”¨t’á{ocÕR5ÞßR•DÏÕ}À%Ë›ÿóácûŽL¼ë+kwS£Àšk!̸ :c29)zWŸ’©iì<•‹´X¹Ô®‹@kmã® ÒÓ@II©ˆœA`‰Înm`ÈôFFF€.â7N­ó]ȳÊ#½RQÚZ[ÏÝJõ`ˆBÜ«ògœ¢4ntFuFôȇÆÛ–y?¯,Ì’zŽê/+°–)‰+œ¢9õqPÁ¡'Ýoˆ¨)EËBQ˜ÌjÞaTKdŸòêéX,–ÏçmÛv]×qOŸ533sŽoûו«Ž:ꨣŽ:Î^qî æ{Ùš¡V•Íf¡ óû_»màØ^焯<¢ZÉ¥R+j¨šPmé|?÷°÷ȶ‰‰xr"ýß>üà“‡zZ´ý“]‹{b@x`@l\º³´È)fŒ9!î%«`€ëe†”}‚5­D¯ñVµNMDjb¿u]W-ë-Æ5èúãÅ]‡¬SiïöÁL»ù!@;k>®P»oSš·Xû¾€UV|{³ ¥……Xž'ch<[(ÙÀªöbwƒ Ϲ1ÓÓÓù|>+ÊÅ ý‘v6oG·FÉ4âL-ÓÎxƒ:jO¶ûšß÷߀C'Ëíá«–™ì3€%á¹e§¢y'¶)b©ÈÇ^Ìܰ©«¹³“_$.°{°×8V¯^ý‰O|ⳟýlçÙ—í¡‡úüç?_ûÈ»Þõ®ÿù?ÿgõ×·¾õ­ÕŸ×®]›ËåjY·n݉'¼Ÿ‹Åâ¿øÅû·ðâåj¬ bzzºÊy] ¨X ^EˆûÑÁ4°xhŸ“Ú/§&+(4¤Ò¸eö{Æút…0óÓy-™UqÂsÑ‹Ù)„ GZãZ[<·ªd:Úø“ÎèÃÕ=ç#W¼Ô_Ð4åC×O}éÆÿÉþ¢ pÛ¥3³º$ÕH3 ÒV ×ÁõD.Ð%uÝæ®êÇWTøÐïL/j))ªGuAèPZ@¢‚#ÅÓÔx]¬s½.‚…³d` EÇ5q̲…°RØŽ™w‹ÀÚEç©{ËaúŠÙ·•“…¶ôiêc¶#zšœ÷nb/v0°óšæ‡Ö ®]Ü;ïMõKÿ`Ÿø79ù Aœ€¿=S˜)Êétäôi:q½d?|÷šâ2À›ì[‹2%çX‹%{ª$t!ÛzÛ9ž®ÍqÇÎÉ‘~¢²¢+- £€œE­éè:–…ea[H‰?p授' ÇÖr™ÖeËõpä¥þƒ ŰyÒŽÅôñŽE¹hÑ¢…÷?¾2õŠ,„€Ò²¡³OYƒ×Íäõ©=ÙDhP¢йÙÝêq™ïD•îTývѧùK$`uôôöÆŽk^ç‹.0–ÕÍ«š×îUÌ­­­ÞäiÇH&“çú¶¯‡¸×QGuÔQÇÙáç^šÕyXã“) S %lì):SwÛáJwʼn`„f¯Î> ›°Tï>f Úªb”ŠMMùP‡SÔ|Maš4¯±‚k˜‡€´Rê`N–i pTÏ S1^xùÞ!ÏB85 ˆÈœ^¦¥5#ó9‹û„H© ­´\€À¾f„"­,ÒA¨…c¡ ,´pĞ'²#“9`U[Ñ›EÞ?:'’ÂS:uêĉ‹-êîî~ÍÓXV¶è4Z›dØ™ð›ò7Éüí[ã#Îä†ÊãíÍåûˆ+z3?;ÜZ,ÙKüsC!ÝK2QTbºóìÁlkïʦ†ù­ÜŸ/.°{°×8¾ýíoüã_ºtiooï–-[n¿ýöíÛ·ÏË0›œœloo¯}dÞ¯µä—'æš÷H:]¶æþÉŸüÉ¡C‡¾õ­o-_¾< ‹ÅÀÙ+óÐÐÐðª>Ù/ ÚñÔááUX'¦‹ µá‰USþ„@íz³7èăÝÒfCÜc~ ™Ó’y ŽOåK 6ßB¨ m²YYÙ^<0ìþ¥‘+Ô=€ÒrµPÀ ýKlçÉÍkÚ~ó ò¯rÞ9øuù¦ v5JxV) XZÙ§fI[àùÝþÛÛVoYÛ±mS—ýÿâîzNýõß}~`qK¡ìm´/< !E—€âCèHG:Bä²À ‡oî=§‹p6Ä}á´,¡ú¥kJ'cJ•vËS`ųM-rr¼}Ê®Z½¬ˆ̸ù¬›…}—/qŸ:¢þ¿·žöi’qd_0Õ™ØÓ<±6¼ð÷€ð7êõ׈Æëgîû|WŽŒÉ1®BfF™emqõ®1Ui=|*Y2o¦À|Ì¿èÚÙ²ih<+%>Sí[á?,O«>åæíÔhœý³— ÿYüå«÷zgú=¬š3½¨X9ÑØù6¤´³6~æ¦¯ŽØ“ÝcÖŠþR÷¸5Ú=ÛÜ…}A¿–/Ú=ñì —mÍ®‰œ˜³?E/ŸX•„æ$--™.Ö ¬×/^üýï¿T*:tèÙgŸý¾pï½÷þã?þcí6MMM###‹ÏšV ,ï;=_t—7ª€X¼Téî}É<¶\=x!‘Uø„áe`yfø†¨G`©S9 0"®Oø l„G¯«zgc±èLO-ø’yغuë°3ÁÖ¹2°ªðdáÇ‚ks¥5©Q=ÚØšK‚T"ËeiB–’ÂÕ©•_ ,ÚÌØ}˵¾ï_R4µ”ä@Ñ'º|æá¼`4sYìËÓÿ.H`Åb1UU³Ù¬išg˪÷.sµ9Yét: ½¬¬øµˆ‹ûëõƒú:^¨¯ãEƒ‹~)JvQÓdzjŠóQ`Ù¶-’4%¢¥I@Ø> ÅÞî'š“ JtËÒÕú0€åú¢NµEA˜š ¶½yMÛÇþ÷ôþ¾ã¹ßZ_ÈãbP–'H²gËHË.®6K`¹‡÷sx?€Y’ù< ‚Á²+›¡Få­£†$ÈBN€§À*JS -rÓGdi Du<Ô1Ìi¬”t+•’•Ã1A¢³úz@´ÇM``430’Ö´#¡`"d'sÚØT®­©¬< ƒªªvvv†Ãá¼æÃ°ì<Òõ:ú ñ¯Ù+(¿þµgrѨ\ÿBᑎr]*ûO8»ŸûàÖÄéÌ©Um…oüÆfy褽ÿgsv(4¡T,CR 9ó Ÿ)÷—À]ðù|ëׯÿûßÿý÷ç;ß™÷ìÞð†{î¹§ö‘o}ë[¯î …Bí÷×7¿ùÍW·Ÿ:ꘇrÖ+ûzðX¹¢»4®Êеê-Û÷_Ó­‚­ùfäàº]q·€xÔ§*¤‹êdFôˆ  ã8AõÆÕ»%v]h“ºvårøÙΓ€Ò°¾z5zjÏ0påúv[õ¶ÓŠàKw,¾qU¦¿ S­X”5EŽtµ:ȯT&°Å®«¹ º5GuáÀ;ÏŠÏûŒÂt(P/'í1|RUü¦tsá •(gvŠ.®cçdg,@Y²\*¢iÆq¬²sÐPW"ºÐLiYÒ¾é²æÿqë0Q@0”èP›Wé‹£ÊÂA]Â׸é£Îཽ…àéN÷?ûJH%¶5Ðã¬\¤ûj\„nÆÍw<Ã̰¶ä€]užM]>ënõ eQŽã©Ì]¶sPþƒ*Z77„G ÎIÇŸ‡2‹TðÜÏ À*ŸÅ5ëÕm7ªÛnT–¬D¾<ˆ –šŠ¼Â´¹JY9K`ùçÎ@\–´'œ¤‚Rwõû´ãÜ:MîDl…Ò¸ID– 0?.-д𫎌WþƒššMi– ¥Ûg§G2€¦iŠ¢8Žã èYÀRÅÛyäÈ‘×|±XGuÔQGÿeÄõ)*žWH`Y–uèÐ!EÈ“#žîF@'J0±¢óÞ­áCׯ‹fõÑ^OwµÞ§ ­Ym°¼¢Ø¶cþ¶Fÿ¾ã¹°_|ìRS*ʾuŽs§ZvpU}KËõÏÚK92D©ˆ¢àóWŸR·Ý¨,cŠ—€‘ÏS“Ÿ ö¼µ<³È—@] ÜFæŒ,Â"ílÙ?87ÉTháΘ<>•É™] ·9bc$%ʬVuË@ °eË–%K–477¥RéÜCi~iùáòˆžâøy¼Êʪ¦JˆÇ‹»V|¡ K#Îdï¨lú¥·ŸÞ¾ôE}–À5W»R•À’6 ÁÁ V¾e™À²5hÒ5\ Ûû˜–…лxÕ‡îdÞFJ½¼ŽNé¢p–ëº05aMî)‚™@¢1).Ãã(ŽcÙŠ#Ù±œX©…âNq…°Ä2À`³wÏL¯Õ]ݵÜûþ¸Õ==+$@pgΜîÚúVß®º¿úî÷û~MR“6aYöïjð…~G-Se´Ê ÛÕS¤ V¤Zf—%´k‹ˆ¤‡> €]¹ Îáñ‚¥U>^I¢%—Ï|€»¤À"Þf©^è³Ö6›&J"d5JFìVÎqp§ËKñH®š Ue.\SöuW´-jøæ÷Ïþù·OM§B„xœRªª*ç\<ï;Xâ„=ù´=ù4›ëv³²\ª@ :ÁUÌ^̲\眀2Ü{"“fžJ@rQ0ƒìÊY>7C|â ¨l,C(°£§Ì¤xNn*llP»PÉ™D÷{kºZœ¹¸°ÿÓ{è³}Îs-Ü\Ï`·:xàx`ÍU•‘úîÝ»ŸþùòÛ矾¿¿õfW]F¿õ­om¼qU¼lÞKä¦s€Þ Ü#˜r›ELYÉP¨Dá„Ø2‘LË‚¢D*P È=ÜcÊXQão)…Ð@§Ò}ïyíüO¿u¤~ÎsšP²w áï~tÀgŸØ.ö µûËD T|>ä‚] — ,XlÎH¤‚Ó/pÓdT›©œOä¦T`ºœZdhùüíííWß×Àü‚+·±+ €YK¿ ÙæšÝ@œC DmlÇ…™ýguÏXx¦NûðXqÛaGaúŒuæ4y?øè”ïÉ1ðV}ØrJ”$—ÔøÀÒ‰úƒÐ0.çNòqp`ýE&£)-oø½*€óæ!Z‘˜]P¾òŸN0Îéž-øn_a .ôùÀcßÀÓ±¨Ü0ñÌÓOí»ðáôDÐ…´×ÕÕûD›\jE w£6z¼ØÛCÎ[÷ÕäTn7€V3ØÓÔŸ%œãj•"ÚÛÛ"S“[ Œ‚ Ïš\Ï/#j+0kÏh–j{•vò£ˆ_Q© l§áíåmœ‚•¾•W«á ¹óóù €Dk‹Äà"j[»…qÄK–˜æÅúò+’$•#‘È©S§&''c±Xww·(c"î6•#˜¸·455MOOONNÖ×ׯyä[›º*«¸éQíÇÛÕ~¼mptåääd ¨©©Y½*¸’ "h[~¦L›àÅK_ õK.`bD®­­JºNŽœßßK\ȰLBam™ÒÄ¥ëš$4Iu–DpË"À;¿ôÙ;=.YÌ^› éRZj¤$«@®`æÊa„e€åé$‰ÔÔóø,€ "§5t œ«Àã 1åŒÔò3RëcX•á!च)Ø%ºÊ.ra±ŠÀ‚ämš‹*€}miP#lÍš®6MêþÛžûá«—ÿÿ¸»²¤•ËåÊf³Â3á}Ç™‹ñ×ÏÕ‚PE²§/}û7ûpÍ~/̳äi®Ç3jÐ+H+Y`ÌœX´«W›»ìͳéYÔ·ñd8ç– €ç¡(ÄMyÄÓȤC]Qg¦(./ò!k6›^ðP%°Þ|ô£ýßùÁÁAÃ0^}õÕ/~ñ‹ø‡ø~7ªŠ*– R7ãÌ#ưLÞòºåf/œù—¥àÊJ†B¤Ö[•LÓ€¢Ô„Ý@@$@xØÊBÒÅm[¤šÜ:´¯_ÿéÑKöÑKGÊ›m啕s‡“êEp2ÿ½@ü¸PS¿]% WËA¡ukçŽ¢Š®|»DŽa­éùXð!Kÿ{Všf¼*DWªD-ðb‘›âÙ yC|qžyª*}àgÊ{ÍXóš¤:/q·ÈõSVìRûƒ{—Z(°VXÄ]‹ü|:d–6ÚÙ[äEí†ÝÖ_Ä«XŒ;?˜²k«ápx```||<ŸÏ/..®G`‰‰è–––x<žÉdæçç…ýÄm€M]•UÜô¨öãíj?Þ6¸ ºr~~~nn.‰Ðå6´Œ±|>¤îY#8·²Xvàåé[BÈàà`4ýÆ|Àƒýé¥í]u°4)ªcU a%š¥ÚÅ ßö¦`kcpY†Lºäf>%$53S#lËÖ•IC“ °6ˆ|D?:-xï¹ólrh`Üàš€ÖÝåd®F)…б(&ºŠÀ’=ÍaQQÊÕS[U‰âßݪïÝŤžC¯›œŽi'ÎÆöm_ò‘ ¬›‚À²òÏŸÆ×^.·-}÷ÞË?Ó¹{½Íí¹—ìɧEíé£Wjj{©eó$ÑÄÚqkæ®9ií(æf½Ù¢žY@çiÇJŒ¸9ݺƒYç!ª¥Ïˆés˜ ºŒ\Ip~*7ÕÂ÷ŸùÌg~÷w·µµµ££ãOþäOþèþèÉ'Ÿ|¿UEKà›&°wÝîn Saß(É<¶ êÊ›—¨g+%÷hØÂA Àc k ,2Ö@WÍ¿þôžùÉÝÿò“»ñ±m-õ~O>±›AÉÇ}%µÂÁ11<Ã4(U¨Œ«âéÚ°W¶ð&€Ôòa¹ÿ×Ix»Ôô2ÝŠ9«’ÂÖÛ7àϬ= ÛK‘LÇ+XÔæ~ê h ­íÒ£Ó½ût™áùê2#Hk€pAÒX>f/ÎæB¥$]ë—·­éܲr)whÍ% 1}ÔßÉ ]˜³I–™<çðKPB¾ð‰A”ðDÓðøÈj÷=L÷Ý`רác@¤i€²k;ñ4BÞˆ`¢=}e R龇iϪ֮€`¸„ã»°'÷mŠÀ([™:ïF¢XÌë/Ù¯<dz™òö¢pa³\àsþÇ¿zrOðnÐeœë)°\î&©PQùµ/I?ó±7ìI§Z‹¶¸Qôôôô÷÷×ÖÖn>¾¡¡¡¯¯¥Èš–ªªΞ=›J¥ÖÛ¸Š*ª¨¢Š*niäóyMÓt]Ÿ˜˜˜™™¹|ùrÙk)ŸÏsÎ ¶jó5ì=„-wZÓ/Ž\ª\FmÆ_>2à=K>ßeVRXë+°šå:&KtÓa:„I”ë‘wàSƒò¥m°U"\®Zb¨ÌpQª<ö‰£;XNÐp¤²(Ӳ㋼¶r !‘ðâ"°†‹H^A`í¨!„Ù#¦laë„àgïëð›òò—þô' )Gr~óX,?=“VÜ¿ÇßYcžœ-¯]òw/¥òôpF#;¥¦‡Grýäs¼êãöb‡C`µ3Ÿ@1»ÈsÚ’CEŽ€tpì…«eªÌŠ„\,›h¿‘ÖÍõ öOÿøÇ?þñ¿ß­¨¢Šu! É&rK%í¦:ìà(°{gyýþ+œ<ßÖ}u6X"°ò’Cß;)„`¨pp‡Qth<Ó€¤r‘?h¢Z‚Àº¹R‰§‰xš@ »™ç¦°%±&¤PÔYsiænÙj7XyÀvqE!¦)[h—y: €+:ZĹ\ù?©kÀù3µÀicéeœD¢+ÌÖ o[ãdy€#ÏYÒN¾d[ñ)¸†.Äœ7ǬWe‰ÿêý‹ß íÙýÝ_¹ó;çN„5£F±ÊS¤¾I~â“Æ¹áÚ”&äw4X T…ä‚]$ž[H:{¤Î«l³ .7PrXË瀄ô«¡®òqç×ó¤TˆŒ±SǤC0¹µ`§dHõR@‹¼NÞ: ,§ÕF!ô õxÑÅùÖLBUYDµ“†´˜ÖkÃUU›ššššš®)‡½ÒúK ¬¥#K’¤¶¶6]×§§§Ïž={÷ÝwÓM–G­¢Š*ª¨¢Š[e·Çññq1NMM ÔÕÕiš@·ÜXœs&"´¯|¿©¾eèÿê[6‹vê||1]èlôt×-ÙDW-7ÏÐeÛK|Â"}MPP—âôX!V©E·  ž&Ñ”²’Àb–~ ⣚W‹|–â´¦¸Ü¦OÀ´Ì†;ATçFT@Ë@ÅLHÄã·) KH@MĹÁyƒ· °”U&î¶­:ÖJ¿jB°w ^Ø·_¤L`•æ°„ËrX¥„%ƒFn1K_…A©Sfå&S`Ub‰·òù7s=’P@8Ë,¾††·HMKMÇëw[Bãv8o—‘I)„ÎѼ><¯•ÿ“ÚzAžÍ¿U›v<•Þù Úõ¸Rzm„k[K%Öesjây—e“»»r…ššÏH|þ—O_ù‹?•x¤·,'k(¥[·p —Œ„‹^ÀºæÆ{<xQGùûÙ%ºR$áK ,Ç?>çĎ줓Z³9x‘6ë×S`QW€:Óúaþui¦íÑ *³4 Ó1­rûÍPÞe”+|;û‚ ¢ !cŒ1FtÕ–-[|>_±X¼=ÜÜ«£äíj?Þ¨öãmƒ[½+…Ë•ÇãáœË²‡mÛžššËåä-VçÜÒþìÛÁ§†Â?:œ\1‘ôÜ[W<´Û€x[ÅBâ®ã– À’HDÚÈ5 €G ˜/Æ+ŠŠ·ã¤R#Šf¾¼A‰ÀZ9×K꯮Àrú±ÑÎ^†Ï,Å9낪½àì"$q×YCå ¸í¾f4…„ЇOÍ€¥ØÕW÷ö÷>÷ă½D9BÜL ,®Ï,h.[Μjˆ˜RW–²Dy~zÙ Îx1±ye*–íltÏ]LÙŽ«!a¹ n…‚ÄÈf„”`gÏÁ$Î8È>"lŽi©‹© \𙮦Vq+áàÁƒWߍЛŒ×”BX°#Ai’Ào™$y•‹¨Le‰ÀŠ„Ï wˆp3 ,W`•Re'…pÝ-›B‰ÀÊ•X|I%—=°Š¥©*‘ç_}˜„ˆQÿf&°Êì ñù6s= +¢ÙKåí*×z¥¶Ç¥¶ÇÇ÷Ø €»Ü$rϤJã ‘·(’ãòyà)Ør\¯IÙPóÎ ,øƒT´¡ÈôÔj~¯:׿ùE=wå/€/| ˜s×|îÀÂ.3¾-vîPXûL¤€46Wì‹HNP%÷ÿ†²ãßÐÈÎwÞÎ5!+eX,ÓQ`m® ¡èÊ• ,·c!Ïg¦x)°ã±û¹ïóé‰ ËÓ«Åx`µ–ýZáÄ„5—bÙYGEß\c˜Žg7Óò5!XåÂXeùUi-ikk Bù[ÕQòö@µoTûñ¶Á-Ý•º®kš&ËòîÝ»Ãáð¾}ûvîÜI)M§Ó¦i VÎô`upnj‹9ùß=Ý`:ÁŸ8U¹òǯxd{­ÝOëï• ™`É$J¯bPƒ…Ê…Ô²D]N RÂL³`•BtÛ6HÒ2¿ˆÉKE@¼ëXN?–6 ]½lA`iKÖz’ïròQÃŽ„±¬¥Àñžçv‘=<¾8¯[Þ¹¥ÀØtšqžÍ7ÅrÓŸùH÷¿ÿ|»½£¯£µù#÷DY‚Šg¬"°¸‘·SVø_þÇO}驎F—m±àñ7uÛáÛc&»¥€' çr<™@ZÚ€sd9ž¹€(âïTÿ@øMqa:ö/1Km7Ru?ƒUQEïD áyö«°D`Ü—عaÞÔ<¾Ô Ä#R}Ò¶ò|šèÚ}ÛøéR˜È§'ØèHù-ݶ‹ÔÖ¯§À‚ìƒìu[y¿m¿™ùIj®³`ZT• Þ5Lǯ6º>$I¢”Ú¶Í£”®I`UºÂ744ŒŽŽf2™cÇŽÚÚÚl6›N§ßqª¨¢Š*¤R©ééi]×].×ÀÀÀ&ëQTñO étz||Üï÷»ÝnY–kkk¥MØ l333jkkÝn÷ž={ÄÂp8œH$‰D‰ÀraUpÎ-ík/Õ-æ$U&†ÅŸúÁ‹{šhdq×_OŒM§kž;Zæõµ‘RM笑vå¥kㆅÔ04#«ó¢S=†sÙâœp)È—·HŒÅ¬EaV $Zk„Ê”’º>3uUóâñ‘Žnäs´£s»m‰HE–%¦ßÞïZÃý–¨a®Ï j„È~ÜÈkU!”=`é°u¼|öv‚›¹ò&]-!ãÓéá‘…zå‹¿°7ÅÙB|¡¥Ö¥È$ŽÞðóàܸ³æ›åX¹Ë3úK#‡/{ZÃ…‡ ô1œ_¨h÷ܽÝO€b2áæMäÅÙ»Ú·F-Ö¥iýOÿæ~®öÞâFË¿ùtDü~³ByæGln·Å“\m½h d¼m&ã2ðbMì#²D-›DÚ9.r3 €{Ec^ФY¶]n¬_¯mDCî¹…\c­O–n`ž_5…°ŠëŒ[=½ l‚À:uêÔñãÇÇÆÆDØç¤Ú‚À’¬ìEY‰R¬ÚÅãwQ€W²o=ÿI0äpUJ€c‰ÀZz¤'µ „OO¸,0p–eZûuë~ƒÏN%–ä6ˆ£s.§F3 €(Ç«nÌRuBK’êD¹‰Xþo¸9,Z@`§7ئȋ²%XÛ¥¹“BXÆ âŒ/Ä˯Åÿ­F]ŸÒîOæhÝ5žVÅñ;º¥G—}\zô ÒÞŽ0¨Ü>´»À^½œ'>»¯/OƒýÎ.¢²ra«äW„ŽZzo,žXĵȯDW:)„03<àh£N<€$S<ðÄÀ/Íîé@µœÆóü¤B•Óоzçììi6v œÓöî5/xZ»Àé\6iòbØg5ycSÈ0õ.R±ÜÇ]|öz)„]]]Ø»wo[[›Ï磔rÎ ÃÀ­†ê(y{ Ú·:æææt]Ïår’$uvvú|¾|>îܹ÷»iU¼ܸKR×õ……JiWWWKK‹ËåJ¥RCCC©T*‹]¹råê‡(!‘H\ºtiqqQÌߤR©#GŽ;vŒsÞÚÚ .›D¬­­L&øýþ5ƒsnf¯$T?ÐÛÙäg•ßÿ^ËŸwì«ß<þÏ^ðÁ-“\RÓƒœi*L²8€àª<‰5 +d ¯Nœ4Î`f€!WÈ2Åæ³vɧҶHÒ¡2©©#u X‹ÛX³]DÍz(ä²Þ(œœµX)cnÙñ %rc6Á/•—_¦¹oçž[~j^°ò° P0§Z‘ýÊígŸfÞno H”LÅ´çßÏhÆ_ïÌû’ExÖýnî%ñwÌ8ËóS # ÓÚ/Ÿï=óã£1¶é׳K]Ý5>7m©Uï ýÎÏ7ÇÓÆ„1PSpNOuåÓý‹Wr,Lø[ã&'„6·€? ”ã,•pÞŸzûîº}7íÜí´†HÔß Ãri–/~›B—Ðv# °P%°ª¸î¸¥SЫ`b®ÆÛ5A IDATb}K×õL&3>>^A`¹¡°vî(»üwŽ×ÿˆ‚Ä\ÖÇ”ø”@%hI6¯9uX¦À"Áija¯Ä¬i4¾øâ¼ðôâñ9À!°ˆì)G¤ZÜŽ¦-´;Prņ£À2i‰À"ÒÍoâ^¡ÀÚ”-èÀRÉËíŠà À E|g¢Ž³y^ƒmÃã]Içy½ø|¬üZüï6C{îçÉE$úÎSWÂ>î»zÜA¿º˜ÒÁq¨WóDz–ã¢0¥a=K”Y|OX"“'À·YKt¥ËñÀ2ÒLãz6äÉXþ<Plé‹n hyå±\%ì®èÞ»å'>IAž\´ß|%‰Õ ‘]Ü5–M9+è}*êx:(mmq&§gÞÁé—±ŒÀ)„¥UkX„—Ë …z{{÷ïßïóùÜŠVu”¼=PíÇ[¦i&“IBÈÞ½{ï¹çž®®®h4ºwï^UUS©ÔìììÕQÅM†wINMMqÎ:;;ûúúöìÙ£ªj:>yòäÙ³g/_¾œH$8çù|~ããpÎGGG´µµÝsÏ=÷Þ{oKK‹{<ž®®•Ù|n·Ûïw":¿ß¿fpžÏe4I•IcïcoðÇ#ÿϼ_ýæñ©X6àfz4eà‹RÛGË»è¬ Û@7ÊÊ2€„ÄìEéb€­H´D#I Y\cŽ{·µn}à °f?ºˆªù(®i ìÂÉ­yÛ‰Z ¼‚Nšc¸\{k„;!–å$ùµ‘Ãs£Gx¥w–`ôl]Laê™4NTtKä5U‘šëý–͆/.ø«ï K²‚÷œÀ2¸ Jƒ¦­8[8ªó;[à~' òÿíÔdjÄC²WL‹ÿù÷§cÇ2 W8P_ãŸ4û9Ç7ž‰¿ºX3sI1‹‚9¡Á®U,ž »„³> rLN$8! !é¥ùÓ¿DJS¾v]OY1±$Ës„*¸mDBU«Š*ªx?àx`­#ÁbŒ†A)mkkkll<7a$³V$èbuYlK¾3{Ñ£¾‰®Þ—‚ö*m†L¨ Ëy¿G ¬O¼”õŽŒÁë“|tÙ^[·^œ@é&¾y8¼Àâ³( †!ûÊN“ÂTË«É2¤µsÙþ¶ Û¶Ê&îôH!$ ôèãÒ‡?ºy–-pðœ²_}Á‘ª£æÔˆ¹4¯h0Cf‹€Û6ÒÂke­ÉõXF¨§‚iÀçwX°ë9‚2ËtòdHxI[N”ˆjBiiã…y{öóìWyö’Ø€[ÂÂó=T`%¯M%àh¹)f½ÌøLÉ2Ùfp¹ (Þ@=VÌ²Õ ¬,øý „lÀ¯\@×!°@UÝ HÉ3a¯L$?õ—¯yÆ0/p#uMí¯„0šq|Ü,'²´œØw£ì ¡Þÿ­(ª¨¢Š[óóóœóh4 …”ÒŒ,˽½½FGGË5R«ø'Ž……Ah¶¶:Uü<Ïþýû;::EÓÈÈÈ©S§Nœ8±ÞœŠiš.\8qΩin·»»»Ûív«ªÚ××÷ÀÜwß}û÷ï_sÈkooïšÁùÄl–sÒV§J”üÖgîøÁùØo~„üê} _üxý—?ß÷Ÿ?9©úêˆwYf¢Î‹ŠÅå~ëAQô À\Å*Ë…‹BÆu^*ámTe][Õk…›¸² rÙaãRŠeÖLIðõfát–9‰À|ÞÂYP¾“¶ìE)@8Ç”_x&ý…˜Ÿ7–j‹[ynéæÓ’² €lë ŒJ;›—’ RÙâ•Ù<ÞóÉ3 €êVn’¥ÏS5@6 ÍC)ãÛšÎMèÃZó6ï«0_ûÎìx15Ì5Kç¾ùl€ãkß™ýÉét°Õf)Ç’?·÷?áÏŽH6–‚yE5]ŠlsjÚñˆ¤»hÜN ® nNÚ•a9Ã~æ(°Zo¤ƒ;ªVUT±§ .—«··w``௞™Oiv$èB]À1·ç…°ï¿×‡$²6{òÏ~K1|¦™ö_}â‡ös5þÂ]ç \’”Ïþš¨[W† °¼#c(Ýįá\âÎíÕˆM%–äµx™À²0Û iŒSBZÛWÂ4ÌÒ¹XTÓJä&N!„¬H÷=,|hó{èA/ÿÛ#ö³O³·6/~:jN–·1-pÎdÉ!ï,›gRXQ‚P@ø¸ –Pù|H>Ä®¯ü €™ÙC{[H°?K}mPó„(A€ÃÒÜbžùc{òi®™¿Î 1 ¤ÀzSÅW±É„e8eJ ,“X(úÝ„s”ŒØƒáFÞ¼©±–›¸£Â¯n/ÙŸ+*i]×Cª» À+AoV¢!ê'\®hÒvË,­K™ÙSëíxUT*°(®¦ÀZA`ÝŠ ¬*ª¨â}G<P__¿byCCC45MóòåËïG»ª¸¹‹ÅΜ9cÛvSSSY @Q”îîîƒîÛ·Ïï÷뺞J¥Kµú ‰DâÈ‘#333™L@ww7¥ËÀEU“5à÷ûC¡Ûí¦”®œ_‰å´7:ý®¾ºßúôöÿóƒs¿ñГw/Ú’¥Ñ•¥N!›™æU•ÎÎç’KI… ,@ mÐ nA–åtµ8yÞÙàìX78ö³¦ŸÕßcÖ4J“÷ÍrßöìKÆ"Dè^…¥}@gDpäÍÌèèù3C£9w»=£Ê½ ÆË'Ó÷B<”ëøˆæ©µUse©à`2Ðpô|t6€¶-=þX~§ã&U…ÈY–Ïó¥áíÄUCCŽkÒr$–U€¿õ™;¾þå~ì¡u¦E¯ªV×étúýnBï›!°Ê§©L@˜Ì•#‡³5c»³UÈÚÏ ºUV=Æ‹ÍåÓñîèÎ-µýç$›Û}}NÅÖ Öâ È©tÓ‚·“öZIïëžË¼s{%ñ8Ý­îÿÏrÿ¯›X–BH2ÊxÞ§’ÐJGnVɉCB±J¡¾]ô{M^±îšîô¥ºP"žíôPñ¨9UÞÆ2‹¸,‹ˆ‡_¾ÀN–;¸(©ŠøôDùµøÏ†OÚ?}ïÎk5¨ßQ`™fêЭîè̇Ü6Üu°mëþ‡³ä@"^¸˜ ÙGC°òÖ…ÿjϾÀ’§ð^)°ˆË €ÏÍâZX¢+]Ä@çÅ25cÅÓ¡’—„/À«u•lè¹$–§ ,‘dJ»zE ÚÞ‰õ©"âïJz#/…½@ÉðÂå&àõ~ ÀÌ•‹›>$°J&XΪÕUWãÖ%°ª£äíj?ÞºÞC”ÒÚÚÚÕý¸eËJéììl&“Ñ4íÍ7ß}Ð?}pJšµ— Gøekºì‘iED‘ʳ‘sìÌI++ú)„ÙLùµøÏΞf§ Ñw^‚p ƒB%nš©Îæ`Cƒú¡þ´I%¢Ùð vám>;Í“‹HèÐåùYÔ×&où<ñwðâ¢=ù4Kï‘–“B(²ù6M`‰®¬¡A“Ö\¹ç´=¿p®UáßO€œOÀ´4_9…1äs „Ù¥t`'Ö7À*Œu=ªSŠ2åv¨w›&&gÁ¯P®De áfLÜWàÖ%°ª£äíj?Þº°,‹s®ªª,Ë«ûÑëõ¶¶¶r·‡‡OŸ>],S©ÔôôôøøøðððáÇϜ9344T,çççc±Øj¢J¸N:õÖ[o¥Rï<Ϻ/^œ˜˜8|øpÕc~=܈KR FÀFùP¡PèÎ;ïܶm[OO€Õj"lÞ²eK4D6᛾Ö Î'æm-KS‰Do3ì7ÒÄUC|­+ŽS45ö&ãX¡´²LAdÄìÅ\1 €Ê–$LÜ¡³"€,Ë˶HQ|'Öšýè"ŠðÀšL~ê¹TCÂÀbÓΗm0ÇòÂ0xNƒ¬ˆÐ”6·xâeÍŸw-UA/Jn€À.p;€У¼Â V>`KGÄïU;šƒwlkðy”x²ˆ{ÐKÜtn0aËŒæ/dBF‹wœ.0+&êiŸ Y*þïÿôxCƒûÊ×Ó§Ãm€9Õµµ¡à©¡€@»MÛ§SS+©k¨|®ñŽÕß6P/E<›ó9ý­çôÃåmŠÜˆÛ  ËrDî"õq™››;tèÐ¥K—®ãD79vîÜù~7¡Šw Æ8ºƒ%FâÌ(þFU–„ƒn®À<’Ànuë.µo½ã·n9ð}¼Ki©?v¾ñÂ,:†@¨>af|4Ô·öïGºë ;öÖîáÌ·ï¿^<µÇµöTØê3Áâ<'d!DëR6Ï‘ö.6XÙÇQ¤Ê©4€|Ð €‚|q)I¦i•&‘”"@j¯§€è†b“×£ @6ê!<1_° oN(rcÊŠ·ËhQÀ]nÒÙ#Ý÷py_ºe`ÅÑhïVÇ)L¼^¾¥œÐëâ:)„F À®ÊÃZÎå÷ö/`'~Êm‹ë t5>^˜@< ª¼åWÙÜ+eå ®û£½Ž =[V|?›èÊ©À˜5 Dý¦ÍÙ 3{›Ø¨äß_ô»09«!>êHÁ¹žçðùQJU ÛÙñÃë`•R› @˜Qr4ërÁwqŽ|0w…øWZÏn×jâ¾¢ЭH`UGÉÛÕ~|÷Èd2©Tª½}Uæþ †x*æÙköcWW—¦i‰D@8noo×uÝ4ÍD"Q(!º®>|˜1ç©Øårutt´´8NC œsBH±XÞ»w¯Çã‰Çãœóºº:!¤êëëóx6›`Ç…dŒ1&ZUÅj܈KRtñƃ‘ÏFˆêF•X‘¸ð.³Fp>€ÎÖeq) Øù42Xš!ªh¥`òæT,Â'˲¥æ æxÌ^Ô I­8å ¬,ÏÉìXköã¹ý¬WÐz~NXèðÆ’ìÓÆ€k>Çuo2 ÎI$*¢ ÒÒ†‹çv\.¥`ÌL/ò¥o„@öÀʳâ"`‚¶¶¤q\Áð„à¾;ZÏ~ï³¼·g_hŽ’LÞÆ V`‰¯±Aª³¦EV¦ÉÍí±v•`>e¼T7€ÉX¡ù„çšQžM·4øùs}ÿ÷Ÿ·¥@› àÕ× ìüñÛ')€C¶öЛ0ã0­¤ve&5 @VHcs}1 Á2R,SÞfÖ^àà-rý¬µç:sRo}‹sþä“O~å+_ùô§?}ã>¥Š*ª¸îØL ák§b.ÿäþ"A/̃Y¸dGQBW ™e¸»·5´þ¢EÔ§<ÓŸ|1c}çÂåðÖßcÒÚ…uIsiï’'Æî:o¼¶ór‚eD1§Á“ãlìRù-íé#-íxr‘XV2(]iT* ¬ÊR†&Lr* ö€?€e–a'vQó6R³ò^«C% €!\Ùô¸Òù“soè.g5'K/€ÇK»ûнÑC:º¥Žî—\G@P¤2Sðø#v³eÄÔzvù"Ÿ™`Ÿ: ËB'8­s]XMˆÚ»A [·Á½Rç;t¨—¢DȯꥨBä;µ,)°J–éóÙ`žù¨géJ¬0À =[‰/°²pÁ*ÔQgÆX(°„Îk›«`$æb™ R‰Àb™‹ewÏ«bY !€ ÖæMÜoE«Š*þ‰Ã0 UU3™ÌÐÐл¤¼cVb=×!±jçÎÃÃú®ïر£ìò.êĆqâÄ ]×½^o Èf³ù|þÒ¥Kuuuâ¾$ ¶úúú‰Äüüü‘#G÷`ddD¼8zôhOOOmmíÈÈHSSSmíºÂäB¡péÒ%ñ飣£eÖ¬Š÷b6eƒŸJ%Ün·$I†a˜¦Yþ͆ÁSåª,ØU±FpÎ̉„  £u™µ(­Ý/XZ{×êãF“7×AB™fƒ³Š‘ Wø[ Ÿ,Ɇ0q×XÞ)Z}ýêµÈõwÕÜüP°W¤©…ÏN7&ÌYkáŒ1 €ƒš“;ET­Ò탧ôs1–Ø©ö6é.vâˆ7[X´Sµ’#X#’‡[y"\P‹ðôïÖé–9‹mÀ¦!’%Ùü[öì‹Í¾ŽË©ZÜàØ#Ï ¢R°L`¹2R÷b½Íøùîl6ÏZ[¤t’» zÓ§Ã;Ì;lŒŠ¤‡4ÿ¿u'õyÉæj€È x_pÀ}ýö¿Åi ä¶V&°êVå´ 9s+$©ž.•äʲœÅm™HD È©Fcù4Ó B·ë«_ýjCCç>õ©*UE·6N!Ìçu‹iëÕãS[Ú#"~ f¢@`qÏæ’°v©}³ö»<ÝIùÎ Xæù׫wG6à¤{î³&Æ>0d¾¶C½`ŒßãÞµÔà‘söKÏ,múЇ%A`ÅçÄ"òl\~  \‚€à„KyÐyŽ–$Ø67 VšDrk6n)Ö&¡ÀãÒXØîOcjvØ©ö—F­©q'Z4HîëfÉyÝàñ2 F@g$yX®{íe ùlâ˜å*+Xïk£ß!"Gh@L……¨ßKÜ vj1XŠ­ýNš€XPc>²¶–Y–ùÈUçH£RH†dÁŽˆB¯”î‹Fânž¹ˆæ€•³Ç¿Mwýþ&ÏeY áò»Íæ=°ªU«¨â–€asssr¹\,óx<†aX–µZ®ò Rµ‡U,•U5[TUݵk—¦iuuuâ ÃÃà SSSÝÝÝÂ`‹RWWרØ8<<œJ¥cÁ`Ð4M]×}>ŸßïÅb###—.]bŒ …ÖØØØì쬢(ªªjšfF0lii­&µ¼—ؤ« ¯×+ÍP©¾Íõ’_a­àÜ,dfS %hk\f9Dg/69ŠZ –Å‹Ü`àY–«)„ëaod¿‰€$IÄúækš·¾›)Ç{sb{B0°†r/OÙñ´W[¼—æ¹oä zfœ8ÒØô׏ìS·¥ÒYh0—ǾXüµ8¿mjê<ü๠«Xú€–°yrÚÂ{¢ÀŠÐ xmF×Xˆp<ýF¢7²pêÐ9€»‚…îÚí¤€L€GV;?T8÷MŸ_QP“[[:Cõ7ï¥ãQÏ=w¹vÄ¢2Wˆü˜÷~ÂǃËu_[Õ¼÷„-—>Çæ¦gÆ5vám(J9Û‘nÙ€I®Çp X宀õ·ÈõA'F,««ÄO7˜g•îЄk™—½ãî«~4i–ë½Ä-Â)B|þ-„ÆU3;!l°Xbˆâ<·Y’5Rÿix`UGÉÛÕ~Ü c333ÓÓÓÇ››ãœçóyA^ëºþÞKŠ*Xô#¥t½,?¯×[___“DäôôôÜÜÜåË—cápXQJéàààý÷ßðàÁ;î¸ã®»îÚ±cǾ}û¶mÛ¶}ûvI’c”RMÓæççóù|>Ÿ7MÓ¶íéééb±(Ò ÈF£ƒƒƒ¢ÁUÖz¸—ä5)°PÊ%Ìçóå%בÀr‚ó Žàí‘Y‹¡1ÌTåä]–¡cEÁ H(˱ǔã¦@Q+¢ Ç‹s À‹Y–—m ¤ÌºV¬×¤T’ööÓî- ¤1aŸ/\ .šH,ø©oöÇú›gŒK“Ö\ž\Dmj iö›…!áþcý áã ¤÷n‡,[þΧ£þŸ„àòD蘟Ð6s:ˆiš7ŽJ®$°ŠÜ§–|i*÷Ôë‰'ï^øåÏ'%…¨õ™{¼ÛI „’í¬J”¶tÅ «!¨@¤A¾wOË_ü»Gd³ °c@zôqÒÞ%Ôô tua%©¡»öÒ®-V8—Ÿ¿æY@Ÿ¢ƒáV÷ÀÒuýñ¿ñollzWÅm‰ƒ¾ßM¨âÝbc̶MÛæÉ¬Å8¾ùƒ³"ž"h°)3É.]àSW€å ,›‹Ëÿmø—–½÷ùýÙL ʲ‹Ò•8¶æ§‰¯%Ž`‰S’oSŽ6Ë,egºÍX’$ɲlY–eYkµn6TGÉÛ·S?2Æc7â:¿rÅ)û Ãá0¥´¡¡AÓ´l6+Êùåóy¿ß¿ñq®/* ¬ëÒ¡P(§R©²Ãz]ݲgBq»²,±¤¾¾Þï÷çóyÃ0.\¸pöìÙr«êëëMÓ ƒ[·n-‹¦i644²ŒÂ9[ï¾Ù·nÄ%ùXXnƒu}XwÔ #fœ3¼rtÀßþ`À=[®íÇ`YE`Óò(áeš5RH!rŽëŠÅ¹"b§”Æ$›x1ËK&îÒ†Qý:X·e.7ŠºûN¨.;’“©é;´ÚÀWÿLýͤ5·°8´°ç#ÞC-R‹¨ÇsËQ2»9¯<ê¹Ç{Q?r¸8üs4ìtm®ûh‘뇌‘W0þx>Gž>’»)dÚŒMîR`š¦˜HÛ .šÏé‡;åæx¯þ+-°Â‰­¾¨‘üjˆ”äÿþìBMî½ç{~xþ'O‡#AÖ%· ˜€l€JÙÃ;,xZmuûˆ;¬ŽÂßüû©Š$&ÅUºÙúƒH§H8ºñ/!@}âÒyÑKÜy^(Û`9 ,)$>9QÚð½òÀº! ¬ßþíßþÄ'>q÷ÝWŸ×­Y _þò—+‰ØáááÊâš•«*_§Óéááá5WUP=BõW=BešýŠ#œ>}šsžÈZ‚äº0 ì.@–D\DÝ|\† MòºW 3iͽʯ¥ý÷2Y7»_{›OO,­2‹¦ãñDUÖYeŠ Éz$ÀñJ§ÓgG΢dâ˜ÐSçÌ19“3ôt:í˜IÃÃ`Ô¹¹«š YÉz õææà!.»®@[ܼãIöìÓÆûêïW IDAT?~±À‹î"0½°xž…åó`Œ…aø@ÿÿÙ{ïø8®ûÜû9gÊö†Þ H°SIS¢¨F™’#3¶Üí8®7‰u;¾N³×¹yíDŽËÍ›b§8ŽËµã.Ùr‰$K–(‰"EŠ`‚‰Ftlß~ÎûÇì.@•µßÿ³3³{03gžy~ÏoãöpË–ôÖÄç§ÍëéÎ;_9ÞdìÍ1Í5e ËáS乆ò¬{øÂÀ*±òÍž{÷ï·e©œ»ª,ÛEܧOŸVN¼j=õk;  o<<í†fµö†JK #žêæFœ%º°ðñ<¿ûnÙ¶PÙgÃ0í}°¬³gÏμ{îxøðD[œ7š…5Öp× (JkkkggçáÇ_~ùåsçνð ½½½öQ9ÿ}°×F)/////—$©±±±¡¡Áívwvv666ÚºUGGǶubò[æ?***ÊÊʪªªÖ®]{ñâÅë®ÁívwttTTT8NÆ!D–eÆX®ÖÒëõWTT$Å~ñ¨v UßðD;¿X,ƨ@dP˜Ö3ÖŸëB¸°£)ýÑŸwlßc7P–*jÜójbÿ1VûòÙ–DˆëãöWÞj¥·8Z6È¿ë}èΞ–X,f÷%t%õÒVé­ž½[äfƒ›Ò#öšõåâÓ§Oo‘›÷¹v5:[L €ô8€hïa4´¥:¨H¤'ªóüÇzOÖÏ_0zóú ^+V.Å_asSw©aª¡ôèÛÖù¤ºý%zù#¾ñ»ƒ‰ò'±÷„ðdŒIÔîK­õª÷MÞy4Z;l¦™jôì([É•°"ºlÖÌŸâOƒïûXàÝ; d¿±1+ „fXÿø­ÿðä/6YÆÁ¢AÜÿö³ŸýìË_þòsÏ=—“«íÇ×Ù<–)P ÀÀ8þôß)Á¿òê߆Ãá“'O¶÷*ÏŸ¶¶µdbÿî.ùÖ²‹8ˆdZ(úôßç¿­/ž}Áèûxàwü}ì;k¥UöÏ3ýé·ÜGî}@¸ï ö‹æ÷þ“9!¾ó¤¼Âø‡GIY…ô±O°~õ¸uð¹Çïò½Úâü›…Û#úQ—Í‘ÏF¿æ$;Q2ù—ÿiÄÈ“¶ÿaï}¬ý´ù¯ ÛogG_Þø¶§{î»t^+¥}2ÿϸ²øqä—©“‡œ:h¬Vj;Û¿eÕîUßèÞs›cý±ŸiïÑ”ðú7 wÝ£ws*—~üÿU]Ä ø¡PÊoù¬8€už¥µõp¹­_[ý¿¸Pq·P÷ðÝç9sFïúçø÷|,ðîiúöñÁóÎþ§Ábñäüö~÷]æcÿÅŽ¦ë6’² ºn#™w ¾ùÃo³“¯¾_®{é ÿ£÷ŽüñÛ뉧Öêù‰ý[ißüLX`ŒÝu×]—†Ì¯>1ÞX%?²¿ÀÑ£G“ÉäöíÛgöe?~<nݺõ†ä@(°r‰D"“ &có9²8篾új2™¬­­]³fÍ´Ë\ºt©»»»¾¾ÞG_2ÆÇÇO:U\\¼yóæë/½øŒŽŽêº^QQA)=sæÌØØ˜ÃáØµk×Õw€/¾ø¢išwÞyçʲ®\:¤ªê®]»ò´P¥ÓéW^yÅáp²²²ÒÒR;mãÆSLyyÂÕ9f0=ÂF^éˆuµ•ühóS/w¿áÎÕ«‚‘÷oߨðþÏ^wá¿<÷ÕûZtrö(?y~àÿü8õW¿·æCo½7ú³o¹7Äî-;w½çŒ¿ý4O%¤¿øœáu}tü <”zðpÀ“¯óÔïû€ÝþÜWÿ´á²Æ?üˆ£aóñï±W wÜ#¼áÍù|„産?H=}—óÖwy0¹õGãG@þ¹äÏŸUŽü$õì;øš;.$¾F©åc¹·,ž¼³ð§¿O|âÏ>ûìü[-X¡œ>}ºÐ[zE3ó¹Æ~ 20¦ï¹uÕ¾k›ý¢~ì'°€8¸<;¹Ý–b,á$2Û½53ÒîûÎŽ^Içñ‰G:0teÛ‡’+äº@—HÒI%TIƒ1Pj— º³–?Å$—Ã8N–6Ö¯_üøñ\<üì 1XÓ²C9Û ,—ËE)Õ4mddd||Üãñ̳„´†ž³&Ÿ|¼æ³GÎu‡ü¯ß½µQxÉ0!ή×2tL©¼6D’pÓD6‚S68€) Eˆ®&Y2`·<òÎ%J(Ïq¤-›ì r0f:Ps¦ÿ]›wIÖ0¼ÞiÕ+ÄàJšÇcÄãm”jªÅ²½a˜¡Àä%KihœQ#]èÂjÀô˜?üYùfS¤UŽYå¸sC «×‹ÁM:îÐÚ™ð®W7¢ÀSG¯Û¶ †î>u@Ùž;*¶ÜšyOI)R Þ×-­ßLx•L¯ª@’¥¸ €94 €äÌ ŠpïƒÂm·#︧àa ã,ÊÁ‹…õS€˜Ý|åf`uuuÕ××Oy1;7-x¬n~ì$Ë+û0¥×èAhWb;—|߆L×c°&8©®2×쪒+ êC~–»¤æðfïúKa–˜Tó¨g,âòdºÎ1J¡iT™p‚”ƒøÆÓ)âõ™Ü $Ù®žô ¨¶®uR€˜‡Š $Õµ$Ê´Î=×ÖÔìX +'Á³?ou´Üêø4npÅ@±"*×Ý–i–ÚXÿŒÒu‡iº$ @X’×`zíƒ×K®ÿÈq’Êb!X%”ŠDÌYÌ®†º½–@ÜüÌ€Ç"H ¸`{ãõhôê:†Ü\íFAe¡þíæ¹a‘Ó3ô?šŒËåÒ4mxx˜ÈxÍX…«äÍÁJÇió’Âá0€mÛ¶M69Ú6¨òòòS§N ‚N§ÛÛÛwìØqu¾i‰D"‘H$'WÙÑWuuu3Üüçê­f÷‘æÍä ¬å6Ž‚ lÞ¼ùZÕ7ö>e1†r¶X„—Ë•J¥A°,ëôéÓöj®g‘“„ò»˜\ú…ŸZ¯tw~ãE­w0!‰tuu€÷¥Ù X¦€Jùå7Ù:—iØ,7YÜjÀ  {ªþ%ˆD‹+\C2éÔ9w»áÊ·­ÓdòGR]g7À•4;vx×S8pu$ùÄ[üA><ÈãQRY `“´æ%ßPÑ%k×YEÜxÅsMuŸñ8«¬$j²ï%¼÷²°å~#ž²0˹7uä'`¥¹êL9!b}d´f»”—´õ°b¯Ù\_ÇNƒªºá¡·äÞB×m´z.²öSâúÍ‘tnøS™SD(ÁF™ ÍT‡ÎGæO‘‚˜Í´Ð•°8€Q+  ”†ø& X+7‹_EîÅßVeH®qlÊ îÉd2N«:ïèUÊŠ2—%®0D?ònÊ›#D}:Þ>s€‹ÌԅІÜç`Å'¢|l‘dP ·œs%dºjrS ƒeÂjê×ö=}ù/%Ø'ú¸‡ D@üé‘?ßóa²z°g/]Ý+»! s»ß(æ|<’@„ˆñá|Ä «YÖò°¬ºUOìöv–gÚÇ3͉³Œ8WL ŽÜPRÏ„~ïSÁºgh˜@ˆæ‘ 祊€Ç£XPËnwØäT‰ô†¥”NÕPo=nÄg~{ŽU«VèííåÌ›%ä)`Ù÷Þ¶ª¾‚(\%oVÄ8Z–59ŒÉ&•Jiš&Ëò´%º^¯÷öÛoß±cG0Ôu½³³sæM؆††N:500`ÏöGFF‰„Ãᨬœ&‹ ‡Ûí&„,}#Âɬe8޲,_K4,4"œÅÊÉZgžx<žššš]»vy<»Û¦ yªÀSà©>®…‰V=ÌKïüÍi‹sòƒ£!ÆycmP)Ì$H³°˜©flü=A¶ !€z±êÍž{ëy)LÑ¿D[ÀBœ¥ü-™cñàÆQ¸{  ¡âk.ç`­G¬ž±^xf³Q™(âð•ÔNYö\uÕ3AJ×àjE²Ö’n÷< ìÙ+ìÙK×n¸Ö2´¹Å^Fس—”WòÑá?üñxEÄ@BSe¯2!à¸Ð À¶ï8¸ÎÊüf"maFÖsêÑ¿Œ|åñÔs¹WÆ£ÆG»ë˜Ž´‘œùƒ(\ P ìNާHï`@‹¨Ú¡õÂÖÛ¦Úß²&,ëàs{_[Ió*™vòn•éZ€b¤D –@0×þR¢,‘°h€ƒHUbYšp°ô<Ÿ_Γ¥8w¼¦˜ÒT¸ÀŠÃ.!´Ì©çeÆX:&„ëˆ EŽL•W$ìj&a֧Ž®A꣠ûÝwçù–€èOº)8çYÏ„¸KÈ9°’I¹ ¬r¡81¹„[EñÌÓ‰â˜éO2dJ§;%J28zú¥î~ ˜“üF1Ÿã‘Bj’2€½;#`9–£€à-žûì–|ïõ>T%¬¤œ²<™íPÒÍ·`'_ÍXíÓçñð)V žhï™x¢H'n©y®) 1Ël, Û“…ü,ÕÕÕ¢(F"‘¶¶¶•rSW¸JÞ¬ˆq´ Îy[[[<WUµ­­-BòIg¯¬¬,**2 £³³óÔ©S­­­‡J§Ó”R]×)¥6lسgÏwÞy÷Ýw·´´‡Ãº®‡B¡æææ|ö°¶¶–244¤iÚ¹sçcº®www···wttÌóã_‹ÉêVÄ8æ(X3°àC9Û¬«EqóæÍUUUy.ÿï?>õퟷˆ~å¾É´ÈOOQ_#ãü[?=à-»E¬"Î"+]ášh§°ç?›í÷Ì}Áä)÷vã#,\jKBs°æ6Ž$T$ìÛ/ìÛOjW]s™º{aß~é|Œ—úÃi_ŠAìG¶“Ù$7ísíZhàLd'9*«ðéñ´ ‹:uêÈ‘#vË‹Éh\gé~±4ëH8?¯RR×Ñåõd4 KšÔa¤‹^ÖÔ9uºi›°g/½ýî«ßEo}°g/mjàOY.sÐÕCžWúy cÑ1P*džŒ6ˆUŒF€ƒÍ¢²rά¼‡–9»wï¾Ñ»P`^ðLw‘©¶t:Í9—d‡añ"á½?88ãÊ@b\€Ù_æe"ý¶ûî;œ[s½Õ®KHðÇ<ru;Ëv`ùkD˜q`¡L(J9…ÜëÌœ€Uµ%„Óí¿$M.›ö%%9°æs<’`€ò$f±LÂeéÀ@A?ìóÛ<÷ßæX£÷eQ˜íPÒ†5Äàã£ìàsfÕy]²,æ­Õ´_Ÿøà€¼,vêsC(\åèíííííEÞ÷ ¢(nܸÑ.tºpáBþ½®’7+bsJ‡išÇ?räÈÈȈ õõõy†ò¬]»V„ÑÑÑx”ss`MRZR’W1ç8Þ>üù¯éŒÿÙc—ûÀÙAÇSÏ~ÿ©ŽöKãn—kmcå;n‹Àv`q – B!Îbb¦0M²ç¿y;q2yíF6MÃ0Q¾zÑ@ÄŠ—ÌϵD‡¤Ë-Üq·ý# ]œb~í+¾˜ÔbFã3ž2èº>>>žJ¥®nC¡s@b’€M3ß?:üįÀfJ/zöˆ(ÐxÚÚ¹™“GÇ™@x¬ ¯ß/ìÛ?íKÊ*„}ûé¶íÊÃ&áÜt9¬€€HÐÔ$몛»Ya‡^YÛU×®åƒsJ—óÇ÷×}®7z/– ”ÒM·`:°°-ˆœ.ÑB°"M:.…-–Þe¬ë¤þäeÁ'[w5'|öGÏ~á›GlÚØ’æEïÞö9yM…›)€ÑÌâ/Yáªdצ‰ù;°¦+!œ.KdœsvCJçݺfŒë ¹J­Éão ÜoÄ’Ö«jSSÓæÍ›)¥¦iZ¹€0€Æ q>Q-MgÆèÿý±'<64Ã^±´`lÿ0ÓðØ×ïª`:}½¿qê¶uåu5Õq“UÌ?Ø3FI&Á¢—ÏFÁR¸&Ùõùg!ÙnMó ÖTý+ۅЗæƒ›—¼,{þ\ÃI·lgm'HÝê–Ò]²+™e T„ EgßûÍØŸþ~ ‡Ã¡(Цi“OúU%„㪀žÔé+§‡¼¯îZ›Kh@,©W6‰E+œ¬*Ñ¢.Ù}½8q{ø€»½B €#¡0Õ6¿[ÛÕ¡wç~¶©JœÄ¡±DWÞ¹»À2ge¥ ¸{^dSO@¶€51Ô„t°6vÀÓ¼»Gí@…¥È‡ªJTŸÝ¡£·w5{RÎ:°0 0f Ä!¹jÅò¤Ëv`¥ˆ±&RåaSV F‘r‘i,Ûs$›\6ðZÊÀ †ðXWÒÈ\;é˜?sJRR–‹{ u ¼C/ŸÂš‚¾qüà.¿øñï<ñå_›F³*!@€˜êTÊêêêJKg÷ð¶¡¡A„H$ÒÑÑqøðáÖÖÖ)OD—…«äÍÁŠGû‰”}^]]=õ !dëÖ­ùô¶—$iãÆsØD …B9K×bÊ­Ü ¬B á Ìv(¹³Ÿ±ŸáztÚ&;°¸2È“ÁQ:l=; `ç¦JŸ®ڳŸ­.]é6ܲ­èÑ?¾$"ù>pû×£ÜL ’÷g©ç¾•øyŸ9“¯'Gš«‚Å‘+ Ì{É)¬)~|;ËâeQ‡ýj)Iñ·ß.êo…{öͰŒ•úê:J|–(pT5LÀáp઎„¶Ëà¦Â5ÀnÎç¹c£[¥àèÙ±6—`š¦QWUCIæ^lUHxóÝ“âü=1PÀÔXZœy'÷OG©f1ÅtBÀ" õb¥fï,I#‚«À³²Ò \=-r]u޳k¼ÏtÅl©IÓ²;ˆà0jENIÝ%c&æêÀš-+ƒ Àñ¡ÈÅRºLjèÍ:°t€&qÖŠ²7DÔdÄ ˆÑ€hUqQïhi”ί\$…¼tºÇË™ ,d¾›e\Cw5ó:!<Uçu¿X<–Û©•x}ð(ì®;*Ÿ;ÜÿÓ_ô<}Ä:âœÖžà_윀e3Ÿ›2‡Ã±nݺX,¦ëz8ŽÅb½½½v‹ÃåÆrÊscEŒãBYò¯¶[» !„Â9çœ/F¡ßÊÍÀ*8°f`¶Ciõ>ÆÂÇðô€Øø»Ó,0ÉÅ"§­þ_@pТmbûfUµw5]ýѧvø­=«ë*ýö‹­í#þäý· ÿèÇXãpÊü=5á_ïu}æÁ;+t/¦pËFÚx¦¡èe‘cZû!íÔmŽõö½yæM+\“l+Uþ¬+K¹%MãÀ’L^1nÑ^Ò¢ IDATK*ò]ùU,·C’z¼‹Ðk*e£O ¼ØáOW—{í¦“šv…jcg`ˆ³”KppmTƒów÷•ŽœîoÀѳ×Îq×uEtQ€›qW¬.î>ÖãPW¬‡ƒþëî*™$`Ÿ_ð™€?ijÜÐÔ*ÏËW2I´šìÀÐ Ukä8niKP©Q° (pŒMSBÈ9·Ãe^>5`KBC[h`€‹êɾdÿ´ˆyfÓ e>¬)Ú·â‘_¦_ $S;€¤dQðˆ±RI®Ù îÄM\ë€K< ÇRåÁ¢±4I§xüåŸ ýÏé7–°Xf¾²¢¬ù@¼>ˆ"Ò):WX&c;ÕÓlÇžÏÐx·ï ç8Öãο ¡ýÜnž¦‚²²2Û`‹ÅZ[[{{{‹‹‹}>ßJLº)P`AX¹µr‹*`­Ü ¬‚k¡`ñs,|‚œ±ñc¼ü.âÚ½îŠ ,#–ÆF3_-Ù>Ÿ­ÿà¿ÏýëNOÿõ#·H«fÇ¥°(ÒMÅØ†‹pP@‡‰ßŽvÜ^¦q#79'Žbž¼dÌ´{½Q–iÉÝeô_wÓI–öš³ëBH$‰Ü02Ì´,;ÄÝâk{utÆ¢¼•…×SÂ0À]·}‚~m8"§ªË½¶kŠ€U¬D÷&Sˆúœ%¸2 âtÊtͦ&÷‘¶îtZ5ÝÎ+Dë©'øå>ºi›æpº™(ð¬j(í´[Òcòëï«ÃÁDJM@ðøíðÓ@ÒJs%©D8]×7ÒÎôUP·“8T®á*kµX“u`-EÖÊ»¤(P`Q™6Ä]Ó4˲$IîêOø]VC‰A³Wú8Op3 ˜K¹áö—𧬟§_x1vÀ˜z<õ›ÇS¿ù)Ž"ãÀÒ¨qQ€ÁMœ)­qα-èÍ7ß5Ïé¹ ,;5൓BH Îy, U€åŸhP`©°ku= 7}óÞÌ<ø­ï¬!§.»tm–aê zW***cÇŽ;xð`¦E¯=V®€µ¨V£Â×2žJX/<“ûÇ®/‚¬x¸euÿ€PµO¨¸àfïcW?C™üwÂõØ«=nÜÀêû)Ìy]Vž9˜é™ûø¯ÏiºàäÁ3¦ÅÖ9RâW…e‘Uå˜ ÂáָʵÜäœ8J°ñc,r ‘¼+#`¥øõ¯¼Ÿ}ˆû¤ ,Æ`Y tŠ‹ˆ"‡Î›{u¤yc7o$Y[“cífÎ%¥>Ààh ×(!¬NEö‡“ûÃÉàÀ«ï‰øÀQ—S Ëþÿ¹¿È´xëÙaÃdlÒœ‡uœa]çXÛIætðˆiâ,]]’y¸* 'óp`0œ™›É„? ”`ƒÖ×.Ç|}¥YÝj² Àj©Z'cs1àÏ–‚«À‹Åò J(°l±O§œ3–e…Ãá±±1ûP·›ªê.ƒÑ2, ÀÍE S¿øJÓâ>×®"a xÉ+÷¹võ[#íì' é”­¹h2\Ä ÖQ—‰SãCÉ~g<ÀøH‘ÀûzÀwí ƒedvϬ–ó<I0ÄÇGy4\°n8ËîÔêñð*,ÍÕ†ûµÃ?ÃÚ†à{ßµæÅ—†¤3“Û§>Ìž‰7B466š¦™H$4M;uêT}}½=¿,**²,ëìÙ³œsI’LÓ¤”ʲ\__ …z/¦gÙ e9±"Æqå*5‹j5Ê}-ÃVøpüä䞉k¥UõâìBè—’°øè°ùíåáñ‰—t]¨ªY¨õ/%×?$-•[*‘ƒ,|œ«ÃÄY.TÜf²ÑCp?˜Æâç­áBõƒsÛÏÞÁø…”_´jdãl ÿýÒ¥7Ý»¦õð9[½*D ¦AjK8 8À}i¦Á°B@ƒëÁÍÜÚˆ¿9¦ ¨Î ƒ›™i*¶âͳ.!œ”5m‚{vm·Óœ:×ÊŠåÀܯ§ËíÔ:Q— U Õ^ÀÐx À´%„”>¸BJþøõåca+äËLs6®)j©KÿÉ—ŒÇ”g¿ö¶\)†°ž‹Âm‚.…H†!¼Ökœò{†ËáHªDoøœ¯Â_T/9l…Í1ßBŠ!Ôgã*–‡¸¨àÔ¨1zÍžŽ ÇÊ»¤XæôööÞè](0/ìk¤ièÏœ9344ÇŒFM[jâ­Ï-Ÿ`)N& KåÀ"^q¤´7»î¾“nPê*{³çÞ;[%šKçöÅ@—¨ƒdGèn€ÑDŸ3®0>R”s`][ÀE"2ˆ@È,žY-æ{<‹°W³öÓHAÀºq,·S«=¥ó(,ÍU=¨Ú©~îcwxW]“àȹÙ9°ìRž¼W•eyÓ¦M;wîôûýŠ¢´··wuuuuu=zôøñ㪪jš–L&UUM§ÓÑhÔ.‘^–ÛP˜+bW®€µ¨¬\ áAõø[/ÛömûßýÂblq¡ Â}-Ö³ÿÍÃ㤺Nس—¶lÀÃ3%L/g®{Hrmܼðup“·*î 8H ô©ÉD“3°Îö(mƒ®³ýœ–Ý€§æ¼ŸÏ¾Ò `·?ù®²0€ïÿw€“ýi·ì^/òsâ›Þ‰ªŤ< SÙ$–·^¨ÝŸû—ð”[`>êöP7ò0aÍÅ%‰`˜¸¡crìlAP5j›7仿éXv§V[À"„x¼dõµnÀÐØ„ë*Ëê Kÿñ‹’{§’Û/ ·†|ðÖ»KF“šnõ'3oH§ìÜ^nè—ÄrO ‚³ÎϾýþîÿûÁnLòªÿ0݉Šz| TõÈ”ñsáS.À¼“@Ji¹2ÄÝÆ-ø„ñiÞ¶ÐX˜M›6Ýè](0/lG«Ý„Þn¯¨¨°ëqþŸ¯°µ&Mܵ¹å3–e;°–HÀ¥Äëã‰8O&쓾í“òQ€´[t¦  Ð$’°¸Û…ˆIÔ(:¸¬«jHÃaÏ^ûgië¼–۩Õ~\GÜ^P*¬Ùlµý¤"xK`æñ¾ŒaêÕ¶á¢b!ä“Ô‡ÛÎUܶ¦Úù¿?¸ZUµËÃ1  YûSv‚xÚjöiDpR"ݾ& ¥3ërX®¬Dåõ€ßÄ(‰EeÝNA™WB%B€Ÿz¯ÞŸzâfAÀ*P À’39+'`…B!‹ñç ÃNp÷LXî¡ñ½SþáËÀl ÉóÇçG"Žx,')OX )xd€&gVÀ\^ KHª €¸\$¸J¨½~¥—$è&.-•B·< Í-“ÚØ4ÃÂ^SOÆuÙPâöÀMœek Ǻç³{O–eyË–-¹ÿ655¥Ói¯=±Ë.€BW¯7)+WÀZVœ§†¬qq½Ûû }U;{V¿˜äË:2oáKÇÇÀÎ-*™xå&âìÅñGûî`%¿<J2¿Â&>Ë<¨Ë[¤†r¡øê_Äb)#:ÏMäCAÀ*P Àp„Y˾ÙëìŽ$ÓzMH/ö1âžHˆ¨;?vÏ¡$ºtúñ8úy"Æ3,uˆÙ>¡ðM&Nd,Ù ¦Â²fp2 ?%@VXÖü!µõBmýÞ‹Ë;KeÖ€õð—£”•ûÍá¸ØÕ]SÐ~1üü«}yû–VfOÊ— ³¥t²z…BW¯75+WÀZVŹ‘‚ðP€$[ÖÖ-vZ¨Ãiß럒Œt š:ÿ¬œåï^¸ôÿÕšûoÛ ëw¾Þðæ{jÞZš.+r ’Ó9°rXÑðØÉ>€#á$÷I~nĹ%rè?=£jæ{~k½ß›W…×Ù®qݰZFq‹ JÖÂ~ôô9= ¬a«§‡úš Ž€â^… scòä|2¶€¤>Ê(€ÔŒÀç€Ã"À¬BÜEü|o^Ÿu`½fÚ¤®^|×l×9@ÀÄêàdçèùžHIÈBc†aH’Àà¦ÄÙÉ>·ýöcíÃÅ!¾µÊ IQÊ…‹š¯º;^)MQ2ƒ•s`ED€TÚô8EÊ0 !)?ц»Ý ‰ÚÊ-.³€²ˆY±’Òy~ bõÇïžöW©È,¦Z‘RaqCEWÞ%­À2祗^ºÑ»P`^ØyRÉ„ªª¦iʲlŸ‘[Û‡ÜR—&® ÐlQàŽ«Èº ž½¤¡qévÔçÀNågIà&.‚-`±áAšDs,§;@Š&‡"‘æ{ñæ’˜ýa…]³ ÇãMÃrJâöð¤YØŠR?‰ˆ•n[•B6æ£o(ñÞOýêß|Ê0g² d2°·¯fQӲ܆²ÀÜXãhÿa“Uùn³¬1@z2µ?^âB~}Ün ûµØf«\;fBBÅX±&¬k’=ao¸³ážxäš ëܰóóßü__|>£J>0“SÞ˜ËÀzáX¯Å ‹ñÇúá,ÀÕQM·þú_=úõ#';GòÜɳ]ãZJRX¬c;îJUe‹q[B 7Ã\ ÿèÔ“qJîj^…MîB8…ˆü¶›â3õ€ ³8æ"`IXçYöê¡k9°åvj%ݸfýeRMHß³9®ëÖûþòÉ;Þû½±¨IU„: ®‘³ƒNJ¹+ˆxR?{!"„,F «òôº<²%¶‹1Ñ@×5"8r&g*ì$’×wîò°<ùŒ””¨·Jb!Åó°f€P'ãÏ*Gþ.úÍ£ZÛâm« `X`vïÞ}£w¡À¼°'v¿ß¶_y<»é±³Ã¶Õ*Ä=Ñž&Í•`’vîöí§«›—l?‰?€9Áε€ì@/u']¶,‰+3°ˆË  8fPT$ùúŸœìVš«p<Þ4,»¡”e.‰²É%“È…nÁùÐæ€ønëW¿âw>ù«‘pz<ªüêÅ‹3¬ìÚ –^ÀZvCY`N¬ˆqÌÓÅXüÜäÖf7œE=0íÕÆy ÀŽæ[y*a½ðLèà±½GSÁÈblq¡X`+< €MÜÓÚbÖ Íq¿Ö!y¾' à£ï¹åãû¢ë«Ôüíݼ1Tp¾p¬ÿëŸÆ„+>å¹ ¬çZG¬*¥ž;ÒKœ¥ Žö %ìÜØ3òÍýië°¾,£“Òr¼qƒ]ч-µ™yªÀOJ|E¾¾´¥qqÎÝÉheG›Þ5y…‘l a> ¬˜%Ͷ„°a ½õuXg;7 D^ħ¹ËüÔÊáð;ÆK+ýɤb G4L°4nô\– ‹”ÖZ Û!P Ñ5‹Š=RVàËÖðX)¯LHn„é°,g‘½€×¿ªbºª½« y+¸|™…m«¥×¤'Á¢ÅíC%888; »d^¾`ô-Þ¦ V®€e;õN+`ݲ*MüÅOÜEþæß¿éc?ýÞoF€i2°l9p"à/ß]àù£}*Í8°z3š×™óc|ø?ßðá¯u^è™y2¬a«¼qëyûW[Zc’ Ííh÷úýþ …«\çVéÐÀšO*/O^a4âžq`Í\BhÅC¶p!èê&ñ·ß‡“ð±`6î­›ÛUJÌ·´èÞu;6V„ã&&Å`é\ïìv‰ù»w·üùëÖÖ•9B>€hªD¶Û¤j«J”Eð-!4Ó’€H[À‚;£Cm)ݳI^“×îÕÔ {ö ÛïÈü¿¤€K1Ò²ú®•8çàv;·.Þ¦ X ¸~¥€eçÅ„cj÷@Ì-óµå õL8°â,]‘d¸©kê®~ÝGÝg«¤Ëëv†äÆg£Ã—Íç„Ë  $nPœÄ“·+×0˜È¯ÝkvS<~‹7è’!!+`‰ò×õ7mzBðî×=ð‘Ç^9=øåo½êvŠïm./vOYÕ ¬pZzVKF®j†e¸‘°½W\WåíÙõX±½§REßå#C¤¬‚C¬³Ý•64®O<÷Zf,´k )*é2úÿ=ñXŒ%ît+o»¹¬®¾XiP¼{Éð`ïxbcÔ*íìÑZ.ï}Ý–?¼ù?=ÓÚ>b˜ì­ï#ÜLMÉe·¿çƒ'Ǭ±T»GŶu8Þ1òݬ¬WGº/gäÎg÷(š àD[oóšk¶²?×&ëêT4x»Õq±¥*ÝT)¦ÂJI­ÁùjEàãCé–xªÅ2êñZ€Oa×9w¨ÒW F²Xã$ŠüJE‹³l»$´±™=ÅÛN¯­ ¬©˜ðSËÓœúæçÞùØ3ç_zå®t`µž÷”‡$û/é#ïhpA—*9Ž9LëIv¤¬ Gì 7Ö•"aÀßÓËÞU>À-ª¶LF}Ö0@¾gfRV)ìÛ?ñ_NT))_°/aÚM .¨«jÅŠÅÛVÁU`9}úôÞ…ó¶C§S©d2 Àãñô'¾ð£œcSµ"ŠÒ%„é°Sç†,äˆ¾Øøˆ@‚§h\0ÉåH2i‘wä|î9ÕJ»fŽÇ›†e8”Äãð!áþúÞT%dŠP\Ä¥Q”ûO¾Ó'?´ã/>¸£®Òÿ–½Mþá»­~ýÈ_}õåiVà5“µ ‡²ÀX㘗KËÍéËÈ|´!î·´'ö¿”ÄÈ)¯?üGv‘”?Å—s ÖBg`H†ÜÿNŒ%êÄʱ €…—‘/¦=$;{Âwnöß·ÍÓu±;j•ˆGãÝ—ÃáðŸ½ۑgœïZ‚œqãŠ,û{þÁSçüñ}#ƒï­þõ‰á”N';°lõ À™®™j /õÇͬ J NhY†àM·›‹Ó ¸äÇ$ñ ÕÁˆ(T ev³OšiÜ`œCV¤ØÄß'ŸÔ…0Û…`ú¿Þ1+:nÅìBjZÀ¬]T´y=ÖÓ,nÖ2?µR÷:eEæ¸p÷f9ž¶¤Òé0¡i­]U%™û…ú*ñö  aÕZ2gO+‡“*€Á¡0 ƒ§’/«ÁÎ2ËëÓYV¦„Èþ9ï°]E8ù‡Å‚:ø `‘íW(8° ,8uuu×_¨ÀÀ4Mιt½«Ž=/*ó¹ÂG¿ñòýªÀ¶Úõ­•‡¬±“úy±±óëÕçœo_Ö…ÃOÝ, @ÍX™l;°€uþõ^1ïg9Ýj¥ X…ãñ¦a9¥Û €¤Ó;·M¼Fœ%Nƹ¥!£kèáMn—àÿ>Ñö«/>´ïîíµW¬Êq¿ ÖÒ XËq( Ìž1Žùd`q=Óëê  È<L~¹—uuN¬mó­$8ÑËÖÅ6\P˜·îrí{ˆx|ðøx–dé"˜ÏÎ/ ¬ë…Çò\6¹µQ^óˆÿmÿYü@D\asW’.ök»Ì@;zµ nåÅ.9qÂåòvƪ‹]'OBÀ=·ÿæØxo,ØàMÂHdÝd ŒÃãê¦Zó q"îÞ^yëúòcg‡?ò_uõÐHÏ@ !¯¶‹3Dm]cÖ— –ƒ„J ˆ€¹ý¨0´»b”¨ˈì!^•é–ʘSÅ•)W)–6¸é!.™HžLÖô%„íÆÅï%Ÿˆ Zç„Ù:ŸIs ¹I ‹9^æ§VÜ`]þ…èêÄŠ·ûËÅÎm@éà@¿Ã[ñëCÝm#ƒªA7×gκZ\‘E Ü¤Ðâ6¡¹ßPZàÆ<1q|ÇŽ‡Ë¼vœ©; ¡‘´ìv@ÈõΚ¤¤Œ÷÷Àb— nFü¶v[òԚܤ `X`ezÕcÆÉ“'›››¯+`q Ô“®q÷qΫ««ã)ã±g΂Þ+¼a]ŒïpH=õ”r@KD û½3¯s)ñQ/€K"ëÀrGæwî‰Â%»ˆ"ï‹÷а ÇãMÃ2Jâöà©+Y{¨S¥$Àš(d¨¯òòC;ø=òßýç‘ÇŸ=?EÀ¢7NÀZú ¬e8”æÀŠÇü¬Hö‡›ÇÅ:ÎX¿y2÷_>6"><ÑúÝþZ<ª5Rå­yø]™W½>¾´¿†‡e9°‚»¦ñd¢ôŒtºî  ›Ë_Çh›OÁ² äíR_t]·,«o8Õ\_2í@ W%‘ž½09_æ%†åT]™À×9¨gipç¯cÁ¸»Ä²F4}ßë‹*ÄΣÁ n&'Ï mK3Ø'î%„9àSÞùÏ<ùòâöyÇl][v¼cD Ü⤽WcœÓkhCmƬ/Ñ€ø@‘K8†*ýão¹z'åTÔå nI%%Õ``\VÜ4¸)¹úAÁ ›5ý_o”%8ã¦3S?8k  „Hy×µÜO­.7º€­¸=׋.h.H©ìG¿îü—œ°—j©Î>º)ƒÇF@ù;^LÿcÜJ=Bâå³|×Þ‡€@ Ê=)»„Tëß9Ïý%%¥Ù»„Ð @dæB|Ž9Šo[…Ân~4MkmmM$ùLz8ê`„€WWW777÷—íŠfÞ³£ö“{;×Wª4¸@x cïÑÔûßÔáà.²¨?|Ô ÎÒ Ìà&µ/óàœ”¼ãššÂ34«[Ñ•&`(°ˆØҩɯ¹‰S±å(kš$Ž×m®p¡/:íú^#%„ ,yu!Գǣ±Œ¬ù:°â1tíza÷½vâ¨õÜSÖ Ïð~–ÁL„Yý['’4íšh¯Â“×ð°,PpçÑqJÐàé-¼d5¶¹ÖÇ|aüòø¹ùobÎ(ŠrñâkÇÆÆ:tøðáË—N?ÿüógΜ Öäo"©oxä±õoúæ3/2±,Æ·¬ñÙEäEv.ï|²éDosl÷îÝ ÖT9;Gœp¥ Ñ´CÜ9¹£! ÁÁ`ûÆŠßxç¶z®t$¢‚ïl°µN© I•w_ŽàW]ÐbIí‡OŸpKy Ī„ +Tmr:ÜÄ €Õb)²–¾4Ó¸G檚3aÅX@€zdXÓg`ÅXÀZ©¾Œû9¥°SÛ„…•÷4w!.úŽÍPÓÝÈ Xœ“C'ÜuoÉïí«*–x¢CÀ Aà‘8NkîÍX_uË2ΑˆÑÙ§H¤¬Š€–)!\¶+â›{b^.€S¹_Úâ"çX Ü䨪züøqUU‘ß\вÌRO ÀªU« “}ë‰6Ú‡¥Wq§¹ZÞÞÿúW’@¦sJ v.ÁÀ IDATT½˜Ÿ`vä2°ÔŒýjâ*K&‰VÄ5‹Ð.âpLù¡@ÄíÀSS,•RÜR¯~ÝXp©?Æùå ö]Ù ±`¬71y9°´l áMäÀB"€n¿ƒ¶lâJš;l=óKÐõîRnX†ª‹Hl\;ñ—›SâÒxÚHa¹^êð|Åc1‰jå¯z“Åæ°)}^Xý^)°Î ;?t¼ºlýü·274MëééÑu}íÚµ„±±±¶¶6ÆX8aJñ¹…±±1MÓžy©½¼¬ø¶Mµ£££Š¢üúPÏöfù ;*^·ÞÇ8Þ¸ïöÞÞÞá¡AåŽah!îê nœÖ/¼Ëû`mmí¥K—JƒÒc"€)XºnX[ãò9-➈f/8?ò[ÁßûJ @E±ç޶僻ã鮟|ü‡5ƒ1©­k¬ºÚuBïÜéØ8ymÿçÛÇÂ1u×–ªÝµG9@œ%°Ã%'@ 2â•ËÜÄÑiô ÁLõ€ƒ¥0ͥ󬀕æj>Q–D¶ °‡ºbÊAôYl©ë>×ö ¼ÄÂÿ†4€nÛa_¹s¿_‹È2 m‰˜Ñ36×Ë­q¸Âéó£’H?ð?Jww=ÿJê6MíçnqhÔǨ’¼ ¹aêt×íÎíï{ô¼ u³*(¾2üÿ³÷žáq\çù÷}¦loX,zH°÷^LJ"%J²EK¶lY–cI‘Ç%JüƱåŠåÄ-‰c;‰cÙŽmÙ–[Q/I‰%6°$@T Êîb ¶ïl™rÞ³¨A‚$H€Úß…KZîΜ9³ggæÌ=÷óïþµ•Ðp4­Ï7-üºtþÿ_ 5™ ªdÔÛüñ6±{._y ;ù¤R)õÅÀÀÀÀÀ€£-±Ÿ¾â®)µýÅK~ýÒ±5óÌ~¿_fc±XT6Fd™.Ÿ_¸yU¥V«›ÓjªÖÂb{Äå40‘}Rë(­éó9ù®£W蜼¼â“щ„ÓÒŒI°$YQ/eªCÈh‹3=º~`g“ã®U,€  Xx³yí9Kø½äñÛõkôöG¿ð­=’¬üå§—Í­²§Ï¥ìáºÏÆÝ°âCDü„Z-šr®p¡¦f6_žÏæ2š,oKš|·h‚‡êczf(„Pu`©#£OÈ)AI.ðï {µÔ}䦯0N­z"QƒPc®‘%/xÕÄnXZ¬(î50èt즭X wȶ¦œ,Ì+9ùD×reàüN}ÛóÆÚ…Æ5¹e%ç=¨UÃñf œðѤSìÀš¾?ß,Y²\=ÑhÀ‚ z{{q7i’$¥!IjàòÆüزûˆÆ àœÐµ=¢P–™ò‚¬W„BS„Madw‘0F‡^V£U•?V;ÃXY²Lª»¡QnÑõ3€l RüµªsãG޾ð†eáÇSìkŸˆla–›˜K‡*iHq0< ¤8•b„Ÿâ<)—ÇU˜ŠBcQBLÃå{.è¥e(!@G)·•Íìì“Î<{"ÔW°«Ö;)(¹‘§¥‹r•ç+¥±^Þ» €k].0 e÷‚°¬c•â«S¢lá"Å~éhªñÆ XåååÑh4 zCÒ/wx¶­¯üÖ_n,È5üò¥_H̳ñ=ÞÔÏ_ïß¾±ð7;‹ç<þ±E›V”jx@ðþá€;óÖUúûøIjoâxœ&>yT\ÖÐ à¤Ü„Š{ }$ÎÏá6üëœmËb?ø&t»"óý½_¼Ç"Ét¾½°¡_mÐ-Ù¬[€è ]?ðèÆ°fÅ_ëÖ-s¢·Ï‹¾ÝŒGÿò}hGËNµlä¿pÿò¿ýÁûprËšò¿yx%$:€ÛÀß®_Ë€ä*~øX“³­P¿@›;ôU¨9°–´§€5À’sÉßo”Ìó!Õ¥†0½¡°ü>(1%N@,ŒR˜ÖÖ @oÀP¶4Âsµ†t:«‘]·¤8!ŸËf‹…Ýø¡1«VG*'ëgËT€ûáß(–Æ+|þ“KöóˆnºŠèB8#v`e¬,Y²LJi*•"„ †ËœôôôôPE ŠVÀ© Xh¬ªzQâÔ×Ï(ùÓ­B GX=Ñ&h*(Gpk¸á¤BW3Ε%ËÔAìp< NC“Ñv Œ.© X¡F„/\«Jï ;Fçq¿q)°2ކ¬€•å¦ä’!„4(ÑØÀh¨G:Œé!`]ՈƢ ”˜-¡Ü½ËµlâyÙƒD‘[Dßïô“»žïó¨ÖrÒèƒHü-쿵œhj ªwYLš}íV†òB ª`®iÉÇ[PMD<@eñ…_3kΩxƒW I%…ýÒŸ¿ò}*08Ò…ñ F”¸jaL z!„YTˆÞ@_kì„·Ú´‰(r–̶/ŸW°/˜ŠÈ¹Ì–ñÊ)ª±rª’+®äŠ3oÖdþ_’§}tmCô…S¼Sg :°¦TÀš>á,7Ó?tùƒC2™¤”jµZBˆA0qa*•êëëÐâÏóû½ú¼QÅÖ41f²WvH½…~ 3ý‚‡°0F~%@;Ú5d¼š” C…gZá•ìñxÓ0‡’aH^>(¥Þþ¡÷ D×®×ìϱ±E[/ücìË«óÒ¦€¥Þfs`e™,3b/éÀR3¸MŽúŒŠN›B„W¥ÔDÂ0ºä–O ú- €UÍjxõÔ™¿÷Ëc¿|©¡Ï-t×,*ðGŸÝ” íb÷Õuª¸ÚBOFÀ*öËyfcYš±À2<1–”£ɢÅ1>ª}’÷ÚtýRœë =ý\ýOŸ?}ð”³ÏðÓÎøÍΞ^oê3ž7$ÃÞwÛìCgc/¼ïg9C€B‡qò’‘‡¤_ÎXƒÏK.“’gÊ]'ÒŒ¬(ååò|¬ï¬ùê=À×ÿc4hê˜]ª eÓc¹Wè°6DôE䞗ijßÏTðduZNùíß/ûñ³‹·þl`áã1ìØ× `óGl‡Ù“»u=®ç¤cÌÝúŒ7‡ð~Ñ×ùK49~-¤¢úÌ­µ¯m4í]Wöß³…MÌì¾ôâgv!!)±Ù½é¼S­ò¾=ò¾=a‚5 ‡©sQIÄ•V!¼>Ì€S«Á"€è A³Nð¥OÎÑjXÈ©°’ '/oœu5„05nÃ4á.±¦ˆ®Ìô  È„ ʉá×SCÖ•å3B—?0¨°t:.c.H)mii‘e™ÓÙƒ ý¬r½¬P_` ­Ò€VbE ÉŸ¾–™1zä€OÐq`©º!“Ê5¬[ñ3슒=o¦çP’ü"êvRo?)Íä1}»Ns^ÏmÉÝ~áò4¨>÷]\(`©ŸNuwÇ#›+Ë•1#ÆQU:.&`QÁ©ø€Ö®…Šÿ(Mô3–ÙCýÅU9°FdpB I yXÙ–n^JiãúÀ¶ÙŸºkþ²yùNOìCÿaWкÅj{nÓ¯ €Nž10º|Ö^ÌŽw;z}¹ªó•$Ñ€ #%7% ƒÉ_;ܸy–í Ñ¦ XélûxtÁ™ê£tœHðËÁ'ë»Úf+ü¢ýÑËYþù·Ûž~®^}ý“/WìkïwÇ’ï<å4è¸ûo¯ZÒ‘£_2·hçáîï<±qÇþ®ƒ§œ÷Ý6‹eÈÈC2ØÚ72úC³)O©rÇ ©äêÆÑÜ÷éøOþÅ•ÅxX°YüüçÙYÿ«†^öÅ7ë ~ã‘2ÅLË|r#ëD_ˆp“jÞe­>OHj™o–5¬Ru[*ædÏïÔszjØÔu%yÉ(¢~k1kÑÔD3jµQ” ûmÜ¿*÷ / ¢rý1²nSŽ+ø—/WÔ§ÓKVTìÝ„“©–y|•šVe0ÒÐÖôU¦ÿ©•è  H „7P $âîNŽS‚˜°qE¤Z’0ÇQpÔììJ¨‘Êc©“[ }ˆ¡ôÂg#E«l÷,Y²\—°(¥N§S’$Y–A†µ”IBˆg .ÉJ¾UáYJL™3lLI” H¦aúö!Ô4X~Yu`òLeŒW &,+>–!K3ÃXY²L)$¿#ÂRð„ã 'RI¤OÆÎ1ˆÖ^âà4uùbBR2èF-p=mPÃ]ʆf¹y™Ø¥N+“ˆ&G•@=õ(¹‹½¸€EÓAÂðàLSÓå W¥ÔDÇq`Å•„ßÂ0 Ëküí !øê¼ùTŒ”°g7ÌÕíoNöÔõÜÞ#[ÌÿÆÞ<¬À€yÜ|ïrí ®¹|5_ õ{¡(i‡ÝO#Źx Y;œÌ”˜k(ÑsLa:ÛlþŠU„+ëª0pþC^÷òOrkjl6Òñ8p²ÀGVrΈѨcJ¢‚üêÞsþô¾Efã¨Ù×'î¨=Tï¼÷¶YZ wð”óã#ä-)*~ä­þ) –Ô¢L‚Þ±?ôÅ,ZÆä{ò´å®dÌÕa®Z ‘H°œöã› ¿þ~oõdfŒ~9t2Ýr^ra(ÒPláÕ¡706QX¡ôwøC{#Ž€d2€‰ê(`•ýã¯Ëê0”c¡äNv´€¥Äˆ¡düu§=#]WYV–,Y®„K X‰D¢½½}èŸ Ã,\¸°ÅÅIB2ÜK¬)€ ÕŽ)B‘Ú XŒ@Ÿì -`A¯Çdã2(`‘™B˜%Ë”r¡€À@ta‹Ó„˜/\Ec.¯ÍO6ºô§š=CyÜ'ÈÑ3Õ\ÿÂ,Y® X4éÀä,š‹%*:ж@p*áHi4Ü"OsµŸ£bTñ@tùÄXN4¶ Öš,WçÀŠ –±,Ÿ@€BÙ¤Hªi=§øK]è'—X÷7—ít[·Ÿóï·œ ÉÑS¡SwŸNFj+äx~}åÏY¦™{ vïJ¹ª¯ÅësXÂÚxq™~£’]ÞXe‰E””¦^ÓBpˆ÷’ü•Œþ0€¨r…,¿ža`¶*.ç+ÿkŠ—ÉüCd1UŽû; F’.Oè£rž¸ÍkÖ„›…|“Qÿ±­³ëê]ß~bãÖµcåÔ­k+Þ¾ÀdÐܵ±ò¹]…µ£‚ïb'Þ_ЙJèXDõ¦P ¤[¿Z«5ë ʘêZÁ|S¹+)ºº¹ÙËyžE1N¯YT[ûįËPªíÔT}„u¥Û‘W×%†âxÞŠ_ðå ˆ°L”cP1WRʸ‚uÆÅ‹þ_Àè¶ø@tÐý:Çå“ê<6A iÛÙªdB×»tçk‹;’Ëè?õ(1[g×ÓõÙÎ’óÒ.Ù÷Ãðï+¸¢£©F™™¿UÍõ.JÀg€+‡©©•¤ä;‰£yº$ Hîžd¡@8U…$L°HÁñ׵̆"Ò„K 5ÑôØm*8ãL°F;°²V–™C8¶ZÇËZ—庣 Xª;zÜXjB“ÉTPP@)5™LV«Uq $1­fp/²¦‰.o¨žk*͉* Çû$®¾×Õ8­Îº´c,#0¹ îÀ Ε=o¦çPf,OÿÈ7 DFL Iưˆ±tmuC£K°Þ5BÀnh¬ëéÀšžC™e²Lÿq¤”RJ !ˆU‹-¾ãŸ’LSñïŠ+ õ*á:¡€¥D;”P“ìÞKÃÍJ¤uè}®êA&oݵêüUYÔZÃcX41`c(„H¥%ËËãTpÉý{JLU·Íí1ë䆸þ‰ƒò sö¬>û‡1CRA]Ãúù%'sBmÕ–͹‘ÖÐ×"Q™#“+¤C=nh@Ë…JM,ÂíìÞ);ñ¯%Y1êù”(K’òÍOÌ~hI3µ%è<~\¹€EÍBæùh‘ûÐ_<¥ޱg 6_¸tÝiçƒ[òVÍ5õIƒ Aü[φnƒÉ0μ‹ç˜¿}d“AóýOÏ’÷íL&u:(5ì À‘-Õ·FËió;¨Æd¿ý3#[ˆäþ„»s§pШD$‰¹³J¬º³‘[S¢c³°ú债Ö(ËXÞR´¬#ÖçãÙÌN§³²Ô±¢RhòÚMz–Ê)Cîlua¯œ ?)`è—ýŒ‚³¼î1>À³Lh:’™YɴѪ ´žE^[u;[²íò¿Ì!jùòZ¾üày¡«1\°TjÃþ÷–jºya%î‘R«æ,0‹—ãÍ—iO—áÝ÷¾¼jû;šf–°ë´‹ì(Ëð 6ûôäú0ýO­*VÆ4`EÆOë> ,(Õ3q 3 !Mh2E3F;°hÒ9E4Ö)õ.M)d(ïaÔ`É)"+`e¹ÆÌˆ“΄ CÇu`™Í£\ª5Ýápœ¬wC°tÉKutÜÊÓ†Y|Ù,~ìdE…TÍæ|tLn×K3œÄ}ú>³—ìñxÓ0M‡’aH^>u;©¯Ÿ”f”nÑらþÄX¾²2αôL›?&¤Õ§ë7.‚p8„P½wº[œ¦C™e’Lÿq¼Dü`*E$k™¼Ôy€p%&p`Ñt˜¦Ô›y ¶ú3Œu ž‘Ú¡ú¹®×6‰»𠩤‰Õ<øX:Ãñãñ„`ål=ÀØ—Ñ0yk?ºzÿsÇñjжw·—¡`–¯æ>þ $_ýÛÖÊ$‡sxwˆ}ÏÇß.å >cºû*wöò!„PBÑ•vˆ©¦Z¾ÜÂ\F>2I m0¢/mø¯c¶Sï™:š#óêÏ?Uœg'uö›O×ýqWËW^,{í‰Vb·Ó²é¶KIzYI¬$Ijhh…Bv»]èiìî©NcH:Åã CmQÔÎËÜ,4–Qdø7)Šb<¯pPzÅC ©T €†$h¼÷²¾IÀTÍ&e™kPsºëÍ¡û.™?HæR¸ˆilÐ)(Tb¦4 ibù0{<¯×{ïæ2î$XØ1-Sö X•ÓTÔ VòÈjW:ìc¾²4¿Ð+mêNÀšhDퟻC)Ei‰Üü:Jh˜ü«ò'ªÇOuÎ[Åï¯QMa¦³˜ñvéJùð~yïn½ÛyïŸüùøíø<tOOO¦ÿ©UÅLŒ~råó=ik:7IdÙà^âÐ÷{NÌêŒËÆê‰Væ­F:°hj@v¿ÁÃ,Â'£®Ošéë¡È’%ËÕ (J:&„hµZ †ŽëÀ2™FM}Ôé"!È„ÚDÂ+\\LÀšÇ©õ;# +³p©˜ðºráZƒ¹ÛI6‰{–,£!…Å”®sCïˆXZ»Ñ _\’dåhCƲ¡Ns””‡*›+ËMÉ¥`y]AP‰ªïxå@¦nÔV¬c©%†¶èVÆ:OmMx¯aç¯kD¬MRP=ѵÍDšÚôríòŒ#†u¬µë7ÛD§À×Gõà8ö¶»›[¸›°šÅ®ó’ëLºíŠöoÒPg¼o¼ÿ@à”¼)*¾.¼ï”}—\T–ÚI òoö:¶ý{Õ‹;í M.'ýêÁ¢â<€\«Î¨çŸúÂú\«®É¥kw)¨°Øz"Qé/'»(Š'Nœ…BœNçù I¤:–ÊiΑZ[Êçe@ KãÝCkùýþ#GŽœ:uÊaåúéåUŠÃ‘Qš´LB¹LKù‹ØmÛÕ¿÷6~(%TõŸ’{_£Äàš&­ÍgcY™~ÿ¿¼‹NŸ/)/-(( „XíyŸ¼%@®6LômH !äÀbô¥­_ö/ìL/8—J²°3UÖ% ©c*ÊPªw½'Ö}“æ»pe÷Þ‚«@½@i©†ÔÖë–lӯ˘õ·°›¶BoPZ•SGÇoÇ×€ä\Mg²°0FyP<Ó°È÷Bu¿lEKB‡&2Ñ“~›BÅ(hæ§ô¿«Ö„¹Ü12lp*Kb*¬Ã‡?þøãUUU¦¸¸xëÖ­/¾øâ5ßJ–,Y&&•JQJµZ­úó¹`2™EQ£Ñhµ£¬©÷Ì`÷b›ˆ–.žÀ›fª€u næ¹ IDAT…ÌXV–,S ³`)€‘se#£p*Õ²;Q·;Q甼NÉ«¾Þ¨óÈÆP¼®:à`½K]å:°p#Ò`eÉr¸„€•ð€® ¤d\^9ö!„4Ú €Xj¹ÙÆ–Þ£¾It†¦PÄkÕù+w`) EA1 O]âJjtó`›’Lï[•fí‹Áhˆ6W-À€Ë[}ç"ÀΈ…]µäd"­Xƒ €.)»eÿ¾7„ý^oÛ{"z\SÇÙ}§žÿß}Á7ÞàÓ€Åm‰çâ»=rÀ-]ZÀj9òÒOwùUÅ?¿S˜ŠÇâô3„ƒK[Ì¥btÜíë*¼Ýd&°¤1<ï|:ri°"‘ˆ :Žâñx’²FGb‹ŽíáÄ4!\’÷U6+ùR8“Ëãñ444ˆ¢˜’¹£Í±3g;8]nÞ Á_ËQH1š \rÓT1ºÆŽ”ô®Š%)aÙ¢ÛØ¢­lÑVÆ26òÓʘÚÊù¸žPîôåT:æÏŸ¿lÙ2BÀs «I«>[IÐTD‰iŸÇæ`„€%CñÉÁ…©jWÚ˜Pt¦ ûe‰0„ÂD,Ó76$egŠ6^rG&Fœ=ÑÐþÓÆ»î3ÞVÃvHn»m;÷áv¼$ïÛCãÑQ­ˆi ‚e§sÛ™‚ê|ìËg˜ú&@X‰q©4V7a ao(£ ¤eÿqlÁf&gÉ”w}ê`4`x`j3¸c*¬'žxbÙ²e»víŠÅb_ýêW¿õ­o}ã߸æÊ2=9pàÀîB`tü Æ»CÊà>fEu‘>goŸ7  È’r`%iÚ È8óµ,64`YÍßOó÷ß;¹œ©7œìñxÓ0m‡’©£‰zÜò[¯«Ü àtºíåø»/Çß=žn:žnR_¿÷@ò$Ñ®«‰¨;=JÀºQ¨« Vº¦íPf™ÓÕ+þÅ3¸{}þ°K ªL¨$Ф‡¦Ç©¢¥D;0梵c(‰8a‰ÖªÐÔE*ÇOž+–•i, J‰ÉŒÊ*:‰ž&ÜgE¡zw‘íŒcõp´ á>¼Ú `WÈN6ß1ÔÑéèRôTªå aÿa?qölhHl9H£5‚©á™ºÀW;Kלž“€*§t(y€ëR, ¿ôVÇ¿¾Ux°ËdדÙôõä–¯:¼mIžÛ°²RvïI(ŠhB&DW|×ߌ•1Y2`aòB²|®Ev5Àd®¬ÐùÏÉ&2 ·NÔpI^+;•[ww÷pV!'#`¹eÿÂÎÌëmGâDý­Æ)Ì(K‰¨3Iä\þ¡¿½&cõX „¨Å GF^ûÑH~¡ÒÒH=né?f–eê¥P¯Ó>~púŸZUæóÕ’^"E”jÞD(˜—Öh{V¦(è.‘œh¬Tè£é01BöÕ`¯]× gD:<Õ¬ë‘Äçyv¦Ù²d™éŒIÐ~ášßï`±ŒÉ§‘HôÝ÷ Áwïs#ª 1*˜ã2ò°²dÉr˜5Áe¦4RO•žÉ<6_1áÕÆ5³îú·ðo|rЯÑÙxº´\>ÒÁ9ã¾c}efzCs`eC³Üd\N!Ñ„’§€^9Pʨœ¢‚ä¤ëRgð4Þ+ûêJLå™ ‘}Bc­1#;ÓzV-- ÄÛ­N9^Gl9Ìš]¸ü•;°¢aíÔô‹—þóÉÛÔ÷š¼ º8šx»Ùr¤ƒ_½•¹)b™€ÍßV?jÓ¦ò;4üê`îÎ],Ë<ý\}e±åŽÝÀ¢Ý’›•©Ì’‚@¦Ø±Øß‹üùcºá”¼¿‰½Ñ#¹ Œîê¬]ÏÇD,7 {p¡(Éâ>Þ˜¤qqÉþ jÊ;^%áŒËÀ|ãë÷ôjúA;vâ—J¥xžgF«a7¯,}s×ÛgŸ]{ @¹9-¤ãØø'Rʆ,‡Ã¡á™Ò•LÓÆ˜áÍ€õÿ«´«Ž¦Î†r$‡Kã—Jü ™(ªªªï}§À£ë¢ŽkS}(CyÜ•H+ƶP 5*¡¦QÖ Kñû÷ª‘„g­¹Ë´¹tØÄ8°äþ\./$k’{Â2KtO}úk_ûÚç?ÿù)ÝP–,YƉD0BŸ3 …B±XL£ÑØíc+é*ݽ}¢$âöš Õ`µ`2™bJ¢èëÀÊ’%ËE Ž|vÛö¡Ò­VN$x7qÔW¶$júe›³XS{ yªžÜ¬© éÈ­S,uÅFa–›€óýéNwúF÷âIè»§bc>â\+Fdh6ñÎÂxXDG˜÷ÿÁuøQEÉ@„bþ§bÊ•åò½BÙù ,T¬³·ËÙæû‘JMw¨Ôê*ýºÂ@"väüœÚ£{’¦Üãš±l % ŽKv~\Ì^«¯ €)ØçÞ $Þ>~nïñ6¦¯R~ë0]YÜÂÿÜgúù‚¹€^ËìmdTy}ð¿´°o™ùÕÁÜ݇zuZÀyWäì±_×èR4$‡7I¼¿ÌPÌXîö®·õ‡y…/2‰–$"½ZòŒL$G=N%0wdû¬˜–'™Oóç/6¸Ï2WRýaï„­÷ï‹zlÊ‘¹ò—Û 3+³»šç·7×óÖ¤Hf('ÚÅN£v$‚úw;Fì²,X%ŒÕ` å¥E@׎러íà0Ëa¡&¤bî} ‹8ÛCÎN-“.b;ž×ÄfgÐú‚ÇýžM^NZåP!W¦S<„Ð )á{vœhJë5ÜÇ–úÓD÷‹î㊕V1WKí«€T¸gß©aµØGÁ×Åî_…s\Â}ðdoŠdbç†"à5_ófý #pÚPäÓD:ùYÁKýr4E‰‹úìZt¤Šz#X™ž=#”™|%×ÕÞê›$›^6-lîæÒ€Y}éƒoî<€: j×v×¸Ò Ã„,:{H of-© ’ ~nìò~À—D=ác01—¥£™{ìKÊÁ÷Æ\\™¹3£ÌßL•Òž®_ (PtéËu`Põê?YÇÊ¡»­™ê½šq9°T!„›Í¶yóf³ÙüÔSO]æ*cxê©§F†Â644„Ãᡎühäëp8ÜÐÐ0îGÙ¦º…†††Þ‡l ’$% †aêëÏŒ, 5X@§¯¯@qq±*llRĆ‹s¤¤á­þ¨Ï˜¤”dXÓÿ{ȶ0æxœ¡{‘mA}qÃûp™-{.»åî:£Ý¶½áÖ¹/o6(ë ¥µ|9€þsDc]SðΡv åÀÜÍ뼉Dƒúþuø&‡>£™maÜZûR;ŽD¯Ãßñ3±î·Õ¿ºúžI­{´%ÀV.üèdc7oÂöÆ‘X„ÄÝz ->¡îc—ާ ~óhdÇ‘¨×ëОýR㬠|§Ù í¿Xg¼î0€=Êl8⨒ìló`ãáq—ßߘ‰K—¹³þã• »*v9úìíÔÄ“H6ÿdôÿ@àßÿ¡ëË¿+ÿ×Ý¡8æ§„Sú‹5õÒvvÑrJ+ØÕ›ñ”5u…”<¢KSc’Þ~,®wæ…2A|LÀu"çö·‡Zx³³S&QXçSž1íKû^ÛÙrnìv…_u×ÛŸß÷5µ÷kån{d¿/Éèíiýгþ»î:ßÓÑ{áZ‡ö–yÀŽd9€šBì8=ãÐ×­þ‘4z¤P3¨H”"MOC®Iæ9r¢Gïó `ä˜b¸áÝþ‹}iêô²¹­7?òBÈÅ“ä™óz"w(d|î7çÏ>cr ÑWÎVYåöź÷B~ol §±ù<¥(+44ŠGÑž±8c=°7Ô°ãHô¥£\L4ðˆ<Õ×ÙÖH@;£¥¯M5«¸»Nï8>î<üzG[aÌFñ¨Q‚û«Bù5»©­ÏvÉßLÊc'‚ÑMòA‰§ã„ïŸO>þõ÷Ù›z·ˆÝv¸oݱs,Ñ­)9RZ `Ãñ¾ÕÇ×?{ÏÁ£ “/?–_ ;Ow²$ƒõH ~Öþ\›yRÇì­½) !“:ËE$…½ãµ8£zQf·m'¥åÓùL;fâzÃÏö—lØr£™;,êÀÒé'n±ÎS+ ¸å¹lÑV¦à–»WÓÂSO=5$Ý<ð¹ï~ÿ·'6ÜñÙ‹¥_¼&)}äèõzßyç¯|å+ŸûÜçþñÿq¢~©íI–ëF8¶ZÇÉåz ëëë-ËŠ+ÔwdYÞ·o˲›6mJ§Ó‡°nݺ1%ì:ýÚ÷wƒ¡—¾³j±ò 1Uñó¿¬~´ÏÿþÚ¾˜2hÌ÷ýë¹;Y®˜ìñxÓ0C‡òùøžwG¾ñKnDæŸøz»]üAøÙ¾ôËýñä@ëòï,J‹´þ…ÏÚÌÚ¯üÔMï®èúW$3ŸEÞ®Â{êë^º¶÷L¸ø(X9¤MãXÖ¦Mô`ýÈŠP¿<ßOŸdîÝUõ3NѬsßç6œ£„Þ’Ü»DHxÏb]šee7óEF.^NžÉŹ“xd€Î¾p[›É·eðûé“"Ʊ,?üL®÷Üù[6UZ÷  ÆÙ¾º´ë0€÷îú{‘nÃФ.Ѩ]R¿ðrv¶¶iWŹýAGuØVL(¼R(>µ*ðOõüóùÏέ-HÍÃ%é¢?ÝàO+Ï’°v€T*uáDhùÍ_ÿR<Ü5l"¸yðÛëÜìQå?°ÿÕsæyËæ5Ÿ’ÃQ¥ßÎça;€­Ýê%3€6û‘Öœ#eÑy}æf†rwu}žÐáóÚ¢º´TÛÅ‚GFnQ”Z¤ÈËFÉV›Ë™ÎŽ:÷lÑÞVË7?}hyw³.ïéb@^¢|­ë^ËɯsÑîÁBüðà XYnfÖIçfeL,Œ!RjµZ/œ´Ph&|y®ßp,R, @4^*®;Ë´!{<Þ4ÌС,ç tñ¹™öžÏqÌR¢D_¬áZjKù3©Î¾ðòyù™<7õ9áuË5C‡2ËHd…˜_¡»eÉÔJH­%œIýSÆŸ©Yú‰ óO] ¯7qö,l¤g®¶}Ñ’ÛA†£.¤.§âCIi)WHw‘Ç[Z2 ˜àl[=7€Eö¢¸‰SqüÃy‰ 1šÀšEED?n³Ô2‘Ö-e§Øâáâ}{õ>·«eAã[”.D¥ù ú>áh¹6¦r·Ï–HÁØ6 îðaudËšËJY {!ŸƒcÝò‚µ›þøf£Bx»µàÉê‡_:õ!ô?èUÖnY䨨×ÝÖÞéÌÏwlœ«¶ºÏUâ½¢LØŠû‰± ’ &X—ŠQÙ½Gýóô=/¸÷` ÓtP žÑû”8&wYPލ rò¾=ò;;¥~WÝ›‰Œ+4/¶hK¸„Ö€¡é¢Ö\z$÷îDÝîD]¿<€)Þ @ñ¼EZæÀIç›û»žÛÝ >3™hr€£ÔÕ“éöˆ˜”!&›ÄŠ"Âk¼}¨!ˆˆõƒSñÙP/)JÃ\ €2z 7Ñí%1–­­Î¤.zèž%93Ä?ùJI¸€-H_é(=Ò%òl§ñ§A+Ó¼ Døä ²?ÜóÀÓñêÿy¾ŠæpJÃ7A9 § I¥ÿÝçGôžæ4wè-ÔÅûßh=ýÅg_xú¹z_@8|Æ `•Y &KH‰) À±ä™Wÿî]íOòG×ä³›¶ŽýÛ|;÷È_tú’1šoËKòОt¿9¥³ &I’œN'€êêꊊ UÄgYÖf³¨)ÖÚŒ¤ÅÅ>ÚZémç=Ý<<@ T É®·.üºÔ îZ%úÛº\8×ãõŒ2Ë ‹Š´ÅkÓR¿z¥Wþ1¢±Öõ$E,®äòª×h–üc^ %|TJ“³„-ÚÊ–ÜÅÍ~œ_úMb(@x3c_ ªXœïUËn¹+Ù²íd’ê«Ö0³NÌÑEõ ‰Æhp€%˜Àç^ÚÆeg¬ºõ[KK–Îç«7×§Y «¡f²=É2C!f ¨35ÑeöO!SëÀR9tèÐܹs/½\–,Y®‚ à‚ ƒ Ã(Š¢(J:Àóã?Åõ DTäJàK”Èb»6De4›Á=K–,—G!›{Ÿñ¶Ü"'°øy‰>N S©(2«Óƒš‹ÞV¶ a–É"ËË\ûx×=‡»ô»“êë{æh£ðœOûñG>¼¡ 6Þ›8l¸ RUT‰JáåôÒÎwLÉúf’*¢(GÄÝo™íË•ˆ«ÿÕÙr*d*8E;{Rnµg"®ƒoh$l-0 Ñåkuù2š¬’Ôì\ 'S Ó ¯Z»$ç}†Û\²o‡°€ $î3ÞÆXæc9÷(Ç™Ázð]Î0€w¤?%lÑÝõùóO<Ír ÉHf"¡ ¿‡I—VH§@£I¦¤õ>Bè½+ÉËÇðþñ>²1Ь×ä1†¡6'ÎÏBŒåËWoÌ1”JË«þŸ]ñ­ŸzádŽ7Ào›:3þÀ_°=&ñšÓöd®§â-éDÂìûR@Ô¯‹¥j­\aî9¯EúdÏ ÌS[>=½E¤òŽž•MoaÈñˆ)’ZØØêåx­NˆŸ{¿ñÀ ‰7qôÍ]}!£–]dLÀl +1l8Ž<ÿV€7‹{Cb~Î-vfÔ”/–Mzþþg€õ5q¢µ·ù;omŸoNé›qV§Ó%“I–e G 4ê¼1‹þï·7ýé?=À·~m¨6Ùõ“³HÕ’†ÈXRÿ §á•†‚Ç6úOôÛ)%‹M†y¹?8œüÚ:ý³«#®Ãxý½ŽoüÅzŽ3°•ìÜÑønß¼Œ«\U& DWÉ7¥;»%·]c%Æ2ÖXváè°·('c™”ØÿîäÛN5w_á³UÑíXf*s§k´AiaGŠžk%óëR² %SÎå4®یÁ²tr 1Rd]qeýÉ2ã f+2VM¿Ü¯OSmÖ5…\û‡GÛ¶m{õÕW½^¯(ŠN§ó™gžyì±Ç¾ûÝï^ó e™žŒLö–åú“H$Ξ=+ËrAAÑ8*´aè&mb–/P–“flóÙ¢­Œu€˜"„•X2ê@L×#ML–kBöx¼i˜¡CÉ€Ù¦_·¢p#ð°±fAž'ú¢k€Ë«:2¬ëßÉëB8C‡2ËH¦Îåܶ²øîÕFY¦-ý:I&ÿ÷Œû»gú)@í¿¼²;QQ2þ Mÿ8òÜËñwmÝo˜’!/Ïî±Õ¿“F€³FN`mÜÙ©ïôîèoüçâþã^1&_Ž¿{"Õ àü)ñÕ@³b-w杻Z=*­a¡É#)áT€ËôÉžN©Ï/‡|J0¤DÕ>4‹çÕLÎ4éÚUÀp<¨@LÅMH €Á9OÀš´¬,ŠÀkŽ6ö'ÒÊ¢’äŸlµ(È5üâ©;l+¹FƒÖÀè†ÚTÛÇEŽG¢±ê*>rüŸixéáÚŠœ‡·/ØùŸ[LeßyÓOêòœô¾ß[ !1ßë-üá®âðYÞ«œ{Rl@äÞYž|*håC­Çö½úO­gwh žQ7ÁÉŠüöòî×äݯáÀ{:ksË,Õ¤Dä\gapºÕG)–—h8#¥ùÁŽIÀ³.P¯OËÒ¯¢¯(ƒ'Ï·ëº?ýäŽÅûÍ'¿öúw¶ò,ýâ-¾î~ÁÕÐcNéežjµZUr*((à¸QV5z+‰,œ?çùoo5±Ê»^Ën NK@e©ë J[[Û¼˜°Ý×UÞì$}!ýq§ ÀSâ#+ 6Xbëéòj©T er'j IDAT„SûO:ã 1­ŸûÖ±0€{n©àS‚òØœ ®@Ô?ÁPS1UØg1ø9V<HÐjŒW|j=½ªð×¶vóõ³´äutÀÀoãôäòN1Ãç¶ð¶l;ÑŽ­ñå2™y—Hd"W6Ôô¥‰BIQÉÈŸD–kεw`=ùä“?þñ{ì±p8œ——·~ýú_|qÍš5×|CY¦'7n¼Ñ]ø€’H$Z[[ƒÁ ƒÁ0gΜ1 ¨Ó5Y–Uëb,0 Ì.2ù[&yjŒ&˜ €5Í´èô0Ùãñ¦aF%ÉÉ!4€¢Ø³Þ-ÎYTl;  Ï3èÀú`„Îè¡Ì¢")Ë^{–' x`þÉ-µþöµºh’yÍUñ»7Ø£?ÍéûF¬L…ƒ'÷µ-é®/Y?U—<½'q¤_˜­˜Ä=2Ã6TmMñzްË5óvvìµ>·ÇP87àò“T`n2 Íi roÙF¢Ðw;NµÅ¬_Ú¶FFi÷/aÐaC&`Ð&É݉n!Žé9 ¢ÄÃV¯Ô§ #ÑN€Ê™:†’¬ô¸36«ã>Ç&ZGœžO‚hA18¡‘qB'ïÀJ¯9×°¸DX:·ð ŸªþâKÍFÍ¿xL$>Iô¸Àu™Çã¬êʇÖ~¶ÏáŒi¡”’˜Â˜t\,)=çË÷3žtÀét›§åÿgï½ã¸Îsïçœ©Û »À¢W HìM¢(J¢zµ$[®qnl'×vâïÆ÷Þ8Ý7q¾ÄI|Ý’Øqm¹Ë²dIT£ )‰½‚AôlÃö:3çþ1 ‘ RPûû ˜=³gΜ³Ï¼ïóJDÂ’ml·T^7²ñdê@|÷S¥c,>ÌñªC>Ñxá©ñ«W:ˆ'ˆé\dhþýXÛ÷-LÁú"Šz0c÷mAtd³À$Óu®h"Û?í}ÜÑc oyê¥w¿°·ÿ¿ÿý˺GÛ¾££þÛæl½ýC 8éh­X¹Qn9sæÌøøxié…Öï²,K’”Éd’ÉdE™ó å£_è-ùú)OÚCw:"½øö;K ÆúwsFƒ\ZV Jhâµ./x¹¿aï™ €u–dumñ?V¿€„ÁB¬Þ;³¿à?ÿ/¯…¢é[7Vēٖe…•^+¿àæœå|€~eôÒÝÁy¶e“ƒoØ x•ãUßZíÔPÃfjŽæZ³ô¦HBˆÅÂ&B-Ù¢•ƒ6 L뛺M×9ó/`mß¾}ûöíó~ØëžL&3>>^TT4[\ÌtR©”ß?ù€Ëf³™L&J)Ík½ïa&&&Nœ8¡iÏó•••w¡Ë¦¾å²)„P@¹3C„óBU\K°$5¢eNÕyòäÉ3‰ «EÂ,­ý$€CäqáZ:Ož°Ø0jL»”Þòֻ͵ðÀÊsY2™ÌÑ£GS©Too¯Ýn·X,„EQE‘eY}ºU%‹e³ÙD"qñS)I’xž§”ªªj4W¬X±§’gaèëëÓ4Íív×××ϦL]B8«€ÖSsΧ &´€Š´HÉ–‚ߘ'Ož<³ât!f!¿Ý;)`S«·@04Å&^óÂ<×Ê|x`=ózÏ×~rd×<ä°žòð…$·üÍ"ñCæ;r+€M-C§ºƒ¬šQü^Åï}=ö‹ ±QóûL·¬jÕ¾¿Àyn˜~|$¡ns£Šç홄SQ˜ì­dÚüþÖžSa…ðÛWºþÇG×B”ˆÃÉBAðÁáàTT›¢sœ†ÉaÕâ-`Ôürjÿ™\ïyKIëûèùƒ«›<':|>9]TH°tœ§ €8],蟟,–† ýC«Ü4¥Yty&Ër SE"„ÇÜ<°f¤ÀhøÀúÐSÇíß°Ôo¼Vrý‰þ´øÄ[âò‰Ì«a‹¿½T¿_SÐ7(øèƒç¿géI¿9ìýy,ùÔ;^j7j»&€üUø'ÿp§Ý"}â‹/~ån?ÝøÐŸ=[]lý´l³eU0,«pÞgnôÝñDªßÐR9 ŠŒPù¤3ySÆäIâÕ¶¡¯=ÔÄQ­”ŠßêHïÊVP}wŠ>t:Üõ?\Õ#i!&år/ð–!35zÎÕCt¹\3žfQQQ0ÅbE¥U_R†ÿmœ—ïéRïO$lÕFû ÿH9…q]íÇk &2QŽ×íº‡ã¶Ùb‚ÌÁd€xÜBF·vÓí®µ Ápê+?:L ¹ûÆjýC}ê7çtR›…uw'=ÞŸpm…UH²<™k®ßLrŽBÎÕN¬-ª3ÕfXöÕôáîš¼cFž9A,6h}Ý,àƒÁHÊ*ºE×9yk®„B¡ÑÑQÆX&“I§ÓŠ¢ †ÒÒRBˆórÕPñx¼­­-•JI’”ÍfC¡P(ºô[(¥n·[’$UUC¡P.—SU5“Éd2™©®®1{÷.½àÏ%N4 ‡Ã<Ï744\x5Å)„³Åú'JYݾ]'Î’ìI€æ=°–ùñxݰԻ’8]¬· ¡€½Ô`B‹¤Àå6ŠZ4‘‹'³ï¬¥Þ•y0õ΂3žx¹s4øÓyí?ÿ|  YWÃYJ+àp“%ÿ6¬,þÎ'÷·Ç?³¶¥ýË|§0-ï!‰çJ I 8 %ALeÄTžJ¥AЦB8C‘ âÍ©”±,'ˆÂÛ&ñgŒèL XñxY(ÈÆG¨»„7©ª+§ˆðç×–A-’Ð’è:©éåÔþö\/¢–B¨kI UN$C‡z³ÿübQEàØþÌ„©X®µe!‚T° ŸEfˆÀ´Ê3sYÓ2G k žì®`ö,;x¢×ãIšL¦K1»fœT¬TUÅÛ=°æ8 µýÁ–Þª‚¬,°GÖNXM’¨ŒþQ³kçïÛ÷g¿~5l‰öpodŽ…{ødŽT»2»rKSì»{¥tË€ Qõ»/€Ã@;û'¾ø­·n^_þêÁÁ‡>÷ÛTZa Ý#ÑÏ¡l§3  ©ª`µÔØD\>ÔËG“`ð;š€CáBÁ”Zû¼»èέ'÷\Ùqnz_qIµ€€ì0¬§±]Ñh@Ú¨0`™PqYÝÎår­ZµêÔ©Sñx¼kY‹É[y?°ØR7øG8«–‰8îÏ · †l&P¼B  6÷“×ÓDËæT·;¢Eb²`‰¸‘<üI×ÝÆ&Ùœz¤ÝWäš Ó#° 9'€2¾èt¶ç™äÞ›ä5zÛIjº€¥ðÄLÄwxk5S#€aãvÞQOMtqùåî°§H½¡vxZ×7Àz·É X—BÓ´H$‹Å¢ÑèTÊÞ‰D¢££Cÿ{*ƒR*˲Á`0›Íš¦%“Éh4*˲ÉdÒ4M×2™Œ¢(š¦É²L‰Ç㚦Y­Ö––ýãñ8A8ŽK¥RªªNÜb±è ê„Ï0ƲÙl.—K&“§NZÀràKî¦s000 ¤¤äꦥ^"KQ´p$I Šœ2M±LBK¨×Ræ”&†"`É{`-òãñºa©w%)(À‚;-0iÿ,ÛÝ~I·ÁZ(òXy®”I¬w58;tj À‹oõóÛýŸ\ßÀ/…5Æ\eXeD “3Á3¡P¨ÂåáyrôŒO17séWÔÑÝ7ÜDyhû5{‘‹D…æþ#G"‘¥Ôn·766ê—4¥œœŒb.@5H¤rLAcì¥î,@ "×7ý‡ïìwØäû,žœdãcXAˆhC&X•ÎH ç#ÅBj„6j®à‹MÄPÃ~uÂõö¾‘(€ª«%ªêÅãG,8r³õ@JÊÐv©$”ø ×$W„¥´ŒfãR‘_|ËrKš‚±±±ÉL´mhðú™×‹‹‹õSÏðæ> ïpY:ß¿. Çîi`Òklž„“añn!DZ6€Í5 ¤ñðê ž—XGF–µ› ±¿L®>Õi1¥þíS+¶ýßž]oôuôMèŠX]ž¬¯°ýlOî…@cu $ñ$(Ћ=Õ"'P¨•Ú¸ÊG5ß›£‰¿½û,Ȱì"ž÷yPRã1Õà¬4 `“´r.gj³Ù6lØà÷û{IXlrÅ ñ¨ªo d €ÒÒÒl6Ûßß?š«àðÔî9ò2€O>¼òëål³Å :!$d2Ö,d“Ñyÿëã뻇Π—~u@!u¨à‹Og{ÞH³SË%¬Ëàs…'äÞZ-ĈsÏkõƒHÞkX’S¤Å @÷þ§ Í ÝšëŸ¼€5+‰DâСCSd9Ž+//7’$ɲÌó¼ßïEQW©¦öÌf³Ñht|||êP©TJ·Ö¾]GPRRR[[«¯¡ ¯´µ„I’$IºÆ ñ< N*• ”Ò‹Í8/`.)„ÝCaUÓÊœ9=üê•ÔÁ§’¯m–[â,¹s_‚ds´¡YÎ'Ož‘:u¹…fMêž—ß|i\QµÃ§ÇŸ€Û+èïnEÀÉNÿÞ#ÃÔYö‘lü¯Õ¨³E‹žÕÛ\a\†T¯DD#‘'´(;g°QZq8Óî;öJº€ç¦¦µžNågßïéñbY|OuY¶á6FsdÓ O¼ÑðñÝ~©ÔA„B¬6„Cˆ†q‘€u Z¦ fl^@¡]`3²ÊÊJ-þÂÄ/5·ö·Ž?ä£èìì4›ÍµµµWÑeDvëýB²2 6–!F/KŽhã{¬uÁR[Á`Xˆÿ¬&Œ4¹Ó[kãd¤œEûáš#P }ææ¤¹(­¦žx¬Ù´ëP%€Wù>Ûø‘Ac…3øÊ-®ÐPåTûÀÔQÑV‰D­D¢ò6yu¡b¸»7Ï1L¯‚I8ï-ÚÄqÕÿ&Wr;¨€eB,—Hh!c|‡¼‘^áÝ•ãùê3Ç0‡uäTôÏ¿›ù§ÏW·V7誢Ûí“$éì@Àª·Ûilmt»:Ð^4€É‚PМÔ`C’e.þŸ6 › +ç‹n6¬?‘í j—°2…Ðøy°Z7S#âZ’MF`Ѽ€•gnœËM¡Õu Û–÷ykVô)Ód2ÕÕÕ]vçé \Qm¶·åX™Íæß5—‚ƒWÊ‚ X‘Hä‚ÓÏón iÚ±cÇ$ — ¿Â¹BÝ(m¶ŸdíÝAÅé´æÆ¹õAÕ‘þ ‡"hë:âñÎ×)ä¹äÇãuÃRïJRàÀ&fbà —dé,Ë ’ÓkÏöÅA¬:„Ýn///Ÿú7NG£Ñt:ÝÓÓÓ××gµZNgiii<Ïf³v»]¿*ŠÂqœ>çê6”FãœÊ`-õ®Ìƒ©,îjÄV(ùÝ'ÛºÃ.»¸Aþ9¿2µnEÉCÿÊïíD¯¿Øëˆéäòãû,+ZQZªi³¿õÒÍ7Z]Ö‰è9•30*ÿ|¿é†5õæ¬&›ÍæWÛ”LŽõ&~þjäáLªªò‰ˆcI­€d•ŪKõ›"ˆ“ß¾(.wä^öál÷ÛzÊl6Ûív§ÓÙÑ× ¾Â àÞ»JŸ? €(Ð 9LóÀšâµôá™6nîüMØA­$¬Æ40=jìwÉ×ßL×_=•íþÛc©Iw €&p˜[«…“j:¦%Ïy`å#°€¥8E« ‚%Góֵཻø¸,KTÀºÆÕ”.fÉÝt®”¡¡!UUõäPY–õŠ?—È1ÉårÓ_UUuhhHס&&&¦ô©!„\¼t›ZÒqWZZ:222—ð+LK!Äe¬â4u”Hi™òqÕUúû–²­vçŒïʳh¹îÇã{‡ë +‰ÓÅ’ „N»Õ¯N„´ˆG¨XYšðêÁ¡ûînKáBˆÓét:¹\.‰ †ÃaQFc4Õm9ŽÓ4-NëOxžŸú»¸¸øÖbèÊT*522¢×“áy^QUUEQÔÇøøøØØ˜¢(¢(êOt¹ŠRêóù"‘HEEEuuõBŸÇ‚qX_ýñ‘WV•ÚÞ8:ìr¾mÙý¥ÏèÌY×4U>ûo}íßb°‰Œ‰ØÈÚezX 1Yøßÿ´ó©_ŽÄKJ-ûŽtÞsË*?þÝi>c<•q§»F™ÿäÃ-_ùÑá÷ ß¶¥ö?}ëñgÏPtêY÷×?Äñò±ƒÏw{6®«âvµ­¾Üsß©šý'G¹ÏÜÂQËùî¶ÒÉËÛ~î×É•1Qª‚ eF­ÕJì9*´ª»€ù}[RK;êsÚ†Zz<I›dX|kî Z->l³XŒ…rª+Kôí}ÊpH‹:¨µF(›í½sD6â ÍEÄTFäVÔ¶\S3$ç¨÷´íîñ±•2zìyŽ0$ ¤È‹8¨HÂÆŒf‚*hÉ-¾­¾¦Ì~þø¶e©ð†ÿ D£5½êH'®`-y£“Íu·’s €‡cttT¡ÅÅŲ<(DŒÅXÚÈ:©7ÛBÁŠê&‡påž_8Qjr¥Ñîž4UcÿõÔ©åµ®õÍEeee6›íl_@}¥@†ËÈ9Ò¤1™Å9o©)ØáL;€mòšUIzè%´¹•wب9¬ÅÚ²]£j@eêþôIôfÃú™¶³¹þß&^•#É?þí„)¥å1·V35Ž«¡x^ÀZPÃyŘÌâßü3²™IÑ6Ï»L^Àš•%*`-xÖußï‡'£šõÏ&“iÕªU3&„ŽŒŒtttF‹Å¢?™÷ù|±XljŽã*++cŠ¢è[ôR•š¦…ÃaUUÝn·,Ëú¿ºiš^šçùÆÆF—ËUQQ1— Ó8—B¨ÿ¾š±µ¾P20‘2ËÌkS†¹I¬–®4€ã5²™›SvLž •ðÌzÜ!ا¸Ükãý]j]‘“=vüt_ò÷ni¶h…£qÏ¿5`ûúòe•β"ËàXì³ÿÿîLVÝÙhù‚ùdAyñ—dÿðï^š:àÆ–âK4˜—PWa‹)ñZÄr´ÝWâ~ÛBE° ÃjQÛ •v!bþqÕ ‘L–‹ç uEÔ˜‰öxÅ­$/`-=®ûñøÞá:èJº¬ªÊ|cü™¶‡_ɽX>ˆz@*¸£¹ëïvUøm§:ž~%Ö²¬`yMEÕ8J—Ö$<ý6;‹¡+õ †©bÊÓ©¯¯Ÿšh ƒÁ`(,|ÛOît: õ3ÇI’ÄK¥RCCCº»»%IšŠÆÒã³ô¿{zz<ž}¯ka²,K’¤§4ê¹™ÓáyÞårÆD"‘L&‰D8æ8nXÀœ#°özáÍ>“QxäO£¦!GàxóX¦Wè­!àh¹O ¦}¿QwWÈeª¶¬³8÷¡ ‹8®Äeyâ¸EKax"äµÁ»Ê  Ô-¥Siþ“þ›|ë¦ ·l¬øþ“moáyúG˲ÆÜYóÄÈh*£8mòàXL¹šÒËü8§+V·ž8òZÄr¸}üîmçóYÀW:p˜Ô­Ç“†#/M©\ëúÎÁu¹ ÚÒ2r4 Ø%ÌœªÜ¸J¯1—̦”Õz¦ “cáb¦¬¬ÁÁÁÂÂBIõkÑŽ¸–QÞ‰î@²V$£ç+Ü…µØîÔ=°Š/¹ðÐÓ¸¢ñH F–LÀl½p»Å‰ƒ©#/À z+ZZ® C ël0âtišÕ+ܨ>YÀÚcjçS“_EÅ…éºz)JéÀÀ@[[›ÝnEQžÕÇr!иü–p8üN‚ɹ,"¨ØbNõ¤%EÑîØZ•É©»÷üâùŽ?zÿª³}º€5äÓ’rNÞæ…DÌ@¤K¥XÆD ThG³g¬›Ô]ÏCUéšÌ?ÎzµG lú>î2n-å=“MqsÎaÅçœ.` "æãÖZÎèWF”1|¾lѰ¦È<‹œ¼€5+ú”™°®”ëþ¦£·”RBˆ¾,XµjÕÐÐ!DÏn÷ûýDQ¬¯¯Áj½p¹s홞Ü1£‚v m @kiLe´®q5€’Á€“Õ#0Ó|]Ø¥Çu?ß;\]IÊ*¸² ¾çþ˾÷в=gP":eÝ¿Qþáˉö޳ÿ»ã,€Ö·Ñ ;ãûÕ¿Þ«‹YK…¹LÁ‹¡+õÎl—]ùȲ\__¯išÃá0 úþñxÜï÷g³Y¿ß?–5µAA¢(>Ÿolll¶ÃÚl6‹ÅÂ󼞙ÈqœÇã™e Oœ8±bÌ'#°æàÅþá;l{Ÿy·ø:røƒŒÚœÌT# @áz£rt¼>“ÑjŠØ¾ÃGÏLV·8|z|i X ^Ge޼óóââ ÛÍf=s°®®nº€%ÂT HUU•þKÛ`0‚ÉdR©”ž,o³Ù.ûc{.n׆¹G`=ýZw[W Èe’w ¦[ šÓ/0‚õeW »já‚ä­ªñÑßS]QûY†TµP“ ýˆ§xùh«‡ùHD¹¿½£·ó€PLù__ïõŸRwï°†³¸â£®|d­3÷z¢tæb1Í! ¼ °uÇ®Ý×Ö7‘É(’4Ù‰,àûÖháölÂ!*Äæàï}ç.$¶bewûX ²§Óí=þÀ«… ÀïOŸÜ&¯nÏõéaµõBBŒJ 1t§¥í—‹ÀRUµ££c||@0,²tšÌý+¥ŒÐr±ÓÙ7ç k±Ã™Ó"n’×n–ç³(·iÛ¬_W¦uöÓê:íÍ>Äå@\~ͰY†ÁHœ®É=/!`œ¥U u‘¸$|øs0^F@áy~ݺu‰D"“Éär¹l6›„ãY•ñë|,>Ï{`‰Wš“F™ýçßÜf27¬))+² ŒF÷>prÀ²ªÉÈ2 ®èΓ&îz O<úä„}ƒ©gçPJ1çz:ù:€gxõÍgÐ5‰³€X,xö7l ·þµBkƒvãÑäMG“ÀïT€|üƒðP'gD™j¦GžŸL7ç4Iwp¯Ì‡_åɳXÉ X³²DSq®t]^Àz—˜‹²)Ëò+^K¦Ú,IÒ5ãïðÇS¹¯ÁcU:£ ¥¥  %æ¼VžF×lüq÷å!O£±¯^]Þ‚iWÑ6燊Ô„|é¨ À k,’r0sêÃ?ÐÓÁ˜-ÕÙ·º$ýÒisONb©ÃÛ/È©îN&“'OžL&“zéÏp8œãðË*E×û†·8ÍÆ öµèO ˆ‰°Ó°é.ã ¸fÈÅ8ܯµw1ºf#mZ ”Ò5“ÁktÙr¨ ZÛp‰Ã[F®ñžËªW:’$M·›ÐBq¥ëûiÍÀËóqîÓ"°¨*7ÓŸ¸3^Ub@ yôöeÿüƒCóïov „ÝNãúåEÌ7¦iÛqà¨%©¥j*lË[³…¿ÿýl|DÙ÷ú-‡’O5ú¡}¬^(ïWFÔZÞ@Woà¶ß‚È­Z«îÛã|ýÀcƒbÙ¸€nتzK;vPu€ãV*£‡Ê•‚Øùç¢0?OX PÆÍõ¨.e—'Ožd‰…]K–´€……[á÷š±t/Œ)«´´ôâöï=: `K“ ˜±÷÷õ¥XƘÖpNÀ2å=°– ×ýx|ïp=u¥H„ýë\û–˜$±Ž@d™ CŒ`€,ñßVÿ‘{›:=¾Ð½2ô[ë¥#°CW^:…pѲx"°”¹¥î92Ô5öš¥Í£¶È-Z´1Wûs¥9&X-æÍ6TŸ=iކ ©„%2YÅmÅ.¿ GQ5åFÿäCk>õH §cÒÀb1p”°‰ îæ;ˆÝq¯<¬=÷í\fÖUž§$­(³8y|@Ý·Gk;úÄO_ÿÛ~/€‘¬€6¯š¾»‘Èk«Td‹)Î(j«½ën7l&€ ÍËî4lÚiØÔ T}ð+7þûĽÛRº4 ÉÄ®w·^''™Lšd¹®ª¾g$£iZ8A„·üH]$ Å”ùŰ۠Uò^ŽÐ¸–tRÛm†M˜ó5‰ÍŒ‘ŠjþÞGfØ¡¬‚Ûy/·ó^r‘¡ÕÛv³;ùº{©gýU6CvL¦I"ÏjG›æEI$¬¥ì|I¢‡o[ÆQÒ5ðÈÎe÷š±D×ý8—BÈqœ×;C\ô›ÇFl®W„2öj;Å&#°’2òXK’ë~<¾w¸ÎºÒ`´?~[º~åVçOƒ ÆÞ¾‰87qÕ“°Ù(ŽÅ|¡¤Û¹dÔó¹(,‹¡+—è g.úà5€š‚ËG5}ïÉ6kn—Îj•¬ió«âÁ45e†í£p€GIi‘d/Sм€¸ÜÂýÍv4âtXdâ3õ]äÍ 02¢?Š®©(€pqÐå«Ô7^Qß|ç2³®úd—×üòôÈé3£#Öì¿—>$ú·?šO ðl[º%X^ëšÚ_æm ‡ì@ºØ–#’«„p+ĺˆÿ¬í¦s^í¹^d‘-I莋X"®—«;¾„èííeŒ9ìö†·vÿÃsyªŠ]¾´ãøX5¨ÜÛ(Å’êßþ` W·ÝTù¨ýÑy:ñú ±V sú3_ã‘Ö7Bɺå¦wTOiñÀUŽM"»0"».¿÷e™Å©2š=_i¡ØeÚ¶®l÷þJÈcw6Ðz»k2ÿâFÃ_.¬о½±ìÔHéXÆP4O‘‘H-ýP£U5àÏ'<’‚Bnç½Ä]¤üêÇ¢-N€Û~»~y°LFÛ¿gý©Õ¶ ’…ùÇ!˜§®Ôm°H^ÀZ8Ùg‘“°fe‰.ï°Ð–Ív¡íèuÆÒ½0ÇÖ­[õòä¼”Ê(‡Os”l¨Š!ƒPÖÑb1%YؘÑ$% ÀœÀZ‚\÷ãñ½ÃuÖ•NjÀØh­» ÈËFFàB…±X15o‘SGWÙ²{“8tjüή>éì3—ùw1tåÈI ¡¦éN—ùúº‡Â¯äD¤¶vˆ`[‡r2[ÉÕ·ÀT½œ"­®SûІæK‘Rº¼E;qX;ð†¾A6š±ùVv3T•E# ”ØìtÝfœs½¤ëß‘#òò–J<=rÚ§üÅ„÷õˆY$l¥9u(f&æ¯ûm¯|uïûooøôV=óz€›Ö•/³ øk‰ €M;lÔl ç3Ýš„ê~q$æn³ÈêDš *¼'#x[MÌ)9Øn·7öœèûqOmÁDâý7»Bj±TX|S!˜ãÙƒ÷)äì)Ú>j¹gî'8_ã‘”Ure•ór¨«V¯€Š\ŃÐrÄ0úË”–(ñ*@sÊô×ß{Ãîý7®--õX˱áPúó›ŒI‰\ì;!ˆ¦cõ†­'’k:Òê5S#ëú2SN%m]:þª£kȺêFÄáävÞ«¿”ëî>i›Éhñ0ÿ8áyÌSWÖ e7È­"‰üΖç*X SdžEN^Àš•%º¼ÃÒ1‘]¢,Ý € ›ÊŸì üêųٜº²¾ÐJO3 ”±‚´–)Lkšm+Êdƒ%_%Ož<ó„“³±(·u‡²ëG*Œ}dš4ÁBÕ4°îçƖœ€µøçß%J¼H,E.çàÎþä«/jŒ•ߘÞêjjÔ†9¿þ’HÒU ¹JËõ. +×@·×l]wéæùÛ¾S;qŠE‘ß|ªŽÊ²Ì"ah±;Àq¤Ð3õkÿ²|u-ÁgS2RàÀžiîËòVвo6Èü÷ŸlH)Ë0KV¯kR±*â. «J·²Ö'ÅŽWöØ¡3%y.òq×»Û]XX?ØÍŽìÿòpeŽ‘P83ÌZM|ÿXº$nUÆ‹Gú&ß \Þ™þ½ç™ÕiþŠÏiŽ‚ pT8ýê?Ç-Ê]Ãïj  öAU™·$!)&b ÙÔ‰|t™´õDruGÚy¯•‚äº:0»)˜çÁOªÏ<át–]°®\£î~€b·ò~d>»ÞA­4ß9_GË“'Ï»A^Àš•‹‹Í-É ïze‰®ûg$žÌÞ÷Ç¿íìŸÐÿÝÒZÂ2{„2vJHŠeô»œ·]ºhNž×5à¶›ñâÉjq9ŒþPrú>üÁÕÿç[o ŽEYñ'ûÞ¨œ•—8¬•˜ à^–å;1e6íðéß…küŸßh0ù5Qª­¿á—Ÿ|À#+»üé­cvƒòkÁ²œÎƒWÎb‹—óX"SUb–›!&_UµÁ>,sBÅl€7Vʤ’z¡Œ±H˜6¯¾šv}â/Ö¶ò]y}ïÇ<—%/`ÍJ^ÀÊs1K÷ª˜‘“~+ê&KÕ°L@D±Ã”Т•>Hùâƒyòä™g¬Ô ª%»ƒE’j,}\Ú0î@ =UF%ẺÆ<…K#9h©Ì¿Kt.[$_¯ª³x`©{úÕnÿñ·îò<£ ”P†çù&9Æ)*²†yT¯€¸v°áAâpêa,´¾i>X·mEýÉh¡ÃP½©…U»a0–|ñ-]ÀZÓä9|zÜ(óî¨ýésgNuNõ%~wÒN >|ïÊË´pFbˆÚËKÒ'† ÿÔç:zÆw¢'ó† |ì³÷Ä’¹Þìû܇×xao¯/”¬+‘Ö”FYs‚çäòfÏï2Ó"°U ˰ìÅ;²Ñad³Zaá>®*,3•ý1À¸“Ÿ¸åFNnyG ›)2+Ož<ïòÖ¬,ÑåÍ ïºdé:£Íȉ³~+ë õYr@Xqhr À&V â—ò°È“'Ož«ÀFM¢Z±9Xß0¯q\•%F‚Â[ðpÝÝã[6-%kÁMš.Ë]á,‹1Ucø™<°öñ…’•^k˲Â_ú›GjÔÔÔˆ¿fÎ{c¸o™÷c^ÀÆuU/ýp²)¯àu›uøìØP>8»i]™Ù(6T9Ou~óJ:Gê¼|eãå­ë¬Ô4.„7V'N ~øÔ)%ÙœúÉÿóR÷`¸¨Àø¹¯é‰~á«{<º&€º7k¾7„ÁNóîœï.Ó<°D¨ Qaé¬PÀH4{ÀŒXF:Y×Ïs‘©žýÖ§¿ñ€AâOuÒ¥o$:L~ôÏŸ FÒ7¯/ùÐÚ~p2_ñ°fpiD´SÌÃ}1ŒÇÅËTÝjQ‚ ³ìç‰ç¿y|\}Ûm™EÂzLqì0lhf(k “7y77ÿ‰®ÈwåõB¾ó\–|Ö¬,]+ïõî±t¯Š‹ië 0†¦j'ÏQêðóP3ÔÞ<Ø]¦É¯0¥ òîKœë{<¾§¸þºÒJM5Õâv€tÜ :2úK„$@ \Õîq Õ3_Ж^s™CW.ѹl‘˜ëXVË…¾l©ŒòÌžŽ#·­/<Ñv¢8fÏòJcc#À˜@Ü+ ¹ïÞÂI‡£Êë‡ïiZÓäÐPéOf´ÔÏ)ÖÌJÍg9ZïU>_Ô/®ùïà$ðÐÊoÿú„Ó*øãßyâDïp¤Ôcùæçøîç‰\Â…\-tôUÇ<å.†ñ¸x¡”z *D!D… (cÎæú<Óu¨h@ÐŒ¡êaÓÌQ–ÿÇÞ{ÆÇq]çÿÏ™í ½7 I°÷&6‰©bQV³Še[’;ŽíDNò·G.qdÙþYq“íÈŽ,[½wQ")±7°‚‰FÔEßÞwgæþ_,‚µØÅ,ï÷ƒ‹Ù;gæ™»÷ì¹çžá ÷7H/šŸõÙaR&LGƘ°Ö%Q¨{‡Iãá%% µ¾(G‡×Ò°C:( ì_p£TK£Xú LÁ2° Æ„`áŒC’Ó-û2RRH©G…T i™¥& pº?0Vc“…I’"4& õp&‰{3\kÔÓM\.—Ïç;ÜÐû¹e)‹¦™‡úN m+µ¯×j©³‚Œá²”±vLòÎd`çšM†áL«ª)gó*ÇÀŠ>ˆ0 6‚N †Bwç¬ +§¼·£íWÏþË[ Ö/+ÑÁ.~q_`o¯!2C#¤Å¢‚;cLTßú^ôE´÷©ÄáÞ×é^¡=[ºœ&nµnÁ¥šâÁ-×Ι@[ ÆÕ `]…ºw˜4^R¢Ü»b4¢$ÿæù£¿~î0€™™R÷»òÐ\ƢϓU]Eái]2± Ñ² ,ƒ{Ì$ú B/IIÀ9eAR¥ * õ[aIÏ()HH¿Õ%C¢V£e’i…NÆD<ò8àD™­¥á¥¦¦¦@ Š¢Ûí`à±v®€Á`ˆ¤“·4»¦šK¨§5ÒòGðh“摾Ñ%„éíHô @N†!ŤqzB‚ÀM+W‘£èÃ\j½!è”ú>!ú\†”éÓJsûm~Á`ÍÂB¬ÐËãuß6©Æ¹¬‚{œQ©h"”PJ i»Fot9­&fK:I¢´ cÒ¢0ß%ž(Ô½C¢k`¹\®„7>$G«¾Åöÿž©%ùžÕëçéd[-ˆÀç®åó7Õþim¡v9ä“uËÀR6Éݯ*’OJóHwK*uwø‡Ç¾íÈÿ'"¤ÀTArìæÍ¤H–6«;±ÖŽ“ñL M)•;–%vŠÎårÑ2X‘ÞÔW~/8‰ðò\zº¹Ð§ 7w8>ÚÛý`(,%ÐìË£”ñW¹NBŠ$H’ÔØØ ¬¬lêÔ©:Ka›#U&ÚèÖ·?iõøÂó¦eÿàkK§ä[P_gVÀëçˆ'kéȇ ®ª*UtÐPÙžÕsJbÍc0W Êþ>¡(×½SŠ­D”{WŒ&º„°¬0Ev7àÌç,”4C@@ôÌGd0ÅðÂèo×”T·Ùßl}$+‡_¹Ž«œÁYªEª‡²m~ÿÒ1½î—67&Ðì˓ؔãG¹cYB<œöööP(d6› ˆŨtÏ¿ ÀÝ7TEÿ¥§#µà¶ñ¦§¶J»·àjØÃ×.‚žhUDÒP˜F¢ïc1êë½[tý Ñfzdã ,Æø4zs¹RÍÐp•"®ël)wbIMŒY ã*#ö¬;vÜyç™™™‹eñâÅo¼ñF̘{weìÚµ+!ÇÑŸ%J¼+FdÚÞã"SòÍÔÓ€˜¦ž³ƒÆo È gÏT<Éݯ*’OÊhw×pV*JbzŽðà7øõ7“Âb.e:”H·×ØõþðÉþ»ÿO¯ŸØs¬'¡†_ŽñŒ¿“AJæá|*l6€²²²èÑ%ì¶ÖnçÏŸ®=ÔÐo2¨oZUÝ™ö·CÝŠœC"x›2•›·˜›ZOƒ„yT&&b( ÛK½[Îþõï@µé!Q•–¨/ÝÞ§f2ôGÅ R Nñy/ÜH, ÎÀbR&LGƘľÖ5×\³zõê7ÞxcΜ9õõõ=ôÐÐÐЃ>óM4̽»2–/_žãƇèUUôBk¿'–r3 zØ"OH¥ÿ˜¶@ëBÍtüö`­¤÷,+)HîþxU‘|Rš9#<²‚rÓ5xœ~¹zÓúBÃðŠfÎ2 ¼š€v µú?>¥yg{ëË›u:UD”þ—ZµÀ}óÞ¹?‰¾Ç3þN)•»>þN$ñûýÇ™Íæè;’Lääd¿ðþÉ?¼|À¦µSušaZµ@ƒ°“ôeNÝðw$-#n¦*31ÚàrÊž >g,’ÙÙgÃy{†4 Çëô«ÉЕQ«)@­ Ñ"@Ìêv@¢XLÊä€éȓذyä‘Ç<êa,X°à™gžÙ´i“XÊu„A‰(7¬9Bk· @é™õƒÇµòë¾mÞ÷ï’AC4¬5PA¢T­ºJ v0Œ„Àƒ3pz¯ìwÈî´Â’ý¦öþp…v8nîÝG#«fÿPÜù'JN­(³}|*ïñ?íñ‡‰7yc[Ë“/pã5¥•%i =sPÊø«Ü±,þ,—ËE)µX,#a4Kà°u'€»®¯úò­3Fö—%€“:ý¶µ:½ƒL>µM´HörU!b(á@e€ð9×€œýâ4å"rÒDØúÁÄÍÀ²vàªfÈ Ç sË×H[ÞC8”ð ,ƒq•ûÖÏ~ö³Ñÿ–——wZ ­ ˜{Ǹå†5GˆÀ*/L¡žfÍZuz*=nÀ‚èXúƒÁ˜X²ù4¯ìÿ­û¥…šC…þHªäÀì<šúŒ÷áS2d–Í¿/òˬ0ûøÃÃ#òo_8}Qßb›T,¥Œ¿ÊË¢6Çó ;N))gœK`wúZ:£æ'ß\~N qèQóBNÜŒT.¹|€^ihøNMt¹ÔoåÌSù¢M£÷´…AÌ3°Ÿ•€lí@rò„i3©ÃÆÕÌ%f D‘L)O´} ãª`Â}—÷߯Œcï7ù`¬+£®®.!Çʽ+Fˆ°J ,4`ЭQ­ÒÎûógþü¿¦<ð9Ãêh÷ ?Þ§1&3Éݯ*’RʇL›rø «8ðºo[É¾ðŒƒ‡¸#§"íµ¡€xÕ·u3_×1ê”P¡¡Nw—®kºtó `<X“AJåŽeQ›ã“ãf·ÛÎ `ÉÀÁcMV-($+‡›1›_±–˜-\Í\nÎBb0ññ †I™0c2±,»Ýþ½ï}ï‰'ž˜Ð£LÊuﻄ¡¨¨(!Çʽ+Fhêp(/4Òà LЯâSy3€ÙêÊ)Bþ:ÝbÓ€€†=M&)HîþxU‘”R¦p¦¶Ü{½nézÝ’ôÞéN‘SÇÃM6êWÌRWhè ßǨ°Òèp÷"Ïèê›zaø%ÏÒdR¹cY<§è¬Vk}}½×ë%„ŒÀ™%„­ÝNk£& “DÐh1rìA(c“ËgbtÀ‹‰&K9ò{‚X“¡?*¢:[>Ÿdç%Ð’‹Â¤L˜ŽŒ1™ÀVÿ­·Þúä“O®X±b<û“‹ñ裎~A]]Ëåùwô¦Ñ¯].×èð핵à÷ûqÆUJ” WÖˆ{—,Ë$¹ÑB4,800 Ð³8~¼îäi;€ª< TR BR9óH HjCáL-ƒIx¬…ñ·p^TèY°X,–„Û0-Ûsäs†Õ·Öäµ­à|f/ñî Ö¨QO-kH[¯[²F·Ð«%>-·ÒäN3kî¿ÅiÑJÒ"€úÓŽ;#¯‡ŸR'I—i!*åÄÙ0žF–N¶ûaÌ¢St---q°ad“ÉÄóüÈ&I¦QlmxnÕ‚B4âiÝû”Ô»Eêý\HµäOèuHš2ùTŽ›ä ÓHô£Mv.k9w^ ¶ €éL+V6Dûc¯ƒ2Z8SUÎ-8Ñmlg1òÕª€+ÉZ¸t ç9® =‹«ª…G}ô¢aLd‚f±¬VëÆñ‹_¬]»v\v‰²äŠ9xð ×ë]°`Ѩ°b@ííímmm%%%S¦LI´-ɆÕjmjjÊÏϯ¨¨H´-WBG{Å/d¥éü¦B<ý·Ãí 9™O¤gd™âÍŸ¿¹Ñ¹•_ºŠß¸é2M1 F ùÝ[¶“i{#UÇX8Óciÿ8âûüÌõ—M9–Ú+ÿ4wéÚõ‡ŸýMÆÇæ»Ø?n4÷»…OßU’göÊþÉðB)ýä“O!«V­J´-—cç΢(®X±B„DÛòé8zô¨Ãá˜={vjêĦ ûýþýû÷«ÕêE‹…B!ƒálâÏ{û=y§yïþÚE5¹/ÿâ&ñˆ§~Cg“¥ì¾õžuºEjaÒðÇz¥¡ï¥|¥0Z5ŒÊ‚ÎïÎp¿z$|êaÓ¦¹šêXɤ7K[ÞÀßt;¿x\Ù ãªeâÂ;â¸ôôôÜpà O<ñÄš5k&¢ýøŸd öŒÑ(·ðm”†Ó6ÓÊÒ£®v¯FHáÌ£w ”äèYTƒ?ÐU `Õ¨ËG½+µólæ…ýbÅœSVð½ }_Zb/Éõ»…~·¹¾e¨$Ïü7ï{_2ݬ!êKµ”2þ²%„c2’ù(ÂH˜zÛm(RxlVM I½[䡃4ÐKt9\Ê ðÉ÷zÝ|zêD[˜4ä½ÒЖÀÜšËÏcÌ!x2H©Üɘ¸y8n·gÖ—ÐZ¿ûÓ^†»ûÝ–¤”ºÞ¢^Y›µ«d閌̔G¼’:›ŸDÇœäDD¸?T÷ºoÛEÿ~å~!@CÑX¦X×Àš ýQ)Ü®¬’›»hrÎq2)“¦#cLbŸuýõ×÷»ßݰaCÌ[Ž3Ê U$6€µ|ùò„7>(×éÿí GÎÈ©oµÈ,æ‚þv5У*ùs2°d £ìP6sVb eÄ”äîWI/et°­”ªœüÞ*Õ9ëßUDX–³ZÂË¥]IúírG=GåÏß:Ïù»í™lïœ~Gˆšp4Ü8Öq'I’,Ëü%žå:¤dΘD3°F×nðâÇö.»ö—»fuÚD£ŽL½ “ziàyƒßÚf9‚ËÞœr‰Va¦zªD¥Km=nìû~ézÖ!»1EÜ'CT \éT®tò¦2)“¦#cLbÀ:räÈÝwß}÷Ýw~ÓápŒ~±"P®{—ا&7ʽ+ê[†þðòq'ø¼Aµ'âˆ]àRÏ]B(ËÐIl !ƒÁˆ7gXÕNU¯†¨Îßš–`†/UàS‚º,øûôÆ©ªÁ›gº^;’òò+Ó¾„ºp‹IÀÅÃFqcò¯"Tî@†xy8¢(úý~ŽãL¦³IÊb$üÊÀS[dÕåo‡ºÔ§»,ɲuD“Òã\ó¤{@Ûd¦DÈ+.yÅ®ÑÍû™ó™N±€žhuDGÓ ƒ1éˆ}k2;mŸ åzx“ß{V.ʽ+š;^€N#[lðÀ¡1^§[:]]6z7J©A Àb0ñÆL-7ê/R˜¤¦ A_(ûû8}áÔ_]ÙøÆ‘ë6Í´½ÌPc¸ý¼ï´ø3ùç”›JŒxy8V«•Rj±XF_¥ÍÛÙ¼Î,ÉO46µ]¿Ïwf»gdO£)Œ‘ÆY¾i¹ûÃÀ¾™ê©ÓU îÝ ƒÁH8Št_âƒrC¬ÖÄ¡P¿_åŽ^wôueIZ¦¿5WÜjXS*äÞS¦0P?€'âo'#æ$w¼ªHz)‡[Š)ç~) oMI!Ôå„, %w©ç>Æçß@´¹e™¡k‹Ý‰øßÉp4Ü_«/Â䯥\÷qñp"‘Hgg'€’’’Ñï?ÿA3€âÌáë˜ÕdòS\Å4~åºÑ\yÕÄ™w’ÃgÜo¼q¶ºREb?ïžðþȈLÊä€éÈ…=>9ž(×Ãc5°&…Þí=nQ”ó³ŒÅ¹æ’|sŽg@Är‘BT¦z)@ Y´juÜÍdÄžäîWI/噸Õ%TÄd¦nu;IJ8íl#A€‡Wn~Ú\»“[z'9Æ5}×$ò+zÌ!8áR*t ‹2ÑŽÝnïèèE1===55uäý!G`WW«¢ÿûHÁ†ïõpj,ËëS?7 7UT* ïŒXÁ¤L˜ŽŒ1QX"INsËÞ×|[]²7ö^ ¶„pB™ÐËër¹Ž;æt: !¥¥¥£7¬ï“)æûÚól³ª‹Ó§EAºŸ@Œ¦K´Ç`0 #Æ(Ò}‰ U@ Þ³rQ¨ßßÚåP^˜bÔ© 8©×ˆþ¼Ýä†ãÂö÷(Èû97&ÀJƒqà—ÎÁ"ié仩Ã@n8.7ÔQ¿ÀC³mÚ>RSöÿÕûn'p&ÿ’rÝLðå™™¹téR£Ñ8zÓá“}æú?$åkIÚŒ …ZT>?°ƒÁ`0ñBa¿Ãã‰r=¼ÄzÏÑ'O'+ `µt:”¥€ÊòÐ>'õ*§½íµŠ/ÿ”~²ªÕR‘Ü:^=0“†ä—r¬ ¬hwùøaiçÚßCmƒÔ>Dš=VÌõé%û€Xxr–èN„[vÄÉì íkN¸”Êuo—VQQ‘Z­>oSíñNSKE?Ï‚ƒ×òÃùÔã@Œæ ›b(…„÷GF¬`R&LGƘ(ìwxÜ ”RJ !JôðÀŠ–>MVê÷·œÉÀ’ú·SÏJ8nÐ鈖öZ¥[¢âßþáP¤fáÓbŽ$¹ŽWLǤ!é¥$cÁW1_¶„ÈGȇöGߤ]HàRð…ü!- _0Þàßì»d[ɘIÐ —R¡31Q&ÎÃñx<Á`P£Ñ˜LçgT…#Ò‰Ó.Ž€VD€È¼½zDÂP©¡ÑÄÜFÜHxdÄ &erÀtdŒ‰"Ý—8 Ð8E”İjjjrÜø ÄƒÒá%„S4Ç$ë{^Ê0 œ–‘ëI›ßŠþQ§—¯ý<BHrëxõÀtL’^ʱâW …%ü†[¹òJ„ÃÒžO†ß•«‚ÛVÚ5*nÛοü²·4X¢á¡móÅíkN¸”JÈF˜ˆ" @ ¹¹¹µµ@FFÆ…W¦®y0AyV¨9K•ÆY€’ÅæJä‚hCY$¼?2b“29`:2Æ„°.Ž¢Ý»É_€C¹(qâºwÈë D2ÌœÉþ.¤P$uÚ)&º~ÚpÓfò+×ñ×\+|á+/àyã3 Å3æÀÅ-Y5¼ŸF • <ù¹Ôéû·¤éµÂÛZžÕØ<6ÁÆ^ÂÂI_†’y8çáóùº»»€ÌÌÌ w8t¬ @Mq M£ºÛx½Î•ËÙ3 Á0°õƒ ƒÁ`Ä%ý'Švï&¿÷¬\”xc4w8”eI¸ô¹¶ü5 äl‹_±–_3ÝMÄhŠþ(PÔù1Œd`œ_;\E5ÉÈÀUNãÊ*pi\¸wÍÜÿÊãkÜçÐI†iðMÿ'›{­âÀD~>“I‰31#LÄå ƒÌfsaaaJJÊ…;ì=Ò µ2¬#Újõ”ô¦%|¾*à{!ƒÁ`0ñE‘îKPbœb„ÄzÏ»víJÈqãƒoŒú–!UÙn|á-0:‹¤Ÿp–)p$Éu¼z`:& I/eôkUsà"„[²7m¿ñ6ÕÃßâ×ÜÀå\(¨ô==£Díñ…'J¼ïßýºoÛ¡ðÉ ¶ý<Ç‚.¥²&Âà …B222ÊËËÏ»,m¢Õ í©rÂqŠ*_/83Ô5ÖÆz€=‚Pñ$¼?2b“29`:2Æ„°.sﮘåË—'ä¸ñA‰×'Z‡LÏñ•™¨S}4À@´ðy @«ƒáìã· Ç‘äÖñêé˜4$½”dì*XÃðsƒ‰«˜FÒÒIq)1™¹Š™<]¨d¿©ª@×nõzÝ’¹šj ÉÀºLtÂ¥T´‡39æÑ–V«ýf›hýní³?î~æõýÇÌ*ôd EBI¦„)™i`XÊ'áý‘+˜”ÉÓ‘1&JúOíÞMþõ ÊE‰7Ɖæ!Óó‚CZÓæÀÞq€žè.L¿Â™ô%ƒÁH ¢_«ã¸4þŽûÎ{ôÝm°– gº8‚=û®åVܤ_  Gœƒ/E4Â2™‡`%ÎÄŒ0qK5£î¨^iè§Î§wlÚõÝÔç^©°lf0È‘b!€$ç÷€° ƒÁˆ/Št_âsïEq7†ÇîèukÕ¤,3¸_p½îÛöQ`_†Sœ±¿SÚ·°¨ D1çÇ`0’Šq\\yÕoqªÏ?Äq rŒ‘%¾`Hܼ«-›O?$9C4sS/Åä‚•83ÂÄ-!Àê—l(îÆˆÀš–ãu ¼‡ç>oX·²×lñÊ‘T‹pÓíüú›IAñèý£w !I®ãÕÓ1i¸J¤üìãI©°h¥ÕS}’L÷âÑdh­ŸÝ¶ñ0Öœp)7&æÎ…° Jvw‡`~f`}¹û¶kÜN‹VpÇÙ%„>ÄtUtÌ$&áý‘+˜”ÉÓ‘1&B¢ ˜¤0÷ŽqQ”ucx|áOj»Ì,ti-Q[8ã†#€`Í4ÃÅÎb$€Å`0ñ„‹IÀOY,wî¹e¶móIß_?±y¿¾ú?ÉnõÈþ2UÁ4U©ÓmÔZ8ãÝÂÏnö…$vÿxPÖ@v1÷p.,€`@r˜Z(€ŠÜГ®Î P& €$C+‡ C¥†Z+K ƒÁ`Œ ËÀº8̽c\e­¼øã+Çîàâj]uNpHà3ùT„Cº'ÐYó.ú‘‘%„q5”Á`0Äbä"yÅP]7Ýý‡{­ù™Zk¿ìä|Ñ7½îÛv4|ª[ìÛØûA`oL ¾ˆ“~VÖ@vÀÒjµ#ïD¨Ž8ùÓ€ìé%/dšëõšÙêÊêr²L˜h4ýŠ­d0 #®(Ò}‰,€uÅìÚµ+!Ç º1ì®àŸ^«ðÈÍ<€!AÈäÓä㇠¢¤Ôœ=墟Š& p\’ëxõÀtL’^ʘ}¯§^.¬­r<´¨@×îà¦~už¦À€äpÈÙ'BŠÍÏ?þEÜ.¥‚² ‰y‚Û…XC²³2jêј={ gºÏ´1ºU”ÀBý{a2ðþȈLÊä€éÈÀº8ŠžŸLìú…åË—'ä¸ñAA7Æk[›½Èš…Es œl*>‹K•j÷æ/UÕE?z’ä:^=0“†¤—2M‰ÉÄ ¿bç©Dk« ¡Û è%ý:Ý"’Ý.¹Â.Ž‚º$o,Žv>cqO¸”Š`š֠d/tˆ=.A£"³ LœáÓM¢€€ŸÙÏAÎÀbÜ•OÂû##V0)“¦#cLð;ړŧìý~÷'ÿœÖþÞ&¹œèëêóÄâ£>Ù‡`ÍÄ\Hl//¥4àÜÖ€äpÕ«(%Õ%Ï=`¼©Z5€´skøç?àÞ|îÁçfzöBƒÁ`0â"Ý—8  8Å…L~ïY¹(寰»‚Oô©nõü|²äºí¾¼Gð³æCuñô+°X #A¦`ÄdV-D³¶Æ`óÎ&ш.@Cµ'úD?ixÆpÛ=[?ÿOomøÚkÛöwÆæ¨=”2]”Xy8áp¸··÷È‘#çÖÀr»¶2ØpM€éê2´½EúàMT¥žêªòžËÀb0 #î°ÖÅQ´{‡„ư’cé²<êWT»Ø³9°ws`ïfß^(dÖzÛNI¦KgçTP)HIukˆêtüÊuÜÒk.óA™G’DGÓ1iHz)£Ãm,£>¼VÈ»iã4GðÚÖÖ¾þþhVK](z<—+¢Ó.oèKßÿ`ۘŰÆ.¥¢=œ˜Äûûû÷ïßêÔ)—Ë¥V«gÍš `õICß±?1Ðs|[£‰çpëŠùtsô#Ò¶ÍøU×ùþÞÇæ¥2–ö–VqåUŸù„ &áý‘+˜”ÉÓ‘1& ø)žíÞ!¡3ÀI°tÙGß²ýì»ö_;d7€á–×}Û^÷m{Û·ÃwÅdÏnÛ¼»ÀuKJ²P9)aãmüú›Izæe>ýÍÅj`% LǤ!饌mV.eYY_á Fð?O¾˜¾×«ë¤¶€Ùÿà¾÷Ÿ3¿úŇn›I)þüú Q”6Hòg~ âX¬„K©hç³ÏÏ 644ˆ¢˜šš:uêÔ… ¦¥¥E7 HìÚ£ ‹dÉt]f_“ôΫeÚÙ&·6B«ã—¯õ¦-×ìÎ][ü•¯‘âÒØœ#q$¼?2b“29`:2ÆDH´“E»w`«?Cõa±ÓˆMr¥rf¯`â ‘H¡‘È‘füQMÒµ_xû¡nŽ5eÒ@?ÞK[KMÕsŽùÙ3XJ½ó †B™€ø}Ö7ôý›‰åÙ=ZìA~~Š»Wz{¹ÓŸ/kÔü?Þ3çoï4ì<ÜýÐ>ܺ¿ÓdPWMI3ÔßùÒ‚i¥éWpÄÉ¿„ð*¯åv»äççWTTœ·É!»E?yk €Û¯­’ÕÒþùð~¹î~ñ èôR@ Ì‹Ç`0 †âa#ðÅa¬«™=ÁcÑNÙÀKýJ„ÜŠP¡ñPg}-¼<ïíj †ÄE¥áLï{²í ÇÖŒk¥Ã™;b-d0Œó.âãa‹¤gV¡õSG SÉV«šÊ˜[à¿Ýã®ÜÛDmƒ£ææUe”bëþNž#_øà‰¾­û;ùùvQº’ Ôäíá|öËëóù¤¦¦^¸É!¹OþÑØmfä7,*—[ˆï½&·œŠ¦_$ @àyõ ƒÁP:,€uqíÞ!¡´ËåŠÿAcE·Øÿ¦ÿ“N±/úo4€å“²ø´j¿ˆ3ÁÙY—0+/ÍÖý½î×·6¸yÖ|@3ÐŒ½J—]8ž¢I§l#0“†¤—’`BÜè¢éGÍ'÷-8ùë;»¢o..õqÀÒS½òþ]î»içžúÁúýÏÝóÊÿ»¹(×|¢eè/¿’#Ž5þ&\ʨm ÍÀúì nÑ–Á`ˆþKú¤[¤[iïáC]´&­ô«k;¹—ÿ2<"†Bø•ë ÓØ(™\0“&erÀtdŒ‰"Ý—8ÀXWLgg,ç/†/Ô‘ð©÷ý»hˆçf`eñ©U¾^eˆìj„WÛãÜ-üè{W}ù¥}Çz5‚|}•{Àé×™ _šmÎã/Wúj„‘"îÊÔ‘q>LǤ!é¥$ÃX1n–«šÎ¯\—µvUæŠÕ«Š|k\—z rýQP:³"sVeæ÷þa8ÓZg¨+®Výô[+Á;ÔÑã¾Lã2hsä|]ÆŒ°$\ʨm õp>£{#IR0ä8N§ÓEß‘”6¿%}ðfäWÿíúc€//³ÉaÚq¿d%b¶ðgž­’&ð$á:2bÓ1i`R&LGƘ°XGÑ"ÐVMMMŒ[”Bà51nó\Ä–ÿ#Ú,>ÿ† ¿k­ÓWÌ¥e‰Äv(öàÂîunß4ï µ„WC!õuÊî&.e:¤xÝåÌïÝÂçß0¡öGiíržîžµXSå19Dˆjáæ;ÞöüÉ!…sùŒñ42º½ŽŒDÀtL’^Ê `‘‚b¾ 8úšžúþƵ†ÙbN:¤Þ„Áø»õºõÖ¾O†ìÉÒo\Qùöë£Oîù¿]ý¸(Ég_?%ø‰>wëþίû¹uúÏݵò_~ôV¯3ðÓ¿µ¨4gÈxù£¦†pk{¤wÝM^j  4q)BExåðIPÄ]ÜÏe.Ž‹EŸ‚˜°ŒFãðÿá0µv¾ëLùc3yÞPá•Â3 ÅiaÕ´{" ÿCÊ*¡Rñ7ÞFL–‘$ x¥Îo2 ƒ¡lXëâ(=€5ùŸ‚4Nd_‡<°‹Ï]N5A‡ÚÞ€šBåC+ÍSSÄâ û­ó¼‰@•³ö€»A€Óþû߇‰·pã¬æ2úü¼kcÃßù׸¸ý®S#²»‘K›sÑhÈ&uî ýDÎ#T€ÔTÐ`3@¹ôyD}‘*³—b˾›æ¸¯Ë?M$= 2¿ªO²É³ùtðãidd !ƒÁ`ē跎<‘Ó.Ä8@UN˜f ;3îÁ5†H07"©Ú#VÌ2¥˜ˆ1JÇ®ýsÛû¿Q¬þÉIóÛõ޷뽯~üô§à¯ûú7-ÊÛÙìíŒNu¨¾ß¿Ã&;t,…\†3å‘Û &óÒ¸<*JÝïp 0¾±#n|F÷æ¼XrW[ BëÎàñ…Ü2ÓE´™0f𛾽+‰åœx8‹gÃ$ƒÁ`0 X"•Æùã|ü(=€•À ¬]»v-_¾€¢‘÷ý»>gXÛfY늉í—õuú·s™‹Ï+ÆACv¢IÐ7äûò÷7?üù™V”ôŸ>hÊ(IIϽt‹õu€×m¶ì¬[Ÿ€.µêŽûšÄ¶×Ü/TªJV¯¼^|þç¾™î ϰ:Ôÿñç =:½X7oÂ"kôsZÔéŸØlàðóÏ¿òу?Ñ+ž~N˜ú Tnomúî+%ÿsOS¯•úwDMFÈ–Sæ>—*Í þm‰Õ¡¾úÐÝkiE"ÈTò§P£Ëbo ËÏrdw#‰Vk—óGÜ'ÉtÙÔ€Q-ó™Ë¥m»%ž<§9$‡ O×úAŒºóÙà‘0“†¤—r‚j`w>ûèã,Uœ&@4¶·u±'¡-,÷ô ¦Rê9f ˆ³Ið$6ßͦØjfiëþ`zxÅÐ#×õŸ<¬ÝY—åŸÍÂÛùŽÁ#[ü)Û·š ðE½­AMzª¸ÙWÀðþ—óOß±Üoäô¾ö_[×,,¼÷Æi8WÊP(¤Ñœ-òXWÊã²_æ<Êç Al‹þ»@3=3Ú«0ì8‰.+DŸPöEÙÝ(¶¿¤žù#«ÝeÛ!²·°¨(ÛŽH;…¢MÄXòiC>£{ãõzüâoÇ_þèt(,Œ„à‡__&”º>xáx†Iä.=W„Q5°’¾K^%0“&erÀtdŒÉ„°>üÔSO=÷Üs.—k¢c(ÇÃM»BGo4¬Ë$¬+`9eO†ÆYih¢Iž%„ÞÔß#»ÛôÆ2UAô}ºßÊ¿à¥÷¹Üž··ݧÓ-*ÚyhÍêÕ 4F%ëRß6H! ¨ Ýp©ÊÒ9Ò'ÙäðéÔ”Ú¿èÖ€ÿp®ú´3@Ÿ:<÷ö{3U""ˆ¢üÝe:½Z¾é*Q’i}ÂS[‚_¼³ãÃ>zq»gż×6Üp}~¶‘ú:þð±a_›á–_©ÿaMC(’¡K+;Ñ)¿} è œÓ/~y ûÉ£y·.ÑfêÄÓG‡Â!ºðVî‹Spžô„¹Gër}b|ö›MSέ‰”B%p·ýÓ[vWP§æîš7H …œ~¹äÙ5”&ýRÍ,3Õã¼àÑþªØ§0 åy—ÑõEŸ/dw“xê7åC­ Ñf«ª¿%ÛjÅÓÏ E"©(»S­ù§gZÕ¹Ö:TÏUt©6l9õú²û†Å¾å{wVÙﯲ‘b 5¸|[Rôöy yÿ¼ì¥¯¥ÜÑÔ8X×½½¶Óí í®Ù#x½ÞcÇŽÍš5+Z’Éëõz\öˆH?¬uòrÓÕ‘z’N3\:¾,_›fŽ;ÚK© ÐæõÞ™µéÓ^É× èèà™iü- ôAŽH=òEŸ)²5 ÔÛŽì• bäØhØ@²¾/TþýgÒà³A!„PJ)¥Ÿv–Ñív‡Ãa§Wzö½Ódé¬Ü%Žã™|¸à‹÷Ï›–½#hýòLDSÙeY ,ƒÁ`0Ç„°î»ï¾Ûo¿}÷îÝ3f̘ˆöGs tÂ+ûëí³Æý}<\Ak{ðGöÝkÜC3.µ ÊõÇ¢¯¹š¹$5í¼â“åA‡?/Ó8ö®W Ù ×Sœ~FCÂ!u6¯/JîºÞ¢ÞvQ yü•³"‚¡çØsys¾N=ª-Ilúƒì:…è*)@Ã.¢Í¢­öÔm2§tK»ª^Õ²CÅS ²[¬°îÜ"¶&=¿ðK_pÇÀ“/àþ¸Ôùƒ¦§æÕ—þúì^Ó±nÓ'ö_¾þÒÏY5Ã|üµ#)úܪ#ºèÃmdNUÖŒ©íV÷êJSÙá÷Ÿvä}2¨~~{t« À‡6ï›füϽŸ,w{y¿{Çñ³ÅáÑ'õØw‚ÖäÛ]Áò¢”¿>lÏ„›Ë¸Nê0˜ÊßkÜøiûEt ¡R3 †bITÆ3g® úêïÀe,À¥Ï/¶Å¢B²ÓˆÐq©Ó„´\ÉúõuE7Iý; èA8þí£º—kóþëŽîª2Èö£4ì êT*d×IêmOxÖ•°v×6i œôÌŸžóÄ¿¬.ôGžúˆäæ«––ш'쳈rDЪµ—[tÏj`1 ƒ‘@&$€U__?ÍžG„ŠAnŸ°7x<ά׶Ÿ q×ú*w(衞,MêÎà‘ ߬_eæ 4d—퇣{risFו¸ QV ãšÔ“÷ï’v}þÀ‰wSOšášOß)¢I{K „é˜4$½”Ñá6!¥Ïùì•bÛsáÒçEßáÒæe2õ[£ÿvúsÝ][M|³.ø /H tðâÌÊ¿Ùn]ˆà3¯áò×e7íè„ÙÀ¯šm±ÍØ×w[M®Å((ËÓtÒÁ¯Ï>µÉº@Eˆ(ŠÍ'£M9½b{Øñë_>n@5–hffð)'{ž/öñS©VE]Þ<‹Q"íî…×¢»ßÿÓçºE.'§¨D•’k/Wç‰I&Ä4sI9r‹:lÒ©ç(òt¹«öôkÝöëo+x½Õ_ýÚÒÔá,I¯½e–kfAà½Å; 7þRÿµž½Ï9 øüõ4d—z>”ºß©Çí³ª²‘ ®ÌÃymK³äµk-*³%íùo/W«xiÏ!¤°„†]á?™ªÑðé³ —Ä©•ô]ò*é˜40)“¦#cL”QËG2¥&N?òÎ=µîÃ_}yàKèd±úXU‹Ï0]¬ŽuŒ.úiJñè_?yúÙF• RQß³¿>¡å¯ÿbQJ¿[’·ëݤ_)õlöê4 y„ÕËæÊÛiÈOC—*W±uçžÜó›ï®Y1V½mJåú£dwÖü溶οîFèô£w‰}K È®S!¿3’yDäˆgÐîõè¨4HCeÑZTQŠŠŠFŽûBÇ—hfŽqNa§l«¾æÒæF¤ÞWÿS}zù5iA1´¯6¼iºû–Ë×½§Ÿ[«²p‡5P*÷;"ŽS'®}è’™=k°¡ßÑjhkk+ÀØ€äÝà3ím½Á`2 ?¨š=”_ÂKÄ« "ÒÇÛ‚';w^_YZXòöÑm|‡æúKÿÅw[Î2•Jå/F½¦9Ûk9àÛ ,¥à›ßZ³¯vóMi®ßÚ Û<€™ô¿ŸwúÙÞŸ}”ßcGðí¯\Wlÿ9õ쯔9{âmNæÒžŒ“Ón§íþ––àC6§&WÿÃæ§Jg”Ÿ.oÜ›ýjKê/Þ÷nýßÿºã‘_lfKµY]Þ˜÷¨Ì¥Î† ÷ µ§úÌ"|zFB·çéÈP(LǤ!饮•ˆCséóÐõ&ÑežmâÒçáLê{{ý•‡ÓºAÊ£ÐÉ#rCeªCZƒ*—%P{Ô^]byw¯cÕKu‘eù–²ü¦Sž!—dÔê ªœ“tø"êö퟽jµV«}¦òî-ƒ¿_6øæoµõ|0gÉá&¯ÇLÛaúËÞŒÇ6Yw·9‚ˆ„'ž­{íþ s7Wçäh¤þ'›;ïú㛿øzºî|ü)yAMñºUkÅïþ§‡ã D ºá"ú”âÍ­õ\geîß^9ÜÂЀ£‡ÜúÓÙb O MÅ—oV’†k`%}—¼J`:& LÊä€éÈe°jC C’ã6Ã:´Sì=âÚ±?Ò¼a‡×â Ìwb~c`í!ß ïh‹+h§G‹a9#¾~ÑîäœnÙç•ýÍ¡»jæðãʄ™êQçe`¹¼¡v«ûÿ{jÛ‰c.€„ÃøÁ·Oe5€Gÿó@zŸ%æŽ=xdÍòêÍÛ{¿²Ï­ yÅþ¹5ßwóŒ¡#¹&ó†Üù#"¡oÈ÷Ï?ÿÄî Þú­7¿}ß¼/}nF $n?صó°U«4j>ŤѪyxÝs ÍsSÍíÿ×Z§6 9uÑ~òêüð^QŽmËÑòA__¯KÊÈF€4€À5³!É´aûï«ÜÄ¥Ë-ËèÏžŠ´í3€åm}ë¿_GŽÑW™>°jñ ¦ìn»Ž÷=¿wžÁ o|^ ‹Èá9«_õQ†_PëÕ:€/(Ãòo^³>Wj_^õÐ7o»¶âž©ûÚ-Y]ÞL±î€ñfš¨Q;ûûåÙýÍÅcgÊ©Q0€Õbß]ظ÷ÇûIÕßß9ûïïZ rβº—ŸÅ ‹Dƒ¾J5€Óv¤ va¢> IDAT›mz¢õÓ`·8pÊà;j[úõ²À#µZA ~µ]̾IÇ 3¿ÞšâEîÔÒ\1RÁxaô íhðZZk¯¯#úNfn5°÷n³ã÷s4G4÷®s¤[ÅÌH×I$3ãÝ#áãmXô…gLÏ P†^íuÓÜ©#±TóY+!€œìÊO/õÙ§ž§#C¡0“†¤—2.EÜ/§â³–uꥶ 9g<}-ŠÛP ¨ ¢.¡‘6œgxòI£Ó-l=ÂWvYt†Ý½ó©$À¢Ìú´Tï rò€_¼&+ßr³Å ÁæõÛ_>ŠûñuÝÙ! P¡ œDtíÊZ#eˆXÍïž6<°Ô¦É^p¢%4Ó 5 ªLÑCGDePÖk9hµ{÷îÕéu½Ád2efföY­}ZsX\ ·ÓÕk Ï›–ÝÜéØ~Ä z±ök—¸·ým-¾‘ÈÒišo.;ùý·òûµ½Ÿþ«_ÿÎ ÖÏýÊW¶ÕÂo^è.H 7µYšÚÚŸ»ãýßmª.¯‹õ‡Sßj{ðßß{ù‰Ïd›ì>bͲȊ rϺvƒ:ŒÝ7z|B¨(U›ÆÈ\Žf` |òwÉ«¦cÒÀ¤L˜ŽŒ1!ºÊ,Z§`œ{n=ì¹ÔÖmÙ/ù¸ò7Ò¤šÇ}Á¸´Ì{ãL×[G-iFi~O礆>yg®¯úæÊ잣»~¶Ï ­úW&En~ÍÐüŠ~ÙíÆ‡æß<^Óý$<à’²y}ŽA§ðÆ–º7>ª‹nÔäŸ,³>¾7»Ç£6 2G¨;r¶„<Dk§[ÒUE_}—Zu ´¹g]åòUsG<(Jñøÿn=ÙÚŸ“Jû„Rð']ºþúòoO@uÚ¥É1G¦åw6#Y;]\qÍš†Ö¾ÃÇÛÚÄïÜUP]¤…a*U¥Œ÷”/@E]\¨J¡H$]Þ!É2§ò«¡ E¸º6?f–‚ß’ÌOö––úu„œ=UJÉ 7«!õ4©k†k±“TûIÖy‡ÐÀ9Uz.‚´úv¿*½€Lpõdå9\^•F{©<~›;ò×ï_ŸõÜ–Áyé=„;´Î½¥·tÑžÃmýÝ›V^Ü“îìq.wi¦ Z,©ƒ½F¯çÀüm¨í©UÛN¨´&üò‘ÛuÚá9Û2éVþs#Ÿm29š²@…g®Ußìã=™¡?íúï'B‚jMË\íì¡Y÷{¦ûS¾2ØýH-ÿA.'OÚíãr\äüº°zwÿÜÿÇkP}ï¡Ôbÿt­¤Pá­YóÊ/8YúÆ=9§>ÔÿNo›Úîôj‰1H;f_'vÞñÇOP5£P|ì–Ó ›~_öçû:Òªn"5ûÒ7ûy÷?ÿù¨!H÷Ýôo¢æS?ª¥'ÜØºvžñú¦OûYƒÁ¸b6ô|xÈ[Q ™š¯{ïX£¦. udyܪ°Ñ[?FP 80(ÕdfÔ!‚¾–E-3o‰îS~èµ_­´P[«}¤@Ú‘/í@/±æ/ãI0S>þRãü¢‚l¼(Ê}ÿ|{‘Ó)ÎUù¨š±!H#ÜPï Þ¥184:7€€7ÃÖ= @ج¸ËÍÏ¡83?=DjŽ©6¸åSÌ´8ä37ôô»>þà qÓªì…UBÎO$W¿S}óǃ2%/Þšb§šÛ<¸ \^·®#%í™ü÷›n_À÷V~aÁ $a÷©ð[Gõµõ^ Š.+ón;eZZ¬û»¯Þ(óªBy[Y!±,ŽI)=ä:>Û€ÿffk¶fÓ{! ! ¡¥Ð‘¢ˆ ‚¨€íÔSOÑC=¯zÞ+çéïyŠžŠç{Š€åñTz7¡B $¤÷^¶·™yÿXŒ0ƒÙ]¾Ÿ¿fŸg2óì~Ãfùí3Ϩ¡Í*ipJ?ØtfCa{Nö0™LFDU5u§Ëšô*Z÷Xñ¾ª°W¶Æ5¶%©Á “Ì *x¾ÓÆu9n'¿±H›×¨&¢ÔpûooW3¬þÁ¤¢'¶Eo?%Ù~jO÷øÍV7}¹e¿ÛiV´ÛõãìùËU¨$–¬àÝOu¤´:¾»0#¸j@P—“dDäæÅÍ; ŠÍ•vFJƒn£ÊRs›+Së ŸnPu9c&‹».|ã„M9-ž_ÜÍ"m9kLø¤üv§pî£aˆ¢ý¡¤U‡[SRƒ[u:Õ¶º"%*}¤Åî–ÉN·hêìÒÕxJ£嬯®9Ûè(6I25EGkã:~÷ž-6ÐvÏøz*$"Š:ºélY¯\Ý*®ÞÕêt‰*;4I(QÊ™Úù²/ËKëíD$aÄ»CKÆéÍyiÃò¿,/ýæÜ- “'Éw³Ù=•Üÿݯ¥;Ž(›ˆ¨fo‚+£¢L-òZ"¦SÃéM®´¡RÉM¶ÇÖv®žÀ5ÙB”-æ˜ÏKTD&µd€…ÅóÃÇšNQQ¬D¹–-YÄKˆ¨†h0&¶Ä9EÉplx‘—›\ª¿ÜV? Jþæ¡8AÞd½¥DíäUvÑ&•¬;Êý`Q¸wµ55”æÙÎËËë¾£mWWWuuu÷¥é=»Nœ8ÛýµIÏ.GÀp„K!"*©u”Ô:¨°DîË|Ï —Eé«Mê$3×"Ô·ð!ÁDµt°E·ïÛ1£Ì†™tb_âÚ>FHX`ÙÓfÖ¿Ý8ŽˆfƈSãŽýçhf–DL7©Mæÿ†QÙ%1GJD;[FmmODÃßµ##°øŸå÷ZÜJ"rGEIÛpûÓѰ(wgôÈÃÁì {y¨‚†\t‚%¦tOšPν²VüD.MbÇeñ‰Ê8N/×Û›c gˆéœ[çT7‡Ôœ$¢­9­„§oÈ"}ïsÝm1qñ§ŠŠ†ipƽSpn:RÂ@RèšNŸ9ÛÞÑ©ËbÆ»J¶D4t¬ø×ÜúI¯'ï«¶fìÞ¯³Mn?þ~ÉÝž1ÿxõe‡Ž”4Ûl‚&ìôˆA¹!†àɉ¢RJ;Žšm®‹Tš¬VÛþC‡Ûºì ‰Uõx}kPÁmi ÖÅØ\’í‡EOÊrÁ9FnGçkÝïs‹9ûCøî3@/8Îwþeá8Ž€#à8Â5;¢E‹þüç?ÓOÈ+f`•Ô:Æ(¾Úo¼°+‰¶˜òXï Ý茀¦v÷ñrk®¦ýh«²Þ!KI " 5Öš\N‡Íy®˜5i¸næƒÓf)+·¬>äè0¹Õ zà~å>E»Ùõü‚["B/15±©Õ¥n• m|Ý”ÒÄ;jÜdÓ swµØ•¢lDJ¦¾S©w ˲o“¹E™<Àì43ŽSlB²y⤻¾Þ¡q;S%2‰›ˆœ.fÇ6Íó‡b:L 6`l΀ÌQï~²§½Óú×Û›ïÞLDvÒo²<¡ H¢m ÌN"jS$ŒMG5DÔÔ%ùÕš˜³Íò• j·ÄÝ(3{Ë ‹±ú#›as‘>=Òvÿ¨öШ•í*>ÄÍ‹-.¹Œ=x²iüäsß ËȪ§r#Eg2Ÿê¨®ûYWÑØñÜýÅ5B%oo!bt\çn{è]i‡Y4…­¯±¶û¼¯w¬Š¯xÚ:ü±9Q,ÙÓ4[:Å¡¢ 2™L†ˆ4LC5qì1•"Ä6ÀY'!g åžg‘œŒ9Ì¿ªÍ¡-̹[Už®²ÖÇHN|Õ2)]ouÇJ-Òà¶Ä¯xî1'*o¬zˆ9ªÈÛ¼­dVJÇ|Á8mYò{÷V¥VÙ”mbY¤t@½‹ˆê£’½gýºu±ñ)AaQ«¿:\QÛe±¦¡cº¡«)^r¤0@èQýd$â¨yÊèÁì@iZ¤%ù‡~1L²¶ÒÀCŒ(Ú<ålà¡3†}žö_¬ëL/w¦5¶Ç7¸>½I›©ÊÊvœç6Ro×NßÿaPséŠiÚŠ¸äÑõßÝ =³à?aõ'O'EXŒq f[@àëóôÏ}XÉs’ú›sc¹<Ïnµ4²KŒNgÖœ﨧aeúB¶k[j­rüá†vCèá±OõrêÞ¥DËš*u¿aïêù‡|šßGYRë8[çìïQ\LÛÂŽìàãuÙµì>wAúÏ;‚=]mYùïwF· ¬þDfÁÊ–ðAGsî%"S1‚Þ·“¾†rÉÝ¥0ŸeQd˜6]æv§›yâ¯]ô]éGÆXœâ¹¯XDFØ»ŒsSL7G›Rhw³å¢ckã£î[PÒ$'"•LXzgåÐAÎN3}^¸¡Y{²PIDOÍh¢gˆu³Î.ysL“k`µÓ%So»ð‹7ÄÅÿâáì:͹Õå£L•n5Ùì®:¦²(eÓîg dR<ó\–!øÓ’Uª÷v‡ ±þçÑÊN+kàMLDø(O½Me:”ÌQÌ"jj±¼µ¾å®iCµ™Åe o.ß)ŠL€T°ºX†¡§>)3´™vå`‘Ÿwí%×®*s;)\æúûŽÇ[x–ˆæM ž–è’„ºd±D¤¦¦î¯ ’2b¨^&=ãü/^Ù„åÑòÆŠƒþýOò:á÷o­×Dé£ß¸v3°¼¢€åÙóôéÓD”˜˜è™—DD"ï¨ÚýòÏ—E̾!6=á»õƒdN§ psRöÜuC€kßÎõÿ=ª?Qð·GUŠsô1D¢³“å§ ¢Æv׿#Že/ßúCÃh벿¶¼`åÆ3¿º3*=Añþ—foíÒ¾Zäܸà¬R*µ2TÀrLæ·paãÙÀÉ®“Îû£Ñ™×¿ñNšã‰Õ2ž¸Ñ7ðù;Í fÑ#!™vÇ–§›ˆO(Ÿ:1úpQS÷yÓâÔkÞÏ)C‰áD[ƒ$~£ sy‹ˆ$‰÷0AY]|—ºjƒPºŸš>™êÚ¥µñÜÊ-Ý[˜³å M“‘ÔID\Ø.nŽÙØvæÔ “ýÜ‹ßarkn +„);b¤§dd9÷úȃXÃ0ÑmZö1ŠiæŸ<í'mn1Ë"Ôæ#n~÷ãݯ|\>al„jÁq£LÜ?æµ%Ç !’/¢‹ÂDǯ*brn*/ˆ*½#ñ–IT÷“²Šö·_«”ˆÃäÈ3ä²]E¯‘àbÔ‰DDn“ËÞõMçÍ2)WRc‹ –ýﺪŒ—[ŽËý¯Žc™‡ï”´qV¾‰–³tj@ «½S5…ˆ‹]•!‰v˫ՙ&Tü¯›W«þqOðˆ#­cYNqói7}HÁȈ¨¥Ý:ýÉ/[-Dd¸7-=øÛ›kªùãŸ5·¸oÚŽ'×8¹Y7S¸ÛÓņŒbäwñ»’ ˆaÿÒñ¿[¤µDÄÉ’Üuÿå?¸"B[ûÍWI¡¦h';¥¿û £ýöë1»ÍùÒïI"‘ýÏ«üÎÍüŽÜ„¹›<Ÿ=DWáŸD×E¾±#".æ6.br/'ýÚš÷¥u÷sú‡b%$º]§^g$J& ú¼¿5lèhWc^CåÙŘÿjÕ2á—SZ–æ7uqD Œ¾=@:½¬ç:Ÿ ’>ùiSl“KrÛÜ¿åâ#µü„²}ŽãžÞÑŠ!÷«gx¶ßìúô´«"üÀð0sÄãs‡¾ÚºtþªS·mÐb–LËèÚuV35Óò÷™UÒèi\Ô´Ë|1Eg—õÔÛ‡‹-%MòÅÛCMvN-ÞóÞúÚ¶6æ™)MŒm}ycÄ' Q¡ìâ'3l6[nnn@@ïvr’s5Ýõëµ.7sÿ8š>*ØÎÊ--¥ÅMÍÁ9ƒ#í2‰`d¢]-í “WCÄSK§¤`̔۴·\æ8àrøù%„ DÔÜÜ,“É8ŽÓh4-Íuñ†gæ‹*+q»‚›êœr…1(Ì)“ÏÏ·¶ž›æÝJ’4þ×)­¬èî8-×!«n§¤6»J”é"¥Œu:áij”}óÞÊ©£ã/@³³ãßm;YÞAD&›‹H‘¡²*ó?7´F”ða‰D$AÏ8eâ¾f&:–‹Î¨"ôçÑ!Êgï0hÔ*ϧC‡*$vxHª­Ö"1ȶAˆDJ"bˆªˆÎPù°à[47õþš€÷ð¢–L¡Ö¨ämmm6›ˆÌf3˱¤R0Jc×`»‘+9Æ $›p—ÍáðÜ%Ðn·‘Ãáhjj2]ü¹{ —ê∔xžokkcY688¸sÿ«‡ÍCsi?‘™ò½ «ÝϼñIK‡aþíÌ Î:QÀTiˆJE.ã-YDD'ˆÊ;=…D6!‰ˆa¿½Ç6Ñ}¨Ù»&$pºFÏÃä#ST¡DtÆUù†úø´c®Ó¹k ·{ìôöç+­±±mÿÄf0êxF&Ú›ˆˆÕ¥rQÓD¢]m»¦³„·‰§Rµ[¥1D™[ÊUŠ¿«§i¬[ÅíAJC¹RXÖ/ì;@Dìˆ\F¥‘·4‰]íc Ò7ö¶³ é™BžžÐá2È•$':tìlˆšˆ¨Ò™F”F§«‰¨®©“ˆµš»¦,ÌohµQp 2"¢ö®ŒDFžNùö™²©¹á®ÏšJëôIQ Û©Ž<Êë~X¢[iD÷Ãû÷7v’Vy›ZÉzn«Ä "Y K2UÌq‹ò!{ǨÝF"š.=ÉuDþ³£jr£K”plÒ L'¹ À$‹ÆïÙ¦¤6"b"£µ¬ú¶€è†ñ¶S¯ÃóO|:Q;_=#6#)Xg«þ¢,·ÍêLÕ}„LY²ŽÕt ¦8I]!-«Ò³šNÁ”$íŒÅ±mKænŽœ1ðíOB;øVs-:¦çþ&Á²Ïq\ q³u/pž/3Q[BøhEZü÷ÀDÇrÑß»‰l0§Û’¬°ì4iëÛ·|ý* Ëšóí%‡œ|›y×.{Á¤JO½o°dÎ=WútàÊ0 *ÖV“HLÈù·(a£Ďv¡ð XUNR›’ÖÝņ §$©¿ddß~12ÒU´˜‹¹.õUŠ–UOQäʙ˽4cÙÿñ®_%®ÿïŠÆ”‰ôÞÂÛç¾}™­šäÙ¨TÖË)½”´¿MkjmÕ¼ó¼Á-ž»’ŠÒˆFœ¶´ÁóøÑ:Wz…ƒÑüÍêv»G ˆ(gtð”Ó)»B?ÇqvêË㺽eªûF˜=¬#:âœMDlЈónõ(Zë\%ÿ&Þv¸*àƒ¼ ËÜš0ÜrvnPûk¶°³.ER˜cîN!q¾:}”«äÔ+ƒ–ßÑ2 ÕDjµTî}hƒ¡¢CþÕg_Í~òÑÏ·•ˆ.á7?‹T)¥RÁiiŒ3²ªx_£#Ú¢4Q°´ŽÒÎ}lu¨”Ì0vXæ”+ýú úÑ5ù³Íô˜•Þ½}É)dë÷Û2STwL-‚ÃáøÏ;?Ï3›,–åCÚâõJÅcÏ ÙÐ⸀€s—ªÕç.!ŒŠŠr»Ý­­­MMMR©TŸ2ÑÓÎq\h蹕š¸ Ëw—8²rª‹Ž銊ˆ‹‹S*Ï­4ñÑÊ-9êä¿Ð° 9)ÌS ›Ætˆ.b$Df¢j–{±,±™ß•fÎ% ¥©ç·'H"YbI%·"&3XTv‰ær¾¬:.$Gp´‘T³•kmã"ÆKª¿”ÄÌdCÇ1§ÌE3??×x¦ Y‘Ú=ž—ÇJbdŒtZÀØŽS… æÉDe‚P\Lîb"r,Ÿê^µœAKôU²uP½SúTþà¤ÚªûÈ íˆUEƒ£¤Î¬eÃ%‚HMí®ìT5½ý¥¹¡Õ¢Ò+n— ´¬#"!<\š’ÑýŒØ¡ÙÄqùð‰kç×OÍÒ¹Er:«ïp²2)«Ss mκG€‚ÉNÒEˆˆé2»·6›œÔî6)m¦÷TU3Hç%†‰\ô”¢æÃ)Åâ7Û#ÅV™¤d’Ë/úQšýÝvú·U5–UÌœçú÷›“ ,›¹ü=’Sá\0•ºjr*D¤JòÝO;V1ôkë7WQÀ"¢•¹|Û`Ù€&¾µ‘oKJ3D5µ[VQIU•b¨ÈSënZgÝ)KÚbÛßÂwx~0EÛÈ·'×tQVê­9êA—Ôé¶*Øê¡IÚ9#s9ÑÜ<3ÏÜãé±¢ÉÈïÛCDÄ0lj†öŽùÏ/ vº« ‰ïþºãàgšæbéÛCÿ¹#t|²9\W`qp f5¦½÷»ƒˆnwñ»ÄÛÚeÃ~ó¥‚MO„7?£h"•ÆÈžnh–†‰ÂF{1Šˆ¤)éšÁ Ï–5¹ùX"záhtEODXg‹â²¯ Ÿœ®RJµŒ}ظɌÅÄ¥dGŸ\ÒaÕ "&­ö,›@Dº° zÙ%–C½$ü“ôÈÑo Jÿ€á’®íX—a˜asþ-åhÏGÊeÜš/¿ùÕ[§RqÙÈÊ,»EòГ쀔}Ñ™÷ëj»ê³3óSµÇ0 &“ÉNWé” ‰‚¨Ô™D"§Y+Š”¦>(– ©ì‰3Ä9B2÷g?fë\ª,­ZðEG{Bûädu›…–½ž`mdÜ…ˆ¢Ù§fh‘ |kžñà Ï÷¤TXíjÕà‘D´5Á¶ÖPãp œâY5éˆãô—«Gq…J îV‘Ä¡%öà.ÞsÆŠ˜µ>",0ž!F´Z„…5Fþ…ª¨?Å6¼]R¤ŒˆÐ(–/¾c÷ÁНXߨҬT=-7ð“ÆgîÏ™::ža¨Â]wæË·'X¸)Ó¹‰çWæx³ñާ>;\Ã÷ld‰ÒlñÁÂüw¶§–n´æ4fWFTÖu JŽN¡ü‡q¹Kt?½ª#±Þ¹t†þ”Y1|dƃš™k-¤ßÌIDAT;S–•Tç²*Ø» ™y›{ÅïbîUË„ãG.Ò¡PÊþø7O Ò£C0þ±ýíß鼺–Ç6ÛγOéîf‰umûZܹy{–ÊpËݹòÁoWžt–yv‹‘„§Iˆh¢2Ûé0ëþö¿ 1²ç_éù›Þ‰m-|Þá`~§†;üË9ÓTc‰h¯ýØ óW)ñäÛEävIÿð£Â½½ú•(º–üC¬¯!"Éü‡ØŒ¡ý= ËÅ“PÕ^¢WäÁžÑbòwQ÷ÇEŽcsÆ’©K8sŠHd3G0!aDtä‹W2 ê‰èìÈ·&ñ)g³«÷H¿þ¦Üá<÷ñ@ÂÒÏnMúÝÃãr ¹»ÎÛña…Yÿf~tU¹-Ù`_ŸXvb ¼]Ç9³³ÅÒb‰ÉY3÷í+Ëˉ¤¿¼¹)«ÑÂÄè‹ê1¬4=VvtLðÁß/Mº97hÌ`Mcc#锌Ý)ˆÖºñ‘'e‚ˆ\JY“;AÂw0šX™vœ{÷bîî䦌)LÔvêöÚì[¾y÷†ž”[kEKu¡!â”Õ<³ˆåDÆ$Tîc—éXu­»ih©=®ÑeQ²êŸý’ ‰ ¢Q‚yCÇ’9ÍÿvÕ¤áòA#Óÿ\LdãH3Bž¶}x×-ÑX…cIŠ¥3Ô"cN–3dID!š ±é —ÊKjRÃ~1„ÿûWÍÿ›dÞiΆHÞ]ȰĈͨ-3ÚÏÖ=³8•a¶Ø†È’‹]U‘­."bÂ#/|RœZûÏ·gÎyyeãAyZbPH®µCÛ<93êñŠXbd!e m¤ü£ºã¹aÜ 6€ˆ–?s‰îLŠKhj!–mK sq‰Ò("J‘ÆT$Õ¹ì1 “š~¯3wómŒÞà]Õî‘D"b1¾S"Ñõ¬^Q «*Oâ~Ô'Ú4Yb®|°çÂH..ÑM”sÊViYU|£û$W¦`äq’)Ã=¢¹]ÎÈD‹IÈ; vv¼ÀÄÄ_~õŠˆ˜ ÉÌ»¬ÅÇõ]¦ºÊƒ”>–ˆòì…Z‹p×Q'¹œLd4ªWýa¸§»—ÿ‹drvàÕü!ë/±‰†ïÍäeTšoW ïA«ã¢¾w©;“;¶Fr<æ`IÒ©&]ŽÁ˜Zñƨ_<û‹!omÍç8Ö~¦jÝÉëJ÷mûãùEåmï¯)h7 ""›*œo@µÔ)vNïÐŒV i RìªÔª¾7’‰*óŽßÚXͦ¸p…§ñ7s#?ÞÖòÐ-AD”¬‘}¯zED’.n1…x+ªW¾Î; X¼£{ó/ÛJË*š†”x~®¹ƒˆ¸)}vwIöý…C•U/N-}bµs]~ûc•VîX…㎴Ê{ÇÚ8u"£ '"ÖÖã6±A¸à\â9â8JIeÂ.R¾¹"Ce‡šn§WŒÏkª²-¨K±2Ú­-ÏÕ¹™ïŠ”f"FDDî@ö'¸às‹VèXõDEÖnû‘ž«&ÍSO ³$Œd”<3˜Ó“†ÎÞ;À¶asøÜŸ?ÊÙVZ6ŸuUŸuU{v¸Yñç OþS¹–Ä›\L}›yφM#UÇÕΙÔaÝADtÄÚàÙß*تÝ#ZÝDÄ„]|šR¸"pøB“±Ìññ¨GþÜñ^o¿K?‰‹¬k*Ý›ÖÇëïu(צZ6*òïRÝXín¬j?3µØ9ÍÁ2¼ÀDÇ-¹-«"¢Òèå)Ê9»Ì¬ 2QŒîüë2.£ ä¦Î ºœ«én˜tÑ«*._$Ò½ÍÆÄËjlÂàÓFcõò¬ñê,.63p9bçžH(<$6Ÿ{mÙÄä+>ÃÈ2Fù»bÏ4¯ßÉ2l¹»îñmæÐò"b“úæúAø‘Ø”4&~£ $éå.YåÓR#²™9¬åáDáÍ…ÎUãZ×ZvÏ'¶QÐh~uºå7«£ÏVu<ð§Mž‰tê’8F¦zvnJìG§Ipsätb" ã‚Jã.z¢ÌŒt·Ûív»¤RÙñ‚otjų"ˆHÅ™Cs.~›iF¦#ú±× @¿óŽwnJ¨^ÒÜIŸ40 ¥Ý'ê7ñ¢TÊÆ'õÙ‰X‰9sâÚõ¿]ݾrLÅÃG—|å"¢qÁ¦ù*µ|Äóÿ) 1Ñq’ ,juµ4ƒ²Ìƒ(N'ï+¨TI4€HI¸ÁYŒJí]U(I¨’SJGO8oNÍM£:Ó¹…ЉˆHÏjºWcõHŽC&†‰! Þi/Dˆ ÅÍ|ûõ^‡ÛE }3)qÜ' SYâäÑ{RI#GI“ºW‡íÌû'Ž9ÏZ,­:³ ÊäL`ÐEŸ‘”‘è$jJ6µð-|KlÄ$&ó5•Âoˆ(‡(æ¤äÝ; ¢À9ô‡]­‘h?±‰É¬¶ûPrFöDÄÏ%‰_¥gØÔÁ}óŠ÷*˜Ó÷åáJéo_¬m.²o_We¹£‘è›õÜ… gS3¨×•ÔzÁe òw )u,²æ‹ “SdTn#e—=ššÕ7Ï‚¨««K§ÃÇ}Ÿ‡ý¢ôE’›n­–óý5J%#'"qüáDaî1˾nSØ^"Šà‚3eÉDt$çØòðНòõïí 5pî?ßY?<ÑÊd½¬bUBq‘›ˆˆ¦‹¨þÐòêÝ«—QNÖÐýÇ”rŽehPzε}†ßç¯9^o£ß@”þ9Â%yE«¤ªƒˆåøõ°?¿rdDZø¸ìÈýDÄ„„õü4óã%Ic> –ä  }eZé¯tQCKùÇTuŠì»{ù)îÆéLL|C=÷‘M§?qT•ò¢‹cdQqÓÝGÊ"R^jÞŠQÎU_F5íÛ×íÜíùˆˆ(Rú¡i]…»ÎópMH¹:E>¼Øž¾ëÌà®É÷ö<€Ct8ŠùÖ¤6'±¡á½dÌéºÓ)g™@B$a81sD÷’™“ͯnëÐnM«p‘ñ«U'¦ «ËŒ›¬ÌѰ*"êPf}À-}Œ©˜ŸÓ.7Š’`‘o—+Yy c"£¯ôtuÄØ®~ Ëÿs¼~ G¿(ýr„KòŠ–Ë-‘.§sk—[V=. :ëªÎÛç""68¬oÏΫـµ¹ÖèFUb•åGBï eÀw·±»6áÊ/õêT–“qûî‡=OŽRfpù?À(®î´#dƒÖ°ÛL‚EǪ9âÚ…®¯Æé2B²dûö Ç Äñ“™Ðï>Êi¼4²ÔUá¹~ðb `u fõeT›ï8JD\°g.|¦§—;ÑñÁ›MÍm$(Ò[ï” ÉîåhlZ&³kóU|–õ"‰f΃×äÈ #ÍÎçïLJɼùMëhÿž!eEŽgâTžö@VûPðCÆü¿GY(˜ˆˆ«tågÙÄd±¡–®ª€Õü>ÇërôˆÒ? G¸$¯(`¥"¢´Ÿ™‰èŒ»"\Têª kçÉ3«O1DóTS?0­ý× ÕÂ5Îè&qC³IòS/Qa`uç]÷÷0ÜXÅÐÖüÑŠ!rF¶Ö²sPÈpuÂ4ÞÍðû¿á·~-¹çaòÜrèð"ºÙe?ã´¤W8é‡Àòð\ˆWçn&¢HIÈy½ŒJ#ÿùSBþ.bYiî8F£½È!zRp3îìÛÉwþ„ÍMÜwëv±£&ôã`¾#‘p3æÇñy;Ü+?ìùJçv«[EÓ–=4´N!Ôíã¿Z#¦e ¥DÄDÆôß ÀxE«§ÓΊYÇœ%7¶»é°ˆ(Kžf,«hË©ù“ã yE6kTŸŸÅkS ßjÝ?N1LJÒMÖ½ÓÆ{ÃTþð¡è¸{ù¿˜„¤î…ÆSˆºoÙ{+C–äÏÝ*Û³ÚÅy.~£ÆL»ü¯7LH7ufà⸩3ź¡â,¿yýù]Ê1‘æR„Å¹ã°ØÔÀ75ÉdLÐùß~ô䬞ëC”¸ªÚ…®*w}øµ™å1Q™í ×XùPî¦+¸pÏ?Xí<õÍVGD ´wX-1­äÎ{Ý_¬JЍ¤ˆ¾]h\ a»í`²46^ÉöúÕh‚$*AEDyyyñcìí¡ßååå;¶¿G?rôˆÒo\/Q²,7ï&çEz²Ç¨¤OüF¬®Û[™à0&:–Xö½Öõ’£¿CŽ~Qúä—Ĉ,/úÓ«u7ÅHÃÿÐöO#mäÛråÖ¯½ÓŠŒì…Wú‹û®[¢±K8˜G<ßs¡ñÅ]ŸÜ§žÞÇ·ê¿Ã0תÐä3°Ì¢ˆÊâå$käÛZ*Ž 5 ,/2ªW?%F«ã¦L?¯ñFe.ªWм¢€•*'¢{ÕÓ+œµ¥]E¬oQÙºf×ÂÉ%õ÷àºæEË ÿü{Ü¿Wý~‹\ex¹„ˆ˜`°|ω'ú{У@Ž~Qú Dé£@Ž~Qúä—ä3°<Ħzò,è.—+>G C<ß߃‚+ÛßC€>€ýrôˆÒo Jÿ€ýrôˆÒ? G¸$¯XĈ†á ŠÍ|ÞÉôÛÙÜqý="¸×nw/*`yF"¶µ0†`b˜þ\먀¾èÚ•w¼hwðyyyý=èÈÑ? G¿(ý¢ôÈÑ? G¿(ýr„Kò–yO˜àÓ0 ®S(`€WC ú.]öÈÑ? G¿(ý¢ôÈÑ? G¿(ýr„Kò–•§°€OÃXpB ¼ XÐǺººú{У@Ž~Qú Dé£@Ž~Qúä—„ô±êêêþôäè£ß@”~Qúäè£ß@”þ9Â%yËÒéXÄÀ§aw¸N¡€^ ,ècyyyý=èÈÑ? G¿(ý¢ôÈÑ? G¿(ýr„Kò–•§°€OÃXà3-ZÔßC€>€ýrôˆÒo Jÿ€ýrôˆÒ? G¸$o™÷„X~Qúäè£ß@”~Qúäè£ß@”þ9ú ›U]]=gέV«ÕjçÌ™SSSs-Î׃¾/`™ÍæI“& >¼ªªªªªjøðá“'O¶Z­}~"¸ôý̮ŋ>|øã?în¹÷Þ{srr.\ØÛ80]Ð_ Jÿ€ýrôˆÒo Jÿ€ýrôˆÒ? G¿áK—~ùå—÷ßÏ–ûï¿ݺu}~"¸ô}ëÔ©SC† éÙ’™™YTTÔç'€ëAßÏì’Éd‹E*•v·¸\.µZíp8zÃôí0à'v.!”\‹ƒ^\ì Õ÷—¶··÷likk3 }~"¸ô}+==ýرc=[Ž?ž––Öç'€ëAß°f̘±bÅŠž-+V¬˜9sfŸŸ®}¿ˆ»Éd2dÈÃ?üøãÑ’%K>üðÃcÇŽ©Tª¾=\ú~–F£Ù±cÇ¡C‡ââââââ ¶oߎê\¾ŸЇú~@B ¼ XàÕPÀ¯†x5°À«yK«ººzΜ9Z­V«ÕΙ3§¦¦¦¿G?èÈ‘# ,Ðëõ Ã\ØÛ{”ÚKìÙ³gîܹ!!!:näÈ‘k×®=oäè+öïßÿðÃ'$$Èd²ÈÈÈ)S¦|þùç=w@”>§±±199ù¼7XäèC˜ ôìE”¾B„·Þz+==]¡Pddd¬Zµªg/rô þcdF&“uï€}Ïóï¼óΈ#ôz½N§>|ø;ï¼Ãó|÷ˆÒWlݺuôèÑJ¥Ò`0Üwß}MMM={‘£7»vE€+JÖ+ Xf³yÒ¤Iǯªªªªª>|øäÉ“­Vk .î¾ûî ÍÏÏ¿°«÷(´÷˜0aBKKËÚµkÞzë­E‹½ÿþûݽÈч,\¸pذa›6m2›Í'OžüíoûÒK/½ð ž^DésDQüÙÏ~öâ‹/ölDŽ>Gü¾îvDéC,XpüøñõëׯåË—/_¾¼» 9ú ñ‹/¾óÎ;=½Èч<ýôÓ}ôÑâÅ‹kjjjjj/^¼lÙ²§Ÿ~ÚÓ‹(}ÅöíÛçÍ›÷È#TWWOœ8qöìÙ‡ÃÓ‹½Ü5*\q²¾³ÿô^ýõ{î¹§gË=÷Üóæ›oö×xà2]øûÓ{”Ú{üú׿¡ûá±cÇ Ðý9ú´ÒÒR½^ïÙF”>çµ×^»ï¾ûÄï¿Á"GßÒˇ+Dé+vìØ1cÆŒêEŽ>ŠçùÄÄăz"G¢Ñh***z¶TTTh4Ï6¢ôãÇÿðÃ{¶|ðÁï¼óŽg9úо-\i²^QÀš8qâæÍ›{¶lÞ¼yÒ¤Iý5¸Lþîö%‚öZ‹E&“u?DŽ>­ªª*((ȳ(}KaaajjªÑh¿ÿ‹}K/,Dé+æÍ›·iÓ¦êEŽ>jݺu£Fê~ˆ}HHHÈ…¬ÐÐPÏ6¢ôJ¥²¥¥¥gKssó”)S<ÛÈÑWômàJ“õŠVhhhcccÏ–†††ðððþ\¦ w{A{­5kÖ >¼û!rôQ»wï9räóÏ?ïiA”>Äjµ}º» QúЏ¸¸5kÖŒ?^©TªÕêÉ“'çååu÷"G5qâÄ•+Wv?DŽ>dÑ¢E¹¹¹{öì1F£q÷îÝÙÙÙùË_<½ˆÒW\´€u™I!GïÑ·E€+MÖ+ XR©Ôétölq:=烀wºðw·÷(´wjkk8pàž={º[£Ïéyaø7Þèv»=íˆÒ‡<öØc/¾øb÷Þo°ÈÑ·Ìœ9sÏž=6›Í³PKhhhaa¡§ Qú ¹\´téÒææææææ>ø ((è›o¾ñô"G_tüøñ˜˜—ËÕÝ‚}ˆ ³fÍêùigÖ¬YÝ«a J_1nܸåË—÷lYºtée&…½Gß®4Y¯XÄúKSSÓìÙ³ß}÷ÝqãÆõ÷XàêyÞЛšš>ýôÓS§N½üòËý="¸2ëÖ­;uêÔsÏ=×ß>°nݺqãÆ)Šèèè§Ÿ~zÑ¢E¿ÿýïû{PpeAøÇ?þñàƒ†„„„„„<ôÐCÿûßÿô§?õ÷¸àê½ùæ› ,H$ý=¸¯¾úê‘#G¾øâ‹öööööö/¾øâÈ‘#¯¿þz ®Ì¢E‹ž}öÙ+V´¶¶¶¶¶.[¶ì7¿ù Ë¢"WÀ+~]ÛÛÛ{¶´µµ †þ\µÞ£DÐÞ¦®®nêÔ©ÿó?ÿ3qâÄžíÈÑG…††ÎŸ?ÿã?î¾§$¢ôÏ>ûìG}ÄqÜE{‘£O»ýöÛóòò<ÛˆÒW͘1£gË­·ÞzðàAÏ6rô9­­­_|ñÅ£>Ú³9úwß}wùòå³fÍ œ5kÖòåËßyçO/¢ô“&MZ³fͲeËâããcccßÿý%K–DDDxz‘£ïú1Ù]i²^QÀJOO?vìXÏ–ãǧ¥¥õ×xàªõ%‚ö*õõõÓ¦M{ýõ×'Ož|^rôiYYYÍÍÍžmDé+ÊÊÊâã㙈¨{9ú4±ÇE¾ˆÒW¤§§÷Þ‹}Ë{ï½wÇwœ÷?"äèCêêê²²²z¶deeÕÕÕy¶¥™0aÂŽ;Ìf³ÕjÍËËÓét£Fòt!Gßõc²»Òd½¢€5cÆŒ+VôlY±bÅÌ™3ûk|¸gËÁƒcbb<ÛˆÒw-Y²ä‘Gñl#Gßõc²»âd/µD×OÁh4&$$¼üòËž«š_zé¥˜Íæþ\Â…¿?½G‰ ½Ç°aÃþóŸÿüP/rô!7ÝtÓÚµk›ššœNgmmíÒ¥K£¢¢6lØàéE”¾«ç,rô!“&Múì³ÏœNgyyùË/¿|øðaO/¢ô6›môèÑË—/oiiiiiùð‚vìØáéE޾åÓO?½ñÆ/lGŽ>ä­·ÞŠ‹‹[¿~}GG‡g ¬èèè·ß~ÛÓ‹(}ÈôéÓ9ât:ËÊÊ}ôÑÇ{¬» 9úо-\i²^QÀE±¢¢bÖ¬YF£ÑÌš5«²²²¿G?¨÷JhïQ"h/qÑ;::ºw@޾bÇŽ·ß~{PPD"‰ˆˆ˜3gÎþýû{î€(}Ôy£¯Ø¾}ûìÙ³=ÿ$£¢¢î»ï¾3gÎôÜQúŠúúú{î¹'00P.—5jÛ¶m={‘£ÉÍÍýꫯ.Ú…}ÈêÕ«GŽ©×ëõz}nnîªU«zö"J_±råÊ´´4™L–ššúÆoð<ß³9z³kW¸¢d™ €7ðŠ5°~ XàÕPÀ¯†x5°À«¡€^ ,ðj(`€WC ¼ XàÕPÀ¯†x5°À«¡€^ ,ðj(`ô†aú{~,€«„rÀO,€>#ŠbÀ¡€p5<Ó¯˜oõlôlX­ÖG}Ô`0ÿîw¿EÑf³=þøãAAAz½þ—¿ü¥Ûíî>ÚîÝ»srr E||ü|ðÓ?o†ÀÕðL¶¿uáO<ñÄèÑ£ËÊÊöïß¿gÏž×^{mÁ‚999gÏž-(((((X²d‰gÏâââ;î¸ã™gžinn^½zõË/¿¼k×®Ÿò¹x9Ý®ÜÿQª»…a˜7ß|sáÂ…žö½{÷ÞtÓMýë_»[òóóŸ|òÉÂÂB"ºÿþû‡ òì³ÏzºÖ­[÷ÿ÷_ýõO÷L¼ XW©÷VMMMtt´§Ýh4êtºóZbbbºººˆ())iãÆÉÉÉž®ŽŽŽÁƒ×ÖÖþtÏÀ»¡€p•z/` ‚Ðó6…mñì,—ËNgÏã°,Ëóüµ=€ïÀX×DÏZÕµxhµÚúúz±T¯zB à*)ŠófN]‰'®[·îÇÀ_¡€p• °aÆ?[ê…^xñÅ—/_ÞÖÖf±X¶oß>}úô>!€ÀXWiÓ¦M .,//çy¾{é«ó6ºõÞrôèÑçž{.//Ïív9òüãäÉ“ªçàíPÀ¯†KÀ«¡€^ ,ðj(`€WC ¼ XàÕþþËÌkó%BIEND®B`‚gsl-2.7.1/doc/images/movstat3.png0000644016036000116100000032560213507751703013546 00000000000000‰PNG  IHDR@ ô¢9 bKGDÿÿÿ ½§“ IDATxœìÝwxUU¾ÿñµ““Þ =¡·HWɈˆ 0ô"ˆÎ€½b/Xø!XFttÐÑÑãÈŒql(5"H¡PRNz9å÷Ç›c!}Ú÷¼_Ï}î³v9{“Ͻøe­u4§Ó©_ä퀦ÐÀ€O£ŸF >| ,ø4Xði4°àÓh`À§ÑÀ€O£ŸF >|š{X‡îÑ£‡¦i®'sss'Nœ;qâÄýû÷»µø576°œNçµ×^ûä“Oºž,//¿ð  ´oß¾}ûö 4hôèÑ•••î+~Ms:nzô¼yó6mÚ´`ÁM;þ–_|qÆ ï¿ÿ¾qÛŸþô§aÆÝ}÷Ýn*~Í]3°6mÚôæ›o¾úê« Î/^¼xÚ´i®g¦M›¶hÑ"7•ç–VUUÕ´iÓÞy瘘˜—²²² àz¦ÿþÛ¶msGÀ-Ko¿ýööíÛÏš5«þ.KCCC+**BBBŒ›ëêꢣ£kjjšx Åb±Ûí¦× ¹i¯*‹éO\´hQVVÖßÿþwŸi·ÛÝ·W<õ ÿEŽ2£„(!Ê@Ž¢ ä(!Ê iš›žl~ëøá‡‚ƒƒ½šPTTÔ¦MãLaaabb¢ée@ó÷ÀÊÎÎîܹ³æB)e ÒÒÒ6oÞìzÿ–-[úöíkzÁü–óÆI¥Ô%—\²`Á×û,XpÙe—™^dðÄS×…¬eee ¸é¦›n¿ýv¥Ôk¯½öÎ;ïlÞ¼9**ª™O€Ÿ"DÈQr€ DÈQB” DÜ—£ù3°š³téÒuëÖ¥¦¦¦¦¦®_¿þ‡~hº{€@æ N±¢ ä(9 @ˆ¢ ä(!Ê@Ž¢ rf`!`]ýõÞ.&˜={¶·K€ ÈQB€e GQr€Ñ4ÿhpÒˆðqÌÀ@€¢à4dffz»˜€ DQr€e GM£%vLXXX›6mFŽùÄO8pÀÛuA ””o—£„(!Ê@Ž¢ ä(!¢iþ±·{`5ÍøýØív«Õº}ûöÏ>ûì½÷Þ{íµ×&MšÔüœ1÷uü£sA‡¥iþ~6mÚ4f̘åË—§¥¥ÁÇN ›¸ã´}öÙ÷Ýwß¼yóŒ3yyywÞygLLL—.]f̘Q]]­”Ò4M¹,BlúfÏ£%ÙW\±bÅ ãpĈƒ>tèвeËöíÛ÷ÄO(¥ôΨó˜¦onœ9s4_2gηüN^FF†·K€ ÈQB€e GQr€Ñ4ÿX;¦±Æ­I'ûýTWW'&&VVVžx©¸¸xÈ!ÙÙÙM|¼Ñ›OfΜ9§lryÒìÙ³éaàIîkà0K2‡Ã¡[X]]ýä“OöîÝ;22RÓ´ÄÄÄ}ûö샧u3€[ùÇÌ&f`5íd¿ŸmÛ¶M˜0a÷îÝJ©{ï½wÇŽsçÎíÙ³gTTTuuuDD„þ©?ÞÄÍbÎÄçŸ~Áèã>úhþüùŒŠŠRJíÙ³§‰žÖÍ(¬K— DQr€e GMó™MÌÀjZ£¿ŸÍ›73fÅŠ}úôQJ%&&îÚµ«uëÖúÕ‡zè…^Ð?aµZCCCÏ6q3@£˜…f±ÛíÅÅÅ?þøãC=4f̘üãz÷J)5~üø{ï½÷ðáÃùùù/¼ðÂÞ½{OuëÖí«¯¾²ÛíÆ™&nð0XBhš¦iZddd¯^½}ôÑèèè_~ùeâÄ‰Æ ¯¼òŠR*--­W¯^Û¶m{çwŒK/¼ðÂŒ3ÂÂŒߛ¸ÀÃüciKaµZãââ¼]ZŠ DQr€e GQ–ð ¹¹¹Þ.& GQB” DÈQBDÓücf3°|3° h`À§ÑÀp222¼]L@Ž¢„(9 @ˆ2£„ˆ¦ùÇÞRìàãÜ×À±¸ã¡Þ¥iÚÉ.ì—èƒ 2, À+6°\û>´ü{`)uò™YÈÌÌôv 09 @ˆ¢ ä(!Ê@Ž"š&pVÓ4M«¬¬œ1cƇ~˜ŸŸ¯·®Œ‰Zš¦UTTÜ{ï½üqPPÐ7Þøì³ÏVWWßÿý~ø¡ÝnŸ:uê‹/¾h±XN÷f¥ÔŠ+zè¡-[¶´mÛvÖ¬Y7Þx£QÕÖ­[zè¡•+WFDDLš4é¯ýkõ›õÒ¼¼¼¹sç¾÷Þ{­[·ž4iÒ“O>®¿Âf³Í;wþüù‡JMM½ûî»ï¼óΦ±µëV׬[}f¡¸CØÐóB‡žçí*JIIñv 09 @ˆ¢ ä(!Ê@Ž"šæ+ìÎx%à‰Ô4íúë¯3fÌÅ_Ûà6MÓ®»îº‘#GN˜0¡°°pêÔ©'NÌÊÊ:ÿüó'L˜PTT4uêÔ«¯¾úî»ï>Ý›wîÜ™žžþòË/_|ñÅ;vì˜2eÊÛo¿}Á(¥²³³GŒñè£^uÕUJ©… ®[·náÂ…þÈf½T)Õ¹sçÙ³gOš4éèÑ£?üp×®]çΫ¿â–[niݺõõ×_ß®]»õë×ßpà Ï<óŒ^ÞÉ”½öBùk/œAFn}ǃ1w<èí* îÛÊ)XóæÍ»ï¾û½MÓ´¿ýíoz÷G)µzõêßÿþ÷Ï<óŒqæÇ¼óÎ;ùå—Ó½yÚ´i xàôK‹-zã7þ÷¿ÿ)¥¦NÚ³gÏY³fõÌž=ûÉ'Ÿ¹fÍš“ÿ¦i`èh`™ÙÀÊÉÉéܹs£·iš¶ÿþŽ;êçKKKãââœéÔ©“Õj=Ý›»wïþõ×_÷èÑC¿T\\ܯ_¿(¥Ú¶m»zõê®]»õdggwïÞýd ,S^Z]]ý—¿üåƒ>ÈÍÍ­ªªRJÛl6ýÙÙÙ®õwëÖ­¨¨¨‰_5 , ,3Xµµµ!!!Þ¦išÃáÐ4ÍõÒ‰gÎàæ°°°ÚÚZ×—Ùív¥”Åb)//×÷ŸÒUUUEFFž¬eÊKï½÷Þ;vÌ;·gÏžQQQÕÕÕÆÏe·Ûƒ‚~³Áÿ)#`¬‘‘‘‘žžîí*ÐRä(! @ˆ2£„(9 @ˆ2ÐÀ2³uâ£\{R§¼ÿÌnNJJÚ²eK»víN,òtg`™òÒ:¬]»Ö˜·µmÛ¶´´´“ý\'; `p_÷ èÔ·À £FZ´hQ£—ÆŒóÁ¸žyÿý÷ÝýÒªª*×9_ï¼óŽ)o0ÅÛŠÙ³g3&""â’K. _³fͼyóôýÔgÏžžž7yòd¥Ôÿûß]»v¹û¥ãÇ¿÷Þ{_xá…    ìÝ»×”7˜ŽX’––öÕW_ý÷¿ÿíÒ¥KRRÒŸÿüçûï¿_¿Ô½{÷ï¾ûîË/¿ìÚµkß¾}·nÝúæ›oºû¥¯¼òŠ~C¯^½¶mÛÆ ,4SFF†·K€ ÈQB€e GQr€Ñ4ÿØØˆ ˜|{` @ÑÀ€O£±Z­Þ.& GÈQB€e GQr€Ñ4XðÜÜ\o—£ ä(! @ˆ2£„(9 @ˆhšlŽÎ&î>ŽMÜ h`À§ÑÀ‚‡dddx»˜€e GQB” DÈQBDÓüco)öÀðqì€E ><$33ÓÛ%Àä(9 @ˆ¢ ä(!Ê@Ž"šF ’’’âí`r” DQr€e GMóÍÑÙÄÀDZ‰; ,ø4XðŒŒ o—£ ä(! @ˆ2£„(9 @ˆhšì-ÅX>Î} ‹; ß´zõêÊÊÊ„„„´´´ððpo—Ó,þ1³‰X¦ˆ-++SJ­Y³føðá&>™o!„ßc=³ ä(9 @ˆ¢ ä(!Ê@Ž¢Ç:tHï^)¥òòò¼[LóùÇÌ&f`´ÜÊ•+GŽ©ÿö·¿M:5''§OŸ>-83°ÐR»ví2ÆyyyÏ?ÿüàÁƒ£££¯¹æ/VuJlâ(\X»wï^¹r¥RÊáplÛ¶Í{E3°à!V«ÕÛ%Àä(9 @ˆ¢ ä(!Ê@Ž¢Ç¸6°¾øâ‹ÂÂB}œŸŸºš>}úùçŸÝu×ýôÓO¦Õw4°à!¹¹¹Þ.& GÈQB€e GQr€=f÷îÝÆØn·ã‚‚‡ÃÑüç¾õÖ[«V­zï½÷–,Ybf‰ñÍÑÙÄ …ìv{TTTMMM£W Z·nÝÌG½üòË÷Üs>¾å–[^ýuÅ&îh¡}ûö¬{¥”:räHóõöÛoヶ¨¬f \מ¨ùÛ`íÝ»wóæÍÆa^^^‹ÊjXðŒŒ o—£ ä(! @ˆ2£„(9 @ˆž±ÿþ&®6VVV–ë!3° Gzzº·K€ ÈQr€ DÈQB” DÏ8|øð‰'SRRôÁ7° êêêZX[Óh`£Ekœ;v¬>hþ­[·º:ŽC‡™QàIÑÀÆ ¬³Ï>[$%% >çœsô»·Á²¸õé€ÁXR ¿FŽ2£„(!Ê@Ž¢ ä(!z†ÑÀºüòËg̘¡W¯^­š¹„pÏž=UUUJ©víÚõë×O߀ŸX"..ÎÛ%Àä(9 @ˆ¢ ä(!Ê@Ž¢g ¬¶mÛ'Ow–±VZZZûöíõ13°ÐRåååJ©›ÛÄ}´ \)¥THŸ³Úô ßÐÌXÆXiii:tÐÇ4°ÐRú«á‘!O´/{ñiã|prÛ«’b?,(­ªª*--uý‚ÂF–uÖYF‹%„B_ GŽ2£„(!Ê@Ž¢ ä(!z€¾~𮤨çíù‡_LŽx+%>TÓš3 kÆ ú`àÀ[B¨9N·¾Àšæuø¦Ï>ûlÖ5“¿ëÖJ;É +Êk;½ýш G7zµ¨¨(11Ñjµ&$$8ÎÐÐÐÒÒÒÒÒÒääd¥TëÖ­ Ü×Àa€|‡º£u”ѽ²tïqùUZh¨qÃÈèÐþõdüñÇ•R7nÔ[TguVXX˜±Þ°¬¬Ìm…+E :86&Ì8Œ½ÿñø§ÿÖú󖽓·m¬ùiʼnŸÝµk×›o¾YQQa¬0&a•––º¯xÿØ[Š=°Zâãóú(­ß£=êšb{Ƹt`É×êÞëƒ-/Œ¾ùž˜{uýìСC{eg]6ê‚íÛ·dU×=÷êaÆ)¥ºvíš““£”ÊÎÎîÖ­››8w<>ÄáH++4ŽÂFs½ØqÌøg+ì×Fë‡ïý#bÂdKçnúáþýûƒ·oy¾s‚Ú¹ñwAJµ‰¶9Uìá}J SžšÅBá.û.Þi¯?ˆŠ znƒ–vêu¸Î¡µµ%LwÖÔ臟}öÙÃÉQ®7[4U9뾊¿¥œNÏìãN bµZ½]L@Ž2£„(!Ê@Ž¢ ä(!ºÛº¼lŒ#F^¤,! nèÑÀœ#Ç;Pu[7•>ýˆ>Þ³pÁ9‘¡ îWv[éÜ™EÓ§ÆGGë'˜ rss½]L@Ž2£„(!Ê@Ž¢ ä(!ºUee¥¶eƒqzîÈïéׯßÖêoÊjŽê³…µÖäì™Z´Ï8ùkÍæ²ÉUÍÊï§TÕÇn団³‰;À™yçõŽzyv˜V¿I{ò·ë‚;tjpÏ?þ˜žž¤ýЧ]GU¿Ø0$m@~qIÂÁú–Ý©Æï)ìýjç$gyý|+§RÚW¼¬¼öõ×_¿õÖ[ÝÔÀa€d?Íÿ§Ñ½ îrb÷J)Õ·o_¥T™ÃyÞñåœuY›î•RêµÂŠ­Õ6û9#“>]ܾ£~RSê/íc#‚4–àLlÙ²%!7Û8 žÞèm íÛ·WJe”TØû>ñ†ví…ü ¥Ô¸qã‚ÛwŒÿË?T°E¿Ô!$øŽV‘lâ 222¼]L@Ž2£„(!Ê@Ž¢ ä(!ºÏ›o¾™u| öÐa#Nv§> K)µëœ \ÚPU·íò©uN§Rê÷¿ÿ½R*ôì¡QSo6n¸£u”åÈAËnÀ?ö–b, Û5×\“‘‘Q^^þòË/ÿéO2ë±}:§~UR¿‚P%/ݜܶÑ;ï¹çž—_~Y)õÌ3ÏÜÝ.ÎQ\TPPðÖÛo/-«ÍoÛñ‹/¾8묳z÷î½}ûvý~gyiþÎsÕoâ~$2fàº_Ù @&§Óùõ×_ïß¿¿¸¸xñâÅ&>9µ¼Øè^Y:w;Y÷J)•––¦¶mÛuÝ!·?¸a`ú3GÊ×TÖöíÛ·oß¾íÚµ7nœq¿sïcÆa\u¥‰e7`qߣÐ{öì)))ÑÇK–,±ÙlËñ¦Íúõë7mÚtäÈ‘Q£FwÞyÍlMMÍËñ)Q¡ÃßKg,!ÌÊʲÛíãÇ<¸~3¬>}úhš6zôh×–R*òÿ®ÉYüi⺌œZû[z+å®U„ÌÀ‚‡dffz»˜€e GQB” DÈQBܰaƒ1...^³fëÕ¿þõ¯7ß|óÿûÿïwÞ9­ÇŸç²VØÉ7ÀR. ¬;v|ûí·Ë—/饗ô3}úôQJ]vÙe#GŽlð©Òk§¿^X9~OáŽêºÓªí´ÐÀ‚‡¤¤¤x»˜€e GQB” DÈQ ±®®îÚk¯|X»©cqÇCà>ýôÓ£G*¥®¸âФ¤Sì €¿p]Bh³Ùþò—¿DEE9NMÓšøÔ‰±Z­óçÏWJÅ-ìÚúìÐ&?~èÀ+ã&ï-ŽŽŽÖ4M_©wèСS¾¨fùñà º7µ ÐÕÙgŸ=lذŸþùºë®Ó4í­·Þ:å¶ñ±±±FËMh`À|O=õÔ¦M›”RgŸ}6 ,€ ¥¥¥'¶***>Ü®]»æ?Ç肵¶ý75¡Ï Ý«Uu+ËkûG‡_¬ŸI VÔ'íÊ+¯|衇ÔowÅj”£àHÝîíúØîTUý‡6¿Â[n¹%''çøƒRªU«V­Zµjú~c,÷a,xˆ¿¬gFÓÈQr€¢Ýno0I|Ž€e Gü"D×éW®öìÙsZÏÙ½{·>x¾}lŸðãS‹‚Ûuˆ¾ñÎVï}~Seè_ò˯Ë9šQqü‹oÓ&!!11Q?¡†$þóƒ ˜8ýpܸqú`wí½¢Jã¶Q…Z%ÄëãS4°œÎšŸVG+ÊkN«¥”jþô+Å ,ø)ã‹´i`ÄX¶l™>5jÔôéÓ»wﮞÁ»[G%Yê{2ZhhÜS/jaáÆ 7Þx£1ÓêïG+j­Œ¯*o³«¾‰Öt«n×6Ga>.s8©ª3èÌÀ‚V«ÕÛ%Àä(9 @ˆˆÑá¨ÿªo£“%’ø!Ê@Žø~ˆååå6lPJþùJ©nݺé—~ýõ׿?çðáÃqU7¶Š4ÎDß|¥k×{¢¢¢nºé&}œos|TRm\Šùôý0MS§j`Õ¬XbŒ¬¨µ9U|||ó‹<]=öXfffNNŽû^A ’››ëí`r” Dć KÅçQrÀ÷C\µjU]]Rªÿþú·ò ¬Óšµk×®‡’£õ&”R*¸M»¨ëï8ñ¶»îºËXÄ÷ÏÂJ‡qaÿÞ‡ÛD«S5°ª¿ÿŸ1þ¾¬&,,,22²‰û[¨cÇŽguVçÎÝ÷ Xð~ýúy»˜€e GQñ!HK|Ž€e G|?Dcýà„s‡W.|§ø¾›"Ÿ¸tbŒR*??¿´´´™Ï9¸võqÇW ÆÜý¨qâm;vœÎ®±-,®2.ÝÒ*òúÄÈÚÚÚ²²²F_aÏË­Û–Y?vªoËjܺ~Ð3Ìo`­Y³æ¦›nêÒ¥Khhhûöí/ºè¢O>ùÄõ†ÜÜ܉'ÆÆÆÆÆÆNœ8qÿþý¦×ï2–Ên`ÄÿøÇçŸ^)uYløMk¿±þùÑê%_Öü´ò_í"wMœ‘³sg3ÕnÉ¢àúÙWÊÒ£OÄ¥WžìÎûï¿_)Õ©S'¥Ô“‡ËÔÕÿ‘¤ÔŸÛÅ<×>¶èð¡F?X½äøô«µ•µ…6‡[×z†ù ¬»ï¾{àÀß|óMyyùÖ­[g̘ñôÓOÏž=[¿Z^^~á…4hß¾}ûöí4hÐèÑ£+++›~&ü‹Ñ·’½ ¬X±b)¥ IDATáÂ…!šöTÛ˜vŠ ®©v½:8"䥱aO=èüíùFU/ý¦Ç¡½ÆaÌôUÐI;3ƒ ;v¬>«Ìá¼?¯Ôl\štÏuÆNí¿y‹Kë«Ò¥Ôé~¡2¿õóÏ?OŸ>½W¯^¡¡¡‰‰‰¿ÿýï?þøã—_~Y¿úæ›ožsÎ93gÎLHHHHH˜9sæ°aÃæÏŸozð5Þ.& GÈQB@|ˆ²„P|Ž€e G|6D›Ív×]wEkê³. ®;¯7·ggñ½78ëêœNçÔ¯;K½S;ö•‚¶ÎÝÃGÿ¡é·¿þúë½zõÒǵ!s_Õ¢¢«–Ü=…7L´ÊûÍ[öf×nÙP i_•U+XÍ\ß#\¼xñ´iÓ\¯N›6mÑ¢E(Þ•žžîí`r” Dć ,ñ9B”ðÙ_{íµÌÌÌÇÚÄ Š1NjaaÑ·ÝvþEêØ^ìJ©šUK­³X¾lÙ·ß~Û裬O?ì¬(×ÇuN•0ó×7*555%%E%Ž»´Õ‚Eù¡Ç÷̲eï*¸dDÙ‹O+[~¦üÓÔ±YqÇ·ëŠÖ)Y­Ö•+W^uÕU·ß~»~&++kÀ€®÷ôïßÛ¶mn- ,€luuu³gÏ25ñxÏ(¸CJ«-޹sFâkïïó·íÕÇËW}ñaΟgfeeø¨Úõ?Õ®_cþS‹Ž>÷üæÔ`4°ââ₃ƒCz¥Í8êû²ãgMuù[¯\üñçŸ^WS}ôƒwK¿vMÓ4°NJÓ4MÓâããGŽ3gÎý|qqqƒ­ï[µjÕôW?º>°9sæ¸N2ÌÌÌ´Z­Æ¡ë%×±ÕjÍÌÌlôOà <'ðžÀxO0å ú+¥ìv»ÿþ<'ðžÀü +W®,))y¶]¬Ñ=±tîÖú£%;ìšþ„¾’[’]s¼‡uÑáœÂÍO¬¡ì5îYV^ûK§ͬ¡¶¶6''§¨¨(''G¿Üæ¦ýV×–Rjל‡'ýß3ÇŽª®¨?™™ØV ,³~“sæÌi´Q£ÜFs›Wæùùù?üðÃ>xë­·>þøãJ©ÐÐÐŠŠŠãóîêêꢣ£kjjNþ¥iî­™™éûߊŠS"GÈQB@|ˆáááú_ðæÏŸã7z»wŸc DÈQß qãÆwžî'M_Ò´Vo:ô<×{ºuëæ8°ïË®‰‰Áõm®euA™ÿwmQQQeeåÓO?ššZùáë“3Œ\šS4ñÿ=ñ裞YUÏ?ÿüŒ3‚55ÿªËÇíÜଭÕÏßgzU|ýd±âaç¿×ᥗ^RJÍ›7ï¾ûî;³×÷5pÜ»„099ùꫯ~ÿý÷mÚÌ·*,,l0' "“á×ÈQr€b€,!Ÿc DÈQß 1??ÿÚ„ã‹Ã/º¸A÷J)5`À€½µöG–g.q,{õ¥7Þxãý÷ß߸qcíºÕÖgfWWUÔn¨¬kI·Nï¢ØjeDBÄåSŒóO·ýCl¸qøSdBqq±>f a³ 2$??_§¥¥mÞ¼Ùõê–-[úöíë2à]qqqÞ.& GÈQB@|ˆÒÀŸc DÈQß ±dϯã]ZBQW_â=gŸ}¶Rê¥Õ;‚Bõ3šRO%GkJ)µç—%ßaì°^éTs—)¥ú÷ïÆUÓ€ŠŠŠ¢o¼Ë®Õ÷vbƒµ˜ úE|…6Ç¢œý%%%úa||ü¿ÎGx¢µzõêÞ½{ëãK.¹dÁ‚®W,XpÙe—y  x†Ãá0–Èn`d‹Y»2䨶N–®=Nœ~¥Ž5°œJ=š}ØX;wV¸åÚ„HM©³øÜž¸þlPÐôý%Û«mñññ:u:ãª\XÁ:}yâ=ߔլ^û³±ŽX;vì¢E‹òóóëêêòòòÞyço¼qîܹúÕ›o¾yõêÕÏ<óLqqqqqñŸÿüç5kÖÜtÓM¦—oqmZÑÀø¯¤œÆ8rò4ÕØ&åzK)µ¶²îskµq~VÛètŒëk-0μàß–Õ(¥úõë×’ýÎ]XN§sæž#.³ÿvã©/K« 5pÌÀjÄ#<²`Á‚¾}ûFFF:ôÿûß'Ÿ|2~üxýjLLÌÒ¥K×­[—šššššº~ýú~ø!**Êô2àk\¿Âþ‹e GQÙ!º6­l6[wú;Ù9B”ðÁ•í‹óÃðQã½-%%Åè(=y¸¬ôX')LÓ.‹;¾ü°ºk¯kõS¥Î=÷Ü–f¼nÏž=Ï<óLyyùüÂÊ[ ë¢o¼SÿŸ¯ãÛ­®¨UJ•––êw h`ùÇ·ûñ-„~¤¢¢"::Z?÷Üs3fÌhú~|PõòïŠïœ¦k’Úv^¶édw^xá…Ë–-ÓÇS"þÚ>¶Áôªb»cùä[_û䳬¬,¥Ôwß}7f̘3.¬ªª*2²á²ÁáǯY³F?ýôÓ³fÍr½jµZcccÏøÍç¯ßB€ÄB€µ«—cÛÙC›¸séÒ¥eee¹¹¹›7oþ¼ÊyOžÕæÒÃq(uçë?,Û¶m›R*<<<==½%…EDD¼ùæ›;vt=Ù£GcܵkW×KÁÁÁ111-y£/°x»HC @ÍêÆ8|Ĩ¦oŽŽŽŽŽŽîÔ©S¯^½>Þ¼¹Èæ<7*D¿´µÚ¶¬¼Výø£~xÞyçEDD´°¶›nºiÔ¨QÝ»w7ÎôìÙÓwèÐÁõæøøø–l¹å#˜ñÁõÌ8ä(9 @ˆÈ‘=°àGQrÀ×B´ç²íÍÖÇuNgëÑo€u¢´´4¥ÔÒòšgVýùHùŸ”/rÙÙ])uÑE™Ra·nÝh6ÝÀ2åÞE ÒÂ’ðä(9 @ˆÈ1pf`ÉÎ1@¢ ä(€¯…X»~1άSá ‰Íü`ß¾}õÁˆ#l6ÛáÇÏ9ç×FmV‘“&M2Æ®KÛ·oïz[BB‚Yoô"–ÀdÓÀHU»a­1Þn‰¸¸ÙœöØcJ©ÈÈH×X‘‘‘ ÅÅÅú¡ŒX4°`2‡ÃaŒi`üQ톟Œqn\«æ°G®“¡”RÆ Ó­Zµzûí·MÜŽªG{÷îmݺuTTTƒK:tÖÀb !<Äjµz»˜€e GQÙ!ºî{%»%;ÇAˆ2£>¢ÃZbÛ³[ÛÊÚ!µ%O>|¸>xíµ×,îk¹ÔÔÔ»Wê·Û`%&6wý£/£ÉÍÍõv 09Ê@Ž¢²Ct%{wÙ9B”ð‘W¬X¡”ªÝ°Fû³l[M]LÛuRSSÛ´i3mÚ´É“'›Pbó¸6°âââ<ö^÷¡éׯŸ·K€ ÈQr€bàì%;ÇAˆ2£>âu×]·jÕªê Çwp_[Q—œœÜÂÇNš4éå—_náCN‹kKÆ&î4°`²Ài`$q:¼òÊ+÷÷?ãäºÊº6mÚ´ðÉ/¾ø¢‡§A¹®U”±›¸Àd4°þ¨´´´¶¶¶¸ ?*O© ú­Öozñ•®há“-O·_˜œ¡ŒŒ o—£ ä(! ;Dצ•ì=°dç QrÀB,((PJõ ‰8Ö½R­’.»á¦V­Nã[}„kKÆ ,Xðôôto—£ ä(! ;ÄÀ™%;ÇAˆ2£¾¢ÞÀbœ <Ü{å´3°€SpmZ¹~#!¾,??_)5Ð¥Ú÷Êi‘¤¤¤ÐÐP},£ÅX0Yà,!HrôèQ¥ÔàÈã ¬þƒ½WN‹ÍŸ?¿ªª*..®S§NÞ.ÇÌÀ‚‡dffz»˜€e GQÙ!ÎBÙ9B”ð… ⃃:‡×[BBúö÷jE-2uêÔ[n¹åª«®Šˆˆðv-& IIIñv 09Ê@Ž¢²C œ–ì!Ê@ŽøBˆùùùiá–cû·«n=µp ­h`ÁCâââ¼]L@Ž2£„(€ì§%;ÇAˆ2£¾bAAAßðã[-Yz§y±4@ &c,€?jÐÀ éÙ׋ŠX0YàÌÀH’ŸŸÿ›X4°| ,xHFF†·K€ ÈQr€bà4°dç QrÀB,>ZÐ3ÌeV/X>Ds:Þ®áÔ4Í?ê€RêË/¿¼ôÒKõñèÑ£¿ÿþ{ïÖ@sô‹þ¶S´>JjÓfÙfïÖãÜ×ÀaL83°b”••uÓŽÿ™ÅX¾†LÆ&î¿SPPÐç7`õñb18 ,xˆ/¬gFË‘£ ä(! ;ÄÀ™%;ÇAˆ2£^±   Íõ+{¥y±œÈ?ö–b,?òŸÿüçꫯÖÇÆ [»v­wëà”¾üòËNÞl©Ÿè“´h¥¥[Oï–äØ ~#pf`Ä(Û»Çè^iaá–Î]½[ “±Àï8vï0Æ–^}U°¥‰›áy4°à!V«ÕÛ%Àä(9 @ˆÈ1pf`ÉÎ1@¢ ä(€×C ݿLJô>Ë‹• Q4°à!¹¹¹Þ.& GÈQB@vˆ‡ÃËn`ÉÎ1@¢ ä(€×CŒÉ?hŒCz³ƒ»ÏñÍÑÙÄÀ¼ñÆ·Þz«>îÙ³çÎ;½[§´±_ÇvÎúeï­?ø*¤ÿ ïÖã§ØÄ~#p–d°µ9Ö½RAÁ–ž}¼ZA &cw€9øÑûFÄÒ­§áÍjÐXðŒŒ o—£ ä(! ;ÄÀ™%;ÇAˆ2£Þ ±æ›EÆ8â÷—x±œŒì-ÅX~dÞ¼y<ð€>n×®ÝÁƒ›¾/r:¿_³þH’¾XeéÚû%ù/öÀ€ßœXª¿ùÂè^•´nK÷Ê7ÑÀ€ÉØ àG*?ÿ1®:g¤+Ah`ÁC233½]L@Ž2£„(€ìg–ì!Ê@Žx+ĺYuY›õ±C©ÖWþÑ+eà”h`ÁCRRR¼]L@Ž2£„(€ì§%;ÇAˆ2£n Ñét~ôÑG^ªúôcœQeï8hˆûÊ@KÐÀ‚‡ÄÅÅy»˜€e GQÙ!:c,»%;ÇAˆ2£n qÓ¦MÓ¦MËÊÊjpÞYS]õå'ÆaFtë  ú$>Š``2×}¯d7°~aÑ¢EÕÕÕW]uUuuµëùªE:¬%ú¸ÐæÈKeûvßE &sÅ&î¯[¼x±R*++kÖ¬YÇÏ: ^7Ž>(©jÏZTF ’‘‘áí`r” Dd‡è:ëÊáp8N/ãV²s „(9 à¾÷ïßÿË/¿èãyóæ-]ºTW¯üÞ¶7[×9oVvêÔÉM5 åh`ÁCÒÓÓ½]L@Ž2£„(€ì,¼ŠPvŽ‚e GÜââÅ‹Jq8=ö˜>®\øŽqÏçÖš#6 ,_fñv¦AÇÊf³Y,üµà_|ñ…ëáºuëŽ=šPSYóÓ ãä…Н³ômÌÀ€ÉgÀÇ•””,_¾\)¥iZÏž=•R‡ã»ï¾«üøßêØŽ™v-«Ú¦”b–/£aQº ä(9 @ˆÈ1pX²s „(9 à¦~øášš¥ÔÀ¯½öZý䊯¾¬ül¡qÏ»ù¥J©ààà:¸£˜Bó‹=55Í?ê€Rê¶Ûn{ýõãßëTTT”àÅzé›o¾ùÃþ ÷.\سgÏÁƒ+¥ÞêÞf|Xý=ÎÈèöT:œ;vÜ¿¿«•Á} 6#€ÉgÀ—½ð z3eÒ¤IS¦Lq:mÛ¶=§ªÄè^)¥J~wQåº×ë}K`²7q÷V%€@VRR¢|ðA¥”¦i#Gœ÷pr´qCHï³6õ?W³ƒ»£±Z­Þ.& GÈQB@vˆ :VŽc»äÊ#;ÇAˆ2£îÑxfbb¢>k±§†ëc-44þùîÍËÓi`ù8XðÜÜ\o—£ ä(! ;Ä+Á3°dç QrÀ!–––êƒØØX¥”²ÛÒ÷í0®F\q¥K÷è‡;v4½˜ˆ<¤_¿~Þ.& GÈQB@vˆ³–ì!Ê@ޏ#Dc–ÞÀª^ñ}tYý¢B›¦Eß|·R*;;[?Ó¹sgÓ €‰h`ÀdÓÀø¬êêêšš¥TXXXxx¸Rªòã÷«Ë,ÑÁmÛ+¥vïÞ­ŸéÑ£‡7ÊDsÑÀ€Éh`¼ÎX?§”²9T“±Ì¸ú¯âj¥TMM¾t1((¨K—.Þ(ÍE ’‘‘áí`r” Dd‡8 ,Ù9B”0=Äë«>[¨õeV×-Ï;l·Û³³³õ?¤RSSõYZðY4°à!éééÞ.& GÈQB@vˆÓÀ’c€ DÈQÓC4Xú ¬ê¥ß—>(®²ÙlùùùÆúÁž={šûv˜ŽLÖ c%ø[>Ëu ¡£¸¨nÇVýСÔbkR*//o×®]úI6Àò}4°`²À™ðY®KkÖ¬T‡~¸?4²ÈîPJåå屃»¡ÉÌÌôv 09Ê@Ž¢²C œ–ì!Ê@Ž˜¢ëÂÚÕ+Œó¹Éôk‹%„¾<$%%ÅÛ%Àä(9 @ˆÈ1pX²s „(9 `zˆ®Kk~:ÞÀ*íÞW°„пÐÀ‚‡èÛæÁß‘£ ä(! ;DDZe:Á{`ÉÎ1@¢ ä(€é!3°R5‡ýðA}¬ED÷¬wîÜyèÐ!¥Thhhjjª¹o‡éh`Àd3 ೌX=¬ÆÉÐ!ç´;6Õë믿v:J©îÝ»[,ÏWˆÓB &£ð:£•šŸgœ 1ªk×®ú¸²²RüßÿýŸ‡kàÉÈÈðv 09Ê@Ž¢²Cl°fPpKvŽ‚e GL±¤¤D)¦i­òö'ÃÒ/ìÙ³çØ±c3š¦]wÝuæ¾î éóå|œ¦ùGPJ Þ­-G ’‘‘áí`r” Dd‡8 ,Ù9B”07ÄÐ_·¬‚-&>^¡9No×pjšæu@)]QQa>ÿüó>ø ëš•ÇõعIGßþ@Ìô‡¼[Oàp_‡X0YàÌÀø¦„üÆ8tÀ`/V³ÐÀ€Ét¬ØÄàQ¶ºk‘qrÖ@/Ö³ÐÀ‚‡dffz»˜€e GQÙ!Î ,Ù9B”01ĺ_wû>ܪ˜¸ ø³ž /¢IIIñv 09Ê@Ž¢‚Ct:ŽcÿÙ ÜÀœcà DÈQC´íÈ2ÆURÍz,¼‹}øá!qqqÞ.& GÈQB@pˆ ºWJ©òòòüqÏž=N§sÚ´i^©ÊMç8QrÀÄëvl=>NífÖcá]4°`¦ç[}óÍ7óæÍSJ…‡‡_zé¥ ,帑kKëÖÓ‹•ÀD,!€™Nl`þ©¢öÂ_ö4ý§Ìå¾3°`¦SNwzã7œÙ½{÷£>ZUU¥>ðÀGŽ1«ž£GÎ;w÷îÝf=àË\×n«¶ÅÄÄx±˜ˆÌtÊÖ{ï½WYYézf÷îÝûöí{饗”Rß}÷Ý[o½UPPp¯v8k×®mpò¹çž+--ÍÌÌ<ƒüNÝîíÆx öb10 ,x‹Òe GÈQB@pˆM4°"##•R%%% .t=¯OÒçIÝ|óÍN§3??ÿtßët:ï¸ãŽ'žxÂõä^}õU¥ÔÖ­[Oò¹œcà DÈQ³B´í:ÞÀ:aÊ3á h`ÁCÒÓÓ½]L@Ž2£„(€à›h`ÝvÛmúà•W^qÝ c×®]J©²²²áÃ‡çææ*¥Î uß}÷½þúë?ÿü³ë“Ÿzê)}e¢›X‚s „(9 `JˆÎš[î^}ìPª ’õƒrÐÀ€™NÖÀÒ4í¡‡ŠŽŽVJmÞ¼ù›o¾1.TëƒÓ]BøÈ#üíoSJþúë¯Æcß~ûm}ÌB¶ì]ÊQÿÇPn­ÝëÝz`"X0ÓÉXqqqmÛ¶½õÆ-šRJ=÷Üsúy§Ói´œ [·nݰaÆ š³›û_|a8è±6Ñ×·Kø÷¿ÿÝàÒ¡C‡NùFcVdd¤Rª¦¦fÓ¦M+V¬ÐOŽ7N°;g«³ÊÓ‡¥öÕÚ™%‰ÅÛ@cßôö!Áÿè—d Z_YwqlX˜­¶éŽØ¸2º¸á—žr–ÍfÛ¿¿RJÓ´é£~wéÎõ¡š–xïµSÿ¤•;œÓ§Oÿꫯ”{f`|‡íàã+ÔÙkœNX’0 ’‘‘áí`r” D‡¨oâ>&&lI·Ä¡‘!Cƒ¯ŒwÝåêÐÐßåÔÚÿ]\5:÷ IDAT»ëàè›îªQõ—‚l¶Ú§މw}ÚÑ£Gëꟷ¥”ª¬¬ÌÍÍÕ[ftmwOnf÷0KJhptYÉyaÚâ;¶m3nܸèèh¥ÔáÇ 6ÈZHpŽƒe GZ¢}ÿ^c¼¯Î®”¢% ,xHzzº·K€ ÈQr€âÎ;«««C»Ý> "d~§ø„àFþªs÷#e×Ý9ò×£,ÝVd¼ë‘TWmÙ»îêÐÊõ~‡ÃqøðᓽúÚk¯Ý±c‡RêúÄÈ»ÂíAŽßl¿uAtèʤà’Ûÿ8¸gýLvvv#OiI9,B”hyˆöýûŒñ¾Z»RŠ=°$¡€Y¼xñçŸn:ª«^érÂ÷ Ú£cãžz1ú–{“““mN¥”*((Ø¿ÿ'GËW·ÝfïìúÁ“­"´Z­Ÿ~úéý÷ß~tèmÿO”p‡½æÇeÏ©’øà ýgðü‚íÀñÖÞZf`IC -²|ùòwß}×8ŒûüƒîaÇ7Z}õhÅÇå¶:/ü&òŠ«•RIIIú¥‚‚‚}ûö)¥ž>R^¦Õÿ½4B9ç¶‹ RêüèЋbÂÔÉ÷q_¿~½Ãá°ïÍ~£c¼åX¿¬Üá¼ó€UÿïCJMå¿Sã5¥Ž=jÎÏ ð=¿YBHKXð¾÷Gr” DÄ„h·ÛW­Zõý÷ßçåå)¥”­.úÇŒ«Û»ô÷ñ×·í>tתõíºtÕO&&&+¥JJJô5}ÅvÇ×zŸº(&ì—^IÿIMXÿ^J¼uGV£¯^·n]|pÐ{)ñ±ÁÇÚWAÁOÙ">µV_³¯øçʺR»Ó¸y`DȨè0ÓXbr d„(9 Ðòm¹{±ÞÀŠ‹‹ká3á;h`ÁCRRR¼]L@Ž2£„(€˜7nÜXZZj·Ûÿõ¯)¥j~\\^¦_* õß/ÓÓÓCBB\?Ôºuk¥”Óéܰaƒ~òðÙç„9׸'ÉRÿ×Ô11a£þög÷‰¯Þ°vÍ⺄_o{ÿÌÃ{*¥öÖÚ/Ï)¸«@ë?ȸzS«HÓXbr d„(9 ÐÒNûo—Z,–Þ½{·´,ø Xð:ß2£ ä(! &ÄåË—ëƒ÷Þ{O)Uõå'Æ¥µáñZdT£Ÿ2V ¬N))qs^ÐÂÂN¼9Än+yøgm­Rª¢¢B)¥ì¶Š½ñ讵éQ¡ÆmÎß_uÝ]»v5΄ÇÅ·š9×8ªåæœþØ192B”haˆŽÂgU¥>.µ;‹íŽþýûGFFšQ| ,œ¹eË–éƒ;vü¼|Yõ²oKk£Oö)£µyóf}’’béÜ-æÙ5QõÛ±ÛŽ¯ÿSuÛ3KºÕQ\ôÚõ\5ý†‚+Ç”>÷x;íø?WÛÚÌý»Rʵս{÷´¡‡é‡šRÃön³Z­Ï=÷Ü­·Þ:f̘nݺ™þ½„¯°¹n€UgSJ{î¹'½~ÈüÖÊ•+¯ºêª¤¤¤¸¸¸sÎ9Çõ+it¹¹¹'NŒ8qâþýûM¯`³Ù222ŒÃµŸç¬®ÿ>ÁÜZ{NÄI·ÎMNNÖÕÕÕú@_9uÍ ÛfÿmÄî£×ç–œµ3ÿskµñ‘ê¾.˜pþÕÛÖv_ñ•m÷v×§åÖ9ž±´  SJuëÖÍ8ߣG¥TÔÔ[Œ3ÃË s–~÷È#¼ñÆßÿýž={>|†?¼¯ÊÍÍu:§¾d±»l€¥• ,aÌo`9²  àóÏ??tèÐ+¯¼2gΜùóçWËËË/¼ðÂAƒíÛ·oß¾}ƒ =ztee¥éeÀ׸þíþ‹e GQ!nذ¡¬¬Ì8 ÿe­1^\Zl±4ö!¥\f`RSSõArrrN­ýÛ²šR»ó‘C¥û뎟 £èh°úMk¦ÊáÌêØmÕÅW'Û!¾Á ,¥TøEãí)]ô3AÊ¾àŸšËŽ9ÒŒô¤|0ÇY³fM™2¥ªªÊÛ…ø  g€haˆ6—Eâ4°D2¿õàƒþðÃ#FŒˆŒŒ:tè‚ ž}öYãê›o¾yÎ9çÌœ93!!!!!aæÌ™Ã† sípAªôôto—£ ä(! #Dc,¥”ESéÇ7¤Rß•ÕÄÇÇŸìƒ XqqqÆÖ'íÛ·Á©ÔKª†í>Z|ã½wÍýËÅ_¬Ÿw¥7°TPpøôÇßµ;kf›hã°…3°|-G§Ó¹dÉ’?üpäÈ‘‡òv9þÁ×BÄ™!GZ¢}ßcœSkONNvý' `~ëùçŸ×´ãÿ¬Õ½{w×E‚‹/ž6mšëýÓ¦M[´h‘éeÀÝŒ–Åb\ÿwËB›ccU]bâI÷À2–ê\¿yª}ûöëׯ_¿~ýòåËøkí²œ¢Ãç5np(õnQå9E÷å•ÚC‡ ›>}º~566VÿŠCul ¡R*qü„Ÿ*wÁîhuU|„>ná ,_óË/¿è}«uëÖ 6,++ËÛ€‡¸ÎÀÊ©±wÞy^,îàöMÜ¿þúë³Î:Ë8ÌÊÊ0`€ë ýû÷ß¶m›»Ë€é¶nݪF=&æøþP^cwª„„„“}°Á ,cý`C† QJÙœjQr—¸9/8´ §R,]”Ò÷`b¥TrrrçΕR®ÿ€ºcÇŽììììììÁƒëg‚‚‚ž©¶ØÆ=µ‰ŽÒ””VqqqZZZ||¼ñ#+¥8ðÑGy±*ð$Ûo÷ÀºôÒK½W ܽ ¬¢¢¢™3g¾ôÒKÆ™âââÿתU«¢¢¢S>JkÌœ9s\WÉfffZ­VãÐõ’ëØjµfff6z‰'¸ï ÆU¿þ)x‚k”þûSð„FÿÿÑï~ŠBFF†×kà -|»ï¾ëõZø»Ý®OöÑ4mì°!Lˆ0nû¾¬V)eü­ïÄ'4h`é3°N¬ÁhÇ,Y²$òÊ?½ßéქÿ)®š2eÊÞ½{¿úê«3fœøS´jÕªk×®]»v]»öøž\…a‘ÜW\å¨ßB+ÉtGë(¥Ô‘#GZò{ÐOz=‹½{÷nÛ¶ÍõS:= ù¿(o=aÉ’%^¯'´ü úÿö÷Ÿ"ÀŸ‘‘qÆOpu–—ê‡g‘ š0a‚Ÿþüå sæÌi´Q£ÜFsßw”9rdòäÉsæÌ5j”q244´¢¢"$$Ä8SWW]SSÓT•šë@£jkk?ûì³W_}õÕW_íׯ_ƒ«‡jß¾½R*))iÉØÉ¿ü¤Ÿ¯ ¶ Øz°Üáü÷¿ÿ}Í5×4úäíÛ·÷íÛ×8|öÙg~øáoÛ¹sgïÞ½•RíÚµ;xð`RRÒÑ£G•RÙÙÙ§»³ÉÈ‘#W®\ù`rôýIQõu:œçî>ÚmèðÕ«WŸÖ£|ТE‹.¿üòÏ_rÉ%‹/ö|=àaµ›Öþ©~ÊUVµí¹.—,YâÝ’–û8îš•——7vìØÇܵ{¥”JHHh0ߪ°°°‰ýàO=õTjjê”)SV­ZõÝwßxC^^ž>ø]ûääÍÇç:}Ó¦ÜáT.3°NÔ©S§aƇ®{`¹êÑ£Gll¬RêСCk×®Õ»Wqqq]ºt9ÝGßëG+ò-$ŒÒno%c ann®ë¡åØ÷?²;€aßç²V­mâĉ^,nâ–ÖÁƒÇ?o޼ѣG7¸”––¶yóf×3[¶lqý÷7xÓé|òÉ'oèûöÛoO¼çàÁƒúàºP›rÔw…v×ýöÎ;0Šr{ÿgf{ÉnzBBH ¡÷zETP@QP¹È½^Q°!ö†å§È×~½°‚õ öB½— $¤÷ºÙÞæ÷ÇlÞ6!Ù$›ÝÙóùëÌ»ïξáavvŸ=ç¼Î Wù@–Z­Þ¿ÿW_}•””—7°hšNOOgãÏ>ûŒ † Ö‰ ¶hÑàdÞ©6Á… {MUGO€p7M€éÓ§³Xþ§¬¬lÍš5kÖ¬ÁÜ7ñ'—tp·:&NœÈãbnÂ÷VUUÕôéÓ_{íµ©S§¶|tæÌ™ë֭㎬[·nöìÙ>_h´lÊ€#¨£0@Š(\DNg·ÛÉáîÝ»M&“Ç6«ŸL<Êäþ[^.×»ÇÆmgÙSµ`Á‚sçνüòËmÔ’6Xß}÷Œ1¢I3dkÂoêMå6+ijôz=w¦ÍfËÍÍõò´¢£GÖí·ßÎz|UUU‡ƒ§E ¾ñìÙ³‹/^¼xñ믿îÃÓ"í #Òº"¢£0ŸÄ­6{¾7°¦OŸþôÓO_wÝu­>ºhÑ¢½{÷¾úê«õõõõõõ¯¼òÊþýûï¾ûnŸ/ 4<>W!A ê( PG€" €Ñ£çƒÙlÞµk¿ýÜQVÍXĨ¨æV§Ì¶mM–††öЛ6 …âÙgŸíÑ£Çå&K§suç%9Y‚XV†y¿ÆHÆo WT••rg~ûí·ôò´¢caa!‰ÅbñôéÓ£¢¢Àn·WWWó·®àÀ·"ÇÐét¶=ñ-r1"]¡+"Ú‹8–Åæ‹!…ï ¬cÇŽÍŸ?ߣ =ù¶}ûöC‡%'''''>|xÛ¶m*•ÊçË@–_‘`u¨£@@€‹Ør“h¶ŠÐôÓ÷¯ø¨™––¦Õº_E­V8°ça›m±˜Ì±ð8r(Ýþ‰üñÇ3gÎþôAÕje»•‰D¢eË–]}õÕÀn h`ù4°Äo\sÍ5‰‰‰‘‘‘#¢"‹™¬´;õb©D"áwmHwÐ]»"‚ ‚ ÁK}}=\uÕUr¹²³³«ž}Ø©s7(¡bÄÍ&iúÔ³¸S¾Úfš¢(nÍàÈ‘#E"Q'Î3nÜ8îòùiƒI¬=wÚYíÚ‹ðµ×^ï3°’’¶Z-!!aîܹ3gÎ’Ezí#þKÄoœ9s¦¬¬¬¾¾>ÜM³Í6L¿*h`!~"++‹ï% >u¨£@@€‹H2°322(€—ãØ=;.7_9÷ö°1¸#¾2°àÒšÁÑ£Gwî$R©”MMbqö\§‰`cÚéЯ] Û¶mc»_yŸ:’úÁääd­V;œvè?ýïLCÍÒhÕ?#’#û€aÚ>Cˆã[‰o…X~&.F¤‹tTDÒô}°ÜouÚdW«Õ¾\0ˆù^*dffò½Ä ŽÂu(¢p‰9aüø9ù'çG(È£e J hþ¢.7IóÈsK.1}|h`‘>îÐÙX,×]wÝÆÙ8>>¾hø¸ÈÝ¿³‡Æïתï~`åÊ•ì¡÷V èH ¬ÌèðÚ;n´Þ&Ä©vÿj=vPš>–Ç8¾Kù".F¤‹tHD»Ýn0Øx¨Âíld›íañ˜%L0 AAqa0fÍšõ¯ýë‡~`G"ÃÃç×rÝ«z‡óÖ UgÌc³‹">ü†R‡õíÛ—4Ì‚€4°f̘AQÇÇÇ›¯˜^iwypŒÑÿøÒÛ¶±‡v»½õ³ì„Jšº³ä ë^yP¿é;“Éä÷u…(XBˆ þA§Ó1Í饃änë4– ÌÀBAA\ìÞ½û—_~!‡*šš¶÷¸ gȈ5L{Ó±ü<‹ýÑ݇2« N€ýiÃî’H@$ <øðáÃìLX©©©ëׯg¿¨¤¥¥uú< ÷ÝwŸÝn>|x^^ÞG5†Í?Ô«önÿ¼Wø“åMå6‡Ãᨨ¨èÙ³§oþ€n†ÍÀZ£R› ­N¨ZÿuÏWÞahQUU•uAZ3°Ä?èt:6HOJŒ¹~rÐ;™B«£?X3°?qêÔ)¾—€øÔQ ŽE)â–-[HÖèøVDÌÀâ Þ/F¤ëtHDÖÀÒŠèt›ž þÜh4°„ X‚ ‚ ÀÖ­[Ù>SK¢UC8 q•soOøþ/“ª•ïwÜqGBB9:t(‰?  Ô昙_÷Cƒ;_éáUEóÖ~NYNö#QîÞùò©Óå×Ìdã‡?û²¶¹ŠP#¢É$$=‘n‚$^¡… Ý k`ÍÒÈÄÍok­Ž#˜%hÐÀBAAöïß ÑCÑ*2(½v¶ö…7´1±K—.%ƒl#*±XüøãsÏMü¬ 0°Èj«ªôNÚõÙ8E*h»Ãáü*0ýg﫚såhVûÜ*òÐà¡C )}Éáh¥¤¦¦&??ßßK 1°„Aük`Ý.'#?4¸¶[EK¨ …ø‰¬¬,¾—€øÔQ ŽE(bnn.<«V4"u&âÙרø¡‡R*• ‰îºë.¸õÖ[ûôéãq’ƒ–——ëõú‰'úoé%‘ӾĿ(:šŽ®+ß÷ì£ ÿþ÷¿×¯_O¶»ò€_õµa;~'‡ê%Ò1qÜ ƒæÍ'ñ¥° VkøVD,!ä‹|SE:J‡DÔétñz´RÊ2]‰´h` 4°?‘™™É÷€: ÔQ ˆ EÌÍÍ©ÜÄù5û‹ˆŽp%RÅÄÄ,Z´FýàƒRõä“O¶ŸîÑ›m…ÛÒÀÑÑÑ2™«Ë1°×Ö™ÈÍþ¿Ò®œš††ÿ.ð²0V«eß.rxL&—{6Àb‘¦¡Èß(Å6XÝöÀB?ଫéoo®¤¨ðëæp\AK¨ … ‚ êØ ó{7T‘Ã?¿eË–ýû÷/[¶ŒÇUùŠ¢H1°î¿ÿþ¨…w‚+ œÎ 玱acc£¿—x¬Gö3F—Û¦I—›IÉä’áäp¢ZZTT8NœðÀ ,ñæ¿ÿ¢ÁUCÍôé'éÙ‹­õfAK¨ …ø‰ÀùÀ‡tÔQ ŽE%¢éç îN"ý‡ôž6}Ú´icÇŽåVØ Ò‹X#GŽ|ãwG~ò™[^¨¤)h-‹sss¿~x 9Ü®·&öìÙÆ|Ù¸I$ž¤’B€ý÷ãßþk Åø¿Zx/¢e»{Vé×'e˜¢(µZÝúÓ  ,ÄOñ½Ä ŽÂu(¢(;·Xû;y\‰ÿùüóÏ>|àÀ™3grÇeã&‰“û°1åpŒWJ¡5‹:”VçîÆµ]oáv£o‰t¬»­ÌD•”¯ú—â[Iå –ú™€zSE:‡—"2V«eÿnr6ãàXJ¥R$µþL$Èó½$T:´õqàu¨£@@àˆè¬¯sœ=Íf`9”W^Ãó‚üKZZÚå’N˜b/ÌgãÉjé6½¥¥Å‹Ž…ö])s}Œ·1¥·^Ñf–tÈJÆè› VL‹u:?$øVDnâ•ÃáÀ/Ò~#pÞT‘NÓ¶ˆ6›­¦¦¦¶¶6­©Ž1»:V8˜†ÇÀÂúAƒX‚ ‚ !eßNŠqu©ÑFÑ‘Ñü®'p›LâÉêÖ3°xAr쉭MN¦g›ˆÄ²ŒñähŠJŠX݇‡ÅãJDH0 £R©†Z²ù{2~Ðáòˆ‰…õƒ ,AAƲ÷o÷Çæ@dc3AäJtê/ÇKè1°zU•x‡Þ íXÒ WxŠZ –ÅbiR7À5­°ŠA|E]]Ífcc;§~ð¤DŘ  …ø‰¬¬,¾—€øÔQ ŽE""سv£Þóð¸–@ƒR‡I‡¥“ÃɪV|ÿëXWU9’v[$;ôðÂÀ’M˜Bâ±J‰¾®®›–8¬ZµÊË™¾ ,¾”7U¤ ´!bee%ÄŠiM­+v0§ue K£Ñtç>A ñ™™™íOBÔQ ŽE"¢½0Ÿ©©bcEkÆĪÙxwa¦JªÓé<, ÿëxáçMjÚµid¥ÝyÖl§(ªÝý"Å)©¢—É%§)ù…3Ý»J¾9sæÌ[o½åådߊˆ%„| oªHWhCDb`Ý •“msOšmtxc a(€‚ ‚ Hèb=êî¦T“b ‹ @¤ã&‘x’Zêt:yo®ß¹•Ä»õV ::Z.—·ûD§Š0º ·;Ö8¼øâ‹¼ˆÅµ8ÑÀB_Q]] ršZ­"ƒÛš,Z­–‡>oÞ¼Ûn»möìÙü,é~pBAAÐÅvì ‰Eœr9„E:,Rª£âÄt?™¸¡¡!<<œÇ%…åf“x§Á‰‰‰ÞÚïÚæÃ…+V¬`šÿW{i`ùVDÌÀâ ¼3 €6D¬¬¬œ¬’’Ã}F›~ÅoM7âgÐÀBA 9xà={öDV”‘º„d×ÈHú Åö`c5M‰Oæk%ŒA¯:箯~ÿ#«W¯þôÓOo»í6oOÁÉ&³ÚÃô¾]!ï\¸pá—_~!‡^X¾ ,é*++§¨ÝÖ.½°_{¨MÜAAB‹?üpÍš5ÐËØ®j ÏàsM EÉ®šnüösö(üôÑŽž 77÷ôéÓW^ye3Ì»¶Šš sTì¸ù ǵý„¨ ¾huô–Š€±Z-»·Ë§ êëß¾}ûHú”••ù XBˆ ÝA]UåxNÖ.ƒÐÀ =0 ñYYY|/ñ¨£0@Š(øq×®]=ôˆ(èK¹¿]'\1—õò©3H_pœn‡Â9rÓM7EGG?þùçŸç:,ÂôÛ&Ë®šÑÆÌË¡ÕjÿÐYÈ¡yûï[IÀrøð%ùq^f`ùöbäšV˜åOðÎ(Ú±GcmM±±^¦8k¶6,%%ÅO+C4°?‘™™Ùþ$$àA…ê(PDÀ—ˆ_}õ•Íf€4©XÕüe Öîì?åJ^ÖÈF·Jel¬°˜¬G’‡¼Ñ‘ݸÐápìß¿ÿå—_®­­íè.^¼è¬«1sºVÅÌ]ÐÑ“€F£ùSÏ1°vmcl¶Nœ'Ð0›ÍÇÿù矷n½¤3½—–o/F,!ä ¼3 €Ë‰ØÔÔ4„v[Ãô¨ñ ¦_…$h`!‚ ‚„MMMl0B!!ƒyb™L&ãiEÁ€XR:ˆ™~ÝØ¡g{l\؉º¶‡~øâ§P;{X!WI ëèI@,Ÿ¥¤ìÞ…ÀèuÖC{:qž@ã·ß~9räìٳϜ9ÃŽP•••………‹/~ä‘GV­ZåŸÅ` !‚øœªªª¾29ŒŸrÕ AƒÐÀ AÐÀBA !ˆ5Láî…ZÇÓr‚†¦tw¿)óŸ?1V«÷Ïe3°ååå}õcÇŽU}ù 9¬IßÑ3´ڿš8IX;þìô©‡ .pSRRbccÀáplܸqÍš5o¿ýösÏ=góKºf`!ˆÏ©¬¬L“ºïYâ>iO=õTF¶n 9ÐÀBü¥ ÔQ ŽE|‰¨ÓéØ`8'ËÞ§/‹ &2Æ×6'.9u–Ý®R5otôÈÀꨥÓé"j*Sœ.ËÌÎ@ÛïîиhµÚ?9–e×Ö6& VFFFbb"ÿüóÏl`³Ùrss[}zKív{ÿþý‡ž‘‘áá?¶ X|wFp9«ªªÒ8Xâ”´Ûo¿M´DB 4°?EéÂu¨£@_"²X ËÝ¿f«FàïØí ŠþIg&‡¦Ÿ6°AKÏ;·víÚ>ø€ôcòp@:ZBxæÌ™ÛÂÝž»ÍŽA™“;t.&Ë`59]ä¥Åöܳ>[€àáL=šXÜïäÀЃ–"œ?þäÉ“GŽ©¨¨èÐb¸eƒXBèOðÎ(.'bCA¾Väò.(…RŸàÇE!X‚ ‚ !k`¥ÉIJæß®Ëmޤé¼.*ÿ¡Ám`™wüi¿p®Õ™_}õÕwܱtéÒwÞy‡éb aΉã7iä0;)¦;ÿ^«ÕšL–Á]iþ$,nÖ,üÚ†òyNÃÂÅÕa2Ysã0ÈÉÉñò„çÏŸ'qUUU‡ƒXâs 9Ù$§¤æ^…*h`!‚ ‚„¬5@æN¿Ê6ÛûöíËߊ‚ƒððð£&[Ž¹Ù q:šÞk½)xuu5œ8q‚ ºh`9þþK#r}[«¶;US§wèéhµZØ®çVnéÊ yÇh4’Ý'ª¤&icúvZAöªÍÚ^á»Ò¢oÐÊÙG/—Õ’sçÜîdeee‡Öƒ‚øGÛ¤÷Nãq%¿ …ø îH‚: ÔQ ˆ€/ÙX8õƒyN*!Ë1Ú!<<œ¦é׫ôdļýw[ö‰–:«¤¤¤¶¶º¸ !à >{Œ­o0M˜<¥ƒk¿ÖÀÚÚäÎÀ²?rñÄñüü|Òà?¸ÈÏÏgFôéýA¯H¯7ñúÞÚÇcÕpù ¬–"r3°ºb`a ¡?Á;£¸œˆ²jw%/X¡ XˆŸ(**â{ ˆ@…ê(PDÀ‹ˆ6›Íl6À ¹»ƒ{cD ¶Âmš¦ÙöçGMÍ;Ù1Œé×-u$4'au%˲{[ŠÍÄÆN€ï›lcÆŒéøòݰV©ÍÑãrØŸ¾rBjjêܹs»rf¾ °^‰’ÆÐL«sî‰RÆŠésçεšÕRD,! FðÎ(.'b„Þý.*B+„A ñC‡å{ ˆ@…ê(PDÀ‹ˆ$Åfg BgJªÿWŒDDD0ÖȈiûDÇÍ›7/^¼xñâÅÜ:µËXlÆP»”––6ü÷ÿÈaÓˆ1‘ÃF*•Ê®ü† rã’Èàõt¤Â. ``THFÝÿÎÖÑ76š­ÍÿÎJšz Ze6›/^¼Øò Ü‹ñçŸ~÷Ýw?NF°„0XÀ;£hUD½^ß ÜÉŒ˜ʈ۟‚ ‚ ‚ÖÀÒˆ¨øæžJ64ƒ‡óº¨ !222??ÿo½ÕÂ0l |gI¡ýÂ9qZøñÇ¿øâ §œ8qÂf³FH$J¥²±±Ñb±ÔÕÕEEEµûŠË¦_õ.ã2e€Ôç_{Ogìâ_Ï™œ£›'«¤UZZªÓéˆÃ,°ÖÂwŸ{ÉБòÿûðþظ#‘ÊWz„±ƒ #ÕÏœ9“–vÙo¿UUU³gÏöÄBá—ÂãG{IE®‘XŒ?º„0˜… ‚ *î¤bP5gÞ<—DDDD€Ác ¿²AAAA˧œ8q‚¤_iµZÒkÌ›*†††Œ:÷´3šhI¿A\}3'Ndƒÿî‡ödÝ qO+1Î 80&&jjjšFŒ%ãìV}Ag`ÆC‡ݬU(i×7\QBOYæ•pë­·ö4H}ïr2yn¸.æ¶<ɦM›Ö¯_¿~ýú¿þú«å£XB,àQ´*"uâ0‰ec&úq9HÀâ'233ù^âPGa€: Qð""›5E-##â´þ_FÂf`À_MÒÂJV|ÑôëF»Ý^RRÂŽLVK÷¤E=§¯’^­’È·þüN¢&«oô8¢CX•›þ§i®ô¬²;æ^ë“¿‚¢¨É“'³ñ>¹»ZpŠJ#¦ƒ® ÖÞ½{­VëÜp·Ó§¼yÐ"÷á óÄ}]ÿÉi€á‡wµlØ0ÖŒ+//çäyG³™3T.P[öÎ;ï° G+V¬8yò¤¯^´;hjj:|øðLN§0ù5³Ziºõ.[î©èß %ÅùùùìÈñãÇ#Dôc±jR³ÉvsOIIa;m`a ¡?Á;£h)bÓ¦oI¬Ì¼Ò¿ËA4°?Ñ«W/¾—€øÔQ Ž dE4GŽ9räHÐ:µ¤»EÌÎÎ6 ¥¥¥ÙÙÙd0áø~9éu˜¤¸ff·®A`p3°à½ÃnZÁ™¨’’ý Uö´ÕYž.×C]^<^%…æÎM-_Âl6=zL¿o&ƒŠé7„……ùîÉ^„¥fëNƒ»òå8õsËY±bÅÑ£Gß}÷ÝóçÏûðu}ÎÑ£G£Á™®t×ʯ¾¾Õ™a§ìÔsöŽÜþGÁìÉÇ>ú=÷,„W–þ™¹,Fµ55*C)¡(ê…^ˆ‹‹:t(;¿Câ.„|²wF!ÁñÏ?ÿt8ŽºŠ©€ˆ›æó´.$P@ ñZ­–ï% >u¨£Y³³³322222,XÀ÷ZºŠoE,,,\µjÕSO=õᇲ#Ä·2›…öçO§¨æß "Ÿ%õ„Ü ,0:™«L‘ßjIKö¸©W̸²Íö?8».í F£ñàÁƒ-ŸuæÌ™Ç{ÌYW^˜Gå3nôÕŸ@àvJ~¹Bï \Æ[‰èáÕ7ß|sÏ=÷Øíö7°***¦‡qê‡jY?ÈõJe“Îᮌ³š&üö]õœ+*'ôE_ÚS"€žÑÆ”È%ÉqÉÉÉO>ùd\\;Kƒ‚½3 ®ˆ ,ØxÏ¿HÁoetqï4žÖ… h`!‚ 4oƒlÃl„pìØ±'Ÿ|òµ×^[µj;B ,ÒÚ¼í0³Ë̲‹%Š›ÿáÿu5XP]]-=!âÕN . œ·ØŸ)o2N˜:vìXvä‹:w±á‘=FLÀŽ;Z¾Ä‰'¶oß~ðÃÿÐŒ+‹ÇÒ3Eœâ³îW„I“&‘øœÅ~a¤{c¯;#•PSuäÈp«ªªêZÎŽòi3.73,,,—]›_{ÌdóxÈ©k»Õ1O¨Û™SK–,‰%/äýªÐÀBŸ`4RóÝÕÖª›ƒþ‡+¤ë … ‚ HÐ@¾ â×BêëëÙ ¤¤Äb±@kX†o>%ó+†dÐa˜­Ð1<2°Àét}úçÓ+•ú••ú½W£¥˜˜`“°€uõ&ò”Û"À¾}ûX«‘ k`w–jÒT_ÿR©tÌ×nôZ­vHú(õÒÇÈ£·„+Ø4±¼¼¼@6‹µçNKš‹Å}úŠ“û´19** ¬ ³øbÍ‹M?5š³ V‡ÌÕ¾ÁáüÊè.0´ä¾ù¬wïÞìa^^^Ë^ÌÀ⋽3 "¢Á`˜ÆÉ¯,‰OÂý@ ñÜV Hð‚: ÔQ„¬ˆBÊÀò­ˆÄÀ€¼¼66–¦]Ÿ®¹¬o03ÍÛö–ŠÆ(%&“éìÙ³g;yòdšLL’©dx†¯ÿ¤Šp„ 4M+o¼•Ô*Š(ÈTIÀb±vÓºNJ¹{mò©m¥_@tt40«k÷–4ÞRPÿéõ wܱ¬NÕ ³Õ§'MWÎ[Hæ¿ù45ÙÕOšìWè h`ñEÈÞ…Q¯×_­–’ñðkgó´"$°@ AA AHV'øì³Ï(Š¢(jútÏï꤄Z3° ÕUÆדÃuõ&ßîj:´š„ÿýïëêê***rrròòòòòòØþßÄÀjp8­î>S·E( EaZqqq]]Ý$•û;›hÄhJ"îáñÇg—ºnÝ:Z$¿Ú½+%Yƹsçºi]'ÕÐ@bÙ•×¶=™ÍÀò`ßÁCgššœ ¤¤¤„-{–dy8*ËòrXG²¨¨Èfólžu9¸eƒXBˆ ÃX\8Táz÷c(jЋø]  … ‚ HÐ ¤ÂN@vŽ?îñPÛX¶Íß2zWÛ¿é,h`uŽ–EQ÷ÝwßÒ¥K#""(Šêׯ_Ÿ>}úôéÃ#FŒ`“¶´Z­dÖ\ò¬ÙyšLìa`±õƒ34î$/Í”iÝ÷·„……±K%©I²qîÎîׯ†³AÀ¶Ár”F8]ïŒL.2¢íùäϑȕãvðàÁ’’6NJJ¢5ZÅ·’iÖu«“ÀápxŸ‰†XÒuûvr6M—ÄÄñ¹$`@ ñX”. PGa€: €QHXñÂ… lPYYY^^Î}ÈÃÀ:pà9”R”øÇïÉáº:£aÐÀꤻB¡˜9sæG}ôÃ?|ðÁ—›/“ÉJKKm6[CCC⬛Eñ ®§ÓÔÚ^á;ÿ4|þé— ìà‰'†Ê%™œ ,ÙÄ+ºë/i ÉÈ1”ÜÕÙ=Âfé#AXÖ#îÿäâ¡#A$n{>7kذalŠ\}}ýÎ;ÙA¶e»jÁÝÐ\j;—ýdœëJñ¾ X|²wF!AD¤O!ƒòÉÝhå#ÁE;oôâ+°(] ŽÂ@:>ñÄ/^€•+W²Û~ AŠè B2°:!"1°àøñãd‹4¸ÔÀ:zôhEERHž‹£ëkØCŸÕ™@£ÑtnÙ!ÉÀš?þ§Ÿ~Úöd·oBÓêÅË_tõJï-õ>½_wz?8kªUwÜwâĉbÜ]Š­†ˆûôáâÛ…’J¥éc-{ÿf'«eùuÆ€5°Œ÷X>zB»ó¹Xƒ JJJúé§Ÿ   €d/(qJªbƦ_7²ƒ3Íõc”’ƒF[ç ,,!ô'!{gDDù¹ÓdP6n2OËAÌÀBA„ÀŸþ¹~ýúõë××ÖÖò½¤ åB†a¸_¡=ª¹=°ÊÊÊØ¯Ía4µ¡wÄ¥»‰ÒWuÆz‡“¦i•JÕýK $«Õ†Jí¢œ·[¡FнùRã‹-ÈÞ7S#'ƒq<Ù¹EvÙx÷ÅqJ p–åÈ~ËÒǶ;Ÿ+Ù AƒFŽé18šgVŠz$²1Å0ÿŽTBGú¸c‚t{Až¸ÑuS3Ó"Éáü® ÐÀBA„@(û!…2°:JYY™Ñh$‡V’¾á®(Ï-ƯÕÈdé"”D²ºÖjµšâŒ#Þ3f̘iÓ¦M›6­¥ýá%ÚçþÏÞoç(Ã×9†r· ÷$Ÿ|U§×Ùi¤£Æ‘x”R%%%&“Éÿ+ig}-UZÄÆ ¤#Úß«ÑÃÀJIIá>*‰bccÙ˜Öhµ/¼Aº&L¦¢),!D¿aåäWª#Ú-FB4°?ÑØØÈ÷€: Aêj¾† Eô!9•‘[?—X–ܳDЖōTô%¶ÔM‘jK3Æ;Þÿ¦Ìæl€Õi–.]ºeË–-[¶ÌŸ?Ÿ騎”L±î§kòj_¯ÒÿOg¥d²VæÈšåÏ&£xÀJêj•(ʼni§Ó™““ãÿ•´õèA`6.’*ÈÖmàQBèa`ÅÆÆ’Îî ›p…(¡'+hjºFæ}îBÈ!{gF£ññÇ_¼xñ¢E‹Àzh/y¨(Û·#nÐÀBüDQQßK@|ê( ©c¨X‚Ñ„$tGEô0°.\¸ÐÔÔŽŠ²úÅ·EˆèHý¯H÷×ø±h’Òý«µæ©ÿ× u•¿a,Ò‰‹Q­V—)5oW–×ÃÓ¯y$”(ÔÑë·È&^é»5vJ*BG($°cÇ^ÓÖã‡H\ãÍSH–L&KMMMNNæ>Êí(@QŠëæ£9Zy~~>Ól™µÃ0\ÓJïTADÈÞ@qqñ믿¾fÍšO>ù¤¦ªÊÂÉÀªŒëÉãÂ@ ,ÄO :”ï% >u‚Ô‘äã„È·AŠè B2°:*¢‡åt:³²²œ õu‹ocª\-ۗƆ;ö6¾³ЍùûvSx”¤ÿ`Ò!®sý›VéÜŘ””Ä%É}#ÞúX}×ýGŽz¼L· °~óԛŽÓ|ºÆŽ!šNât¥¶lÙÂßrZÇvü0‰’Û˜IHMM5 µµµçÏŸ‰DIIIÜ”«„„ùŠëo"ñd•Œ1¼IðñxkÀ;U²wFPZZJâ’m8k«ÙXç`ô=ÐÀBÜ … ‚!ùH©„°£‹|Óþ믿_~Üžçî±A1kf_Ãæ’ܪqצå'÷€š×^„ÜZ*„ˆU\\,¿jFزg¿WD}UoÚ¡·¦¤ñé^€d¨»½×H…vïÞm±Xø[‘'ŒÕj;s‚Zúðò‰J¥222²W¯^ ‹{öt1öÌÀ÷(Nqíi+¦`¸BÒ  Kĸ–mÇŸ$þ[oQ†aÊ0â ,AD "}=êtBÒCšmE[~7ÿõ‹ç¼õë¾þô“t•¬§Î•oÅœ‰ë 3°x‡k`±i±Ô§O~ÖÔŒd'K%£ŒFãÞ½{ÛxŠŸ±åœdš µ›CÓÙ„5naK $ÃG‘xd§ ,¼%!ˆ7p ,Íé£$þ½É‚{æ"\ÐÀBüDVVßK@|ê( ©c¨X‚Ѹ‰WÁž„ÕQÉçû… Êd2¸ÍP-šò8«+3Î}k’{S¶zk-RBˆX>¤s#Éý @Kœ”BG¸Ú¥)I“‰`ëÖ­¼.êlÇÜ °md÷ÀŽÂíãÞª%åXéh`u‚Ô1Ô ,AŠè Á»?½Ùl~ë­·t:^¯ï½÷(Šêˆv»ÍŸ‰D)))™™™Gödª¤dB–ÁJõkW÷§€8[ŸÔû €XÝCç.F’Å~m3 ‘HÈC¼AQ’AÃ-{\ÛÈÄç-ö'N´ý$båX‡Œ¶±5°ÚÏÀº´XqCC»çôÈ µDQ~ Ù;£ Öl­œ î1Øt ,„ f`!‚ B Ô ¬%x ¬’’’gžyfÕªUï¿ÿþùóçÀl6{ÿôÊÊJö›pLLŒH$ºiÜèWz¸Û‚”Ä%ý»¨¡ÌÖüb·16æYì;ô£Ñ˜H¤!ÖU¼xñ"»Ã]¯^½Äbþ`§õ'q?¹Ø-/E‹Uýín*Èh‰ñj–´›%é7R¸vöŒÓ–âÂvωXÒ XKBQ #dðwÐÀB¸ … ‚4°B®¾ÁUBXVVFâ455Mš4iÞ¼yUUUÞu‚Ô‘xÁejtAŠè Á›Å5°vïÞ}ÓM7>|xÆ C† Y¿~}»O'ÖÀØèÚÝ n¬#i1×b€ßt–Òac¸Ïª6úg0«ûèÜÅH žQ IDAT<ÄÀ4°$}ú‘¸¿,€2°L&S›‰3ÙTa¶%\' %„4MÇÇÇ·:‡[E¨.Êk÷œ¸ !„ì1Øq8ì=î®H%ÜF+›œ ¨ÕjÞV†h`!~‚ݱ vPGa HC-K"zCðXååå$þôÓOIKìêêê… 2-z±_îész§ÎÝIz“Î*Ÿ{{]ËÏ*»õ.å­w°1Sû{ؘ5°0«;èÜÅèX©ý€r¥øõ–Š% X¥¥¥ w‰åÁ.tp€äää-[¶lÙ²åÇ”H$­Î‘Žt›Â±eXBЄì1Ø©¨¨p8ƒäâá ×eÈPÔÿ¬.§3°.üר#!‚V«å{ ˆ@… u 5K"zƒ0J‰]EQÃ0‹¥¶¶¶í¬(ö×éh1=®º˜ ®­3=S®›SY™—çJ ‰‹×Î^IÉd†u«µÏ¯’k\½ØBÌÀê:w1ªÕj¹\n6›M&“Ñh 4‹R‡‰âå¥ ¦ M&* «¤¤d´Òí46ZcÓ:o`‰ÅâiÓ¦µ=G:zGÂ)! ˆ“1­Æ}¥üÒhŸX~m‹(5ÎÖ\=i¿xÁY[ÝÆdÜ…GBöÎŒ|úé§Ÿþ9èõúÍß|}µÚýÖ÷Cƒ™íŠ˜~…´ ,A$èá–’—©t” -!ÔétlöŠB¡=zôK/½ÄŽ·›ug¤‚ºtNîõÅ&qŸ¾={öô˜ßjEQ`2™ª«]ߺ1+@ Bäää°ªá¼GœÚšKM“%"9ÍÿF„–[¥ŒË*±9Žšlà—4M\üi³Ú²O´13°Ä²³³Ÿxâ‰ÚÚÚµk×N‹œvÝë ­Ž£&XÈå@ A z‚7+é(Aª5I°JLLüõ×_I–MX‹EW^6»+“ݹªÞ÷ãNqröTÜù111©©©'¡iš-¾`¦¸Øµ}!f`Dˆ3gΰA@X”R%Jpeù‰(è+ûßÀòH_2ý¾™Ä?7Zؤ(?]jµÚ&Žuúx“ÑÀBvq:999555=öØ{ï½Ç-ßÜhfš÷%4° …ø ,J¨£0žŽAš•Ó„'¢—»•@¾ogeeõR)®×ÈúÊÄÕåžVAAÁ<­LÝü£t¥Ý™q¾æWeˆ%ìˆGVËô+òéŸìs‡X¾¥ë=°HVà4Àb‘ô@âr‘ÿKßyç;ëk-»¶ÃŸuf6ðC,µZ}Êâ¶Ò¬mX¸ !„ì1yâ‰'ØÝHvîÜIóóóãì–×4_ñ…õâ…)*wýàæF3466²‡h`! …ø ,J¨£0žŽAjjtá‰è%AjVr ,×ä—å'¿ôÈÇIá;Ó¢Ö5^¬½cŽñÛÏÁáú£ Î]¥$gø²Îhe˜øøx2â‘uûí··úÒ¤ 1°0Ë·t½Vee%TˆÓÜV™¿3°6oÞüÅ_CÓ/?06WT®Å~¼9%Ê'ÿhm‹HQÔE‰;CK–½32ß~ûíÖ­[·nݺ{÷n2˜»oÏw) "_&‡?«5—ÊS}ž³\rgG ñ ,A$è A+d R­[X O=ÐøÒã`p¥´È(°Þ×øÊSÕ7Mµ< ’_'JDì£V†ù²Þœ’C'ŸìçÌ™ÓêKcVÀÒRˆ€3°.ÉÀò«e4~øa²A7~Kâÿ5¸Ò¯(Šò![£Ò®FîÎÚjGE+».° … „†††’’6>}ú48ëkS>|-I"€I*élNý êÎû=ΠV«ý²R$h@ A z‚ÔÔ@:Ï3°Îž=Ûõ“´‹‡eøüÓ/ZiÏ;_{çÍMoÿ¿´£{Èàgu¦j»¸XÀ©"¼ï¾û$I«'$Xä/ug!¼ÒÒy èB™ØŸ%„+W®,,,¬­­e/sÛ‰#ö\W¡¥ &6ŽŒŒ‹Å~XZ£Í6»ßplÙ—­"Ä]„Í0 ‰€±˜ë–Ü®«o9YܧoØõs w3°ÐÀBü©dF‚ÔQOÇ4°„'¢—øVk§Ó¹hÑ"?|Ã$?A'$$XdéÞ~…ú(wæÁƒ:ôõ×_/^¼ør/M>ýët:6èÓ§O—ÿ ÄM§/Æ–V e`‰RÒHϵ‘µ¾Ö?¯›››ûú므Ó鬪ªýçG·ë-q³±¯,¿vElÑÇý²U„˜Å#!{g XN:EâóçÏÛl¶ÆÚNku²zñ2 i­VËD ñ ,ÄOÊ$¨A…ðtäfâ„È·á‰è%¾5°Ö¬Y“••å‡ÿ3dÀä¨È†g„fsŠÖ†¯ˆé;ò\õ¸Üšú1“[}î'Nù¤é×;vlݺu½zõâ>¤Ñh222þñ´QEE2°\¯HÓ)))]ù[:}1¶,! ´ ,J"§¸ìN @^^âŸ×}衇, WTTØ/^0oÿ<º®Ñr÷Ýw³±¯,¿vEÔjµ'Ì+çÔåf¢Å#!{g Xج+«ÕZô/r³õÍe¹”L.¿j†bÆ Ð±B ñÀ9·C‡å{ ˆ@…ðt Á ,á‰è%>,!,--}òÉ'`Ë–-ƒ¡¡¡aþüùÝÔnÃm`ýü­»{- c5õá§»‹¬Žƒ“¯»åú_z‚ôqw0°²Ú°loVZZZ§_Ú£×{bb¢L&»Üd¤túbT©T …Âd2‘‘@ËÀIÿÁö çØ8¬ªÜ¯¸uëÖßwÛU©›¾„æ4ÉSf•1aþüùãǧ[$ktšvEÔjµûMÜÂËf`á.„<²wÆ€…›5K#W|÷)9ß™.ðžˆ^â­xàrH ,ÒjÝ·°…ˆ‚TݾhÏÀÙI°¸¸Øét’ý 'Mšôõ×_‹D¢.¾ú°aÃhÚýy3°|NW.ÆéÓ§“Øoêu ÇÀêa1€ÝÖÆdŸÀÝ4ZL÷=ëÞïou­AáÑ Î'´+¢F£€“Ü*Â3'[‰»òHÈÞùbôèÑ‘‘‘‘‘‘{÷îýí·ßRSS tã7²æææÀ š]iQ}eî7·äÑ{ V2dHËsr«ª€õ„€â'233ù^âPGa <C0Kx"z‰O´þòË/ËËÝÝ|È&ßÜb.žvŠJ͸L)UŠé7°"&%%±ƒ%%%uuu¬+¾k×.öU#,,Œ›u…–ÏéÊÅxß}÷Ó*뀎ˆ´‡G²±˜alù¹Ýúr Ü;çj¹.¢ÿ—!o¶ÌjíÎï̃[KÙè:íŠÈ6Û:Åíã~¦õ6X˜Å#!{gä r'­©©¹xñ"_¸pÁf³@qqñLüœŸnþ×`ú‡N€L&›1cFËs8{ˆâX‚ HЂ»†,>ÉÀb;Rµ¤[3°¦†IɈâÚÙ”ÊÕ-ž›EçÃp«ÑÀ (’’’æÌ™Ãƶ!ÁÑ»/‰ígOwëk 6þO¢f ÜµñEÑädZMÙð×\sÍÀ/ÍÀj}#B4°Á`0°í#áRËf³ååæ@Õ…ÜWz\ÒÁêŒÙþt¹ë)sçÎmÕµˆˆ qddd{ì"¡ X‚ HЂX!‹O´®©©iu¼[3°úq (dW\M⸸8©T µµµì o“q¸}ÜÑÀ 4žxâ‰'Ÿ|ríÚµ|ðßkiª¯;!Âv6»[_‹4Àšž;-̽]æ9môjŒÐMXí’’’ràÀ¤ ™F§+aÓY[í(/m9w!DBn"3×ÀŠÑ’ÿY3wÚÔß¾»ÜJ"‘­xc £15_AK–x¶ogáöÀÂô+¤%h`!~‚»‹*¼ ŽÂ@x:† %<½¤[ ¬nÍÀÀ1°Äi YDš¦Øñ£G²o ,’¥Ñh6Í'xéâÅ8jÔ¨•+WþóŸÿ4h¯–ä[dƒ†’Ø~þL·¾i€õl‚ûKìq³}á…*ÃÀešætoD {óíwNr«Oi9 3°x$dЪ¥Qß$‡++JlgOÇÉõ=Gλý‹¯¾f‹¦GŽ9a„VO«ÓéHÜ·oßVç ¡ XˆŸèŽŽ›ˆÿA…ðt AKx"z‰OJ/g`•––’~X>¤¸¸8ZLG“¢erqR2pD$m°Žq}öm áøñã¿úê«ï¿ÿþ»ï¾óáiÁ_ŒªÁÃIlϿЭ¯Åf`]&ëctõ]Q®+©ªfãnÊÀòRÄáÇ7öpÏ´ž8ÜrX<"ø‹1 ¨¨¨ qUUUQAÁÜpùï}¢†+$3-}©=ãÇöÙgáòéWpéV¹˜…´$àö:A„ Ûü vPGa <CÐÀžˆ^Ò!­u:ÝÝwß&—Ëßÿ}2ÎnìÝ‹ÅRYYï“¥Š‹‹/I¿Jí ´8"¶4°|›¾`Ážá"ø‹QÖ¯ž ਮ`ŒJ©ê¦×:{ö¬Œ¢VÄ»ûælm²2º’žâââº)…Ð{“®½¾ÿ”­'ÛÏÀÂB"ø‹Ño0 sß}÷1 £P(^}õU¥RÙr7ëôéÓ÷ªéå±ê–Óö¬ãßXb—«õÌ3Ï:tèÿøÇå^š»{ XHKÐÀBA‚ž4°B–i}êÔ©õë׳ñŠ+ˆ+t¹ ,())ñ­e4kkkûGº?ý‹ÓzÌ!}ÜI c`nH‡„&”DZbwö–Ð c/È—pŠ }Èùóç÷ïß_´2E*bGì ¼Z©'øj€Å%lÌDb`ÙsN1V+%•r'`"JJJV¯^ÍÆK–,iÕHâXò¼³%]â1Ú m)Ë«Lõ)½É¸X,Þ¼y3Ù}µ%Ø i4°A w! :TBÈ퇲aÆj4šôôôËe`@qqqFFF××I¨®®€œÍÔ$}xÌ!Xß–"H)QopU×Ú .t“µ|ùò(Æñ@´ûëëÚ:ãY‹û2çk B.=-¶9’$"`¬V[ÎIéðKÞ1ÐÀ d|ðA‹Å"‰V®\‰éZm@¶S€²²2#iíÚµ………üñ{¨¢©ÿôP‹)×£664˜^¨hjr2œœ,‰¸OoýŽEQöÀBZ‚=°?‘••Å÷€: áé蓾HÁ…ðDô’e`>}šÄK—.:ujFFFññ#©4£ ©VŸâó>îì.ã—–ög""ÉÀ"`V c)ínjc/È뎗رcÇ/¿üòLœZÙ|mÄÒ׫]éW³fÍ‚îÌÀò^Ä=z3¹ï2-û¸{Ô ¢åOÚÖÑáp|ðÁkÖ¬ùð몪ü¶ª`„l§¥¥¥kÖ¬4hиqã^ýuxâ‰'V¬Xqüøqv‚EO‰Ë¢bî(ª_^¦kjÞm°å ®Ý—¾xñâÙ³g9¢RuWµ2¼`â'233ù^âPGa <C°„Px"zI§3°XÂE´sÙ]ÛÓ¢ Êî\U¥ÿ¶ÞÄÀîèCt:Ðk`5g`[f`¡D„ÂÅX-WÍÊÆŽ‹èãÎ0ŒÅb‘ËåíÎܾ}û¼pù­{æá!ct'Š@©T~ÿý÷÷ÜsO÷e`y/¢X,>/Q¸\*ëуª.æNÀX<Ò¶ŽÕÕÕD£Ñè—+XÇgGâââ{챺º:ö¡Q ÉÒU:§kû –z+EQdG”–7¸¶™4iRWWÌÀBA‚ž4°B–ŽöÀâJ(ø8I+«©dcÅôËña}¤—”6>Üʶb]¡©©)NBkD®¤J&ŠOð˜ƒàÔ«4$îPVQQ‘B¡ (J"‘´í8Ëe½• %‰‘’þƒ­Ó®¥(jÊ”)r¹üã?9rdgVïkÊ"ݾÖYàl«foIw×<4°ÚÆÃÀ:zô(×ÖÖ655Ùl6 E=§ÞÜ;rz˜,¶y]““9:0].—¿ñÆäé5°¤mÐÀBA‚4°Bïµ.))©¯¯ç޼6QuI»e%M½×S+æTîÛ·Ïdº$'«‹ètºd‰Û#÷ê ”gõbLLLX˜{Û5™LÆíb‹ ¼cŽv[6ö‚‘SÔRgÙøÞ)¿ãŽ;–,Y¢T*§OŸ>`À€ &Œ1¢C¯ ï¨HW@ ñ¡Ð!"@…ðt AKx"z‰÷Zs;¸À-á IóoÅ%6ÇÖ& yhYŒª'IjÛ¶m>Y*‹N§KâT)Š{º ,®ˆ7Üp‰ÑÀ .BábŒŽŽ¾`åxÇ^W’ ,¸Œµ~ýzÝ«OÛsÜW«öÙ•ò«®ëìJ;I‡DìÙ³ç.¯ ¬¹%mëX^î6^ÑÀj®ï lVr†RòqRøÎ±võ›ý9]ËlŽ]z«a~l4÷5šØÍ?þøcNNΞ={&OžÜ¡W…wT¤+ … ‚=ÜLü¶ l¼7°rss€¸7J¹4Zõ¯HwñÑǵƇKuõÍ%*šZ§&úÜÀâ–Š8—ë®»Žì,ŽhDEE]´p.½ÂÎXVWWÿ¹ì>ㆯÈȹV9oaçêwéÝ–õÄQÃç@sŠ îB°`–—xX°óÌ3999Ÿ|òɃ>Ø+AABÌÀ Y¼lØÏþ„{FNFT·,ü蹕µµµd$..®¸¸øíjý7ÉìHJÙEEYÆcî ÒÕ“ørÜ$À‰ŽŽÖ;™*»3ŽM'´Ûì%Eâä>m?ëСCÜC‹ÅRQ^žûð݉•3_­Ò[føðáÿŸ½óŽoªêÿø÷fï6]Ж––––=+³(¥ ™ŠLKñáÁGõ§€€".@}ÜŠú¨€¨ÈT†¢”%{ (”–èÞÍÎýýq““Kš¦iš¦ÉÍy¿øãÜ“soNúå&÷~îçû=QQQxkÑ¡C‡K••ïÕèÅbñ\ëí”f÷váÄi­êÀ¢ XôôLŠ^xÁl6‹D¢¥K—yð}€Z­V*•hû'ãÖ­[ÔÚøøø’`£‡ IDATÄŽ'^±Ù¯þ[¡6˜­¿Â”€>yòä6™*&0ñv ¬={öÌž=›Þ3{öìß~ûÍËÓÀ`0 “ÀVà@·38qÛHYÄP±Íî$xð¡öíÛ£M¹\NÕJ?¦Ö—Y=l­&]Ê:°¤jÛ- Xÿ$88˜ÍfçÑ긛šªã®Õj÷ìÙCµår9p P½µt8M½2œ¯7¬-Wí©ÓÀÚµk=?õÖ!::V­ZÅóêÔ9n®ªhÕU=ŠÚvVaaáG}ôÉ'Ÿ¬Y³¦á*rzþ `«qPþ`rròг-rV :¢ÒÑGRç5ãe¼-`]»v­wïÞôž^½zÙŒ1Œäøñãm=ŒÀqdÌ‹£‹®&Á¼ ºˆë¬4)Ÿk­ÅɉKàÄ'Ò¬Ç{ŒÏç€‰êæ™bJ¨ÊËË+**<2áP½µí– Ø 2Œ@ˆ#‹Å’Ëåô2XÆÂÛÎwùã? $%%1BÊ"~ì(—;€TÍÓók¦©>®P“#GŽ3fL+Í¿IšÄ: <ø•W^¹oêŒL­% Ì&íß[/…°°°^GÌ.…ðäÉ“¨’¼Æâøá‡îÞ½›Þƒ¬Æ@Ü»tér¿ÞV&²¬k[1XX'¾Q1-ÁÛVMMÝÿõÐÐÐêêê&w$±jÕ*úñÌÌLúW9ý%z»®®Ž¾º>‚wŽ€V÷ëOššÚæsÀGhùž~÷)è/9t`ùݧhÖRSSÛ|mr„†±vx„ÂÂÂ1R[âƒ`ăuuu”bEÑ¿6Û²8ào4k„ˆ+f@e¶üS„m¬u¡­oè±ÀG Ž@}£úû§hòb±8×ÑB„aëÖ­TcÆŒñññÿ §ŠyhX•¦æ×œTëW®\ ,kݺumøwèÙ³g³Ž””´aÆS§N¥¦¦ÖÚnëug4L!t2‡E‹MŸ>}̘1üñ‡Ý§X°`AJJJß¾}?þøãÌÌÌ‚‚zþ XXèh ,ÿÕG NƆGøðÃ_|ñE AÕÀòÍOѶG@ÿͺ'tÒË@ýêÁÃá^¸\›ÇÙƒs°»×ðß¿d€aÕªU…h5’$›åöÑ ûãóx<µZMÿïn0$‰N§k°·³ã`0 ƒX³fͲe˨vbbâ­[·Úv>˜ÖC&“¡:&³gÏÞ¸q£ÃaN~xÕS2¶å*tó^Ÿû^zé%ªÊl¿~ý.\¸ðè£nÙ²€ÓIa1\‹žµðnÝouÚO?ýôÙgŸmù„wï·9lË~n>-?&ã}RSSe™ç¿ ¦6ùƒùæ—ÆkµÚ°°0J#¸zõêÕcGS>yCd]Q¡@oš]X{Kg$¢¬¬lòäÉqqq›7oö§ð: âϵìŽå¦ŽKÞ4þ¿Ÿ|‚F²Ùl'ÉÎiiiGŽ€%K–¬Y³†þÒˆ#> =ôÐÊ•+wîÜ©P(>ûì34`ݺu/¿ü2ÚLII¹páÕž?þ7ß|Ó²È(„B¡V«¥÷ >œúóbì¸ï¾ûΟ??^×þë¨NvtlÎë :”>R©TJ$’6˜"Æh=‡Óu‚\.¯®®¦ªNPTUUµ’ÿƒÁ`0®8¸ë.ù7‘zÅ çõêK–,=ztnnnrr2  °§NûL˜˜Úœ$üV§õH,½N˵¹ÝqwŒÿzƒžB˜Ÿãdpqq1¥^ÅÄÄtïÞ]¼á3¾U½*7šÇß®®6™ Gááá .´»1ö}èvÎn“)ûø2UÞžT«¢«î©µä<…­‹×°j*±rñâÅuëÖ]¼x‘~÷¦ªÕêË—/£Í€M!tˆB¡°S¯§6Nn®Å\yû&’écCCCéÃx<V¯0m‚·S»wïNÿz€+W®tëÖÍËÓÀxŸÆ’&0þŽ#3`^PÀb^]„ßF} fÓx­mí?Ñ´YÀb@DDĘ1cžyæ™ôôt  X°[as‚ò¤,¢   å³Uä!× KÄ ¾§ämÀ‘aHÃÂÂòô&TÇTZLj•jjjÐ^¤J!8ô;zéã 5¥^@ZZ<þøãqqq­3kWiI™2å<˶àiDÎ=Ú7I’N4,TYÜNÀªªª*+³T»¿sçÎŽ;rrrNŸ>MC°Î;Gÿ> XËaËËË©FDDÄܹs©6%°¶-Ï=÷Ü‚ ,XÐP_k+Ìf3õÿŠÇ"ˆ³ÇP¿`ÄØ°°0úÈÖ«à ߨ·ñ¶k„ ›6m=z4êÙ´iÓ¤I“¼< Œ÷‰mzÆçÁqdÌ‹c XÌ ¢‹¸ë¼MßF[µ)‚Ï?ö¤ÃatëŠÆPÆæµ3é€O£¤üœ¢¢–ÏV›ªþ°cìC°AdÇÐÐPIÞ5˜âxl’4Üævéáp0Z O.—kí'­¥BîL›klËP–/Ð’ FDDLzç}ÓŠç¨ÍŠJ ‹P™m¹3&“‰ÅºÇ40wîÜœœœØØX$Bݾ}›ž–h·Â•ÉdJ“ðæ…ˆ>«TèMÃ%ü^BNÏ+'²–>wR­×uíEå|! F#‡ãí½6Ça‘€·råÊ 6€o8°¾ýö[jkÖ¬MŽ÷*•ŠÒ[Ç„›–ÿœ,y(¯ß}r Øl6úÙm½ ªùFŸ·¿×ž~úéÞ½{¿óÎ; .€/¾øâôéÓ_}õ•—§ñ>AAAm=ŒÀqdÌ‹c®Bȼ ºˆ+Vî7Ÿv·¶…“¦³B£ XpV4QeYypj°p‘',m^ŽMÀj?°AdG*è–Îh°Œy9 XȬÙÿêßQ«5X«¢°X¬ûï¿¿gÜZÄðqç½µT¨­) ¦ ¿¯¶é#v¬âââüÑh4ž8qušL¦ìììž={R›íûO˜Š ¦ÛzÓ1÷Õ)›€‘R¾‰KztU1ìÝ:àß~ù«TI £ÑxçÎøøø–|(ÄaÑ’²ááá"‘ˆjû‚€…~œTIó2ÔÊ¡^ åXNUÁðQÀb³BBBгõ¬ùFŸM«Xô²ó¨Mñ’J¥‡zá…¨:…ééé‹Å­1 ƒÁ.¥•aü³ÙL¯ JõË/¿¼sçNxbÊ#skÊÁš¸'š6»±£Ù Xâ$` óø%UZ­¶…OÅMwlyˆ\ ãÏP D¹zÓ(k)¯Ñ2XÈ%•èNBý»Z‹ÅjµºwïÞŒ)ƒKðxúÑ“„»·P› ÃDGTº<ë¢&“©  àÝwß­«« êØ±cÃß) ðè¡ø³G ׯ°#£þºip;Ç†Ø V÷+ãsÝUTÙR¡óòòPÀBìÚµëçŸÖét&L@XÀr%`="J`Yj B8õ ªæ ƒqN«XÎ ÎÇÅÅíÚµ«5ÞƒÁ`0I¦& ×§GíìììÛ·o@æ·_ "-7~ì¹Ýz6v4;«D ávëe¸~ØL‘ñ‹‹‹;uêÔ’ ›‹ïØÞ X†r`åèlwÚÆÆ,äÀJÑÔ‚Ñ@µ³uÆ,­–/_þꫯúNþ Gˆ_ôrÙo?s :pÙ&„Î.¨=]¯“ÉtðàA”qbW‹½»€³ Tœ.åÉ׿‹lTÍ­RÌfmì<·°övx4õM°e°(222¶mÛ\.·oß¾T§Ï X¾sÝRWW׎Ãz)Â&ž šÎëBµ_ýõ—^z©¨¨°€…i;¼]İ?~¼­§€ñ8ŽÌ€yq @‹yAt»àÒŸZWUUQŶ‡s‚QãÍNÀb³Ù‡g¢ÍraÑÝ»-™-pÊm둱cì¬À "ó8FDD@.]ÀÊÏml0r`õ)³™e§nݺuç΋-’H$>%`µ<ˆüÈè3B[Yk ‹ø.6¨ f³ùܹsTÿ‚P¿¦‚ج‡ŠþJ=:5X g7}S¦·Z®i”«^-Q^ÐЫ,€7ÚKÓx€Ú L ű²²’jdee!ÓPDD‡Ã¡ ™L¦¶-N7û”ke{©”¶öˆìÅ•èÕ3fܼyóõ×_‰D­'`È7*Æm®¶¦­HMMmë)`<Ž#3`^PÀb^]Á‰«ººø‘.±-o/5Ç€5n²òýU¤^xì³™— e5z5•¨Í‰‰³{50ƒÈ<$Ž;w€\=-_;?Hˆ)mV« ŸQiÕp ¢×‹ËúZ}ˆ3fÌ6lXkÏÙu<Äœ©ÙôÅD™%ï8˜ÍÚ'¼ Öd2;wŽx3Rúdˆè¹pñ¯uÚ™ÁB!ËÁŸ¡6“Û•ú!AAõª˜ØZ’øç¾ááBþ¨qãG ²ÌvcuýÂ0ñ² •WÏc?*0‡jôÐÌÅ X999h½ûððp‰D:êëëÛ°tº–>¸~erío"Y´Ä®ˆ¤X,^µjÕÓO?“Ó¨³…È7*Æm°€…Á`0¿'¬À¤I««€#²ÞšåaÜž}­¡€Å –óR†èN¡zŒ×¯´d¶¤NËW[R‚̋ݒ£a0mKxxxHHHeuu­ÉÌf©©7••°ÛG5L¥>&¢þÀTzíêÕ«™Wª¹ß°|ûÝìp#ÊÀêÀeN ÕM1änÞÌ(Ùãr!ÈÙ¬y!¢†»+Lä%Q.’vQÕ„sXs ëºL|øNXØöíÛó÷ …C€$I‹E†'¾¨TGsmL>ÎæXÀêf°ä%-™­±ÐVƒ¦>ÈÁsþÀ "óœ8RVŽÞö}»ñ×Þ{ï½'Nج©©yPÊGuXòAú8¯ÍÓ <Ę˜ªñJ‰âš†Õ•FóÛeª~Ùü¾Ÿúþ'fÚKQÑC† €ÔÔÔ… Úíh'`Õ˜Ì;jm圦E…ñx<8vìUÐÝ9999.\¸páB]]]“ƒ}*Ž$I¢ªˆ1‹h÷Ëwuo-YtU,`Ùa¸~Ehu ØþÐám2ÀùFŸ°0^ç33GfÀ¼8Ò/é…Q ó‚è XUUU/GH&É=h,±uá¤ÆhRÀŠPÔ$&$¼õÖ[nÎöŽMÀÒ‡·o8 0ƒÈ<'Ž”€uCk»ÙV_½üÊ+¯,Z´Èndmmí šáH8~ Áãyg’îá‘ ŠD¢°°00’°¤XñV™ªÈ`2ß;¦ÌHšEb(Šˆ•[õy¥ºÂhŽŒŒ|ä‘G¨ââ¨Â}rrrÃ4·àà`Ô¦l_(u¨‡sîxê TÛkΜ9))))))ûöísù³ú(T …^¯GÃ%¼Ea⌄Pbï¶ú-¾5V,óÂw,yð¦=øj—vèDðÛ¦@Xà|£bÜ X ƒñ{œ”FÂ0‰ÆR«««û‹¸_ÆõØXÜn=Í¡€ÅŽŠ!%RªGÆ&¦ªÊƒöï2W–»1[ca>j :»q Ƨ°X´…“pô•Ë­«¹_lS¬„“gB`€LXðE¥ú¾ìÊ9UÅVKÙ½oö «Úï8([²úúìEeF3°X¬ˆˆ™L–žžŽö1b„“w¡ XãÆ€3õú*£åmÌŠº´PÕÎÏÏorÎwîÜ¡ååî|Ñù ¨L lŠ•/k'éȳ|á Ió+’Ù!BµZÝFh}ÖÑ£G›{-¤=d°ªº4ñŠÁ´XÀÂ`0Œßã¤4†I4¦TVWW÷p¶µæU5Áf…†;?šC ‚ÛÕváþ|¸xjm‘îÜÉï¿ÿ~íÚµk×®-)q5¯ÐDK! ïÛ„ ƒñ}:°’øVó¼d­ÈˆNFnמÜäî^œf[kד­3NÈ­:¥Ö/)V°Þþtú‚…ì˜8ñ¬Å'$P¸\.<üðÃh/äÀr=…püøñ`"á/š k˜Æ’ ؤ€e4Ñw½n”_ƒ¬IA‚Ï¢ƒ8Žj!þ;T¤U)½:­{iU«  `üøñóçϧŠý»‚ñö-cÎMªm AÓ{€g§„Áx ,`a¼òê1€ãȘÇt`1/ˆ®Ð˜R©ÎË fßsISÀs°È—Ž,Aƒµ Y™ï¼óÎÒ¥K—.]zíÚ5g«Ë³­2ÞËÁzˆDæ8qLHH`³ÙeF3*.f1<¶íÄ4›Ô?~[>ñþ>´d^áÃ~`¿òTé,D©Þ8%¿fs­¶C‡¨³_¿~8pàÀ®]»¨žI“&±X,ˆ§9°‚:thll¬\.?b¶ýÍ‹nGqÙà‚€URR‚¾HàÀ¢âH Xd Ô+‹àZ\ºQ\¶ôl[ÖZ¢KK¿hyöÙgÕjõ† žyæ‹*hÿÜÚ'Õzq;iïÞ!p¾Q1î,Œ—(,,lë)`<Ž#3`^PÀb^]¡±@›snØ,“5½8zc‡V‹Âu•ZvÖv©×CE™ezìŽ Ì 2À‰#ŸÏ§„•{²ùt&ªüVñîrPÛŒ-œÄdáĩަ;x*ˆ,ŠˆˆÀVTH,9räÈ‘T±vh×®Õvž?4+:::((¨   ººzwq%§“%U™e6Í ÊF8°¨8VVVŽ’ò?ï`S¯Œ$ núÝNÑ´YhpÌñ¿È¶3aµžkÇŽ{÷î¥Ú_}õUhhè°aÚ¬†¦ùkjïQhe2™§Ô,çãXÀÂx‰ž=q*5ÀqdÌ‹£ÝÅ_ XÌ ¢+4&`ñ í/Íëš~zl'`q8ÿ¯ß@ÉSϲy ½d¸qµ¶¶–jWWW»4Õ»`}À^Çå´ò̈À "ó¨86Ì"ì"àX¼$FƒzÓWôÁ§InØæ½,Yø<ž bÃB„m Ae:ÏZ a÷î´ÜL‚Ïù7Úz\.±ˆ&¬»wï¢6XT«**>ˆ’qiêÕ³EuGz ⥠ÏYh&,÷¿âÚª[SGm—öâÄqcÇŽÍËËkì°­A+ Xæù矧÷ÔÔÔ?~üÌ™3Nö2Þ¾e¼eyd$a¿B׆V@}£bÜ X ƒñ{И4–B()·¯K¥‹íÔäÑs`±#ÚK_X²bÚlɼ0×Tµ³^1¹èÀ2Ò `ÕËÃ\Ùƒñ}à&ÍÕÅêÀÒìÿÍTRDuêHry‰ò¿Á1„uI„Á‰J劀5yòd‚ š°F½dÉ’ <öØcô~áÄi¬°ª-eé~II‰N§st t, ö­¬0Žå+›$ˆÅEu»ë´ÀŽŽÉŠID#¥wóÇfM¹yîÏýûsss½9ÉV°nܸQTTááásæÌA:Tff¦“½´ö¢ö µ¾ÚdnC ƒq°0 ã÷`+@h,Сµ¶5§þPèªMf~Œƒ”=;°(8<ÞMƒ­tHkM,zwˆnÔ”Áø”€Ew`Ý/áqÌ&0›Tß~Ž:®Ñ|_]/ –·ÁÛ”:°:uê4mÚ´¨¨(çÆºfÍšõë×Ïž=›ÞOðx ¶„Íñ2¾ÙlvžÅ°BŠvùÙ¨-=1;&ÂÃ-ËzœvQc ïÄcóŠ‹‹½9IºhåÁ‹ä¹0`À† ¾úÊbŠlBÀ:òjïUh XŸ X/qüx[JÄx GfÀ¼8 €Å¼ º‚Ã\QR¥ ÑÕ[🢺Ùµ¡¡¡M͹€9`ëéÙL‹îÀ’$uq8&0ƒÈ<*Ž”€uYk¬±Öqa³F²êM_oeQ=$Áúºªär¿°<ÄÈÈH”Œl‡+¬[·®%Žž€Ú#¥|aSY„tK¡PhµÚ–¼{›CÅ1±Ò&E ÒF¯^½(ð¥²y…µw ÷\'ø`RR}Xtt4 °™f$ZuÌ&ºëªU«by'…šÊ"$uZÝéchóO,`a|,`a¼„óÚÇ‘0/Žv¼ôY˜DWp¨TnØþWµ–Ò¼°¤AAgëmµ~‰xàš€e̽‰ÚÅ,°ìL˜AdG*‹¾«®§÷³dAâ¹ …ãAµ„PÙlß§5‚HÿJáp8‘‘‘ ‡ðz÷gÉ‚¨v(‡Å/¼ÝØÈ»wïš­¹cþîÀÊÌ̬?{mÝ?µ¹\.}d»ví`k­Vk]m6ÜlÔþ“1•B=zô±ˆ®ŽþðŸêëI•‚>^þ©µ¨xư,­ÚZÀ ´oTLsÁÆKxÉ8iep™óâ€,æÑš4Œ96µˆr`q¹Ü   &Ö¤€%“ÉN«õhs˜ µµµMþ3æÚnJù¢Æ†f™G Å‘ªã§ÔúuåªÏ+Õëë !_ýÜî﫲ÿ{®]»F HNNn³Y6“Ö"½ŠPtttÃo˜Ö‚Íá ¾muªj4îèÑ£v=þîÀŠás‰Š2ªm Xü¦oSVɼ³ÎV·^ýÃ7tËïR+++•J%Èd²ªs@»°SÃ&„N»vJñÞ*åúÑxN§;~m*’-^­¶°íÓ\°€…ñ®ÜK`|GfÀ¼8 €Å¼ ºBÃBcîMRoјJæ¾ÃGŒ9rÒ¤Ivå“Ò¤€t†æÀ(â€Ùl®©©q~dº€U.jt-§À "ó´8" >ªP¿]¦z¯JÚ. †[·nAݺuk³Y6“Öâˆ#†åµüA ~ªÍyÔÇPߨ°mÛ¶Q äówqíjëâ;÷º®èP|K3êÏŸŠ¼xmú«aþ 17;é›÷Ã9¶[þúÿgÌÏ€ÊÊÊÄÄÄ‚í?¡—Êb©FÛ XöŠi.XÀÂ`0ŒßãË–Ñh$I²éqhhC–­*í¾øÀؾ}»+GsÅ•©5¨­ &Vg>\¨ãNO!¬‘b ƒA)„R©Eœ¥Ÿ˜999zæGÍ9 IDAT½bbbЀÀäµ×^;~üx=ÀûÖÐ4°Šø½ù¬Ú};Ž©©©9xð 1þ|ªÓßX7vlAívé:‰¬,­ñ$ÍiûhÍ"‹ìE XÇ÷üD½"`s³«žœBÔÞóƒE Š÷VÀ¢E‹ˆ²’0Ê2 þ{ÈR KH_ X ƒñ{|YÀº~ýú!CΞ=ÛÖa m¤À*•6O*rEÀ2’p¦Þvo3VÆÊ`h,…ÜoÊa0®Ð«W¯)S¦L›6íÉ'Ÿ¤zè'æõë–UAýÈ~Õz <øâÅ‹o½õ–]ñֆў›dùû³4+ë/Ÿ·ó믿RRãÀSRR¨Nw`ñn^Cm~ÿNFŠD"$°.-Qª¬*x?v”§ŠyPYYyúôé>ú¨5¦ÚV^^ÕHèØ±~×–ª¹“ÍUIÝÑ—æMÛñË–çÃō󼯰ïˆ%¥qÇø2XÀÂx‰Vz|ñ28ŽÌ€yqôe«¦¦æôéÓƒ š;w® jøK¯]»öé§Ÿzêh #«¿n°áÍ«‘슀û¶¥ÖÆI›°ÌŠ:³µ‹ž$õ¡ XþDŒs-ŽÝ»wß¾}ûÖ­[?üÐRL‡^ÜO¬Ö "—Ë]¾|ùk¯½ÖJÇo éóËL`ͤÖëkï™ÀÑ£G_~ùeª=mÚ4Tn¿´´Ô‹sô0æêÊ’j“‹×'ÅùxdÂÊÑÿ¯ÈVÚ\Ä"¾‹ Žã±I’\¼x1ªéæYZ£V~~~›õQ´lññÝu+›kl?UßWן£eÄ·;wìtç°ÇäBÔsPa«Ö¶V }£bš °0^"55µ­§€ñ8ŽÌ€yq´{zéSVmm-$¹qãÆää䜜Ö/‚XTT4vìØßÿÝS´‹, À˜}mêc;5ëh. X*u&khO!7†Ëv.`oe¡v®Î$’6z'àAÄ4IÀÆ‘ ªÆI’HÃBV÷îÝÛlfͧµƒH/èîø÷Ü•„Ò× W.ꎠÚYYY£G¦¾ÇÁ´iÓPÉ$OýBµ uíCeNׄ¤ &""µw+´ï”©Ð¦„E|Ú!HÄ"Μ9ƒ²b=Kk8° ž OrõZzÿ±¨%ÊWKF¾M±ŠäÚ~òòõ¦Ÿj4h³m¬€ýFŸ°0 ã÷ø¸ µ•J¥_ß4‹ºººqãÆÝ¹sçôéÓv+µ»]døRm¹å¨1™ã›u4WЏ@…Ñ|Nc¹{!ÆÊøM X7P;Kg‹ÅNc0~ :kй‰ì*þåÀb$wºöùƒf U~¶LF((( ™ˆˆˆ#GŽÄÄÄDFFR_wuuu>hª¯¯ß³gÏÖ­[·lÙâpÀíÛ·³³³+÷ÚJ}‰ÒÆ4yXäÀ¢ø¬RýMÃê/äžM ›%Æk׮ݹsÇÝé;¦5,}aÞS¡BzÁçK¾tö¾4àšÖøû˜éìíöR˜È9…µ5&3ôèÑcÏž=C‡õÈ|0˜Ö X ƒñ{|YÀ¢XˆV]–ÛwÐëõ<òÈ•+W ¶¶6++«É]\Á.²¨Ô.\ÒéÓ]ÁEüN» œ$p^ÄÝc°nh±€…a2v–ÑhÌÎÎ[‚©DEE}P¡BO Y™µ+^Ðþ¹G{‹êIOO8ÐR( Uéºyó¦ýÚš[·nMš4iÆŒO=õ”Ãß÷‹/>0d犭Îøè&‹¬àà`ªñE¥š.ù…°YïDÊú ¹›6mš>}ºg}X­‘B8S]Á³ï'$2Ñ£óÂ÷ž”þçåÖ5®*ëo.ZùK­YóÌ@,¼[{KgQÐÚ·o?aÂô¿ƒñA°€…ñ8Ÿ™à82æÅÑîâÏS3=‚€å©e¹}<ˆ_|ñÅ¡C‡ÐæÉ“' v»@óPû´Zo÷8½I\°ö)tè&°Ÿk.*trXz áMQ"‘46Òǃˆq‘@Ž#]ÀÒëõÇ×étСCÿªÍÈ FFFfi{ëlÙdš=Ûj^zºçÏëÅ,BBBÐKÉÉÉTÃ,•ÊbŒª¯¯çp8,‹ZÛ‘——×S¯˜-?Z‰ŒÛ¥‡ýQ€~2†:vìXªýÅŠZ¶í—…MÀGѲ_~ØtúôiT5Ì#xÜUwóúƒBÛ­}Ðò·ƒ–¿ËŽŒ€:PwîÜÙºÿÏŠ“óªOÆ$IžzvkBŸÃ*›0‡ª¡µ!Œ<1 X/󙙎#3`^}ÙEO!Ï9°|<ˆv·@§NòÈaí,šët½Þã,´”x‰Át¶Þ–EØ© ǘMK!têÀòñ b\$ãˆÎšÄÄD¡P˜––Fm¢UíüF1** –—*+Ø\z¿´¶êƒ(„††¢N¿°(H’´KƯ¹žù~”M05Ý— V#’úöí;räÈ‘#G>ðÀo¾ù&APc2g>»“ÂÈ“ãA°€…Á`0¿Ç—¬ÀL!¼}û6}³5X1\v”µ­ÖL^nÍBø•æbèQYÔè ËJÌÊ:ª­4“EN!Ä0tÖ”––ÒKÝ 2¤f„± UFó«z!¸§4Ò¤ ÁüP‘Ÿ X Óél¿­fóÃ—Ž…slwµ‘ÓŸpå°=ôÐ8ðòË/÷ïßòäÉ •J'<>K1uÎÕ¶¢æÿ %ð90þü7n4zÄæàqË|ê(j 'MÚºt‹Jí€^½zAÅÊ, Æ9XÀÂ`0ŒßãËV+9°|œ¼¼<úfvv¶óÂç.Bì ±ÍSpQc04ÿÊÛN±âp8v¤R)a}Œ¿·Ng´®IßÑl Wj§c̦åj$€“B Æßi(ûRà"оåÀ€cÅåò¾M›Å‰K@¯¾ÖNÚYeûyò/ ÊËË©†6ã÷ƒMlÚÎ‘Š‡pã]V¯^Íb±yä‘Hùf™²È`ùÅáÄêöRP*•/¼ð‚oˆgk`‘šzqŽmM^þý#鯶oßž:UËÊÊêêê 44”Rµ°€…ñ;°€…ñÔ×%ÆßÁqdÌ‹£ÝÓKŸ°ZÉåËA4™L@DÏž=€$É•+Wþúë¯-?2jÑ `ÕBBB¸\®£¥I‹ÅBòSµÉœl»²¯üõ‡Ç4æÜ³!8q`ùr1®Èqd±ÜJ‚~ýúy2-‘A”Ëå …¡ÿà ×ß“±™XŒ¥züöƒ©ÔR–±sçÎT4óòò¨Bf¾ƒ3‹$U_}ˆ:¯HC³l8غwïþè£Îš5 ¢¢¢Ôfò{®½š&á‘òàÀù÷¬Kwò(ËzÀ:I]©‡CÙñ½{÷¦vŠ•/ÔÀbäɈñ XÀÂx‰ÂBg%o1þŽ#3`^}ÙÕPÀÚºuëöíÛ¯d×$¾Ä¢¢"´FûÈ‘–{‰/¿üròäɃ¡%G¦G¶—Ðf˜:×üXà‚€´2XAD͘úuÿpxLÃMÛ3ðZ#8u`ùr1®ÈqtxÖôïߟÏç{2-©AD&,JsáÄÆË×}R=9jUíKÿÒŸ?EÖ«…Ball,˜L¦ÜÜܶ™n#8°ÊÊÊ ™ÿTÍ}ØpóÕc"¡Ãª÷–.[æö½ûî»T·ððp.—;xék7RôêêH©€E˜L¦Ÿ~úÉí·@xXÀ:vµk’°GY„HÀ¢§‘‚o8°˜z2b<°0^‚zñwp™óâèËJ!¤’Ñt:ÝŒ3¦M›–‘‘Ñ’ÃúrQþ`||¼])œ>YE‘åÌ· XWµÍ.€® X¨ Ö#<’øÄS&k!ïn¾±0¯áxÃõ˨}]k§,_"Æu9ŽÏÌdjÛ·oO5JKK©ÿþ‘_ëmfUýåóUs'WÍšDjêQav¶³u*¼Z­nØYQRRýÌú gPÏI®¸û˜q” ç111” Åb àp8[]:ç…Šyqùòå«W¯¶ðøq`effN˜0a|ÿ>¦"‹kIG’rG%À:IAUpŸ°0ç` ƒÁ`0~Ï Xƒºòæp8;w¦¿Ä0ë÷ß¿zõê‘#G~úé§óçÏSñññ|>È!ž°ÐU~ÍA©5@+ X x饗¶lÙB]î«ûB/iÚ X†¬«`]ˆí¶Þ¤6“€‹¸cÝY¿dÉ’=d0aÚ„†–Á`P(•Ï)Š ÷üPjÿÜ3²ÆRË#kn´œ¿ÿþ;..®W¯^›7onøjüÍ+¨}®Þž[%ìêÉÿx)))žžüŸ—õ\KJl(›˜Ä€k×®µðø°rrröíÛ”gs̯7Ä$$6¹lÙ2älâr¹ÝºYľTÉŽ ,`a|,`a¼ÄñãÇÛz €ãÈ ˜GŸ°ý*88Õ"¡ÈÏÏ'Iò›o¾©¬¬tãȾÄß·©9GŽ¡ñññTU’ò”«'­%`µk×®¹GsEÀ²Cúà$k6 2ÿ1WUÐ_¥ç^ª7ÇsRZÞׂˆq@Ž£'‘oÂÔ 6°ª««I’¬1™(Ù’Õœ„$4xÈÍ‹=ðëâÅ‹™™™hòééé£G€«SU)ùZ©2[gìÔ©“ÇãØ±cÇV¬”?:õÌ -%Óm<’BHý¤¦ŠmKšüCrÚ~ÅbñÎ;ƒƒƒ K—.¨J›Í¦: ((¨¹k¡´L=1ž X/‘šê ãwà82†Å‘$I»‹¿–×CõtËn  ‚‚‚ÒÒÒýë_‘‘‘£Gþæ›o4£c8Ƨ‚¨×ë©’^1B¯¼eY…½S§NT Xv%í› 4ÝuUc€Vs`Ù‘0`е½Ù\¶{ûgŸ}¶gÏjáyÃ5›€u¥©XàcAĸM ÇÑnB‡ÓØH‡©Al(`!qJ"žõ¯/~dÉC¨–ÙüY‡ 1‹ðëòåËv=Ï=÷ܲe˺ð9¿ÄÉÙ`yšPÈæ_Ö >>¾•â(š9¬ÿÕû ¹]Ï Xn_´ÔÖÖChV¾¼ÑŸÂÄÄÄÍ›7³X,T‹¹®|Ä~ÅÔ“ã)üõgƒÁ`0І.ýÅUPPF£ñÀHLL¤Ö?ò;þþûo¥R Ï…‰‡‹ Ä`:©6$Þ½ ÆTàp=ëÀbtÜSÁ”s7,™Lv x½­7Nw¶n^´ÿ$$&&ÞºuëKcœ?ˆa:Œq`1$`•——S ´.µü;:&hÕ5ÏÏ£:“øœ£ƒv·l‘\OÑPÀ’H$‘ªºñò`¶M9Ý©¶¨?Èóëq8±ñü!ÃuÇQ›i~ËË„yDÀª««ë"à´ãXþ*3Ùõ¡)NÆ?þµ×^‰Dôΰ°0ªl¿XŒs° ƒÁ`0þ/ Xh B¹\N9°Ò%üÿ„‰ÿ&ž'" ÝFì¿U±:ùœÿ„Y.‹#¹ì)ÁÎÚåÕÏÎ!ëÕž°:ó9–¥‚{É\d0€]‰1WpïÞ» *µÃïܲ())1×ÕÚÖ%d±qwL `wÖø¯‹©8q`QÒÇŠ&?Šv'ã+Îõâc0®_¿n×\WôÎ+tõŠûýr`³Ù-Y°I#Æ öp ÏwR'ÊhóœÎüÌsÏ;ßeåÊ•=ö½Ç×XŒs°€…ñ™™™m=ŒÀqd ‹£/ XtVÿþý?šöІŽòåí$Ô¿!{š,Dƒ›%`ùTsrr€5‘R®ue@„îø¡ª'§D-WØ°î—ØÒ%Î×€Ãá tE×qOÀŠy ½ÈZüXä3abP«Õ5¿lDÜ Qê]¨àîSAĸM Ç‘1,¦åVߺu‹’® X {õmn[ô±Ú0·ñÏhVV–NwÏR‰\"¾û˜TØ~Dx§?Û\¡·¬ãÁår[/Žü!ÃQ{€ˆ[Wæ+)„e|´©8,$$Äù.,ËΰŒt+$w¶-L=1ž X/ѪOE0^Ç‘0,Žþ"`uTTÍÈý•í6ÿ–Í”[4¬Æ,µZM•X¢ãSA,ÌÏ{;R:˜V†ƒŽáê¥ûîXÖHR(-y£†Ößj=ÄÅŹQzÖ½{ïáii¿ÕiÑæ³a¢x› Ýöê¬í;˜j8w`ùT1nÈqdŒ‹©AD’Daaီ\¹‚RéJ!É?Ùb‹àfÝ™^žª ó‡KØy·Ðæg•jõÂW*ë-µ#)¦õâÈîБÓÑò˜„Gª|BÀ’”'ð-'ž$Ǽñ®AR¦8°˜z2b<°0^å`üGfÀ°8ú²€EO!T~º–¼÷y2φY4ª$VCþüóÏ+VØuúTçVÎ ±ÕÔ8¨ÒMΫ®kz’neR欖;°x1XD°TzHJJj|§F±«?í¢€5dȯ”Æ2£ÅlÅ'ˆ£ƒÆÊø¬’»TÁã÷Hµ X>DŒÛrãÀbjéžšÛ·o:tçÎÔ&Ý쨂‘ãЦfßNḭ̈1ì¬>Bî¢0Û×é¯uÚwÊTåååh_J|iÕ8ò‡GíÞ†z³Õrë°ºW¡v^Hû¨ÎÉnä7Þ¨®®®®®~ã7Ü›†gaêɈñXÀÂ`0Œ Õj3ïø²€…X1\–þÂiK/AüR«1+V'»¯ ;°víÚµcÇŽóçÏ·ölÝ£îŸs“¶ÌÁZ“yy‰òL½¡ò•·‰Œêä׫¨4‡– X÷‰¸"k¬bƒé–ÎnÀwï½…Ba×”o”*QOŠˆûuL0ÚŒy¨Îz}…‹¸c˜ cXL…ÏçËd2´©R©N:Eµí,M°ÕÿÖfüNêõ^˜ac;v µelâãhÇú;SËæ.+Q@yy9ªíå÷–Ex¿ˆÓµ=P‹$﫯A[±³ç»7¡P(—Ëår¹P(lz4ÓÖ` ƒÁ`0~Àž={.^¼èð¥†.}GÀB¬îÅy`U¬”± /)(m÷  ¨¨}£ÑxúôéíÛ·ùå—ûöí#IrùòåÞ»t:]FFFFFýÖ¢öó÷|UNçÕêMÐcà`ÑÃ3аy!"ð„€uOþ Êò7tÏå¶y$--í×:í¥ÍOG/ý%ž9W­V[Ú¸ˆ;†Ñ¸gcÄx“Æ 5,–ĘZMZ¾ÌH•-ºç}ŠŠŠÎ;Gµ”ò%†u¶&ÊAìŒïYg2@ii©«Uáß7„°æª'ð9™—u \Õ®Ór–áê¥HÒzÍÀbÅ?:×íÉ`0~°0^âøñãm=ŒÀqdþÇÍ›7ÿóÏ?_ò}—m+JÊ›0vÖiPÏÃr‘EÆ;wîP=ùùùƒž6mÚ3Ï¡ë•Bµsrrì¬V#!–p{§ Íêû–-[æöÑZ.`iþøµ¹©é„Dêöd| ŸŒ€,Œ—HMMmë)`<Ž#3ð»8VUUíß¿ÿÒ¥K_m(W¹]NÂãPÖ}"® Ö’k@„g͉‰ÉPê©gÈÊ‚_:ÊÃ9,T Y·è¼úꫨÝ&AÌ͵¬­®×ë  nÍ Âê,+–×$u§Ú½{÷N\oÀP´û¤ AˬnÛòejx3… $ «ŒæŠ'Ÿ'­ ˆ ×ß“>û –óB¿;1 ä82¦ƒƒH°æÍ›÷æ›oRar `\’Ûjj 5õ®¿Ñ‡~("##gϞ݂ùüúë¯ cßu ãÓ·å$$É^^ÕµkWj3++ËNÀjí8ÒË`îÚºgÏ·ÕÒB³Y»7Ú’NœêöL| ŸŒ€, ƒÁø:¿üò‹^¯÷G¥CM” P },!‘¦§§ëIr¯Â–}"âN 5ìÛI-^ŽŠgÑ9uêÔþýû[ÖrûömÔÎÍÍÕìÝ¡?c{Rš•rÿƒ>8mÚ´É“'Oš4‰êŽ™„L’µTÀÖ«älË¥‹ÚLR¹ŠB¡0&&Æ£¹}ïÍçó}Úa¿w@,ȽuKùß·Ðæ•ž“:bÆŒ[·nݹsçÓO?Mõ F¶åž¶«€Z¯„¦´Ý*ÜÔYLLL´+Äã"-1¤¥¥½ýöÛAˆšñv™êí2ÕþJÛ".:°0 X¾ODDjSÞØôôô‹/Òû!¡¡»ël¿³ZZ’Z“dggS ³ÙüÝwß¹9]€ëׯëõúPë±Û€ï«ëwˆÃ >’““©ïüÜÜÜââbj€j`·kO-ßRé\Æ&zñ9n¯¯Ò,ë±Ç³«·¥Ù»µê ‚/h°ÃL°€…ñ8Ÿ™0&Ž$IêÛty¶Å¿â˜››K©6F£ñêÕ« ¸!`½þúë£FJIIÙ±c‡ÝK?þøã¢E‹V¬XqæÌ™ÌÚBeee?7’k¹Ç#ÄþÐ4° XåFó#yÕ%íïq™Šïj~ý¥çÆO—µ“p­™H¡÷ ‚Hw`©/ØÿêHòÕE|||Ã]XòP>-‹ð!´äÔ WÙŒiYZ#ôïßÿƒ>pïh-¹÷^°`Azz:DFFR=%%%èU‹¸û×™ˆiŒ@Ž#cRDdMb±X½zõ¢ÚÑÑÑ<¯áàÐÐÐßêlB‰îÄa²^íâ! ¾ûî;³Ùìd°(SÕ¼¬ùéÓ¥*ô;(‰bccÀ`0\¸pêôB ,«6ÞVrq ˜‡ŠÍ7׬ÚÚÚmÛ¶Í›7´&ì“z½ö/[öâß\FY}|2b<°0^ç33ÆÄqñâÅh%éÄ¿â¸yóftÑæ° –Ö÷ߟ‘‘qáÂ…mÛ¶À©S§nݺE½ôã?~öÙgo¿ýö_5#uÂ!Z­V©TÞ“?øÀ(êrtt4•¡4“7ç=_:q¦Þú)Ò¼(LüQtµ9wî\ªŠdµm ,P²%3þ¡ÐåëMqqq÷Œ}µgÉEµEwÜž@¸šærŠˆÜ½{÷¹sçFåÞÑØl6A«®Ò¬{otO,‰@¥R)–é¡büôìâ_g"¦19ŽvæGÿu`18ˆèË*!!A*m¢Îwhhh¦Ö¯·fêtº¿ºò.ôdº¢¢¢'NØ)++k¬€Ý¡D,b^ˆõ|]U¯'Iº¡•Áª¯·TéòN ,0wëÚ÷‰¸q`9¿h¡®O~þùç¥K—R=ºcf…%¿Òh¾ìôI¯Áà“ã°€…Á`Ž%K–|òÉ'½<Ÿbܸq‹/Þ¸q#êqxíÛðÑ¥ókÁ¢¢"¤/ddd>|x̘1¨'++‹j ÛTTTXÄÔ`š€5zjïÝ»÷ÆeeeÓfÌ”<ùŸûsª~®Ñ arà ¹P"‘<õÔST°¼Á`@%Ì2 öA•N,; /ãE IDATLHáøGX!–ä›ÐlÙàöÚÕÛ¬¥ëÿ7qâDºåôÛo·Í#È„•——:îØ1ËÊŒƒ jÉô0‡1,“žž¾iÓ¦/¿üò­·ÞjrpHHü® efìså]èö+Š]»ì1ܵkWzzz“îæÊÊÊ™ÁBTî°Îdþ±F÷fd£2X豈 Åö­ž"äžo}VNNÕX·nÝ矚][Ы»Zi°Ü½9`0þ°0L`ñú믯[·°€åûœ={öã?¦D 8°è滪ªªÑ£G+•ÊêêjP«ÕH!òˆ€5%H€®ÂYAÁüaéèÕ„„„ää䈈‡{×H¾T¬èž])ûð[v»H4ìÍHé³ IJJ¢”š»wﺗÑB ÐEv;«‡€KµM$VêÇߘ–DðâÙ Ð&g÷VÒ`p8² LÆ mq“º¹s{¡ßo»}ïE5ú÷ïÿþûïŸ8q‚2$%%uìØ±å“Ä`|\Ë÷‰ŠŠš5kÖ¿ÿýïéÓ§79˜ªìþmí±ƒä½Õ—‚,$èïÚµ‹¼×Y¼cÇŽšššÑ£G#‰ß!Õå ÂDhscµFm&á^ 9°(Äb±P(¯š2Pi¶|®P‹[^BÏw×,ä€çŸ>ÿÄßÚ¿3PÏŽZmPPÀ`ü,`a¼D WžÂøþÇ÷ßõêÕTûÚµkm;™6Ä_â¨TÚü¾råJCù¦%X/«ªªàÆè‚ÛVyùS¡¶«pÑÔ'+³Êçó)Di0–vêòívËr[È'ˆgJ²¹ù¹ÔãeNWZZ mDzþ`º”Ī4†j“yÁ‚÷¢Ïœ[OX>KY§?ãìî¥!.\ÈÈÈ8¶å'Ž5ú:‰Œ%iÖAâ ݰ™L¦U«V}ÿý÷Ôf“¹þr&bœÈqdŒ+ƒH‡°.j •Ö›DR­Ò:ÚäŽHÀš;w®\.€üü|Ê4M­ÊZUUE­-¨P(ÆŽÛ0ÁÑþff *ÉçoÑY~mœXÈ~å…8†·kÿƦ7Ý'â¹—Eèz !r`Q#•›¾ëOáeá!88Ø ø,ødÄ8 X/ cüãúõëQ;X~GNGUû&‚ÅbQöU*ýQ$Es,‡ ùQ,”?ž°ÌçNtá[ýlŽèÑ' FÐóòò8q ßʢГkŽNSó쬾±ÑÔæœ9sJKK½Dz÷ ´Â^Uºäää´´4'ûéE™-¿C›ñ{³Þzþüù£Fúð?6¬¾}‡f¡1<"`-[¶ìÕW_¥Š «ÕjjÑL9r¤óýâLÄ4I Ç‘1¬@"êQ ð-‹Pw¤éŠHÀêÞ½û„ –dùý¿îR~þÞïSÇ~õò »víB>#µZ½bÅ ‡Ç!õú´ÂhSøÐ s%?Ž.`uëÖîùE–âÈf³orl¿€D\÷긻çÀ b³‚ÏÚž}]U s`á“ã,`a¼DÏž=Ûz à×q4 ôúA555EEE-?¦{Öñ¶Å/âˆìW¡¡¡åååÈÌÒ0‹°¡\åäZP§Ó]¼x¬ºê§Xž°¢ŽÚÊœ FŽc·r2˜.`ÀZòÝ2[ºœ©¼ôMP±Y‘‘ñôÓO{?ˆÈÎa¥ŠmËWý¡Ðýë_ÿj²UN;Ûb‹Ú¹‰BûtÊÊÊ §‹zÔ‘1o°úôéóöÛooÞ¼™þGàp8ÎE=ð“3Ó$GÆ8°9ˆt¢¢¢’’’à÷Û/ îï ¸7°!HdIJJ2d<$˜ºw³êˆݽ5韓Ö-{L.äY¿$=JÿÁE¨ø:ÂhÉX$YlñœSe¹àÞE]CBBúöí‹6Q¡zïÄqÀ“¶§)ý[_À¢;°¦ 8ËJ¾*h¯B Œ°ðɈq°0L ŸŸow‰píÚµ 6¬]»víÚµîéPwîÜA9‰Ï‚,©TÚ¯_?j³a÷f9°nÞ¼©Õj S§N)))\®Eñ¸Ké\D©­ä¹ä©g·°jkk?«T¯¯ªGb´ª]ñòH.öîÝû¿ÿýÏõÉ>|xúôéÓ§Oÿàƒ\ßË$ø>™ñ 57 d!Á™3gN“»Wtè¤0YnÌUú\½â7›ÍÐS`3wh:x¦¶”G,ŠaÆ͜9m0€a7LC³ !A=.:¥6è9ÖB‡å¥†¬L'»˜L&º€>\Âû´CT¯Ac:óØïGÉvÄɇ $I®_¿þþûïOKK›?>µBˆ¹¢LõõGhãØ‡9;Q ‰p¯ ÆŽ‹Ú^«àN1fÑ `ýŸŸÈçÜ;éÆA\L!¬©©©¬¬D›OÈm¥¾Î¶7 K!Ä`œƒ, (ÐaQ\½zõwÞYºtéÒ¥K. ã yyyß~û­{ûbœC° X§OŸ6dÞ£a9_…*º@6¢.]º,Z´èã?¦6=îÀRoü µËc¹Ýz9o'`Që‘¿Uªd ŽÆtás¾‰±h"/¾ø"=§Ï9§OŸÞ¶mÛ¶mÛvîÜéêhŠÈC2›ýJ;$mÚ´iTÙçHåò ­0ðá¦sR(ª««F#ÐS`s`éc;¹¸»s<(`ÀºuëæÌ™³xñâÕ«W¿ùæ›-<ãû0Æ…AP–ž$Ï›mr¤îè'»äççSO†"##ƒ‚‚"„‚£ƒšrû‹¸ŸŒ¹Ÿj¯_¿þرcGŽùöÛoo^8¯ÞðeÝêWHµÅz\k2‹þÄÄÄÈår¹\ެXm(`)§£å7ˆÐ^åNÍ&XèÚ•Ïçß'â&£ºî1‘EÚÃK0°0^âøñãm=Œðë8¢‹ÀR¼àêÕ«”L …Âcæçç †•+Wzd†^Ã/âh'`Q) ñ|Õ܇k_YHÖ[&'¬«W¯>úè£ô—Ѓ„„„'žx¢{÷îÔfuuµÁ` «œ-°ŒÝÉ#h«bäÄ&÷  Xû÷ï§þg’úþW¼”ÁhX?!w””J¥rÞ¼yιoß¾yóæ-^¼-gN=åv*"‘\vœÆZ\ŸÅñæºåË—»²»L&û‹¶²•ᲫUo©üÁŽ<¶Œm¹!ª3™Å I.OÜž°:tè°aÆ?üpåÊ•#FŒhr¼_œ‰˜& ä82¦V ÑŽ´´4*ŽÛï–£Nú²w AÏ~¨Úê1{¶´ãXkÀ³ØÇÕz#-1zÿ®‰€*s é~çµKï¿¡=ü'öA¥&¤clܸ±ºººººÚî×|РAÈœ…,¯Å‘Û½jw6ëœWÞtˆ‹²¶ 6l¶Ü¶,Œ`Ę;j‹Áa,|2bœƒ,Œ—HMMmë)`<€_ÇiéééTãêÕ«h­÷,Ê,³mÛ6÷Ö i+ü"ŽvVûöí;uê³D©Ói~ßU9óAcn64.`i4š™3g–––ÒW´A¬„„@Ot«««KJJè‘õõ¶ô½æ¢¿t=F.3šù4ª1€uýúõ3fP‹!J¥RŽ,(ä«-üAÃÐÈ%êÇûرc:§«›ÿøã6løøãQ…Žââbçµ6œ@­$•&á¡b(¼Þ)ü±ÉÉÉ®ì.—ËÏk hÓpý  NÆ#,°hö«L­1<"Âõ™;Á³Vsñ‹3Ó$GÆ8°9ˆvÈd²ÀA¥–´–¬2\»bV4ê3¢ XæÊrþ©#è¥üçç×½oß¾ãǧ& ^Œ#·§MÀê%àÔÖÖ6÷.¦¢k×Ôî]'ÛŠÇ‹¦ÍBöÿvíÚ5÷Ý}|2bœƒ, ( å⡇¢W®\1,·Ð-°H’\¶l™'戱a'`À!C‚جÙ!–'ÆÛ·*«Ý¿»1kñâÅ×®]ƒ{W´Aÿ Áºd8TUUÙÕAk‰‹n¿:ªÒ¹¢¶DGGóx<P*•è#õx™àóeKÞD7º 8³ÛI’”¸ã’$>l×i2™Š‹‹›óQlPI“ðQXÓ&#DLLL±ÁTf´,þMê´†ìÎw¡°Vp·9;25FT²·… ûm‹Õdz ccX:ÔeR…Ñ\@XŸ˜Mús'Ѐ+W®äçç£Mº€¥Ù³=œÈÕ€<½é|h|hNVn׈ün™ÉáÓŠ:!V”*ƒC›Î \¿~ýÅ‹÷îÝÛä’¯‡Û½7j÷r©2šÍ¢¹)„ÃU•è1Ž!"R•غžáóù=zôhî»c0þ °0L €. Ô¾}{ »WÜN!¤8«i.¬§B„–Me ëÕ5//þú“ݾ&“iûöí_ý5µi°LFCV&Ý¥Ù½U¸û—ÿ„‰ÿ&žššKèñœ€¥wEma±X;Ú&GùœÎ]„cFýËC…Q\6”––Úí²~ýúeË–Íš5ëäÉ“ _…,P­R©¸ £­?ÈOm†€E}º‹õ4ÖÕ‹®ìX^^÷‰l¬,#)“É\k' ÛoÿuŽ`0mcX:óæÍ£Š-üYa3eý´ñðáÃÏ>ûl\\\ïÞ½:d{‰&`Õï´ý"ÿP£9yö,Õ6Œ}˜×ߦa Øô§.§Sg’ v×iO©]úÝlC¸]{Û"×vä±ëî6;=ßEëæÍ›À%ˆNY¶êŸ¹=RΞ?O9µûôéÃçóÛƒaXÀÂx‰ÌLgË—`üÿ£Éd¢ÜRA$$$ÄÄÄØ h‰‹bÕªU-˜ Wñ‹86°†öéõT¨È~I&œ8°4B"dhQí'N uñðwýd¸z©jÎäÊc¦ÖW²Ølv‡ÚŠÚåÏk>]³¼dy;ÉÒ0a÷/ß(³ùó5ÙlvcææšjÃõ+–ٜҙ‘å”Eˆ ï(}n)!´||1˜ßŽ”‚Õ„0 Ï<óÌš5k6oÞüÊ+¯8|·Ë`©TªþB*DÅ çviÆSߨØX‚ þ¡e꯸$`•••ÉØD¡M8ËÊ<å–j[Ë/ÎDL“rãÀ ä 6$,,lÚ´ipB­GÊ¿Ž1âóÏ?/((ëJ#6ˤ5æYHrGö¬UÀêœÜ%øÝÏYRÇåÆËx°Ÿö…ï>vêÿÞ}¥DîÖe÷Z ¾€›hIŸ'´™.ýœÑ¡ X$I:Ì"¼sçU¡b~¨ˆSgùƒ«ÌäqQúÃ0 ¹oíãà“ã,`a¼Dlll[Oãü7Ž………T¹ÐÈÈH‘HÔðÉž–F£¡;\¨§d~Ç‘úKRIäs¿r¬æÙÙª¯?Šüôm9Ûú³%<›¢ñ\¸øjrø},…½KKK© Vχ‹?ïÔýôÁÊ™ê/³ù…0Ñå½b¢5ë^Gµœ(8FÃú˜ çÃÅÔ&I’î•ÁÒ?VåëšÖHÉíVšoŒ†½2+;:Vö¢m¹€QR~,m籪¬¬$­êäÉ“ßÅ=I’jµ:MJ³_ ®}. @Ю];º€¥8sÂÉxDYYÙb>Ç*Xeid¨ÇžÌ·­€åãg"ÆE9Žv_nþëÀ ä :dáÂ…pZ­7X';ó9¨4;PUŸŒù¹%Ï?§¯€àà`Áî_Ѐ¿”ú*£y™“““ÙQd¯¯³¼l}‘¥5~T¡~QE­Õ[ªR+L$¸+`y3ŽôÅ…ÉÜf¯Fm§X9°6mÚd6›ÛqX/GÚ„¿_j4× ,`á“ã}N‚ñ;ð ¯ÌÀãˆò©ÊG jÑë|»H~~>IS@Ü8B[áËqT«Õ“&Mºpêd»[Wߊ”>,”iË‹´Gþ¢SŒ~(~úã5ÿ~Ül­ü*d]Îù¢[ìµòªËÃ%ჸð‰B>$¼„ÁpóZ×€%>A¬+WQ“‘H$Íýšßw¡öA¥.<"ÒÅ)«K—.7nXŠCÙY·D3çÖïú™²w± Ú9°*++›|÷XjµÚl6§»[‹"66öòù2 ”‹‹SZdVÖ5ö@QVV–.± g‡Uºðx†X¾|&b\'ãÈV Ñ!ƒîСÃÝ»w/k )Ö îÉQaÚu¤VÑT”+Þ]¡þe# »âä‹‹¢¤Nô_êÕ¶'@Ôóáƒq¢cY¡áìö‘¤^ýŸÒ‡ €¤`ËWEEÕp/…Лqätîbk5ûÉbe4y´Çr@’äÆ`e{©Àl\k2X¡ÿ矪ª*ª‡y>1ÎÁ, \ºt‰jtîÜ]¹áÀ¢W0øöÎ;°‰úýãÏ]öl“nJ-´Ì¥¬‚,p |EQ€ |¸~ nEÅ…úU–Áˆ ‚R@FÙ-e– ¥»i3šÜïK?¹¦iš¦i›ñyýõ¹ËÝå’'—»{ßûy0›Ím©š„¡y饗òóó+^yöŽ“ûgË…|Ò‰uTkÌOÁíŸ!ÿúG-4ZànÂðJ”øçDùÙÁ=œªW4Êžx‰+úV¡52´È…¢ xTËZ«09ˆ&·)õî_…wëÖíž{îùé§ŸÐÇÜC‚Þÿ(šº_&¨,kT‘]ú#šÞOz&`©ÕêhÙ‹ß°5’ÅËÓÚ$$$h¬T¾ÁV샠(ÓÉã-®UUYy«Ä.œýë^M17Á5°0˜¶0¦)cÇŽ€}{µÐ·‡ xæ™g€EÀ=yûë7®¥ëµóIâë¸åÚ2äk¾.Íf¤¦¤¤ 1§ß@V—®@²¾ ª‡m>:y¡Ç0ž9°:vw{^a•“Š“®i*`9,pôèÑ‚‚‚tgZˆ½¸ÁG ½Âb½|ù2ýEÉårú²ƒ °€…Á`‚‚]»v±%â>Ä1kÖ}1¦âÚI£š—XÌX4~dÂòMvíÚõõ×_ßÊÜÝÜ2gt¦GŠënTT€ªkâ…5«j´õÖFÉ€$P<= €àr«$޵¨±tCb¿WÊÔ÷]«¥ÓhfÊÐ’€å´êª~×vÔ€é¢Þ|É`nZp­9FŒñÃ?¤¥¥!ݪiñ,Á¤»±­(X›qö(XíÁ–X,~ûí·¶àY ¡F£+æ!E›–N†ºUØ‹ ]ÇýˆÖ~W£?î<Ï‘‰´ª å­h¬Ôq­É‹76XÀÂ`Ú.âÀÐÖ¯uzôÀÇ|þt­ †‹ºÕ×9,Ïa<:™:ùRjj*8C.—Ó¿™ºº:º+´? XÉö¢T8%h‘æR­j¥fÍgpðàAàh :órzõ;×H®6l 6°€…é ²³³;{0^ÀOã¨Õj¥yÇrR"~I”¥ü[ýÉÒ¹¾‰ ejX¾)`mÙ²eõêÕ«W¯¦±y ߌc]]Ýœ9s8䲘F æÌ¡ä©ÿÞÿ¨xþs‡ŽšY\§¶R¥¥¥››{Qoz«\ý©(Hç7N— æ±WkC¿ý-ìÇoFtÿVѨ¬•äéÿãFÅÀq­iî ûåø81/ŠMº°¬Vë×_Ýt¾nç64þ]©€>}ú¸óñ 66V(’$™™™ M+AB‘`ò44y‹¢TùÆ hÒ!…pÅŠ&LpØ‚g,FÓ(ð–ql„þ8Gå5‡þmq­tƒjŒ&Š –o‰˜ÖÌq V0±9Æ%& Ó„•ôû†ïãCŸt•\ÏéÙWÙ39§_¿~N—$I2,, (Š¢Ï_è åÙÿ|GÆ‘câÚ¼Q<³ÑRQÖªÕ›s`Tö¾réâ3's?Š•2;ðJ_zsÐàF ƒS§Nõd×}|0b\㯧Œß1räÈÎÞŒðÓ8îÿ÷ßä>¾øféÖ2užÎô΂'GÝÊîžÊNê!¿`"³ëõf:KŽMÀB.¬ýû÷ÿúë¯O=õs¦U­4æ@“ÛTzhþÂÝ¿þú+ÇkNRÍœSÿÇfBgSâ´[æÎÜy4v`Mš4iÞ¼yÌFQ4555õõõ"‘¨U»¤®­Å(DÅ剀E;°ŽjMØ2?‰Â|J£Fž²¦ÔÕÕMÚ¯Uv© àéS:WÀòÍ#ÓZ‚9ŽãÀ æ 6G×®]SRRòóó7(tc`ð®1þ‘Q«yaƒ N÷ås8!¡Âé gÎ ÿã/æ¦ÒÒéYLÂÃÃéGtÕÕÕ€®MN’dÿþý=ØçŽ£!ª çF=6^fEwqÝæ,ÃÁÝ ýù»€Œ øc'q‡Œ|î2zxFÄwÞÙ–ý÷MðÁˆq v`a0˜@¦¾¾~ñâÅÿ¼óZ7®“«j!I¬OíÎcCÛXR©Í1ä]Vii)Ròòò¼¸eD§ÓmܸFŠì*Éû•šíJ½(*ÍéÒÅvu¸gÏž§Ÿ~ú¯¿l—Èü‰S%Ͻ*}éͰoãô$}ñõÈ=y›Ã  ys7oÞ€ÍuzÉ‚ù“îdwO…†Ç¿4?ÖéÐø!™@«VÀgŸ}6nܸ‰'2«SmܸñĉtkK„ñÐ~°Ø®A ÌÔu£úöíÛÚoC(º¸dwO|ýS™É~í«|{‘òÅu/ÎOγeäõë½öù§ ‚ËåMóiÿZ« Ï䈄E2"ŠÓ³Õ ¬³•QËjtY«âôÉÞ …·,d–€…Áø;]ý×…qÊ¢E‹æÍ›—xÿ,sˆ³œq’ }oå~39¥H‘z©²hᛑ{ò$ϽʊŠqHt!`¡ÿ󪪪]»vÑ:NFFFÓf;>ˆ5ÞÞ;Ø|¥u­¨§R”öÀzN4ØS2YQ1ÒÅK`ðàÁhæàÁƒccc[½ÓŒŸƒ, ÆNEEÅ¡C‡vïÞŸßên¸ßdçÎË—/Ϭ¸†æpûg&å,òÇ„ÐH6Ù ]™yWÀ:ÞÞ&¡TΟ?o±XÄ$Ñ_`wËoWê@"±Ûsš»V4hsúßø—èѤ, ¥à]¿~Ýh4ÒyÙlvt´]“Ëåh¼¥Noj('Ïe‰Ž€}ûöíÝ»7++kÿþýôKz½~Ë–-z½þäÉ“ÌÝÐ3JweÕÙÚŠwíÚµ_„{È }´\§k¨üEéuÚ_¾Óý½m|á™/»†|+ÝN’ÏÏ©[òŒµVqðàÁœœœÜÜ\äóà‡*̳ËLü1Á£¢(Ì,BcN³e° |jš<®5*,Vðjm¤[áo ÆÆ…qÊìÙ³W­ZõÕê51ßmån”žg°È?ÿž7|´B¡½•âLðmŽ!æ¿tll,óA‘LkÇŽôxòäÉÞý í+É^‘Ê\غ{§,ÓÅsPãØŒ…öÝVV—®Ð»wod ¾ûî»=Øg ÆßÁ¦ƒð‹|æ/¾øbäÈ‘&Lxýõ×;{_|¿ˆ#“M›6Ý*æ2M=ÒWÞyûcÞÜgМ®Öwñ¡`ÐÓDÝD¥RÑmU'm?Ë»,ŒãÙ³g`¨ËiF®Ìf+¸!` ‚Þ½{;Ý,SÀ*--¥( ¢££™wYÌ ë:‹õˆÄîî‰ËΫõÂ… ô$ªDö×_ÕÕÕÀ¡C‡ìofµ²íöjŒÐ§OŸv*°Z%”¼V®n:ZF¨€´X€¢tÛ­ºsT÷š²47M‚¤:µÚÉŠ®°Ze—N£)þ¸Û=Ûg™LFÛÔÛ5Éf¬ÿþ÷¿ý5 4ùÚV‡%`X>x$b< ˜ãˆk` ì=å_þöÃvñœ§¾ªÕO»ª˜r¥Ú:d$ «8Óí˰\د€ñ^^^¾sçNzì±€ÕÁqö¶—0¶ÉE X†&l4ž|ÝfV\"=Éb±>ÿüó%K–<ûì³3fÌð`Ÿ}|0b\ƒ,LáùÌtz\¼x±s÷Ägñ‹8"t:]Ùž¿×Ä…Ú[§ ÊéÝä —ü¤¶ßBp^’´Ê„…’°âââBBBèqû XÕÕÕ%%%ÞڲƑ°F0ª,¡ÜL+,,ŒÇã9¬;`À€æîšPÀ7n /ÐAc:°àd4+a;9ŠUêm¿Ù*\ kÆ ô XE)°6<85rx'´F𨖛$$$üX«{¥Lm¹*¦k­­Q,x¨ú¾ Õ3nÀµ ­°ŒgOòëm«ØîÐQží3(•J£ÑøÒ?¡vMó´a IDAT¦ g)óý1UU 6ü$b§*Ð,<1Ìq V0Ñ}¸‡Hž{uUpLkúAý0ŸL=°–,YBŸd£¢¢˜®êVÑÁq éŸŽÆæü‹Ì¦À-â4…Ðpp/s¦Òb=z÷ÃìÄdæÌÇ{ìÝwßýôÓO“’’<ÙiŸŒ×` ƒ±ƒ$‰üü|‹ÅrÏ=÷ <855µ   sw ã;wî|[Æ6î’Ï}½ú%)ÙÃh¬3K.ÐoÖ Ò”òòrzj`ýþûï‹/~õÕWÛ¸ç4L ½ -`1½r‡ê@’$³Ü8A¨ ÂÅ•.Ó…j×– [÷Ë]í…ªÞyFÆ+æñ‚¾¶®­­EO‰>LQ”D"!IrëL{sÀ|±ÌDxTËMè,ÈoÚÜgÞÏN¼àE‡k\¨zÍŠ‚ !Z/`öìDãëÑñ‡ãbááp8}G.h(ƒ3³ò=“~ªjVÃ᫊ìrÃd’$BÖp , ¦-Œ ã>¡¡¡ô ¶¶Öl6Ó'‹…æ€L&CõÑܰ´Z[g’»îºË¡¶šÏ"ŠïVmiÈå×iuù—Ü_·©ËZWkûv©Ý¶Uk«½ÚÞÜT©%O/’,xQ¾ñ¯µµú µº¯ªµ’«$ ^„Æ_ÏbÞ/ã“D«¬ãöLÉ›‰)mßy™L–g±ß÷OrºX¦UÆê¶Þár¹Ü‹b°0˜¶0,Œû TÁºººÚÚZ:7?44”™/Ïb±úöíKËXn XÀårß~ûí/¾ø¢}v¼]¸lµê_ß{Ûý› XÆ£ÑUè½ùÑëu§ VϺ1b0 °0„wS«\“™™ùí·ßz°"º¿€?þø÷ìÙã…Ý :2Žm'é\ó'LÍœÍ|5""Bc¥•ªP*ëz‘î¯ßÜÜ8ÓÅ|êHƒ’Î<¦¤¤ÄáÛö¢Ë×âXQQQQQ1VÂCç¤3:S­Å± SÀºÿþûÁ¥+%%…¾¤¾råʵkךnärùc=6dÈú½bbb,‘1_Tk6%$‰§%,]yé?þÈœÿý÷ß“¯FIÐ5,§Oÿ­¥¶\ÂîÝ»»þìƒn!ò®´X_/Uþ_©j¥žOºK¼àEù?’‚‘t)ecD\FãþQÚzÓÅs¶1€&¹§WöŸ>UŒÚa]Eù0¾ýfØšy+=ðbþ t¶€åkG"Æ3‚9ŽãÀ æ ¶tö©­­E°šcOŸ>­P(,‹ë9(Ù°OŸ>Çíµ×8m0ùv|‹9B4f]mEÆFSËtÁ^kr¿Æ0lذÔÔT¦ =HÀ#Æ5XÀÂttû@£ÑÏž={îܹ:Îýu:Jã‡ÆÖ¾}ûN3AK‡Å±íÔŒãÛÿâD<æ°}|¨Þ¸¹ÎîòÐ|õ1XÌ஬ÂÂBö™ *Ä&Øzú”••µq›_‹#?8Al×Yv7”ëv!`‰D¢W_}U$õêÕ«¹-‹D":‹Ðh4¢‚›Íþæ›oŽ;¦R©®]»vë­·ŠD¢/«ë‹ŽG½„$Ê?ZšÍ!8élÚ´éÅHñ­Œê]Ây «ªª€ ˆökŽ~¨&ý¦À¸àÝ2.rßéèÜbá´Њ·Kù­r`Oç ƒ¢Ð`æDDµqÏiýäs¤CÁ%«Êñ‚µöÛÿ¡Šþìî©Cî½¢¨¦ÎÄ6Ò¹–¯‰Ïæ8:8dý×ÌAl-(…°®®]93+¸·Šˆˆ‚ ž~úé'N´ÝmÔñq,—„¢qD­cA4­eºl?»Õ›¿ÿþûÕ«W·}ý|0b\ƒ,LÑ~•Œ@÷rëÖ­ËÌÌdjR®qPNž<‰Æ …"°Ë¹O‡Å±íTmÞh¿ûMNáÎtXù8VTjL ùbæëWµÛ7»³ýö°Ðù»OŸ>ô U5æ]ãkqÌÍÍåÄ- (Kí¤‚; ª•ššÚ«W¯ùó绾eBò-“A“B& ‰D$é­ÔkåêkÂ}¤5¿Þß[/§„L‰Ø‘$ÿ3Iþc‚ì®ùÙûRnÿŒêî½é Ó°°°¶Žµaö‡:ݬ&ÊjusE'¬KçÐäy½¹k×®#FŒðÊNúø`ĸ X˜@ƒ™ºuêÔ©~ø¬V+ª ÙÌüA (Š9É4daüsîQ4N{¥hÐMþ “å§Z» «~ÍgîTª¨¨ L+‚MpÀj™×»wozàEËר¸qãpGÔPn_/’žÓÛzD6°n½õÖE‹½ôÒKóæÍ€×^{ÍõÆ{ö´¥¼¡ƒÚÁÕÚ±¿[mx‰ñX~ÙüJº|8eo 0FÌ])FÓ•fkéãÏ7ŽžŒŠòŽYÉ)ݺu£MXM“츃†’2[©¯vóšûoddJǴƦñùf¡qíúÕÀø×­ÿa5ÑК°žd ï{Ø[oê®…Á´\+ñ®+,,lÒ¤IÞÙ³Î€ŠŒ©³ØD+ %Ǹ¹¢cnGMjd¬³Rji¨P(t²ô` h {9šï¾û®´´t„ Çw½¢ëÒï+V¬À½ý«Õ V«¨ÐÞ †;lTÓŘ¹]+«ë™&,ÝŽß[|—¦EÜ €Ob¥¿w“=*bË}Ž?~öìÙQŒþƒÄ°QHÉh*—¤§§/[¶ìƒ>˜?>0®¤›£i‚¡›:tÈ`0)jEeËE£ 5÷Fݰ)w¢è·«€ÕµkWÚÞU^^N§K»°€dño½ M%—»ëϧL&Ó»õX½×X šþ ¥!ÿˆ[U®úðMͺ/4ë¾Ð|õ‘fÕ'h±òXBäµ7u XL[Æ}˜,$`y±9¬*“ÓÛKOTfïssEkù¼9h|Á`îÒ5Î{‡Á XÀÂtÙÙÙóFųO:Õ§OŸ½{÷ÖÔÔ¸^ÑÁ…HLL­V;{öl«ÛÆà@¥ÃâØ¶oß~ýÀ^®Áfª2òøœ”ÞMËÌÌ\¶lÙ²eË&MšTj²üʬ„µæ3°Z ²²rùòå‹/~ûmÇÎ2MSç„ ÇŠy\‚x/FòÈÍKkV~¶wï^?°zöìI—!×h4Æ@ñ©8®[·†íVÔíw¡*NR©´Ûw°ÂÂÂZÌShZ3õ¤,æÕõôf:J‹bå!Z(XP¢ÌÑš˜fÏv°Ž=EÑõé+++é—œ–9ç³·âNQ»›[mºpšj8”JM–&‹,R®<MÖ¯_¥þd©ú“¥ê/?¤L6 ^­Åz¦{;ft®€åSG"Æc‚9Ž#`s[‹ÓBXÞ¥ãã?q2š4æµð¼á `%˜íW¡çufµ|0b\ƒ,L1räÈ–òHÀB·puuuТ€…XÌ{W>Ÿ¿eËÚæíÅ*Ú~J‡ÅÑ5®«8Ÿ?~ÏÇËѤ:±NþëRRR-Z´hÑ¢Ûo¿¾¨®·¶ÅÌ…ùú]ÀÞ½{/^¼|ùò·Þz‹}‹É˜R_Ç' ’$à JxñôaÂW¢ì7ö“$ï£7ǧR©>üðÃääääää>øÀýψ¬øøxZ2°Z­­ª½í‰#˜L¦Ÿþ™Giûm7}È-·ÜBÛž°æ `µh¿‚&V·nÝ›3gi…f|aM¿KU/WÝi ÉÊ©éí?TzºÖûâ2ÕN•Áa;í*`9Ò!‹ýDQ™0&ÜÁ™ÐpoiÒ[JKÜyãZü¸ÖÞˆ“¸ÿ¾àzçoªÄÑ1^|G:WÀò#Ó‚9Ž“BÌAl-NS}ÄÕñq\¸pá€ím‚ÄEùn®è `õáÛ¯‚.LôªàŒ×` h ÂE‹1ç»/`=õÔShfRRRzzzJJ =é~IxLûñÕW_Íž=ÛÅùùùäY{Ò+}¨ë Òþ©b£å”Ü~Ÿ¬^õ1X­§N¢'­VëÖ­[QžÊ7_ú9>ä|jÄþ”ÅÄ õg½-á5.³5AÂë/àTVV]¾|Ùý‰,]»vE.$o X¾C]]J¥ê/`s¾=Vl+2zΜ9¯¼òÊgŸ}6wîÜ6¾Exx8Ó‘tï½÷¶¸Šƒ€õ / IHa±V˜­ôÕU÷Gæ}È‹^Pr±rc­“ž§í*`A“2XHÀЉq¢øB‘±»]Ë3ÙïÎ[óN ñ ­ ¼èÀ~úÐ_åq*‹ská÷ Ý?jCXX˜ßÑœBˆÁ´…€q`aÜÇ—X›Íæ Ì ®aÂ4uVµ[mR¬4½åËy9˜, Æ5XÀÂE!köìÙ è%÷S'Nœ8zôhzܽ{wh|ªöîcZEQ¯¿þú‚ ”JWWò/áÛ/©ec&¸Þ,’‡^½pÝG› .évýqúôi´Ø–-[4ß|Y9>]1÷?°íD²Ë{Þç"D•••¨2ªûÞ"†vòùüððp´‡W‹–ä2ùƒÜC`òäÉK—.}æ™gÒÓÓÛþ.È„5dÈ%K–´¸<³rj¯^½üq‡¤¼©S§Òƒ;ï¼4VŠþ¯pè9ØÁRá X 1×xä@Ëo@Qºöz´ÇµFð¶ n YP½ªF[Э§xÎSìçŠ}’?vRDþV…P>i{€, ¦- Îø8 |ÙÕ)’s¬íŽƒ (S^Ž;k1¬D.+‘k;vLuÁ€, ¦YüIÀÊËË;~üøîÝ»ÍfsËKc| ÔÀ޻Х‹eeeôœ°°0™L6oÞ¼ lâ…›¬é¡ünÇ÷¿×?eˆXÀjB;ÅÑÌfó¼yóÞyçhɈľz%”eûs«³RQÃZ°"§¥¥q¹\8U]»Ui¯AP½ôåÂ3§Ðä™ìƒš5+-奆£]l-OgBã žætnuu5=‰JµÊŒ%ÂëV'ÆÑ:”ôáFÃ8ØëïB7"‰D?üðƒ;¦ëóÏ?çr¹Ì’ÿr¹|Ê”)ôxÉ’%çÎ+++;qâÄøñã?ÿüsævÚUÀ:{öl«R€7ì46ˆ–ŠúŠ U=V[©K3‹ÅòJ§s&={öTX¬o•«×„ÆIž{õÞT÷Ï‘­üî½x½•€v`ùΑˆi ÁÇ€q`s[‹S–XGþL46æsg¦€5NÂCãcZ“ÎJ³€…FŒküFÀ²Z­C‡0a®CäÄÇÇ·Çfy䦠‰ìWô}Ý’%KþûßÿÒsܰ† 9ŸÅ†ð7¬ê¶gûoÝäïÆHúu‰ÆY XíGwX²dÉÚµké±FÓlK¸êêêV»•\¢¥ûÒäää矞Z¥17˜°ØuŠ„½ ÷Ór>¥q¦‘$§ï€,–èý Í“%Ê%œpnÿ ú@²°Üw`1,`xļ%`ubP«Õ$@CÀâ âõw¡X+V¬@éÀ®AÖŒ3Æ{VÞwß}<žíZ3,,¬OŸ>ÑÑÑ¡¡¡;wîtð‹µ«€Ï°(ŠrB’ÁÃP²žµ¶Æt±…kÄßÞyOjMÊËùƒ4´¼—.]ª¯¯?tèдiÓt:úÓ`–¶Ìq ˜XÁÄÖâ´ ¡¤vV%Ãíχ4G\=æD4°ÄvkÚÁ,`áƒã¿° j‡,„.3ä]®\¹²iÓ&$jèþÜ¢8°‡þM'%%Ñ3Ñ£{×Vmm­I§]ÖEŠŠ‘É…¿û¸æ‘»â„|´˜·?„ŸÑqt‡C‡}üñÇhÒE?¾üüü[Dö|´âp·Ê?¿úê«ôµB‘Ñò¿êz4F¨`¼„ÝyìGåŒ'FŠzªDùwÿ‘»O†ÿü÷úˆnŸW×oSêC£cDsìeÔbòÏÔ5¤zàÀ¢ÛÐ0¬òòòÜÜÜììl”™èǦh4š~޼Á1GJC8Ý{zý]zõê5eÊ”ùó绹<›Íæñxb±xÅŠô¦€5kÖ¬æÖJNNfÎiW+$$ X—.]úþûïF#Èd²æLRB±$[kwìv±ýC‡•ïÞ‰&O´Oþ 0¬Ë—/Ÿ={ÖjµæääÌ›7)¿ìÀò#Ó‚9ŽãÀ æ ¶©TÊçó@¥R¡ú>âÀê¬8r™åV/¥´õÍ/ ÐX½’Äp‘ý1Þ‘$IwÎ*ø`ĸÆo,¦ú€, Íï¿ÿo¼ñ†Z­6æ­[òtÆÆÿLø%QöbE~õ}óˆ°ÚüY555E ŽÂ ´´t~˜(•çxáEP”1÷Ø-å6c°ÚcÇŽ%''§§§Ï˜1Ãá%£Ñøè£2Oö‹Å!{Qtáü`†G™ÜËébˆD"Z ›8q⟲ØK»­ïÃ.ÒûeÂß»É8¨Êxt—+‘]Ÿ¹©úM©W¤g²"£qºŽŽæß2ÎÀ·Qâ fÛuŒ^¯w]½ è‹fwh,`Íš5+##cÔ¨QôïßßQ«ÕcÅŒXÃoqÚ2² 0`íÚµDã*û®‰D¯¿þ:êc- ÕjõéÓ§ÿøãáÇ7·–\.GñA0e¯ö 22’6‹étºÇ³uAj¶A‡Íö/Ap‹¿÷Þ{éŒÖt Âö0C…‡‡Ó›U«Õ;wÚ$³ 6\»v -àõ7EàXL[Æ}‚ˆŽŽ¦ÇÈî#¬Î‚SÍo(>`6sޏ\¼‘€5BÄE]€ÈØøø·DFFÒ¥-0LSüFÀBOb X˜èøÊÊÊÞ]ª|ý9ºžK$›%âv­.3]8c8ô¯ôå'3EÜH69ÃP›{ôhJJŠ@ @þ,¥ßüÃóöª7Ç|½Wáù(6 ¸ a{röìÙ¢¢¢¼¼¼ýû›£•——_¹rÄb1Ê`j® –îèA¤4-¡©n X0}úô;î¸ã‹/¾˜=þs7U°m$ŠM~ÜE‚,B yîÕÿEõخԺ†c XÀæTõ„– Ôn‡¡³Õj5Ý—Ð!©ÐtþtõÌÉÖZÓeØŸ.°yU*ºXÌÏw·U³/£V«oe8çy#ǵǻDEE¡H¹IFFÆÂ… ™sÄbqZZÚÔ©S] aÈ„%“ÉÚû” ˆ;v •Æ…€'Yä]4;e­unM5 'îïÞ é[(8¥3À!ÞOð€ÔÔTzð믿:¼Äáp€Û` ƒi ãÀ´ ‡ òd37£íI†Ã-ôùe XwJí_`ôøß~ûmòäÉ^ß= &`ðK«¼¼¼÷ãÙÙÙÞÝ`EEÅ‘#¶çükÌׯ:_NYûSBèÎ$ù"‚XüD›¤;2}XÊןë²é;>ÙðôC&ØqTúâTˆíiËb^.ìÀj‡8"._¾Lª««­kK£¯=)) 5ƒk® VøE{ßÀýCbb¢ûû°yóæ=z<òÈ#/ûCÈü…N—L.˜< 9¤PµìÞ½{4hРAô­¸qôD´Ê­b.ýû†,ÂÿýïÉÉÉÉÉÉO<ñsãêO–š¯\V<ñ@õõbzNÆÍBÅÓÌ<{HB R©‡«  Àýæ@ûűµª«¢ÖÑÁ1¦3÷†Á—_~éÐRÐMèÎÐþ-é ÞrË-ëׯgÎo®‚;A,=§oÈ"´Z Ù{.vøðáTÊ„.ò f•î³¶À,ƒåðRXXX«¬s­Ý~wʷ¶Ìq ˜.„ÁDp°|§`S'ÆQ“Ò Gܰ$1IjŒÇŸ05$$dÕªUí±‡þ>1®ñ §ú;#G¶Ð ®µlß¾–92EÜY!®l‚ˆá° KMÅŸÝä)<6(•ÊÒÒÒýû÷þp©vëÏÌå¥/¼ÁŠŠ=údè3‹ÐÌY2$°€åõ8"€e±X˜‚5ÔÕÙú …††"–S‹2û*íu¦þQÜßÚ/#—Ëg̘!~ây²q1& à{Búþç@tÏJ`ˆ/¾øbNNNNNΓO> ’AC/êíyˆ¯D‰—ÅH…$A[®P·¦e8²Ÿîoh:zVA.Ÿ$ž%þù3X­QŠŠd’ð–€Õ~ql-!W.°Ô Nj:Ó@:”Ç+¶·€…‚8xð`æM£k–D"Ù£6¢ICö¿NÛµkW†À®ßå6ôÖ6l˜Ç;ì$`!zØ®° ³X¾s$bÚB0Ç‘yà°X¬v•›Û•`¢8œhŒÀH'Æ‘•>u2æ[*]Ý®"ë6 OÔðÝ*çAïdÄ#Æ5~#`áBŒtþ ˜$>‰•¢ßq±É:³¸vƵZþÊï%ÿ} š\H%pYkãB8QWW÷é§ŸþgüXɺ•èUµ•Ê9Ip×}ô¤`ÚLV¤í Í'‰NÀ X …bþüùóçÏñÅ;ø­‘€MŠ£¯]&“¡ÒNSõÙ{Å`»| daœŒá­r`1!8œÈÿÊ¿û¡\Š é· íøÂšKëèUSËÈÈÈù%J¥Åf%#– ¾­*/†€UXXh»ˆ¡(õ'KÑꃹľä°E‘öŽoƒ„œ 2J‰,ûºþLìU»ã†7jl'>|øøñãÇ?eÊ”ŽyG±XÜ·¯ýÁ¯k–D"Ù«±ûO dz~YYYéBûƒ\­ är9Êõó. `NÊåò—_~™·k,èl ƒñw¬NÜLGâ³V'‘Ø-OÇh“rÈ• ]¿M ±çšo™Ðe@1˜ÃoìÀÂ0Q«Õ{ö쀅¢8Ží‚‰"ˆ…%uû4Ƴ¡lìmâ'_<³¸éºÝyì§Â…J¥ÒP]õe×p¶í(0QÔ=WÚñS‘ìEp¹¼£ÑŠÂÀ°Š‹‹W¯^½zõê•+W6׿¯=0™LHÓ&–û¬Úß~BcÁ¤;ßyïýÖV>bBE£—®¨{yYTöÅ7«õõæÚÚZ½^_[[K——H$Í5e /2YçÞPš_ã7aªSëõúëׯ€îïm¦ g™[ˆç:Þ r‹.¢êõƒ^סê5I%h’ë¤NÜoqûí·geeeeeu¤ Ì4F¹v`‰ÅâÓ:ÖªŠI}zN™2…YŽ­ººúT^³‚;íÀ6lX;Ù+ÆŒÃ,xŸ––öòË/ÓÕÄÛ…Áø;Ì'Èm#A°šs€ù|¨™ }ZÀJå±ÇIìùƒ‚ÉÓÚo÷0˜€Áo,\Ëßñn>óæÍ› ‡  ·ËÙQ‰Ç´&`¤â‹V8í~°œgäs½)îúØ‹ï)²[ >ªª?¯7;´­å ŒÆƒ‚À…nbM&“ÓÛNyéEEE&“ý±•Cis¦ËEwƒFc9¼M n¿{øðám¿ß~衇H‹¾V£(ª´´´Eû°Ùl¹\~¨Þx×ÕÚ"£Ý'Õÿò)]ÖŸÅÅÅhNAAe0¨?}Ï™P~•Íø@gúH}ýÞl«íËцÈ9ývîþøÌ º/`I$Ç´ö,Â.%;vì@¿j¸|ùr/.Òи ž fh·üA`³ÙÌö£iii|>åÊ•è,91m$˜ã0¬`¢àXM‰‰‰ùWc?·ìk³6yZÀz.B„nÅÏêMaCG´ï.ú ø`ĸÆ/¬ŠŠ ‡ÏßÇ»ùÌëÖ­€I^Ø~ uëS9è1óAPÈ^ â†ò?×jkÌÍþlŽê-_V×CI‚˰2„œº ° ªªªéí”—ÎÌ—r<5u`=ܯ'Ûh{ö¥âò¹½Ù. ý0JKK›Vpw í(9¥3M»ª(7Ùs ë–<Ó ì×4ùùùõë¿¶Ü´y©LœÐÚµýAºªW[r[dèС#GŽLOOŸ4iRff&=óÓO?mUÀ)„L[ Ó*|VÀê\¢bbö3LX†ƒÍfZ,–‡dt~No>% mç½Ã`¿9Ó8(VeeeÌz˜ â›o¾€x.k”ˆƒÊÿX§C 88™Ñü_ët21VÂ,äðB D…Ñ\e¶¾W¡®2[ <<œîCg‡ 82 öÐSt¬æÊ-:°Ú XJbÉu=õœw÷)`iµZ‡™Na6¡ËÑš^-S/ï"¥'¹¬}ÝÃèæ˜põ<ª’UGÁGUõ ä —„ÎîžJE@ΜCíù“ä 9ál²Úl…68°|㙓`±%öÌìŽ}è0îCÄ—_~éÎ’ôt^oRZ¬t’ ŒEN‘ò™–0ïX4Çv]MˆÄü±T›ìàÁƒsâãã{ì±v}S,`a0mdÔœÆQðÁf³ÍfÛI X4111ÿæ]CO€ vKž¶54/**JJJBKZ 惢/ªêå)Ý:rW1ÿÅoX.ƒåw0ïŽÚ‚ÕjýùçŸ`¶\H4¨W×…Ò‹ŒWÍ XÀ×5Úû®Õ¦^¬Z=mîðJˈ‚껯*Ž7dl9u.0³¾a‹,wâ¸|ùr‚ ‚¸÷Þ{Ý|ߢ¢"ædee¥áð>ío?R¸t`Q:­U¥´T”©ùÞ~Ë-–ˆGz¹ŸS–;)„ˆjují2k ÇÉ…þ²r•Òb3g'-V¯@Ò=åLCk`œ˜‡vÆ“ã½ã±-˜N@ããZSëÂí„gA¤¿g ûO‰_××*è±ú“¥c²w¢—øã'|t޼Ím·Ý¶jÕªU«V1‹pu¾p$bÚN0Ç1`XÁD I=¥“H$!!!»?ˆÎcLLÌ>Õ+1]]½rUcó‚1‹¸k4Õo”NªÈL­70æ—uhuÞˆ1„·oz=°šæ[½V¦>ÇPZ™IÖ;X¯ÐÀ’%Kø|>óU©Tº[mom3¡Ákæñ9¾sÛîØ±ãå—_>÷ËF4 XàYÑ÷üa¥¥µÆqX)ûw€öçï4ë¾ ­3S§·yO}š´´´yóæÍ›7¯ýJÔ»À߉bh‚9ŽSÄ=˜ƒè(‹Ðw*¸CgÇ1&&¦ÚlÝÇèE¨Ý´ Åè¾ÅÞi¯ºU©7RT{|ô#ðÁˆqßXUÛ±€åwôë×Ï+ÛÙ´iÜ/H~¼dxd¿§_b6›s!`¡º€eeeF£ãÔÅJ°;~“yìÀ°XEEE3gÎd~QîÄ177—ܼyÕ;wEQ%%%Ì9de¹áX6Xkk4«?ýPu½¿€¡¡¡v™£¦JûË÷N7È¿õ¶ß´µ ­ª  Y] XO>ùdjj*š3fŒ¢æß¨S[íêÀ‘zã†ZÝV¥~ÒÕÚ¯Š+ >>~îܹ›âp8ûö_ø-b.—  qáíVá­ãÑ3Ö®]ûÁ²e²r{ÐstXÀj5žý=-ëvK`¯Ë§ÏP.{¹p]ÿ!<Ü©=éÜ#ã-‚9ŽãÀ æ z°|*°sãH'çVÝŽß(öĉE-_¾œ¾¢®ÿa5û´Ý„~H–””ÔÞý|0b\ã7–XÀ N¬Vë–-[ä,ò¹{ùvÑŒG¢ãâ @Oáp*e X·Ür =¸víZÓí;Õ#Ø]ãmk É&Õ•¦¤@¡V^^Þ¯¿þz×]w¡ªO-RSSÃün?Þâ*ÕÕÕ´­ÙŽÆUÀЬCÁº9Q6RÄe:°FܸLô›2QÔùÁ£·ßíæÞº7?Ž:×Õ²e2ÙöíÛe2ðùü?ÿü333óªÑòpqí³7•÷×>Á‹þ *åÿJUÿ-Q^ÒØ.wf̘á4gª„/B­ Å$1LÄ•JE1Ì2þBUUU*Ÿ-eÙ$9…ÅZd0c«c5j”Hdûÿü´JSj²ÿ›Žì³-SUc¥î/®Õ,| H?¶T`0˜ö&`X˜Öâ›VçB'»5Çæ”§4j}ÖŸôÅð7¾ýö[Ó…3ª—¢U.œ¿ ®¾ÿþû²ÏŒß,L'ó÷ßOŸ>}„ |ðA‹ ŸÞ“õ»~g²\Æj¨v$ g<“&Ù²ÃÃÂF[bbb ”šššššJwg€ââbz ‹ÓÓÓ“’’d2™s=‚ÍaÇÚ< Àå½YC‡mêÞ žþyf»ÏÊÊʼ¼<øûï¿'Nœˆ Q¹&77—)©¸“Eˆò»wï. I€{ÅŽOqE$ñ~Œ$4$„–9b8¬ÌZûŸqƒ+Ü©2L*RhîzXÞœ––ÆœC„Cž¦¤¤¤lÚ´‰Íf‡‡‡‹D¢¿þúëöÛo?¦5mªÓ¬7ýrèhVVVÓUœnJ"•îa˜ÒG‹x`±Xêëë=ùˆÁ´?°¤R[/,`ùÙÙÙNç?~|Ë–-»wïv¸“¯©©)**:yò$³ä!±ê£á"n£úµøÉHy8L:uÀ€“&MjÚ²*:::''çÒ¥K—.] µ'P[€´´´ÜÜÜÂÂB…BÑ4u‹†™Exîï¹¹¹nª9~ÄÏ?ÿüÉ'Ÿ0sui=>tèÐäÉ“¡ù8";‰Æ°âââ"##G‰¹±(Ä ÷G2͹x†v`-Œ±d2Vl\äî“[$snÔ]Ô›Û©ƒH$ÊÉÉyÿý÷ÑzXXÇs½Œ7nåÊ•´ºcÇŽ­[·&$$ÄÄÄðù|‰DâP*«9K*•2{3Û\Zž•Áj1ŽíJeee_¾]®: `y„ÇAœ2e  úôò†Ò°XÑ]^«Òý£6@DDDÛöÓ{$b¼E0Ç1`ºs=ãî»ï¦;`L›6­³÷ÅNçÆ=×ܦ´gﻘcK,¿^¬Þñ;zéÿÊT•ì–¯$ƒ |0b\ãgVß¾}éîBèw âS Vwûú÷œÝÞÙvŠÔVãuz¨½ÇôV¥ÞBᣃi5~ö¨¤W¯^b±X£ÑhµZ¥RÙTŒÀøUUUô@§ÓUVVFEE€J¥2lå~hK÷Ç&sq=ÇBÁõ‹‡?2›K[ûvR©” ¦R掀Ŋ· XÝüßuøðá &@TTTyyù'Ÿ|’M¬è"Ê¿7”Â"ÖÔh›V¯©©iQh@š› ÅÅÅ͹Šh˜ÖÈz… Èf´¾a²VëO)™Ñ’Äee4 ^œ;‘¡p‰Ÿ|Xì7®Ð“]»veö£l'æÌ™c0Nž<é•­1X.¾(ú¥ýã M´-âm®Ó{æÀêD*++ÃÙ¤¼¡ŒÖJÝ4Yâ±€Õ±|õÕWôUD?$ôŸŒ `a0˜ ãúôéC÷2ºÑu@ÃÌq®ŒE IbŒÈ~»¹NXöÅ`ZŸ9°Œ²‹± Ë¿8{ö¬ÓùÈŒ,Bd¿ÚÑcµÖ÷š³¡VyÛTÔ+`±XŒ{¬d4Næú½€…£ŠŠŠÊÊÊýû÷ïÆHéÜ=à­hÉÿEŠ›ê@ …¢¹8ÒhµZº_!ÇëÓÇæœ:tèÐùó狊ŠL&“ëý‰‹‹ë[~ ÍßR§§ò 6Ö:ïÈîÑS0ys Ö gÁ‚o¼ñ†W6Åt`µ(``Ôq§ë {&`¹Žc»RYYÉ´_ÍVìÀò¯=BV>$`aVЉG"Æ‹sÆÌA $:=޽{÷¦ÇkÕe„íj‡G÷…òõëÑÐ~ qÝ.èÍàçGM;ÑéAÄø8~ `¡Û3‡3pà@,`ù)ñññNç·(`]¼xQ“õ—ùªÍbc¢àµzڠ늕[¬¨‚g3ý†²H‹  Ξ=[TTô\„èy£Ö #Dß҆°ýEÔÔÔ4G´= C1zë­·úö훜œ|þüy§k•””ЃxÏ”{ÍߢÔ@AAÁÚÝz…Îa­kF‹tùW@’Ì-´Sw§xë½ZåÀ:¥3›œqñ\–œEz–Bè:ŽíJee%³VÁXÀò¯Q"‘ЦE•JE›.±€Õ‘t⑈ñ"ÁÇ€q`s‰N#°Î_¸°IkïŒ4'LxÛŒ&k3ÇÒ,`5¥Óƒˆñq:AÀº~ýú½÷Þ+•J¥Ré½÷Þ˼—v ª ݯ_?@€,?Åi¾§ÙlV4Ô[†€…î Àh4*¾úMnSêYÑ]èúJ^Ùw, IV|"šJà²IÀê^Yò|¤“RÍ$¼ße‘l©*555®óv‘€ÞTß¡ËT9`µZoÞ¼ A„9 mOêL…3\¹rÅDQ‹ËT¦¤“29ìÓo/Rè"mÿEE¶ôÒŽ°¼E÷îÝQÚ£CAw&IIIl6ÛHQô#;šŽg¬NÌ¿®ªªêÁµßääÌ€‹…{€W‚Èb±è/ßjµÒEîÐó,`u¸B`Ìq V01èô8Ú¬óç¿+S ‡Ž]9,N½­’¬ÚJ‹²i4~}Ô´DŒÓÑ–F£;vlzzzqqqqqqzzú¸qã蜣æ ëLrîKMFƒR,`555V«ýé„SÖ—så"=¦¾ª©OJJ‚6à‰€À޵? ˆãŽ€up×?„óÑ) #eaèÕ^|ö¶¤°Û† ¥'‘>Õ(paaaMŸŸ0ÅJDyy9ZnÉúÍßCÙÊ æjÏQ/Äœ-SGκ^«´X9rîÜ98zÔæÛêß¿¿ë=ôAÄbqJJŠL&ãr¹.X\.—6µÒ1,¶ßqwH!,0˜;°:ô—Hk¸ƒqº-/_;°0¯Ð«W/ú©ä¥K—Êu†*CÓe6×év²õXÇÓZ:ZÀZ³fͰaÃ^yå™L&“É^yå•!C†¬]»ÖÅ*'€-Ýä÷¶ª•XÀ $˜ùƒÐŒëépïV.êÍm°Y¾y·2Öž¡™À!')muÙ[°œ¦"œ XHMmºtÎ6—ÅýúR‡%e2= ÄR 0yòäþýû×××;vŒ~)33Óõú&—.]R(ƒ!##ÃÅb Y„öRbý°R X8…°“q(ƒ…ʺcƒi‘€q`a0^A"‘ÐOpé'ôj+`À ýüðQƒÁ´žŽ°þøã‡~˜9çá‡Þ¶m[sËSFãÂ+9@ð5*ÕÒ—±€å§dgg7Ùœ€…Œ<éÎ-b.Z`eu=tŽ€ÕÅ.`uåN ¬i"û‰SüÈ|nÆ0VTLêöýü1Ñü´«¢Ø$ÔÔÔ8#‚™BØÔå4…°°°ØÌçYÐLÞ°Q²¤îKÊårÛ~2ÒͬVë¶mÛèÔ§¸¸8L!tZÀ:£o$`y–Bè:ŽíJ}eyÇvê1±ËC¼D©ÔÖ£¦¦fæÌ™?ÿü3=‰¬ DŒ æ8L ¬`b á qDY„p¸Þø O¶Nc©¾ýÞ×–eOœ>©HqÉ`F—ÄXÀjŠ/ãËtô™æüùó9>iii.\hny‚ËM›÷,\BOêþú­·ØæÂÀ–1räH4Þ±c‡R©T«Õ\.—¹ SÀ/á¥òØ“¥öv³—Ò\m´YÀò,…ÐÁuÐo,¥R‰<; \Ö0‘-€àž™ô˜àñC?ZS5y˜¥¢ Xó3¢WÊÔ …‚Ǧ0S…Baxx83Ô©ëú¹³oGKÆKx‰»½K0eZÓô¥.]ºÐ‡zIëׯ§#FŒp±o-`åÌz ø@@$›$kªZZÏ ®ãØ®*JQƒKCD´‰ª,`y„·‚ˆþ·lÙòÓO?Ñãøøø´´4¯lã‚N<1^$˜ã0V01ð…8öîÝ{çÎô˜8Ò=M2P’øú2¡D¢ÑRgt&`<ÓÅVS|!ˆ_¦£XµµµÈFAæô¶!^ð"sRþÓÚ^|6üûï¿o¾ù&S£={ö,ÓŒÀ|‰9V*•Ìöœx ¼…}ûöM:uæÌ™óçÏÿ矀\U«É¿1×ò¿‰ }%J=ÏÎÎv0a¡#¹Vžísĉ\FB×þ¸ÉM,”Bè vdeeуÌÌLÿŠEk·‘‘1~üø{¦ÿGÕ½®¨ð¯O!WÚ•ÊðÁÃÇŒ QÒ_>E mA(Òc¤ßqÇgÏž---õ£O·€·€·Ð)[ Iõ!¡oÅýñSà-à-xq }úô‘‘‘K–,9}ú40,ÏèY2‹ÅòÍO·€·àæÞ|óMÂÐnTCs„ŽËåÖ××3[È™L&±Xl08)q‡ ¢lp¥µÝ]_6˜o/Rð$R¿Nãò._¾üûï¿@Ïž=ïºë®ŽyÓ²²2d¥‰ŠŠª¨°Ý~ß!å+q9‚É÷(·oâB£_¦²[J￲)ŠâñxJ¥’Çã9n×m C¯^½®^½JOFwzZëj+Fö¢ÇZ+u„¹pú2;wîœ}úœ>}zâD{}è3gÎ0kÝ5‡`ò4ã‘ýÚ­6‰úQ¹p§ÊPQQÑ­[·öØÏýû÷߸qC(2¤k×®íñ¾ÊÅcvýk'P>³Cáv¸MÂ{ŠÑjAœ‹ëq ïTÙºúâ!z¦WÚÌMŸ>}äÈ‘ÙÙÙnÀ¢au‰3\¤Ç’zµë…}$`M€êz|\k¼£o¿¦ ¦Ü«Yû9=%â-ÔÀbqº¤º˜$F‹¹#DÜUEêÏÞ#ÄRKùMí/ëÁja®+ûü{þȱÌ9HóbVg9rdIIIII ÓÅ:fÌ¿®¾Ñ*Ø=íîôd0{°…Ϊ/pôÈ‘^<»dÌîÑ Þxãø <¼D‡ëéûï¿ß+›Å¸®ôyIÒö(ʯÏÂAÄ€Áâ(‘HâââPa_,`µ_"Æ—éhÖÔ©SQ• šõë×ßyçî¬+}ù]v¼M®"Vt‘V_óúÒ¼ýöÛ³fͺ÷Þ{Û °›ŠJmÄEv§Ã{±X%nº˜¢Þ©¬7,ø¿w+4_×hQ*ÙðáÃÛ¾{A|üñÇ$I¶JÀb3ê¸GZÍ®ó^}$`¥ÖØÛ \t(¨OÃîÑ““jÓJØŒ#&ÐHÀ¢XwÞyç†çþ››ÞmM\è£rá«N³f¥ú“¥ÚŸ¾uP¯Ž|õ T0¦ŽüðÃïØ±ãèÑ£Ì\&Lp±c'9…hˆW ÖZWe}Š6¬—²lQ#ÄRVL,H$’6vfÀ´f_ ‚ xàNÜ ãw† ƒñ"Ì2X‘‘‘hŒ, ¦ít´€õøã>|ø½÷Þ«­­­­­}÷Ýw=:wî\wÖ%„¢w?ƒ†ç<ñ\ç—o.©×뫪ªÚ"Êœ9s†¶/€éÀòn’ê믿n2™œ¾ä—{Bø©<Û#; _V××Z©Ÿku# j¶€ iR˜W,Ø:VãF„~Z‚þþ¥,"¬ô:š¹äÏ]Í-ÏŸrß)å¡¶)NqH!Œ9ðÏØ¬-]³9nV’U`0—š,YINü_L‹éÀ¢ …¨˜0}›Ã¦tçNu⾸Ùl.ÚcïÛÀIéíYâã&LkôèÑm.0 Æ5èܯXŒafaã]:ZÀ’H${÷î=qâDBBBBBBNNΞ={D"'écNá"š5MFÞc))vXfݺu 22rÆŒžídii)ºËd2¹&œR]]ýÊ+¯<üðÃÓ§Owп¶nݺ}ûvæÔÚ€)`‰HbQ¤Ý~µY©{·B“v©òùRU©ÉÏ,Ž“˜˜ÈÔ,ÚÈ{ï½×ª­5nDHú©€EÛî† ¹DƒŠÝ£+6¾¹å“îB*C†sãdNsKFúÅápBBB´¿~¯þô]h^%¸Ü†Ž}¥&#¿ZÖ»Ëi&orr2=ˆ‹‹ ¶»nNÆî¦: IDATj_4®?ÛÚÕ™­F:Œ}ûöuÑÛÕL:ã1Þ "SÀZ°`W¶‰q“N91^'È㬠bÀà#qd:°˜–X,vèÎæ×GM;á#AÄø,-`@bbâÖ­[U*•J¥Úºu«C™ç‘<½¨^`¼H‹E±à!ÝßÛ˜7ɨ«]^^³…™û ûœ;wnÓ¦MkÖ¬ñÓ–s®A)„à‘TwêÔ©÷Þ{ï‡~زeËÁƒsrrÖ®]ûõ×_oÛ¶­¤¤µµÚ¶m Tp²¸p°ÐVç¹QŽíÛHQUÖ€¥!˜áááA0Ï^)€…èÚµëo¼áþòáÀ¢ƒž)²' ò†r±<«KWnÚ zL¨ÿØÜÜ’(P.—›òŽ+—¾ŒL ëºJUĬùâ9O‰ç-”}ömäžS»ëm6½=z4Ý`DD7u`CÀ ªüA6£Ž»ñâYK:ÉŸþÙ“o>ÏI .ÍÑëx+ˆ‰‰‰ àñx]ºt¹û²MŒ›tÊ‘ˆñ:AÇÀp`y‰#r`‰Åb¡Pˆæ“$)7*œ‚¬¦øH1>‹ÿi¾à∠»§'ÍEu/ΓQpÇè9HÀR*•W®\IIIií[0¬œœœûî»^zé¥>ø ­{ïc TVV¦¦¦ºX¸)EEEhüÍ7ßh4š-[¶]Y÷îÝEEEuuu<òHMMM¿~ý(ƒA³ê“'Î|"Q¾¢JSo¥³›ïVÕhKLê"ÑúÅèÑ£I’ŒŠŠŠ>}ºG´Y˜êX‹°ºØmJñœÀ°¸CF¸^…?éNãi›ñªË•óÍ-†|‹qáauKžù˜à ^Ô¿”UÀ«wÌÐp¹Ý»w§_Bº°Óã´EÖŠ+žþùºººøøfd ‡QÇò[-¯÷ëçÄòÖÞ\½zõžý¤ÃNÆV›ðV ——g6› …›]Y1Þ¢SŽDŒ× ò8†+ȃ0øH ••Åãñ˜g©Tʼÿò룦ð‘ b|ÿ°À4jBÞ› ì×ÙªßâžHJC€!`@NNN,ÄéÓ§=ÚYŸÆAÀjíêLkóæÍÈsõêU°Z­_}õUVV–R©¼téR¯èÈšG§™¯^a‹#=¨K?½è¸´~±lÙ²ÖîX;ÁêjWIºrX'ZŸté ¨T*‹ì…Œ0$‹;h˜ëUø·Ý¡üà ‚¢@|³ØRQÆŠŠiºíÀêÍgÊ®·”Ô4lŸ”}´ºxñëEPPPðÌ3Ïìß¿?11Ñh4^¼x‚èÛ·oÓ º®r¹\.—·ø‘N¯~ X@«ü¦U¥¤ÿ}™²›%É<û…³Œ¦Óa³ÙÌB³ ã&Ñ…ƒñ"<oüøñN_’J¥7oÞD“XÀÂ`ZK'¤¶è˜˜ÿ–(·)õV°e[ÕêOߣÇL+7·Õ¥a ËéL‡™Bè€UXXˆÆõõõè+â“¶¸|üñǧOŸ–±È‚¿¶Õ>7×|õJs›:;êvÕžÊápX,3ƒÌ ¥!„ØV|Q@ú²›®—÷A(ŠR«ÕÃDtäszönQø`EÆ”†4hIeø÷§‹ÕÔÔŒ—ðþì&O2ëÑLÑÌ9¼ÑÌtáÂ…ëׯ7®¤¤äâÅ‹F£›>¡7XÁ !–òLée:ãÉ]C”Ýä5”~ Ã#ÉPYçîƒÁ`ÚN`8°0˜ŽÁ¡Ž;6>c0­Å?¬èèkFË“%ÊuFû™R»yƒµªZ/`•——3'Fã¥K—œ.ÆÜr`Àt`yP‹éÀ¢‘²ˆ5q¡§R"ÞŠ–t㲬Vk,‡µ·{ØÐõ+'9Ý) ‘}´F“–Áœ¿fÍ_°€Í0aYnÞèÄ=ñ ­Vk6›G4ÊéΊÉözÛú½;]†}ìÀº¸P$_;©‡ä¹W@&³ItÎ`QQѸqãþþÛ¶þýû;Ý úH¥R§ WS!³ûeLgN¶jÝììloïN Æðz{UNvr«½±:>ˆ¯ƒƒy£V1`ðý82›Sö>7Å÷ƒˆé\üRÀBÝ>*Q°’ls­ÝŽ­ÐXÀ:yòd‹uÜ—,Yb6›Ñdaa¡Édrºdà™°Ú˜BÈt`…²È™2AVrØ)OÊ"ìþF´d}|h»ÑÏ,»Þx¸Þ¬Øxáf…oÞÍ¿í‡Çr¹ü±Ç›;wn«?R;ìãNT–uâžxí¹Ë`¤ßr3†»³¢püd46ž8DiT PU¿=Û9ŒÎ*üÛî[·™àñ€éÀ¢ùùù/¿ü2=0`€Ó7MIIYÕ€;;lh⺡±±•ÖÈ‘n —^¤´´4…käÀÁùƒm¦ãƒˆñ:8ˆAÇ10¬ bÀàûqt¸å‰í¬=ñY|?ˆ˜ÎÅ/,‘HD«×*Žh¨Ýº?·ÆZFe"µZ]PPàzkظq#štÑø ðÊ`µEÀª©©¡»œr â©pÑñ”ð]¤qû * 0?LØ‹ßèj¦’Í{ü†òÿÙ»ïÀ¨ª´ àçNOLB„Dz 6a-XÖ®…¥ì·®k]ûÚ@°¬ØvWÁµíŠ®ÝUT$ J'$Ô é¤·és¿?îäÌe’ “ÉdææÍóûëÜ;7wN|&Ѽ¾çÜë‹ê®nÑ'­ÿÅø—g¥’×ÿŽv¢¢¢˜Â¨Ó<XºÚê0Î$0•0ÜÐVÀݘ‰>¿ÂmøÅ³XÝu^Ñn·üð×ͯ¿a5»/TÆ¿ž# a¯îÀêã!’¡üå,APÀjOù!BxõÖß«¬¬ì+‡ç»ˆøþ«„Ów\ò]—áÏ1]¶l™´[_BíuñÁƒ;Û«7ò*`‚pî¹çúùå…G>ž%k¼ªsºž¯j¾ºŽý+eÈ#ICuΣcJ“¾Zݲ ¸Þâ:­3ÎkƒöÞRÀÒÈ:°ìWú–——wñÅß}÷Ýò&¸hll)/`÷ÿk“'Nù¶ÉêùÚ÷Öˆv»h1×ݽÐUïY·ûTesÿÌ,¯¯MHHð:3þ|i0zôh^Ì‚.IMMÝÜâI¤ýºNÒÓÓÏ|QPYæëø#“UƸO€žÐ‡A‡ièã9ÒèÀêã!’¡üåò$$$ †0NF™”"„Wo-`ñ¬{î¹ç·o½_aw·†¨lÖ% ‘ò+}w`ñÖ>üðCÆØÉ“'G4W óG¬?­f³Ùθ£V/"íçíå矮©©ñçËõ?o–÷ò|Ò`™v¤æùS-—ßöÇ;v|µ97áå·úo;RuïãË*›«Þ[éó¤Ä«ŸV±,yV¢è`.§‹}¨©©EqÕªU'NܳgOfwfä;¸éBÖ˜1c^­nᇱ'Õþöšº;8NxöòñTËWÖÊUí{¬þüç?2„u¾ƒ;œQrrò†YÖö-bk‹ëåBÿTÇèGùXוÊ)tæ$!ÒÐÇs¤±V‘ åç(ÿ“íWR~ˆ^½¾€UQQaÅ¿Õxþl»5>2Z%ðò¶Ÿ,ÆØSO=ÕúéûÏUl8+áoŒ5•ü88aaB$“í&¾ÿþà~#aäÕ%q:ëׯïðú’’’;î¸cîܹW]u•íðY…žÁvFšn/i¶ãáÑH&Lè¸D2|øpùaTT”¼ §ýŠ3…"£T&wuF+Ö²Rß×w†W óó󝹿šàLζòÒþmí zƒvèÿ¿vìØ±;Zí¹-6ÏÝvÿbÝú?\[g^YÕÜ¿ÿöU™™™^' ðè£2l€Õ Z­¶!&î˜Í]Em6yJ“RSÁǺ±“Â8"X¡!/`aw€ôú–äM4ïñ‰Q — #GŽ”ý\BÈ3?\ÿ—{“Ùi½BK“¢jÕ\ptH²€5{ölQŸzê)é𫯾êðú¼¼¼—_~yݺuG¿þ²rÞ¯UmK5ÚmÙž?G½¢INN....,,œ7ožüüùçŸ/?T©Tò5›ŠíÀbŒ©û{þeSSà"my›[yyywçä7C±gŸoíðQL£õq±—!C†DEEý¾¤WLäl IV4±NþoRDDDjj*?Ôëõ&“iÞ¼yÆ C«;RRRäë:»´Š0Ä[›ùX;,"ht`„:°º©·°~ûÛßnß¾ý‰'ž˜2eÊ3Ï<óÐOþ«ÎÌ_1jÔ(iìgV–Nýú@£ÐnEX¤JXÑ?vÖ¬YÒa~~~о‡pã,©[mΜ9Òá×_-m楲²’1¦Ø iFÕóO;ê†[£Îö´Sy°cÌÊÊ’ÿ¾ÎÈÈh¿¦L¾&\ѬTO«áÈ¡Àn"/`™Í溺:Qt…硜ÚìÑ]úZµZ=jÔ¨:›w¢®ÒkM¨J•wÉ5-.‘uþ/ã¬,ÏÆXÉÉÉ‚ ¨Õê'Ÿ|2;;»KÓ¹ÔÔTy˶Õß}Üsss{fF³•žLiû· ×kG j!zB¤¡çH£«‡H†òsD댔"„Wo-` ‚0qâÄGydÛ¶m÷ÝwßÔ©S?¨7óMÂ'Fj§ p·{øYÀúcb”Qíþ§áÙæéL¹0Zw‰Åýì“999=9/oÕ›6ð±6{¬ Ó…òÝ© qˆÐ" }]Õü 1Ú‰SùãÚÕÓc Œ±ÂÂB³ÙÜþ>½‘W– sçΕÎ|ðÁí¯¯¨¨˜¥ûsR?óE‹ãì—ßd*5/`©Tª¤¤¤ßÎâc¾$S®×°Rúó±£¼ÄÇ•>„«€•ÒäiõÒŽÕÕ/_¾|ù¬Y³ÒÒÒš\âökÅèI1·ÿ9æî‡#¯šÇkÁþ°Ú·éA`RSSí"ÛÙêy:ªmç¶0Χ3–ÜïøX‡õƒ„¨Tî¿&zu@hÈÿÞA@ˆ°T*Õ”)SÞ¯÷”–L[¿ËˆÐ3Æ-Kg_(ýÕ}N¤ÎÔÖ~Uët½^Ó20=Ýôä B´»F.Úíï 4Þ›år:<؃ßIy°c×_½4X÷ÑGMï®v–»KN§“1¦:qôÍô8]ÛVÜuN׿‘S¤ö™¬¬¬É“'Ïœ9óÊ+¯ìì?_ä¬;°äÿGB±›¸³Ó— §*¸ƒÅbinn–Ÿ MËU]kw/7si´š¬!]½ƒ´;/E;æÙQ ¬°þInk•í¬¿£ƒöÉðr–—¶È X¦ú¸zX¡,€n"RÀbŒM:u]ƒõ¤Ýó@®ÒÜ]<íãnµZ¥F˜Kc üäúF«CdT÷Ô ¬­^£ؽIÑ`,س§¿òZBÈ›>}zjjj¢FõJ„µyå#U³§ÔݳÈvpÿ}÷Ýç¬([tlOŒªíAr‚`^t×ßÞ{_:JKKûù矿ýöÛ?þ¸³·ËËË«®®.,,ܽ{·¼–Áñ:šF£‘oè®4ò%„††@ö®òj¿bŒ•••ukNþ±xi8ˆ©ù?¥¹¹¹¼YXXÈÏ—”¸›Ñ:û—1 X=AZŒ¹­Eֵï¬Pî/мæeÁéþÍ|J¡Ï¹ doM6‰ !ÒÐÇsÄX ÊÏ{`‘òC„ð"UÀ²‹â_«Zø™KõlNÍ:YEX]]]ZZ*Š¢F`—š"ùùÿ5ZcÒš8ÃÌKcnû¯a1Æ®02>XÝsßE(µïÀbå%«& _Ÿ•0!BËcN‡å›/+o˜õáÛ57_ar9ø×ÆÞóÈ„{”7ÁžQNNNBBBVVÖØ±c;¼€ßÍd2 ²æJ#/`E·6û¸²3í X¡éÀ’°Ä³†v“œœœöX¢(?îÞz©K{`A7Iÿ$w›íö¶gi±³âÌõÐí/ય3ú?ÌMÆTø_ôÁM"@ˆ4ôñit`õñÉP~Žz½¾²²²°°°°°0...ÜÓQ"å‡áE§€5eÊ•Jõ‹1Q•9X:£fâ‰Q¬£–Ëåš5kÖc7ÄEôÜ[ 7:ÅÍ-6Æ/²DÿþÞø×ÖªúyöuÊ*9æ8à³çÅ«€å¬,¯¾ñ²éÇóS´§}*4ûmF­³Ì³Ù“úº[¢ÜôùÈ XA¿y©ŶÿÇhpÚÅæ¦®ÞA ,Íð.o€ÅµïÀ:räHuu5c,>>^¾£¿\JJJdd$üî '=ÍÓ*Š{­žçB†k¬­[·ÆÇÇgddðGš2Ƭ›¾mîŽE6gé°®=ûŽF@È$%%eeeu¸ΈN+..nĈ«ßøgìîã'¯6FdèÔí—Ö××ïÞ½ûÖ[oT ÷&yV«­k´ØD166vøðáü¤~ÚýÞûŸ-ÉÝ3"0ּ楞üVBD¾„P´Ùêî^èªéx­¥Ü›m‰-ï‰ùô–g|"?â;…ù°øÿx Qkÿ^>Ž3!àû´ïÀâ½¾çž{ngÝs‚ Ì™3gâĉ3gÎ ¼‹°¶nÝ* Î=÷\_ûÑGmß¾ýÛo¿ÍÎÎìÝÁ‹ gŸ}6cl—ìA„Ö¼]ß|óMû‹å¿ Ïøó€'NH^¢-fë–ø_7Z”ÿÓÝ‹ôDˆb‘†>žcJJJVVÖèÑ£Fc¸ç¸>"È‘„¾‘*`sÎ9Œ1¦RE/¹‹Ÿüuœ¡A¶üM"-wÒ lA¼g÷«5µ­vclÊ”)íoÞÿ×óYÛ6r:Z?}?¸“÷Íjµîܹ³  àäÉ“Áº'/`ʼnÎÖµoòó[ª1‡N=ZÞxÓ‡_ÜT\÷juË«Õ-ëãR}¼î‰Š¦„@û¾ ×t`1fHÄÇŽò.$rýõ×ÇÇÇß}÷ÝÒá¨Qîu|!ØÄÝžïi¿:`sé"£»OqqqBB‚Ô;ÖÜÜ\YYÉNïÀêöL¡k¤Ö³§€5Ò ùö«¯¼.«¯¯á…øáPTä.ë[­Vé׋uË÷¢ÅÝ vÒîÜoq$$$ý}û¬žB !Ò€ @ˆ4 G"øFª€ÅEÌ™«Né/#UBÆïçJ sb |¿'‡V÷jµ{ø X‘‘kížµý–¯> ú´}زeËĉ³³³'Mš¬{ò%„¦ _ò?2ÕÉ©«û ªsº÷Óù¡Ù¶¬²yYeó}‡J¶µÚX7v/âÅšÎÌ›7oóæÍß~ûíÃ?Ø[„Œn@·ž8îÿòIfffTTc¬¥¥…ÇÑCl²ÖAWà?øRŽ| àÑ£G«ªª>ÌÓëõAü|‚Ÿ†Ê«t¸ÊÚžÁª„cßz°JJJ^{íµæf÷cÎøóùÇ[úkù~=?óU£•õ†þÊ^¤'B„Cˆ4 G" È‘„¾Ñ,`1µ&òú[øÑ”òc®S•Œ1gUsØYÛW "ø5 “§7¶­—ë°€Å;’<Ð*º¯q—·´ô´½{ÝïUUUeµZƒrO©?3^­Ò~ý)?½èŽ¤Ì³Ú_,õ¬1Æ’““ƒòîí%&&æääÌœ9S¾™2ñò(cÌ\x«_¿~üy|=½ŠPþq=®‰ðq¥?ä¬-[¶ˆ¢È›4i’^¯ïæ¡«¤cl·ÙóœÐ”úêƒÊ/+))©««{ã7zn&Þ,Q´mÝÄÏ|ÓdeŒ¡ C´€ÅXä572­V÷sØN]7«ö÷ó«fN¨ºdróš—›JK&Ej§DêÜW ‚é–ÿ»öÚk/½ôÒë®»®³MBú ïšlüÐÂ&¬={ÜMd¢(k¹Y}}=cì7ñŒ·_%¥F\=?##ÃÇWáùqŒ1uÿ|ì¬ð^ Ú™S§Nµ´´ÈÏ$$$„¥€UÛÍ»ñVaaá| ñÔÛ°°<«ÇFh¿þúkùeÒÎk«V­r8¬¸\.ùçêêjÇÑCΪ é°UdÛ[í X(²,U|?ý%sù¡ëT¥uówÌåtV–7­Z6óó·O‰á¯j&NM›6ý?ÿùÏ—_~Éÿo/##ãó ?´|ý9EQׯ_ßÙ— /`1Æ‚² Vkk«Ýn×ìÙ.`Q·üNÐë{¨€Å·I"@ê)`©ÚþD?#¯ö+vz‹ïÔœ•å®j÷Þf—èè?0à[I9ò}Üúé§Ï>sWro¼ñÆîMqöÙgKO~”°.‰Ñoþrü2©€uâĉ>úˆõÀÏcYY™Íæ©ï×ÔÔXò´_mm±ÙE‘¡€T”~©öY‘äHB¤9€Á7²,Ƙéá§ruü¼ÞÑj0`€‹ýÁ XÜâÅ‹»yO˜Tmu‰ùã=OœgŠØpû"‹ÅÝ4Êoìܹóûï¿ú¼ê³õUU¶?ñÃMÍ6†ö+èÊ,ÆØ¡Ãž®lžx¸z瘩W\—ðæ'ús¦Ë/U꘻òónReg]£lá7_~¹nclåÊ•Á›µ7¾ƒ»$XXÓ¢t“#=mhQó~+ ÒÓÓ¥IŒ±‘#Gfeeñk¦M›–žžÞýw' 5ÚÈÇÎR¿uzý…¯R©L&SZZÚM7Ý$é¹O‘m×Ï|¼½Õ6p`àX’äääèèh~{Ýu×uóž°Õ«WïØ±cÇŽÓV¾¨9Ë]qV1v§Æ²ýžÿ“å¿7¤&¬àòúxG?ÄŸmêLH|X¨bŒñÿ÷?.˜²¦´fÙ^2çJÿïf2™âããkkk×7Z®6ºWÍŽ5üÜjgŒ­\¹ò / êôc¬¡¡á½÷Þ“Ÿùá‡æÏŸ?hРåË—|[gÁ¾œ(?ŒùÝ=òW§N*m?vìØššé¤Z­¾öÚk~Gb­[Î~Iì˜{c2GY×:°~|å…¡.›N§k~ãÑjI*<üü€¸µµ-;Z[­VkÐ7 ²íÝÉœîÏZ5Ww X<dzÎ:‹?[`Á‚Ýœ$‹þœéñ¯¾SùÇ[µvcLÅúûÿÀ»Qëø[Û56›í¡‡Ü§•••IIIÝ_¯Ö†S|\>À]G+¸ˆýRí›" È‘„Hr$!‚o}¥€uèÐ!~RÕàÝE5Ò®RýúõëÒ ‡ òóÏ?ÿOVÀº8FÿxEclýúõ»wï7n\p¦ÞfõêÕŒ±äääÊÊJÆX]]ÝÚµkµZí²eËøZ¿®ŠÞ»õSÏ׎™ õã?æãÒÒÒ§Ÿ~º¼¼<&&&999°·cŒÆ3_Ô{)i|ì,->ãõ¢(]m4ü¡_Ô࿯p2f–½:ϨŸgÔï4ÛëO'Ü©Ê7Àú¥ÕÎëN‹çÈ;°† 6uêÔnL‚LŸsÑöËæOþä-ì×ý‰Qÿk´œ°9½.>~üxP XÕÕÕ|œ¦U§ÙÛ–Z«5Çâ¥!–±_ª}B¤9€i@Ž DðøÂÔÔÔØØXÆX}}½TýaŒ555IÕ«‰%ýÑþc³û‘ðŒ±,:Sç~Öáû↓™Kìvû‹/¾({ì1µZ-‰÷F ±ÐóXÈ«|- LKK»ÿþû_|ñŧžz*à·£G;гս?K+++Õóói±Ã V'DhíwÿÖÕPœ)¶)߸ž··ÚããヲÜïŽ;îøüóÏ_zé¥^x¡ûwƒàrž°²ªY~&B%¬ìÛ¾àÝþᘩ­­åã ¢=Ý®aÙ…UÒX0â,ÆØ°aî­Þ}÷]iÀ;ºÚ~Å2dc¬Ù%nkõ<pfŒ» &=Ú/ˆŽ9"í\“˜˜¸`Á¯¨ŠŠŠÀnë¬(‹«s/ðq *ý¹Á_ùH^Ä ³øØéÇÂ;vÌŠÕëÏÔ1§>~¤þO¿ëîäN§©(åã½ÝÛK®ÿþW\qÅÿøÇÙ³gå†D «ny¦ªyÎS¬œ¥›Ÿbòº2X¬ºº:>žãùÏ|¿eÕªU|VAy/èƒè°.\( žyæ™ææfÆo\ à¯)¾ljC“•Ÿœ›â¾´Ö/ˆxSÃ!Côz½Wé÷”u•õÇo=o‘’¦2ÆöÁå1w?s÷Ã1w>5ÿ·o ´CÖÓ×ô²'{ìÚk¯}óÍ7wîÜùþûï?ðÀ---ÌÓYR$ˆîy–ÛVQìf‹XŽTñ_n555±¬pªÜ¿êã¶»ûŸÖ„”V}}½ô4ø¸¸_'ÇiÛ: ZOmWz,, ~ @ˆ4 G" È‘„¾Ñ/`iµÚGyD¿ôÒK6›w`¼„1vÜæ.6›Í‰‡óumÕk¥š-¿ *>áòF~;û¡ü³«J>ùä“;ï¼ÓóNïí·ýá(:ÆÇÇmNÆØÀ¸ô.¼×©¶¶V“žùmŒg›öql)kP XòßT—Eyvyû¬ÁÂÇz½~„ Þ_ àú,ÆØo~ó©ë¤¼¼|íÚµÝYBh2™øW­wx¶T¿:®ƒÖ¶mÛº´ìËår=ûì³ò3^S9räüùó/¼Ð½eU`Xöü}b«»—§ÒáÒËö}=tH„RÑópú¸xûöíGz.6\r…×qqqùÇ'õž¿ög©íŒ1Qäë,`9e¬cV'ëÞ#¡·ˆŠŠ2 Œ1³ÙÜÚÚººE¬i«·FŠÎ™1žfÀ¢¢"ùÇ,0¼€58.v ó´\}*+`M˜0¡«ÍàúDK«ÕÞ~ûíÒxÕªUÝYBÈdMXùɬ­‘a|„v¸A㵄pãÆkÖ¬ñÿÎo¾ùæÚµkåg¼:°$)))Ò °,뎟øx[‹-dO*¥·ž¹JçÙÓÊqâ˜+·nÚ”å).¾Ôë“ÉÄ[SÛÊÏ\­3ªOûñ °«ø87MçwÞÈ‘#¸G/GªäMX‡KJåÍP¯\uéš5k¤OÙlx7=Žïà~…Ö©bîrØ^³]jú“L›6­›ï^ðÃHB¤9€i@Ž Dð­O°cK–,‰ŠŠbŒíÙ³çƒ>N°„É XƳ‡é&L‘Æck3L©­§u`=ñÄÒÎñgÔÔÔôÈ#:tˆ×)ìù{Ž$kT¬“V`X¶žõƒ[CXÀ¢·ž¹6"†'|u`5ä~Õ¶s¶:)Åký k+`í3Ûk"¢¥3:AøUìií*^ËKý$_BxíÝÚ´iÓĉ¸G/Gªx¾¸¸¸¶¶öY+bßö×ý:++K:<~üx_ßR©]#° ZkùÉ÷ëÍòkPÀ :ü0€i@Ž D#|ë+,“É´hÑ"i|äÈiXÖüùó—.]ºtéÒùóçG\ök~>I£ú‡Q7¼UTTüõ¯õç¶+W®,//·X,|Kš†Çï›—ÿÓ{†&NÜ»•µ-óINN–ôM8¶]¿ð£ŸZíqq¡x!IMqžª¢|¥^{)'=å-}ÎEL¼.à)üå¹çUFäI“¤Â+ ÆÂè¡#¸ôR¼ê½iÓ&Qw›í%̽ŽU´ÙZÞ~mØÀÒ¿º¿ –ÔuqŒÞhw?Ý¢Å%Ê—Ä2ƦNÚÍw€¾¬¯°c=ôW·Q`¬Ù³g¯X±bÅŠ³gÏŽ¼òzy +A£ªYt­å»¯¥bSQQcì¹çž;c¥©¸¸˜×¹ cÖm›íû¤3IÕÀ-žø3s¹X÷:°ìyb‹»#¬Êá:fsÆÆÆvõ& ±öKæ[9JŠ™£ãýÎ,Ëx»ç‚úóf´¿FêÀbŒ}/zVæDén=<)ɽýv,ÑbvV–»¿\d¦!zâ$(ÿýöÝwßIƒüätþjók/<{d[IvrÁ°ÄÌw^myÕÚÁ]üS[[Û_«^žêùeòYƒ¥É%2Æf̘qÙe—Ýpà ü@úP+11ñþûïç‡&“)33³»7Õhãž~9êæßñ®²’º;n­àvQ‹‹‹cMMMO>ù¤ïÛÜÿýf³{¹Íc-ÿ|ÕëšÖßm\ñ°ô¨T*ÆXuuuW‹¶Ûøx[‹-:&FºU444„æB&*¡_…½íŸ¿Óá()îð²Ã[6Ö·=—M£ÕŸs^ûkx+¿±E7n2?ñ‘=:»k&€–óä Þ¸WêpÅ´fÖ ½©âX[¶l‘uÎQ%ºû7ù#N­Ê8y´qùƒ– ÿeŒ½úê«MMMeeeyyyõõõ~¾—¥¢ìÝô8i½³äZ÷/´7Þxã‹/¾ðÚÝ‚?Œ D#‘äHBßúP‹1v×]w¥§§GFF.]º´°°pðàÁA¸© ÄÞ÷ØWNüœùË«¾ý¯I½þúë|Ýb{xÿý÷å‡ö¼ÝÖ­?´¿²å½6þ%´ë¥r%&“©P¶GugÛ`UmÚÈǺÑã…è˜ö×ð êêêbï{Œ7vk*/Ö¸ß"€–ãØQ>>)ª„vK@/GªxÿE4bÒãÃOwv½y݇Œ±—_~ù‰'žX¹råèÑ£M&Ó’%KÎøFΊ²~þf¸Áó;pÇàQy;cL§Óá©—=?Œ D#‘äHBßúVË`0¼ÿþû‡^±bïy Aø»¡ßêÍòM¶-Ï?¡i+ØíöÛn»­³M¸9"Œ½1oGÍâëøa¾ÅQa÷|aëoÕ,¼öIî"HWWÚ÷îàãf{ÈvpgŒEmýZ\\Ü1«§¨ä준eÝç)jGïðþi¬¯¯×Ž¿‘yžo8Cå^™Pë0—k >®ô½©’?ùA2vìXÃŒ_f]&Š*µüUëO?ÈýñСC/¾ø"/©ó¡úÐøôÉVÏ4 3~ŸŸúš‘‘¡V«;ù:è.ü0€i@Ž D#|ë[,ÆØÔ©SÓÒÒ‚~ÛÈXã]¥×¨ãûsëJ‹n4Eð 6lØÐÙnîååå|<@«¾Û\%67ñ3ÏT5ßRÖtZێ˹Xl~1ͨº¶»³¬ÄYå.x™]b%¤,zL&S¡ÍÁìã]ZÄǺ‘ã:¼&66VZËÙØØèt:_©ò<Îr³Õ*vzËϵ]5»=õÊê(lvÖ·xíñ—’’"=ÿÁøàòȫ晞_]øÌšù•ù–¶Ï°Ëyèï«cv»½ªªJ:רxÚ“UÛ³.°|÷?lÍ·òÕKæÌ)++«««;|ø°¯ð_Ÿ+`õ˜˜ÆØÖ[ÍxÏ“¶îIŒŽR ¼⡇’¯øÛ¿ÿ“O>¹råÊÏ>ûŒŸüSR”N¶ÎëÓˆ&ked¬éÙרéíׯ®2ÊÊÊüŸ¤MÖ~µ×b·‹ ì“É$ïÀr=ÔÁE.׳§©5¶Ã[©T*©˜(ŠbIIÉ/§êŽZÝe c³côLVÀZ¾|ù×_íÏ ›ó÷ñq“)`A/âÕ5v¬û³§ê—d|òÃ%—Ç¥ p1öQ½™_“´o»×MÎXÀj~í¾Ö^³Ýòà Á¡ÓéRSSñ났ààÏò;œs‰%5ªÿëµtéÒ‘#G2Æl6›´›rË›kxìOß~öé£>zÿý÷óbÄ0½æ£§iËQ£r:7n\´h‘(ŠÕÕÕgœÞÑÍ›øÇ«ÊáŠLJöuµßèåH•¼K¥R]|ñÅòWsrr¤ ª®Íž:¬|á3óYÀr«_úÖ¶µß>³}C“µýÆ[ÐsðÃHB¤9€i@Ž Dð ¬àà¬ÆÆÆè[¯JH”#Uˆ¾¼hØ¿¤ÄL‰ÔNÞðiË»¯K/ÅÙ,k3L7µý¹¸$!r¼Î³x0æÎkêÜûÉÿ&Ô qÍüpfc¥Ýn÷g†¢Íæ8”Ï¢¯¹æšiÓ¦uõ;Nêp)°Èš°æ{]ÓºÛ³&«³ °$|½•ÔuÀ⨌ˆ–Îhvm\Ä®]»®¾új›ÍÆó§ëç=¶.î ééî_Þ{%$$°ä‹4cÖ\ÏeMƒ†ðÝý;»•üpðàÁç]~…á¢9üÌS©1¼Ê飀år¹òòò–-[6Ü á'£†>|ø¾ÿÌ‘ªW^yåÞ{ïíð%)G^rÚž:ÈìrÿJrV•Ÿµç§ÔÔTéÐkaiié”Hí„Hw=UdlEe³J¥:tèW\Ñßt?Œ D#‘äHBßPÀ ¾„ðàÁƒ ,¸è¢‹X7×[Ï?a©žµÎùåðÍÿY÷§²FG»׿êÌë,EEE·Þzëºu뤓°&z X)U%þÌО¿—g嫘ÒB¹a|ÈH"t¶åè()[=«D­¹ßñ±0é\ß·ºí¶Ûäÿˆ.\(Bä øgäl½g©ÖÆGýîšÕCõm,Axé˯³³³ýü¦|#™#U·ÜrKg/I9òß-»‹K×Ôzšªš_[5Öų­ý§yÝÅÇ¥—JKKç üÊ MÖ–™õõõ|ê©§z⻀Îà‡‘„Hr$!Ò€ @ˆà XÁÁ;°ä65Ûþ5ö|U|?¦RÙwïèCÕר»9¿¨Õ%2ÆþSožUX“Ûbã×»2Îz´¢‰1ÖÐÐðöÛoçç»ÛyÚï^¤7™©Ýå‰Ìi«,÷==Ñjµ=ä3vÖìËù&¡„„³K€‡VpÈ´Zí©S§vïÞ=þ|MF–á¢ÙŒ± /¼_£R©~ÿûßK_UlsþÒj¯:JHàuÛôôô+VŒ1‚µ£Ÿ4[6}ã{zòõƒ%‘±ƒ òÿ[ –ÜÜÜ3_ÔÛH¬õM~ƲñLcæ/?â'ÑF2Ahÿå^AX½zµÑh\´h?i×êþ^íYÛõ›øH©µª³&¬––ÆØ¸OK7:˜,’9öAR޼8.=:à“ËáÁ#ù5™:µï›Ä̹òãÏ?ÇVá‚F" È‘„Hr$!‚o(`‡¼kìØ±ýúõkÍE]ÄÇ“'OþÛßþvâÄ ¡­®‘’’"=öKnÀ€K—.íß¿û»ésó”ȱ„P ðÃHB¤9€i@Ž Dð ¬P3fLg/uu !c,ñ¬Á?ÈŠ­ýËë‚Öÿ¼ÃÇEég z= “âââp½uÏQ«ÕF£‘1ær¹êêêä/Iƒ °r[lüY„–W“÷ï÷–÷ÞàcûðQšÌàoyF2Ç>ˆç¸|ùr~ÒGë®»î:ï¼óœžž>uêTþ@U#ü0€i@Ž D#|CKAºüBÆFýq½…š×}(67ñCgy©ù»õüpÈ=cš5*lÍ_=Š7°:tÚ¦T=QÀªr¸YîóL´ý²U~¥«æ”ù‹<ÇWÎëÎûv†jŽ} ÏqÑ¢E×]w4–°bbbä×OŸ>]„#GŽmݺ5;;;dS…Îà‡‘„Hr$!Ò€ @ˆà X @ëâ‹/þªÉÂ÷ö[š[×}È_-}úaAt¿TcJ™1;x“·~ýúIƒ«¯¾º  €Ÿï‰cl‡ÓshÝö£hnµíúÙ¼î?ÍÿøkýÒÛD‹Yz©ÔýÎÀ/¯¿þzff&ë¼+))iØ0<  ,i¿„ðŒ{` ><9mÀ¿j[ù™–7^vÕÕ2ÆŽ¬ûDóÝWü|òïî ÞLÁãù矗zU*++ï½÷^ƘÓé,,,Ü»w¯tAp X#|\÷Í›þþ|ÍÍsë¼£é•g¬Û6ó—^¯i6Æ1?Ƶk×jµÚ7qgmíWᘀ X @cìâ‹/þW™oåî¬,¯»kAók/¨»‡ÿÅiNIKºiQ0çÚu¹¹¹á@™6mÚÇ,÷ïßÏ›>}úàÁƒ7mÚ$LOOïÎý½ Xúh[[ÖúšªºwW·ÿ’]fûÛ Öˆˆˆî¼og¨æØ×xå8eÊ”'Ÿ|RÞ¥ÕjùGhúôé!ø?Œ D#‘äHBßQÏ|U¸ Bï˜g÷©Õjéav’›o¾ùí·ßöý%k×®?þCÉÑèÕÙ5 ÿüX7ùÜ ÍNçp8bbb, c¬®®n̘1òÝ+**ä-]õÀ¬X±‚Nž<ùᦒ‰*gg×[\â¬cµ§ Qõõõ¿)ôA.—«¥¥E¾õÕ\pèСªªª;vŒ7.Œs€Þ¢ç 8èÀR¯v:°f̘!Âʪæ–Ž‹Â침^õ(FÃÊ–ŸŸ_YYÉ_ŠˆˆHJJêÎÍÛ$^u}ûË´£Çë&Ne:ý3UÍG­Žèèèî¼)ôA*•Êkãö~ø¡¼¼Ün·;6\³ €¥,^›^ùSÀJJJJMMuˆlIq­/É)²5.Cʳÿò,¡þP¶Í›7[­V~>==½››y}4ÍÈ[—´¿Ì¸ôÉ„·>m|÷¿¯×´2ÆPÀ‚`Q©TØ Â,eñªVœqw‰ô€° »kï}OÇÿý½è%wå˜ðju˼¢º“9³˜2þøÌËË ÷zÐÈ‘#¥Á† ¤Á AƒöïßÏ·rXû,ÍaêäTùIkJšvÌÆX“Ù"-@Šêt=i7Ñαï@Ž D" È‘„Hr$!‚o(`)KKc|ýÚÂBýô‹bî¸ÿùÇ²ÊæÜÛyçüY¤›{™+ïÀÚ²e‹44hPvv¶^¯ïæÛw`1Æ"®¸–ÉŠ›ÅÃÝ+¼š››¥AÏu`Ñαï@Ž D" È‘„Hr$!‚o(`)KKY[cìСCŒ1Q·nÝ*QNËh4†{ =ˆ°¤­Üc©©©_ÞÖ4cî|0iÃÎFL*°8"Ûer¿W X´sì;#‘„Hr$!Ò€ @ˆà XÊÒͬƒ2ƪ««¥B†ÉdB ;4233###ågRRR‚rçÎ>ê¤ÔªsgÎ,¬¹àhõÑZ÷CPÀ=°”¥;{`±¶¬’’épÀ€AtJ¥R >\~¦‡:°¤%„’þýû3ÆŽÙœ¥¥¥‹åÔ©S(`I(`)‹WÅJ^­ðaàÀRûOeee]]ÝÉ“'¥óŠ*`åææ†{ =küøñòðÒÒÒ¤AYYÙgŸ}¶uëV^ÀЉ‰ Ê»·G>Ç>9€ @ˆ4 G" È‘„¾¡€¥,^,?;°T*Õ!C¤ñáǕٕ““î)ô¬I“&É{z !“°JKKß~ûí;w† ‹|Ž}r$!€i@Ž D#|ó«ÁBÆ«åÊÏ=°cÆ Û»w/cìàÁƒeeeÒIi‰„Fè X©©©‚ ˆ¢XQQQQQ!˜1c¤—¢¢¢‚òîJ€,e ì)„Œ±¬¬,ipòäIev`‘7räȈˆ~ØC,y‰S§Ó%&&2ÆœN§Óé M@è¡€¥,mâÎëׯŸ4¨®®.--•ÆŠ*`‘_ϬÑhÆ'u:]BBBPnëûÁ”|!c¬ªªª  @÷\‹|Ž}r$!€i@Ž D#|CKY|W+|°x–¼ºv}a=3_E˜œœ,BPîéû#áµJô§Ÿ~’Ø |CŽ D" È‘„Hr$!‚o(`)KÀ,ÞïSSSƒ%„á XÁz!󹄵«QšÍfi€=°€lâ®,ïÅ;° ¥¢¢¢L&Sp§¾]sÍ5999±±±qqqÁº§ÿKå°P‚,eéþX………Ò@Qëc ážB3 &“)XëY;°¸ž«]ö…ûäHB$!Ò€ @ˆ4 G"ø†–²t ¡Ëå’J[?X\\î)ôJ¾? .¬­­Ýµk—¼b5dÈ‘#GöÐ|# È‘„HB¤9€i@Ž Dð ,e x ¡ÑhÔétò3 Ú´‚aÔ¨QážB¯ä»‹1f2™Æ7aÂ~fñâÅAló‚i@Ž D" È‘„Hr$!‚o(`)KÀX‚ ÄÇÇËÏx=Ÿz)??'N”:î–[néñi„ XÊðXL¶ –$###8s‚°:c–„w`]yå•III=>-€BKY¼*VU+:äUÀÊÊÊ Îœ‚$777ÜS蕺ZÀZ¼xqÎ9Ò€ @ˆ D#‘äHBߺPð*`u©‹ïã.QZ+'''ÜSè•ü\B˜™™Ù¯_¿ØØØ‹.º¨Gçƒi@Ž D" È‘„Hr$!‚o(`)KÀ{`±Ó;°ÔjµÒ6q‡Àøÿ‘?~ü…^Ø¥¢'@¯€¿u•%X¬x=”z)?—2ƦL™‚íÛ€$°”¥;›¸Ë—fffmNA’——î)ôJþ×4ï¼óÎÔÔÔžžr¤9€ @ˆ4 G" È‘„¾¡€¥,ÁÚÄ]i`1ÆÒÓÓÃ=…^Éÿ–×&h=9Ò€ @ˆ D#‘äHBßPÀR–ît`É X ìÀ2ážB¯äÿÂÐ@Ž4 G"‘äHB¤9€Á7°”¥;{`)| !¦; PÀR¯–«€7qG‹ ¥u`„ XÊâUž ´„0777ÜSè•”Ö…i@Ž D" È‘„Hr$!‚oèæP–ît`ÅÆÆ~ûí·ÍÍÍv»=%%%ØS뮜œœpO¡WRZ 9Ò€ @ˆ D#‘äHBßPÀR–nV+fΜÔé@øa !–*Kw:°€$°PÀR¥­ "¬gŒÒ>È‘äHB$!Ò€ @ˆ4 G"ø&ˆ¢î9œ™ ôŽyvß‚ Þzë-~øÃ?œþùᛄ_qqqFF?üä“O®ºêª0Π3=WÀA–²x-!ìÒS$,!è‘úÈ®]»n»í¶¸¸8AÚ¿Z\\|Í5×ÄÆÆÆÆÆ^sÍ5'Ožì‰9ôRJ[/a‡@°nºé¦¤¤¤-[¶´©¹¹ù¢‹.?~|QQQQQÑøñãg̘ÑÚÚÚÓèW+Â=…^IiXÈ‘äHB$!Ò€ @ˆ4 G"øÖ#¬üüüÇ{,;;»ýK«W¯>çœszè!“Éd2™zè¡É“'¯Y³¦'¦Ñ~ aqqq¸§Ð+)­¦‰i@Ž D" È‘„Hr$!‚o¡Þbé‹/¾¸ùæ›ågn¾ùæÏ?ÿ<ÄÓP,¥U+‚hÔ¨QážB¯¤´,äHr$!€i@Ž D#| u+??̘1ò3£G.((ñ4Ë«ZMÜpMÀO¡®ÔÕÕÅÇÇËÏ$$$ÔÖÖžñ …Ž<öØc¹¹¹üš¼¼<ù¢YùKòqCCC^^^‡/…ýí«½ñ»À‚x‡ƒ2™üüüÞø]à¸î€;à¸î€;à¸î€;à”îðØcuX¨a=FE±ï.xß_§Óµ´´hµZ~Æn·GGG[­Ö.݇ª?ÿùÏÏ>û,?,((>|xçD¹¹¹999ážEïc³Ùôz=?üå—_&MšÆù G#‘„Hr$!Ò€ @ˆ4ô\§»÷•W×Úߪý¼“““÷íÛ—œœÌÏTTTŒ7®¼¼Ü÷»ô‘Ö<°bÅ ~xèС³Ï>;Œó°s:ò}¯vîÜ9~üø0Π3=WÀéîBQÆŸë³³³÷îÝ+?³oß¾#Ftsd`,ðâõû&î¡êúÈe—]öÎ;ïÈϼóÎ;W\qEˆ§¡X^Õ ìØ ‚ È?øH@êÖâÅ‹·nݺ|ùòººººººeË–mÛ¶mÑ¢E!ž†b~äœ|Ë7èùÇ ìXÈ‘äHB$!Ò€ @ˆ4 G"øÖ#,ùæó^ÑÇÄÄ|÷ÝwÛ·oÏÈÈÈÈÈØ±cÇÆ£¢¢zb½á¬ôôôpO¡·’ Âþ‘@Ž4 G"‘äHB¤9€Á·éæð½Ö Aƒ>ýôÓžx_w`ÆpO¡·RTr¤9€ @ˆ4 G" È‘„¾apeÁ&îО¢:°Bõe!ÜST@è¡€¥,„÷ÀÊÍÍ ÷z+Eu`!G#‘„Hr$!Ò€ @ˆà›à{¿*…„Þ1Ïî{ñÅïºë.~ØØØÆù€¤¤¤TVVJãêêê„„„ðΠC=WÀA–²`,hK C}DY/!„€)j !@è¡€¥,„7qÇzæ€)ª 9Ò€ @ˆ D#‘äHBßzÇÞR}g¬5kÖ,^¼˜:N¬"„ÁƒJc›Í¦ÕjÃ;€a¬¾{`A{ŠêÀ=ÔG”E^±¢´~ºƒT*• á @è¡€¥,ò¢±ö«†††pO¡·âŸ %Ô4‘# È‘„HB¤9€i@Ž DðT‰„ÂÏ›+..÷z+E°# È‘„HB¤9€i@Ž Dð­wlŽÞw6qÿàƒn¸áiÕÜÜÞù€L˜0a×®]Œ±èè覦¦pO cØÄ½¯ ÜST@è¡€¥,„÷À‚€ñOA}J$ÊBø)„¹¹¹ážBo¥¨,äHr$!€i@Ž D#|ë{Kõ=°¾üòËË/¿\'%%UVV†w> çŸþ?þÈëß¿iii¸§Ð1ìÕW`,hOQX¡‡–² €í¡€} XÊ"ß‹Ø&îyyyážBo¥¨MÜ‘# È‘„HB¤9€i@Ž DðT‰„ÂXéééážBo¥¨,äHr$!€i@Ž D#|CKY°ŒFc¸§Ð[)ª 9Ò€ @ˆ D#‘äHBßPÀRù²Ab,˜¢:°B,e!ÜST@è¡€¥,ò¢±MÜsssÃ=…ÞJQXÈ‘äHB$!Ò€ @ˆ4 G"ø&ˆ¢î9œ™ ôŽyvߎ;&Mš$ÇŒ³gÏžðΔ`þüùk×®eŒM:uëÖ­áž@Çz®€CªÇ‡,!„öÕz(`) XÐ XÐÇ¡€¥,Ø ÚSÔ&îÈ‘äHB$!Ò€ @ˆ4 G"øÖ;ö–ê;{`8p`ĈÒxÚ´i[¶l ï|@ –,Y²zõjÆØ¬Y³Ö¯_îét {`õXBí)ª ôPÀR° =ì} XÊ"ß÷ŠXµ¢¡¡!ÜSè­Õ…i@Ž D" È‘„Hr$!‚o(`) áMÜ‹‹‹Ã=…ÞJQXÈ‘äHB$!Ò€ @ˆ4 G"øFªDBá%„£F ÷z+Eu`!G#‘„Hr$!Ò€ @ˆà XÊB¸€ST@è¡€¥,„÷À‚€¡€} XÊBx¬ÜÜÜpO¡·RÔBäHr$!€i@Ž D#|#U"!€ðœœœpO¡·RTr¤9€ @ˆ4 G" È‘„¾¡€¥,XBí)ª ôPÀRÂX0Eu`„ XÊB¸€•——î)ôVŠêÀBŽ4 G"‘äHB¤9€Á·ðÿ= r„7qOOO÷z«©S§.]º”16}úôpÏ9 @ˆ D#‘äHBßQÃ=‡3„Þ1Ïîs:¼ËfÁ‚ÿüç?Ã;?õ\‡T„—,Åá+QÀ`(`)¯[Û+777ÜS€ @Ž4 G"‘äHB¤9€Á·Þ±·TßÙ‹1f0¬V+cìöÛoùå—Ã=¿`¬>„w`a !CKPÀCKq¨nâŽõÌ4 G#‘„Hr$!Ò€ @ˆà[ïØ[ªOí•P[[Ë[ºtéŠ+Â=¿`¬>KäPÀR°äPÀRª{`544„{ È‘äHB$!Ò€ @ˆ4 G"ø†–âðº¯dÑP\\î)@ G#‘„Hr$!Ò€ @ˆà[ïØ½Omâž™™yâÄ ÆØ²eË|ðÁpOÀ/ØÄ½¡º„ 0(`)6qCKq¨î•››î)@ G#‘„Hr$!Ò€ @ˆà[ïØ[ªOí•]PPÀ[µjÕwÞîéø{`õ!XB ‡–â € ‡–âP-`ååå…{ È‘äHB$!Ò€ @ˆ4 G"ø†–âð½Û‰mâžžžî)@ G#‘„Hr$!Ò€ @ˆà© T;°ŒFc¸§A€i@Ž D" È‘„Hr$!‚o(`)Õ@`PÀR¾r,†–ñº±=°rssÃ=äHr$!€i@Ž D#|DQ ÷ÎLzÇ<ƒbæÌ™7ndŒ}ðÁ×]w]¸§à—ž+àêñ¡KäPÀRlâ ‡–âF“Éd2™ôz}¸çLXÏLr¤9€ @ˆ4 G" È‘„¾õ޽¥úÔX½öÀ€> ,P4° DÂ=äHr$!€i@Ž D#|C B¤¸¸8ÜS€ @Ž4 G"‘äHB¤9€Á·Þ±9:6qP8lâ} X h(`Aˆäææ†{ È‘äHB$!Ò€ @ˆ4 G"øÖ;ö–ÂX ‡=° B  ,‘¼¼¼pO‚9Ò€ @ˆ D#‘äHBßPÀ‚IOO÷ # È‘€ÿoïþc¢®ÿŽß"®€ƒÒü:hÎËhCÇ?'9K˰ÕÔ)éLkVÊLšÓ«ùëЙšM0óÇ –šsŠÁ²rù C qÂ}ÿø¬Û'ÀûŠÜçýöùøësï÷½éIŒ{íî#%@D9ÐQD”%@D¸'ÆÍѹ‰;€Æqw<¦`@Ó`¡“äçç{ûð:ÊŽ ¢ˆ(:J€ˆr £ˆ÷ĸ·÷ÀÐ8î€Ç,h,t>Ï,:ÊŽ ¢ˆ(:J€ˆr £ˆ÷ĸ·÷ÀÐ8î€Ç,h,t’Û·o{ûð:ÊŽ ¢ˆ(:J€ˆr £ˆ÷`¡“”””xûð:ÊŽ ¢ˆ(:J€ˆr £ˆ÷ĸ9:7qÐ8nâ€Ç,h,t’üü|o@G9ÐQD”å@G Qt”áž÷–âXÇ=° ¼ÄÄDo@G9ÐQD”å@G Qt”ážïlâX ¢è(:J€ˆ ¢è("ÊŽ ¢Dz–Íf›7o^HHH```xxxvvv³'”””ÄÆÆÄÆÆ–––zü †çX“'O®ªªÊÎή¨¨HKKKLLܶm›k·¾¾Þl6›L¦âââââb“Éd±X<~ ÈÁóïìZµjÕ¦M›ôz½ò°¨¨hΜ9—/_V¦¤¤œ?~Ïž=®ç¿öÚkãÆKHHpwJÞI(>"ÊŽr £ˆ("ÊŽ ¢è("ÊA¤nÞ¼Ù5½ÒétƒVHðÛo¿]¸p¡úù .ÌÉÉñø1 ‡ÿW;6bÄ×Ë/Ž5Jý„çž{î·ß~ëèc@TÎŽT]]=tèP›ÍæZéÚµ«ÃáP?Çápøúúºÿ:Þþ€ÿ¯CLN§OǸ²²òå—_ÎÌÌŒˆˆhç—b†ðØjïGõ*êõ²²²éÓ§¯]»622R½TSS£^©®®nç1 «ö°Zý _yyùÌ™3“““-K³ç‡……ªWŠŠŠ†ÞÎc@Vž¿‰»ÝnŸ1cÆÆÍfsËݨ¨¨¬¬,õJVVÖìÙ³=~ ÈAïñÛK™L¦Õ«WÏŸ?¿ÕÝ¿ÿþ{Ô¨Q‹-Z¶l™N§ËÈÈØ¹sgaaá“O>éÙc@ž`5»–¢¶¶Ö`0(×ׯ__±bEnn®N§³X,[·níß¿¿gÏix~€xçïx,h,h,h,h,h𬒒’ØØØ€€€€€€ØØØÒÒRoŸ­+((ˆ7 z½¾å®ûŽTÖ›Í6oÞ¼ÀÀÀðððìììfO ¢Μ9³hÑ¢úúú>óÌ3S¦Lùæ›oÔO £XnÞ¼9dÈf¿W‰( } ê]: ¡©©)---,,ÌÏÏoĈû÷ïWïQûZþo¨×ë}}}]O ¢ÓÓÓŸþyƒÁh2™ÒÓÓ]O £¾ÿþû‰'vïÞ=888..®²²R½KDÍê¸WúmÊ*À«¾¾Þl6›L¦âââââb“Éd±X¼}.´"...44ôÔ©S-·Üw¤ñ^Ri ›IDAT²FLž<¹ªª*;;»¢¢"---11qÛ¶m®]"Š"!!aôèÑǯ¯¯ÿõ×_W¯^½aÆuëÖ)»t‹Óé|ýõ×ׯ_¯^$¢XœÿåZ§£(âã㋊Š>\WWgµZ­V«k‹ˆBp¶’’òÒK/)»DÅòåËwïÞ’’RZZZZZš’’²k×®åË—+»tBnnîüùó/^\RRréÒ¥ÈÈȘ˜˜þùGÙ%¢–uÐ+ý6gmù ]k’““,X ^Y°`Ajjª·Îƒ‡ÑòGË}G*kÄ{ï½×ÔÔäzXXX8hÐ ×C"Šëòå˃A¹¦£X¶lÙçüïïU" ÄÍßZtB^^^TTÔƒv‰(¢ÆÆÆgŸ}öìÙ³ÊC"ŠÂßßÿÚµkê•k×®ùûû+×t¤I“vîÜ©^Ù¾}{zzºrMD!xö•~[³ 0ÀŠŒŒQvé(„VX™‰ˆáÙWúmÍ*À«k×®‡C½âp8Ôï µü±vß‘ÊT]]=tèP›ÍæZ!¢XÔŸŸ:uêýû÷•u:ŠbéÒ¥ëׯw=Tÿ^%¢@fÏžm³ÙîÞ½«Ü±%44ôÂ… Ê…Э[7£Ñ¸cÇ»Ýn·Û·oßn4úé'e—ˆÂ)**êÛ·ï½{÷\+DESSStt´úÏ›èèh×½/è(„ˆˆ«Õª^Ù±cÇCf"¢Fxö•~[³ pw¯²²2&&&333""ÂÛgÁ#R~ËWVVîÝ»÷âÅ‹IIIÞ>Ú ''çâÅ‹kÖ¬ñöAÐ^999~~~}úôY¾|ybbâ|àíC¡ ššš>ûì³7Þx#$$$$$äÍ7ßÜ´iÓÇìísᥦ¦ÆÇÇûøøxû h³Í›7:t¨¦¦¦¦¦æÐ¡CÉÉÉÞ>Ú 11qåÊ•YYY·nݺuëÖ®]»V­ZÕ¥ C <,~V‚‚‚jjjÔ+ÕÕÕÁÁÁÞ:ûŽTÖ”²²²éÓ§¯]»622R½ND…††¾òÊ+{öìqýƒ’tÂÊ•+wïÞýÄO´ºKDqÍ™3'??_¹¦£ŒFcTT”zåÅ_<{ö¬rMD±ÜºuëСCK–,Q/Q™™™V«5:::((((((::Újµ¦§§+»t‚Ùl>xðà®]» Я_¿mÛ¶eddôêÕKÙ%¢ Ú®­Y`………ªWŠŠŠ†î­óàѸïHeí(//Ÿ9sfrr²Åbi¶EDq3Æn·+×t•+W  WÑét® "ŠË©úx/…æ~—ˆùâ‹/æÎÛì¥EQVV6fÌõʘ1cÊÊÊ”k:ŠbòäÉyyyõõõ ùùù&LP¶ˆ(¨ö„kkVXQQQYYYꕬ¬¬Ù³g{ëÜiù£å¾#•5bôèÑ_}õÕƒv‰(ŠiÓ¦eggWVV:Ž7nìØ±£wïÞGUvé((õïU"ŠÂl6ýõׇãêÕ«III=zô8þ¼²KG!ܽ{wâĉV«µªªªªªjçÎF£1//OÙ%¢@öîÝ;uêÔ–ëDEZZZÿþý>\[[«Ü«OŸ>Ÿþ¹²KGQÌš5«  Àáp\¹reÉ’%K—.umQž}¥ßÖ¬ °œNçµk×¢££ýýýýýý£££¯_¿îí¡uî;RY Z-X[[ëz…——7gΣÑèããÓ«W¯ØØØ3gΨŸ@G5ûsˆBÈÍ͉‰QþgìÝ»w\\Üü¡~…P^^¾`Á‚   nݺM˜0á‡~PïQãÇ?räH«[DÅÂÃà ƒÁ`?~üþýûÕ»t¾}û†îëë;lذ­[·666ªw‰¨Y÷J¿MYõ:  Ü 3XÐ4XÐ4XÐ4XÐ4XÐ4XÐ4XÐ4XÐ4XÐ4XÐ4XÐ4XÐ4XÐ4XÐ4XE¯×{û2`€àŒ«:,€Žât:½}0ÀðåíWú©•‹†††%K–÷èÑãý÷ßw:wïÞ]¶l™Ñh4 ï¼óÎýû÷]_íäÉ“ãÆóóó0`ÀöíÛ;ÿÛÐX ¼ÙÊù¯–Oxë­·&NœxåÊ•3gÎØl¶-[¶ÄÇÇ7îÏ?ÿ}zÚ´iŸ~ú©kåÔ©So¿ýö… t:ÝÂ… GµråJe+''çË/¿üî»ï:ï;ÐXžá~€UZZÚ§Oe½®®.00°ÙJß¾}oß¾­Óé|ìØ±!C†([µµµ#G޼qãFç}'à À3ܰšššÔÿLa«+Ê“»uëæp8Ô_§K—.{z ãXA=«zЊ"  ¼¼Ü©Âô <æ`x†ŸŸ_³wN=šÈÈÈœœœöi0ÀðŒAƒ=z´ýï–Z·nÝúõë­Vkuuõ;wrssg͚告{`xÆñãÇ®^½ÚØØèºõU³ ÷+¿üòËš5kòóóïß¿þá‡Z,–Îú>4‡4@Ó`@Ó`@Ó`@Ó`@Ó`@ÓþxÔA9gø9ûIEND®B`‚gsl-2.7.1/doc/images/multilarge.png0000644016036000116100000027334513510457027014135 00000000000000‰PNG  IHDRè åçbKGDÿÿÿ ½§“ IDATxœìÝg@×Âà³ì.¤I‘bCÀ†+`×Äãµ_C4öÄ|¹j4*˜“赡1÷*M¢¹–ØbŒF ŠØ@,¬Ò‹Òvw¾kÆavY–e;ïók÷Ì™™3«»/gæÌEQf¤íè:tžÎ3@#Ðyh:Ï@ç è<4g€F ó ÐtžÎ3@#Ðyh:Ï@ç è<4g€F ó ÐtžÎ3@#Ðyh:Ï@ç è<B‡Ãqtt|øð¡ÌEšoO3)Ýfu¬œmfee™™™Íš5KòÖÈÈÈÖÖvòäÉ¥¥¥*o†Dffæ„ ¬­­­­­'L˜••E/úç?ÿiff–­¦]€r8 VVVÁÁÁ{öìÑÌ~5¼¢rÛÔ|˜Þ¾}{þüù666Í?RŽzrt:Ïo¬[·nΜ9E)·º>ö±µnÍš5^^^;vì¼ …§OŸ~øðáêÕ«Õ±»ŠŠŠöìÙ3#####£gÏžƒ ªªª’,ýþûï===£¢¢Ô±khêo`ÅŠëÖ­Ûºu«¶¥+4¦„éÓ§;::^»vM%[£ê£Ë‘Ë ƒ8Jw ‡Ã¡(jàÀ“'Ož={¶ô"· ¶6^4æÅ‹nnn§N:t(³<77×ßßÿùóçVVVªmÉæÍ›“’’~þùgºdÚ´iAAA‹/–¼=sæÌ¸qãrssíììT»kPštŽ\»vmÆŒéééÞ¯éN˜*Ò*Um¹ ºWžÞÚµkWTTTAAACN:baaaaarúôiI¹ä²³ôˆ#&‡S]]½hÑ"'''fK—.™ššzxxÄÄÄ0W¹{÷îСC-,,æÎ[UUE¯(s/2 srr.\heeåéé¹téÒšš9ía¾3’JN›³$//ÏÙÙ™Y²mÛ¶ñãÇ«|× 4é¹té’‡‡ýa*]®¾0e’n•œãjh NNN<ÏÙÙyÊ”)>dU@.ƒNA瀢¿þ"‘(88øÏ?ÿ”^4vìXV>EGGÓ?èŠtž7mÚÄ*œ>}úÆé·Ç9r¤äõ”)SÖ¯_Ϭüå—_*‘÷LÅÅÅ^^^rÚ#sÅýû÷{zzæää4ÚæiÓ¦­]»–¹®ä†+™qwwOMMeŠD¢N:]¸pÁßßÿüùó2W¤›ÚÔÓ‚|>¿¶¶–YR[[kllÌ,IIIaþAZÇüUñâÅo¿ýæááñŸÿü‡.D˜² Õ¦¬ÕY%rŽK¦Ñ£G_¾|¹ºº:++kóæÍŽŽŽÉÉÉÌ ÈeÐ)è<PTý_ÿû÷ïwêÔ©²²’µÈÝÝ=33“¹VFFF»ví¤·ÐÐ.ž={Æ*ôöö~üø1ý¶¸¸¸M›6’×NNN€YYrs—œÝI/­®®ŽŠŠêÔ©“™™™$¹\®œöHoöÌ™3...=R°ÍéééÌÕŸ>}ÚÐ'cffVVVÆ*üõ×_{÷îMQÔ?ü0vìX™+*M‘Îsii©¹¹¹j÷ Í!Ý© fV@˜² Õ¦LÒ­’s\Šøþûï‡ Æ,A.ƒNA瀢¤~ý׬Y³téRÖ"“ššfµšš™[¹ VÏ¢(cccÖFFF’E\.·ººšYYrËSC»‰DÒK?þøãaÆݾ}»¢¢‚¢¨êêjféö°6{ãÆ '''zhz3ÛÌ"÷b±¸k×®§OŸ¦(ª¢¢ÂÞÞ>##CæºÊQdØ6B@×Ð9"‹_¾|ù믿ÚÙÙýüóÏt„)³DÝaÊ$Ý*9ÇÅ,lhƒùùùÌä2èL Ê+Î;wÿþ}f¡““Saa!³¤°°ÐÙÙYñÍòù|V‰µµunn.ó;)‰mBˆƒƒC^^³2ó­Í«W¯˜KŸ={&½ÇÇïÞ½»G„@ ¿=L=7nÜþýûosnn.³2ë-“££#ëá'Ožäñx#GŽ$„XXXLŸ>ý‡~hhu™³°ÈŸ³Í××÷îݻ̒{÷îuéÒ…Y’íèèØÐN@‹8ŽÝ¤I“vîÜ)Ø,)G˜2KÔ¦òÉ9.faC«K/B.ƒNAç@ccã~øaîܹb±˜.ìÙ³ç©S§˜ÕNž<Ù³gOÉkSSÓÚÚÚ¦î(<<œ9Û3Ó Aƒ:Ä,aÎ6Ù±cÇëׯ3—îÙ³Gz#ÕÕÕ¦¦¦ôÛ½{÷*ذÜÜÜáÇoܸQzO9m2dȘ%ÌçB±ôèÑ#66–Y²nݺ•+WÒo,X°gϞׯ_Ë\]þyA™«¼ûî»û÷ïg–ìß¿ôèÑÌ’ .ôèÑ£¡6€.˜8q¢……’Sf‰ºÃT>9Ç¥ˆC‡õíÛ—Y‚\Ý"ÿ;ÐBÈü.,Y²dûöíô¢k×®ÙÚÚJfÛ.,,üå—_ììì$K}}};& ›´‹¸¸¸üøãEEEçÏŸ§çÕxôè‘““Ó÷ß_PPPPP°cÇŽ©S§Ò9xð`ûöí/_¾\YYùôéÓåË—Ï™3‡H4›2eÊÔ©Sóòò 6lØðÞ{ïIבÙHÿÍ›7Ë<9m~ò䉓“Ó¶mÛ$“šnݺ•9©)Kttô€è·þù§¯¯¯X,fÖ>|ø¾}ûd®®„²²2OOÏuëÖõÕWÞÞÞ’1x´>}úDGG«jÐ|2säĉ;w‰DÂT³aÊ$Ý*9Ç%màÀ‡ÎËË«­­ëÖ­sppHJJbÖA.ƒNA瀢¿ÊÊJÉÉNºäرcffffff'Nœ 9s¦C‡\.·¡xk¨<99yĈVVVfffáááÌY1“““lfffgg7gΜÂÂBúkŠ¢¢££;tèÀçóÛ¶m% ¥³üåË—S§Nµ³³³±±™5kVyy¹‚y/ÿ\›œ6K§innngg7{öìÊÊʆ¼¨¨ÈØØ˜^·ÿþ¿üò «ÎéÓ§e®®œgÏž;ÖÊÊÊÊÊjìØ±ÏŸ?g.ýóÏ?MLLŠŠŠT¸Gh¦†r$ €î"L%o5¦JË… ÆgooÏãñÚ´i3}úô´´4fä2è¥Ô м¿þúë_ÿú×;w´Ý•‰ˆˆHHH¸yó&=©UUU†„„ÄÄÄh»- .S}\„{žtר±c¯\¹RVVVTTôÛo¿EDD,Y²DÛR¥ÈÈÈôôô h»!„²`Á@©í†€*!Lõrt®<讣GnÚ´éþýû"‘ÈÏÏoÑ¢EÓ¦MÓv£ô ÂTg€F`Ø6@#Ðyh:Ï@ç è<4g€F ó ÐtžÎ3@#Ðyh:Ï@ç ú×yÎÏÏïС‡ÃÑvCà ¤3<=ë4R÷[HÔÙH=8xBˆœçFÊo ÿ×UÝo!чFê~ ©"ºßB¢Ôý=i¤ú µK÷[Hô¡‘ºßB‚Fªˆî·èC#u¿…DÔaÛÒ¯ÿl é -ŠÞL -è<4B_;Ï kÎ`ÀôµólHÖ¬Y£í&4B÷[Hô¡‘ºßB‚Fªˆî·èC#u¿…`Øtÿ î·èC#u¿…TÝo!чFê~ ÕÊÀ'öÀÌ% >HåàsõQ_ÊàÊ3@#Ðyh:ϪÁù›‰‰‰““ShhhTTTvv¶¶Û*€Î³ÊPEQTUUÕÇ¿þúëòòò=z>|X‘u9Žº›J3ð;46%‰ÌݹsgÈ!qqq¾¾¾J¬:¿ÞÊÁçêƒ ÃôR÷îÝ—,Y²iÓ&º$''gáÂ…VVVžžžK—.­©©!_v¦~˯ š‡Î³z7îÒ¥KôÛ¾}ûäååÅÆÆfddDEEB$çE¨¿É¯¬n <<ÜÂÂ"<<\ h`ºÏÀÇMiwØ6!¤¦¦ÆÎήªªJzQIII¯^½ÒÓÓå¬.³²Z…‡‡ÇÅÅI^‡……ÅÆÆª{ú ÕƒÏ Ôöõ•X,¦Gb×ÔÔ¬]»¶sçÎæææÇÎÎ.##£¡›TY…’’’d¾hÉÐyV¯çÏŸ»ººJ^/_¾<>>þàÁƒ/^¼ (ªººZ$5´b“*«P@@€Ì×-OÛ 0pÇ “¼>|øpBB‚›››ä­ü;Š›TY…bbb"""ƒ‚‚bbb4³S‡Î³ݽ{wË–-ô„aÕÕÕ¦¦¦ôÒ½{÷Ò¯MMMkkké9•ÕÊËË ÷9°`Ø¶Š‰D¢’’’k×®ýë_ÿ2dÈÎ;}||$‹FŒñÉ'ŸäççnܸñùóçôZÞÞÞüñs`¶œÊ aè<«Œä)Íæææ:uúüóÏ---“““'L˜@WˆŽŽ&„øúúvêÔ)55•y1yãÆK—.511¡g“S4ÌÀŸ‡a€ú e”ƒÏ ÔªÐtžÎ3@#Ðyh:Ï@ç ‡‰'®]»ÖÔÔT²(##cõêÕçÎ+..îܹóŠ+&Mš$%NoôtZÞí‡yIª?0eù¸tvé©íV4— Vù˜gù|ùòe÷îÝO:Õ½{wBHrròðáÃïÝ»çää$©àáá±fÍš‰'-[¶ÌËËkýúõ„ÌÌÌÞ½{ôÑGÓ§Owuu½}ûöwß}wìØ±¦±ۻŽ'ïnîAªÎØŽë9[Û­PÜY£|n >êKO/utže–Ó{9uêÔÚµkoܸA þä“O¦M›&s•’’’^½z¥§§BfÍšåêêºnÝ:™{Dç@7¡¨|n >êK Ûn2ùÿ£Fúí·ß¶lÙBQ”³³3³ç\SSóÝwß8p 33³ººšÂår%‹Îž={éÒ%µ6”†Î³ê}óÍ7ƒ *--½xñ"³|ùòåiiiìØ±£……EMM™™™dÑ‹/ÜÜÜ´ÑXh:Ϫ·nݺ/¿ü²¨¨(::zÛ¶mtùáÇèN²@  988dggwèÐAÓm ó¬bçÏŸOOOß¶mEQ¡¡¡çÏŸ.Ík¾ŠéZ{”cà3vhx¶í’’’ÀÀÀ³gÏz{{BRSSß}÷ݤ¤$[[[BÈÔ©S9ÎÆŒŒöïߟpäÈÉÖèÙ¶g̘áââ’œœüí·ßJfÛöóóûꫯFEß :_)Ÿ¨úRÆH5lY$‹æÏŸ?uêTIϙҥK—)S¦ÌŸ?_ò6::šâëëÛ©S§ÔÔTæ•gww÷k×®=~ü8((ÈÊÊjÞ¼y“'O–,Ú¸qãÒ¥KMLLšèÔMk§~oܸ±{÷î .äää888téÒeÞ¼y&Lh¨¾t×Q‘–ãÜ6¨á¥ Òô>ç9((hæÌ™ƒöôô¬¨¨¸uëÖ²eËF%³¾râÔÇðRé úÎ;ÏÒÒÓÓ{õêURR"s)âtMKH¤3è—qÏ3ŸÏÇœX:é ¡çÒÒÒË—/Oš4iÞ¼yrª9;;óù|—©S§¦¥¥i¬y-Ò€IËgÉTÕ666¡¡¡VVV‘‘‘ Õ=zôáÇËËËoÞ¼zçÎ ¶@ÿ‚ððp ‹ððp@ íæ€Þ@:¨ÒYi¹óLQEQHIIY·n]C5Oœ8Ñ¿SSS77·O>ù$22rùòåŠìBæ“¥äü`0"""ââ⪪ªâââ"""´Ý=)ç9…†é  >HgUÑ|:ëÐŒ±±±3gÎÌÌÌT¤rAA··wEE…üj*¿Y\Î?†dG?þøcttôãÇù|þ€-Z4hÐ fµ{÷î}óÍ7qqqEEE¡¡¡Ë—/ïÖ­›Ì]XZZvéÒå£>úàƒTxÐBX[[———K^[YY•••i·=†§%L|¥é  GÎêÖ"& ëÕ«Waa¡‚•µºƒôÛ¯¿þú‡~عsgAAÁ•+Wx<ÞàÁƒ™«:thÈ!ÁÁÁ •••‰‰‰½{÷6lØ¡C‡dîE ¬X±bݺu[·nÕäa€aù@qz‘Îz鬿t¨óß¹sg+:t¨oß¾jmvìØ±ÿþ   sss__ß#GެY³†^úôéÓ… ^¸páã?nÛ¶-ŸÏwss[¼xñùóç.\˜žž.½ÁÖ­[3fÿþýÛ¶mÓàq€ˆ‰‰ 377 ‹‰‰Ñvs@/@:褳þÒÚ¸©aÆ͟?¿wïÞ¶¶¶………çÎ[µjÕ®]»FŒñ¦eŒ«íƒ š7o^¿~ýìíí³³³<¸yóæ³gÏöìÙSþ^Ô:0Lzã–––2ë/X°ÀÑё٦EEEEGGËÜlEE…]mmm£MŠK{—VÔ„cP³°Îa[k»êbxà  …S_ÊðÔ±QE,_¾|ûöí¥¥¥­[·îÓ§ÏÑ£GƒƒƒeV^¹råöíÛçÎ[ZZêää4pàÀ«W¯vêÔIÃmnT```LLÌÇ,séùóçûí7™‹&L˜0qâĆ6{ûöí6mÚ(Ò€¸´¢¨©©)>è<èƒLg•0ðS¿¾òœšš:~üxssó¡C‡úúú0 ]»vôR33³’’SSSéMUWW;88TVV²6[TTtåÊ•O?ýôóÏ?Ÿ3gN£MŠ<þP§:ÏkÆøDŽõÑv+ÔWP•ƒÏ Ô§ELfºtéòàÁƒ 6˜˜˜œ8q¢gϞÆ ËÏÏWd]æ$Ûô4ë­[·?~¼“““"=gPtžUŒÇã 4(**êÈ‘#999sçΕ,rww—9+!$==ÝÅÅ…~+™j[,¿|ùò×_}òäÉ/¿ü¢‰Ö€,Z»ç¹%055ýæ›oè‘ÛC‡=zô¨¯¯¯tÍ£GöïߟUÈápììì&MšÄápV­Z5eʵ>òbà7iøžçÅ‹oÞ¼™ËåÒ%)))C‡ÍÉÉ!„¤§§÷éÓçÂ… ~~~̵>~÷îÝ/^ÌÉÉ133óóó›={ö¬Y³˜uRRR¾ýöÛ‹/æçç‹D"BÈŠ+Ö­[×h›{õêµxñâ3f¨çh ÉÐ T>7Ptž•¤ûñ¼sçÎM›6]½zÕÉÉIÛm€¦Ñý”ÑMøÜ@}Ô—2˜0LËæÍ›W\\7Põ¥ fŸh:Ï@ç è<4ç·8Ž££ãÇe.Ò|{t° -:Ïõ¬[·nΜ9˜˜Ðy®göìÙ|>÷îÝÚnètžÙvíÚUPPÐP…S§N…„„XXXXXX„„„œ>}š^Äápª««-ZäääD²æp8UUUsæÌ±³³sppX¶lEQÕÕÕóæÍ³···±±Y´h‘P(¤7’““³páB+++OOÏ¥K—ÖÔÔ¨ï`@êz~´ŽhÒ²éÊ›6mºuëÖ¤ݸqãwÞ‰ŽŽ2dEQçÎ[¼xñÙ³g%ÕfÍš5dÈwÞyÇÚÚš^÷Ÿÿüghhè˜1c^¾|9}úô &¤¤¤ 0`̘1ÅÅÅÓ§OŸ>~èС_ý5]ríÚµ… &''K7©¤¤¤W¯^ééé Ë룑µG£<^ 0ž°ÆdB¤¶[ .è*Ÿ¨úRöe022Ú½{÷Ç\UUÅZtûöíQ£F1KF””D¿7nœôÇO¿öó󫬬d–øûû Éëšššµk×vîÜÙÜÜœÃáØÙÙedd4ÿˆ 9Ðy–ÍÏÏïÿøGTû*nAA££#³ÄÉÉ)??Ÿ~Û¦Mé­1 %ùY%eee’×Ë—/?xðà‹/$·F‹D¢f 4 OÛ Ð]+V¬ž6mš¿¿?]èääTXXضm[º¤°°ÐÙÙ™~Ëçó¥7%ýˆæ†Ú|øðá„„777É[úŠ´‚x>adB“ÖP/žO˜¶› è<7ÈØØø‡~˜;wî•+Wèž={ž:uŠyÏóÉ“'{ö쩪VWW›ššÒo÷îÝÛ¤Õ¹]¸]ÂADDDbbbPPPLLŒ———ªšÊA:è;Ÿ±C¹ Ø>ýôSooï… JÅÇÇ¿ûî»Û·o2d!䯿þZ´hÑ™3g‚‚‚Ú‚t¡œ’©S§r8œ7íß¿?!!áÈ‘#’EŠKxxx\\œäuXXXll¬‚Ÿ4 &¾RNËüÜΚٶ•ÔüÎsUUU¿~ý’““éEÇÿúë¯c¦$‘†Ge¨ RF9øÜ¤!TÏyVâYšµµuyy¹äµ••UYY™vÛ ¿2ÊÁç& é  *˜mT& @ækФ3€îÓÎó7>üðCOOOcccWW×Áƒ=zTÛÒW111aaaæææaaa111Únè+¤³ !tŸ~Œ› š9sæàÁƒ===+**nݺµlٲѣGGEEÉ_Ã@}ZxÊ @ážg¶ôôô^½z•””ȯ†xõAʰ @ëpÏ3ŸÏçr¹Ún¼…t¦çÒÒÒË—/Oš4iÞ¼yÚn ‚t€@Ÿ:χÃáØØØ„††ZYYEFF*¾‹‚ëê/@naa.´Ýý)3M´Ý.€tVÒ@…4ŸÎúwÓQaaá… >ûì³>úhõêÕò+·Ø»ªÂÃÃãââ$¯ÃÂÂbccµÚÃÔbSFÒYHg À„al±±±3gÎÌÌÌ”_­ÅƳµµuyy¹äµ••UYY™vÛ`ZlÊ4é,Ò@0a[¯^½ µÝ Ý ý£Å@­Îò!ôš¾vžããã;wî¬íV虡fnn#)Œˆˆˆ‹‹«ªªŠ‹‹‹ˆˆÐ^“À0!iHgã㦆 6þüÞ½{ÛÚÚž;wnÕªU»ví1b„ü[ÂÀ0Åo Âh1ƒ'"""ƒ‚‚bbb¼¼¼´Ý"×RF¤³Hg !5¬¥Û^¾|ùþýû»tébnnxúôé£G6šÍ†Gæi줤$ºóµ4™£ÅÀàhÒYé ò! †Ÿú5°sÛ2Oc+~n'½ .ai˜¥ŒÆØç†tùΆٶ•d`ñ,ó‹‡Ð„£a–2c`ŸÒäC:kXK¶ 2GvyyyÅÆÆVVVÆÆÆ"›Zŧ#µB: élØ êÔ¯4;·ÓØ@cžÆ¶±±©­­Å/ƒæXÊhŒ}nHg !u†m+ÉÀâ€Æ)JS$§ñ‡¾ !e”ƒÏ ÒY ó¬$Ä3*æ¹mirn©ÂW*„”Q>70THg]€Î³’Ï`¨èSÔÆÆÆ¯^½b-•3™'æüT!¤Œr𹀡B:ëLõÐÓ%%%I¦!±±±¡—ÊyZ,*  &HgÆÎ3€~“Îiù“ybÎOuC:$tž ™Ì¹òÀP5ôhÖOÌjø¹Ð|ÝZ¤³!1ð›ŽZø]U˜xˆb?ø¹PN O¥µðÏ _7 HguÂ=Ï Œ¤¤$™¯i8› ïù3¿þ—.]’Y³ÑŸ P¤3€ÁC:*tž Y£DDDÄÅÅUUUÅÅÅEDDh°i Š|‹™_Š¢dÖÄ<%ƒt0xHgC…γ!ktâœÍÐw2¿Å¬Þ’Ÿ‡#s- ÌS 1Hgƒ‡t6Tè<²†æ' ál€¾“ù-fð–ü„††²j2Sœ"ÿçTé `ð΋2h€M•žžNŸ¾JOOg½Õvë Éd~‹­¬¬èy++«†j†……ÑÕ´v ú )£|n,HgƒtÖ.õ¥Œ§â™ßF="3zù«ZÁoºÌ‡&AÊ(Ÿ Ò@ uŸúRÆÀŸÑ†AŠëxF|Bˆµµuyy¹¤ÐÊʪ¬¬L«íyd> B‘§V‚ˆˆˆÄÄÄ   ˜˜˜†zá͇”Q>7 ¤3€>B:ë><ª ”‘_šùçƒßžY8wÿÀ›Ï.ÜF WdN7¢ÈLBô•ç/üU-¬2*´M'ûáÿp/í6³¦!Ð ¤3€^C:·d~ê·žÛŠjÓòïÜͺz7ëZAY6]Îç6|«q•"g¼@(wnûÏ.>²¶¶öçÐa@ëFkÖV‹N¯}Pþâµô_ÿ¦j9)£Z-çs“¤³¥ƒI£5‘Î é¬è<+©åÄó¸%ý¬ýên<ö8¿»Ì ¦üÊá]X›B¼ý–ØaÌ“} s~裑Ó´{Ýx=B!¯²ªË¯ØíÞµ‡uö_ÿ¦j9)£Z-çs“¤³‚•‘Άé¬˜mäÉ+ͰíJÒòz6Ôs&„ÔÔYüõ`REM+BHzჱ+Eb‘Ìš˜ó@ï”V¿l7DÆ¥-ÇÈÂÄÊ”oÆ*·ik6ë«w¤Ç}áë B’t–"ey¯‰ÔßuHgƒt6<è<‚Ÿ¯oÌ)v¹%$¿Zåkëó)“ªk- !w2¯î¿þÌj˜@¿P„Úuù˪:öyè~ÞùñƒëßO;ÿùÈx\cÖÒó©GŸ]`âë B?_ß(³/;—ÜæYzçøª»IG²¤WA: ¤³A2ðqS†70Lz€Á_ßÙðÇÝ5uæŠlÁÚ¬xxצüJᬟ𫋇š› êõWꡟ¯ÿ›UØÚÊõËq?›ñ-$oϧþéúFVS¾Yä˜}.­Úi¢•ÊðRF3 ïs“™ÎßÇ~ÁªV•É=»ù=ü²Ï´öíÃìXuΆé¬E¶ oDDDÄÅÅUUUÅÅÅEDDÔÔUí‹ÿþbê{΄²j»ó)k…¦¡Î?<¢ÖÖ€ºå”%ngqŒ> ¤³™2¸ËÄ Oöà”šºêâVSÒƒG ‰¤Óù`ÂVVákñ•1‡\g·éí=ŒU é `Ά g=“””Ä|}ìöîß“C^U±gðã‰_ð¶r¬|Ì;)½‘â § ©ï Åü«ONW×V¨·Å N»®|Y+bÏD2ªû¬NÝX…ô_édíÆ*|^”ö0÷–ÛÐ2°Òùxòî’ª¬:÷~ÏññêZøåž¬òu bÕD:è;¤³¡BçYÏ0ÏX‡ êñíÙYÅì§Gr(ñ¾™¾—¾Rph¹ð¯õŸ¿ÓIz;/ÊÚ\z8¶¦®êò“ßÕÛbP›g/RŸ½HezµöÓýfIrÆ«/O¦­;•1«ßW|©Û«âPo+ZV:ŸKù•U¡¼àµÃ뎒ݱ±±•••±±±^^^<#þìÐÕ\#³2Ò@¯)˜Îf|‹¿F:ë tžõ óŒu«AýïfK׉žÞsÊÀ·ó{~ýžïâ!ÞÒÕrJ¼òKÛžO=LQb5¶ÔæòãS¬žÙ;Þ4ÄÂÚ¦ÛÈ™Ów\vÿ¿3=#/®>–ºîTÚðg´±YÀZ%éy\yM‰¦š `˜˜éÜgº·ôŒÙëfÅÄ^ˆ“žD—bkÞº—G8«é  ¿ä¥³…Exx¸@ `.mgßiBÀ\Ö*Hg݄γž¡ÏXï;òãï÷:ŠÃªðQ˜ç‚AìlÞ2¹Û‡<¤·v/³aYö¬kjj-¨‰@ 8$üìö‘cz|0ûÿvÄq«FÏiÌÏ·Š²Š«é¥™/«Öž0¾”ö~åkkºP(®»úä µÀ@Ñé|ðø¾g%)¬¥½½‡ù¸È{ºÌ.ï³JÎúHN:ÿkáJzf„Ž;²ºÐáDZž\…tÖMè<ë«^ª©³`öéÐ*zûV B‡CþóÏSBÚ²ÊóKÛ”¶ý+åºZ ê‘QqŸoZï7œkÄkev·õ»¤]á›6´nF‘牤d‡ˆ©7«Ç=:މIT">ýOV‰ßâA‹å¯ÕÁ©«§ƒ«é  wJçþF1gF‰D’ÉéS¾y°×PÖÖÎ:g½”.Hÿ%ž=•ˆ£µèø¢~|®ìS#ç¿ÿìáhÍ~Pû½¬¾©¹7sJ2×Ý”””Ô¾{¦@ûA“v> x쯹4¡˜ûyèïɳŠ+œ!ù¥™žÝœ¤’@“¤ Ò^ÙË*â;ÉÆÜ¡Ñu‡øNb• ôŽÌtîÞ¶Ÿµ™-sfº2ómX§1¬ Hg„γ^šòÅÅUά “:¶¶’÷G³… ïÿ†±gË{Õ® ¬Í_©8½  O‚C{:u²f–Ô ŽÈ}U£øF^U9Ä¥Šù„÷`kÖYphªŸÀ³dߨܧýpEÖ öÜÊÌžYB é  _¤Ó™2 ã(ò÷Ì\.—.gu§½Zû¶³gÏò‹tÖ5è<ë%)û«egQ9­wW™•™æòr°dÏæw7³ïµ§g*^—ª¬} f“>ÎaÌx ¦Œ®=yÿI{Ž" #Gú‹/QQÓêö³0BH»;S+ë,84I•e«Ä»µ¯K«vЬË3â‡wÇ*D:èV:BZ™Ùû»õ&ÏŒðøñcÆÃêbX«è8šU‚tÖ5Zë<_¾|yÒ¤I­[·nÕªUHHÈñãÇå×çHÑL;µB „‡‡³¦ã£ û õ’òc­2)ÈÜHÏÄÒ„÷Ã¥/>{äÛ_ztR%u£(qêËëÌ’„§C3_¶aU3âpƸî‰ÈÛ22kӈȱ>¦|.‘ò(¯Ga™›ãâ =¨ Z¤³òÓ9|P˜{O[Ö*}ÚT|ûƒ|ÞãÕ\M­°é  /¤Ó™Ò¿ã»\£·áËzX«rßöÃMxõ¦ C:ë­užCCC_¼xqüøñ¼¼¼èèèÈÈÈÝ»wË_…ªO3íÔŠˆˆz:>zœ]˜Âw¦êÿÃñ¹µ_Œ Upã yÛK]ƒº—ÕçÂÃ#ÒÖô 'áeE>ýö~vÈ“3®Ï÷·…!³úµs´61ås׌ñ¹÷å !¾Ž¬jáÄ?)ñºðØÓÈï0<¤³òÓYðê·þ<}\#^°×`Å·omfä9ˆUˆtЬt–è×”3hfÆ–A^줳NÑZçù³Ï>»páBß¾}ÍÍÍ÷ïßÿÍ7ßh«1º†96ƒ~ýæϤډÝOiÿÒÕ¶ñÉH$¬LyK†¶gæ”x=Êã$g^V®Á I—ÿN¿~^䓜1@ºÎœ0Ï¥#;² ;8Yžû¬ßô>î¬ò²jÛ;™ýùÖb¡y¹Ê[ úé,‡¼t&Ä+„Ä]Ýz[™Ú4iÃü&³J^Vä#ô3%:9ww±ñhÒFÂ:e• uŠÖ:Ï6l`îjß¾}VV–¶£k˜c3è×’<Ÿ°:ʼ^mµh0»3,ߢÁÞvÒŸû^yÂþ΀.`My|ïößI׊LÒ‡H?ï}¸¿ÓŽéÝÚZô´nmlÍX…©9…enq£ é,‡œt6±àµéÊî'+8U“‡}§öŽþ¬B¤3€nj(iý;Œjê6Û;ú»Ùz³ ‘κCW& ;s挟û>^ggg>Ÿïââ2uêÔ´´4Í4L+$Óñ±æˆ‰‰ çue Ýí2ÇöoÒö‹ò²Zå\af{Ç¥e¾V+ÝlPæ`ÑÏ7ÍŠj%å©Ù¯ëØÝànm[šÌ3jðÖÓVfü/³§ë§çÆÓa7q•¯ËTÛxÐkHg¦†Ó9¬C_g.¯Þ—ÎÌØ²‡»ŒQ!rHþÿeÃVyJN"Ò@5”Φ|sé1ØòI~~ß}•U~óÙ¤³ŽÐ‰ÎsqqñÊ•+·lÙ"§ÎèÑ£>\^^~óæÍÀÀÀÐÐÐ;wî(²qé¹L8Ndd¤jš®2çðòòúbǯ5|VåV%ç‡Ö¤ç¿EDD<ûc;©­d•ßÏêv?ûFsZªÂ<Ÿ}óæMºÜÈõÍØ­š:󇹬µÚØšý¾¤•)OþÆÿ·áSòì«ðU•CÒ³Àø§ì?Ü)3M´Ý.õB:³4”α±±“`U~x)K‰tŽ‹‹{r=¯¶ªÞMÎu¢Z¤3€Žh4iÁžƒY³5Jò#v)WT[ï¡wu¢Z¤³LšOgíwž Æ·sçÎþýûË©vâĉþýû›ššº¹¹}òÉ'‘‘‘Ë—/Wdû”,:ÏÒ³znü3…U§•ùË×®5õùoIII¤¶Š¤²‡ew¸žÎ>×ZÁ<ŸÍçó%…ví,Zµy3%ÑýìÞu¢z÷_p8äÐü 7©!ÙÒ’’’HÂnRÃ>’|òî-U4ßÐDFFÊLm·KÎ ‘Nçå9O =¾Z L:"R9^±ÝÎÀmÏ:¡Ñt¦õïØä1Û’Ú*Ñó[ŬE7ŸÇ*Õ^§ùtÖrç9''gذa«W¯oÚÀãñãÇ_½jàÝ<Ö¬ž‚•g”°êxµJ(x\JêÏbÒ¨7wj¥žæˆë /Šø®¦‡ oÒ™rPæ—º®®N2X4ô½7w2W¾¶~œË¾«yL×>ííÙx@@©)# ì'LŠ)£ßïØal åžsûÚÓ?)RïoµÊâÚ‚ÇeD¹t&$+™÷±wO!tüt~»¨”ÓÁ©kS7Nÿ<¹ò‚µèiá=¤³.Ðfç977wĈ›6m4¨i÷B û|¿kVÏ}×2YmÌ«?Š•6úü7æ™òÈÈÈàà`®¨Æ(û&«ZV©ßÃܤ&)u`~©%ƒE;ö~ó0ç»™ýDT½±Ù\#ÎWã»(¸ñ˜˜òì*ÉLd-ÊxÑáüÃøf4ôÒY>é9·¥‡S n)ŸÎ\nþà ªþÓ©Œ-¸Hg] ?i#¦(±ñ7éLHáÓòêÒ:æ"‘Xt/›ýiÐ<­už ‡þÍ7ß 8P‰Õ:Ô·o_•·Jw.÷íÕ%²Ï7wpº×ZäÆš¹¤!Ì3å‘‘‘fff"‘Hô8ŽU-·Äù‡{“Δ€:HOMTX–÷ê9!¤´Ú>½=‡Óh?ß6Ö nÜËË+))),,ÌôÎO\Ro EŒ~ˆ}¦‚ý„t–O:Ó_¤”±'$·y5'k*jóÒJY5Ûv·E:hœtfÚ·á7æÍ ¢ÓÙÌÔìEZké,×£™TF}†¾bÅŠ‘#|n8‡Ã¡O`4hÞ¼yýúõ³··ÏÎÎ>xðàæÍ›Ïž=«©ÆjADDÄ«Wony²±±‰ü÷ΰèTVÐÎå;¾º¤àe>’äÞåŠ*D\KzEŒ(÷¾­•n9¨„d"fÉݬ7S|ÝyÞŸb=žJ,Ìûc YÒ„¶’퇇‡ß*ºVáPoÅKiÖUµuæÆ|%›ú é,+cbbŸ±'ñpè¼ïø>VaÞ«šgE•=ÛÙ˜ò¹ÌrÙéLHÖWßVÌšm»ÛZx5ÿ 9ä¤3­î•ÑùÓ—!’›;XõÙ~xxxú­»îÁõ~îg_‰E\#nCë‚híÊsrròäÉ“Y£ÑIJråÊøùù™››÷ïß?--íêÕ«={öÔp›5‰™ "‘èìCö'ÓÊüåèò&qaa=òÍ[±ˆ“ÁŸ™[í¿~[dÛ jw'ë!äe…sFqGö²G¥$°³YzZ#iIIIÕ7NN½¡¶ÕµfÑç1µo …t–•΄SW²êôi?âUUݹ›Ï=óãí~__²[xªý’cÓ¿úŸóÇDì¹}ñá ñß' d§3!Yw^Õ¿šXµ6A:è ;RgÁ­Búµô€Ó9/µL$¬?™Âëò§…ì¹ Aôvå¹ÑÛ¢˜¨Üø1ýG¿ÞùÇ-bìʬàn÷$ ÝÅ7‘˜˜$d2eÊ”[·n‰]"^C™5‹Ê]“‹ž‡Ðæ¨NM]uZ~2!$9#”°.; _“{G‚Ù·VJ†ƒ¹g¾%?5vÜôba{fùbs—5xé ÒY>V:ÏY4«Íx1«NeMwÿ•缋ou¤r:QÙïR¹¨œ6ÔK¡uÎGâú-¸Ü¿Ì¶ý{m&º5”ίËD5/‰©C½-Šé  Kètfj%lCÈ›^±ôÄЧs~ZY¿zŸïd^íäÜCU%p {næè2ý"è4ýxÙêqÿ{É&0³ßù#¾oÎ.ÂÃÃãââáOÿ¡–[/ŸûvxÈÿë<åôÓ,@[’2â¶_VPÚöì}ö$ü‡'ûšeHU­­­ËËßo+(pï„4zIMòÖ¢ò‡ 7¬ÃÜžZGê^öõêZ‹¬â¬EKGt”Ùs&²fmˆ£µKW&«ðDòËüÒšæ4À°Ý¹{Û¹“•äõãüîïL^Yzò@Ýw2{ÎB·Vê^9%Z'Ü·2÷«_ž=”˜-)¤Ó¹$»JXQÿ iÛíM_é  u’tfÎxgžÌÊçS {×{ù±a–/.™lH¨ýd‘è¤;UèCe '}(:)ü9F¸å\íÊ“eÿ·gÿ‘ë/–Y¸Ùz³¶#=?h:Ϻ®âµPäìÏ*ôvÊèèÜ~Ë|Ð…â|û‡uÏŽíìØ³áS$/}F%¨[FÑ£’ªO ýÅT½mk3ÞÂÁìX¥If쬬¬Œmtxç´>Ž<£z”Šˆûàˆ¦>f åÞgÂ¥çò£Ñ¥Oºœ«Y5[ô'‡1Í×5N—(îÔiüouåÿÔÙbßGüEõrêM–ûžèêñŠeËvþ¾ìð‘˜bžöêÛyk§m{ØJ^ ´N’ÎÌ#ŽÑÀž£¤kþûÏ'“7žý0mÍãº7 w÷§ËÙlWêÙ…ºÏG=ÜØoõéô‚ábq½_Œ˜c[•x¨ :Ϻî̽1©÷1æ¾âÛ†gôöZSCºù‡õ”>ìg»¿w³vh¥È3*@Ýîd]#çi~7VùÔwKÕÌûد}OÇV¡°ýÀ¸ËW?%ТŒšN¹ŸÕÛ¡€W»Ô—Ê ÕÞ*ÞŒw„ÿû^ÍɸKiǾá›÷xËÄð>Ýê·¹“qÌg¼K8oŸÙ•z÷zéÍߌÜoãäF§sx×ѬºúØXÛY"tô<ÛœºZšÔ»ªºV4ý¿·öþúû…×Kß_6¡êˆ¸D<_ôûÕêE¯n<úýÎÌ¢ò·w>; …Ôë&]0BçY׿Ë*q³ÚÃ=„YÂ<ýÌår•8µxpˆ§Þ|¡5ufQ~U䂨Ûݬk¹¥å56¬òÙ¡ªÚE{Gÿ@Ï'¬gVQ¦¶¤]F‡Èô¼,%ï•GVf·ýÂf¤–.pœ‡ð¿Î žß»è7rï(ÉL$ey\#Ž›£ÍÈY{ßw»µq¢É°…aüoS8íèµìHùou_zßÝ3bÓµêZ‘¤°“s+Óú_|#ê¯[Çκ@zu·¶}™o³Š«û¯¿Tuí× µŸ{RùÌEb¹hÔíÞ’þü SøË–ñ>ØÁuÁ¨;³ŽUt¸îë-¥ûãïQöæB——ãÒ¥Á½Z‚γN«‰OßewžÛÚ¥weÜŠça¹ IDATðL°mll^½zÕÔñÛ„çVf>®•¬Â×Ù»Í+¯)yVôðI~wVy—mvìî´Ò8£ÐN¬³Ø |Fbt(€´å9ÏŠ^]{ôîk£Ý¨"ºü QØP«- "&^¼×÷2ÓÙÝÞ|ÛÔnëæeùíoFoKÄß÷z?=6s÷-ÉL7F£®n½Y»¾qY#‡òHÒ™UÈì<_}ò2$êüè§Û÷Öm2'¯éòtŽËZÞ_ãÿ|ë³eЬE»£"æ,ùØïŸ+ËǬ_ßiÓ8þª âÈÜæxqüî×[/?KÏë)™§é¬è<ë´¸´¢Òj³„Ë{[óÖÌIÂ!’!^"ÑÛÊM=õ~«$9Ó²¬ÓhÙݬøª×fY/Û³Êç„zªvGÝÝûvv‘úÝpì´jC³žŠ`n=¿z)mÌ‚š?‡ˆoÓ…;x£¶¶]ê‘þë⾦óäà¶ç¿¾ÖuÕjÞtÑßq]·37ñ¯UÇR%%=ܰv}7+^$ªïÐ@w³â)ªÞ°M{Kgz~¯Ã7sÞûöÌŽ—«—ˆŽ1§Bˆá{×n§Ù¸•±ßNŽ_67ܳ—‡í¨î.óz­›à{ý‹°±3f´Þ¾7†99ÂPñíUÕ‡/¦N¨Bܺل……âÞ ­@çY§IÙv¶ÉìåD˜$Œy ª©§£æìËãÖ c¡ˆ÷Óu в»YñO º²¦ keÆÿG°ŠŸTáß&ÄÃñ¹… ûqÐ7ò‘l_ÿ^ÐåUñ á¯tÉ Nçïí>´¹¹#ñüqÓ¹[ÛV‰«¦tóe5yó¨gc"ü¥ö»ÿŠý)>“âïÖ›Ï}ûhBHUmùÓBy‘ ¸›Ï*¡/;'Šçïºr¼ú‹Aâ;ôÒ×þ"Þ¼Ÿ¼—ÆGY;®K'K"ňÃY8ÈûÖºwâ{,eÝÙ1_ôûØò;—¦(މ%o÷ÿ¶ãÞ ­ÀŸDº‹¢ÈñdvçÙÝþIW·>¤IÂ24K+¿6%¬Â ÿ»ˆ ý4‰õä9‘Xx?'áIÔTa½ÛZ¨hª0š™±¥sWoGöåGnå¨vGúîÀõgéÌc„[¸äÍu§"Žõ‡&ŸîŸÛû~âÛ1ÕŠ¤³½¥ñ™Oû:ö5¿ˆ"oLeGÊ×®[º÷ÒÕ'/Mùf>.½X XþÍB¤3€&I§óƒœVîmûB2_VMØ¿³j#sÁ<ŽÝHþÚº¾³®®u·7—¿/w{óÓKú,ùð½ &k²9tù¿…»¼_Vß|6ˆr'ëªÊŽ šgÝ•ø¬8·¤Þ¨i¡:ºäµwô' œÆnÒ“i¤ ÷·e•ä =ªª«1¡€Æ°•<.¸û´ 5}›íÃêØ{÷¶ýÚ9¤± “3^=)¨PÇîôÑãüŠù?&í©ÛìH½’”ˆ '‚÷ɼ ýÃ:·V"¹Fœ==ó;ŽúŠ7™.ô¦òöV}óþÖ+O +üÚ±Vym^¢Äü& 4ét®ª­÷Dwc®‰K@Åkáè­×¼üï0ñÛ«\ Fšl˜ðþøŸçšs¥¶-Û?ûµûìýÿÁ_^É1•”ð‰è§º u9®òzÞÉDçY;ÐyÖ]'nç±JZ[çyvåqIó.2³ÐçÒìb͹]+¶à·éH0¡€¦°•Üͺ&}Ù9ØËN…S…1uwïgkñ¢•ÙKV9.>Ðfî¾µ¤ê@_*•.ù–ûþËvËFv&ʦ³)Ÿ{lQÈç¸ata_*5òÕÖÎó÷~»z«¾ƒ§…±— 4E:Y|\{ñ¸&Óþs³ûó£ E§ÞVæt˜bñU̧ï,Ù‘ÃiÚN— mß;|à‡¼ÅK±¥*Õ}ý8=ä†@X\Y¨äÁ@3 ó¬»N$³;ÏmíŸÐ³n6ó"3}.-öøyGKö\»fþ} &ôP'æ`°.]ºÐåמÜΖž*,Ì£ù;’9ÚÓɺ­K«vîYåGn¢ó @!'“ó Ÿ¦.¤K.uûÞrð·%+ÎŽÖ&§>î½ÊjñU#_ºp²8n®ÙíØÂN¢êztsŒ8N¬ Ò@䤳¬‡TõY~8¥8éü&áéÂŽýTãå1óúócÏËÛÐŽXé=­Ûk¿w£xSé’T-ñGÜ|žØ¬Ã¥ ó¬£²Š«SsÙÓö´sxê/õÈŠæ{{."–5)¬¥B§žÍ¿¸ r0ƒBèËV›v|{í‰ kª0kSÞ¤ %§ “9Ñ ‹Ÿ[ˆ‡ÔÈíÛ¯Ò ÙO³hiĵúXêJѯ|òföìŽýGÆ‹øœêÝ^éìÛÆú§ù}f/{Êq¥ W‹thßùþ}ö_Þm»Ú!ÔJN:ç¾zΪœšÛñè—ªÛ@ÿ>T“IüÏ—Lê?ª»‹â;b¥3ŸktxAð·zÃR‰ïŒ¬¾»éÏìæ!4:Ï:êB*{$F+ó—þnέÌì”ØšüËMÌóÖn¢ÖÒ*â’"ˆˆˆÀ¬$j –ššJ_¶*ç>-èʪlõâvANfówÔÐhO_×@[‹Bk³bVùá›ihéßÌfÞ› z{«á*Þ wÛ==ìT•ÎÃüœÖLí;‘¿¢„óf&^3Rû½pûÓÚñµBSæºÝ['&&"Ô§¡t®à±ÿJḬ̈[ósò¡º¯íÈ›¡Å„3›ÿq¯០ïФI§³9ÿ÷Oú¬±šwÝȇ.üJ´ïFŠå£ürš…Î³Žºøð«ÄÕæy7·>MÝŽ$˜;vì(çró­-ŸE¶2gßî(rïŠYIÔ§¡ÇØœ¾—R^þ·9çâJyšK׈×Îá«ü0FnCË&SkŽ=üBø«ÑßlMá´;kæßÑõŽjÓyÁ ¯a½?ã~HW?ú@wS0ˆ¹žµ˜c*D:¨OC¡™’[o¼´XÌMÌ|ç[áÞŽÔÛ ŒâM-óygçŒîÍÙÍÛÑbÏÜÞsy k_RâJRw|þ~öŒß nè<ëú$ô¡+©¬EέžwmÛäx–Œ‰Dt ë„–@ ˆˆˆHLL Љ‰éæàãZÄÚÏ+XzEP™3 Q„:û –UÓ¸J@J2®\¹¢Üµ&E¦22å›»ZyKwž1rZ2@à7v¡eÞí‘â›táZÞ÷k\ŽPåé¼ir׃O½d{•ð§À.»¤Þ .>­Ò@mJçÔÜ[Ìj÷²û  rÿ!ºD—4 ;é2íèÂcžB]-EÒyd×¶f®¢íÜÑtÉ"ñÉç©OßÍoòA3 ó¬[ÞÜóÀ·{Í­÷ät·w*÷rðihņHg*ë„–ô]C|ÙÅ©¶èDøf˜•@MdÎ0”Uœþ$¿«¦(í2!D$)w­I‘©ŒÁùÃñvÒ#·1ç6´X³"f§™ø¯äü}Ùù&§ã5 /o§+S[•§³¥ Ïþᯟðæ0oï~Ÿød(sð¶KÌ F2C3§DPZývfq¥Sv–ÿVáè’{ÏUV‹N}ÜÇÞÒ¸9;b&‚}[ù£r8ö’ªîáÞ%ïÕ Å2Wu@çY·¼ISWV¹ƒU~÷®N“ÿ½˜™Êår¥OhIße1¶{W^³E¸¾C§`VM:˜p»ª–u=}3½§ú®5EDD®VªÝoDDDÎíÇžîwWqgÐ…ÃÅ·<ó.o9÷Tµû9ÐyÖ-oÒÔ…Ýyv¶Éèâ¨Ä™ã@?~,}B‹u—…@ ø×œUmlÙ#B}FLmæ± INÜfÏ>àÀË"UoâY}ך’’’^¤WÔU‹ÚI͹ô#·¡%ª©Q~cW Ð%qFþw-ÛµN#„¨1oýô¿ÊާŒ‚éÂ5¢œ»Ì¢Ž’·&–¼}Gþ‹tФTFçù^fŸ^e9“ÅqtÉî×n}göek>I:w´»ö§…?óvß c6œ¼ŸûªFå{™ÐyÖ-1116¶vÄÙ—UîÒê¹rñÜè8Ö]ÿг®}ÀªöWJ‰HL)ÑPÂk¡09ÚU8½¿W£÷D5_@@%¦ —ÛYX›•°–ÅÈmhyv\„=êK½‹äKÞ”W$C¸Õ˜Îýz›$Åüï÷ƒ·©×;„;n>,½™4(%zБXô(/Yòº¤Ò13Û«ðzéN»]ïÿ÷Ÿ=Ô±kI:=}ÕË3v÷Ñß8/*zÕñϰÿt5AçY·xyyÕZµ!ÆõÆjrD]D­­Þ<õQþs§”Ø#3¿%cA…Ïo‰˜ÕJ«I‚àÿÙ;ïÀ6Ê»?w'Y–§¼-ÉS^ñŽí8Î$NBöN€@)-Ж.xÛ¾”BKÃKË(…2(MÙ½¶3œ8ñŒ÷Š·ã½·¥»{ÿr:=rœÄ±öïó¾ß=gýbt÷½çy~O€À@ü÷bΘRÌ·ó`Bè-s¢îõ‚ZwÍ(B(Ðjn¶Îà˜êµ£R}ÉYŽ‘Éu.Nþn5!O'_ƒªóX}Þ}÷&ÿžzœ³/`Ê×”4ÏSò#H04µ¥£Êa„Ã’YÕkÿ:ñ_Ù€m%¢~&üÕßž#wOù;¦ §Î•]îècj%wêú»3Y…ð¢n`òlvø&¬Ä,Þ.Mñs¸Ã)©ß=êXÐö’v—&ìÔÁxi#ñEvfq£ªŸùõ/ŒðÑêWö£_œEéGnçÖ÷Bä6`S|r¾aÞÀ…8¶N}È â/‚‡Ï#‚EE˵1ÕRçWïΑ®=Aj_^¤ÿ[w=~xÜ!TÙV ¢ñ²ün¹ª¤y^Ò@ËétîÔ›ÔVyü¼ÇÍ|À¶¾:ÏUœù+µ½iÒªÙ±ÿU}÷Ê|½00y6;äsVc,áyêFêw‰zYk¤•:Wc§öåáoó‚1%}©8Ûw_1\‘0ý3¹$ØÝÑÛÝ©ÝÙÜÞ—ëh€ ñáÙºôIîpµ°SBH%õêC#¨³£HðÁž<ÎïïúëñÃyõ©¡ ÕXuGñL}S£Nxw¹Ö˜À¯°]J~èüЇ&ÎìÇÝL]º}äÕ/ âFþ€Î¸XPUÕ64³úÀäÙ¼W1¹Mø÷^æÚ)ÕÞ·l¤~7¨—µ†‡|™zìTM»²¶vœÀà)lS øФG Ï®Hؤ;fêY~Ãgh) ØYÕÝ#ÍU©LgyƒÚ:;@Sôž@„qÔyy”÷줄÷¨õœå×ôAU§gç AÚ3‹ ÕØµÎR„P~ý’_ªŽú±]j»Š žþâ•üf:`{ uޏð¥pqá¥6ŠÑÄãô (»m`òl^\ªéÐéÕfGÇù;¸Š=8Ëí4R¿{Y¹QâЉ¶èãàøè\)f‘ºÔÄÆî~ŸtÇ,Z–Œ ðÄV]¬éUÈ0+><[÷(}†ëí|™ŒhqtôqmTÊÝFSç׷Ǽc;!QŠÑÄÿ)?Ë©]†XÒžÀ8T´å«è‰Î¹²Óëiú gßM®÷‰]ðøâ ÿÄ)ÔÙN0,+y\Ç x‚>ñuVu×äq˜<›éåø|Õǵ1F>‡o¹FêwÏ’¸5þî×0ãáB×Ã2<®Ê¬ÅŒ+ãì222 w¿Oºc-O!ááÔf/Ô 9QÒÌ™2üIÖG߈òPNÃÃLgù˜Zî[ÈFëÖÙ6¨:‡z;=~oÌ‹ÔÜå>æBxmgT}WùðøÀÌ~ú”]ÏE,‘WŸúªÏÄì¸Ú؉\ß=ðÎÃñ1óŸ8…:#„"¥9ÿ.ëGŽj»7Û·~,ó_w[­˜˜<›ßë½’úJ§×ã.‘J‚"exÕ¾óU=£ô¤ã˜¶Ž«tX@)˜bÐtÇÌUì.wSˆ•¹ÕcãOCä6`ýü'«aÙØ%o¶O}Ø ’ÞÚÀ#«ó ›"ÓÝ×䡜å5UZaÃ’ UÞj¨‚p”^Ï©íŒ êÞFgqÆ…?º"6Ü×iŠ §ÍêŒr yx6üGp/7þ)ÕÝgjÆ”ð®n@`òlF Ž©®ÔáóU?÷Æ©AúÅÝ’åÑ"NËõ {¶²Ë$΀ðÙ¥:Ìâï^à?gÒÁ3ÅÍvÌ¢åsBr7|ûxQ»Aýsàßgë¥Oq‡_R©>žuv7d‘")#«³³½à…ÍQ¿<Î"ÍúZ<[·i4·´%ÒžÀÐ ŽõÕwÖ6,~Mù —ÊQDŸr]ýü†YúЩÕ!ãwù}rQêÃ0özl_öÙxÇ`ɳ¹P[[»pë*šåí…óý}ÅBG“¸+ŸëëŠWØ>Y/Í`( ˪O\Åo±y«·‹ŸIü‰‘ÏEÉÜj BçÑÔÜ;ZÚa¢€5s¡º{¤¹ê¦„³|JÞ.ÕÆl{F_wÞ48w?9Ÿ³¼¨ú¬±96»¶ÌÈž€MQ[[ûàÏ67ÏÝ8RÄjûÑ<+xìÏ[b$B#ûscòìæØAKFRÚgÂ/éÃož¬aÙ›\ Ü5·5yîééÙ½{÷¶mÛ‚ƒƒƒƒƒ·mÛ¶{÷îžèÇ=3ìØ±£XoOW*iˆ–vljV?Z6WîŽo‚½ iÏ`(úý?˜ëÇjìcüMåO„oE E‚1O'¼Xà±"ˆÜ6= Î†ãÃ̺ÇèÓäý¥lbV‹“£—³V³Í©ó½Ë—ý>ÕëO‚";õ)o¶ïçÇΔw Á- †bÇŽíìP}sÜŸéÏ9ãj~ßüK‚ŒïZÕ?Gù]y‡ÚÈZÊ‘ME°×e8n1ynnn~â‰'d2Ù_|‘ššzôèÑÖÖÖÖÖÖ£G.Y²äóÏ?—Éd;wîlnn6Ž»VL^^’ÆbF©¤>ÚˆòŒÄw»%2ؘêöÑóFs lŠ¥'f p¯Žó3T‡ª["ˆÃ¼cB2½ÈíȘ̌ÔÙ ô OÊmx˜Ö– ûD°"·€?ÆTêüï—žJHŒ{W }Wþ}¤¿5àþ§~¢n ÀŒ“——×!Ùü+å)«Y—CÂ? ~ôöÃqÒ…Ân§Î!?ɵ:É2š;ûKúð'ªor)p·Übò–••uàÀ¬¬¬_ýêWQQQ......QQQ¿þõ¯/^¼¸ÿþ‹/†……Ç]+&nî"äˆ<ÛB½cŒæƒ~Aüy!Q|C|ç ÿ4šK`; «_|-È«"Rj¼ð}¢åÉ!¹„r¡º{pLe „@ Ì/6.»ä…úÕ‡}Èé°p.¿T˜ÀÞ„êü÷í±ï¶tÜh[å„FŸ¦–¢Ù\Xf–ÈåkЀϯT‡8Ë?©Q±Q÷Fy›Ê%µ:#„ÁFÊsÞåm>oc.”–V\mê7gÖÎ-&ÏÛ·oÏÍÍ]½zõͬY³&77wûöí3í˜Í±ý©—ÒY»r¶ïM PvFóA¿ ~”,Y¦÷Ò\;áj4—Àv8^Ôκ1ÛÔxr°ÐEìf*—BѲ¹!çV‘`„oŸP1ú­õ£êlP>̬L§TØZ;^ÍpŸ8ªs˜ÓÊ9’7¨­œq'}BHûçÔtÍ%°)Æc¶=§üFŒ4-”ÛÛ[ÂÍoý Ñ„.©ÕYMˆWéYQd5!SÚ!ÕOécož„Ígƒp‹Éó§Ÿ~êàà0õ‡O?ýtÆ<²UÊzñÿR£7©Ò/ˆ?KšèïŽ× CÒX%­ çÆÒ¤é-Xûó®c¹ûµXÓÅl« òŒÛ9AÃ*sÔÙpœ¯êo©ä— û„ZÉ/†ŒÞ¤J__½?eݲfB“è!F¿£÷:,yŒ»ÔfŠs•]#M2g9ˋ‡ÅÒjOu›¨ÕYý3E©Â¤…»© ÜÙÇéÓ‡²k{†'Lä5cÕ¶Ï;·}ûv///WW×yóæ8pÀÔÍ<™•zž]Œ,ÏúñÅBǹ G©äSvÙ×4)Xš´1½kb\Å-‹rxTjã²LER³|Brwüýûƒ#9ð^nãX¥:˜Yÿ(}škEs‰Œlw²ç— CFŸ<ë«sˆ—G¼¢íoÔ}ܘÑß; .ׂ:À óüÞÒ?¨¾¦fߨ‚ðÛg—ò‡õ¡S_eh8uV!ÍÿF¸¸‹pQJÐнÙ_fCÙ‹™çv'Ï1y6üÍì3Ë’%K:;;8ÐÚÚúî»ïîÚµë£>2ÂçŽñÊÖ!ÌèÙèaøÄû'ùH1ã#Ͼ©^ÏÎÉÉáŒü¤,îˆ3¥£:)Ä¥ ôh ÷1M›w>êy‚LRÇM'Ô°Žž™5ð^nZ@g–Ñ úp~óC¼-¦OÈaº¥ÂìœÍAwÞãüµpq-á«>´CªgU_¯yn¨3Ì 'ŠÛûªò·2YœåeêÁ(¿‚9A¦ŒÙVÃ_ųŽøxÕ|I¦r–‡™ŒÿdéEwÍ]í<Ó4-fÊ•)øÝï~÷ý÷ß/\¸ÐÁÁ!99yÏž=¯¾úª>×hœ­ì²¹ˆ{æÍ" Ó‡DÉ’e<í¹Aé¦^Ï µ­íøIYÜûóñ˜m™¤.Ba/›Ä>êªÂöÂw'½ Û~ ð^n†€:O›ãÅíñcEÞlŸú°9ÍWxétQŽ”&™ƒ:Ï I “ç¿,Цµo§ÏyÛ“#.Á Î0#°,úã¾ÒçU_q]ë®Á'íãÖ'Œš:s„zA¥r‡©LQKíµ²ëÆvËÚ™þÓbbâðáÃêð!Cóúë¯óÑCCC›ššŒð¹Fã¬^̶k£ÉÃ5Õ„zÇzèõvöP {W„R©Ä±¸Sh†=T ³í^eäÐP}Ôi“áþ±ª„’»]ÃGÈà½ÜÜu¾¾ÍiÞL_äsý}ºø¥Â¿È­I õŽXxØ.¹„дê óÕ×(ñÔf‚ýù×麼µŒ6Žã¯‚cü²gû›xÛSg5>.Íb—«¤æáO!f;sö?Yxô(p—ÜzòL„Z ]\]]ÿøÇ?¾ýöÛ†wçøñã11Æka2Êñ ™>.Íü2z&¤©¡™ìét²×­wOHJNNƱ¸SÎWuuŽó-$ÁøyÔ³‘ì¤hÒ&‡GšŠ»Brw<ùD « íÙ$€:Ï8cJúDQëzú g9@Í÷tÉņ™:µŽÌ’ç¼*x€3na.Åy‰<Ôî†e_zÞ>"Ü·ÐÜÔYÁ*¼Ë>'S9Ã#túgi†ÕûÀô¹õä™eY–e¹8FGGKJJ¦è“a zzzžþù·Þzë6Ç“±k×.CúxS&­~Ù3€òtº.ŽêŒ „¹M£¶ö¼k×®IÕÄ„.:Ï ju–D/)öE½jãám'“ÔðGº9x™•:GÊrO‹b ȵ‘@ìŸT_:.ÞñÑG ÎpW|‘ÝäÔ½œÑVÚQðplÀEG{¡¹©3Gˆwñ·Ôâ ¤IÛ e¯ËzŠO•Xs;ã«óí†m³¬Y,Z´··oÙ²åý÷ß_¼xñm^ÂN†©äyÒê—g+º°%!gûÞùaæ²xŸ——×ZÞ¯?yfe³íÅbXÏ€»„eÑ|½˜mϪßDŠ4FÚêp!Ù­eý!‚`¥®õø ÛH{Þµkפjbj¿@gµ:K·ðb¶‘ÉáþJ§ßDŒ_ŠÑ½›µ: (eŒöKÔCœ}“a7T1t‹NfL’f^.Í&áHJJênñÕ£sÂÞå|i3ô€»$¯¡·±[ç1K Öß½Ú\wÙä¸ÊAMÖ° É!íÙø€:Ï,yyyˆ’þI˜Ëœñ9_*)ÂFšÃ©F­Î#ªpßÂKâKd$wêú»Úê ÓæÓ þmY‹˜RÎò’àqþY$Á˜ÃC@_9B}JøeÃN4ô(ñ_L—[Lž¿úê«äää3gÎÜlÀéÓ§“““¿úê«™v çúõëkÖ¬yóÍ7—/_nèÏ2üWLîçôr|ÓÉWÒ)c<·¦$--mÉ=Kúëû¼\ð²aŒ4zHÀ]²?Ùöt¹î`7dòjaH·»lJÄR„LR‡,TÆçÏß4þÙ0 Î3KRR’ŧPRVÓ'y‰/Ú':‰/ñ‡ˆ07uîº6B‘t¬_ö«®ˆÆ IDATÔýÜ©5LnŒ;•YÕ ê Ó@I3=\ñG•öùy†L(wôRx—"£·yŸ}uæð¬L§âø Ÿ—Ž_þú 4|ž1n1y®ªªJIIY·nÝ’%KÞÿýŠŠŠÁÁÁÁÁÁòòò÷Þ{oñâÅ6l˜7o^UU•A½ìèèX½zõ«¯¾ºlÙ2ƒ~¡áŠ¸ê—½ÃÊÒ–alX¼?!qð4…ƒ“ ¾?ŸùÉ‹27ý§ÙêÿÚBÐ&ý„ç÷*±›Ÿ{ˆIü¹óg-G‰í†Ýñ쩟¾¸6¸Œ ¨óÌ’––æ;oËfF;U>A͉  Hí¹›Â Õ!â[|Ù^‘C„«Oˆý½Åßê Ó`OVchçÅdVóüdñõÐìÀóÁš­:s©‰ ߦoImÍèLëŽÜ62·˜<ûûûüñÇÍÍÍ[·n=yòäªU«||||||Ö¬YsæÌ™|°¥¥%--Íßßß ^®^½ú¹çž[»v­A?ÅðŠÔÙªñ„gGÑÀ‚Ð(Óøws¢dÉr½´gä„b=$`º”_,¿>ˆ<«¢¤sdÊbTúDÉ’ ‚DI%õØ©ªAû¤¤$˜?Pç™Å/ hÜ+f#“ÍYóC}ê±a殉¡Þ£UŒßå×ÚÍçtv¤·SȦs ,þr´òYúÎrŒLnpq t¯B™³:sø{æ}Ni·£—³…u5×*Ûð— `zÜVÁ0//¯§žzêÀ ######õõõûöíûÅ/~áááahB=ôVE­¯¯Ïmhôž}%æ‚!—‡x±öBÝMr’%CI˜6úÛÎnŽÎö}føp¹ú»‡"„dz“g$éëï‡Qãê¿ÔÐv)…©ä,¯SÛâ²Ô)KføàÔ™Ã×¥±œv)&ƒÔ‡–~@un4|ž!n1y6mŽI«¨I$Sû5œ.ʼn¥®ÍÒ“835³d‰ú/Í>ÿô€i£ŸðàQ…rRù˜Â[ Þvóvn¦HZç„ȹ+ @Ô˜€:Ï,ßå´l¦µ1ÛÇÉ9)‘îÃ:·'ERfªÎÒ$„EÒ‘òœ¿SÛ8ûV:«³¶òBu÷Í/@ša_9RõŒê[Îr‚œSë$ñs×´¬3guÖB°RQá—d*gx˜ÉøO4|žn·U•™è´•10ª,iÆË¥&+ÄBG“ø35Ѳd™¹}²¤Ý$΀UX™[߃<ª;Ç÷Ë?˜Ä¥©‰’ÍAQ”ÊÛE¯ôˆ,Ò7L¨óÝ3¡b¶`1Ûñø½©ðŠ1[uVÿá[pFSBª)Äü–Þûò‘ Ó¹Æ×Wš}Z/-dË8Ëk‚ûâ/ˆE™¹:ó‰¨üšZ¬D”ú0’mòê)ɨè4ºkVÈ-&Ïr¹üÒ¥KfÒFÒú¸PÝ­9ˆ†‡é$<×ÖÖ.]ºÔ´¡Ô>l]öC™[úñÁQß5I0=ûóûH7uÊÙ¾×ͱ£­|À¦¶ÌòÍ?n—PIø©,ýzÿK‡`ónÍî#ù’æË÷°%œåUÁý±¹}#óWg>®õæGno¢/ÌoQÒŒ1³Jn1yÞ¶m[mm-MÓè&©M°ì}7œ*iÂ,žÍå]|%æ/q™j¹‹ûÜÖ²ˆÜ€»DóÎMS¬Wv*À³ ±(Ä#ÖlwqÕMn=œZE‚1¾}LI_¬ÔJãê6Ó—¾ÍÁ wÊíNž'«º Û ÷W]SÿÌ)bZZZjjªƒƒƒ ;Bq>„yÅûJÚí¨qþÙÑ ŠyÀí£¹»R0{€gØšœëæÜó)Ä+Ú^(F“¥=Ÿ)ƒ Àò8zµm “Ëž"D4tã1Û­åšÙ©Ùª3EÔF;ÁX¨¬¿ùüýýùœÒª¶!“8 æË¢—W<Ë+²}–Œ-q{—sKQgŽ1åÈ=ìrgÙÌ\:ߢ‚šÛwLžMFzYfñqil- (Š¯Ä …"##cxxØ„¡8¾?•áãëÖ€ €Èm¸}ÒÒÒ/[dñ˜=À½ !ÔZÞožõHÔP¤@ÝGêZÊ«ïëš0Op+j[Íj︣äÜõ³½ªÛ‹°aæ¯Îa>qœ=Jž»×nA3¡©ª F?S~õ(l>Àä+j#ësîe 8Ëߨûcý/H»Íe)êÌÇWR’!HA"õ¡Û!ä"îu ðí ˦>ø S•€iPÕ64ØÞÇhÒ‘D|O%„û´Ó¬Š?llPiêÌý,Œû¿Emæ,;éG.–7vãÝ1@ýyïÕߪöq‡YDTƒŸÂ»”³X:ó©hÎ _çGno¡/~— ‘ÛwLžMÃ𸪸y·¶—!Öd©S·IŒtF£+þýDµ)\³æle×HcÅ:F›¬ñ7Áý1~—HB»ílYêÌÑ6X?T~Ü΃Èí»&ϦáBu·ŠÖé#b/­m4aêÔmäáëJ¹Šñ$ç/¼kÀ‚ÐD|‘䇿…xV!„ì†ÜÍgkëfml}\ü½]üB2½Èm$7ç¨6À8VÔ¶ŠÑ~cO’Ikã|K[®`ú¯Y„:;Û»q‡¢!™Oõ{ÔzÎò¤êè™­}x¥R°q^9Rù?ô~í"zIâSÊcYꬅ@r—ª“(޹8P5·ï˜<›†cExÚ°¯kÃÙWÌçμAÆÈçÊôvœ®â;i`hv®¤qÈÎo§(•\R‹Ê;mFíX§hcç7!ä+i@„î굋otÊRc: Ófx\u©²=•Õ¦7Ÿ$‡Û7õÔ`#Ïȱuæ[¢ý²?"Wô!:»£Á‡ÆO¼sæš)¼3¥°±¿¬¤t}³¼!ØK:¹–¥Î|ü¢£mÕ'ù‘ÛÌÅosšá¨•“gÓpªÏ7÷ôt’šÄ™;%Fž¢ß° Éâ!¦F]W²³Ë\ë”r¸g"LcÇ&eŠ6¶1òy!{ማ¾z½ñg4‚op÷œ)ëLš(qa5iÀ턤Ñ)ÂNXÂ"-óqñ· uæ:Û÷¹ºÔ~@­á,OÑ>N/ïVÝ50Sþr¸âiÕ~!Ò´\­"äÇÙ¨pi!ŒÅ©3ŸÀxOQkîj>gÙÂ\„Èí»&Ï& TYÕÆ`Æ•1r“83 býæI])JgMNEŠ®Ôö˜Ê%° Å÷ééž k0»:f›ív0«¸Ð)ÚØFÉæ(;„T¯aUQ'è1`+j[ÉhÓ›O“‰«b¤%ͱañþøj—Ùë7@:a‰aW>®&ìÕ‡>lßú¡3»ÓaóB¨¢u0+·ì‡t:gyC°5Ü­X@ê,0Y¢:s"6ûÈßÒ…ÉüÈí€Á²Ì ˆÜž&0y6éåí «#o¢¡•ÑɦòçNq{xø¸à!'K ö=Ü‚‹5=mý:9‡Áú¹×"„žò³Š ¢­H ÷‰CI]±«Î”v0,ÌŸ àDq;?áù‘¸:γ¬5çg1“gW±‡ÜMçâêÐ=+Ìùrgyš>ðÏ“•Cã*½«ÀæxõhÕ“ªÃb¤i²ØLxžrH]˜ˆ×Õ³DuæÓÐs9%Òï•ÈY¶0—¾ÍšÛÓ&Ï&`^9f‘»5Í’&N:Ø<‰õ›§ß°ê$4¬€[±?ï:fñqi F¤0J6Ç$.ÝŒ›µ±U—*ùêý#!I#–Ö54QÔ4€ÿ.03Ššú‰îúpVóú¨DÔYA¼Â³ctbˆ?L$[œ:c–ù¡%ï6!Mo¼ ¶=u ãßgëí˜M=£G.W>NŸâ,oQ›·ÍsWµñ‡Y¨:ó)n¹|²œ_s{+µ?·"·§LžMÀÙJ<¼yNP¨eaæÄÈçÉÝðÉsN]o×ЄIüKá@>>yð¨F…ûÆÛ &»ÂìP—*i(èB H¥§ þ/:SA(€¹s¼¸}­ÝvÎ&g…û5÷]ƆEÉæXœ:c–Á±³1Qa_PÚJ~¿¡÷½y¢j\…§€Mñ·cUuEÃêÃNäú­håüP<©ÁBՙϵŽâU1ÎgI£„NäöYˆÜž0y66ƒã≠1!Ô$ÎL›ßÙ^.ÃŽ"ý%†eÏ”ÂK3Ü”«MýµÃ:&‚õ÷¨Fº¡¡7ëBa&¨Ë“ô6 ÷L „¤¼wÀixf–ð|ŠLZçsµ) g9 Ïj"|gÛ ìù–‘‰ÁGÛ½EmV”ÚÉ6Íî>·' Ϲۡ}`ü‹s•OªŽr–÷¨õ.kìÖ{X¬:s0,ÓÚ_8/*à$©£ÙLCäö4ɳ±9TPtží{ï²0yRv¾ ú5·^m›t<¡½¹¸Py:¶©¡øïèSt¡0¸ò$­eý!©+>y>_Õ5¦¤íÜ6}#Ê‚êÖÅL g9E&Σ®÷Õc#-(áYZ1£ƒ]‘,,j±³ü†Þ÷·cU4m¶Ê[§jî;å…úÕ‡„Ã'Â5?_æS×…gVZ®:ó)iξoŽü ¡­¹½™¾´?ÿ:Ô(™0y66 *1‹·¸ÑÓÉ×$ÎÜ ±ò™^äöñâ6c¸{sñgÏ*„»£\̧èBap¥J$¬!äéÒj'Ð)6:A_¨î6‘wpkN•´/PqU‚ ï^Iâ5|V£ì#-T1KIËå?¬x“ÚÂÞ¨Å=‡©–·]úNo9lþQåGéÕ¿¦q–ÈUëæG Ž1¬N:ƒE«3Ÿ¢æK›“¤gs¸Èí@ÔáÛ_q±åÜ10y66—kÇ0 ÙYjOî’¿yr÷:¬VP÷ÐÄÅxi€I(m(»ŽWÒR'Å-x“ªº|‹LŒÑ«VÛYšá Œ=Njëý†Þ÷êÑJØvl÷ÒkW¥û³š|ÙýK°áÙuáEÍ—°‘­ÎüS½#ãÊæ9‘þéD!$Õ+PØØß98n àäÖõ¹÷×°šõQdwE‰Tù*¸0f½û—LáàtÐWgl@Aãù’ý|ΓÚWê§Tÿr¸Â¸ž€‰ùø|CrßùHV0¥"¨w¨Ï¬ ¯ë*ëå´uæSÜœ½5Iv\ÌÕŒgë&Úkõc
ɳÁáKÚÎä`gãèÐ0“86 °d¿yêBÁ|ʯV·!xT·5á<=+‘EµÁÐGÝTÖEÜëd¯ó¯cX6£Ü"C^««³}žŒé¨}ó£g±as×Z´:c ›. ÄüvuØ”vóys¹¯ú*T(lÃþýDÕSªƒœå;rQhTôüPwý˜m+Pg>UíW=œP`€ÿ"œ3®¡s`óùNɳÁáKÚ oIµ2Zf\wî ,Ù#Îo¾«Ã˜ÄE†šÛ€¡ßÂEÜãê0I̶2EsŽ`ÏHg{ BHêZ]‘Û€yr¢¸}­³šó½Âí±añþ ‘å ¯ÎÝöÔÃã•mù. ¬pO) CÔF±O«¼|6Ÿ[áËì¦ÀŽËsYMí^o‘›Ÿ]ÒŸ<[‡:s¨è‰òÖÜM Ò#¤62e“s0&ÏwLžgì«ÌIšSpàˆRç{L ö¡ysMáã4á’=RRRFGG=$^CM´Ÿ;ÞPÒž{è'<yjúaÄùÍ×»Ú¼˜¢9AÑò¹!©t{ÌÚÚÚEËW—\kžÇj§‹'©$§±RgoÉ3ó¿1ùLªÎؘ¼†³"ù?«ÂÞ¤¶rÆû˜ó¥E%…x\ X,‹^;Võz?g9NÎqPįˆöë«ë,ÃÆ›ÿCàvÔ™Oaã…M‰2~ÚóB¶¬ª®ñz^̘˜<Ï<ØW9--M"‘ „œãç`#}]û^RSø8M¸d±X|ùòå‘‘‘‚Ó5þxÚó¹Ê®¾¥™·’ƒÂ<üÓÿ)hìÃzV!„Fz•?ܺÃÌo©›s¨×楮õÒ©ÛÛÐ=€Y±cÇŽ¬ÚÁÅl™Òô‰¨!d Ôð 62À#\âàit§Ï¤êŒÉo8Ë"öÉ¥ÁçT~j£Ñ¿V|õ(ÞD¬C…­TóÕTFÛ”îÔ–?¬×l;cMª¬Fùä7žõsFÞ!ed€Ú"`镪üC¹}'ÀäyæÁ¾Ê …"///55ùÄ`#“vÈ2áþMWû<[ì…#ü³Jšñˆ]jέäÀ ðŸW:(¬Œ‹¸×ͱ!Ô\Ôkþ7ÈÔÍ9fû/¤HH8êæ„o5Ãæ3`Väåå!YÜ2Þ«s:/e;âݱ‘X ‚¯Î,£óÜéîX¶a¾«£}Oö×ïP›8ûè3çsJa© °z^=ZùŒê;n÷<}yÐé‘%áK—.=Wzl5êÌ· ŒöV·_Ý8[z”Ðn>¯c¯,€†UwLžgý¯²B¡xÿÃÝ},^—oÃì£z6spÿƱ¥²‹”»ã+sŒ<‘åM̰•<þs€ñÇ+ßzhöyš‹úÙß S7çp¹ÌòMDÉôjnÃä0+’’’,~)s•³¤“ñ¿ûárïpgl¤ù‡kÞ ¾:OtQØÙ~a MÓ¨üØ×ì¼fB³µn”?Q~íX•Qã’YÑÙSS¼ž¹ÌYÞ¤¶¢’#ÃÃ./oËÅÆ[“:óÉ­ÏØœ(=Jj#ºW0—ʯŒ* “ç™gÒ¯òO^znt‰?Œ@L²—‡)œøÿÆ ~à§×° ù%"Bûí2ÃVò`P¸{„rñA^x¥ÀÏJ„rŒn-@fƒÜ²9Çœ T„T¯ÛsFy§Jwï LÈóÛíçHF°ÍêC%¢²¨˜c{ÿL:ßRf‚ †Máà €©3v6 Ñ !„Æ”Uéoó6ŸŸ OºPÖÐ=‚ÀJyåhÕÓôòƶóURñý¨?ºv!$u%t6h­Mùä5œ]îÑäyÐDÜ8²có& O·Ú[«&Ï3Ϥ_å6{|žìL6=ýóŸÝ»™ÿo\™¸UæZG’ºµIDÎÈ;!DQ”™·’CÀÝ#Á©"DðO9Ù÷{8¶#„&ÚìDB{+¸A—éíÒ, u–®ûG•9µ½7» ŒLÅ€h)/f;‡  ”²Îذ†Â®'v>a\×f L±³®R±‹¯=B•ÜÃÞÓ‰\Õvg4ú¸òè›'ñÞ“`äÕ÷•—>@Ÿã,oR[BÇK£B&á‰V¦Î|K÷P[SOåšxÍçu 4¬º`òl ”ôÄ Ox&:JÍ<ä6ñr–+¼|\š0;á?'%%¥ªªÊü[É€áįÁ,•ˆ`B¿ü/S,[ÏPïФ½]š±S§Ka10N—v,c ¹Ã 2þÞ(OY¬ 6¬©°ÏjÔÙß{ Jò (*%6lÓÜÀÝ‚ œýIÕÑ/3+:Æë#ƒ—Tüš>įxÑåžý¯ý"55ÕÙÕ)0Ÿ<[™:cÆÜúŒM 2þäy “s¢¨UI3¸ `òl .^ËêôÇŒÃYf r›ÔÖÖœ®ÑoX¹òGÙÙÙ–þÜ€»¡­,¿„ ô¬DÙ ìãü-5¯RŸ¤ÀT„Ô­³Ÿ)ÃûÀ€IPÒÌÙòŽT¦˜³|OÌVx·“Ba´’i)ê³&uÆŒÛ~²R¥ReggÿeûœO„«û‘&@Ý >8vü§ô’°ÀÂ)»>p1¯üÇôiÎòjË/V„ÇÌ ËÈÈȼz‹Ù¶Juæ³ï܇óìãµÅ‡í .ͬè2¶s– LžÁž¬†ÕùSÛà Ã|-=DÍŽ;²”xàµFÊ®Ôt@õNÀ¦ù.·…Ñ-´í`7èåÔŠŠó›/ˆMä×Ì“¼Œ@„L/íùRM7”!ÌK5=!#•ì€ú°9U‰#Æé ذ¶²¡…ó[“:cÆÚβžá„Pˆ·ãÚ”ðÚИ_Ó?ù¾¼wnXÀªxåHÕÏU‡ÄhB}ØLxs\öËåš’½¹õéØx«Tg¾ÅÎýæÙ÷DÉNÚrbë訹}›ÀäÙà(é‰ó•x”7Û˜iùÑ jòòòzšF˜N‰¾dµ'½Z=¶ÌÞ\\Š=51ÛÉAËLá‘¡ðt’x„»9tÚ ‡ùvÞ­„ÅlÀôœ.íXÎjëlgq‹#fKOSIH³¶:öÔä7ôÝ;ËÔ“çGyÄÛÛ;++ë6dzºÔ·ä«+ÙãJð©½7oq¤¥¥¥¤¤´\í×O{îÉHÓ Ë:ê¯Àíóev“^Ìö—K B¨½bP,´Ô^8ê-,GGÇÝ/îAéGnC·g‹ÃúÔ¹gx¢¢®m.SÉYÒÉxG®JÍE}ñ1 ÆuÍ€pêŒÙË[ó‹ÊnN+Úû.µq i2¿ýØ®¥édà=ÛÀiéýîBÅÏècœårãÃKÂ}\DêÃôâCØ%V¬Î|ìÜ‚èŠ õ;Ojˉ­c®ȇÈí[cÊÉsiié®]»¢££M胡QÒéexÞ¯;jùôßï›ÄC P(²³³[ÊzB½ÇDÝÚH$…4Õü¬£þ Ü>Ÿ]ÂKÐy•ˆE ûñÚž–‹z kddäôÁsÊR¿fXùõÁºÎáÉ.ÌëSçïË:ÐÅüZ»ŒG@ûÀ÷Ø0Ç+©E¢†SgW±N³LšQÍ_wã¹ëÚøØÐç”6Nõ·ªL–ë¸ IDAT}ÿ8Y5¦Ôm? È'ª?îÆjÞÃ{óEk~·Z³ḭ́Ln]v‰«3v6·>sS‚nÃ*H{¾= çÙ°5_¬ë ÄŒxpµuäSñ!2!`¿'¹íž¸ÁÁÁÁ zåÀQÜζ$wg~rϿˢkhbÏÙªŸ«Žp–÷ë¶,ðД˜®l+ Eº‘2V­ÎøÙ†³›dGÉdöF9±9lUgsC-,vß Kš<ûúú …B©TúðÃWTT˜ÚÛâXQVÿˆfÜ’ˆ§@[‰K‚<Ê1ã€c`}[ÕÔ_€ÛäóK˜ÅÕ¡ÛÝ©!4ÖFÅDÄ›Â)ƒÀ*‘(ýBr½ Ž£Waòl͘¿:Ÿ)ë\Æh;<§“ñ^.•ؘxÿ…öBãúe$õ2¯õ;uDÝÉv{j\pĬïÈÅÜÙßÒ{_;Z9¡‚¦¯€óÖ©šûFNø"MÎÿ $XûûµÚÒY¹õø¶³Õ«3ŸšŽbo—1WY`¡)l –E__iÆŒšmg„*²ZŒî‘IKKã¶°vÿíc'_?7|òœQÞ %ˆ¬óWçʶAeGC8«¹ï”ˆº@Å*é3ذäàåFwÍHDËçÚ uj¯L¨Æ®Ôi£ÖŸ[ñ¦` sc*ž­‹î<÷)l>Kÿ¨òßßW>Eä,ÿ¦V¯˜î«)ÄòŒþäÙêÕ™–e™ü†³›eG)^ä6“sÒžo…ÅLž<¸xñb{{{??¿§Ÿ~z×®]Ï>ûìí\¨_” ˆ]»vØ_„*j¾T×á·Í 6ÂG›!e—¸(À£³›ƒÏ"Àº9[ÙYߥ›ÿO°Á^e!–E^„U= EFF†z +D’¸ÄÛ¥Y$ãW1ée¦òpFصkפjbj¿Lù«óéÒŽe¼&U9d¸ŸÔ !¥m;J4ÛÑŒ´™ ¤ìîÁŒYÕG¹ŸWÇú8Ç çs–gUß¾r¤BIÃæ3`‘üó̵5ƒ§ýXMÑ(!zO¸á¹õ³¸ç OõèdÙ‚:c4iÏ„¶aÕ¦¨ ª¥kh¸žÞÆWg‹™¶&…­ ôÄcöÒË;;ðN×`Å|®W*ÌÛ¹Åɾ!4ÑI~øÏMᔑ˜´” X©^­×ÒÓžwíÚ5©š˜Ú/³Ã ÕùTIÇ2š³MÌðÀ÷—âü`{³VÆ¢°u˜¥ªíjÇ€viûO#_<Àm>Ïf¯Evžÿôž~æÏà˜êŸ§*~Kïã,Ÿ’÷Λ=+ÖÏ…³¼ýù_°«lA1Kykn¨²×=¼ŽÐlJÛ#åRºàèUKŠ5¾:[êäÙü_Y”ôÄÑ«- Cñb®ÂÍT.(Yr¤t‹Ü¦v?6ÄŠÙ—‡á^eêßø´uçÿ‡ùÄ»ˆÝô×ýûDÁÒ¥ËjkkMâ`4ÌM•4s¾²#•)æ,ßSñBÞ…ËŠc¶ÕDɒݼø±Y5Ú>gKƒãò7Ÿéoþz¸2Ÿ‹ãÓ5+N±íêÃqBø6µ™Ÿḭ́Œ@:‚]e#êÌ·0,³ó¹mùÇ’ÚÍçuÌH{žK<óÍ7 šuóIc¶7Ì–S¤5‡ù‘¹(|M€'^ˆåÛ«J#€)8rµ­gX'ä‰$uDý¸)ë€ë'¹|Ùò(yr·k¡3‰bí%™Eõ;vì0•‡€q07u¾TÓ£®tGƒêÃ^©Jê*ÖYıî˜m5$A. [‹/Tc‘æ>%ôü†ˆ×¨û¹ÍçæÚ¬Î {.Âæ3`I¨·§ÚËYöË£cf-Õ–ï½Ú”%–ùWÙŽ:cgIÙªî"?íy“—^Ü::ÍênŠùNžùÑêË—/ÿî»ïÚÚÚ”Je]]ÝË/¿üÒK/½òÊ+&tï–d_;ÓÒ‹çNlJ›Äc²(tm‡^ävY»ƒ‡léÒ¥°ïX=úu¶ån×DÂQ„P¸ïl¬b‡ÕÀõ“ÌÌÌ<ðA¦H0æé¤oâŸÄïœX(–¥Î§K;–òšTeqÞ$©ó^hõ1Ûj…â“管ֵ¦:::ªÕyS‚Ì.(ö¥}½þƒê›—TBæ3`A¼{æ¶íüjˮ͑ü1g+bWÙŽ:cg½D>Î Ùª nBÓîÆÅŸ)Ã[[¦œ<óSº§Nï~þùç¿øâ‹˜˜‡Å‹WTT\¸p!11ѸþÞƒc½Ç‹«ÇU:M/„Zãc*—Œ†T´ ÌYl7Ä7²ˆõŽËÌÌ ‡)4`Åô(õÛ2)¼51ÛK"6Ý##ÁŸ_:“?ÞMêGn#¿$~ç Àl±&u>]Ú±ŒÕiRåh_€±ú˜m5RIPˆW4ftlV¿U‡‡‡/[¶ô§)î¯PÛ¹ÍçD¶&¬ýüž,Ø|,ƒÁ1Õ»'˱mçȘ(þ¶sßHWQóEìB›Rgl@Ø Ýrõ¡Uçu4DnO…)'ÏS§wó^¶lÙ¾}ûººº”Jessóž={"""Láòír®êpCÞÌùžOg{Iü12‹Ã×xTaFB±!DÓtff&„nÖÊw¹-ãº)‚BÁ¸Ÿ[ BÈQ䜼ÌD~þ¬8))iÛ‚Ç'™<{†½þîFu ˜UçqSÖÒúòÓÏþüÞ¾½¹LêéQ–Õ·Îeµz”AÆùºÔðǰ*Âêc¶9…¯Ç,In…n¨óׯÿÖ. æ0™Â €ÍgÀ‚¸mçsU‡iF'öÄÖÔ˜èf×™5¬:\ØÊ˜Y óÁ|ö-–eÒ+ö×wEbv[ˆÙV3_±2Ôß[f½g!±Dý3„nÖÊgzùîU¥B-YcG‰Lá”1à÷“LKK[?÷!—AGрΠ‚(ë·7‘ƒ€Y°ûûÚ_>þsÏÿõF­?õˆ8ûSƒ¦—wÎS•ŠX¥úð!í;¹:è4©š°Ìb¶ÕÌW¬ÄžB˜¤­!”——û¦È×°76Ÿ“ØêöóŸéusãv¶YÄž¯>‚]hkêl'ÐbÊŽ\ºÿIõÕˇËU lCf ¶í<oQ›±mçÒ–~‡656§Îz=«–{&Ï’gñœe›‘Û7&Ï3Ï÷å{«Zã1ãüP÷`/G“øc‡­ Ô«¹-ŠZÂ-}™Ä+0(«ÇœDC¾’F„PˆWt€GøM®³Nî ßèç†OTN·Bü§-âíXCHµ‡lkMÇÐãï’Ó¥©´vòœAÆK%õºþÄyÎ2œfˆ~Ãgßyˆ§Îþ´qÖkÔý,¯ç³¢í§Œî,Ü.CãªÝºE¶ÿCÝÃßvF­<€]h›êŒY®ÖÞ!:Wƒ=ËÄ"«.Fr3"¤ žT£:dc`”ΪÆ7çÛ!ÔÛ±Ž7yD-ÝÃã†é$\×9<ÜÑÅj2)TuŽŒÆ&Ï_½yÂjXbê,qðÔ9M Ùl'nc !´5I†âŽðÞ¤ÿ¤ú⥃ecJè^˜)voÿ),ÛùÏ›t–ÆÇúòÏcÚ¦:«ñ®WNPIô‰aS7Ö^_~}ÐèÞY0yžIjkkw¾p_U{4Ãêþa'F*N|lõU²øÕðŸØùÄÖÄx¶¥@|‘ E;ëdÞõÖ¾1Á†ù^EÙ Å)ЦqËtˆ¨ÍjñuÁoùÃ…ÐõÝvq %îH“Ö$b•2¶³¶Ã ‘ÛgÊ:Sé"âFã|J9Žˆí´Ÿ51¢ª¾Øf 5,1už² ¶Ø›køŒ" â…M‘¯´e·ãÙº9]éï¥[ù*`¡ô*o™íŒ:˜½GEOð-6«ÎUçñbÕíGdþþWȈcصLÎÁØ|ž˜<Ï$;Ÿx\0ZÓ†Çl£Ú³H5nõU²øÿÀ¼¼¼{Â×zà‘Û»¿¯„ê}€Uò¯Ì:Ì"umt÷ „æ)VÙ &»ÈÊq »Õ`Æ}ùõ¦ð0Â|œ®ñ6ŸŒ¡"·O—¶/c¯r‡édœT¢s“Ö\èRM0ÈjXbê¼8 ¯¹-pb«Ú ù–mIrQpü>j!gy^õåë‡ËÇTÌŒ×W¯ë?>u‘m±Ç ¾Ä.´eufu« ÷'+ÆÉœe «&&Ï3I]ÓG‡ŽIðUg TɪáËÝ‹Âðý„ú.eFE§qýƒS~}0Sï‹.Õ´“]çÙ¾û±·ª3Öw2× ³ÓX¡>Nµ¤¶|f(ÛZÝ>ó“g†e3ÊõžyY»,ªÌÔì½Ø :{â AŽÎ?$ô×mÑ¥T”ÚÆ^_1púÕ†öþ±N–>CÇY&ÝvÎÌ?.tÁ3DlYÇÛðî¹Nöù «1¥U×[zGëš“ç™$n•UëlÌè2Þî0ÖaõU²jkkGGG)Š¢(*%%Eý}`îBw§vlä[§JLá eÖb!vCþîÕ¡÷0…W´iÜ25 …âÏý^â€/+|v Il‡PoÇZÄÛyFm†(¸ßÐç=pÍõª‡¸€Rø¸jû-…xÄ%Eͳ…–“ª³~Ù°ÂÆ -½:QÙ«b|ü#ã>#µýoÿ@½ûDY×гá¥C?=$e5}•Fèï‚û^Ú… Û½÷¯˜ÅÆÕùÁÿ ½ÃAed€úPˆèÕtîþ|ˆÜÆÉó  .Å! ó`ÝÄM½¡ØÙ<¹†_‡ÃZÙ±cÇåË—iš¦iZ,«ÿ± ÃÖÆÈ˱‘Ç‹{ÚÆMá#„áqÕž,<³7Ì÷*I0È&‹‘ð™°Há'9rþ¦“g~e#«/ãd›`;Ï Û>]Ú±”ÑÆlŸ#c$.mRÉYÖ%þß¾eÆ0n¦ÎvÎüa,bý»öµûc^<Àuõc»î9öÊXüÌ…ºÎáoÏ•>Ekkh¿G­ŸŸ¢pç´÷Ã}@íÝøÑÑòŽC„¶MÝF&{ßšÛ Î0yžÔ¥8æ¹Ô´Ç2 Å?ål/x`®Ÿ©3&XJ•ú±Ðñ‰%QBÎTYEï¥Ãæ3`=|‘ÝÜ7¢ä[ĨK…ÙQ¢ù!«Mä—Y …Û’¤˜±¡[téÚämoø•¬¾Œ“mêí¤×­jæwžO—v`ženõÜáH¯r¶ÿ¢ÿPóäfê¼ôd;üÒ!<¦ ŒÏÕ¦þó—‹Êç,o¶n^%sá{âÉÇíCǰkABË"·’„ÎLÐͱ¾ZàUCÈÔ‡"V¹\™¨°:ó€ÉótÀB’’’¢Vøv+Fݰ‘;ï 2…ƒ& ---55U?ÌUìþðüÏÒ1 8\`Ó!€Ep;AJ—k{òêû0c„´!D bEôvƒ{iöø¸øß3 ¯ÐÛÂÌb*ý웽èVƒ£Hà誨´C*)ÓYß53›Ïê{Ö=rQ‚²Ì‘Õ¼.·vn\–A/>ùöŒ|œE0…:/߀ >[yhpLçëç²b^ÔnJ[ û)úÀþs¥­Ð0ê;=é§o?£üZÌjÂ[ ÷ÿˆÖ¿° /†7èÒh'ÖY,uVããâ?O·qXÏJ~÷ Lö¾¼êÌ&ÏÓ ]øçoG¯”V·ãª’ƒÝõ*o[) …âfùc?]r¿—3^ìþÕc9Fô¦Ãí)½ŸŽw¨r¶ïõ•4 „âê—´µM^ظ :Á&Ãã.kç#½웽èÖD˜ÿ0„m­ž¡šaê{vÜ#‚_g;Œ÷umà>Ï ]iCo~S¨óÚØb;ðãªÑ3eßb¿áÿ¶DýK´¹i¶é\Ø‘_)÷ÿq_±cÇŽÌŠ® o2éœñUÁ;îôwóGŽN E,óÂ.uæØœ°Û|ò®>Ä‹Ü^Åæg•]ïU‚:sÀäy:ðßöΞ=ûÇž'$ÝaذÜ}Xòr–­ŽÃë4\¾&8WP„¡`VÜ2H©gx⛜fÌ!-T¿¦ožm[IASÜ¿I!!^#ØxÚ±½³[ÀžâE°B½u&Ï3Ø­JsŸÊâ—ñª…eñ2^“ªÉb5^βä e˜q_vZEµÎÄ8ÄÛqÍl¿¶p–'é#99ç«ðt 0yyù(釤¿"Zm©!d‡W=».y²ôkÒ¿Ô™ÃÇÅ®â^‹kc±_ ¡iôåÈŽ-šÈ?RØêÌ“çéÀÛ³w8„NäÖ.ÃJ…QÌDå‰ ±^Í£‰³í: ',"úþlT#ÌŠ[)}r¾at‚æ[(Jâ]ŒŠ÷_셷ʰn¦¾w.™…Yšz#6†^¾|æ0¶F¨#ÿPÚjfhòœ””„Ä7‰{<«ùF1ˆÈ$ã¤M„HBÀâ?ÿæUŽxåH· )bŸùÇO±aµþö!»ì:¡‰··GÊ]ªÏóe1”/LBÀâûã=¨­ôEÎòÁCÿ³6ÒÃIg¢<ª>Uú%v-¨3vvÓìoó™$?š#¤¶æö&:{oÞ5Ö±õÉóô¶:Õ¡ A „â6È;† ÝøZÙp)5ÓEO¬G½ôÛÿó& 1c#ŠI]®óLJj€Y‘–––’’¢îÚ××7oÞ<þ×uLI¿y²»$ȳ\$EmJØiMÊÔ÷ïÎ{â)Rç={\e/ŒLdJ˜ÃØxØ63IÁíi«sä²íK˜ i*AãbÆÉ¾!D bkâO@hø<ÿÔÿµ”öcFûá¥ËSùü’+çFËN½$ø7f“EÖe~© €q™P1ƒ›_¢÷p¹…DȉÈoþ{Vœ,ùjxOÎuÆÎÊ$AÉAKù–@ªƒ¼Èí5Lnzñõáq¼v‰Íbë“ç;Úêä´|ÇŽiiiK–,qò)J¯Ô®ÀFÚ È¡VQl<±!”——7–s3Ž(]ªÿmôMïå b¿™B¡PˆÅbuÔÂÂÂË—/«¿®áááK—.}yoîõ>¼€g„oB(Öo~ˆW´)\6%Sß¿žNvK#]±Kzc"ïõE0‡±1°°mÛª¿óû*© ×$ûŠòÓŸ¼ŸQZYs›Ÿê Ìïž¹Ý}1•)æ,»3ßžÏ8£Vgõ·kT9|ªô+ìZPçIß®7Î~œ@7F*©Ë†t"dKÐPÒØÕÅíFvÛl±õÉó­@cZž–––|_pEÛÜQwläoW…}ùÁXÏ‘””ÔUPæf׈ٙðÕ‰nüñ±jÓ‹â†Øo`™ô±@Ótæù‹¯«Âì^.-žÎ­¡-¶·°nãþÝ8 T6÷††, °sÀ3Ÿë ÛbÛ›»‡&t»UMWÏ)h^Áp§2HMÂ3ER[‚ (.IIIm•]µøâÅìr\¦J÷ýz”“ÌV­'®®ÿý‡·ùY ÎÀÝÓ54ñÚáÒ¿¨þÃY2Èøô!oT}©ÕùÆ·ëté×ÃãØå Î“ª³²nÔN )’öu«;Jiknod²÷æ^7ëf‰­OžïhÓr{wÒ-Ú¯¸i>6,ÀÃáù 6žX-k©ï[QC6¬}(T±yºñÇÇþhÓ ®ƒ<`¹éc!bååˆÙâý/ „býæ…xÇÚ13ä–÷ïwoþž uöêi†º>¹ö')0‡±)œD„P¡éF¡îVU§Û­jšêì©#;ýXM!«$Ê&#|]B C×úº ›/J7©:Wgô`Ã=DqäHWG®\p˜— ù"ýY‡KŒ~ Τ€:wÏ®eÛ‡±š‰Èç?F¹{£­?’——7ª>Q‚g;ƒ:ßLwìØ‘þéU~ùƒ@OÈíõÌ•E-ãºKœ6‹­Ožïhš¯ßEí9÷FnÃr#Ćýã¡8G‘`æ}µ(°e-õ}[{è;±Ý86²ßg‹G€Ó¤Eƒ¦\!yÀí3E¡úÔåË—%‰X,NIIQç?#„e‡b7c¿Ê˹EæVÚœ°¢ÑdwbAîe¶.VÛíOˆÜ Øu„÷³‚i­ÑíV5Muö›³ŠÉçì™dœ‹k»`Œ"…6˜è8)“ªseV‹L„ŒZá‹©3Eo=÷¼àÇã„æÍÇŸíü9:ùüÞÒÛùhPgàö™TF+Z¿É(yV¥í¦öêÞ¦Q2EJhÔ!„ÐÈÈÈžY¥¿í ê¬FÿNÌËËëiiºÚËÙåî×. fõ!MŠ7Û5Rr¦´ÃÈ®š'¶>y¾£è´´4‰D³RN¹*¿¯ìhì ÇÆ¬ˆöÞš$3ˆ¯Ť Ìb;ác‹<°‘íÁ[—ŽŽêÇqM/¸Bò€ÛgŠ0Bõ©ÑÑѾ¾¾”””ììììì쪪ªÔÔT2j »a¿jvà„PŒ<%Ô;¢ÑdwbRRª=‡ kï¥ÿ ÃÞÁ’6¼Y×)÷s(ÛZÓ¡9Ç^ßû¦h{7á¢>tdÇžU}õ¿_—Üò£AÛG_FO•´W\½ºƒ>ÉÙ_lëi,I ’ ß.R@,|\ARx4¨3ǤꜚšÚÓ0ÒT¨èÿgï¼ã¢8Ú8>{{…;ÚÑE¥ ¢ ½Ø°`ÃÞ[Ô &FMŒ½Ä¨11–5y-Q±E1ÆÞ 6&M8:Ò9ÚWööýcÉrìGP`¾þàfg÷övwæ·ÏÌóTWPç.m<Ë·“Ù³g7¥ >sxžñ×¹eÔAS3=µþT³°Ë¢b€yÕH{]F©_è3vE“’)]¥]^Wî!MDÅ{¤ÒM1¶G!É61í,b mhô°]AWTshd F IDATõLJI¹P/«ÄF,­9ùl'Õ&€Á“€TyãÏ“wÛn™:wëï7—óÙF\{褱™cúÍm¯ßÔP¡Î\޾ùTJ}–Ý…¥Û:¡ÏU-ÿ¤ñ²}ÒãßžòêÕÒ*PdôÄÓ Ýœceád…­è\ãê„sÇ~“ßëǃ[ú¡ÆNBun"îãoÖ.IŤ×hsó .d…²§¾ ®›C¡+¨s—6žåÛFDDDSúw†67ÖpzaEOÅ£œãÌa¢Šå j Ô ›÷X.Ð+Ô´³ùî®Tt•vy°„4ŠŠ÷H¥›Ž<áTP“Þ9š>TD±¹ýFÛtE)¤µ³ÿ»åÖj”­qÙŽ$¾ NºÖ”C …BEQõô„™º;*Å饢«´Ëë²ý`—E~¨%$$D~Ø¥UBìV^ˆ-ª¤N;;™=“‰þkµ°°0âAµ±±Qñ-]6e޼µ“û종5´2.gaà;/­:ó6œ¶êXªó@Ýä³%žOzn7O«ªüæö_ê'—gûÍYO# O¦fҨÆÕÕµ8½:%˜º M.?¢Î_,^Týè×õô…B¤ö½H¯ØŠ_¿Õ"χ¨s¯ôNÈ›ï¥u/ÿмdî³û›ÈWK/N¼s†²/T禠(©FZ&“\—˜ôC½ôiu“ϳdÁ¾Ènú¡>œ=wRD7.d}žU=#Y¼øxó ÉÁï°¿>“=ö–ÅEÝŠÎo•/j:]Úx–o'.\PÚ¿s¹\Àæ‚AËðÑ;k%®_Ýdï^l¶›E`` ·)-§NÄfŒÈˆ:ûrY"ßöBCCÕÕÕ…B¡§§'åN)íòºl?Øe‘j™8q¢ü°Ë‡‡ØÝŽÉ?÷’úÄigwÓÎŒº”þ¬niY Ã` Ÿ"õ†½œÖ¡®óWTÑ#¿Ü ÀîŽy¾[Eð³Ò4˜‚¨Ãam¤Qµª<2ávSÕG‡¡ç)Í-µ”_áù>ÍE‡Ÿ}üðÉöú5¬MºWŒ ©ÉŠcs^PÕ¹ 1›—¸‡V&½{袋ô»ª3Dž«³“->µSrRÔÎ.V œïóÍs¢!uh™ èГ͊£®P›‚RIe?»,»`eÿêCV-‹x“˜žU"hú¡>DÓ‹ªÞŽÙ'=nƒçª‰b…Ѳˆ›Ñï›u̧KÏò(íÊMÌÌ…–ÃÁ¤ßõP€P…àm[™sj]ok«ö=Ù¥¥epPÐÕïgPÊ…bõç)c‚¯Ÿ ÚO”È·C ÃAXX›Í†¢ QD~¨…ÏçË—àhh¹P²ä4u/à.f!ÙÑeyÑÕUHàŒ(Ê\Ó‚Áf=tØ”:±Yˆ‚“¯]Ž8¢ô8 …T5k|ZÚŸ½ Õy4¹Õªð|ù„Ûuå X_ÄÊ‘LÝg™µˆ¦¯!ýð b+hhÎw~Ý5¢¹W›_\9Íu™âÖà¤kTuŽ8û»l™9Œðýر2óQÚ†JRÃ@º,-Vçý÷S»eO’ÕŵnGçŒóqîo¥K–” KwßYVTIõ%†êÜD”z‚К(VG&Å»ëdijz¤"µiØX¸d’ôÙ¹—J&ŸÛB¿¹»BðwO¼¸¡úñèg‰ï«Ãn  ñÜ A‰E[‹f&5å=‡UòýÕ3Qš£¢J“çd¬%¢e—Z'¼w{œvÑáG6ibá{‚¶ëøà+u‡¦¡Ø9WW× ±[t,8Ouضí©EËL¸^Êçó‰÷xDnˆ òQ ˜@,:mõ(kJür³¢ŠÚ·ð[1gîÆWüþ{hÊ-J…†d¸Yã#0júS —‘Fš\̳ž•ÒôŽýà‘_'~ï¢kÂä–ZúauΙ'êr5(j_ddä«?3Þ'”S«"€ªÎ†ÂàRοr)y¿—^¸ýïÓ–ÛÏP;-Sççb– ÿ2ÇkóËJôÆ{g:ê¨3ˆ¸rç/™:Jb| :8–––I‹ R*­ ã/Ò†È@íísÇS˜%ùß ÔoeuF™o5úÿ"=N®ì‹è9°/·<öñÖë´þä.cd¯o¶oØs§5ž3Šß]ILùß«ûñ§Ù#íc²ËÝ·í*ÕGܱè‚AÖ··Ot0׫·ª3mÅvåaªÞR_Že2ôiòx °u½ñ¹aD¡|÷ hUúº ôl!Ÿ,òíäííMnõöö&FR[bWRU1÷Øs€×w0AðÖw§º}6aÀH9ˆ~ž†õ€^u‹JBun¥êìãã#ƒÇSebJ}•Wçˆ{' sÛI¯Ëc2]öÔMýþj"YÕ¹«ñ!ê\Y#ýæ|ô~Éò³Ž¿°çþ̉øX\•¿÷Þ×i…J¼Æô› ÕùÃ!lXX‡¥ùè@rΛ¿è>äÖ™ØÓŒ"›¿Þüpu¦@Ü5¶‘•†½ßOÒºôéOhŽqÆÃ7ŒµØj Ÿ"ödž¼È <åuzYkþ~•tNã¹ow-»š”Âc!é áþ÷=¿fèîÐõÿÄ‹¤Ê—HéÆÍòw>íaù(óEö­}ˆÂ*ìpX´Q;2KKËà'9¯15Ô-«Ø&ñ½+ŽËnÆœž³{°~.ÙÞº‰<ÏÕÕUéK’RÙnèuvµŸ ½x)¶;KKK6›MDÝ„……5ú(ÿ®¡¾ýF˜Ìøßª°T3ÊV³rÍ(+ˆ0ml³ Ü‚•_-‘ÆQ×|Î*±É-“»’4ÜeŠÉÈu}4 êùxcF\pùcΞ=›ì,^z?¾`ûõÄÑ¿>×[q³ïæ‡ #¿¿š`»éÁç—rí<[¯ ÂáÈg‰8  ´¸Ú¢õ©««×ePž¦1hØ:Âþ"õî¶ë *rÈÂÜR«úy¶]GÚÑåÒ‘@un¥êÄápeâÇ¿¥H„Ô9dŠ:/qÕ¸ÂG3'+þqú~ÔËÔRÕ¹SÓê¼æï¸¡Å·áu3%ëéŸ/ëˆVêüí¹ ©…us’$#úN‡êÜ2(·€û …|>_¦ž~áÚ ši¯šâ…î¢ô¾eËÔY…¤wÍkí™Møc¼”(!Œ5ôE¿ÍqÌËÎôõõusè#(H BȽFË"ÚÓsÁÛqš»=ùßã´çbÀé)`Á¿D‰ÍùutyaN@@@xx¸‡‡G`` qwóø5Cw‡&ç+pæ0«Ü-›é'’ƒ Â.djjhVTPg§}}}ƒƒƒ‰ÿ}||‚‚‚Úè§u>|}}ƒy0tõœcQD:Äö†‰Þ;€¨Jú,g­çÄãñfÏžpss»páqåo@SS³¢¢‚èBCCÉ·d.—iiiIl¢< O Å;(ß¾”¶;--­ÊÊÚæL<**+2|¬7Ò»€aÚçaüL)Æ lµ£6H¯ <˜f@¶5&“I¦Zõññ‰ŒŒ¬0õ(`¨É×gÒkÆ8žÕb×H–аˆKÙ)O ‰< 䔿­(Šbh(è38NLêjÒòh³Qͨœ'g@YfC$Š( H§•Ѷ£î ^qÄ,~ެ¶%®¡/:[v‚/Ò» »¶ÒóIY†òz@unªÔù¿;¥®®îîîþRËçæ“é²§Dá9tèÏF~¾}®€f©óÿ§¤¤Pny&¾³~ßPÉZ:^[}j¼ûê«+ú×ÐnÜ|—ž¿KkW删Y¯´<óÃ0ù¶:w˜™ç¨¨¨¯¾úŠËå"Ê–ŒRdîS«çhT#ÁúÏÝ  Då– }w?mÈr6ÓOçHXÎ òÃ.d\ù 8m1hn$H¸C)ÇpzPÒ¤ØìAGXôa_Û¨yEe>µ°0W:xI™R n1x&?¿Äçó‰]à¨ä'‹âh¥ÒBÐ@»kÈ7AÅñÚºšã¾ð2#P·°|’0UÑr6D¢NÝ ‚S‘̓ôߣ,Râêê D• 奾Xª”8E‚1å é,´ÿ<óQkìÌ ||¼ÉÛMKìá&ìî T[΀r!–£é&üJ÷Yé-÷ü(NNB7Q4Wü®|OY­ê‹µÛ;ä¤w‰“VÚðÏLªå @q•±™ˆOZÎ5€Š:Œê×M¾TçH,u‘÷¶üÕÙ \¦äM”Tç^F¼Þƒ~¡O!7MÃB{å>Þr5ªs§¡ÍÕ™©ñVkÐañÿH˹Q[Cÿ<çÊ–©Ë¼Æ²œy¯Jž|Õ¹¹¨Rçÿ "ÆÏl¸ —s{"ö²´´‡HÊMWçÿÀ0L1NªÖ9EŒ%pÜ÷I“–s&0<Ìšv`¶C½f¿¾ºâÿM¹¹ÈR ²23X}ºÕé0Æó¼yó Ÿ?ÞÄú\ÃH@¤M¥Y,’où/b’½~š’¯dy &*lsËÛö:‹^l6A£Ð’ÃnP}a_ßb,--½¼¼@ÄY ü p$:spHòx)Æ0´Q?øhíÔ=®Åj)LvíâUd[’oêdÄ…Ò¦ =÷>qäc¥yäo´Òv×л²üŽdÎöþýûØßwŠ;f“íÿ“­®‡X„pÆÏI¨¡ÎL¤ªèâïÄ8&|„š…ÒËåêêZÝ”zŸ‰Qø-è=7–šª ÃÞêC–Y¸|É-R\•äo«vwÍI»ÀˆÍ@»G³NOjîe»àW ‹Z73ù…ñP…—jš«Î@þ–U¼—wÛ¶Âߟ¿ù˜ô¬‘ÃÓ Þ²óñB­¾R¥Óži…v3±òc(­Ÿƒ•±¾F½a¨Î-¦V¤>/*|¬Æåè+©÷Ÿ: ø« £b rËég¼é5p,YÕ¹CÓæêÜÑbæË!x]0óft¾Íš¸R¦ë!¦«)7[r£+žŸäAunªÕYþNMp6~lòÚ¶5€p,‘^dKî¥JpssS±èl@@@­õn;z;e ¬.]Â:FÀš‰Žfzœzê\‘Ÿ_^…Ôæ¥|$y«½<·;ŒñüöíÛmÛ¶ÙÙÙ5±>ÇÓ+¡QíáYU‹–¼IÓ±bf3òGzžVD}iigs9iiø€d’Ë’ÅÃ7Aõm;}† f‡¦fYl{/vNµH‹ø¨¡Ït™ÚsÚ>çÑûzÎ1÷žá˜Qœ$•Iä›:áú˜2‚óHŸ8 ‰_-™†Þ•É'¤ÿÜ2^ZyŒÅm´o¡Ù ‰Ïò^zt&M$å<ŒŸ!S“&Ѐ„õì0.¬õ1£ÛÃÌRª¡ l‘zLÜ)AéûàïDzèT=Ê*¶‰•[¹Jžâª÷W£Ž¯¹4éçÛKglôõ[4Bsô2dâA¾F ;ç?‚Ó×]Šò—ËMII!ÝÏà-VJ Ô™HÊŠ¢(­ªP~µ*<—héX1ói‰þœ»ü¼ß¡'›^¥=@Ê]ïd8=¿Ìq¦¬Îx¾Dóšâ©jMä…õðÎÓ?N:×Kϱ¡ÊzFR» ¥ôåPûŽkˆów‹óíçñÕ¹Цê̲ñîeaµ;O–?¦9]âxõxFg*7Xp³ êBéÕ¹Y¨VgòNñx¼Ñ~ñŒW—hCÈúó°'Éï]ðú—uö_4ØÄN¨Ÿ÷… 䥴ôÚçŠÁFûß$½H–ߥ¹¥÷ð]=Ò(¨ó’Ñ.÷кƒŒÆ".½l§[Üñ‚µšèÂ^çÿ_Ì3¹n¾7Õ"­q³*k¸ŠûöíîjŒP–#'èÞû;D±¤-¸“?íp˜P¬d} 5† O÷ˆ^Fql¦O€:K“²˜t5SƒEW£Ó˜¡P˜PQQ¡ÆÔÖ¨çåK9Úfýœ†" ].GÛ\¿»®:[‹M×T£ëª3ûtפ5ÙóÒvÈÇÉxzz²Ù솂ߤ˜¸ 2·²¦Œ_]\QSV.,)”ˆ¤B&“ÖHþóûWÄÒA ¸¤åàJï³DÊ|?³¸Ê˜ºA†à_@V8—ˋŔ3•Ò”Æã!KNSG<Œ°¿ÑM;Q±>†Ó“ò\Ⲉ¥j Õ!` 2mÆû ‘–§ŽŒü0©ïÞ¹ò!yÑÑÑŠa™òÏŒy&i®:Xe‹0Ù/Þ¯Î/ sê:1õu¹§«^ÐèqÊrÙÉúŒîW$?%U€mËLþuR7íFȇàëëSÂyç4±BS.—O“ÆÏÊÛˆýM–Ìe¬Í¶Ðf£TÙLu™äéÏœ6ÇÄØÜ@³»¹¾-¥®ùè´:Wà^Œ»)øÑO!6ñFÖ¯vö¹™JOF\B»÷[ ?Wzfų…ꬔ&樽’F}úŒú"L¼’,÷fìáÚÅɉT£ÍÖCp´¸°¸²¼Z]]ÝÆÒV£AnŒŒ,|_œZå;g•þNJÔqðÈÚi#ì BÀüñÏvž~øL¼†(–ý8¸¾ÒÓÅ¡­Õ¹ã©~¯EÝ%®o<£ˆtŠÇ‘œR«¨ Ÿ GqGûž¯\ÌC!}#7éq†ºFC©b mAdâo/sÊ„J·"@ÖS/ÍÚ(¦‡A|Ä«¼ZŸ/Ô/èñ«õË…z±&®àJÁH‹5Æ¡ÛÇn~v†Zlj¼+¤ÝPÑ››3¢=FÙ{Œì›UžLˆñ‡SXÑóyʘÊ…-8x~¼{HÕPHsaz¯XúR Ytš}Ož‰ÞC-vi½ 8’Ql•é]U£<ŽÀH;ÛL/Y_+OW½€†Èp@Ë)µz÷Þ!—o¥´CèUšzãñ?¹ª¼Ò#¯bÐx&i®:vÂp7v@r•æÍôù¡:¦/TTgtÄwÇôƒ¦Êžå¢Cï¸î¸µrà‡þˆJˆ;hh­9d‰G‡©XA$å܉\p§z»#žN”í¬}ýú>î¡›ÖÄoAitS=›^öV†ö½ ûhB‡‚O‚¶Sç „ÉÓ ã¶ÊM;/¦ÓSÃÃê¡be¡Ot ˜çómEy­àBunSþ»’˜tðûéWÖÿ[ݹcÏ~øWˆ$ì[‹^ ט㵃§giÃvpý÷ÏCú»ö6vãç/?‚ä©ñgo‘µ=ñb¢pcÓý' óU[«sÇSýæŽmÓ.R²þ°™ÕB±òD2ýz¾r6äFW¾<—&à‹¬jwx<Þ¼%+^ªyá6*ª±è«Z!P£ Ô˜Õ"«« $šB±º@¤II5Ô\(ÍËFoœ“ñ"os ýCi"I(*ô»‚Ø –"ºuݺ¿0œ“9èm®§Rkʲô9ïÆ¯ÄÿJ{8¶ÝZxû{Ê m7!0ÑM·îÉeÕ¥Õ†¥UFd(‡R4ÔÊ]-‚Ìô’•n­i%L.­6Rø&Ü‘þ(ýŸs.NnNNNä»âU Ï$ÍUgÂxŽÏéï–&øEz‚Øúé;WwÙX§3 í^§ÎjÚÜ“ÅKØ 69èhæŽo–-œæÞ¼ˆwHÓ¡dWf©Ó‡}æ¢ÓAÙÔûžUÒ»8Á9X¼Žô)¢9Ìd¯ër†ÃTÞ T#.¥Í¼Ôßs6JƒŠÜÞ´ƒ:§Ú—'ÛË?07hý¿ÒZäï|ŠN“P*—f D±º®†4*¾P[‹º+i=tè€Á×$?å2€x0Z;…éi6>ù¬š¨ oÏÌòýÒcÄG1 ;3ÿgïxß@+€ÒPc ‹¸'Y!£ëÔÙiá>³”ÅØ=b—“¨ßÊŒÞàÙïm­ÎOõ›x-È5Êz­ß–ZЯ)GîgòÒÁ8¸0¥úÀÚ³j5ºp™„EmE ÿ`=ô㞌1WmǤ¾ ›¡ ø§AZ ŠÈ¹?Ÿ“ÿ¾y,6GÕ|TË(«6x–2®¬Ú@éÖÕ£¬¿rWWÝÀUUZ‹Ú3ýÉ8[qþ¿ÐQ‰}ÏWvÝÃQTª¢Z„s?vv¹PRŽ ¸ŸýƒåÃë;U~¨»!:œŒ¶ÍUgÂx.èEFN|+þ’•­+ÐÇý¼:«Þ&–QÔ¹ûˆ/¼´…%G‰ ˆ‘α¼þŠÁóÖ‚²ðŒ——W`` ©¹É­W.>;ÊÒ“ÉWM?µ a‹ôYò}æ)#þB@½šMGWÝh„ÝtßÞÙLÆkCZ‰¶Vç ¡î“è™÷„[íñZ÷ì" ÝŸ¹ßÕñ–¡VÝŠîR‘,ëMYzXIÞÛrÂ'´Qñ…êÜZÔ­h¥ÆæÛù”±Ç ¯õ"9‡½â¸uó¸Ò§)7Ó ãU§!j$œ;¯^׬ì—%ÇÐÑ |†ÚýK©©ÎÔã0·V3ÄÇ %#wòÝ>²_𿼶‡Æs-ÍH@dÌþ wb>k´¦)ú‰þ;7ž?xÀ84õq‘w³a9OÁœçH•-Ñž8˜hï›Ùox_Ã{Š{€ø¨Ó“ã6Ŭ{?-´æc€¤díÖž IDAT°Ü$­ÀžWÜW&C•ÖéV•”wiŒ‚ogÂx¥ý·=hKâ&€[&¸˜sXÊ3#Pˆ5ïÅÎQtüf â±NgŒ¹7ãç÷Þ}úº¡)8óLÒ\u&ŒgÀÕˆ/îTüHºø~I_‘Ö[ܻۀL‚dFgE•)ª³Ó÷÷¥-óÀk= vÒg–_ø3§Vû=T/Òk`¥Ñg˜‘©³>DRµ»o柯:à-‹#ªa€6ޱ­Ü¬ÂÙì釜†ƒãm3ÞßqÖ‡²AšH›ª³TƸ=ÿ§ò¿?“=& ç0Ö¥›âD% ¡Ùõð þ;òþ…—R‘’¥!퉖–V¥‰÷$·Þg$ûˆ1 ;1]Û6ÝÕœ›ËOM¹ù<õN…°¬Y‡}Í替KzŠø(LGÖ!7§ºÊó_¨³4ÝŒGœùåq˜Áü l‘:^C”aîAò£.þ©MÕ¹óÐêk¾×Q/TQAÀ7ÞF–i‰E‰5®NîB¡æåû¸È§à ]roõ OKÝx>€Øìò{ŸÝÿ"1¯%þf¦@YþÑÕÕ•£ÃòE/ÿ­öÆý4[Ñr®êFgz]‹øê~ܬÔÂ~ YÎHê“§»fB˹ýñ´Ôí]šÇ»igq:;ØæV-g‡Y9Âþ"G!¡c†$M,Ö„d\é5\ ?Id…‹µ&zïî îäÇ1²×ïxæqŒ¹Ž¾q}g¢¨Îq9ÕY‰¤åŒä/Ô{þ`Óô º ªé-J«zz,íúú„½Óþf·òÝÃôÞÌ¿–0¾.Dj3³¢@(=PÝ'o>€‰àþÛ‹ß]—óòCŽi"mªÎ¯RGúWÅÊ[ÎÑ|¸ö+†ëÎðXñõð=fÝ^3òÀÓË1¤åŒ¢(\>ðcáêê R^Û¥"µi˜@º»¹ëv2 ×b¦Ç×fÞÚ>áÌÞÛü绘 1ÒêICTÙ›±Fn¾íjé²ä8}4K¿°!ËP-ª ɸb;Klg©ö©3-‹¹è»¶VçŽ7dÞܱíøÜ°#Ä[¯*·ŸÍ¸‡ç9õ·ªµÍ`tħ€R7›Øìò1+÷çªY¦òxõ¦€bÕFeͲ¢w@V¢¦Í([$eI¤,1Æ*©ì†76œÄD‘Ÿ»Î_ÑZ⾇……±X,‘HÔ¤C÷á8ªN¯jWÔèVu*…º") €ãˆcp ` “à¢*\*Ö`²†xºjhhTWW‡†<+,,4T‚p15}SOÆÖÇÍàZS^õ±äÀàcÁãñ¬=†ËúøËÁ  !Ž¶Æš{¦Ûî§W&(cb‰TôÅ_Ä%EËWsttü~ÇæÊ>‘÷µ¢¦4·,½¸ê}¹@ï^ìl‘”šBÒÊ0~Ímâw‹¡^ß±ÔþÎ<“´@Yt6Ƙ¾l‡XÍ9T²–ØT¨ÙrÎfÿ>IS­îÖSÔÙyÉAÍ;?¬Áj=úBiv«M÷'îÑj?¢Œ†œ`•¾;Õö›äëìpUòí?ë1Íi:òÍ`Ù¥M«¾Ø·o_LL “MgrÐ>ýzöùœ —þ,é[h°µ÷=AR‘„>:ëêìrÛꬉãç ¥¼²¤FT%5Ôé¾lÉ×FFFE…EûöìOJJëiæõD²‘×.SšŒô­þËã-£Lê9Á÷óOgccƒÙOþÌÑà’ÃD¡°ì˜G«ïíèßÇTiK”bbê\n±`©N ™+® °Y‡Ç ÂAR£ç“˜çf“J;"ùñ1œf{qØùã ]@[ªsÇSýæÊ3ŽãBI÷oïV‹ê¿q9Œ“û.õµ”e…yù>ex<ÞÂE_¼Ê§±Ç•«5’x“I§™êrúöÐìÛ]ëÀ¶Õ5ù© <HEÄm%o´†>ËÄNÓ®U1ÙÏsJ‹óÊÌsùV¹¥–J3± Ø8¶÷“íàœd«@y  ¶iì4Éô}…UzaŸ¢ÊÕ"­F3¥·ú^õÃ}žŽ¶ðUìãRûªÄѶ£Ao?ÀR∠ÀÚHc¥_¯ÅÞt¹žœx¨BBB(b¡´W/ªÌK|y/>aÏmKLÁ a€õ=k£ÚDÐFZ&ˇýlªk]ÿ:žŒ¶-Pgâÿwi<û^FKWÊ'M Xþ•|ê¯zê¬ÍUŸÿç“â…dý¥ŒåvÓ—oÛ»u~ ¤™(5ªy<ž««+Ÿ_FlÚl”²û‡¬¿iÿÅ£µƒu¸Ú”—.¥ê\X‘£ô{ Êr¡ÇÒœl<¡AÕº4¤Î.“{6´J—á%™‚¼·å™XÁ» A®ÍK1z]GÎL1õÛÜ Ï#J€åËܽnÑăÍTŸ T爯¯oðËæÔC1ø*2Dy:mgº!x~HõІuÖì¦=éç8É .¨uÛCŸšéµþìb7BßGÆe¿ª)÷¯¬á†¾ž*Y“b0@£ÿ—‘“¹:µ™D¡ñ e–J£'O^¸E§¢ŸfüWæ0Ý;£Ÿ‘u Žlu„b¬¸J\X!*¬%𲞾™óÞÒXgÝŠ%n},Œ´Õäo.嶺ººRzs—ù/ð‘u/1ì¥$Ÿo•á]RÕ­¡˜êÖãÌb7S¹Ç/¤éPîNLB´é$¡ŽgfIo‘„Ýžg¢Ífœã0U³!ù¹Ž)ŽØ Z j\ÀÏ¥j‚üÇ—5¥e_/]¬zL¥ ’œxš±øu¡i•Žv8G.;ÌDYs®ñ¶OV€Æóª3ÁgÇ#Ÿ~¿»K|*Èy%,-ä“wèf•NJa2|ÜÁ¦oNí•Ö….ŸDýVVø ©¼òäQÛý4Hk‘[&tX{=J°DÔªífúüß“õŒf¨³õ0‡£ƒÄë ö±ù>»|èêc \”~黂˜‹/§–F+Ý ÚK;¹êË_¸!??àlüõ+JM˜d†³Ð‹¦Ü/Å/Å|¡ÄÿÝzk °T×eJeŒ„\÷øìþR™²ø«êbðøg®ŒOj<¤éÔ»fýÑó1µöÎg>°—Þ¼¦3¶”μ´Zl¹ìbŠd $éÏܾ䋅s˜´ÛÉCšEm{t˜2̩ᅭÉàç¤ÇHµ]ç¿1ÒÞ¨ê¬ô»†õ™zê»;ÁAµ•å-pHÓ¡ÜCkM¿U}hÊD—á¼PþÛ{ïìÜ”®G tbcŹ˜È‡·nJ¶‘«:ÇÐ,ýÀw×/üñ+¼_…ŧ¢ ‚vo”^">æ!ºnôÿ.sýyý²¦¨³V÷^bßï‚Á÷}eYDIÂuB$˜®ÂÈ××76ýõ€yæzæÔ$í¦Î?Û6Ið¯Õ£¬ Ëü—Rñ¥…J+@>)šr¿ËåsHúøø.ˆùÉ7·ÅçÆTÐi“cœÎj¨•+9¢º>¹4mll`†öFáñx¾¾¾GGG‡Ãᄆ†€®9µø®m7ËYÚõÐú~BŸw»ýžoöþÒ×¢¬ Û×צÙÿd‘o§ÞÞÞD¦kJsVlËÇÇÇ'22’HŽíîî®´²<&zyYùT禠\öjÐr®©”>ÚŸüüÏwNvn ­G X²÷nÊýG¡Iv“–s9PŸÏX}aÕÈW¯Q,gâÄ :š¬ms ]ÔæŽëŽ—îÅN}{=/"¦ÞjÏJÕÙÛǧÏâC›‘«¤å ø†þ¥~U²êœÈÈÈÒÌê{»’ƒ¨¹¸ÛM;ù¹ŠQ8óÜÉhîÌ3Š¢^^^Š>]òu<==ËXn3zÒYh„œ8©°¢§’;›AU!|NTC[`j·¹ÀzP¹†A-B>Z•¿pÊ(k# S=JChÐæÔêyD&ceÕbJ°r„²·‘¶š©.ÛTcªÇÉ:Jç.(ÓËÎ/)¤¡XKá93Ž„+=ˆ‰žðÒÒÑä Î<·Åëv4(ýñ©ßOJ÷h¦ýkÖû”ü#ßc²ËÇn¿öTð éý»öÞwCàçÊ}ü ŸuM•©®>íÀ~äÜL,„Üzõ;h¼ª{ÔÁçk#Þ›«ÎŠß˜ö¢øÅét\V÷€ÁŽ]5 å‰Ð·PµÎžX¸›BY¦ðÉ¡äêR1hN†Ý‹a9ß}øP´Á Ô.‚ƒdc]Ÿ±s÷L·W}bð&~‚ŒÝûdPìÁØ ²d9ã«ûB“‚6RçýRÿ9ÿ÷]ÉÒå:tlzĶὭ­TDbÊ?cxõôEk$€—ÿ"¯-ò_ݶ[ˆŠ G‰ƒ‹‹£Ü!˜Ù¯cÑ”ûÕÄ:³gÏŽˆˆÉdÄãe¤æ»ÜZÛ˜áô—)£xEvJ¾¾"ÜݬIÇ`†vÔ‹uáöC7-cõQàVg”D\Ù@,h;á„iö;"ž¢BÅkÙ‚#OÏ„+ß Ç­s¯ç¾ø—ø.++«Î-£m„¢:ç– íW_N«YH¿92i¦ßI".uw3÷íA[26Ž–E$ueþ~fã´!½õÛû@šŒ|SÝúË‘9§Oñ7%’6¢ ^YÌT¶7"ìeËÔY±rFxIè i?ÃŽ]5JóDXhú­é£tmÇ¡}¦œÙr'èIí HÕ9$¹xòÞGWk¾s–¥‘…;è³#ì¿|°f0]Yo¨ÎŸ8 yÞÛïÞ©Zc‹×¦ÄæpÆÏ"~FΣÀ†Ô91¯Òkë Á7æxíìq6bàÍ9ðd«¿žZ@¥:SÞäÙzè¯wWçääÜùémŸÞv@Πk;uîºÆ3 Ö‚€ú­Q(†……ÉoUÓbø­¶åö`‰Í5(®œTš>¸êAèãûíwÒº¶fê¼¾Œ=s µòæ 4Û8vdyaNóÀ)޵äÄ`'Ð1iÙTñZ&–ʼw=}•Vªd·ª"pí ¸\.ŸÏïÜ2ÚF(Ug÷íAß¿ûÆGG|܈.8[ bÿøøø8-9È¿{ä7éQ²þúìW}¾Ù0.ØM)ž±çÎ}á:ò½´YŒõþZê¡hA5UÈŠ, 9úŽxÊ`Ǯřg]Έ5¶,uj J£>xÓ`ë±MÏÒJ¨óÆÝ‡æžI9\þãHY‹þ)Úˆcæëžmòær”§êüésêYæž׃$ëÕñ¢$ 1ÁùåÞæ1®æ\Å;(Ád ™›ºësìQ.Èxæ¶±Óg®cC”4kÐdèpŸð7/ '’6Ugh<Ãa- ÝdºH’¡~>^ËÌÓ‹©…ý^¼­h?»›j„lƆëW5Ç Xô¼º»ÄnÊßv5Õøî–Áj Á—"UÃJÝÌZ&®Ðͤ£Ó²n\õk™PŒýx3é—{ïÄÒú fïÙ¯å ÒÒÒà3Ó\”ªóŽI¹—!ð†ÒìÆV.w·‰mÕ¿»×¼gâÕäûÙ+Äv†öÏQ?ø™ëÃ$ùŒ3Ï3w¿þH²‘Ì'DXSè›Í:³È ­o?7K)T&2îy;öF‘_Ïçëôäø­±eiP-gB+ e´D9ºj“ÝŸ_({H–ݧ¹®Öߺe˜Šu. :wNFUÿ(­[cì:`«ñÖÈ­CÍŒõäÕ9§ ä› ±¹O¯^–ìDþsØ>Œúßì³&dòí7kÐD©ßA©sJÖòì e‘t>(Y(Tä„CÄÓÓóø‘Àµ#³0è èeça©d)…×YU~»ŸP_µ!ÿaØÃTwÊN‰Ýd¥–3&q4}>Ñí¤ÚÛô;§CAppp@@@CGk4Ï_ÓQÌhéX4Ú+Í:Cd.a³Ù\.7,,Œ’†ÍDšbÿãðvr©ì²Â)–3@ÅS iãïÐêòº À“i§°¦þ§Ñ~qL|´œ«{ ãës\ åÜ™?Èl’ÿ°Ïèk¤HíX3ý#Ý™öâáâSQ©ii-Vg š}$C纄‡‡ÀtS* DP ”•• ã=l¥rËù)½%êÌÑ£¶ îÊ[ÎohVË4×]_5Dõ ‘P;ÿ›ë˜lîI–LÄ^ŽÊ¿4á·—ƒ'‘ymL¼fôÝô ”$-çd¤ç´éQ6´‰êLA…íÖFê gžá°Vׂ¼ÝL&S~ :€|&@xx8ùð‹ÊDÅDŽZc§f$¼É—=@ñ+– ³üß\§6ÿ%üòš{ŸÅç*ŸìÕ-ÖÅ,„…V—¾d=½Ó”YÄVœy†ttíÆU c7šx ÇÁŸ/²VýͯªaÞYë`iœ˜˜(ÿXB—¥Ð:›¯¹w!i?YY’ƒèÿŠNîJ×I/“…Ë_ÕôŸÿ÷Rv8UH[ Ãñé‡ÃµÃNþAVöxæÖ¸Œ\qÈÿ¨]Ñ4_åÁexðáÔìè2¨MAŒ‰¶]ù<·"•RŽË𪳺¹}½ú³ÍÒ‹d…L`8нûä·£ýìZý'@> ï ªm»ÿoÅz'¼6 ] ègÐáPŸxYwYj°¦i¿îjø~éž²dr/)‚§ïŒ {’ïƒæ«3|˜@û¨34ž!“†^¦•Z\‚xxx€úq³GPWWWbG: µÖN×\ ð*udJ¾;¹oÑýŒ sp8†¤¨Rä»;ô­2Ë¥aý­îYÅã8xqŠW'"/5Pi ·bÌ3¤Ó£Â¯›âñÕÐ#WV-y^J¼êñx©Á>ô¸®ìÏYY#õûå™Òõ~¬»E{Z>¢Ñ0ïeñ³@%¶ ºÂB>QЊCSR! (êåå¥èê U¦e4zÝž¿+Ù~=16>å[ìêBìˆ'Q¿@󵯷eÑáÐGE±–UK†îy:‘whv•¬VØskŸä# hÏ Ï–©3¥¦0½¼í%\¼J‘Ì’ä-—ç#tj“l™:Çf—ûxñyщÕÒ+da™Hÿ~ø8ÿŸ§ÚµîÉC>)rÊ„›.¿½™5H> ò“E1”Üš…®¡„bVØó#ýÍ5;¨:wrÕ‡¯5]–&ækVº8Jô…¦¦æ£˜«‡ƒ¾ÃqYYµÁØÏ0Œšr§¿ÉÆ)î K"cc~}’\¬¸©O÷wËÇÄÿEiU~IÂ$2MMM€|$›Šø4˜ç¢šÿLy • @•i)M¼n/SKwÞJz²»á'‹ËÞ´u´ƒ‰v;œ!¤PÚ{W‰}w=–yø[9ûYŠ «é‹/I]î­ñìl«â˜*Ô™R“Íxt.^U¾ xÛõe‚"JyËÔùÌÃè¯ÎÅïÃNΑÕu•„å<Ôìîiömÿƒ ¡»“,8=2‘7{9K슿 DGíaÏÓ(z“qóW€I@‡UçN®úðµÒŠP’q¹Ük×®í»´YÇEx—ïô2u$e6}ùc×{Õ“Êpÿý/îÇ(nêÝí§ÕC€àLˆ\ÝòFÀ…¡DÕCÝÍZÒQ¡ÁM̼My• @•i)ͺn/RK¶_OzŸÿËL‡U#­ÛôÄ ‹‚ ‘ï®99‡¿–^' q€üLŸqNÿ³;«õëÙ #¨ju–Ah«ýö÷ëÙ¿µO¿£‚ɰÝw¿JΦ–·H”öùÐ?%{áuËnóÆÆ÷þÇþ0IÉrbÎ ¯¨úìó¬³/²Š‹Š¼-Ÿëä`Ù­£«3t|‚@šJ`` §§'&Íçó'Nœxóðó”B€u·h+£xÊ.B16íPX•HJ=Vç…DaùJ©åÜ«[,i93QÖW^;=œ’¡k”H¶†×AÃ1íŠ a*rÞP6QmèPöa`/½û«El¶Ò¯×Ç>H[a¤Å Úà}Íê›uôÏeÿ%B¾IzqCá>ߟžÜxó¾¡}U«³<8.û#dkIU~ýŠO¥a¢¿þ]Ñrn:c2üëó1ÿ;wç±d£¼å\ 4Ç3¿?ÉZÎ]Kõmû¤í¾sÂÍ•Íõ9@;ù9œ€´:ò3ZÄFC¿5¶†ÖšRŒq'æ3¾@Ÿ²Ëboóc \ÚýLÛÂ/44³ú/V¬`iøvÍmà _ ýÑÃb¸Š6} Ϋ-çîÜt/Û[¤ål­ç|`ÕŸJׇ\o@qU › ]kW@ ކï<~Úd?æOˆYn„ó¯I~ðNþÃmÛã[1Jü®U«3…'IWÆ-Òé;Š:u®“M×ð(W´œ›¥Î%ü ç%7Ÿ?R´q‡ô¬¼å|Š6âK½W7Œ–3t:uîäC¿plÒž¸N°°oxñnLjA?ÊÖQýŒî|;A”íÙÁ©Õfi€±»€u‚]›]2Úñ“^»jV¼¿£öä~­–C§kHkñQœù¡Ê´ xÝ rîeÖúÀ ?jöyËâä˃h‹™+g sùqr_-6ÕÏK)¤:˃Id…9þ¥– Å9g‚AŸ[Z ¤†˜5Kãs+f ï•uï ä.¨ª; m¡öÄdέ•, Ô[á7@:>LáÌ3ÒjhUšgF–Ü-iªñ)[ïÅIÿçÕæDFF |×)ZÎ,º`¨Ý¿¤åŒc`©÷O¯_DÕÛi `9¤31w€é¿Ç}Ým×Ïôé2¹À\_YìsѪ÷÷ÏôÝüèJd^SEª³<(ƒ¦åQ!W)Ý¥s ß"B$Xêík¤h97]bl۵ġÛn/ËøéŒdŸ¼å\ 4g26$õ x¾ÙZÎ’N¦ÎÐx†@ZÀ´ÔU…b*Ü»ÎK™dÕŸ”üZ™éLN,®®®ÀuèfG)§!2oÛëšjedÉçÞ9S‘ki1ð¹‚@:ý­t#¶sùf"ck!Â%ËpþIéþÃ…Öÿ~eüÁ—™%ÕÇ!Õ™R®®Ï<öt;ê‰ugSçÿðöööòò2°ÔpŸaªX³)êŒãàbXŽíÆqWC_ÏÆ‚å·Ñ±ö÷3óΪ\N“< ]„N¦ÎÜo :†AÚŸÜ2Þ7?¯‘ßd‰Ë@Ùª%ÊØ1ÊÚʲ3å‹>zçÍÒxP]ÒZßéeTçnçeí¿hÈÓ}AÚ†ò\A•iðºAšŽƒ_î¥üöϳ£¢ýCðzKBŠÆ~ÚÄ?Ô§¯ï°|˜¥:‹®â8¤:SÊùoN½!ûΤΔ^±Z\±ûá—(‡Úôš¢Î‘ü•bÊR¢öH½doåw¯ŒíèœÓN/vÚÇ ~¤cÑÉÔ¹“«”gÈG!Œ÷ðpÐw2œv7f^IU7ÊVµÄk´¸E"¹h„âÚÂj×mOÊ…J¹]pW‹ºw# ÓˆãEa/_CƒÒ™€*Ó2àuƒ4—©%s޼š^x~ vY ÔSÒm+}^wÈÚ1½¿ôµä0©y°Hu¦â2üÑ”÷ å\.W,wu¦€ã²_î¯ŒÏ £”7ªÎñ¹»n'ß}•´Iò×ç²ò‰Á 4ÓúʾÎwÖUï*«A>}`Ì3Ò‘ð´1Ân ‘ î}‹N£Z•5½Ç ÔŒHmÙ‰¥F‚ßÿTÑrî©“êbL~ä05ßœ+ z"‚ƒƒY@ yöÒ‹Ø>"ß{Õ@Öþ š£ü&K<ÿOÉÞŠ¿~xá”Õºû¤ Ř҃êL)Dhˆ×"K—ÉçóAçPg à~9ò¨¢å¬Z_¥•Nøí¥×–ë=B÷GÕ,[‚Ý•·œÅ€¾4^kßÚÅ“/}å -gH¡“ý±mÈGÇã-ZÀr/0´ÖLzïž6‚ZƒŸn®˜EQ//¯Ž;»øTÔ‰§”BuV…¿Óiã?×8‡²Bþª®®& :ÓX>¤‹U¦eÀëi1A‰E_ž}ãwo§ät7PFÙA³ÞÎJÒõ\ìm±ØÛ¼§[~«¼:Sv,âUÝß“(“Ö>–]AýÇ£çzúˆ)ÑÝ ©³ ÇïÇî½—’ðnv3»¯ ¨¾îhÎëéŸ÷qq=0Ëæƒ|‚@·íåÒnÈGt…°°0ŽÓÿ{;5 棷ÓòøÔbÿQ:´¹ïZÄšëY”B‘Žr<¯§Q·gÜí¼7Ws¸\.Ÿ_›¼£G‘A $PeZ¼nA‚É~½ŸúëÕȵ5çd÷)ŽÄ€HÄú$êw•>¨“ }8—÷­yFUgMjR«ä ‚°ó™ÄÿZ‰’¢•i©ÝbÏP£z›*ª³Çð‰£—í<û"‹Q˜²»={Bñ¤#Ý6Ðòºûþ:«ßj`ò‰çåÒn(]M±›­ÖˆU½…RÍ›Q"©Z½m2 ÜÝìc×£ƒš‘os+7ßÃjv–þVlŒßß'”?:‚Ëpuuuwww˜$ ÒÉ€*Ó2àuƒ|8Éù•ËþŒÉz½û{2öœ¨OTÂù›6ä4mD\µH{ ²Â@i±‰Pg„FÍsùòLú»Ð"ÐÁyå_Hè,Úè}uzr(uäÕÙÑsHD!Ýo4ÎÔž‚?Ÿ# òÀ“[p ÏkNÝ8ÉaéPKºÂÕƒ@> ñÜB }¿ßGO†7C>u ñÜB h<·(Ïvƒ1 %us­<oñ—ZÞeL=Q5’z®SÀÏf=Ë×ácœr 9ñ4cñ©(J!•Œq<Ëå“%¥¯˜7‡¶ï©A í T™–¯¤-x_ðóí”ô¤·ó¥æbOÓ‰‘ä"zÏhvÏ»g4»†¶¡v®®z®z¡Žz¡†Z9?§¦2Tçı“tÌ—x!É“$»Ï·¨ê” õùÕúÅUÝ‹+»™KJæf9Mzoò4ye¶´¼ðÄ< 5xøÓäÎË·ãþx+Sud}ÛÊ(žüXFß³èÏúÚ4¨2-^7HÛ‘˜Wy4˜÷×óôU/b}e1 MD¼Gt_!¶ 4ÓÄô-b–Gçj©#Uùìéë–[¨[èsºsÙȧ᛼lÝÖøô|[çÁ£&çVׄ§g –x­,Ûä8ËR=eɺ@I|™<ˆÑÔ÷êcfÓg¡—Ù,ÏžjŒ×͆@>Y ñÜB .õŠ˜íe4LœèŸQ܇R͸òí³=s>}S³²FÚmñYK)ïÕ-v`¯»äG#ÇõcÑip”Òù*Ó2àuƒ´51ö׫ì£Aéyéiþ²°ñØ«Ax dî(DXIHÏ4`œŽ¥#ÝÒiÝÒA·BT×@KÍ@“Õ«f¨Å2Ðdéi0u8L.‡Áå0tÔê,:‡‰r˜(‹Žj²é˜L«J$•Hñj±T,•U¥˜ /ˆ+…ÒÊiE¤²FÊH +D…¢üòš‚ Qa…H[Êb¼ˆøëçXáï@ù’ײƒ‡4çË´ÁÙnóšÍlÚËPãC~òqÆs ò ù¸ÈgÓÔÔ¼øüðÙç'n¼ Š©‹"ÚÞ‰¿}¢ÝO°y( uærŠÆ8ýI†:ëktÛ:þ´[§ÝÏù@•iðºAÚäüÊ+‘yW"ò222ÇÈ^Ç^yáoÙ¸¨Y‘"h1®Uˆp "D«Ñ.Ã5øˆz9¢Îê| !D˜Õ@MB„)jb@è¨×"³è(‡©jþ¶F‚ %˜LÊ…T4ð:À´€Åe\P­ \P­Wsñ*m Еx¹>^¡‡Wè#Šëu5Ša¼ø?{wßTïü¤mº¥ûÊÞ²He+»ˆH°êŒ²¨ÄÁ™Aß\QÇ‹w\ÐgØEFÄ](‹"Èj+ˆ ´”] {›¶I“üþÂIš­99'ÉëùòÍr>9Iúîç,ߣºr[ÈÐ/C²›SúÞ4¨Sîð.®L QøNvÀ4Ï"ž!/ë=Ï×]wÝŠ+Y9«:.sÇñ\Ñ=CÛêËÞ¸35V¹Sqü}GñüµGDƒêPݯ†¬‰‹ª6ÿ7Rý×›ÿÕ-±·Ï«äAÊx†õß+©Òn:tnóás‡NV^¥ÿyœñØ5Æc£Œ?F î5ҮРaçUñåBR¥*¾B•X.$4«.Ë÷(SkšP—nªMêÒLu‰¦Æ(Uk„I|Qe¯«WE«êÿ­ªß¾Ðþ‡CúíÓåWƒ;Ý4¨ÓÀnqR/ð%šgÏ—èè9sæ|µg÷ \ùsÛí'*Ä“l§µlü O S‹ÊîիסSµ×<³«E/Þ°=®ÿ‡=SŽ›V©B¼þ…¡=Æù¼^@6¤ŒgXo‘VgØôõ±'^ç´.VÒë*¡ä*cÉÓé+M§³Œ§S…:¹ ô¦³ªäŸTÝŽ‡ôøQèv@Õ·4ªçð^Ic¯H¾úŠä«û$Å3 T`6ϧOŸ~øá‡¿üòKA&Mš´lÙ²îÝ»·wg•Í1$®TN÷8Ah2Ÿ‡%´F ºh¡5ÜÔ+h]™™ÌzU´Ñ¢U…ëuƒ*Ê` ­UE7 Qu‚¦6$¦NÐÔšUÌ!þ¼_¥Š«bÛSŒ¦!&¢NÑQQY}!§éŒ €ÍóÒ¥K:´~ýzËÈÌ™3G޹`Á»÷'ž¬÷Çþíå??´ùëÂÒ¢û$GžtjKþ§JÙóœ9ýÑSñâ"Õa­S‡¬Ž¬5ÿ÷ª®£žôRXh¸å¢™ÒäÝH'ðR†tF¥ó¿ ŸÓtÖw0C+Ï„Öéú·§–VÔ·^hh­Õêk´úš&]­V_Ó¤oÖšu­ÎÐÚfhhnSZ: 5éBmª©®³©:ÅT!´Y?a«vA_)$Tª.¨âÎ ñ-ªðfábŒF…‡FªC4áaáa!qQa¡!ªÄèð¨ðÐý{vVœ9%è´‚®©oÏn/ä=–®¯?ÿزÛúŒOD*ÎbØ<çää<ú裓'O¶Œ|ñÅÏ?ÿüöíÛíÞŸxFàÙW´óWK~¬nJêõÝò[§üùïß¿àÀ‚ |ÿý÷¾<ÂÊògDïñ·ëôk£èK¤2ï·9#ågóÿZ+C×þo~xX¤õ]ض x)C:‡Jv½¾ýQ£I¼÷81*}ÖàÇ\Lg£ÉT§½Ø07ë ¶“†XS‡†ÄD„ ‚­v0×µÝS¢¦=tMü@;3‘ÎfØ<§§§¦§§[FÊˡZVVf÷þ*•*==½ªª*%%%''ç¯ýkÿþý.…x†Â­Ú³ù¾zƒé²+X¨ÓøÞïþsKõi­õ¸¤9gÉÅ盆-ʯiGrV×ýÃz^,Cw!äÉ[Wôï3Àé³IT6 ¯ÀKÒaçO›WýœIJÛ´Âg/•7-7Œ†u{_Üñã&ÛG‘ÎrØ<‡‡‡755©Õ—fùÓëõ111­­ö/ðë_ÿúÏþóˆ#.\¸ðÞ{ï=û쳟þù!C/…x†ÂÝòÂ+ÇZÇ‹ÆÃÃZ&÷_uð_û˼tH•¤GX‰¶FúŶkžÙuèT­ènâK' Ü Œ‚ èkBþró[YýÄÓ†Á#ðR†tA(**úÓ²ÙñƒíìÑÕ7v,ÿE®t¶té-úæ7v<^Pú Ig=éR&DŠ'•–-[ÆÙ­[·‡z(//ïÑGuå*{òòò$®pÉœ9s޽õZœñѸ®-rOñmã\•1,É2ªÑh&L˜PTTäõJ:dõóṫÛvÎÑ×ößbîœëÊš7=u迳$`òòò즉ÜuÉtF@š3gΖ×öß.ž,SuTèćúɔήÕ^xöãûívΤ3‚ŠïÓÙoÛ©¨¨èÝ»wcc£ã»±m wqꎨxõíKô!â+WõL9~Mß-ßm9ûÃçšheöGˆYoÛΘþXIüpÑBTÆÉßI‹;#BÃùÖÏ_8®­Ñ1Ý‚\ॠé –tV C§uø«.¶w0M¾OgóóŸ©9¹ä‹?U5–ÛÞ™tÌpÏsVVVAAõHaaá€âs3ÚCè"0 6L¡¹Nÿéó!‚x6‘â WþX>bèôn×?ÜWˆ¸tð˜õvhM˜0A´™|ÅŠ×]w]ttt¿›oÛ9 ‚0¼g¾¹sÖ׆˜³ùRýé –t3 G6©øF°ý\«BT>Nçë®»nÅŠ{O~¶ø£yv;gÒðÙšç©S§®]»ÖzdíÚµ·Ür‹‹߸qãØ±c%¨ ð©K¡˜Õ%ï¦ Û;*žPYß-½_ìM½2cøÅƒÄ´ZmG›3gÎÎ;µZíÎ;çÌ™cìի׎;>ø¶èdêDÛ‡ôLý¡—C‚ ”ýPovÞÈÁW[‚ܳ(é —·¬oüår F;‚ú,›šš6òþGEÿûÎ'›uvŽì ßí¸©†††ÁƒÏ;wþüù‚ ¼ñÆ«V­*((Ðh.^§ÎzoûĉçÏŸÍ5×$''Ÿ9sæwÞYºté矞íx)ÿrÏ¿­ÙS"ŒP7ß0ð„èó‚ œÜsáÛ·KÚZ ‚ ˜Óуi3­/ó¨ÑhFŒa~†??óú«ÒêÄ÷O‰=7yà†°ý‰¯Ïï[wêÚq㹸`x)C:vm;´eÍgBÔöo•4W¬XQ)œ\÷Í‹­uvH:"8Û¶ §Nzøá‡Í—Žœ8qâ²eË22.íy³~Íùùù¯¿þúîÝ»ëêêÒÓÓsrrþò—¿ôë×Ïé"ˆgø—faì3»Ž”ˆgêŠ o¼qÐÛ±‘5‚ 4×é~rîçÝç£#5Æ ³œ •pèÐ!ë„¶{EŠ¢¢¢aÆÕÖ^\„å;Ý­³é†çš 1¢EÇDÖÝ4x]dXÓw[Î~tNxZQÀ¿dÊ΀]ÅŽ/ùâáúæ»·J”Κäˆ)¿ÏŽîÑÎe¢Mé Ø ÌæÙˆgøS´Cÿ¶­¶¹M4YwãÀõÑÖÒÖèZOÆ|õnamÍ¥¤ 7nœ%‰­gIHHÐét#GŽlnnþöÛo­Ÿ96-²ï}NÆü¡V›"ZhDX˃×Ǫ/|·±üh~©yPÒ Zþ…”ñ ë þ¨¨¨è¾ßÿOXÖùNWŠ74[x7³nìtÅØÔPûSÛL¤3`ͳ‡ˆgø£Á7Ý]˜v³ OI]uã ·#´–‘Æ ­?|Q~úp¶öÒÁÖ–ø´>Ì"44Ô`¸¸;µwÌÀ›º$ôÍøòØoZÅ÷Tµ]ÕÆˆ¦Ÿ÷¬,ª:Õ¦V«Gåúh@À#e<Ãzƒ?27½*•ucç¡Ó»Û¤ô%^Içnƒ„ö/¸S{®™tÚCóì!âþ(..®¡Óaì‚Ml&Ç”O¸!<´ÕzÐd.5ž>\súpuÃùV•J5~üxó W–mÛQ±©}¢;ˆï|e\\zd­6uÛÑ;´:›è*Ó¸>6ÚQ°åŒ¡íâ—ˆ­Ú€)ãÖü‘uÓÛc@êØ¹½ÔqŽ>ÆIgGOk4û¼œt yöñ tñ€®S…‘÷ÚÞš{v€"ÕZÛ›Ah8ßÚTÝÚT¥Kí<ãö{þù1u”*B¡ ׄÅwŽJΈV…\ìÉÏ7tÉ?v{k›´­rÓÚ ÅMÖƒœOˆ2ža½Á‰.¹üÝ÷GÜœtÅ5©®<Ö­tv î\óžUE¤3àͳ‡ˆgø#ËT"i“ÿx*a¤í¢#Ç÷ßœ{¶#K9W“¹óÇ[Û vfMÕï®{ÿèHMKKK[[[[ÛŰٶ ˆ2ža½Á‰&ú2ï@îÔ?nèôn©½Û= Ú[LFÓ±/Ê~TN:NI—2²]ç@{,u,ÞôÜC“¯°½ƒ¶5æóÂ»ŽŸæÙóŒ¡GJ®Íÿáv»sdÑ–¬³ÇýXSSÓÜÜüÓO?Y®uÉu#AË’Î;vìèÕ«—ùZÐõ§Ûš÷¦ÍòxÏÔ-רf*Ú{á£E?Ä]èM:ò ðM¿lÛ†¿3™„û×þç®SvoížüËØ¾‹Nv¬²¾ÛÞ_n¬kN¶»4áàºØ’|Žþ\DÊx†õ†ÀcLýÇvë79)±[´·žS×løygå_–·Ôë96p{ž ¥R oÎzûˆ®vo-­êóÑÁ».Üf´³Y¤Uµç—›>ûþ.û³Ñ |ýºpt˰aîÐ h©U—ð¾-:úù Ço+oªÖ9LûOÕ=éŠ;Fü¡âØÃï—¶ÔëA %ðM¿lÛF`0My›?óÑOÆv>Ï¡&mÏÄï÷)ÐDˆ7K·Õçjz©ê]ZÝÇîÜ`‚ D„…ô9·µhç† ‚ðý÷ß›Oè⢀c¤ŒgXoHæ“¢¿ýöÛˆˆˆÖÖÖ”±IýÔ™#’â;G¹òðæ:}å/ ±mÖ,{?I“&XeM:naÂ0Ï$Ÿ–Ïzë`uSû³Mƈ†¢±£²~ùépkëù¨È¶SZc/£æàiã£Ô›Œ¾®ª`3•(Ž‘2ža½!X.mšÖ=iëüõéÇÎU—Ä$…«BU­Mm­mº&CkS›ª-,#­Ï7۶ד΀[hž=D<#Àœº ½mù¾C§j½õ„Ó²»¼>sp×ċŭ/bÉéU€S¤ŒgXo¶oQQѰaÃjkÅ!î´&·pÎ3A„Ì”è=¹nÁ¤ÞªÎ ‘kæßôÇÑ–ÎY¸ü”*N¯Àcæé¸­'ÄîÕ«—Á`°Ü!44ÔÅé²Ig@!|Ó/Û¶¨6|{æÿ>üñ‡sžl{Q©~7¡ç³·eÅE‰§]Ä’³ªÇHϰÞ´<;›tÜÂaÛ"žÀL&aûñÊW¿<ùqAy{‰‰„…¨®í—²øÖ¬1W$I] HϰÞ´hƒ yöñŒ`Pt¾é­ÅÿÜuª½¹Ä5êë¤MÜùæ!5Î/jÀE¤ŒgXoéÐ<{ˆxFðhjmû©¼±¦IW«Õ×hõµZ}M“N¥R]? õš¾)a!*¹ )ãÖ@:4Ï"žÒ!e<ÃzH‡Ù¶ Í3NÐ<àÍ3NÐ<àÍ3NÐ<àÍ3NÐ<àÍ3NÐ<àÍ3NÐ<àÍ3NÐ<àÍ3NÐ<àͳüòòòä.Á åW(øC‘ʯP H/Q~…‚?©ü Ø”ÿ T~…‚?©ü ŠôåW(øC‘ʯPR*“É$w R©üà*¿HåW(øC‘ʯP H/Q~…‚?©ü ?)Rüb½)¿HåW(øC‘ʯP H/Q~…‚?©ü )‹ô›=ϧOŸÎÍÍ‹‹‹‹‹ËÍÍ---•»"‚é þÑ<766æäädgg—”””””dggOœ8Q«ÕÊ]j-"# IDATÁ‹t?Øí.ÂÒ¥K:´~ýzËÈÌ™3G޹`ÁÇ òã ¼Eù þP¤ò+(ÒK”_¡àE*¿BÁOŠ”é,/åW(øC‘ʯP H/Q~…‚?©ü )‹ “âI½nëÖ­>ú¨õÈìÙ³Ÿþyñl¬8Ù¶ÿ=At[Ÿ—¼¾Žyx€Ò‹T~…‚?©ü ŠôåW(øC‘ ¬0´ïØÐ~×È]…‚xÎø/?Ør Bzzzaaazzºe¤¼¼|èСeeeí=D¿ã_-ÿ¼/î¡þNŸ”tá¹OFäæYøÅxéxÎf~±Þ”_¤ò+ü¡HåW(P¤—(¿BÁŠT~…‚”EúÁ‹!<<¼©©I­V[Fôz}LLLkkk{iÛ·Q÷é2ÍS{}R HùEŒJăt6S©T—jA}ضÂFß6úŽ–Ayº÷É] Øîy†g‚y‹ÀùG󜘘X]]m}`XUUURR’Ó†õ»F¸y¡”¥‚E'<_ÎãtÀùG󜕕UPP0yòdËHaaလ>0ôªëC¯º^ÊÒR§3þÈ?®óù¤r*´0™Lwß}÷SO=%im)Òt9ùÀ~øá‡õõõkÖ¬Y³f¢*4ÙXºtéí·ß®¨"zè¡uëÖ-]º´´´´´´téÒ¥«W¯~衇”SáöíÛûÛßÞwß}§OŸþé§Ÿ&L˜0}úôÖÖVI+tÀ÷¿¨é,i…¤³W*´ ;^$éÜñ"IgwùâµíGÇß-Y²dÆŒÖ#3fÌxå•Wü®Ÿ½;nUøç?ÿÙh4Zþ[PPлwoië3™L~[Oœ8‘ A]—xVáË/¿óI]—täÓ¸eË–1cÆHS×eÜ*255Õ6žÓÒÒ¤+Ïäf…QQQçÏŸ·©¬¬¼þúë%¬Ï54Ï®#ÝE:{éì-¤³WξAó솴´´òòr둲²²N:ù]=>ûÍØ‘5öÞ{ïeggKS×e<.²¶¶v×®]£G~â‰'$«Îdr¿B­V;pàÀ½{÷šÿë›·ÛÝ"AHOO ëÔ©Ó]wÝuüøqékt¯ÈŒŒŒ÷Þ{ïÚk¯ŠŠŠ‰‰™8qâ×_­¨ E&L˜°aÃi꺌[Eæåå5j÷îÝõõõõõõ»ví1bÄÿýßÿ)§B»ñ,ã/v šgבÎî"½‚töÒÙ+Hgß yvƒZ­ÖétÖ#:Î7Û_½[ÏâÙã «ªªúõë·{÷nÉJ»Äƒ"­OO˜4iR[[›¢*üÝï~÷ÔSOYþë›·ÛÝ"o¹å–Ý»w777›Ï´IKK;räˆ¢ŠŒˆˆHNN^¹reeeeeeåŠ+’““¿úê+åTh­°°°{÷îz½^²Ò.q«H£Ñ8mÚ4ë¯Ì´iÓ¬•½ÂqãÆ­Y³ÆzdåÊ•2þb· yvéì.ÒY– Ig¯I:·‡tö šg7Ïîò¬Âòòòk¯½6??_ÊÒ.ñx5VTT¼ýöÛ]ºtY´h‘dÕ™LnV¸yóæqãÆYÿÅ Ìxyã7n¸á 꺌[EªÕjÛ“m®»î:éÊ3u`5Ι3çÙgŸ•¬®Ë¸UäóÏ?ߣGM›6UWWWWWoÚ´©G/½ô’r*ܾ}{JJÊš5kΟ?þüùU«V%''GFFJZ¡+hž]G:»‹tö ÒÙ[Hg¯ }ƒæÙ æ.*uê”õˆ2 )//×h4Ôu·ŠìÔ©“íñBÑÑÑÖçéj<þ|RRRUU•”¥]âV‘™™™;vì°Ù±cGÏž=¥+Ïäþjܹsç„ 4MTTÔØ±cß}÷]©+tͳëHgw‘Î^A:{ é줳oH÷Í ÀKUeeeX0€zÚãn…çΛ2eÊ’%K&Nœ(}uup5>¼²²R‚º.q«Â“'OfffŠ®ÐèƒK5vp5š|r1 ·ŠÌÊÊòAI¶ õ`5þãÿ¸í¶Û’’’¤,í·Š<{öìðáíG†~öìY ës5Ž?>??¿±±Q«Õ~ýõ×ñññcÆŒ‘´Bx—ÒÒPiõØ"½‚töÒÙ+Hg€ÍóÔ©S×®]k=²víÚ[n¹…zÚãV…•••7ÞxãsÏ=—““ã“ê.êàjüæ›oú÷ï/A]—¸U¡ƒ-dÊ)ÒÖÆÇŽ+A]—q«ÈéÓ§òÉ'Ö#}ôш#$¬Ï£Õ¨×ëß|óÍ|PÒ¬¹Ud=:d=²ÿþîÝ»KX_‡?o¼ñÆ}÷Ý'A]ŠÒÒPiõØ"½‚töÒÙ+Hg¿'ÑmÕ××÷ìÙóé§Ÿ6Ÿ°xñâÞ½{766*¶žöÞŸ½;nU8tèÐwÞyÇ7…y\ääÉ“7oÞ\QQ¡ÓéΜ9³råÊ®]»~òÉ'ʩЖoÞn·ŠÌÉÉùÏþSVV¦ÓéŠŠŠž~úé”””C‡)ªÈæææ«¯¾Zt²Ô'ûyð^¿ýöÛ“&M’´ªŽùÚk¯edd|øá‡555泪ºuëöúë¯+§B“Éô«_ýêðáÃ:îäÉ“óæÍûÝï~'iy. È•é,i…¤³W*´E:{V$éì•"IgI÷Í ÌÔ/..ž6mZlllllì´iÓD§¯(­Ñ»+Ë6×+´[^MMÔºUd~~þ­·ÞšœœÖ¹sçÜÜÜ}ûö)ªB[>ûkÌõ"·oß>}útójìÚµë¬Y³~üñG¥i2™Î;7cÆŒÄÄĈˆˆ1cÆøæd?wßëQ£F}ôÑG>(Ìš[EnܸqôèÑ £Fz÷Ýw•Vᆠ Þ¿ÿeË– TØž Ùíu¤³t’Î^©ÐéìY‘&Ò¹}¤³t|ð‹ZÕÞb€Yžó €wÑ<àÍ3NÐ<àÍ3NÐ<àÍ3NÐ<àÍ3NÐ<àÍ3NÐ<àÍ3NÐ<àÍ3NÐ<àÍ3A•J%w à2¤3 (4Ï8¡2™Lr×@f¢ ÛüZ@v¤3 44ÏAT*~ ,¤3 (¶ €4Ï8Aó €4Ï8Aó @!22R§ÓÉ]¸„t…æ€ BïÞ½?ùäƒÁ w!à"ÒP¦¿ ‚ðÙgŸ-X° ¨¨È`0ðk% E¡yÀ ÛÀ šgœ yÀ šgœ yÀ šgœ yÀ šgœ yÀ šgœ yÀ šgœ yÀ šgœ yÀ šgœ yÀ šgœ yÀ šgœ yÀ šgœ yÀ šgœ yÀ šgœ yÀ šgœ yÀ šgxŸJ¥’»8áà=Ú¼ys÷îÝU*•ïßGUûÌwX½zõ°aÃbcc“’’¦M›¶}ûvÑ3Þu×]]ºt ïÒ¥ËwÞYPPÐÞ"bccGµråJ½¼Ëy}õò½”‰ï¦ò)3•LÉkCɵ¹…¿”‰æð?’þúûÿïÿ½ûî»&“Éd2I·»LVlÿûÌ3ÏüýïóÍ7+**¾úê«°°°ë¯¿Þúá7nœ4iÒ¨Q£¾ýöÛ¦¦¦ýû÷3æ†nظq£Ý¥=þøãO?ýô+¯¼"õK#±@"š‰pEÀÄkÀ¼€§âw¼N¥âs%­Ž¯aÏÚÖÖ&û/qÛ »víºcÇŽ¾}ûZFòòòòòòÌ?Ÿ8qâꫯÎÏϿꪫ¬uôèÑœœœ½{÷öîÝÛîÓîÙ³göìÙ'Ož”è…˜Ù.×ë_¾w€2ñÝ”Z0d¢Ò(çS­œJ:ˆ¿ü{ž!¿’’’»ï¾»sç΃~÷ÝwÍãv³Ê2¨R©š››ÿøÇ?¦§§«TªŸþyРAF£Qt£ÑxÕUWåçç ‚°k×®‘#GFFFfff®X±Âƒ’AغuëèÑ£5F£=zôÇl]›V«7o^RRRJJÊÂ… M&Sssóüùó“““þøÇ?¶µµYßùþûïOIIÑh4S¦L9vì˜íË´}í–EG‘9xuG2eŠF£III™?¾V«mï…«T*£ÑÒÞzöúzp]mmm—.]¬G,³ K—.ýýï/êœA¸êª«~ÿûß/[¶¬½§úè#»¯—¿‚Ž ð6·>W%%%]ºtY´hQQQQKKË7ß|3mÚ4ÏcáÞ{ï}ûí·ëêêÌ#¹¹¹«W¯ÝÕªUcÆŒ1™L?þøcJJŠùþß~ûmÏž=wìØánI{÷îMJJú÷¿ÿ]YYYQQ±nݺÄÄÄýû÷[Jºçž{V­ZU]]ýË/¿Œ=úÅ_¼çž{V®\YUUeyå•W,w¾óÎ;—-[VVVVVV¶lÙ²ôôô“'OºøÚE79xu'NœHOO·,hÉ’%wÞy§ƒ÷H°9^Z´ž½»\,Ãd2?~Ù²eíÝ¿oß¾Gµ{Ó÷ßß¿ÿöžv×®]™™™Êpýµ8xl—+¼yóüñ_~ù¥±±qçνzõÚ°aƒùVÇkØÝ÷€ŒÈD2ÑãLìHRØ-ÕÝb222V®\ÙÐÐP\\|Çw<úè£Þ‘ެyÇo±[•XFœ®ëvúôé?üð©S§t:]UUÕÖ­['OžÜÞ{Äß A…•ïsëËyÏ=÷<þøã®?õïÙ%K–XßtàÀÌÌÌÖÖVËHKKKFFÆÇl2™fÍšõÒK/YnÚ¼yóM7ÝänIÓ¦M[¾|¹õÈk¯½vë­·ZJ²Žœ={öh4둯¿þzÈ!–;?õÔSÖOµhÑ¢Y³f‰^¦5ãàÕÍœ9S´ ¿ýíoný¡ ZÏ&¯®Ë0™LÇŽëׯßСC.\¸víÚS§NYßÙÜÜl÷©´Zmtt´íÓž?þƒ>ÈÌÌüÇ?þá  ×_‹ƒwÁn(þõ¯µùøãGeþÙñv÷= #2ÑŒL4s+;’vKíH1ÕÕÕ½zõ²<Ýûx¼æ6Ï®Wbqº~¬Û˜˜ëðwB°a%ÂûÜúrvîÜùçŸvýy¬Ï‹n8q¢õÎÉ¥K—:ÔüsïÞ½­T]]ݵkWwKêÑ£ÇéÓ§­GJJJ222,%•––Znª««³‰‹‹³ÜÙ²MÝìĉ;w½Lk2ÆÁ«³ÞxoY[(Ø®g/®Ë0ÓëõÛ¶mûÛßþ–›››””4yòä²²2óMŽ›gFcyZKµW†ë¯ÅÁ»`7EïKuuubb¢ùgÇkØÝ÷€ŒÈD32ÑÌ­LìHRØ-Õ­bš››-ZÔ¯_¿¨¨(sb†††ZžÇnÁ¯yÇo±[•XFœ®ëväÈ‘÷Ýwß™3gì¾LÑâø;!¨°á}ŽCÈÂ<¦Õj]|ƒÁ`ý{V§Ó‰îðå—_¦¦¦644˜L¦úúúÔÔÔ÷Þ{Ï|Sxx¸¨k ±»\%EDD´´´X´´´DDDXJ2¢—`;bùAÔìiµÚ°°0_»èV¯.44ÔvAný¡`»ž½¸\,ÃVssó¼yó~ýë_›ÿëø°í+®¸Bô´F£±ªªjÆ IIIëׯwP†ë¯ÅÁ»`7 ƒí ùÇkØÝ÷€ŒÈDë—@&¶7ÒÞÒ=N »¥ºŨ>xà 7>|¸±±Ñd2577;Xçf¯yÇo±[•¸¾~¬Û¢¢¢iÓ¦EFFöïßÿž{îÙ¼y³h-Y?„¿‚ †Á§¬?|æ‘”””3gÎØ½sBBBmm­õHqq±õÕjµè!×_}FFÆË/¿,ÂË/¿œ’’rë­·šoŠ‹‹;wîœuæß˶””žž^YYi=RYYÙ©S'Ëmg¼p0Eç¹sçDÿMMM5ÿìôµ‹8xu)))¶ rðT¶l׳w׃g"##Ÿ{î9ó´7‚ Lž<ùý÷ß·{Ï÷ßܸq¶õ$%%ýæ7¿yóÍ7͇6µ· ×_‹ëŸ1³v;^ÃO(™hL´Ë㤰[ª[Åüç?ÿù׿þ5tèPF#BQQ‘Ój=^óŽßb*\X?ÖmÏž=7mÚT[[»aÆ1cÆ<ýôÓsçÎmïÎüThž!³o¼qõêÕvoêÛ·ïÞ½{­GV®\éô .\øòË/?~|É’%?þ¸å÷ׄ ¶lÙÒÁ’²³³·nÝj=òá‡fgg»ò´¶Þ~ûmÑ-.vüÚ###u:õ­^ݤI“D Z¿~½g[xw=¸hÁ‚¢Œ9wî\ll¬ùç‡zhùòåG=êèÑ£/½ôÒ½÷ÞÛÞÓÞ~ûíFt-hÏ8xlß2ǯa)ÞSJ@&Zÿ—L”w¹ÍÍÍ‘‘‘–ÿ®ZµÊéC<^óŽßb•8ˆ×ޝóôòóæÍûôÓO­'™÷'÷P®sëse™Æ³¸¸¸¥¥eïÞ½–i<ßyç+®¸b÷îÝMMM'NœxôÑGçÍ›'8;dÈ`0ôíÛ7%%¥W¯^mmm–ñ£GvîÜyõêÕ.\hllܶm[{“£8(iÏž=‰‰‰æ¹ +++ÿýï'%%}ûí·í•ä`D„»îºëÕW_-/////õÕWÓÓÓùåW^{VVÖ¦M›\|u¿üòKzzºeA¯¼òÊ]wÝåà=lv†ØÞÇ‹ëÁÅ2Ì#C‡5o ®««Û¾}û Aƒž}öYËÞ{ï½N:½òÊ+¥¥¥:îÌ™3¯¾újbbâƒ>èx¹[¶léß¿¿íÁQî¾ï‚í[f·Ë ã5ìî{ @Fd¢ƒUA&:xÚöÆ]L Çueä®»îš1cFYYYEEÅ‹/¾xÛm·9ý¼y¼æ¿Å*q¯Y?ãÆ[·n]ii©^¯/++{üñǧL™b÷%ówB°a%ÂûÜÝLS\\}BCC­ŸßÁ«+((˜,Âm·ÝÖ»wï¹sçÊSÁ‡t3…îy¶kÍš5‹/îÙ³gÏž=/^¼zõj¹+ ؑ΀ !aó|øðáx !!A´‰ÚìôéÓ¹¹¹qqqqqq¹¹¹¥¥¥NŸðرc#FŒ0ÿ<|øðcÇŽy¹bé €g$lžgÍš•––¶gÏÛ›srr²³³KJJJJJ²³³'Nœ¨Õj?accc||¼ùç„„„††ï @@#ðŒÊ{¨Tâ¥,]ºôСCëׯ·ŒÌœ9säÈ‘ ,pðÀøøø“'O¦¤¤‚pþüù¾}ûÖÔÔH\;‰tÀ-òœó¼uëÖÙ³g[Ìž={Ë–-Ž•••uàÀóÏÌÊÊ’ª>‚é €ò̶}ìØ±Áƒ[ 4è‡~pü¨Ù³g?ñÄýû÷á‰'ž˜?¾„%dHg§y®©©IJJ²INN®®®¶ü×2‹‰ùóáa÷ßQQQvv¶ùç9sæø®bé €òœóÞÔÔ¤V«-#z½>&&¦µµÕ»‹V«ÕmmmÞ}N,|£!J¢t–gÏsbbbuuuzzºe¤ªªJ´µÛ+ÚÚÚü÷ÏÙþ=$/ßÔãõ¥tð =~¸[týÎ.ÞSißPÚ«æ+#é½û]°{µ'ÿE:KŠ_5JxBÒÙ(íUó•‘ôþ’ÎòL–••UPP`=RXX8`À)–¥ú¯¼¼<)žTòòò,É"w-^F:ü”oÒYž-(K–,9|ø°èb#FŒxðÁ¥^t0PÚ«fCtdÛ¶W(íUó•‘ô^ß¶­¨[HgSÚ«æWt$½Bi¯š¯Œ¤ô—t–gÏó}÷Ý÷Í7ß<óÌ3555555O?ýô¾}ûæÎ+Ų‚pÛö“O>)w —ñM=^_JŸÐㇻõ@×הּO…¢(måð•‘ô.ÞßÁÝxÏ3é,)~Õ(á Ig?¢´•ÃWFÒúK:K¸ÅnÝ–Å:uêá‡Þ¾}» 'N\¶lYFF†5(j“ p|e·øãW†tü_À-Ò}eü«hý'“O><›·ÏÏ€Syyy‹-²ü—¯ŒHgÀ-¤3à”oÒ9À¿Šü®Ü’——Ç_±€ëHϰ޷΀[Øóì!â RÆ3¬7€tmÂ0_ Â)IÒ à Ã|‰tx‘ßO¦lÛH‡”ñ ë ö< ›Àož90 àE¶í¤3À‹8lÛ 80 RÆ3¬7€t8lÙÐ<àDà7ÏœUå×Î^Ð~ á詹 €‹8çÙ+Hg€qγpV•?2™„³ôÇJZ¾;ÑRYÛ&•="æÞ”$w] FÊx†õŽt)&Å“qâ\ëß·V[ürVת7E¨ÙÉ@Ø6üN¯ÎQ—}2Û ¦ŸJ[åªhž¡8¡!€ŒÑà1N{ šg(QVF¤hä§3­œu'* IDAT@.ß<3Ÿ§?ê×="ôòÏfƒÖxî‚^¦ràfÛö ÒàE̶íÌçé¿^ß\U\®³¹yLÜuƒ5rÕ¶HϰÞÒ‘.eÏ3üT¿îâÓžOžcÎ0ò y†B]Ñ5\4RT¦3²£€hž¡P=ÒÔáa—±Ð¢3•UqÚ3Ðí¹¼š=Ï|æŠÖÉæ°mšg¾Gó EKO µPÛd09Ø€OÑDó ? ‰°ÝóÌIÏ|‡æ~ ʦyæœg¾Dó ?.šo[hÖÑ<ðšgøH›=Ï-:Ûà;4Ïð‘6{ž[õ4Ï|‡æ~ Óºç˜V–b³@ÝóL:üWàïyö¶mŒ6ƒiÑÚJÑyÎ*A˜04fÊÈØ€ú €ß e<ÃzH' ö< Uº2J4h„ü#o~XUÛÈùÏ$øÍ3†Œë³c“ãBmÇ‹Êt/ýçÂw'›}_€ ¨‡mûé ð"Ûö 0•µmË·T56Û¿HÕ ^‘ÓÇÆÅiì4Ø RÆ3¬7€t¤K™O/â9ðTÖ¶ýóãêêv®S®š::nô€höðRÆ3¬7€t8çÙs`ÒÂÊMéÛ-Âî­-:Ó{»ëþ¾µª½î:ˆÃ¶½‚tx‡m{Û¶•É$ìø®ñ³ ûGp áaª©£ã®¾Š]Ð$DÊx†õ‡m{ˆxleÕmÿÞVSVÝÖÞzv ¿3'Áî4cÐq¤ŒgXoéÐ<{ˆxxú6Ó‡w4¶· :2\•;.>»ø2WÐq¤ŒgXoéÐ<{ˆxeUú»êNWêÛ»Ãð¾Q·Ž‹Ps7o"e<ÃzH‡ Ã<Ç”$Á s²úÓS¦ŽŽ µßü¹yÉ{Î^h·»1a˜WÎ/bÂ0/`Ûv°©¬m{'¿¶½]Ðê0Õã9„€×2ža½¤ÃaÛ"žƒÑ$ìü®ñóƒmûoýèÑ·^øG])ãÖ@:4Ï"žƒÖ¹*ýúmµ5ö'âîß#âîɉáar  CHϰÞÒ¡yöñÌÚ ¦ö5|õ}“Ý[{¤©çÞ”¤‰d4Ï‘2ža½¤Cóì!âßlÙ¸³¶UoçcÐ%Y=ojRlý3‘2ža½¤ÃlÛžc>Ï 7¤wäC¹)i a¶7«Ò/ß\ÕÐÜ΢ÀfÛö ÒàE̶ílÛ†Ys«qݶڟJ[moꞦžs2—€àRÆ3¬7€tØó tHTDÈœ)IC¯°s‘ªÒJýÊϪۛššgÐaÆÄ„«³¢mo:qV÷îÎ:ß—À_Ð<#ˆ¨TBî¸økilo:üKó7Ç´¾/ €_ yFйåê¸ý쿽å›úÒJ½ïë |4Ï:*A¸c|ÂÀž‘¢ñ6ƒií—5v/j ÈÑ<#…„3&&tIV‹Æ« Ÿîo¥$JFóŒ ¥SÝ=9!2\|…ª=G›8x€Hà7Ï–‹eçååÉ] ”%%>ìÎ ¢A£IøÏî:£Q–Šø¼¼]Á„Û@P£yÄzu”Wëum\ï^4Ï€X\tHœæ²Óž&áìv>Á‹æ°£GªøjÏ4Ï@0£yìèfÓ<—W·ÉR % yìè”&¡y‚™¸C°¦R©Üz.“‰• :%Š¿54Ï”‚€À÷5Ïd-‚Vr|XX¨ªÍpé+ m566c¢8X€üh|N°#D%$Ç…Š/Ô³óR4Ï€})qâã2ªê ²T@v4Ï€}Éñìyp†öÙ¶]×d”¥! ð=& ì‹×ˆ›çz-‡mPßó³Ã¶ n¸á†˜˜˜®]»®\¹RîrÈâ¢ÅÍs{žÀÒ ü©yþùçŸo¾ùæÙ³g—––îÝ»wÛ¶mrW„@-þvÔ7Ó<€é .5Ï6l˜>}ºhpúôé7n” ¤vååå-\¸pÆŒ‰‰‰=zôxûí·}¹t›X›K:768P€¢(! Ig@p©y~öÙg.\(|ä‘Gž{î9yøðáx !!Áî|'§OŸÎÍÍ‹‹‹‹‹ËÍÍ---µÜ”ŸŸ_QQÑ¥K—äää»ï¾»¶¶Öƒ¥.R‡©"Ô—}DF¡¹•ÏÄ‹M:à˜KÍóñãLJ*ÌÎÎ>v옋œ5kVZZÚž={lojllÌÉÉÉÎÎ.)))))ÉÎΞ8q¢V«5ßzáÂ…âââï¾ûîøñã:îá‡ö`é€ëbìì|¦y  ^ hÒÇT®ÌØÙ©S§}ûöeffZ=º¢¢Âóe«ÄK_ºté¡C‡Ö¯_o™9sæÈ‘#,X B||ü‰'RSSA¨¬¬ÌÊÊ:þ¼»‹\÷ê¦ %zë‘?LKîÙ)\®z(ì)#E@“ο&]ʸ´çyòäÉk×® ®[·nòäÉÞ­fëÖ­³g϶™={ö–-[Ì?4Ȳ]ø@t¤ø ÒÔžg ⛀&_çÙâ©§ž;vlkkë=÷ÜÓ­[·3gά^½zõêÕvîêˆcÇŽ <ØzdРA?üðƒùç{ï½÷OúÓ’%KAx衇n¾ùfï.ÑDˆ›g-Í3%ñM@“Î.îyÎÌÌüæ›oΞ={íµ×ÆÅÅ]{íµçÎÛ»w¯è8±Ž«©©IJJ²INN®®®6ÿü?ÿó?½{÷ÎÊÊêß¿¿Z­6ç4 Û=ÏÚVvªPß4é €àâ9ÏR-Ûæ`ôððð¦¦&µZmÑëõ111­­­/Âîø“O>™——çÙs"x|~ á‹CÖ#7 <•Õ<§§§¦§§[FÊˡZVVæ­E®Ûñ]ãGû¬G& ÑL'W=”& S†t†Âí9ªýàë:ë‘«³¢sÇÅËU¥‘yÂ0ŸÉÊÊ*((°),,0`@GžSõ_l̆»ÂÕâ/H«Ž¿ö€`———gI¹kñÒŠ.þêµêIg Øù&5Ï*7u¼š©S§Šf ]»ví-·ÜÒ‘ç4ýñ wEªÅŸêfšg èåååY’E®|Ф3%Â&Ù´ À7éì¨y6¹©ãÕÜwß}ß|óÍ3ÏàÒ9Ïaaa‰‰‰R—(ílÛ\I€rÐNa63’p\p©y¾ýöÛ?üðC©KˆKUP2ÁImsè$Ç…ð—šç¥K—îܹóÕW_=sæŒßÍðÁ|žèˆµ¸ynÕùÙW€w)j¶mÿ hÒaï¸0Y   šmÛh4.Y²$//¯©©It“£šù<ÑAÿÙ]·ï­õHî¸ø«³¢åª€¢Èž2~в¯7ø»¾ªÛsì²t¾õšø±W‘ÎAÊ”qiÏó#<²iÓ¦/¾ø¢®®Ît9)j”#ÒvϳÞ(K%`‹€Fp ·Ig]é @r.Ͷ½jÕªýû÷3™'‚Pd¸xS+à4‚S¸ZœÎ-œT@z.íy6IIIR—(í9ÏÍ­Ä3¥  œ¢#Äé¬maÏ3ɹÔ<ßvÛm[¶l‘º@4‘âïHc3ñ @)h§(›ãšÙó @z.5ϯ¼òÊ®]»üq2O ƒ4Qâ•æ€RÐNQ¤3¸4™ƒù¾ÕÌç‰*­Ô/ûà‚õH·Tõù)rÕ@QdO? hÙ×ü]I…þÕM—§sŠúáÛHg‚ eʸ4a ‡ ÅYUŒ€Fpб9.¬‘t =—Û‚VLT¨h¤sž•móÜ 5²% €Ô\jž¦|ªÿÊËË“»øŸÈpUXèeŸ}›‰«UÁ,//Ï’,r×âÇM:£#"Ôªð°Ë>ü£©…Óž æ›tvépð´´´'NÄÅÅIW‡D8« ÷Ժʺ&ƒõÈ_f¤%ÅŠ÷HB²§ŒŸ´ìë `ñ¿+k.KçÇîLM‰wé„DMº”qõRUü±‹”Ïöذz­Áî=ÀÇh­ÛkIrÚ3‰¹Ô<¿ôÒK_~ùåÒ¥KO:¥×륮 P”8«d©Dh-Mó¬mápÒréàFcþáOú“è&»BÀ‹µ™3¬‰9Ã( mÓ<7±ç€Ä¸TàD´ÍÕªš˜’€2ÐZ¶{žižHKUNØÆs#{ž•½tfFÒr£yÞ¿ÿ­·Þš™™™™™™››{àÀé*"6ÚæRÏœó @1Hg§Øhf$àk®6Ï~øá”)S&NœøÕW_ÕÕÕ}õÕW9997Þx#“|"àÅÚ̶Ía‚tFвmž9. €Ô\½ÞâÅ‹_{íµ»îºëÿ·wçñQ•wÿÿÏL’Y²g’ «l²‰¥ ojloe¯"[Pz÷¡– ­öÖŸ×âVÁ"Z¹ñ«B@dQDd7ìBXBȾg&Ël™ß©q83É,™™3Ëëù×äší“aNÞ|ιÎuÚìÝ»÷oûÛ„„„¿þõ¯wÞy§×ʤÇYUüéŒE:ð=g<Ÿ|ÇŽ¢Á;v\ýõž. ð/J…,<ìš«UM½‘ËÃ錥VÊEél0Y &Ò€9{ÎóòåËï¿ÿþúúú3f$''WVVæçç¯X±âÝwßõfy€ôd‚¥’74]sŒ¦Ö6e„xnð1Ò¡Ì6u-mšÒ€·8{äyæÌ™[¶lÙ±cÇÍ7ßwóÍ7ïØ±cëÖ­3fÌðj}€?ˆ¶Yp»™™ÛüéŒPf»( é À«œ=ò,Âøñã?ùäï•ø-µR&Ñrbÿ@:#dE©Ä鬣yàM,8%žÖ 3Û}$ðµ8µÍ4ϼȅæyÆ ãÆÓh4²ky¯8ÀOÄÚ4Ïyà'Hg„¬˜Hñÿc›Øµ À‹œmž_}õÕ?ÿùÏO=õÔ… ,×òj}€?ˆ±9ç¹xàHg„²8Ûya¤3oröœçW^yeÍš5&Lðj5€ŠÇsUƒI’JÀéŒP-Þµ]ËIU¼ÉÙ#ÏEEEcÆŒñj)€ßê'nž«ˆgÒ#ÊcÄ*jÙµ À‹œmžÓÒÒÊÊʼZ à·’âÂEç6èÌ­fEéŒP–œ.:¹¿Nknѳ( oq¶y~àÖ¬YãÕR¿.ÓÄ\sðÙ"%ÕF©ê€v¤3B™2B–wÍÁg‹ ”Öpð€·8ÛÊ…wh¤ª€?ð^Ê8»Ú6!‡×'Y!9_¢7™-áa\L€dHg„¸¾©âyaJ “E!><ÀÙiÛ@ˆËL%q«ÁRp¡Uªz@ïd…2âšt6˜,§.“μ‚æpJx˜lP/¥hð«ãMmõ@"araHq:ïþžtà4Ï€³²‡¨E#%ÕÆ¯ š$)‚0z€tÞ}L'I1‚[à5ÏÕÕÕ}úôéb‰ÀK†ôQ%\{Á*A¶l¼PÊžBé © ÉP%D‹ÓùóÃÚsWõ’Ô ˆ^óüÔSO-^¼Xê*Šä2aò˜hÑ ¹MXûE×|âHgH%L.L¹AœÎmmºõ¤3Ï °kEœ9sfÆŒ'OžT«ÕÎTÎÅ0àYAx}sí¡æhµü73{jœ]¾@p eڑΖEÞȯ),§s”J¾ø.Ò9ÞKŽqâÄ„ :f£±¤'$4fúžŸÇÙ~[ômon©¹TÎúÛ|t¬e Tÿê;éÜj°¼µ¥ö| ëoèg›ç´´´²²2¯–"©S§FŽi=2bĈӧO·ßÍFc§5¤5nHä=·ÄÙþ/±=¡¹~ ‘ìÁ‘¿¼ÕN:L–w¶Õqý*ÝálóüÀ¬Y³Æ«¥‚PWW§Ñh¬Gkkk½ý¾€{Æ ‰œ5)^n³L–~VKBð6Ò°uãàÈû&ÆÛœþ,M–µŸ×Ù.Ê Nr¶y^¾|yuuõ“O>yñâŶ¶6¯Öä çwlËìÉËËófu!YÕ÷M´ß?¯ù¼ŽãÏ@pÈË˳›&R×E:ö¤ž}[‚íêž“åmµËHg ø>=—º‹"Üž e{&wJJÊñãÇSRR:FÊËËGíöœ4벟zê)R^rübëú/ëÌ6ÿqUFÈÏHìÍúa@ÉËË[¹reÇÒÎR&.œ)Ò¿Î[æ IDAT»½Îdo *…lñŒÄ^=Hg xø&=òl霫6lXAAõÈñãLJÚ×쨓l†÷Œè§š7ÅÎ2ôFËÛŸÕVÖ›$© €7äååy#ÝC:]’¡¼jBx˜8[ –·?«­n àá›tv¶yöéÓ§¯[·ÎzdݺuwÝuWw^“É`ðᙪû§ÙIè¦Ö¶··ÖêZ¤ŸN À#¬'‰I]‹Î\×õ¶ß?ëZÚ^ϯ­Ó™%© €Çù&]¸ÖÁƒŸ}öÙ£G–——§¦¦Ž3æ‰'ž;v¬ûïm31L«ÕŽ9ráÂ…‹/aõêÕk×®-((ˆŠŠòÔ[^uöŠ~Íçuæ6ñ·®šâ¡éÛCÓš?¤ é 8tª¨õ__ÔÛ¦s¯Kf&Ú¶Öšô×yÞ¼yó´iÓrrröîÝÛÐаwïÞI“&M:uëÖ­®¾¥õ.Ñ˜]»v:t(#####ãðáÃ;wît;›ßÜG9;ÇÎ ŸJ Ÿ~Ó(EE‚é 8cX†jîd;é|µÊ¸y?é ÀYÎ6åÙÙÙ>úè¬Y³¬?øàƒW^yå»ï¾óNmÀ’$Äw§›7~Ý`;>;'>k Ú÷õð ¿Z0Œtœ÷íéæÿg/gMŠ3ˆt›oÒÙÙæ922²¨¨¨GÖƒUUU™™™MMMÞ¨Ì#˜©äïoÜS Þ4”²Gs“’ãÃ%) €ÇIž2¤3à’í‡u_ÖŠ•²e¹I=Hg XH?m;p±$ $1}\ì°L•hPo´¼¿³Þ.Å À}!¸`˜7ÎÄ”¢m§€é–ï®·9!@ ñM:;Û<>|ÇŽ¢Á;v\ýõž.Éø$!“ ³&Å'ʼnwc_­2î)ÐIRð«KU‘΀«r'ÄÙ¦sQ…ñÛSþ;Y€Cþu©ªåË—ÿîw¿[½zuqq±^¯/..^½zõ’%Kþô§?y¯8  ©²·'(ÂÅ{¿¾8¬«¨ãÚ’<€t\ÕžÎ6é¼õ;mM#W®Ð¦ƒûí·Ï?ÿüÑ£G+**RRR²²²üñqãÆyµ¾nâ¬*Hnÿéæl–'Ü[ùàIêàAþ2¤3à†oN6}bs ÒÞK™ O/Öó„ä,‚ðF~Ma‰A4þÐtÍ ^JIJÐ~µÚv€"!9‹EøÇ¦šKå¤3$ükµížmøƒZ­ù…ÿ«Ò¯ù*¦%Füþž$Ö)ã>7øƒÊzÓß7V›Ì×|{'G¹Õ`),5HU€ÀE:ž2¼¯J´þH‹¾íé ÀŠ;Ë Èåòþýû?óÌ3æÙgŸõxM@pS)dƒûˆç†½¢—¤Aƒtº#J%h3s›t`­[k>ðÀo¿ý¶§JBÇР‷΀{†õU‰FΓÎ~Ò­æ¹gÏžeeež*ƒ{+EgPU5˜êtfiª\HgÀ=Cmæ…Uԙ괤3€ÿèVó|øðáÌÌLU„¸¨°TøBq—Ê8± €΀{â£ÃRÄé|¾„ƒÏþÃÍæ¹¾¾~Û¶m÷ßÿÒ¥K=["ú§‰wo_¤yÐ=¤3ÐMƒ{‹Óùr¹Q’Jø!ñ޵Έ.†?hРgžyæÞ{ïõBU@ðë×SñÍÉ&ë‘Kå4Ï\C:žÕ¯§â«ãפóå ÒÀ8Û:kÖ,ëÁ>øà•W^ùî»ï¼S›°$ üÜùµçKôÖ#sn‹=@-U=\"yÊ΀7ئóÜÉñ£ú“Î@`lÁ°'Ožœ ¸ÅF…)Âe« `èm“Y´Î'ØE:Þ)W)d­†ŸÒÙh²46›ãHg ´ùr—¬ç ÿ·ê£ê’j£õÈoÿ+±_O…Tõp)ã>7ø¿6V—Õ\“ÎKf&f¦’Î@~µm^’-Þ]¯cIO¤”-þOré „zôèÃ?/“Élï½råJnnnllllllnnnqq±ÝÙµkר±c½\)à;ýÓ¢‘’j#Ÿø é Ø`“ÎW«Œ—ËIg DIÐ<Ï;799yß¾}¶wétºI“&eeeeeeåää477‹vìØ±eË–½ùæ›>©ð…TMx8ñܰÿ··Ádæà _ [É á‰±âEI>ÚÛH:¡IÊyS¶ÇÓ_|ñÅ#Gެ_¿¾cdΜ9ÙÙÙK—.íÙ³gÏüùó7nܘíÆ[~kOASþþFÑà˜Aêû&ÅÛ9 ÀeÊ΀µ]Çt[hEƒ£ú«çÜoo–éÕ´í.äççÏ›7ÏzdÞ¼y›6mêøqÆ ³gÏþøãÉf °Œ­o’Gε|ôUÿÉ !Ò¡lü°(ÛtþþBËG_“Î@Èñ¯æùÔ©S#GŽ´1bÄéÓ§Ûo¯Zµê±ÇÛ¹sç˜1c¤¨ð.•Bö_ãcmÇ¿;Ó¼nGÑDDéŒP¦RÈîú™ýt^ÿe=ó·â_Ís]]F£±ILL¬­­m¿ý?ÿó?W®\2dˆìG×óAfO^^ž7êº)k zT•íøñ‹­¯~ZSÓhö}IAÈË˳›&R×å#¤3BܘAêQýÕ¶ãß_hyõÓšZ-é HÃ÷éì_ç<+Ц¦¦ˆˆŸ.xk4£££õz½§Þðs“eõæšâJ£í]ÊÙ]ãco*ÿaü^P¦ é Ø2š,ol©µ»Î¶J!»k|lö`Òð¡rÎsBBBÇžìv555¢½Ý®b6‹"\öàšô¤Û»ôFËÆ¯ÞÚRËNn@BÖû¹¥®ÅGHg "\¶pZ‚Ýtn5XþoOÃ[[j+êL¾/ @;ߤ³5ÏÆ +((°9~üøÐ¡C»óš–ÏQ*ùâš~=Å×–lwîªþ¹«>; mÑ·ù¸0‚ äååu$‹Ôµøé ‚ VÊ3CÓ7µÓtþûƪÍß66“΀|“ÎþÕ}ݺuÖ#ëÖ­»ë®»ºóšìÛF R+åM׌dç +ALfËÎcºg>¨úâ0-4àk!xä™tÚE*åMר=ÿYs›ðÕñ¦¿}Pµë˜No •k€ŸðM:û×9ÏZ­väÈ‘ .\¼x± «W¯^»vmAAATT”§Þ,ûN5oþ¶±‹Å~hä„ë£b"IgÀׂêœgë]¢Ý111»ví:tèPFFFFFÆáÇwîÜév6‹ÞŽ}ÛD7 ‹üý=I½ìdÕ®Õ`ÙyT÷ôúÊ {Êjì,3À³‚õÈ3é 8ïæáQ˺Lç}ÛÎcº§ß¯üpw})é x_ðyööm#8´µ »¿×m?¢sx=ÉéÊ[FD î£ ®ÿÕ~Š”qŸ‚C[›ðÕqÝŽ#Ž'iHWL¸>jX†Št|À{)äéE<#˜ÔjÍùû_luøÈäøðñÃ"o¤V+™-x)ã>7“†&ó–ï´Çη8üNkbÂnuã`Òð® š¶ícL CÐÐĄ͟’ðèÝIC2”]?²²Þô龯¿¼W¹ñ«†’jf‹ž¬Ó¶}ŒtFЈ‹ ›ÿè=I×õvÎí;Áÿò^åG_7”Õr]+À“˜¶íìÛF°ºZeÜqTwêR«3ßïÌTÅMÃ"GöW…Éù¿>àI¤Œ{øÜ¬.–v¯;S¤wæûÝ?MqÓ°¨á}UaÁ0 ð)¦m»‰xFp+¯5}}¼éÈù‡çB ‚£–5~Xd4ërBʸ‡Ï Á­¢Î´§ é¨séö³¡‘?J:ôm÷11 A,Uþ«[ãVÌIžrC´ÃÐÕ¶´}qXûôû•}ÝPUÏl1ÀMLÛöÒA,%!ü¿o[1'ùö±1/UÕÐdþüöé÷+?ÞÛPÓhöM…@ðaÚ¶°o¡Ãd¶=ßòÍÉfgNr–É„a™ªÛFG÷Nîô2"eÜÃç†Ðan³|_ØúÍɦ+•ŽÓY.FöWO•ÞùE°8Ä´m7ÏAW«ŒûÏ49×b49þò÷MUL5,CåƒÂ€àCʸ‡Ï !èJ¥q‚ ­æ6Ç_þëz+o¿!&#…pͳ›ˆg„,]KÛ3ÍûO7×éÏËLUÜycL¿ž RÆ=|nYÚæ¶ýgš÷ŸnnlrœÎC3”SÇÆppç<»³ªš¢Õòœ¬è峓}{ ^Ê®Oþ¸\nøÇ¦šw¶Õ–så ÀÎyöÒ¡)&R>eLôŠ9É÷OsœÎ§‹ô«>ª~sK-Wâœg`ß6Ю¬Æ¸§ éX¡ƒÙbr™pÃu‘ÓÆFÇF…ù¬6 p‘2îásÚ•þ'[ÚÚºz˜L&Ü0H}ç¸ØVäœÀ´m7Ï€µ†&óÞÍûO7µºÚ.”²Écb~>"’ëB]#eÜÃçX«Óš¿:ÞtàL³¡ËÅJT ÙÔ±17 ‹’ÓA]¢yvñ ØÒ-Ï6ï:¦klîjGwR\øÌ›b‡ôQú¬0 à2îásl5µ¶í;Ù¼÷DS³¾«tNKŒ¸{BlßT–):Eóì&âèŒÁdùîtó®ïuÚ.[è¬ê»oŽU+ÙË ØAʸ‡Ï èL«ÁòÕqÝ×Ç»š#&„®Sϼ)N¥`‚`ͳ›ˆg k“å›M;éºé˜Hù½·Ææ4`ƒ”qŸеf}ÛÞM]·Ð Ña÷MŠïŸÆ!h@ŒÕ¶ÝÇzž@á²I££ÿx_òÍãÂ:ù{ mnûç¶ÚÍß6šÌüg`µmÏ .D*å·ßÓžÎá\§3¿‘_óÙA­¹ËÅÆ€ÁjÛÀ¾mÀyUõ¦O÷5ž-Öwö€^="LIHˆa!nà?H÷ð¹Î+­1~¼·ñR¹¡³ôNŽ˜“Ÿî˪Æ´m7Ï€«Nµ~úMc­Öl÷Þ(•|îäøéLá”qŸà‹ 9ײe£¶ÅþQfe„lÞ”„Á½Ig@hžÝF<n0˜,[¿Óî;Ùdwã‘Ë…ÿ{óð(_—øRÆ=|n€Z –­÷Ÿj¶»ñ„Ée¿º5î†Aj_—øšg7Ï€ÛÎ]Õ¸»¡¡Éþ!èI££ï¼1ÆÇ%þ†”qŸà¶3Wôv×Û=-„)cc¦Œ‰ö}U€_¡yvñ tGSkÛÆ¯N\jµ{ïMÃ#qSK&!”‘2îásºC×Òöážú3Eö×(ÉùË[âä¤3Bͳ›ˆg ›,‚°û˜nÛAm›½-é†Aê{'ÆÓ?#d‘2îásºÉ"ßžlÞôm£Ù^<½Nýß·’Î]4Ïn"ž8wU¿þËú¦V;“IJGþêŽ?#D‘2îás<¢°Äðîöº½t¾qpä/o#œšhžÝD<žRÓh~sKMM£S 642÷ç$4B)ã>7ÀS*êLÿü¬Öî52nùKön#$y/e:¹ì:\+16lÉ̤´ÄÛ»öŸnþâÖ÷%âR—ü"©W;é|àló‡IgÀ“‚¿y–ý(//OêZ€À)_|—¦O²„ÞqDwè‡ß—ø^^^^G²H]K#O‰”/ž‘h7¿<¢;rŽtFHðM:ù¼)&†×¢o{sKmq•Q4&—ýf†¦_O…$U’ eÜÃçx\‹¾íüÚ«Õât“-ž¡ÉL%B˜¶ À_¨•òEÓ5éIâ=Üæ6˺íu]xO{:Ûž]e2[Ö~A:žAó Àe‘Jù¢;5š˜0Ѹ¶¥mÝöz»—Í^¥’?4ÝN:ëZÚÖYßfgMn®¡yàŽhµ|áµRü7är…aëw,O€¢Õò¦iT ñ9ŸË ÛXÚè6šgnJIŸ79^n³(Ã×Ç›N饨€P—ª Ÿ{[‚m:ï>¦;{…tº…æ€ûõRNËŽ ZáÃÝõÍÌ@ƒûØOçï®×’Î@7Ð<è–‰££‡gªDƒM­mî®çÔg$1qtô>JÑ ®¥íß»ëYêpÍ3€n‘ ½ã¢ÅË“üP¬ßw²I’’q2A¸oR|¼½tþúé ¸‰æ@w©•ò9·ÅËmþœlùN[Yo’¢"B]”J>;ÇÎÒ$ŸЖՈ/ À4Ï< 3Uq[V´hÐh²¬Û^g41? ôëi'MfËúõÒpÍ3Ϙœ“™¢ –Õš6ïo”¤0yLLfª8ËkMŸ|C:.£yàr¹pߤ8E¸x~Ø·§š¶HR!N.fçÄÛ^ùùàÙæƒg›%) \4Ï<&).ü¿ÆÇÚŽÿßž†’jN¯@š˜°_Üg;þñ7¤3àšgž4nhä¨þjÑ ÁdYóyW~@7 R½NœÎF“åŸÛêšÌ’”"šgöË[â’âÂEƒõ:ó;ÛjõF–'@wOˆKI§sc“ùmu¤3à$šg¦RÈæMŽ·=ùùj•ñ_ÛëÌm$4¾¦—ÍŸ’ Œ§sIu{:KR`hžx^zRÄOŒ·¹´¤ðC±~ÝŽzßKI¿·“t^ÿ%ý3àÍ3¯Õ_uûØÛñ“—ZIh$1¢ŸjZ¶t>~±õ½¤3àÍ3o¹mLtöàHÛñšùÛøZNVôöÒù{·Ghžx‹LîùyÜ ¥í]'.µ¾ûEÉLÿ €¯Ýóó¸!}ì¤óñ‹ôÏ@WhžxQ˜\˜?9a@ºÂö®ÓEú5Ÿ×MôÏø”\.Ì›’Ð?ÍN:3; èÍ3=0Mc7¡(Öÿs[­þßR„ËÞ¡±»wûÄ¥Ö5Ÿ3; °ƒæ€×µ'´Ýþ¹°ÄðÖ–ÚV €O):ß»}öŠ~ÍçuìÝDdK0o2Yÿ‚@1˜,ï~Q÷C±Þö®>ÉMOT)l/Ÿø5RÆ=|n€ÿ0˜,ïl«-,1ØÞÕ¯§âiÒÇ{)Ñg>¢—Ý?5a¨½õîTßÜRÃñg|¬ýø³ÝùÛË on©iѳ€ðA¾ë—}Û€¿1·YÞÛQâR«í]}’#Ý©Q+Ù©‡€Aʸ‡Ï ð7&³å_ÛëNÙ™–žñÐtM”ŠtFÀàÈ3€ &—Í›œ0ª¿Úö®+•Æ×ók›ZÙà €O…‡ÉæOI°{uÉ’jãùµºÒàÈ3)´Y„w×9×b{Wª&ü7Óc"Ùµ‡@ʸ‡Ï ðOæ6aý—uÇ/Ú™–¾x†&6*Ì÷U®âȳ ‚ÅbyüñÇ4ÍÿøGr\r™pßÄøÙ9þ\^kZ½¹¦Ngö}UÜ@:A#L.Ìœ0Æ^:WÖ›^ϯ%â©y~ë­·¾üòË£G9rdûöíï¼óŽÔpŸL&Ü;1~ìuöúµOkÊjŒ¾¯ €«Hg ˜´ïݾqp¤í]•õ¦W>©)%ÂiÞÔøñãW¬X1mÚ4A¶mÛöÌ3Ï|óÍ7]?…‰a€Ÿ³X„ö6|wºÙö.E¸ì—·Äe ´Ó]~‚”Hg Yá㯾µ—ÎÊÙ/o‰=€t†ÿ ªiÛG}øá‡ãããe2;W»råJnnnllllllnnnqqqÇ]§N;vlûín¸áÔ©S>ª€×ÈdÂ=?»yx”í]“åýõö4èü'ð:Ò@™ Üýó¸ ×ÛIg½Ñ²þËúw×s +„ šç¹sç&''ïÛ·Ïö.N7iÒ¤¬¬¬¢¢¢¢¢¢¬¬¬œœœæææŽ{ãââÚoÇÇÇkµZß Àkd‚ð‹›c'޶{ïÁ³ÍÏþ»rÿéfs-4àE¤3k2A˜ySìÄQvúgAýÐòì‡)DÎ IDATUûO7›Ì¤3Bˆ”ó¦l§¿øâ‹GŽY¿~}ÇÈœ9s²³³—.]*B\\Ü… ’’’A¨ªª4hP]]«oÀoí:¦û쀶³-66*ìgC"ÇV'D³Ô'üEP¦ é ÀÚž‚¦-û;Ûbc"åã†DfŽÔÄÎðA5m» ùùùóæÍ³™7oÞ¦M›Úo6ìСCí·>ó~åêÍ5ßœlªgÁOÀWHg ”Ý:2jÎäNÓYÛܶãˆîo?¦sCéŒ`æ_GžSRRŽ?ž’’Ò1R^^>zôè²²2AÞxã·ß~û£>áž{îY¼xñÂ… ]} ~®´ÆøÞŽúÊzSד Bzˆa™ªaÊ´¤û‘xYP¦ é ÀViñÝ/êjôÆ2Aè1$C5¤²WR„½%¯ó^ÊøWó¬P(ššš""":FŒFctt´^¯~¼’äÛo¿-ÂC=ô¿ÿû¿v5éú-ø?½Ñ²éÛÆgì,òiW´Z> M90]1°—21–icð LÒ€]z£eËwûO5;¹õƨåƒz+¦+û§)˜Ô _¢yÖ»ývÇŸzꩼ¼<÷^€o\(5äïo,®ríz’š˜°A½”{)¦+¢Tþuf W^^ÞÊ•+íÞ|M é   —Ë Ÿîs'¤+û§)¦+â¢h¤á¾Ogÿjž»žæÞ[tÜ&’€c„ÓE­_4](5¸ú\™L詉蟦¦è—¦ˆTÒHÃ3DQ Í3é ÀšÅ"œ¹¢ÿ긮°Äåt!).|`ºb@ºr@š"ZM:Ã3|“ÎþÕÉ 9á Õ‘g»Ë„t”qùòåeË–µÏËÉÉy饗222ºó^Ä3Ü &Ë¥2Ãùù«úÒ£Û[¼"\Ö·§bHåàÞÊñá­A+˜R†tàA­Ë…R}a©áB©¡;é¬Vʤ)®ë­¼®·’%»á¤ jž}‰‰a@Hѵ´–êÏ]5–èÝž×-BblØà>Ê!½UýÓŠpöxãA?mÛHg ¤4ëÛ.” K …¥úŠZ“Û4“â¯ë¥–©êŸ¦`²D‚Ú¶°oYÍm—Ê çJô—Ê u&÷^$üñ{IgüGžÝD<èBe½éÜUýùCa‰¾ÕàÔߊ‰£¢¦‹õva¤Œ{øÜt¡¬ÖôC±þÜUýÅ2ƒÑ¹S¤'޾óÆo†@Aóì&â€3Ú,BiµñÜUýé"ýåò®Úè%¿HÌLQø®2ø7RÆ=|nœa2[.þxA’*c5–þ")#%Âw•Á¿y/e‚ÿ {Ù8¥ @gä2¡WˆI££73ñ©y)ÿ}kܨþ*•B¼’gL¤<#™Î9Ôåååu$‹Ôµ0Ò€Cáa²A½”wÞ³,7©=‡gª"l®‚)ï“Lçê|“ÎA¾ë—}ÛÜÖfŠ* Z .¶66™A?42÷çqR×?Bʸ‡Ï €ÛŒ&Ë¥rÃé"}Á…–Ææ6AÆ ‰üå-¤3~´m7ϺÏbŠ* '/·ËTõMåÈ3~Bʸ‡Ï @÷µïã>y©uh†ª錟Ð<»‰xx)ã>7€÷pγû8« àAœóì¤3Àƒ8çÙØ· ðRÆ=|nïáÈ3’¡yÀšg yÀàožYÏàA¬¶í¤3ÀƒXmÛXÏà=¤Œ{øÜÞÃjÛH†æhžp€æÀOX¹C:~"ÈWì`IÀ%l2€KØdÜÃ縄Mp † šg yBþvbŒoêñø»tóÝ~ºKOtþÁþö­ð+þöá°Éxõ‰N>Þß¾þö¥âO÷žH:{„¿}8l2^}b ¤sŸA!“É:n?õÔS’ܾáo'Æø¦¿K7_Ðí§»ôDçìä#ýíËãþö[³Éxõ‰ÝßòòòV®\Ùñ£_}yéìøSã½'’Îáo¿5›ŒWŸ(éì__Jó·­Î7üí·æo÷žH<{„¿ýÖl2^}¢g·ûòŠÐüÜüí·æO÷žH:{„¿ýÖl2^}b ¤³})=Îzß6Ü1ê%¤3À«hž †àÍ3Ð<àÍ3Ð<àÍ3Ð<àÍ3Ð<à@ˆ6ϲI]>ÿü󜜵Z––¶pášš©+üÚgŸ}vË-·¨Tª´´´ TTTH]QÀ ç‘΀K<’Î!Ú<[,‹Å"u@`XµjÕþð‡ªªªï¿ÿ><<|þüùRWøµ^xáÑG-//ÿá‡úõë7kÖ,©+ ¤3à<Òp‰GÒYÊ)%“…ô¯¸A«ÕöìÙS§ÓI]t:]JJJSS“Ô…Òpé ¸Äítà#ÏG}øá‡ãããíÎïºråJnnnllllllnnnqq±ï+üŠG6™]»v;ÖË•~¡û›LSSÓk¯½6qâDïëGHgÀ%¤3àiÓ9€›ç¹sç&''ïÛ·Ïö.N7iÒ¤¬¬¬¢¢¢¢¢¢¬¬¬œœœææfß øîo2ÇŽ[¶lÙ›o¾é“z‰us“‘ÉdÑÑÑ/¾øâK/½ä«’ýé ¸„t\"m:ÃÌ(Ûù]/¾øâ‘#GÖ¯_ß12gΜììì¥K—výD ¸·ÉìÙ³gþüù7nÌÎÎö]­€p;eW­Zµk×®¯¿þÚGµúÒp é ¸D’tà#Ï]ÈÏÏŸ7ožõȼyó6mÚ$U=€Ÿs¸ÉlذaöìÙü1Ù N§Lllìïÿû£Gú°4¿F:.!—ø ƒ³y>uêÔÈ‘#­GFŒqúôi©êü\כ̪U«{ì±;wŽ3FŠê¿Óõ&3oÞ¼3gÎÆâââ?ýéO·Þz«%ú%Òp é ¸Äé 3£lÙ+Ц¦¦ˆˆˆŽ£Ñ­×ë;žbýø øç¹ºÉخǠÕj£££}P*à\Ýd6nÜøôÓOŸ={6%%åŽ;îøÛßþ¦Ñh|]´ —΀K$IçmžPÆ&¸„MÆ=|n€KØd—H²Éç´í„„„ÚÚZ둚ššÐÜñ8ƒMp ›Œ{øÜ—°É.ñÁ&œÍó°aà ¬GŽ?>tèP©êü› à6÷ð¹.a“\âƒM&8›çéÓ§¯[·ÎzdݺuwÝu—Tõ~ŽMp ›Œ{øÜ—°É.ñÁ&œçöØcŒŒŒŒ‹‹›@:“΀?²¡M„_ÿú×|ðACCCÇàÙ³g“’’Ú8зoßÝ»w·ßõ‹_übÙ²e—/_6 555ùùùS¦Léx©ö………)))/½ôRYYYYYÙªU«î»ï¾Ž{ínwÖƒkÖ¬Ñjµ—.]úÕ¯~õÄOtñÄöñE‹-_¾üüùó:nÏž=ýúõûðÃÛïÝ¿¿F£yÿý÷++++**Þ{d„„ƒvñë ‚°`Á‚µk×ÖÖÖž?~ܸqÏ?ÿü‚ Ö¬YSSSÓ>òòË/wñ‘Úýñƒ>¸í¶ÛD~àþú׿vöR]¾|¹G[¶lINN¾råJ,**JKK[¹råÅ‹[[[¿ýöÛ™3g:¬ Ò™tî¢f@*|êAXµj•hpîܹ/¼ðBÇŸ~úéwÜÑ~;::Ú:ÉD/Õ~cΜ9ùË_¬ïzòÉ'gkµµµýúõëú1‚ ¬X±ÂzdëÖ­7Þxcûí™3gþãÿ°¾÷ÕW_½ûî»;žkûë ‚`¾ûöí‹ŠŠ²ùæ›oFe·Û:;~4 ééé'Ožì¸«ºº:>>¾¢¢¢³—rÆk¯½&“É^ýõ®¶`Á‚åË—wv/ñ ~…t&-¤3ü_A„:A.]º$ìß¿ÿ¹sç:~¬­­MOOo¿ýàƒ^½zÕîKµßHII¹pá‚õ]………NÆsKKËÊ•+¯»î:µZÝ>=$,,¬‹'¶‹Þ®¶¶6!!¡ývŸ>}D;}‹ŠŠ222:žkûë ‚P\\ÜñcCCƒíHll¬Ýblë´þñ™gžY¸paÇÏ>ûìܹs;{'½öÚkr¹ü•W^éúa={ö´þ7!žÀ¯Î¤³…t†ÿá+ˆP'‚Á` * Ñ r¹¼ý®‹/Μ9S¥R ù¤¾¾þÃ?üÙÏ~Ö¾³Vôô¤¤¤ÒÒRëëãããëëë­ï½téRÇí7þóŸÿ=ztTT” /^tæWË;Ý–SRR*++­G*++SSS;~´ýõ{ë¦xäâŠIIIwß}÷›o¾)¦M›RSS³³³í>ÒúÃïâzè¡Ç|êÔ©=öØ¢E‹º~ë«W¯v§x€/‘ζÏ"iÑ<vLœ8qÓ¦M]< }AÈE‹mÛ¶ÍvYÈÉ“'ðÁÖ#ëׯï¸=hРýû÷[ß»fÍšŽÛ---*•ªãǵk׺Q¿µ¬¬¬üü|ë‘Í›7geeuóeÝöÈ#¼þúëF£ñÕW_]²dIw^ê_ÿúWCCã>*²eËêêêÞ}÷ÝÎ;v¬Z­V«ÕcÇŽÝ´i“óÏu~¤³»l¹yófAþüç?wö θû~úiÑ`^^^nnngO¹téÒìÙ³{ôè1jÔ¨ 68_3À—Hgg^t|LféòŒp•LvÍÑ‚ ´´´h4šÂÂÂôôtŸWgŸÃšh¤3Ð}áR ´Ô×׿ôÒKóæÍóŸl đ΀3hžøŽL&‹ŒŒ¼ýöÛY?A:N¢yà;̶Àß΀“8s¸Î3Ð<àÀÿ#×KW‰¥IEND®B`‚gsl-2.7.1/doc/images/multimin.png0000644016036000116100000005123113373111455013611 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœíÝ}|Õ½?ðÙ’µˆ`0<øã ˆñáåCAJlÐZ)ÅKh¸ÞJ½>ôÒ{±Ú¾ƒ-ÜŠ-¨Eì …p n‚żDŠH½ *¶,„$›DÚ‹ L„ŸPjÈîÎþþ˜vgöavvΜó=óyÿ%kv÷{ÎÌîwç|Ï9ã‹Åb ¸+‡w^„ À0HÀ p€ À0HÀ p€ À0HÀ pàpŽF£+W®œ8qbaaá¹çž;a„•+WF£Qg߀º\g_îG?úÑîÝ»Ÿ|òÉñãÇÇb±P(ôÀìÝ»wÅŠξi>gïûì3߀:‡‡ û÷ïo~ðœsÎqö]¨s8ßwß}wÜqÇ;ï¼sêÔ©S§Nmß¾ý»ßýîøCg߀:‡ð£>:dÈ믿~àÀ¼á††úðÃ;û.©ªºk×.UUy"¯u,õöR‰_è8cŽZºtéðáÃ_yå•ãÇ?~ü•W^>|ø¯~õ«´OÌÍux:€#œM”q¿nIIÉ›o¾©äÍ7ß1bDú8˜µ#ù%_‹b™7*j?¨µ¶µµ <8 éÿ`çÎÑhÔÉ(3DñHé;ÖܫТpïUgië3“µW|ñã¥^ÀO^Ùûl’IÀyyy§NÒ?rêÔ©¾}û¦C¼Ã–=ù%_‹bY7Êc¦/SógÞ… MýH™{UQr)*­øa2·W„ŸqéƒWEäÈíýÐ!“€KKKßzë-ý#MMM¥¥¥éã þ}‘|’¯E1J{‰lÎÐ;vìØ±c‡ƒßYò)EQô½ª}ˇÃaa¿ë­Hq˜â'‰ÈùÌLQýé-Zðæ:ápxÍš5áp8ųÈ$à+V\tÑE›6m:qâ„V¾ð Ÿyæ™ôqH÷}“±Qòµ(ƾQ /n º¨¨¨¨¨ÈÁqlùŽ”¡EÚ·|CCƒ°ßõV¤8L†ÞÖÖV­Ó®€ ¥‘ƒ¯¯¯ÏÉÉY¿~}Š¿!“€c±ØoûÛ«®ºª°°°°°°¼¼ü¥—^²‡tß1%_‹b4*ƒÁ;wf4Ž÷F9ÎÐ"í[>‰¤(‹ÏÊaÒZÚÚÚJ¢u “ÈÁ‡ÃáÚÚÚø'+áݧÉá°lóùD‰ÄAò5J¾)¢6JUÕ–––I“&ù|>EQB¡Ð´iÓÞxãË/¿<þ»wïž4iRNN‚Å„b6*i[dè1%]‰Àúa¢Òº„-2/,óMaùièÈ@\NNΕW^ÿÂòûý›7oöûýñ?èèè¸å–[:;;ã½Þ‘=C)ru‘•Ö Ë¼°ÂüAc ˜¡ššÞ!8L¾)Deþ 3S„B¡ŠŠŠööv…H£2b£E©»HÙ&CëTU ƒÁ`oV³Ø¢ø¯Ñ2±áƒ¦õªöLÞÑÐv¦Ä‰€¨–––¢¢¢¶¶6íŸ'%±&q%œÊ',ób1…Ö«Š¢0êUQÒž˜ ØÊ δ8ò€´HìÂWÚ.¢+áT>ñxÂÝ<Ä¡õªòÏýR'JÚË>³H„iWpZyÄ‘§°hÈ-í!1ÏŸ¤·¿°B̬–áXu Ø] š€ ½o^+m><,aÚœVqä),ZgèÆ„ÛAõ1€,¥=¯¬lJ 7ó&¤÷ú0qBÇW¨Ä’'àh4ª(JŠlj^+0—8žÅÁ¨uúnLXCJ{Í„ëlÒ §„ùƒæµ£iÞDB¿×uV6„y1ÇSQòÜÖÖf¨r›¸é×J›ÿìÑwc²Rêk¦L¯³Íÿq˜?h„Æ0gÞë#FüìMøE*rsÌ¿‡¸œŠ’'à¨î® 8WÞÙW¸髤™’ì ¡æp¼è’<ÇD ŽÈ¾Â#U¾’[ÂßOŽßLBX ‘Ðm¾ù³I¨-®}' ƒÌ¬\FÊWæë0dhw$üý¤Ÿ=àµKdZ pS£Õ×JÚHÀàu†ò•ù: ˆx1Ì 4ªéóä º'­¶X¹‚#€¾Ä|–v*Íî@ÙX¦õÖ„~N±   c†L`qÂ6¡^ëçd³YÕšB?§Ìõl§âDÈ–Å Û†˜°_7„ llXÕJº½---………­­­¼ICûÑSWW—}?#¸Á\K;Ž 6x³lÿ!Bº½†Z+ÖÕÕ9ÒÏìÒ“(wí–ïþá ýÄÍ÷ëó¾è´P¹Û¼SH·—PðN…Ê0=1Jì™'€¬,bÆUrö¼Ö«¤¯‰ o/TvéI”´‡ D¥MÉæ GrçG$ëUGJz2l Kë&†àEž^ß^4£¾E Ã<ûÚ0±‹Ðƒ8 %=‰ľ ‰­<Ì÷¼J}"!P•ps*K;„"ÈÖü¬‘¾ „ùl‰|¦'»ô$ÊÔ'LÂ/ÃÜ®Lš äóBˆÈÁ›O$3véI”´‡ ^fþ0|giÙeâĉ­­­²æ˜,™{l×®]Š¢”——KÐ]†3„VëôÁ þ;)aÇb4€·$ÜÆK_mX»´¥w™Ðmà›‚%ìXvéI”ëN\¤ ]Cį€}>F­SSUµ¹¹Ùçó]yå•ò SÓmv&çææVTT8(mîXUUûôéF™ô*£Äž)q" ÁÊò'1/28’xêVŒTëÍClkkS…Q¯Šr݉+`€,¥Þ´‹VÕs%U¦Ê:¡R«™vº.[¶¬ªªJ¨˜µ+`UUSÌÒ²EV·K$iïOgåv,^ÄÞûèyª&jÄ•uÁK­fnÝì8vé‰jv$«¥½?•رxOqä·HŒÄM—™WÜÅMÍpÿ%ÞáXbÞL3SòFEq6wšI¸»lêûÓY¹‹±ñG~+ C{ ÊÆ„j“V˜¿X¨´E¨_B’'`s•;ûÜi~Äü2qä·‚Å[Ög:ZÂJ{DÅÞÚ×ñ>‘àÄÎt FŽÌ_VápxÍš5ápØý`$OÀÚ°gs§8¬äl£åis6"ááöxå8Þ'䪪fúãK®9õõõ999ëׯwÿ­%OÀ1,C¢ÃÆh¹•ñ *ß^c®{ö`Q¬ª¦@®9áp¸¶¶–ˉ‡ „¥ÍÙVR²g¿÷EãñßOr‰c¤šãZ¨HÀ 3+)Ó…‘ö`yíÐ5]({„šãZ¨HÀà-6æ‹™§ y-ð’ðÐÔÕÕy¤çÍ<¤§­Å›#þÇǵP‘€¾ÄÊt!_™ñ5í¨à©ž—fÚ¡YZ¬Ce—žDÙ[QB–bkF…Èæõ¥íy‰Ñ½M‚àwMÐc*nG-+•fŽk %Fz¦#V ;v¡²KO¢¤=$`pŸùk^k¨}†Ãá°˜_:D’ô¿{ géö’šÎ~:™œð";//ÏÊÀóZCÃ~ýXåCBâ¸Ç¤ÛKh±y:‚=d°Ù“O>9{öìôq ƒ¢_Þ¯ßÊÎ_)óï¹ÖHÐ^ýO(‘ƒ7ÏQ·*ÕF/¾øâæææôq wØÆÖ›YòÚv¤Æ Þ^¨T𫯾zõÕW[Š d‘bëM¹³ˆƒô?k^|ñÅ’’’ÜÜÜ>}ú,Y²DÊ>$½˜˜Pðö.Ü©&à¯ýëëHÀ [ošÀ"ˆûî»/¾˜GQ”üüü%K–H߇¤S Þú‡‘]zb¸úöÝwß­¬¬üë_ÿš›››ö±¼ Ù‚EŠëD]ÐÐÐ0gÎUUõŽ92XŸj[ÂÅÄTP Þúêa’뀿ÿýïÿâ¿°øÇÉ«©©a!önGáA矾ù;¡_¿~1RëSAºu"¯?‘jjj\N”¬^÷رcçwÞ§Ÿ~j5 Aƒ‡Y¼Ã§–#×××'ü*,--Mø÷rï™ÑëHÜEŠ…Ö‰Ì¼°Ç¢££CQV½ÊèÊ:SâD@TÂ2¡¾`Le—¹ú›——÷â‹/fÿʤ+©i™w™ rÄc‹h4ª(Š~DÚA¢¤=. 8íÆúVvÞgñ"öÞ@Ï<óE?‡Kdæê¯¶ôÈqæJª4+ZG<&vU›]z¢š€Éji7Ö·²ó>‹±ñG~+€¬Ìs¸â xŒ9Ò€“-=Ê^ŠaÒ’q‘ÙÛ'ÒžKÀÙçNó# ÷:H½±~Ú?`ô"6žâÈodh¯sui ÈÏÏgßüüüdK'÷þ„Ú"Ô/!ɰ6Èž"¿ÚÈæGÌ G~+XÉÙñÏ0¹"˜ [6ÖnÀ——WRRâHõ×6ak“6įø™ØüíÍ1`Ép[[›¢()ò«Ü¹SVrvü3œ¬È„Ëhºè–Ù1Ô&IŸÌñãK(køþ ’<3fΊ†“™0Ð-÷ËÆñ«ÞÂÂÂ{î¹Çñ×·Íü»„ú/s&æQ|§hIž€cX†$gº] ,bô•]__¯¯û0 8ûŽl4ŽPs8†Š òÈh [ÿ7¨=‹ Ù4¥,ˆyíïÈ‘# ™-ÉNÈp8¼fÍšp8Ì;ô¢‰nœÀ0x‹#µgp‡áˆØ;®­ýuœdÅòúúúœœœõë×ó$½„7N` ¼ÎFí)Ù†#boŒÚ͵¿Î2Ÿ¤O¼p8\[[K"øh¢'°€ FÚqlÒ_‹„Ø[JËqí¯ã¨Ìl²‚Ч†]¨HÀK;ùKÿ‰%ôECŽÅÁ qÖþf)áOwª•Ž#ô+Ö¼ŠÝ©8‘€²•úYðû„“fe’Ü\«V:.á¯X1·%a·ZŒ]zå.¼¸0¸OSRí¿sss+**ÞxãË/¿<þ7Tî±Jˆáv°Òw²ªªÍÍÍ>ŸO»Ýöªª,X ÿŒH;Á&Nœ¨fYö3ÃôÄ(±gJœHÀËPHæÂƒÄtÛKhé°SýÌ.=‰r݉+`“áZ- M›6 —ÈÎ2t²"{¯šÛKš°Ë©~f—žÄê/ÑääähÆÚ?ý~ÿæÍ›ý~ü:::n¹å–ÎÎNퟪªƒÁ`0¨ª*‡p zûí·=ªïd埽ÚÞÞ®]lq ÃI¥(J$©­­D"£²M;X@@´#E Ÿ]YgJœH2bž¥b˜nƒQëNŸ>=dÈÖÖVÃãZ¯¶¶¶Êq„´maÆw£æŒØëgvéI”´‡ r0o€BRxì±ÇfÏžìÿÊw„dÌÛ_Ð:IôGJäÈím3‚ @UF;]ó›cÇŽ 4hß¾}VþX¨ĺ€îZ‘[9‘Ø¥'Q¦>ax‡ynˆ6·këÖ­ápXÀÉ,Œ<øàƒŸþùŠ+l|øªU«ì½ˆytZâMTèîã{µ6»ô$JÚCHQò”&îû›ŸŸŸý}Í?_$ãÚ]XŠVÚ6»ô$ÊÀ/† ôd]lxäСC޼²yѧ~‰6­^²‚Ð `>4Â.—×ÐÜèXFWÖ™'âãfñÁjÃÔnÞ÷Wî:±ùàQHTµãË.=‰’ö€ìIöE,f>æuß_‰ëÄñ@Ì#ž‰ª¶Ö±Ú¶YŒzU”´‡ ¥´÷?A4åxß_¹‹yÄ-öX´µµ)ŠÂ¨WE™ú„IXÎpRR4½öÚk×­[7jÔ(.$œqC—€GÜ:a…ªª}úôQU•Å 2ÑŠƒÌõ´ØxŠ#/bï}ôRLJŠŸ<.ŸEëÖ­ëÛ·¯ ÙWI4ã&‰ÐýX™x(ª¨¨hooç•Eñc!Ú7›öÛ…Õüm—Õ6d‰y¼"í#æñ™´ØxŠ#/bã)6:¼Æ\-vsÐòìÙ³_|ñŸþô'ÞË­+èŽâšµ´´µµµñ$N—c—(MÀ†TaÎöR”aKÞ´ØxŠ#/bã)ö~+¤ígäl)é§í¸V]¶lÙm·ÝÆâ•ŸqCånóVP¬y 8]NòF•/O3K{Eh/5JÌ^‡Ø¸òN›³.¦Ä‹/Þ³g‹WfJ¦3œÐ,-¡¾½%OÀæifi¯Á6®¼Sçìh4ºcÇŽ;vÈñ…å5 OPZˬS£rÓÀ„Âáðš5kÂá°ûo-yÖ®€‘_IH³®¯ÇE3]æêµÃg(œ U›Ì¹æÔ××çää¬_¿Þý·–<ǰX ××[)(Pùðó%4Œé,k“٠לp8\[[Ëå[‚]zeõ-ÖKÌ|ЄwÕàN^@z±iö$k>¡Û$˜¹Öó¸fXžh^­˜âNñGô«…ÝÉÝ ’-/noojù&#’5ßÜœH$R[[«í¿(8­ç¹nÿ£+ëL‰ ˆ õä/+•fpa0Ók‚ÜXnjK­™Šºu§avéÉù×F£¿þõ¯ÇŽÛ¯_¿qãÆY-Ã'B䃥ÕJ?/Z´(ab¢³ù|Ê”)ÇŽÓ?rôèѤ}¢ã‘°`þMmž_ƒ«ä,%ÜhEVÔg¥Q9XÙô3»ôäð—+W®,((¨®®Ž?²víÚ^xá­·ÞJýDì DE"‘uëÖÍ;7¾!­akkÒ{s¡ªjss³Ïç3\iIÙÚn̹¹¹úíЩHx°”M?3LOÎæóÏ?ÿüšk®yá…Ž;vìØ±µk×oÛ¶-퀗´ëÁ¹»1ᘉ^‹¹½ª0»ôä|bïêêúñ¼eË–¿ÿýï&LøùÏ>eÊ”´ÏÂ0È*áýsvíÚ¥(Jyy¹L×s½½½}ûöeôâún”µõ´q”eË–UUUÑj£ùÖ­[Ãá°à#O$2WÀ¶‰ kRnòÞ{ï]rÉ%‘HÄ…÷¢Rw̆kwp¡¥ÞO$véI”ëN\ƒw˜Ëfæ;"Syä‘#GŽôíÛwúôéëׯwáM©Ô³d¸è§U'¼Å‰]z%í!ƒ—½Í{CCüyóΜ9£ý3??ÿ¹çž›={6—`Hô˜mt¢)ăWX¦' ÏTr’Ýæ=¾àXÌÕÆ .Œg_EQΜ9SSSÃ+}‘[\›é¥ÃñàÅÜí£¡íL‰ € Ó5ÅÜÍ¿_¿~†ï“~ýúñ Æ;·| Û:ñ§²'ü ±KO¢ üb ójcF\Gµoß>ý#¥¥¥†G¸ ¾¸65º­‹—Zb±÷³7!óMÁ,h0áÆM@ ???þe’ŸŸ___ïÚ»§%ÓâZ3B{2›‰)¬Ç.=‰’ö€2’âÆMn¦™_|±¤¤$//¯¤¤äÅ_tá³AwðÖŠp8¼fÍšp8Ì;ôôg¯à¿Š¢Ñ¨¢(ŒÂeàCÐYŠïµ··SÙ Áeto­hhh˜3gN}}ý¬Y³xÇ’Á7î…B&L…B,ÎQÒ0€SäN3Ù¿iOÂú¥ø?]UUíÓ§ªª,Vœ‹’ö€œEtm±›¨¯OM‹Ð7Ÿ®âÀ:`&Ì‹Ò ¤ýF/bå)©¥][œÿ÷ÿþߊ+²¾ ÷!–ƒGœ5óéê , Ë6d‰¹’ox$îØ±cÇŽñGÌ3ñ ¤ýF/bå)ñÖiÿ‡S7?á#à)æy[¶§íüçþçý÷ßïhtB 4É íˆG"r|¡»DI#[É%V²šy|ó*ý#iÿ€Ñ‹XyJ¼uÚ444Øø­`þBîƒ Ù°·¿ÇÁƒ‹‹‹»ººEÅ‘˜žd‰ÖšPBòlžçmÈsIÚ¬ wîÜItåœA¼uñ¹6~+¤½òFJ–[8®­­ÍôXuuõ£>Ê>: “â# ÿ® ÒóàHòÜÖÖ¦(JŠüj%—€ i¯¼qÑì)V.•>þøã¡C‡ž(^>&cþÁM¨E«Â’'àv¢ÃÊEsê»ÍÓúØ{œÅ;–{|»hi-ª««#ÑŽUa$` Ã\kG¥™.óÑôìÁÒ~k¶¶¶J3ŠFëêê¨4‡cU˜]zeû lÄ!1Ã{óŠ{ó~„6ðé7¯HMäý"l¬9Œ°KO¢¤=$`/³˜’wíÚ¥(Jyy9²2G 7Øòò¡‘¬ù„~ûF"‘ºººêêêÜÜ\¦o„Û‚·¤--{v T@¯KÖ|B3¥]« ³KO¢\wâ RSUµ¹¹ÙçóiûÕaÔÚM½½½ªªöïß?áÿ5¯Cóy‡“-BƒÒ®Ý|CÐ_‚B²›–/_þ—¿üeõêÕVþØãEb'žtp3€/1oÝnÞXß°½ªªÁ`0 âž9yòäÒ¥Kÿë¿þËâß›„×z>~âIp­ ñöx‡“ ÉÓŒÑÐv¦Ä‰¤a($KV«sÍOúÓ»îº+›WðZÏÇOgÎg_Ökub™ÚëÁÏ0€ó0“‹BSm!S{ ý˜pêËIXγ>“«½½]üI(„z>‰ÔÖÖF"¾Q±choooï#<ÒÛÛË7*{´ÏHYY™øŸíÄ à ÉR²¢(ÒÌkІ æÍ›×ØØÈ;—,[¶lÉ’%O>ù$ï@ìÐ>#ú%bòûýË–-[°`¸q2šÜ•)q"0K1¯{reϼϾܽzöìÙ… F"ÞØ§_b òÁräζìÒ“(•WÔ€+ecÈž×z•ôTBË^?c€ psô½J:9Y¤å°­[·†Ãar-/UÒ™ÈÁký¼lÙ²ªª*ëqb€ Ìe㎎ŽÊÊÊÊÊJ­òD®l¼yóf­ìÍ‘¾Wµ©4mmmOÔ2L5àNfP¶M”ëN\ƒ4ÒÞ7BdápxìØ±«V­š-Kä³×çó¹v¥ÎdÚÆkb 5Ã8õºSñÍ[[[IŒ|fʰ٠ïp¬ŠŸÃíííbž½ GˉՀÏ?ÿüO?ýtРA“'O^¸pá%—\båYHÀÖ9µ¿GWW×àÁƒsssÙ„)”ÒA¨*¬Ðªßzë­6l8uê”v¢ßpà ®§xG²ý=2­ç;ßyõÕW("—+|nBU˜­Wµÿ`òŒ–7Å=ûì³Ó¦MKûgÉ«©©a!€ ë‰Ãáðš5kR¯ë}å•W.»ì21h²ÐÒÒRTTÔÖÖÆ;çµµµéW“‹Ï|ƒmŽjjj’e"F2OÀÝÝÝùùùéãÀFYÓß~¼¾¾>''gýúõÉþ8‰Œ7îõ×_w1@Î ·gyƒˆLE£Ñ`0¸sçÎ,o>ï2Á7ëÐzUQF½Ê¼òÚÝÝ=räÈÓ§O§þ3Ô€œ•öîkÖ¬©««{ûí·]L˜È&‘¥IX¿þõ¯_{íµßÿþ÷iâ@`L«·)ŠR^^ž““ÓÒÒÒ·oßË.»Œw\ÜP¹ƒž=†ÃÍ;œ4â×µ#"TÀ Ó“³Ô“'OÞ°aCWWWooï_ÿú×%K– 4¨µµ5íÄÃ0ˆyTÄÆ#Œž)¢eBU‰t ÅÃ-æ`—ž~ݦ¦¦oûÛÅÅŹ¹¹C‡ýÞ÷¾·wï^Kq0h¡¬f8üæ³ÁÆ#Œž‚œ ™2— q’h¯DÚC±*,æ “€mË´…Œ²©yކþŸöaô”ìs6€˜¡C!ÔðnÖrF8N\>b#«’}ÎŽ%¹Œ6÷6ÈÊp’XY¹$7}‡È÷ƒ•ÐñêRXòFEIx9«åŒ†††ÔÉ5á#``ñ2ZßÛ"œýàš´+—hq^¤GßE‚àx*Jž€cÂ,C‚´ÒÖž‘’…ÕÜÜÚ©ØÙÙ)Óé'ÊØŠRzúmÿ ·5o‹û¶:î¾ûî›2eÊí·ßnû¤¿Ë½iwئ…Ö}yNÞ Ú"$`/3¨DÞ™ <þkÉãÍçȵžg—žpÆÉF­ý~üZ÷÷mh:xóÐHÖüH$R[[‰Dx’^(ª¨¨hooçˆ}HÀ "sJîè訬¬¬¬¬ÔÊ?(§FŒÑ·oß#Fvoä÷û—-[¶`Ái*s‘¬ù´ŠÜT ØI1šÜ•)q"1v–Çb§Ôêëëóóóãóüüü@ ÀîíäÞÁ1-™Ö ڬõng—žD©¼¢ AÙ8µ‘#Gîß¿ßðÈ|àÂ[ã@ *,Ô€¾eãÔ>lxäСCî¼µþ@x³R SU˜Ð$j0H"mÙ˜Ðì’ì 6ÌðÈ…^èÎ[›—···“ûf̆LUaB…‡ Òòûý[¶lyýõ×µ«1Z³K²ôØc 0 þÏüüüŸÿüçî‡a؃Åý¸ÈÉÉ©ªª2ŒÇÐEh¢¡P5¢T^QÖÌ[(È]«»îºëöìÙsæÌ™¡C‡.^¼¸ªªŠW$äv{pÝ3бc*jÀÙÊÍͽóÎ;õ߀†M1)Ö’y÷Ýw?øàƒ>ú¨··÷À³¯’¨:à©r€B¹*l8v"Fô¡Š§0x—aÞÝoI³Ÿüä'<òHAAï@óT9@‘¨*Lå3bÞp^PŒ–7eJœHÀ³¢Ñh]]Ë‹ÿ÷ÿ÷ìÙ³¼£HŠÐbS§È±V8ágD@ÎÞ:‰]z¥òŠ0ˆË‹¹ ["µ‡t{ U…úðâf |¾nHu Ëk¿r¼Ö^^œú­€IX|&¡P©Ñ/ÆS™;“%­½eeeÔ+øñŠx…  æÙ4Â~¶ ‰Q’™;“iî-Oåx §(¿‚* ãZNtP¼oc±˜ôCý„Š©ÉhM˜8q¢ÖaV–]0€ ÌŸmÔ‰³çµŸ5¤ÏBË^?£ ¨„{P»_'þÛßþ6}úti¶¶ðÚHÏ- TÒ­Ÿ‘€Æe×…¥K—^pÁ¹¹¹®½#S^»£é:•´EëgQ~1 2ÑK»0ºØÕÕUVV …Ì7A’€Ö™¹¹¹$Æ9í¡^¦¿8Q Ê… ÙÝwß]TTôøã3z}Pù~w ݪ0ÝÈ“A €*ÃŽÓŠ¢¨ª ƒÁ #ªápøàÁƒ=ôPö/%2Š[ígC´j¥u„JÜO$$`¶ÎÒª¬¬¬¬¬t¤•——÷ûßÿ¾¨¨(û—¢‚nr²N´j¥u„nÍýDeàCÐપ677û|>ý%d£vL©ª,X qIX!>êN"x‹'jÀ2#´’R$¾ßA|VN$Ô€dæµe¯Ù#t£xG8;oÀe"íDŠÅb\"DàÏkË^ǽ˜Çš³ó\ …***ÚÛÛy’¯Í¢‘€ÄBh‹8èNY²Èï÷oÙ²åõ×_×O§'Äçó‰\,0/Up‡(•WÔ€ôR—¦ÂáðÎ;¯»î:÷ªÂ¢~h0 ÀÓ Ó¤W®\ùÚk¯mÙ²…w\RI¸“°uêÔ’%K–,YÂ;(¡‘žµ”ÝÖ‰Ÿo„ Š÷v¢ÈžÄ]D®iZI¥¬¬Lä°]èUçðçŸ^]]½víÚ‚‚Ç_’~'ŠìIÜE‚VÍ´Ÿ"‡íB¯:e}Ï=÷\pÁ .üÇ`€=ÜŸ w‘ø…Õ„/£Ä{57772éÕ˜£6nÜxÝu×E"‘ø#ß"Yx555ÎF «h4ª˜ñD\rwQ[[ÛàÁƒC¡ï@¨ª©©I–‰õªÃ×#GŽljjºè¢‹âà € ­‚¥(Jyy9•K"7Éw H¢×ÁŠØçªªª}úôQU•ÅeºÃMÝ¿II‰OG~P)Ñ]*êùJÂ$ « ‰|®j?¥0æ×¸ÈÒ¦M›šššž~ú錞Ew©¨;d- ^XMHðs•Þ:à/Þ  ÑhÔï÷?ñÄßüæ7³|)ù]³D1Wûˆ­§ÔÕÕwÞyÙg_w6ѯ¥&·”ÖŠH$R[[‰Dx’)D2Ì0éëZó©`ãGžÞÔÓÓ³hÑ¢ÇÜ‘WÆS ·”ÖŠ 6Ì›7¯±±‘w ò@$Åbjµ \"‰F£;wîŒF£É1Oë·ñˆ#OI*HéÿþïÿæÏŸïìkʽÇ6­["‘ˆL«p8\[[K«9žŸìÒ“Ì Ø¢Ì+m"4Ÿ 6qä)VB•é‹ÜÓÆKiÁ 8½´ù5áeeÚÔ(ˆ´¡â¢l@¾1öÀk„ú²B6ÒO8ޤ´ùUî–õ‹æÖÖÖx§ u–ƒûâ§ Îù:„V‹´/«ºº:özNvuÛÐÐÏ1rçW’]4·¶¶Æ; ãØ Á¥°|"TJK+ÖÕÕ r<—€ÓN†ŠÏ˜@ÒÍ”>1ÛÇ)I9)òý *¥Y!Î!`—€…ØþBÛlS» Ãíš±^Þæ~¦ußlÈ·™L»—à‹ÔÉ7âèèèPE¿ðK[°è÷ûµî=Œ˜ûÙp ”®QŽ=ðSrùË_´O„ûô‡‹Ñ52m­}Àc±­#+ó©ÈèÊ:#ÑhTQ† -CõcÔŽ»é¦›V­ZÅ; ‹ ö¹M‹Ü‘å0»D)DŽqÚˆl0TßQ6vÖo¼1zôèÞÞ^Þ *üqŠ‘Ž ×î§"»ô$D XÁÍÈBÙØA±Xìꫯ~à¾óïðŽåp4AOEÉkÀ@—Ųq0 ƒrVqœóꫯªª:cÆ Þ|UaÉ:ÐÝü~ÿ¦M›zzz¤é| gNÉ"ßm[(•••BM6ÔMoí’ŸD(ª¨¨hooçˆ3Ý­!''§_¿~·Þz«Lg`.ï@~~¿Ë–->Ÿ/~!%ͺgååå 6ŒwIiWÃeee»víòòáóù|BýHÊÆÌ™3{zzfΜÉ;KÌ£kÔ‰RyE Ø;̵¤dB<^ÆRZB äaþÛ”¬À&¥øáóæÁÒÉËÔ´ÚB+Ú€Ám)æm!‹/~øP–©hµ…V´)ˆ2ð‹!hPtã{ííí^ç$ƒ±2õ­¶¸-»ô$JÚC=Z_ÙPU•zåÛã%|7Ÿ#×z5`ðó0µ¬ƒÒóæÍ{饗xG‘iÆ푬ù„>hô<0Ð eyxïÞ½[¶l¹ùæ›y’ýò$9ŽKF$k>¡…ÎlÍ 4&jµ··Kð}÷àƒ>ôÐCäHV´áŠÎÎNê—#öÈ×|* %ØšC”Ê+jÀ`‘VÎÍÍ­¨¨ =Kk×®]³fÍzï½÷úõëÇ;x§lŸ4ͧÕw¢Å$,€/1ðÈÍ…Ù´iS8jçgG;©aÀ—$ÜqšÖÓo½õVù²¯Bð@8Kš9 „B(T$`„ßï_¶lÙ‚ è„äàñ!ÍïBsŒ …j ÊÀ/† !{†qéH$RWWW]]›‹›Ž¸ŠVÑYªª ž  :ˆ¬CE  c sæÌ©¯¯Ÿ5kïXÀC¥.°5`€ŒÍœ9sõêÕÚ­ÖèV‰$àµÎ×&(Äb1 Z­ªj0 ƒâ7„P¨qHÀ ­ÜÜÜ;ï¼S›‹+MeŽ"B{;8ˆnaR¯£££²²²²²Rü† 5µ1ð„øÌ ²²2Ž•¹—_~¹¼¼|ذa¼à…ÊÞ’ãîñ~¿Ë–->ŸOü† 5N”Ê+jÀÀ÷ÊÜÑ£G/½ôÒ–––áÇs €î= L ïÞ{ï0`À¯~õ+Þ@0 Ày‘H¤¶¶6‰¸ð^xùå—úÓŸºð^"óÚ„,…æä 3BŽP¨HÀà]6l˜7o^cc£ ïµtéÒùóç»ð^"“cjRF(N2#tà…*ÊÀ/† Á}‘HdݺusçÎua×â3gÎäääœsÎ9¬ßHpZ=xâĉZUØ ûE«ªÚÜÜìóù ›§ÒB¨ïx¨¨¸7pG(š6mõ½¢À#Pp– »C‚[©Û@¨6™•Vˆ à ¿‘€k$¸•º „j“)PÙV…Do‹2ð‹!h¡Ziìg9šÜÚÚ:uêÔ¦¦¦ñãÇóŽ%{›L xçΫW¯njj:räÈ AƒÆŽ{Ï=÷X¹é)0ˆ Ua=B?#œúð’©ÿÇüÇøñã·nÝzúôé={ö<øàƒ‹/®©©qö]\“MU¸§§‡EH’!Q«sé&ºÕ)1ÆöíÛWXX˜öÏ\ˆÀ†h4ZWW7xðàP(”ÑÏœ9SRRrèÐ!FI£­­mðàÁuuuÑh”w,.iii),,lmmåˆ}ÚQËôCá2Û^vé‰ùÍòòòúôéÃú]ÉÉÉ©ªª3fL¦;¼?ýôÓååå^x!£À¤!È}2\Fýî$n5aûÃ놕ד'Ovtt<ôÐC7ÝtÓÏþó4q  9qâÄ%—\òÇ?þqÔ¨Q¼c!€PYÑ^k/udjÀíÇ]aaá 7ÜPPP°hÑ"ïà>‹ûúþ÷ÿ÷Œ3}-ÒÊŠ>ŸtqÔ:BeÔÔ¨/aãd’€µÑíO>ù¤¾¾þÏþó’%K¬<Ë—’7Åâ¾¾C† Y¸p¡kQIƒÄÚM§HÐX*M°ç¢E‹¦!v1ø}óÍ7çÎûÑG¥‰CÐ@ûú ËSc³4–J²Œ“Ì:`³S§N <8íz $`±°ÞŽ;.¹äÖï@‹Ã xÚ´i¯¾úêÑ£GÃáð‘#GÖ®]ûýïÿ¿ø…³ï ŽH$R[[‰Dx"a§Ì°@½±§%r'f?;œ€ò“ŸÔÕÕ;vÀ€“&Mzíµ×o¾ùfgß@6l˜7o^cc#ï@äA`#çP™Ç”ŒÅi‰Ü‰ÙÏ¢T^Q¢"‘ȺuëæÎ‹Í¢¢ªj X°`nLeS2T¦%fÓÏ„'aY„ ¤©ªºdÉ’ÿøÇýû÷ç‹ ¨§% áIX^^{íµ¼¼<ëLI³U…EÔgˆYa5-N$`€lõöö.Z´èñÇïìì°ÎD—˜u;¨Ï$ r¤B¡PEEE{{;ï@þùͤ÷›ßüfܸq7Þx£ªª›7o.++Ûµkn!œ=;þ;bæÌ™===3gÎäˆM„Ž”P·Á¥òŠ0¥ªêرc7lØPVV¦= …¦M›æ… D´Ø›[€0€ rrrB¡P<û*ÿ¼ЮƒÅ©6Ñ%ZÝŽê-?þœœœ+®¸¢¹¹Y ‘€²uÎ9çèÿ©M B=Ø)Tê‹Ù£ÞRñ ¤(¿‚É`!S¼Ó“Ô[J"~Ab0¨P%~aŒê+e-¢~¶ˆ_œ ‘€Ømé!QÔWÊZ$T…Òñ‹$ÖØqüøñóÎ;Ïâ µô(ê+e-"´ 6!ñ‹¤(•WÔ€·ÞzkþüùVþ˜ÄÌH“°rÍ5×ÌŸ?Ö¬Y¼æ0 @ÿûßmŒ…Š3õƒ.ô!éf’^ ‘€2F.\øË_þÒÆ>ÏâLý Ë#}Hº™$f ÒÃHÀèééùá8uêTÏgê]éCêÍÖ¡ =,Jå5`€8UUwïÞMñžZòÍ:D @‚ÔŸˆòHï‘ÈMH´$#‰„ à6ºß­"¤zçñr“!qŒDR”_ Aƒw´¶¶N:µ©©iüøñ¼c¡G¾΄H7“DðÖƒÄ:`yøz jÀòÐn‹Å¸— è¡€Çé6’ž{HÀiìÝ»÷‰'žpüeE(AÑå…Þ#ÝFÁsR”_ Aƒ°n¿ýök¯½vÁ‚ξ,¢³á…Þ#ÝFÁ[ 5`>š››g̘ñþûïŸsÎ9¼cPàã§?ýéÏ~ö3FÙ—{ Š.UUƒÁ`0”»÷HŸ!$‚D"µµµ‘H„Ë»#$õþûïÿío«®®fôúÜKPtuttTVVVVVÊÝ{¤ÏÁoذaÞ¼y\Þ]”_ Aƒ˜TUe· ‰:™˜TUmnnöù|W^y¥Ä½Gú !|$Y·nÝܹsS|ÌQpI xä‘GŽ92tèÐÅ‹WUUñŽxBpCCCüyóΜ9£ý3??ÿ¹çž›={6ߨ€#LÂpÃÂ… ãÙWQ”3gÎÔÔÔ°~SsUÄä…®£ÛF‘ó  à ‡6.¿5i$ªŒY"ÝFñƒG XQ€Aï¾ûîÔ©SßÿýºüÖ¡PhÚ´io¼ñÆå—_îò[@jdjÀÛ·oŸ5kÖàÁƒÏ=÷Ü«®ºjãÆÎ¾>;ÅÅÅ@Àýì«(JYYÙÒ¥KËÊÊÜkêį2f‰tIÏ1H‡ð 7ÜpìØ±7vuu­X±bÑ¢E«W¯vö-¹à‚ ¦L™Âå­ß}÷݇zèÝwßåò_eÌé’žg1G=ðÀªªÆÿÙÑÑQZZj剎GÂÚ‹/¾XRR¢Í•}ñÅy‡´E£Qí78ï@葾ëH7Dðiƒd—žØV^ÿþ÷¿={6í_ÒªcÇ` S6xýõ×/½ôR¦oÁEÚƒÀˆ#úöí;bĈ@ àz€ :† øøñã?üðSO=Åî-x1ïüá‡655iû744Ü}÷Ý ‡Ã¼ûî»ëëëy„ d˜«"&/tÝ6’ˆœgŒ†¶»»»¯¿þúmÛ¶Yü{v‘°0räHC7ßxãC† 0`@¿~ý ÿwäÈ‘¼C¡µµµ <8 ñ„/tÝ6’ˆüðÃÿùŸÿሢªêîÝ»'Mš”“ƒíÙ3#}בn ‰àÓÉ0=9{A=~üø††Ot<¾²Y%|öìÙŋϙ3çÊ+¯,,,>|8£ =®»»»¸¸øàÁƒ¼‰Åˆ”ÊÄ$}בn ‰à9Ö€Nì ÷³>qâDaaaÚ':‰4Nœ8QTTd~ü“O>yì±Ç´«äÑ£G—””`ÿŒÔ×ׇB¡_þò—¼Q {Ö Kú®#Ý@Á§ ’Ì´mHÀ™:~üx xï½÷Þÿý>ø`È!;vìà€l€!h4šð ¸¥¥å©§žÒ.”G5zôè¯|å+‘(• È ýFº$‚çX·S #ÉÆŸ/¼ð©S§öôô¼üòËwÞyç~ô#—+B¡PEEE{{;ï@ˆ!±×–H·‘DðƒåºWÀ|­_¿¾¾¾~ô?•••óÊCZ[[§NÚÔÔ4~üxÞ±PB¢Ä˜%Òm$Q|½ÿþû===¼£0"Q'“ºŽtÅžo„¢\wâ Xýû÷7Üþ9//¯««K„Šr4½ì²Ë–/_>mÚ4Þ±| ÆŸmóBבn£øÁ[‰CÐ@ƒyì¯|å+­­­£G6ÿq²¥SŒÔÖÖ®[·îÍ7ßtí@HÀ@ƒ•}°ãÆŒFG5f̘1cÆTWWëï1嬞žž1cƼôÒKW]u£·)¡ 4Ìž={ÕªUñ}°W­Z•,û*вgÏž-[¶Ü{ï½Ã† kooO6 âäɓٶråʉ' ˜}Iܱ\L^è:Òm$<ç í1)q"¡œ={öÜsÏlø›C‡q‰-2ayd÷lº' ‰ÈUUíééÙ´i“ßïç0È£  `„ wÜqÇœ9s† fø¿^x!—¨’Áù|>‘Ç6A÷$!yGGÇ·¾õ­þýûó:‘DøÅ48+£Q\¨ Ë#½G·™$"·$jÀÃm! {¨d¬ªªêÀ½½½-û’¨ Ë#½Gº™$‚ç$0€ÛTU Zêä6IDATâWÈ„E¢¾˜=ÒÍ$<÷ EøÅ4x‡¶òaùòåUUU"WÈ„E¢¾˜=ÒÍ$ŸâH •)ÖO$Ô€€ù~!!p€IX´‰0ãƒ:ô!õf’ˆ_ ‘€ØÒ>ê¡PˆûŒêD˜5ãêÍ$¿ AŠ2ð‹!h•6'eëÖ­‘HD¦Â˜Ë´ß1>Ÿ¯¼¼\î>¤^C%FA¢ @‰ï#ñY¹q: ¨¤ªêîÝ»¯¸â dßlp¿qºk©MÚC%xqâD`HRuÜoœîÒ' •àʼnS”_ Aƒ”0þìït#é–R >Ó8Qà5`2Ä©0IÀ;I½¥$â-H$`‡…B¡ŠŠŠöövÞÈ@œrkÔ[J"~Ñ‚DpžÏç¼ F…ßïß¼y³&?SŸæMâH•••-]º´¬¬Œw ÿ Jå5`•©( ¬rv‡½~F @húÚRNNŻȉF´r;Ô/©)û À¢Õ–¨£rSwGP_åLåä°Ÿ¿²nkk[½zu}}ýÉ“'­¿8† (m¯«‰'¶µµaØÙ)Tnêîê5‹H$²nݺêêê>}úðŽ%ÛýLið¸qãfΜ9sæÌK/½ ¤‡ê Ôs’§Hÿ ”€¿xéL‚F¢*Àã¤ÿ`€p´¹'Š¢`Ê•ƒ¨Ìèq„%q»aû À&*sOhñT¯JÐXM6H AØ$ýÈžêU K¢ Yé‰!h_"‹-âÀ°Þ—5Oõª%Ñ‹A.Z´(ab»—ÎT,$`‡§§ºLØ*#´—J¬Ç¹hÑ¢„iˆ]l%`Áutt,X°`ùòåâì¤#¯ý²‘£½ÂV DŽ5`«H”»(òÔ¶Š,í¥òqÈ>N¬àC[e1iÒ¤œ ±Bå«Ü)^k/u”&aé ×.±ÑJG¡PHØñ+ xm-µí¥RýD"µµµ‘H„w I9Ÿ€].b0¢•Ž|>Ÿøw9¥Käú ´—P{Æ óæÍklläHR¢ übDƒqBx­“%h/¡¶v—ˆ¹sçfY?"YÎ0ˆ_€Ô$ø ‘)J5`ŠPñuªªÁ`0 Š_Dt•ºi „ ØTz @QPñuQGGGeeeee¥§~èHPý%Ô*¡Š2ð‹!hà˃k¼¨ªÚÜÜìóùÄ¿rŠvAæóùÊËËé6™ÐgÄÙPQp*¾àéoY/7Ô€œGeœ ¨óûý(m€0xN|‚¾ÝDe^Œ³M\Jб#ª‚ ÞÿdÆ/|IÜIM^ža.Ç( ¡V UA ¼#^‡»ì²Ë¨Ì%‘ƒÖó[·nD"^ëvB—ÒæILœ8±­­MðV° “°²Eý«.ô<]„¦± “°2fØŠÎî“£j­Jd2ªªöôôlÚ´Iüy„BÕCi‰¿»ôhäœBèv©utt|ë[ßêß¿¿ø?ž…ª'ÊÀ/† ÁqNmŶysð™Ðí R#tø˜†Š0@ØUC8„òX0@bæÅE¼#ò4iF_mˆŸŠÌ6 TÃ&ª0dλØUC ,X¾|¹„L? µ…P¨f¢ üb2‚E½bòòè«Lm'ÔBE àK}A‚¾jÀàQñ¡fC¥G‚2›TU ƒÁ`h.{†åæ¤Ñ*áKÐóHÀ ´x‡t¥Gb••••••ž=42-7§U— çEøÅ4èÅÇÁEцšc±Æœ¤ªjss³Ïçó쀄LËÍiUv\ëyÔ€Á[í@ rC™™ç}Ðú%Ã$,PŠ=40ÇJXÌ|ÉéÍ ȵ…\À) ƒÛ°‡iÌ|ÉžLSɵ…\À)ˆ2ð‹!h‰F˜±‡i2Í9²Ð ê­Ð~ û|¾òòr*mq¿>…0f˜Q…ú.Ð%Ùô@ÉšÃ0п{yy9fTÉ[#iä»ö¥ÕœH$RWWW]]››ëò[cÊ0!"á¶ ˜QE­­‘˜ÒJ{öì‘ãd&×)'ˆr݉+`¢ÌÃËß–A2ÒÜ[>{’ äkÇÉ’A«ªÚ§OŸh4êñ1. ’ä>Æ_ŒÀƒäCЊ¢èǸ°Ã;wÚØr$1,¹3¬Àð²dpÓ =ùFàÉ-¢%pfbˆF£Š¢¨ª¤­­­¨¨¨¨¨( i°sçÎh4Ê/FOÐ÷s[[ÛàÁƒ¬…øßhŸ~a+Ñh´®®ÎpĽLû¬[·NŽžâñÕ߀Ù%J!pÌÔÂh4 wîÜ©÷æc€”ìC7êûYK´ñ+`®a‚K$Ë7Ù“ìç&Åã+Â!`—€…¨+éÙÍ…(óò5”jÒ2wVè‚N¹áøÚ#y 8-s!ʼy¡y2Cñ@îZ‚¹uæGÌ]dèFü'€Ü_¹¿®ãh$`3)Yûg{{{ü¸ZIZ‚Hj|ˆØœ\Ó¦[…ÔXÀ ¤ìa¿ÖR…Bííí¼aŒÑÐv¦XDb(hÿlmm—9Í¥eÃ#æJ³GyJ²P㓤̕j' ¸úúúœœœõë×óDRvˆó˜2ÕÒÒRTTÔÖÖÆ;X̃“°ØÑ§¥´I+m†NýHMM½I8é,a¨.O’ÒZ$/7*×ÖÖ’˜ÌèÎar¹CX7Jû)‡]û–pªEB]?PJÀ~øáí·ß^PPPPPpûí·ôÑG–âæZ\ÏÊeeŠG´FÙx¡N>=1S–¼Ó(Òk¼s˜äþµ/SFžÜuúôéË/¿üÎ;ï¼÷Þ{EyöÙg_xá…ööö¤~¢”[QÊ×(ùZ¤x¦QÚž , zëF‡‰ïê vç¯{-dÓ"aW²™ýüóÏ_uÕU?ü°¶ÆÃ?|å•W®^½ÚÙw€Lutt,X°`ùòåúYx'ßFWqäîµ $š7*=‡ðï~÷»êêjý#ÕÕÕ¯¾úª³ïiæ¾jsàqO=‰”˜—<NUÕžžžM›6Š9{_YŸþùçŸ~ü‘îîîñãÇwuu¥‰ÃÀÔÉ×"EÞFµµµÉt¯u‡‰ûÆò{¶[dÞ[Id† Oœ8qÞyçé)..>~ü¸³ïÉh¾ Ák wè$[Oq½¯òϰËÊÊÄ<]ã›F°xñ\/j4=ù%_‹IÕ§OÞ!8LÊÃ$_£äk‘¢(,.ÍNÀEEEÇ×Aú駆kâ„$‡à…û°ªà$î¢M½®®NÿH]]Ý­·Þêì»Pçðä®S§Nùýþ»îºëž{îQåÙgŸ]»vmGGG~~¾ƒï@ÃWÀÛ¶mÛ½{÷E]tÑEµ´´455!ûȶ €±¶Üð$`€8@à €$`DIÀ}ôÑŒ38pàÀ3f:tˆwDhkk»÷Þ{ …Ýe-#Û·oŸ5kÖàÁƒÏ=÷Ü«®ºjãÆ¼#rÀÎ;ïºë®#FôíÛ÷‚ .¸é¦›yå˜îîîQ£FÉqúùLxGäUUW¬X1nܸþýû_zé¥/½ôb>F>Ÿ¯oß¾¼ãÊJ4]¹råĉ Ï=÷Ü &¬\¹2:óê1œ:uª´´tñâÅÇ?~üøâÅ‹GuæÌÞqekìØ±555{ö줟³¤(Ê׿þõ?þñgΜinnöûýÏ?ÿ<ï ²5iÒ¤gžyfïÞ½gÏžýôÓOÿûß_~ùå>ú(︠ªê7¾ñúúziN?Þ!8ïî»ï¾ë®»öíÛwöìÙ–––›o¾™wD{òÉ'gÏžÍ;ЬÜÿýåååo¿ýögŸ}vòäÉ·ÞzëŠ+®¸ÿþûyq!ÎéåË—WUU驪ªzúé§yÅã89¾;xàUUãÿìèè(--å#ûöí+,,ä…–-[ö½ï}/&Ëé'G+ô¶mÛ6}útÞQ0F/¾øâææfÞd¥  àÀúG8PPPàÈ‹ 1ý»ßý®ººZÿHuuõ«¯¾Ê+Hè—¿ü¥~ÜoäÈ‘rT òòò$¸“n{{ûóÏ?¿råJÞ@RÏ=÷Üý÷ßÏ; †6oÞ|þùçOš4‰w Yéß¿¿ùÁsÎ9Ç‘"ÿùÏ6Ümñ²Ë.ûË_þÂ+°âõ×_¿ôÒKyGᤓ'OjuníV"t}þùçÕÕÕk×®-((à‹“¾öµ¯ååå 2¤ªªjïÞ½¼ÃÉV0<}úô 7Ü0`À€‚‚‚›nºéOúï œôÔSOÍŸ?ŸwÙºï¾ûî¸ãŽwÞyçÔ©S§NÚ¾}ûw¿ûÝþð‡Î¼º#×ÑYÊËËëííÕ?ÒÛÛÛ·o_^ñ8N~vЧŸ~:f̘íÛ·óÄúOÄÔ©S#‘òïÿþï?ûÙÏâÿ”ãô»õÖ[·oßþùçŸ:tèÉ'ŸüêW¿ …x••~ýú×ÖÖ=zôèÑ£kÖ¬)..~çwxÇåŒÎÎÎaÆ…ÃaÞdKUÕÛn»MÿqÛm·é‹qÙⓉLKww÷õ×_¿mÛ6Þ8ì“O>©¯¯¿à‚ {ì1ޱطqãÆë®»NÿB²ÓOóì³ÏN›6wYÉËË[»v­þ‘5kÖÜxãœÂqØ÷¿ÿý_üâ¼£pÀÒ¥K‡þÊ+¯hs„_yå•áÇÿêW¿räÅ…ød~õ«_íîîÖ?ÒÕÕõµ¯}W<Ž“éððáÃ~¿ÿøï@XÙ¶mÛ°aÃxGa_iiéÁƒõÈtúÅuwwçççóŽ"+_ûÚ׎;¦äèÑ£ àƒŽ;vÞyç}úé§¼q@IIÉ›o¾©äÍ7ß1b„#/.D xܸqúG:;;ÇŽË+Hæã?¾ùæ›—/_>eÊÞ±°rÅW=z”wöíß¿¿¤¤Ä°^Vš…³q1ú÷Q7nïXYµjÕw¾óóÎ;w 8räÈW\¡äŠ+®8räˆ#/.Dž>}z]]þ‘ººº[o½•W<ÐÑ£G+**üñÉ“'óŽ…¡;v\rÉ%¼£°Ïü+;þ ïМôÛßþöÚk¯åEV¾ýíooÙ²EÿÈæÍ›©ÏV%ÿæ7¿‘`ú•føðá­­­úG𛛇 æÌ«;r¥Ï>ûlĈK–,‰oÄQZZzúôiÞq9F~ÎÒøñãxGá°o|ã7nüä“Oz{{>\[[;tèÐ-[¶ðŽËIœ~“'OÞ°aCWWWooï_ÿú×%K– 4¨µµ•w\Yùüóϯ¹æš^xáØ±cÇŽ[»vmqq±S+êëë§NÊ; ǬX±â¢‹.Ú´iÓ‰'´ð…^øÌ3Ï8òâ¢|28pÛm·ÜvÛm†"QÂþâ±'asNœ8Á;®¬lÛ¶íöÛo/..ÎÍÍ2dÈŒ3vîÜÉ;(‡‘>ë4MMMßþö·µÃ4tèÐï}ï{{÷îå”>þøãªªª¢¢¢~ýú]}õÕrL­(//ß¼y3ï(œôÛßþöª«®*,,,,,,//饗œze_L®)„¨x 0HÀ p€ À0HÀ p€ À0HÀ pðÿY"aPsu{IIEND®B`‚gsl-2.7.1/doc/images/nlfit2b.png0000644016036000116100000011601113765510544013320 00000000000000‰PNG  IHDR X'bKGDÿÿÿ ½§“ IDATxœìÝy@çÝðga9U@ÑÈ®Š€`/L<ðNb‚9d1ic“6×›¶I¡¯i®Úæjxc“ôLb›& I‰±¨DÔEQA•]dåÞ÷M7ÃìÁ²ÌìÌüöûùKgg—çëlâÏgžù=*‹ÅÂ@8~R€XC 0XC 0XC 0XC 0XC 0XC 0µÔøŽJ¥²?ÐÑÑáýÁ „\ ,‹ÅÂ;²nݺC‡I2€PÙW6rÐÓÓ3qâÄO?ýtÆŒR dºëË/¿ŒŽŽFuJ$Ókݺu¿øÅ/¤€'äx‹Ð`0Ü~ûí•••jußKÄÔjuww·FôˆTÉe‘;×ÿøÇÇÜêŠ1ÖÝÝ-Ãq€T*9¾A/£Š^"†P A/£Š^"椉0Ÿ,·?¬¦¦¦I“&>}zذaîœOõz E/£Š^"†P A/£Š^"&f(Ù­ÁúÛßþ–žžîfu CòªF;;;Ç·}ûöÄÄD7ß‚‚Zè%bCÑKÄJ!è%bCÑKÄ|g+///11Ñýê @†äU`ýñDwP:ÅO÷aÆRè%bCÑKÄJ!è%bCÑKÄ|ç!Xýæ7¿‘z£—ˆQ E/C(… —ˆQ ÕÖÖ&õ”–­X±Bê!Œ^"F1½D ¡‚^"F1TPPÔCPXr¤Õj¥‚Àè%bCÑKÄJ!è%bDCû?•ä-að¬ÁÇTÁÁÁãÇ_µj•^¯wóío¿ý¶x;Ƹf6›óòòrrròòòÌf³$c‰â§0ƒ>Îay¤R©^|ñÅgŸ}¶Ï·/^¼¸  Àû™êõú•+WVWW[«ÑhrssSRR¼9Ì`ù–¢¢"©‡ 0z‰ÅPô1„Rz‰˜¡,‹Åbijj***Z¹r¥Åbyî¹ç¶mÛf}µ®®nõêÕ111ÁÁÁæg?ûYKK cL¥R°ÿNƒ¹8SX&“)##ÃV]1Æjjj222L&“à?KŠŸþÁ ø8kaÄûÛð©§žZ·nݲe˶lÙÂ[¸páÞ½{»ººl'<øàƒï½÷oöËb±8;SØ1ççç/_¾ÜþøæÍ›ÓÒÒ„ýY.` úÁº3ÊÁƒ­¿ÝµkWgg§Åbéîî¶.ÏÊÏÏgœ²Ì:æâLa•——÷ë¸â À èºë®cŒFëo[ZZüñë®»N­VÏš5‹1ÖØØèðîŸ9qqqý:®8(°äˆÞrz‰ÅPô1„Rz‰˜ BUUU1Æ"##­¿}ê©§þò—¿ÔÕÕY,×Ï ºæ@¤¦¦Ú· Óh4©©©"ýD/Sü&¬Áçp Ö½÷Þ»qãÆôôôÜÜ\ÆXxx¸Édú÷¿ÿ}Ûm·µ··‡……ÙÞÂ{»‹3…U\\¬Óéjjj¬¿Õjµ7n´Î™yxU„ZŒI˜Íæ²²²×^{mÓ¦M*•ê©§žâ¾m4׬Ycý­Ñh ·þº¸¸xÊ”)!!!}ž)””””²²²¯¾úêܹscÆŒY¶lYhh¨°?BBŠŸþÁ ø8g}°^ýõÌÌLëo—-[¶uëVë¯CBB&MštôèÑ¡C‡^¾|yäÈ‘/^´¾d±X\œ)~oÃS„¾Å¶&‘ z‰ÅPô1„Rz‰˜t¡üüüFŒqÏ=÷|ýõ×¶êŠ1öÖ[oÍ;7$$$))ióæÍ¯½öšF£‰‰‰aŒ½þúëÑÑÑAAAS§Nu}&¸OñÓ?$g° Crr²Ô£½DŒb(z‰B)½DŒh(zÄ«"_,°À p‹@1P` –IÞžNpô1Š¡è%b¥ô1¢¡À}Š_À„5XýÕÕÕó̯¾bŒýá;\Ÿù¿O}éÎi …F£>ÊZâ0Æ~‘5wôèïº}^¨5­ËþÚúkªÕ¢¡ÀP†’ãõ¶«ÄP/í`lÎT\ª¬¸$íÆOˆŒ)íxP`ɽî)ô1Š¡è%b¥ô1¡C©U*f8VwËm“¬GJŽ×…„twõtttÛN«©nþÏ–²sçš-‹F¾ô¶øñ±Ãl¯¨Þµ³¢ÅÔ6:&üŽå‰¼qühÝ††«aaA‹—ÆM›ángÑÊŠK;¶•,ß@-aqr+°°È]Žì7W:z‰ÅPô1„Rz‰˜Ð¡ººz&Ä o¸xµáâUÆØ¥&s}]Ëĸá]]=¶sê.˜þúöÓåMí]Ý•g.¿ó}Mu³õÕò²ÆÏ6¿rÙÜÕÕs®êÊëq?ÿtyÓÇ}S{ÞØÙÑ}©É¼é“£g¤ž”R:Xr$ø†š’£—ˆQ E/C(… —ˆ ª»»'>acÌp¬Ž1Vb¨cŒÅMŠêéù~öÎí§;;»“’G>÷Û%¿yqé”Fuw÷ì.¨°¾ZôõYÆØ”Fý楥Ïýv‰FÁýüÂÝg,¶ú¡¯¼¾ì§[,lß×g¿Â-BˆOŒV©˜áxÝ¢¥K õ*•*1)šmüþ„ó5FÆØíËÂcËîH8~´îB­Éúê… &ÆØm·' È»óžÉe/7ØÞkèúà½ï§µ¬çƒÇ0ƒ aaAÚ1C/ÔšjÏ««šÇ:xp÷“ñc,<"ø»óÃcÆæ6ëo[¯v0Æ"†~÷jxD÷½ím]¼×ÒÒ.|_‚,9***š3gŽÔ£½DŒb(z‰B)½DLœPISFž«º²%¿Ôb±$MÅ{5$$ðêÕö+W®EE bŒ]¹lfŒ…„X_4(Àdj76· ‹ eŒ56\å¾78$ÀÜÚñ»Wo îwa0~BäçY"¡Œ—Ù w†Kžèý†^"F1½D ¡‚^"&N¨ä)£¶l.­(obŒ%MÉ{uâ¤áß~SûU~izÆ”îË–üRÆXlìw•ÇÈQa&Sã–üÒ{Ò“;»ºó¿8É}¯F~ª¬qwAÅâ%ýû5ªXùµHXÊ0,2tÔuauL1šðˆÞ÷øcKo+9^ÂPâ¿-²ý-hýõM³Ç”Ÿj4«³.“·ÝI´X˜JÅæÎª¬q÷ΊÝ;+cjµ_ÂäèûWOóR0а @1’¯ÅK¶»?È‹>èÑ'nš0qx@ ` ÿÄIQ=qóÈQC¬¯NN¹,-að µÚoÜøaþtf@€?c¬»»‡17)ꇫ¦Fâï¯ ¸qÚè:jɼLñù‘Ü‹Þrz‰ÅPô1„Rz‰ÑPôˆWE(¾:!Y`€ˆWEà!€ÀP` –F©‡ 0z‰ÅPô1„Rz‰ÅPô‰ –UWWK=ÑKÄ(†¢—ˆ!”BÐKÄ(†¢—HTŠ_!ŽEîà,rP XC%GEEERA`ô1Š¡è%b¥ô1Š¡è%•â0a xk°€ÀP`É‘Á`z£—ˆQ E/C(… —ˆQ E/‘¨P`É‘V«•z£—ˆQ E/C(… —ˆQ E/‘¨¿B‹ÜÀ3Xä (°†KŽè5s£—ˆQ E/C(… —ˆQ E/‘¨¿€ k°À3Xƒ j©¢3›Í_}õÕ¹sçÆŒ³lÙ²ÐÐP©G@f°äˆÞ}nz‰˜rBéõú„„N—••¥Óéâãã‹‹‹ž©”Dý‚PŠ@/£Š^"Q)~Ö`¸`2™’’’jjj¸µZ­Á` “jT25Xà‰ÂÂB^uÅ«®®.,,”d<>eåååý:‚@%GF£Qê!Œ^"¦PqqqîWD¢þB(E —ˆQ E/‘¨P`ÉQuuµÔC½DL!¡RSSí÷gÕh4©©©ö'+"Q!”"ÐKÄ(†¢—HTŠ_!ŽEî®ët:ÛJ,­V»qãÆY³fI;*9¯ŠQuÒÓÓó§?ýé¯ýë™3g&L˜ðüóϯ\¹²Ïw¡Àèú`8äÖ£>ÚÝÝýôÓOk4ƒÁðüóÏõÕW}¾ x†~›†Ý»w×ÖÖ¾óÎ;±±±Ó¦Ms§º¢Š^37z‰ÅPô1„Rz‰ÅPô‰J.Ó?÷ÝwßêÕ«o¹å–þ¾3Xàú3X¸zõjjjjhhè!C/^¼oß>©à ¹Xõõõ<òÈêÕ«Ï;WYYùƒüàÎ;ïts6RåÈÚµk¹o7 ÜÜ—¸¿6ƒÁáKø|‚/|‚ÙlÎËËËÉÉy饗Ìf³BSàð ø|ïÖ®]ë°Z`¢‘ËýµÀÀÀ¿ÿýï«W¯¶Y¿~ý† vïÞíú$o †ääd©G!$z‰ÅPüñ3Ï7½DLù¡ yÕ“G_[7ù¼¼<[7y)ý29D/½DŒb(z‰D¥øéÌ`x&'''++Ëþxvvvff¦÷Çce×’@7y-Ì`€ÀdØ—Ád2eddت+ÆXMMMFF†Éd’jHžAà£RSSµZ-ï ´}d{× ¿P`Éwópè%bʶiÓ&Fc;³iÓ& W¸‹ÑM^é—É!z¡è%bCÑK$*XrĽEB½DŒD¨”””²²²ÜÜÜìììÜÜÜÏ?ÿ\Ú®Wbܵ$p™ìÑ E/£Š^"Q)~…8¹a2™’““yÿ×h4%%%èbÀ"w Ïþ®¥V«•ö®%€g?ýƒ, ‰»ƒ¯uT÷åìàe˜Áò-ôš¹ÑKÄÄ ¥×ët:]VV–N§‹/..égqÉä2…††¦§§gff¦§§¼º’I(aÑ E/£Š^"Q)~ú3X@ v°ðÌ`ø ô‚ €¼ˆÑ ¼ – ©‡ 0z‰˜h¡$ÜÁ—I)è…¢—ˆQ E/‘¨¿€‰ä,£Ñ.õ(„D/-”„½ p™”‚^(z‰ÅPô11«ÅW'$ ,ðqÅÅÅ:ζK«ÕnܸQÚë$¡Àr Pbk5räHÆX}}}Ÿ½ Ð5 ÀcâUj1>< ×ëW®\i»9¨ÑhrssSRR„}‹PPظ€EîrD¯™½DLèP&“)##ƒ»ôª¦¦&##Ãd2 ø×ÜO$U+Tà»§ô1Š¡è%•âï¯á!ПŸ¿|ùrûã›7oNKKê-‚@+T Fˆó ý•T³Ð  O(°dÁƒöWRuÌB+T€>¡À’#z÷¹é%bB‡JMMÕjµ¼ƒ&55UÀ·¸æf" [¡zß=E —ˆQ E/‘¨¿€ k°€ Ú_IÒ1KÂV¨ÂB,§P`%ô>¤]Z¡ (°œB ôÁP`9E²À¢·ß½DŒb(z‰B)½DŒb(z‰Ú4øÞêè%bCÑKÄJ!è%bCÑK$*ÅOÿœÁ/À €b À ,9¢×Ì^"F1”;‰Ìfs^^^NNN^^žÙlö¨ˆÞebCÑKÄ(†¢—HTŠ_À„5X^£×ëW®\i[èªÑhrssSRR¤€ÇЦÁ)XÞa2™’’’xÛTHï21Š¡è%bCÑK$*ÅOÿ` @999YYYödz³³333½?` äE¡x‡â§0ƒ ‡j4š’’¬Á¥À –o¡wŸ›^"F1T¿………mÚ´I£ÑØŽhµÚM›6É­º¢w™ÅPô1Š¡è%•â§0ƒ !ÛC…èƒJ„6 N¡ÀÊ&ðâUj1>”K¯×¯\¹Ò¶¸ íC< øé’3XF£1<<\êQ‰^"¦ØP.f§ŒF£J¥JJJ²õj·RtûP…^&×è…¢—ˆQ E/à –¯©®®NNN–zB¢—ˆ¹JV÷ÚÌfóºuë^ýõææfëÞìTuuuUU¯ºbÿmš––æÎ°Ï+È‚Çâ³ß=e¡—ˆQ E/‘¸, G PuàÀîæóF¯×K8˜˜˜ûÿhµZ£Ñh;-;;Ûáÿ(²³³ÝùöyùCÕŸ$P"^¡øûk$o&“I>÷ÚÆfóæÍ¶Ù©üüüåË—»>Çýc±Xjkk¹ûû‡ «?I }°¦°°ÐÙ½6™ Ʀ¼¼ÜöëÔÔTî\‘ULLLsssNNN^^žÙlvÿGœ?žW]±þÿ!ÈêOÀM(°äˆ^37z‰X_¡¸U‹;ÇEåú‡Ú6·)**²oÝÙÙ¹jÕª¬¬,N_\\Üß!ÆÉn~ˆ~÷”ˆ^"F1½D¢Â"w9š3gŽÔC½D¬¯P²ÚªÏÅÕh4©©©Ö_[¥¤¤”••YW”1â™gž9þ¼íüšššŒŒ ûÛsýÊ%ÈÉn~ˆ~÷”ˆ^"F1½D¢Rü&¬Áy’ÕV}ˉ‰ÉÍÍ5k–³7º¿$Ëá=z´J¥âÖg¬ÿ²ú“bЦ@a¬÷Út:mýV«Ý¸qcXX˜÷{7ð£VNˆš¡ûñ¤¸iG·ì6›;ÚÛºzz,þ!!êÐÀ¡CC†E†–œh=¡¡±ª§§‹ûö·çœåU©Tÿ<¼gàeŠŸþ!9ƒe0ˆõ¡—ˆ¹ʾ–òfŸtÞO7Û>Ë-¬¿ÐÑÕ9¨§§ŸÓÕÕQ]s¬¢ò`EåÁÖÖËÌùC…2ìƒå³ß=e¡—ˆQ E/Ã^„.,°èuË¥—ˆyÊ›l•œZ˜0)uúÔ;¢†à+KϹêcõ Çÿ½ùaÃ"©¸ðÝSz‰ÅPô1)°T*ïˆ;c#Y`Uw™ê/k%w©É4mê×'Ý"põ6xHÐì9coš=&tP °Ÿ àM¾² ¥ÐæµÞ ;wN·tÅò[‚…ýd««-íÛ¶ž*Ü}&uAìÜÔqAòú? €äð¿EïñBËþ¢ªâ}=Ó§Þ%Ôg:ÓÖÖµmë©}EU·.›4#Ec? -YmïàŒŒî¯y6MGòaQQ±v#ô1B‰Ýq úÜ•¼ÇëëZú<344`|ldŒ6bÔ¨!C‡…¢>p`ÿ̳®]ë2™Ú._2_¼xµæÜ•sUWÚÚºúüÀMøÝéÉ­¸ ³|øÂ… ŸþùøøxwÞ%Ÿ}*..¶ï8࢕›:Ú»¶n)Û_tÎõaaA7L|ý(6ÂÏÏ­ §înËÙÊK'K.=ráêÕvgúù©æ/Œ]rkœ¿¿([D`SBœOXwÞygVVÖŒ3šššòòò^}õÕmÛ¶Ýpà ®ß… Gð›\uLx¤¡áªóS,uõ'Wènºóî¹ßÈëé±”•6ž­8Ýäâ´Q×…ýè©Q#{öS\ðÚ#à;|b³ç/¾øbîܹÁÁÁ111O>ùäÚµkŸ~úiwÞ¨rdíÚµÜ]“ ƒÑh´ý–û÷×F£Ñ`08| Ÿ€OêBCCÓÓÓ—.]ºdÉ[uåñê«ß^·ÏEud>²úoïýì®{æ©T*Søù©'G?üø¬ÔECâF8ûquLoþ_Ññ£u‚ÿI:Ûݹ°°PÑß|>Ÿà…OX»v­Ãj‰F¾Ó?/^Œ½zÕÅ?Ê#:ƒEï>7½DL¡º»{¾øü„~ÿ9g'Œ?lù=“Gv·oM¿­¼œÿïçkŒÎN˜7ü²´g7"=˜ÆólKòË$z¡è%bCÑKÄ|ä!O}}ý„ |³ÀèSëÕŽß?\UyÙ᫃¥Ý•xÃÔÑ¢>Øg±X×lý²¬µµÃá ñ #~°jjp0ÿieÏÚÙcSBœ/Xo¾ùæ–-[¶mÛæú4Xàƒš[ßûûÁKM­_:=fù]‰^kzµ¥=oÓñ“%¾=rÈCÏŒb;2µê"=">‹~µhÑ¢Ç{lΜ9‘‘‘çÏŸÿä“OÞxãmÛ¶M:ÕõQ`¯9wöÊïr8i¤^¡K¾qÚhïªø@õŸ—tu9Øã0,<ø¡‡gŽºî»âi€kÕÑ D¿“û³Ï>ûöÛo?úè£F£1::záÂ…EEE“&M’z\Ò ·ß½DL¢P§Ê?zÿpgG·ýKÑ#‡¬úñ4ëã{žU!I”r“V£ØðÁáKMfÞK&cÛ_ÞÚ¿ú'3ÇÇcngo}DÀýá»§ô1Š¡è%•\ ¬… .\¸PêQÈEuu5±Ëé%bR„:~´î“|ÛÝí`–hrÒÈ{tCPšyºÂ‰ 8Ñu£Ã~öÔÜ?üæt9¿C[[×{/Ž»v¥ùlcc£Ã· ØÎž ß=E —ˆQ E/‘¨ ·ÁGýö§ÿø¶§ÇÁ·}Áâ ·.‹·®g—¼gOå‹ÏOØWeÿRWWÇ¿ò_ª:÷­¿¿ww¯I8¬UIøD,_f6›óòòrrròòòÌfþ]¶’ãõ«+??ÕÝéÉ·Ýo{Z°°°W]1ƪ««5‘œŸŸêîô¤åwO¶o0£VÞöœV3¥»»Ûßßßv\«ÕnÚ´ ÕP"—[„¾ÌõM½“'.~üÑ7öÕ•Zí÷£ÕÓ'Gsz¶ÂIð•ãsæ48pÓ?ñnhªÕw/>ïójëJ׬Y…µê@f°äˆÛ…–z‰˜p¡L&SFF·½SMMMFF†ÉdbŒU½üñ‡Gº»ùÕUPú¡GRxÕs¾’ÉÅ '½^Ÿ Óé²²²t:]|||qq±ýi®çØìÝ8uôý«§©Õüÿɯ¸ë7#¢ÆGEEeff¦§§Ûª«þþwà»§ô1Š¡è%•â0a (”mÒ¨±±ñµ×^³?aóæÍ3gÌÿó[û¯™;y/«úØ,6Âþ]ýíÆéæš-Ηløà½ƒ=vëò[[/Ï_–¢3ÔÙûÕÓ®T\8䛪~tÌÏÏŸw<22ä‰'ç8ðàú}°(q=c½'h¿+00äZKìÕ«üê* Ðÿ¡‡gº¨®c)))eeen®©rgÍ–‹…óî´:mlUUõþ¯¯ðj¬K—®}ðÞ¡Gþç&µÚo€?@n°Kޏ»‚Ó@/sÊõš*æ¤^áòóóϸç7öûpúù©~ôÀ´±ã‡õ96k7NÞ '‡ÜY³5ÀÖ Œ±{VÌÓÝ;Åþø¹ª+¹Ÿ³XøÎøÔwO¹è%bCÑK$*Xr¤Õj¥‚Àè%bÎCõÙ(¡Ï¢aùO9™wP¥;Ž Õ IDATbé+§$$Žðh°N¥¦¦ÚÑh4©©©¶ßz°pÞ^ÊMãÒîJ´?þí7µ»vœäG8äSß=増ˆQ E/‘¨P`ɽ½è%bÎCõ9ã¬hX³fMvvöŸÞú|âøTûWoY?}¦Æ£‘º¶iÓ&æûO¶ïJåN掹©ãSÆÚßþŸò‘#& ò#ìùÔwO¹è%bCÑK$*ůÇ"w›>—»xЯ©±ó¿èí›2Ìœ¥M_éà›PúìƒÕçÂy7;iY,ìã¾9~´Žw<(H=oá‡~rŸ›kó§BrãN£‡õJb ërö^miç}`ܤ¨žéçÇoŒîe.J¨~uXèììþëÛjª›yÇ#‡úÉ£ÓvïÞ.`¿S×P`9E²À***š3gŽÔ£½DÌe(w%ðê•  ¿ýù@UåeÞGEüÄ“³CBĈÀãÙeò Ã‚ÉØöÖº"csïxBâˆÕ?™a¿ÇÎ@øÚwO¡è%bCÑKÄP`¹@²Àú»ùÌ—_œüzO%ï`HhÀOΉŠ4ðÏ;´ì¯iþó›û»ºøHoY6iÑ’‰À ôÁPk£7O>a¨ß[ȯ®üüT?\5Õau%«¦çžuXˆÑD¤¯¼þÓ¿åßñŸò1c†Nˆ.Øø¤€§$vå²yÓ§Çìÿµô¶Iq“¢ìÏï³Ï–—yÜaaêôÑóæçìé±üóßÚ/DPXrDoCMz‰˜@¡º»-tÄ~·Á„ÉÑ Mpø–>ûl¹É~geÏ ¤‰Ã²´„qv}S¯¶´oúÄAÅé|÷^"F1½D¢Rü&¬ÁEÛ’_Z¸ë ïàÐa¡OfÎ u¼°='''++Ëþxvvvff¦›?WØ›ŒýÚýÇdl{ý÷»ÚÛø‹±ÒîJœ›ÊŸßÖ`TqºéëÝü¥Wþþ~?z`ª³êŠ ÑWÝ~3DëMFwVî×î‡|ªŽÿìxcþœŸ©T½&Ô·~Y;aøu£±Ó3(nHãÚµÎMŸ³ÿ—Ó²´x6ÂÅÞW]¨›Œ\îï~h?˜ÃßìÔÊåïêêùç†#Ý @B(°äÈh4J=ÑKÄ*oãñæ+×x“¢çÌë㾘;›Û¸æìù¾ãÇ»ù ²f¿þ“ÚºRÞK ¯ný²l€Ÿïž"ÐKÄ(†¢—HT(°äˆ×œz‰ØÀB}ûM­á»˜°° ݽ׻ÓeÓzK.777;;;77·´´´_[Ê8»™(øFcöëè ¦§§{ËÖìööVÞ«ûöž=]Þ41à»§ô1Š¡è%•âWˆc‘;(ŽÑØö(ä=9¨R±‡Iáõe©›¨;›ù œ›ë蹃IŒ_pû­¿ä14ä—ÿ›Œ£ <ñªÌ`x•ÅÂò>=fß—aμñ¼êJ¯×'$$ètº¬¬,N_\\,È~“Ñ5³Ù¼aÆÛn»Íf]ÜÁœ,Û}ªœÿxó•k_~qRxâ§0ƒÊrø`ͦOŽñFò‹Ì¹jõ÷ÿàñ`ƒ¿þizŒ7qÅãlÿÛ`F[Qf2öj4ªR±N™ï í*À@`Ë·ÐkæF/ó(Ôŋ͟ååô÷W­üÁ Üꊉó ýs¿Lö]æyÊËË.̲ æÞ{WdÜwo!šÅÂò6kkëò`Høî)½DŒb(z‰D…e rDo»rz‰XÿCéõú7ß(ˆ¹îzÞñ…‹'Æhø«Ë=Ûào€~™Ö…\‹%!!Áõ¬¸IQ)7Ñï?Ç=hlnÛ²ù䊌)ý¾{Š@/£Š^"Qa ÀL&Sæ/o_]5xá’‰öç¼›èÀ¹ó ëúoôèÑëÖ­sgaÖíˆãß²<¨¯®Ø…^ƒ À vÞ˜¬ãìééÓâïï 1ÃÀ»‰gKì]ÔZ­öÉ'Ÿ¬­­åwxß3(H­[9ÅÁÂMÇ;:Ðz– ©‡ 0z‰X?C}ûMKh(ÿ>àÁß_¨s<å#öƒ~ÙÙ/¥r6ÕÄã°.Œˆˆøè£JKKUNz|9œ÷š7|æ,þG]¾dÞöÕ)×càÁwOè%bCÑK$*XrdÿW”ÒÑKÄúª¬´¡ÍÌ/Œ.]®Ù_ü©‹)Ÿvõ€-‘ÇKìÖ…[·n½ÿþûCCC…=yò¤Ã»·/O æÜ·÷lMusŸY¸pÿd¥ Š^"F1½D¢R|´i™ëhïzý÷{ŒÍm܃‹åŸ›þ×_Ý*loO¡ääädeeÙÏÎÎÎÌÌìóíÎ@8lpjãpÁ{鉋ï¿{ˆwæ¨ëÂ~òè´mÛ¶ Þc|xUž"ׇòª+ÆØ·Ç¾T˜7n÷–ŸÇ¸ÄÞÚsÁþ¸u~K§Ó9|ÒÐz’×è+arôSG{¤×Ê­º &ÝŠ'·íx×ú[g=â$¤øéÌ`œ©¨ûëÛU*îÁ«W›Rfûë2V¸9ïÒ¯Ž ‚´u/ë·nݺ~ýzûWí;‘¶¶vdÿ~OëÕîÁ®®Žõ=n4]´þVجà;ÐhÔ·ÐkæF/s#”ÅÂ>ýø0¯ºbŒmÝñæ°È7KŸ~=Í7ÀÝul‰D]boßJLLtøªý‚÷AƒïXÎ?Y­\4ÿaÛo]¬óÍïžâÐKÄ(†¢—HTŠŸþÁ ÈÖ‘Ãç?ý˜ß·½¬|oþWps1S¿6Ì|w‘öÒ±ÊÏÏ_¾|¹ýqg{é¼ó×âÓ§yÿµù¥ŠÊï*H7ÿH¸0ƒ 0mm][6—òvt˜w¾Ëz/frÑϳ_Oó ¾»Žý^:êo£¯{Ò“x» 1ÆÍ8@dýµ7[°ô €(vü§¼¥¥w°èÀ?¯¶^æ–®oêõkÃIv×ñXïBF´`Ñ»1sú æÝ¬î@%GôîsÓKÄ\†ºXß²¿è,ï`cSշǾä–}öóì×Ó|ß]ÇË—©¿¾,ž0q„‹w‰ÚÏ“ªoÔ~²á[ÞÁ¹©ãÒîš,Éx@¡°Ù3€ÜÕÖ®åLHẺbηFî_«Òn¸qô}çª*/sî/ªš5{l”]+ïC4y¿àÈÿ× Þ?ƒüýUwÜéxÇ=aéõú•+WÚfï5MnnnJ åÎ*K»3ñíuEÜ?òînËÖüÒUN—n\ßÁ,9¢×ÌÍˉ¸ç±›¸¡ Çê*Ï\æPzjWåÙ‚ÿ\ž>»•ºOY_<6bêôÞÁC=ïB(+”›è…¢—ˆQ E/‘¨¿€ k°€Gð=ûÔÝÝ“ýûÂKM­Üƒmm-ï|ðȈCÅû¹VýÝ5™csÛ^ÝÝÙÑÍ=¨ÑF<ñä:6€ð!€»ßó¸Oû‹Îñª+ÆØ>ý'mm-¢þ\+emAØ/.¶Á¶*-;z̰…w°¦ºùèþb8/Ã, ÆËǵk;ø=™®\©=z|«à?×á²oA(O}.,³Þ½Xß8&&eР¡Ü÷þç«SÉ×R«ñH þ$GƒAê!Ì›‰¼VpXCíÞYaníà½T¸ïÞž.a.oaÙèÑ£_}õU³ÙœššªÕjy'k4šÔÔÔþþù|ñÜYXfªìèl+:ð1ïíW.›÷UY-ŸP¢Š^"F1½D¢B%Gö_*7 Xp¸¦Õjƶ}{«xÇ/Ô•®Ð ûsí Žææægžy&..®´´T¨n¥òùâ9»Ï»}ûvÛomSƒ†;š.ñûì8m6w29…½Pô1Š¡è% ,9¢·7y­=zxxø¶¯Nuvv÷>lÙUø.ca®Ã‚ƒ1V[[›‘‘‘PVV–›››››[ZZ:kÖ,~Š|¾xÎî«þô§?µ=j›´Xz¾Þ÷!ïÌkæÎ=LN¡D/½DŒb(z‰D…5X@wö<®¯k9r˜ß·=iÊÈ7g¿$øÏu±ËºŽ>--màÝJåÃÙ}ÕæææŒŒ 냙֩Jë¬Þ™Êƒ5çK41IÜ“÷í­š=o\xx°7F Ð , Iöè®mý²´§‡ßYôö´ÄÈá3ÿY®rx`‡[<ñØ JëT¥N§³ÎííÙ»þþûrû¾=Cgg÷Îmå+2¦xoÜÿ…[„rD¯™½Dg+/—žlàL¹yLäpQöiq¸°ÌF¨uôò¹LÖâ)""Âá«¶‚Ò:UùòË/GDDÔ_<}ª|ïÌCÅ5ÿÙ*n› IÈçJ …^"F1½D¢R|—N4ï3›ÍÙ¯í¼jêõï“  õšç $Ò-..^±bEm-¿Ã“F£)))µ—©Tòòòt:ýqnUn_Ù¡×=¸êO~~½&擯uÿêi^-(È…^¯_¸@Ç«®c󌯺bŒ¥¤¤”——¿òÊ+Üy‘ÖïËÄÒ¥Kû| ”»üÿJó…ã%;xç—¯;_Ó,ê8ì¡Àè“É´råÊø‰·òŽ8oþx±zhhè¯ýëÚÚÚ?0¨î<Ê[¶¿øÓήvî‹…mÝrJì¡ð À’#z÷¹É$*,,2vDÔ8Þñèë:‚‚¼ôȈuý~fffzzº°OGÊð2YWY¹((yëÏZ[/óífÞ‡œ>ÕXqºIô±z‘ ¯ÔÑKÄ(†¢—HTŠ_À„5XàMÙÙ9e%ƒ‡ Í=h25LHhÎÊú¥T£òe&“)99™û¼aPРGz/0°×ÓØò­5Xõõõ'NTáÿ… ?a“xÕclñ'“&M”d<`1::òÆéQ¼Ójª›Ož¨·ý¶Ïm¤Hv}°,Ë<ð»ßýî?øÔc襻»çâ… Æz-ñ¹t¹ÆØrZð}xÀ}ö}eÔA¯Uí2™z]©í[Ë'G«Tª>·‘8ÙÍ`½ñÆÑÑÑ÷ÝwŸÔ‘’Ñh”z£‘¨ø@µÑØÎ;xêôö?¥ñŸr/o]Z@ ÿø‰ü=Ö]0?ZçÎ6Òò§Ü+å ½DŒb(z‰D%¯ëèÑ£ï¼óΟþô'©"1‡ ¬@¢ÎÎî];+xCõlÛñ1™çø\&+“ÉôÌsMyÇÿóUÙž=Ž·‘.,TR?R2Wʆ^"F1½D¢’QuíÚµU«V½ÿþûC† ‘z,KNN–z#H¿ÿœÉØÆ;˜q_Ê AÂïr(—ɪ°°ðܹªýúOxÇ/5™­wøem7DæJÙÐKÄ(†¢—HT2*°~ùË_êt:&Tެ]»–û@©Á`àÎmr_âþÚh4 ‡/á|ù::ºwœa½Ž’89ZA)|ç¬ÕÒ‰ÒÝ—¯ðßw´âµz·Š‰‰‘[ |>Ÿ à'¬]»ÖaµÀD#—_|ñENNÎîÝ»ýýý­GÜ|rmÀ öœùêËRÞÁŸ>š2qÿi5ƒüüüåË—3Æâ'ÍK»íW¼W~ó½¹Go7®ÑoÓ™™¹aÃ[uåãè5sSt¢öö®ÂÝüé«qã‡]l¤Ö\Ñ—‰Ë¶7ö©ò½MU¼WçÏ{@«kû­·"s¥lè%bCÑK$*¹Lÿ¸˜¦s=BÌ`Ø vœÞö¿–zänu]·5€°MÕa€l{cÇM¸ùÎ;~Í{5í®ø‹G]_;³ÙŒë @žxU„|«Ü"9hoïzõÅ]æÖîÁ ‡O™ÊÐKIæòòòt:cª~øGÞîFCCÖ<»Àßßé>zeøú·Dåqçî}{«xÕclö¼Ñz)‘wîÜ9Æc–ýúò^j¾ríP1¿Yƒ ^Y -XrÄ}‚iéõú„„N—••¥Óéâãã‹‹‹ÝycG{×ÞÂJÞÁ¸IQ•gè¥dØ϶ôé3ÅõOó^ýróñ––«ßXX(÷^YÄ®£˜ˆQ E/‘¨ä[`ùò?ëú\J$L4Ùˆ¢½U­WùÓWKn‰sÖ3IY½”ìûâÙ–º3f9P¼‘÷jG»jù;,µå}‰])F1£Š^"QÉ·ÀòeáááRA`&òx6¢£½kïþôÕÄIQcÆ µMð8;®ľxÜ} +*^là? :iâ’{ï½Ï¾Ô–ÿõ%v¥ÅDŒb(z‰D… ˆóx6bѹV»ÕWKo‰c½¦F¾§Ñh°å³ÜX÷ÎÍÍÍÎ~=*š¿ö.lHTøIö¥6®/  , n̘1»žèèè.Üßð°N_±ÞS#VJì¥ä#¬û@Ïž=û½÷_·ŸÄJ™¡;uŠ¿< ×–Ñkæ&U"½^ÿÔSOÙïs6âÀ>G«¯–N´ý:%%eýúõ¹¹¹ÙÙÙ¹¹¹¥¥¥¶|¦÷ÅcŒY×á57_±ß0h±8è‰Õpñêñcu^šçè])z‰ÅPô‰ –Í™3Gê!L’Dn>lÏÝE§¥åêž]üé«1ã†Nˆnÿù¶PòïKé&z_<ÆØœ9sxOž:½¯¥å"ï´‚í§4‡EïJÑKÄ(†¢—HTXƒdYÿZÕét¶é%­V»qãFîÃö¼µSóçÝ7cêxŸ³xií%åß—¬OÚžBˆ¹nÚç¹'¸'Ô×µœ,©Ÿœ“_â­ŠŸ4—W]1Æ-èì A[(w¦ÊÞ9 åç§Z¸xBî§Ç¸kÏËJâFxqt¢w¥è%bCÑK$*¬Á’#Þ\òLÔ{”*e:¿u]Øè˜gOrʼ/¥›äy™<À]Wçl%ÜÔé1Ã"ù½Ê ¶ó»ºË™+eC/£Š^"Q)þþn‚Ç8ý'ÙÄØYw¥=Ë;á‡L­®ùÆv×æÍ›ÓÒÒD"ôŸû=ÉôûÏ}žkà|ô‰›ÇÇ}” âU˜ÁßÅ}ÌpÖÌ Þ«‘Ã%OEæ AѯždÓgjÂÃywíPÆ$È ,ð]¶§÷ÇŽ¹qd4¿ÓÕ¢%üüTxBPYúÕ“L­ö›;<ï`ù©Æšêf±Æ>–Ñkæ&ÛDÖµS­^Ë;>thÈÓb˜“fZ‘‘‘3gΔm(HÔßÇY74(wp÷Î û3¹ëºÌfóÇ9@®½DŒb(z‰D¥øLXƒ³6_¨8Ýp¹_Bݵ"éæ9c­¿...æ>!h…Ý剻®ŽËÅš¹ÛOoßzŠ{D¥b¿üßÔè‘ClG°×$UâUНNP`û¸í¬†þÀTWW§ßµvÜØiÜÓ úõó ümG.^¼8yòäK—.qOÓjµƒAq½hó 'ÙÞ½þµ©V­îµkÚŒ˜•?¸Áö™Ü~iV¸ú4`‘;À@éõú„„N—••¥Óé/^\]]="jü¸±SygΛ?ž[]1Æ<È«®˜2w$·+cL«ÕnÚ´ÉY%d2™~øÃ•GŽná?z¤öÊåïî’Ùk¼ – üGÇ•NòDö—uww3ÆnJYɘŠ{fHhÀM³ÇðÞî#ÏJ~™ÁëI–——ç¢'™µx:üí]]ÜãÝÝ–ÂÝ•Ö_ËðêÓ¸R\ô1Š¡è%:¹Ë‘ýªj¥“<‘ÃIˆá‘c&ÆÞÄ;8{ þ>ò,¡ä—I(ÜöýF£ÑÅ™Ö"©µõJÉÉ7LYÆ}é ¾zÑÒ‰C†ÉðꓹR6ô1Š¡è%f°äˆÞ^’'r8Ù0kf†JÕkúÊÏŸÍž;ÖþL‡Ïj4šÔÔTáÆ(=É/“\‡²IÞÓÓÍ}©««çëÝ•L–WŸÞ•¢—ˆQ E/‘¨P`O°Ÿl:tt|ÜÞÁ”›bìÚgý_ÙJa+žŒ¦‹¥§¾æ½z`_Ukk®>xÀÝÅó]]]jµï'â)Bp‡ýÃe·.ùyòä%ÜsüÕªg³xðà gÂ}qÙ²e¡¡üì@‰lm8† ‹yðþ?ó&5-xËm“®>QÒ?E8vìØ—^z©¡¡AŒA½fn’'âMB 99aguQ]±ÿ®ìÉÌÌLOO •<”àè%bn„².Šùå—{z®–Wì㿽°²­­‹Ù]}±†ëzWŠ^"F1½D¢r·p;vìØ[o½õÙgŸ¥¥¥=ñÄ3gÎ{dn X¹3Á`;GÕ[¡×Œ¬Zí·æ¹…ö;Ó/°uº5îþ‘÷`iÒ”A«~Ì/Ç€ég°®¿þúwß}·¢¢bòäÉ:.%%åÿøGGGGßï¯ÇU|||qq±ýiÖIˆÇûù•KüBjÚŒTW>ËöiCãيʃ¼W¿9tñÒ¥+RŒ ¬‹Ü###׬YSYY¹fÍš÷Þ{O«Õ¾ð .\ipî°ïqUSS“‘‘a2™ž¿¯¨ª½½‹{ÄÏO•º ÖúkYm9ÞÁ}ÈT0—÷jPÐàÏrù·\óä)Bÿ{î¹gûöí>øà‹/¾ûÈ#8ûË <@ï>·¨‰úÕh»³£{ßÞ³¼ƒISFÄÜž ³ÂeRס¬õôÉ“'mGêêOU×çvöLgOŒ–"лRô1Š¡è%•'VSSÓË/¿Aqè}ñ˜óP.î,‡††êtéwÞ=•÷Ò™ŠKçªdѯޕ¢—ˆQ E/‘¨ߥFÁMûÓ3—¸G†G Êzz¾Ÿß÷Ëjl»¦¸øœÍ›7§¥¥1Æòóó—/_îâ3ûÝ“c¦¤¤Ä:÷ÙÕÕóêï ZZÚ¹'$M¹êÇÓ½:P“ôF­¦º™W]1ÆRÄr«+Ö{&ì£>âÞv´â.íríÈPŸw–Õj¿9©ãxï:a¸ØØp•ÑzzÄ€[~àvï䯞<$hÚ ¾Z»½[ÇÐÒjµ7n´ýlýÚÅ sÖz qÝ IDATÚÅK7Í»{g…u/B+‹ÅR¸»2fŒO€kŠ¿¿FòaQQ±v#Ò&jllÍ~uï{rÛñÜXθØâÐÊ=•‚Þ 8Ô–üÒÂÞÏF¨Õ~Ÿ}±¦üt ÷ V«5 ^«­é])z‰ÅPô11«ÅW'$ ,VÞÆãõ½–Ú«ý¢©†JÑÒÒþêï ººz¸~óyáÞ÷ygbí€a €‡Lƶ#‡Ïó¦Ü<Õ¸cÈ ©Óù·’oH¾5(hï rŸ1 À⊾>Ë›~P«ýæÎã/^p&uÁxUïî¡7L¹wš;}ÔÀw À’#ƒÁ õ&U¢¶¶.ýþs¼ƒS§Ç„…üÃq™aà¡¢F žœÍ;8íÆ;Õê@Ûo½üô(½+E/£Š^"Q¡À’#wÚ]*‹T‰ì«â>ÆS©T© Æ òá¸LŠ H(ëvà\ƒB#ãçÛ~„ý΢¢w¥è%bCÑK$*ůÇ"wpÆq£Èä‘«D£Hè·¿¾½¿òÌeî‘KXd9§G|™xUú`Yß:Ï«®cóÝhÍ`/uá„Ê3¹G®]SeÜòÃÉI#¥È , ÆÖ˜Êx)ޱ^k“c'DjÇDH50P´ø„Ñ#‡\¬oá,ÜU‰ Â,9***’zóZ"½^Ÿ Óéþþ×ÏÛ®©x¯¦.Œðgá2)‚P¡T*f¿z¯êì媳—ž/*zWŠ^"F1½D¢Rü&¬Á“É”””dݸæ‡+³¯5‰ûêÈQCžúUªŠ_t¸«»»ç÷/í26·qÖz+± k°úVXXh­®bFOæUWŒ±ù cQ]Á@øûûÍMÿå'¹/_R­_·îòåófÆ 4öM€BtØZiÏœ¾‚÷RDDÈõ7Žöúˆ€š”›´ÛO_»Öi;¢R©fN»ç?;Þ¬©©Y¼xqW×wmA°4€Ã,9¢wŸÛ;‰¬­´‡GjcÇñ1Ì?Îß_àù+\&E6TPzÖì1¼ƒ‰ñ ƳUWŒ±šššŒŒ “É$àO·¡w¥è%bCÑK$*Å/`Â,°1™LÉÉÉ“ãïIJ\Ä=¢~ö7‹ƒ‚0_ p¼ýóáÏ ‹>°?;@È6{è[XX؇~jë¯msÓ챨®|ÙlÎËËËÉÉÉËË3›Í"ý‡Û?_Ÿ|k` ƒWØÀgáo ¥µ%ÂÏï÷ˆZí7[;û½^¿råÊêêjëoE]5oÁøCÅ5Üõ º!ùÖƒß|Î;;@ø,Ì`É‘Ñh”zóN¢¶¶®b»­§Íˆ2$HŒ‡Ë$&“)##ÃV]1Î(1B181É~ûçåþþ½þÉ*ÞÐʽRÎÐKÄ(†¢—HT(°äˆû÷ ÞIT|àœýÖÎóæ ³µ³=\&ù°uèમ®.,,)Ôüü¦µƒG&Lú¾œuhå^)gè%bCÑK$*Xr”œœ,õæ…DÝÝ=E_ŸåLLŠŽ1ØþdAëà2ɇ³¥Nååå"…3nèØqÃxgL»Çº;Óš5kJKKgÍš%ÆfJ¾RÎÐKÄ(†¢—HTXƒÊ`ÛaÐY Ç£G.ðZl3æ`oæÝÅ:àΖ:‰ºjþÂØÞëµO޵EÈ™³‡¢¢¢ÐeÀÇ¡Àà•D111?þx`` ­Ø²XXáî3¼w9œc°.ÖáÞN².Ö1 "ÝÍ/HMMÕjµ¼ûâ-²J˜:ˆ™[{œ9}Å™³‡°¶p‹PŽè5sH"ûõËçÏŸæ™g²²²t:]|||qqñ©²†úºÞSíVÉ0—‹uú;0\&ù Û´i“F£±±-/”JÅ-áR1£'ßxÃ0%%¥¬¬là‹up™Á ¡æÌWôuew÷÷Ë8ººzöï­ï~4½+E/£Š^"QÉkK¥R©TªˆˆˆÔÔÔ!C†¬]»Öýwñ¬]»–û¼ƒÁ`àöøç¾ÄýµÑhäVèR}÷‰9å¦à~ï×ýý„”””õë×çææfgg¿òÊ+ÑÑßíRžœ´˜õ–2Kà:Å™3g–,Y’™™™žžj?ë“_/¿üòÿýßÿÙžüâý9p¨‚®…‹Opvš²Rð>!<<\ì1„GǯÑ÷ï;wóÍsíÿB9r¤í~´Çc°…RÖµpñ ¶DŠNÁû‡—Iq)¸/9L¤”k×®uX-0ÑÈñ¼†††‚‚‚¬¬¬Gyä…^p}2ž"ôA¶‡ÅüU±jzÍÂúû«Ö<·0""d Ÿ'¿ ¿êëZÞx½÷¿¢;ïIR^äN¾jµÚ7Š×áúK¼*B¾ÕÉîÝ»xà>w>Bå³::º_ù]¹µƒ{°ªú`æÿÞ>bÈd2%%%ñnGjµZ<ù®½÷·âSeÜ#C‡…®yvA[Û5/7÷‰WEÈë!×ôéÓ¤…4è5s#Ñ¡â^uŘeÏ×222L&“Çëþ“_¸LŠ0ÀPî· M]Èol{å²ùøÑ Öæ¶ûÑŒ ½+E/£Š^"QÉq‘»Õþýûãã㥅4æÌ™#õ&x¢žË×{*yÏVilªbŒ¦¥¥yöÉî?ù…ˤ Õ¯›Å&Ñ„Ÿ¯éÕ’­pWå SG{<gè])z‰ÅPô‰J.3X·ÜrË_|ÑÐÐÐÙÙY[[ûþûï?ôÐC¯¾úªÔã ¸3gpìè…+—ù/þÌú‹<N¤`e¿GSMMN§Û°aƒ³/§ý$Vm­ñ½w?j‡P¹Ì`=ýôÓo¿ýöC=d4£¢¢n¾ùæÏ>û ËŠ}›s…»ø[;×_<]sþ»§HR I²m0ÈÛÅ555«V­²þÚþË™w·â}9;;»×>·µ³÷Ó¥§¾þrëë¼3@èoö ÀÜ[`~¾ÆÈ«®c7NþzÒ,†¼¿m0ÈÛÅöx_Ú€uÀÅÎŽhîÁIgïÝ÷ÑÀwÈA2âÎsûÕWƒýô‘Û|tçJ‰ë=šlx_Z½^¿þƒ—Òïz= ØvÐÏÏú´»ðœ€O‘Ë,àâî @ƒ›‰îëÌ]Su©©Õp¼ŽwÂì¹c%©®|ö2)Ë@BY·­´îÑôÑGqWæYñüYž¯­2œØÁ;sJÒÒ3ø»’{ŒÞ•¢—ˆQ E/‘¨P`ÉQŸw%ÇÍD}.0/Ü]ÙÓÓëfy`ú¦9c…i?øìeR–†²µ ½ÿþûsss]?ý`{ððð‘÷ôts?Gíh8zi #á¢w¥è%bCÑK$*ůÇ"wx+Êc˜_miåw]]=Ü÷ÎMŸvW¢ÃÀÂv°çúK’“““••eýõ·f%Ä÷zš5tPà3/, ĽlÁ"w Ëaã+‡ Ì‹¾>Ë«®üýUsSlj7 _î¹~ú»Êªøp^Bü<ÆT¶#æÖŽƒúê9ó„ùÆ€Ìá!HÉÍÆWŒ±Žö®ûÏñÞ0utÄÐoÀî"ÂÆ¦ª³UGx'ìÝSÙÝwŸ€KŽè5ss–ÈÅÎʼ sŠõÕ×ÌÜÓT*6ßngϸ¿Á3—ï\&Eóf(Þ"BÛÞM6W®\;öm­í·îï$ÍCïJÑKÄ(†¢—HT¸E(Gô6Ôt–ÈYg ;v<ñĶ)%­vìïÿ3Äèè‘Cžûxh[§u¡:ì|M¯yÐ=»ÎÜ8-F¥Ð]izWŠ^"F1½D¢BRrÖè“O>ijú¾›èAã̭ݼsì7Ö|h\à®Ó*9^ÿÑû‡¹¯Ö×µ”•6ŒŽ ÎÈÈàΛZïJ ûM™@‰p‹¤ä°ñÕðáùÕcª™ÓWðÎÑh#Æ&ê0°Á3 Üädó¬{ *<»+ ‚KŽ ƒÔC˜³D_Ýwß}ÜsbÇÏ9†÷Æ‹'8<÷7xæòˤhÒ†R©<èz¶òò ƒãîðnn§CïJÑKÄ(†¢—HT¸E(Gö³)Jç"oÍʲeË Þzë­ïO˜Î*>jÄàÉIÑLÐÎUöÃèóÓ|ê2)—䡦NÙþŸr“±{Peq<*7ïJKJpô1Š¡è%•â»t¢Ñ(=&“)99Ùºø7ftÒ}ºWy'èî½~FŠ«@) wÙ’_Ê=¢R±­;^2”sj4š’’¬Áð&ñªÜ"ÙáÞ°K±[}ùúQ¡¡¡ééé®?SòP‚£—ˆQ E/‘¨P`ô¬÷PüüügN¿‡÷RcSÅë?yªÏ÷È™u^Šû|FHHHՙ††«ÜÓvT$_?JªA€°ßãm0™LÉÉÉCÅ.»å—¼—òþ½ölÕ7ÎÞ¨ÑhJJJÐ\”‚ûìèQSÿ•w’wÂOM‰›%ÉØ|“xUÖ`ɽfn®………mܸiöM÷ñŽ74Tž­:âì]’·n÷µË¤Pò ek7š••¥Óéîûá¢AƒýyçìÚQáÎGíܹ3///'''//Ïl6‹0Xo“Ïe½Pô‰JñÓ?˜Á¢á„¡þÃõ‡y7oyíÔiþÏ«V­š2e ú`²ðÚZ-Zð£©×¯äùøÏo;îû•ˆö½ßЯ@@h4 ÄíÚÉÿ‡{h(+¯ØofzzzZZšW ‡ÁîÝ4kÆÊŽŽ^wœùñO¾+°ìk©>ø`õêÕܲö+1 ¸W +¸EÒ;}ª±¦º™wpÑÒ8&†wMA¡>îÚÕÕÒÄ;Xvòâ…Zs²÷ó½÷Þ+·~%à ,92 RA`®Ø­;‰ˆ¹yÎ7›.JÅ×.“BÉ$”³Ç]“® à±XØ®§™“I¯ÆÆF‡Ÿ#a¿AÈä2 ‹^(z‰D…[„rÄkKH€‹DUg/Wž¹Ä;8Q¬¿¿ŸýÃí²ZtåS—I¹dÊÙ68‹¥ ®Û¹ý4÷¸áXýÅú–~ÕLJïW"“Ë$,z¡è%•âWˆc‘»Ò½÷·âSe½þQ>dHÐÓÏ/ à?` hÅÅŽÛj7nÜ8kÖ,skÇ+/îêhïâž!!A§ÓeeeétºøøøââbÛ«£® KLÉ{˾½U×®uÚ~k e6›óòòrrròòòÌf³w/^¦£Š^"Q¡À’#ÞŽ°ØíÞy¦»»‡û’¿¿jáâ R j _&JäÊÖ\Ôv¤¦¦&##Ãd2ÙŽ,^:Q¥êõ®k×:÷}}ÖöÛêêj×UšâÈí2 ‚^(z‰D¥øâXä®f³ùßÿÞzìp ÅÒ믎™³´é+§H5*/ã6åÚ¼ysZZší·ï¿{¨ôÄEî !¡¿~~Qp°š1f2™’’’lKã­´Z­Á`À¦„ý‚F£ lÖm¯w¯ºòóSÍ_ˆÕWàC¸ÍE]_rKËüý$Vaa!¯ºbÿßÞDU®‡}ß7ÓÑDDÈ]ÔTÜsO´2ëÖͺٽšiuï¯{o¶ØÍ®¤eÙvÓ´Å,sË%PqwEPDAdߘý÷Ç©éxfg`ÎÌ9/ßÏ_ðž3ÃûðÃ3ïyÏóRRRrôèQ«u: ð޹&RWÛü@ÿ)œCƒ‡ö ö´K¯ì‚S\ÔT{©oßèÎ9ÇŽÞhkS³³4°#$XBDY17æÓöð¡óœœ\ØíZ­&(¤Å^½ê<ʆ‰Ð^Pœâ¢ ©TšÀY´>é¡>œÓärÕ‘ô´´´Ã‡}rSÙ›ð m˜¬‚¾ è‹ˆW¢_À„5X—œœüÆ«?ý¥³Ó]…Ú/çgäåïÀªèj8ÅEÃÃÃSRR! ,Ð/"–J¥©©©¹HaA5û±J¥ü³¯žQ(Œ|2‘J¥yyyøk° ‚ˆEEE 2“]étÚ¬ÓÛëêË<È.@=Ãâ¢jµš³h¹µð—½'8 –‹‹Ç³NfÿÀyN&KCv H°€wƒ8@ÅiÌ/Ȭ«/#„,^¼X*•ÆÇÇÛ£köáááÁþ\±{÷n£‹Ö‹Š/ôêp£¨žÝ>tðœó÷´)š™oŸyæ™iÓ¦MŸ>ÝÃÃïn€ù°KˆrssíÝk:“]áäx×ê+N—uz;óuCC§XP6L„ƈˆH‚jgѺ§ÑÕÕsÈà‡õ߯ÄÄ$&&Š=»Å0Yо è‹ˆWH°„Èp ¬ˆpê64´ž>Å­MWPx¬¶îÏë"½½\ÔÃd}‘Õέ…å…Å7ÏqÚ‡ œåæêÕþcÅEÃd)ú‚¢/"^á¡ùúúÚ» –Ño¬¦P(>ûì3ýÅ©Tú¯mV«ï*Ý®ÓiOdoã<ƒo/Ý0Ý}‘ÅÜZÈ)“ÍÜZHI^»2²çö!WWÏ¡Cæ?ù­þ±Å0Yо è‹ˆWH° ³²²²Øw?±É•Eך%Gvã•«GêênsΤãS8@Çøøølß¾ÝðÖBŸ„„g—¶¢â3½#‡±2dà¬Êªs[¿Ù„…íÂ$ú(Ó`_F·ìЛ:yi\ÿÉìGGÉ®}o\É¿ë’n/ ¬™`æÖBý²ªìììç¯xhâk„ÜUÜ}tBÄì9qöè)=èß*'33sÁ‚ÁÁÁ¾¾¾#FŒØ¹s§½{dO"*æftˆ¿_·þý&p‡ “nÚü‰T*Õ·„‡‡oß¾]ŒÙ•ˆ†ÉLôEDDskáŠ+8‹ÖãããOeôàþ8}êvs“¶}䋈†É|ôE_D¼ÊôD"?~üÛo¿=hР˗//^¼ø¯ýë³Ï>kÎB×”œœ¼råJ£‡fL}9&z<»ÅÑÑáÕ×Çûû»›ú¤¦Ü)“}˜œÉy·“ÐkÖœ;õ€ô]¹råûï¿/‘H!Æ Ûºuë#{úk}£F³[Ôjåÿ¾~Þ?Àƒ½7¦²ÌWYÑôÁû™œw¼‘öœ›k¯.ˆýk°8~ùå—ØØ®û–!¢ëÜÌÝOì5UR©ô­7“9Ù!äRîþ¦ævÉ«¬¬¬~ýú%%%­\¹2))):::;;Ûv]ï4 “™è‹ˆÐTh˜÷€A÷qOg•ÔÕÊíÒ+¢i˜ôè Š¾ˆx%Ä韺ººQ£F}ùå—cÆŒ¹çɘÁÎDÔöm—¯äU²OP©_n^ÜÒROY»víŠ+ŒÞ~޽ŸÚQ]Ý’üÞ­ö®7½!Ãz,x| ½º j]h«²²rîܹŸ~ú©9ÙCb̪U«Ø¹vnnncc£þ[ö!ö×ì­ð f>³¦*>>>11±®V™ù®ìŠráâ&»"„¸ºº666½ý=¿%ÆßžÏÀ÷3¸¸¨#{{’»]8WVYÑ$¢(ð xÛ?êU«Œf „7šþ)++›1cFrròĉÍ|f°„æËϲ¯T³[”Jù›·¶Ê«ä•©Û™ù-õ@„êëäï¿{D£¹kƒ„¸Ýýiˆ©‡€)]bëÎ;Ó¦MûàƒÌÏ®hÅNØÅ¥èz-'»"„œ½°‹É®Ø%¯ÚÙ|ïNZ‹x‡Éú""4åà1hh§1/§üv©ˆ#¥o˜Aѯ„’`UUUM:õ½÷Þ›0[š² 2ºíŒ(ìß{•Óâææô·¥sW¬X‘šššŸŸ?bĦÙ|s²¸6Vï0™B_D„` 2Ï IDATÒ ""œ]îÚJ§#û÷qÿúD„Êa¢/(ú"â•P®¯ <øÕW_}ôÑG-} . ÇåÜŠ-›Îr§ÍŒ?ñ~£çgggn¾¦ÏÀ ûöäI/â4>ÿâÈÞ÷Ú¥?"Å_!”ìÄèB³úúz??¿{>P !tqZ­.yÍ‘êªv£ëk¯Oà|ÔfC,€Ž‘ËUkÞÉhmU±#zú¿¸ìA{u @Œè¯äŽ$IìRSŽr²+BÈÄ)QídWä÷Ûùì€(Ý󳇇‡óØñ½ì+`7ÞºY%¯2&6Ô†=ㄲ ØDWÌ­®®áØîµùæ–šè˜ß& E‘9è Š¾ˆˆ8ƒºg ^&¨1 ½¼¼]9Ý¿ï*§J–(ˆq˜î‰¾ è‹ˆW¢¿¾†K„BðÙÆ=7®q÷îÿà½÷—Ïš5Ë=+‹jðž–moiiJ?ü§±µU›‘.â’ t@‚%Dì’ÿÂ$—ËÓÒÒ’““·}¿ãØ‘œ£·ËònÜ<Ë.j%üˆ:€¾ è‹ˆˆ0(sjðêƒ:zôèñ“?VUsNÎ<\Ü*WñÝ0™ƒ¾ è‹ˆWH°„Ȱ§pÈåòwß}·{÷îÌ Ü-›* .FdßÊ.ÚN„Q‡Ñ}eN ^ý ………:.óÄÎù*ÉH¿Îk?­KtÃdú‚¢/"^!Á"___{wÁ¸¬¬¬¾}û¾þúë „ Àð¸þ“8縺5­ÿè-vÑv"àˆ:ƒ¾ è‹ˆˆ0(ŸíÛ·K¥¬Rç|\!¬ ˜i­â›çJJs8Ïs"³¸¾¾•ÿþZ‡è†ÉôE_D¼ý-x¸‹Ðf onzäá÷ŽÆ>ÇÁA²âµ„à/›÷€*fÖà•Édqqq%%%a¡}=–LÈ]›íñèÂ6é/€XÑ_h„ss“´G'»"„„vÓ!»è<3kð2Ó]III¥¥×®ŽÃ>zá\Ù˜q‘Ý»ÿ1뀽l—…H˜ÅÜI2nÌÓœ”ª6µŽ»9C˜u}AÑéAÅÇÇ_½z555uĨPB´ìÓt:ÝžWôßÞ³~©Q?Lt /"^‰þú.ÚÌîÝ»gÏžÍ|=nÆÔœNœúîï¯?ŽÊ¢¶—••µ`Á‚û#2h6çПŸïlQýR€®…FÁþô7799¹Œµˆs´¹¥®¼ê,ûF'° ™L6þü’’’S§S î– {w]ÑjuÕ/€ÎC‚æÒßÜ4tðŸÎÑ+W÷}ÿý7ìÂúZYiiir¹Ü¶èBôÉSk«,ëL*çhEyÓÙÓ¥Õ/€ÎC‚%D¹Îm˜!ÅÇÇŸ;›3n wúÊÃS·gßWìº œÕ‘‘‘ÂYía-&+¢/"Ò5‚b'Iç/î–ɪ8çÜ_xï{×/µ£®0L /"^‰~Ö`ñ„YÒQRRÂ|+•JSSSãããÓRrNg•pN~æ¹áÑýþ˜ÓÂj[b¯$„ÄDŸ1õeÎ9cÂÿºl–þ/š!•JóòòðW ]Ö`Mé—tè[JKKçÏŸýZùÙÓÜeQ}ƒÙÙ±p·Zè$Nñ÷ü‚#•UÜ2îY'˾þz[ûõKÀŠP Œ0•!mßvN{×màÄÁA2óáΙXí`K¬jX¥„NwùêžÐ—Øç¨TšÛ·œ¯^½Š:X¶Kˆí»#ÑL¨oÔè†zncüÈð°nÞœFsv«¥€Ý‡Éê苈t™ ˜jXìä)í‡+y¹ìsr/U+Ì©_j{]d˜Ä޾ˆx…K„BÄY'a{†™³“ë¸1ÏpÝÜœ¦Líkøpsv«¥€Ý‡Éê苈t¥ ˜âï+V¬HLLôððH˜ Õj9±K~JËill´M'-Òu†IÔ苈W¢_!ŽEî|Ðop¦o=ráÈøG9§Íš3&¡—ÑgÈÎÎÖ_° „„‡‡§¤¤°o3^íÞ½ûƒÿî6d.§½O4YüüL»t @€°!ØgI‡OȰ!pÎ ñ5:ÒÔ3^°Àj[*,,×íì.M.—ïÛ·/33sÛ¶m555L£þckK‹òÀ¾ÎCš[ê²N§ÐWs€̇%Ncæ‰-Q÷ruõd7îÝÓ?ÔÅõ·ÿílÀ0kÖ,þ: @+Ì` Qnn® ~Š~?æ 6è³+ÂúغïU¹\ÅyTæñ-aÝB,ÝaÃ6Ù}AÑébA1Ô[·nå´Ëå'²¾ç466´:pMÿ­}7`èRÃ$^ôEÄ+$XBdX¥Óê /°•””ìÙ}ôt÷ãleõµÇŸ˜”ŸŸoiE+Dd{ôE_D¤+ÕþuM]Npˆ'§ñxæÊŠ&ækûnÀÐu†IÔ苈WH°„È{½ '‘H.ç(8ëþt:íCŸ|þùgjµÚÒGåî ôE_D¤+ÕÎuxxø?l››Çi×ht;wä1èöÝ€¡ë “¨Ñ¯`uQíOûˆ›¦Rºq/å*bÖdðÙ5èSÔO>ùä¹sçnß¾ýó®-AœÍsHÑõÚ‹çËÈïå…¥R©þPxx¸¥‹@‹Ü»faû•+WLàáá›0æ)Nck[Ó±“ß2_ÛfMXÄÔµ¼¸¸¸!C†0—½¼Ÿ}ê3gç»>>ý”v©_ÿP77'lÀ`E˜Á"þйé¶oÚ´ÉÔ93¦þÍÅ™û®šyüë¶¶{¬Õh•åéè Š¾ˆHW Êè5¾îÝ»¯_¿^¿0«¹¹Öpµ{[›v÷ÎßêsvŒ¶vÇMê:Ã$jôEÄ+ÑWéD¡QóqÊr=öØcŒ+¸ìÂùÞ)¿úýöW™ß³T*ÍËËÃU2ÜdýoûÛ+¯¼Â>ÇÁÁé©…ëƒ#Ø ynɰ aî ºlö V`j ì3Ï<3mÚ´éÓ§»¸¸­ÿo¦N×Ì>ªÕje|ʼþÂÃÃSRR]“á5¾O?ý”sŽV«>”ñécIÿ!ä:î:ùÏ;i›¶.Õé´5ܬ VbjíTLL ³+ó¯¯UU5sŽ>8¦çˆ1kð¹@8›¬½ »ìrÞ•ŒØ˜‰ìÆÿˆAfœ¿¸›ü^ /77Ÿ¦: k°„ˆ§ëÜí×¹©©nÉ8ts¨µµ!8¬µók2¨¼rO_PôEDº|PFfBŽßܦà~š3ê o¯ ækß/ÜŇI,苈W¢_À„5Xæ“Édqqqœ:„Ìš*ooŸ/?ͺ~­†ó]{ßkU”âƒ,€xqf………étºÊÊÊqS§L|‘sòµë§vîy—ùzíÚµØÐ¨‡ÍžÁ Ú©ssîL©avu£ølÁµ(| j̬ÔÔÔµkצ¦¦ݸqcõêÕ%·³ËîäsNîsÿÈ>½Û§¡ººÚpx0“è§0ƒe)¦{MUs³bí{Gå-Jöi*µbóÖe•d袿¡8(0üÉÇ?tt¼k1nssíW[—h4 æ·ª¤Xóà V×ÒØØÈߓֹÙõÓNvE9yê{&»"ÖØŒŒ×ˆì…¾ è‹ˆ (cô7×Ô–œ9÷#稗W`Âè§ôÙamß™Ú> “(Я` ‘©íZùpår%³Q[Uõ³~f¾¶Êfd¶ŒÈfè Š¾ˆ‚2†}Cñ©Ó)õ w8' ˆ›Ö½[?ÎOäu©†I苈WH°„(.Ž»'+OÚÚÔ?¥åru:Ý¡ŒZ­†l•ÍÈl‘-Ñ}e {NZ­Vøu!w]"‘H$S§,srra7òºG†I苈WH°º´=?_ilhã4ž»°ëNyóõË/¿“Íïmh,?~òý·ýû÷·m§€w†79¶©EÞÀ9møGBCz3_[e©@—‚Kˆ¬RÌM.—§¥¥™ºËZ¡P§¥äÜ9¡;ðëÇ*µ‚ùÆŠo©T–§£/(ú""ʦvÃÖ­[ýüü!mmMé‡?çœãàà8uò2GG'}=—NþÐv`˜D¾ˆx%ú(Ó`TVVÖ‚ ô  ï²þ157ëä-Î£ŠŠÿøóækfÛA\ ØîÝ»gÏž­ÿvÎÌÿësÿHÎ9Ý¥êÅ™‚=²€VØì, “ÉæÏŸÏÞ×™³³ØõšìSÜìÊÏÏý›_,}(¶è"8ëÖþL*ssõb7–—9×Õªðf`)\"¤¾È ›þ.ë¶6õö.æëó<àïïÝùm@,8ëÖ[Zê2Ž|É9G«Õ¥|Q­ÖÚ°_4@‚%D¹¹ÜÒ 1u75Óþóy õ­œCC‡KûFw懶¯“ }AÑAPí2Ü úr~FiÙÎi•M»wæ¶³¦³ó0L¢@_D¼B‚%Dœ·–¬rPYžŽ¾ è‹ˆ ¨ŽRkÚöÿú1gBBÈä‰/zykaú"â•误á!›L&‹åÔhˆˆˆ\öâ¦ò;Íœ“³Î¤;±•+C ]Sƒtò„%˜Æ9t«ôRÖ™/° èÀ_,ª­€Ñc¬avUYUt2ë{æk¦ ©L&³E@ ˜+€GŽmª¯/ãŠx{Õ×Ȯڇ‹ìm9‡Â¥ :Ó¨R+öîOÖhÔú}Ròû@•ªmÏþd­VÍ9z9·ùZa…=ú H°„È¢ëÜúEW+W®Üºu+û‡»ïŒ©+$ ç!G27ÕÖq'ºx]²Jå•{ú‚¢/"‚ :J_ƒ´¢òÚÉìÎQNòÁ9q"ËZ?Ã$ ôEÄ+Ñ/`êâk°Œ.ºú$qΑ=‡pZ‹nœþq×;†kWqÓ5°é«½H$&¾Û£{Î ·JÏ|¹i®‚¨¡–I]<Áb¢=4lÈÜqcžá4¶´Ôýíßä­œv©Tš——‡7J`Ó× ­®’É›úqö&„DõÓ=û>˜ˆ¡gêºÞ³Ï¼à;ŽóšÑétû|`˜]1eH‘]‡‡‡Gbb"!$99ùËŸ>ž=ãïœ ®hV¿³®¾¡L_rûÄ0` Qcc£¯¯¯9g-Eãîî<^¡à¶gŸM»YrQÿí“O>ùÀè7ÇèDïÍüˆD„¾ è‹ˆ (+‰ŠŠ*¸vâRîþqSÙí‰ÓknßnûD©j#¨ù‚aú"â•€¹Ÿ?~É’%~~~†‹²»Î6‚íÐ/DÕ“H$óþ?ÃìêNùÕ§¾c·$&&®X±"11ÑŸ8ÍHDè Š¾ˆ‚²æ­&ãè—5µ·8‡¤S&ýùºÃ5_0L¢@_D¼Ð¦þýû'%%%%%ÅÆÆšß«.¾‹l;8mÊó±139ç´¶5mýn™¬©Zß‚EW`‘ìììyóæµµ:,z|³“+çhú‘/Î_ÜÍ|;f@DºÄ¬Ë—/Û» ¢õêUf!ªŸodáWƒ×Šnßuìì*88xûöíÈ®À|ñññëׯOJJJ?üÙÔÉË8GÇy¦¢²ðNyÁ6…„A]"„`JŒ~úé§„Ç{úöM/ÃL<ûÌŽÅgØ-/¿üòˆ#l×K Â­[·!¹—ÍÉ;È9äèè4{úßÝÝ}ˆµ·))$XBdf17v‰ÑÇ[ø¯ÿÛÖÒ¢äœSz;ïø©o9ýûsëÙðÊòtôE_DAY•>sJ?òyeU稷wÐÌ©+ƒ‚‚‡né3c˜D¾ˆxEC‚%1fÕªUì—Bnnncãå Ø‡Ø_766æææ=dËg`ߦaêd2ÙÃ?¬_r8yÂ’ÿr7oo—ó9ßiµvc÷îÝlûØÄ5íèïªQ«•»ö¾×¦ànrÚ3bPÿ~3‡ –mQô‰n,Úy£Ã$º(؇ŒF$–(V­Ze4[ ¼â q‹VœuÙEî죃Κ8î9Î Z­fܤÀàgöx¦ä®@ǰïªéÝkø#³ÿI÷_Ôžýk[äŹ¹¹Xè Â×%¹ƒEôËH##ûgÃ2OlIÝy.77W¿Þ6%¯€bì»j"""\{Ïän˜:ié¶Ô׎=Š{ ¡+£á!}L]\ccCHgMÕÁÁ‘s4¿ ó̹ŸJJJŽ=ÊÔb¶YÉ+£Ì‰Htè Š¾ˆ‚âû-eæÃ±.®-œœœ\æÎþ×?î•Ëåf>'†I苈WH°„ˆS;Ô¨„„„>}byøß®®žœCUÕÅ}Ä|-û¥Í‰Htè Š¾ˆ‚♃ƒdÈp†Æ N»—g€VÙ/6v³ëž„‘Ñ}ñJˆ ˜°Ëjµöƒ÷ÕT«8íòÖÆo·­h”U2ߢâðJ&“=uüØ—]œÝ8‡®e]Èù6''‹±@°øË"4ƒÅ^Òoƒåýb·c{Žav¥Ñ¨~Þý®>»’J¥úøàããóÅ—ëNŸÝbø_ªOï‘á=j—ŽØ—觺Π–\.×/,õöìŸ~[„†’uf˱iÌ׸alF.—¯\þ¡—Gœá!o¿Š¯<Ž[m@˜ºÄ èsc×ý÷?7¤¼nø¨ñïßpKjjêÚµkSSSóóó…“]QYžŽ¾ è‹ˆ ([ñðð˜636ïJºá¡¦†Ð ã™·¯¤¤¤èèhÃ…YŒ¨óè Š¾ˆx%ú韮0ƒ%“Ébcc™Â3=ºÇÎä-GGgÎ9ew.müâ¯ì ¥¶$“É 8rØs=ºÇr)•­ÛR_«ª.f¾ ÊËË µy¸0ƒÕ¥=z”É®‚ÃçÎ~Ý0»ªªº‘úÓ;™™™öè!„øøøüðö쳛ëîp¹¸¸Ï{ø oï æÛšššØØX3o0)$X"À”Zðò œ7g•›«çhSSÍŽ]o©Tm©È]V||üš÷WïØùfk[ç—W`ÒÜ·Üܼ™okjjæÏŸ/“ÉlÞGA‚%DœëÜQQQn®^‰sVùxsÎT*å;~~³¹¹–{{*¯ÜÓ}es·nݪo¸³s×;j5wïùÀé#ÿËÙÉ•ù–©„Ì|-äˆ:Œ¾ è‹ˆW¢_ÀÔÖ`ÕÖÔ¿ºâ»À€žœv­V½cç›7K.B¤Ri^^ŠÍ€}é·IŽ3kú+†;ŸÙ¹û]­VMY»víŠ+ìÐK€ßa V×¥VkL-0Ì®Ñøõc&» ß¾};²+°»„„¦Þ÷ÕÂcGo1<¡wä°é-gÊ yÞ “D?ýCÇ »Æ»HŒV«ûæës—s¹ÛPBŽüæúŒÇ{lìØ±¨+‘””ÄÜš3qÜsƒÙLâRîþüÂÝyy¹ødöÅ_!úì„‚+++kÁ‚%%%Ì·R©tóæÍ'NliiùøÃ_k«¹9B<¼b¸‰(¯jll¤¯„}AÑAPvÂþÐ(oŠÈË©4<çþ(÷ç^˜È|-üˆ:€¾ è‹ˆà!Åd2ÙüùóõÙ!¤´´ô‰'žøõ×ôE¿e4»4¤ûo-LLLKvEaH ú‚¢/"‚ ìÄÃÃ#11ñ…^ „T×óõÓžs½°õÀ/Ìרè Š¾ˆx%úé±Ï`é„ÞM2kúKÑQ Ïéºèé¡ŽŽØ¥=7ïìäúÄcïö2cÅ«$“'¼`4»òó'Oüi²+8fnžY†EQ©ßoÿ¿'[ëç׃sæÁý…„QczìÛ·/33sÛ¶m555Ì!©TšššoËžX .Ú™ÁM4’É^øÀ4Ã3¸:9aÈ@èôûOè)-ߥüÝÃÓÈÉ÷&>²"))iÆ úìŠRZZŠb¤ ^øomgú[š !„H&Oø‹Ñ쪪ºxÇÏoöîc˾Y•åéè Š¾ˆ‚²£KÈ[=|ŠƒŒ$Y±ýfŒý”a;»©è˜,E_D¼B‚eg>>>Û·o—J¥‰ÃÔÉK>0Ýðœªêâí;^öKHH°}­bôèÑöî‚õÑ}e'¦ \õë×ëù%#¬¬Šš8qüó†…IÅ» ˜ð‡ÉRôEÄ+$XöŸ—wåíUiqý'e²+W7G”±¸{nþ7R©4!!ÁÏßýùGzz¹Ezð€™S'/•HîúÇÁcGxƒËþ” uÊ÷—ë UUoÿñŸ­mM_~ùåˆ#lß7€ÐÏÍë[ØN8:ª¶¥þ£¡ÑH å¸þ“fN]áàðÇ XÏ?ÿü²eËÒÒÒär¹ z`-â®q@Ä_¦¡¶VöɇGš›ŒdºÕ57Sv¼ÞÚ*£`ŸÁÜÜܸ¸8{÷ÂÊè Š¾ˆ‚²+£5ärù[o½µfÍOOÿù¼Èè"„Ü*½´s÷»Jå]•èn*Ë0™¾ˆ*¹·CÔ VFú‰Ô ¼½B UV]OýéÖVYppð®]»Ä>}Eeý_ú‚¢/"‚ †³q…§‡_Ò#oõ4<³¢òÚ?¿Õ"o`7†‡‡çæŠfwñ“)ôED`µC¼ ÖµÂò ë2ÜÜŒ¼Xo—åíøùm¥RxùòåÐÐPÛwÀºd2Yll,§|ƒ»›wâÜ7ÃBÜ"ÝÐX±c窺ú2vã®]»fÍ2²¹!@Ç Ð(=˜9ók5 µÝŒfWEÅgví}O­V†‡‡§¤¤„††¢´1PÀ°8!¤µ­iûÿš÷ðÝïëÇ9äç¶pÁÚ½úvÙe}£xo*„® –M1Óã~±Ç=çà`ä&šËùÁaõï½÷®>—2Ü Z\«¦r#…¢%õ§?<ãï‘=‡p¹¹yÏäíý‡6\¹z˜i1U@hp¡íTVVΚ5»O¯©“'¼`4»:sî§}ÖÏ›÷H||<³—³Ñ­ ÅXÚ˜ÊòtôE_DA I;¹‘JÕöã®·ó®¤rttž1uùè‘ ‘æääˆåŽB‘S;苈Wb]À¤'–5XYYY‰‰ŽþLdÄ`cÇu‡37=¿“sà‰­ ± ÄG&“ÅÅű?1B5 óuxxĪmÊ¿l!Ï`56´}öÉÑÚ•Ñ£7K.îÞ»¦MѬo1:/•Í™QOII{ÝQ€{jnR|õEvÙmã÷ô\/ÊþåЇmmMÌ·âªA ÂB£& 6Áº’W™²íb«ÜxvuþâîÙ_iµ}K;ûá tM?ÿ¼ûËÏŽÆD3zTÖT½w²þ"ÖN@`‘»Ð±s )S¦ÜýLÖm£C¦V+el¬©»TYYÉ42óR¦>{13êüu@˜®_/Ü»ÿƒšš[c\$‘p×´øx?šønö™´YÛ´Zuaa!>Ž‚p Á²v-ÐÀéÜÙ5þ~=ŒžÙ(«Ú¹gõÔ©£?ýt!ÄÔ}û=Ñ¡1(ú""J$LEEˆ.ûlZeÕõ™Ó^qwç~ •HF Ÿß3bОýÉçÏŸïÞ½{CÃoÛÚýî3L`”@¯¯™Ïî—Y»kIœ9vôSÎN®FϼQ|fïummM÷œÇ¦oÇrú""4E_DA‰„©ˆØ¥³||BfO­[˜ñj¥*UÛ‘c›.æì'äÿR©tõêÕUUUv™Ðê:Ã$jXƒe’Ý,¦’‚¯OÈÔÉËÂ¥=G«Õœ8õ]Ö™4Btí¬µö>ŽŽN3¦þ-:j‚©wýâ[çÚÐÔ\cxÈîZ LH°L²{‚µvmò÷ßfŒý´‹³›ÑeU{~ùïò«„??¿_~ù÷˜³²êVqSê9ÍÍ £'+-‡3¿Ê½ü+{*‹; Á,“ì›`UV4ýïó# S'?þ±BÑÂ|kXJ,ÕܤXóîOŠ6/S'”ÞÎ=þI}}§w ˆ\.OKKK^»n}òÎõk™Ê®Tª¶ý‡>Úµo>»’J¥S¦L1çGÐW̾ˆAÑAP"aiD^Þ®ÃFzÊø”ٚдGÜŸ~4bø|‡»îå²å>c¦.3X–antr™4á/¾>&wf¸S~ußuõ wô-( `EÌú÷æ&ÍŒ©+ÂBû˜:­ºæfú‘ÏKoÿ¶µf°€—Mâ5Áâ\øW«Õ#GŒïÛgúý½L.“T«•'³¶>÷£N§õõõ}òÉ'ï»ï¾ûï¿Y¬‹Yÿ^Vv'~XÒ¨øœÉ*]þÕÌ#Ç7ûû{à#à@‚e¿vu+BH¯^Q ýGK“Ÿ££ÉâawÊ öú°¶®”`Ê €úÁ¾>ÝKoºµÊM¾?«ÕŠú/\”àìâhË‚À!Á2‰§_ «ºqttøÀŒ‘ñ ÜݼM¯T¶?õÝù‹»u:í¬Y³ž|òÉÎLYÑWk„¾ˆAÑAP"a•ˆ´ZÝñÌâ_öækÔ&ÿ)øú¹=4­ïa=$“7'Y †I`™ÄÓ¯&---))I"‘ÄDpäB_ŸvN.¼~2ãÈ—úÊ+¿ÆO_µ\ú""4E_DA‰„µ"’ÉdñÃâbé1¨Ó<ÜðªveH°L²ú¯¦±±qÆ´?EÝ?)(0¢ÓÔjåés?ž>“ƾIë®ì(99yåÊ•Ì×..£â2h–éÅï„R]SÑKwnEêš`™Ôá_á¦ë6ûTñÎÏ{»Õ]-8vôø×²¦jæû   Ç{lìØ±øû°#ý –ž¿÷ñcÿÜ;rXû¬¨¼v½øð»ÿy¹¦¦†ýÏ΂ Á2©c¿Î‚ݺI›¿ÜÙ©§VãÜþo—]>rlSyE!!$00pùòå}ûöµúßáñãÇGmÅ'´;ú""4E_DA‰„µ"boÍ>pܘ§C‚{µÿð†ÆŠ³çwæ]IW©Ú:¿w!†I`™Ô_ ûÁÿîƒ̈™äâÒþ¬©®¹yìÄ֢ߗ[áj €±7‡f“H$ýûMÿ¨ŸoXûÏÐÖÖt)÷À…œ½*Ô2¤,“:ð«IKK›?~¯žC œ1ˆ{ܬ[__v2û‡ü‚£:WN¿$$$äõ×_g'[N±1GÆ/ðñnÿI´Z͵¢¬‹9ûJJs Ñu~B „ –I–þj22N¼ýæ}zöóívÏ“ëîdÞÞÔRôÜs‹]]]qU@\²³³çÍ›WVv׮ώŽNÄ>4bø|¯vo3dÔÕݾ”·ÿJþw§5kÖ444àM`™¤ÿÕ°­7îÈ‘#ì…Š …úüÙ’CsšÍ©/WS[’}&5¿ óÕW_ù÷¿ÿmã?$ú®sÓ¡1(ú""J$xH.—øá‡ï¿ÿ~CC»ÝÉÉ%®ÿäáCçÝs6‹¢ÕªoŸ»œŸQT|F£Q™3¡…a$X&1¿΢u­VKqpp:dÒ¢ÇW”•)Ú©íËVv'?ûlZÑ3Ìœ0ŠZP@ÿ!<''gëÖ­úv§è¨1ÃÏ ¹ÇxF›¢¹ðÚÉ«…Çꊗ/©OŸ>„ŠŠ Lk‰,“$Icc£~Ñ:ÃÁÁ)¼GlTŸ£ú<ØÎþ6lZ­æZÑ©3çv–W0-ÁÁÁ»víÂ2vš–r`„K:xN¯žCÍÜEGÞÚXxíÄÕÂã·Ë.ëtZBˆŸŸß«¯¾ºlÙ2¤Y"‚Ë$‰DòÚk¯­Y³†âää1¸Ïý#{÷îæêeæ3È[sò^ÌÙ×ÔT£o ¼|ùrhh(/;1UÊàß}ÐÀ™±ý&ÞóÖr=¹¼ñú¬kEÙ%¥—Ôj¥¯¯ïk¯½†4K,`!—Ëׯ_ÿúë¯ûûwŒ1X*svr5ÿ**¯]¸´·©åÆŸþôä‡~¨¿úè£yóæ‰úót†Ñ+†ú;œ˜¹®òòÊÞ‘Ãcú‹ŒâèØÞΆ†´ZMyEaÙ+·ï\¹s'?8Ä?77Wï” >ÛwMH°îÂY¢Ø~‚¥Õªo•\Ê/8zíú)¥ªiôóóûå—_°€8W 9«Dô9¯¯ïo¼è5&\ú€ƒƒ£å?JW[w;(ØÅÛ‡„GøIÃÿô§§ô¹g~ ¹—m Áº {¿tb"ÁÒhT%¥9…×O^»~ªµ­‰s455511‘ß^€H˜™ÍèS1wߨ>£¢ú<(íÛ¡L‹BTª¶Êª¢òŠÂòʪª þL-S…BñÙgŸés>±_[2$XwigK¥j q ’šû£Â.\È)àKXs¿6ê®åè+æF_D„Ơ苈 (‘QDL*¦_º~_·ðk…uùW*{ÜçâÒ©I&µZY[WRU]\U]\S{«¦æ–¼µQT*•®^½ºªªÊŽZ"&ó!Áº ç’ù‹Ï}+kªºyëB³üöÇŸ¼;jÔþ øÚýA Œ\.ÿðþûvohp¿ÈˆÁ=¬ò´mmMuõwêêo×7Ü©¯¿Sßp§¾¾L¥Vøùù-_¾¼wïÞ¥¥¥ÔÜ¢h/H°¸Ø—Ì\=½Ü_yå•—^zÉèËKtW²W­ZµjÕ*{÷š苈Ð}%tD$—ËwìØ±téR•Ê!Bú@ψA=Ãyzú[õ‡èš[ê+e²ªÆÆÊæ–º¦¦jYSµ‡‡+;ëòõõmllÔç^„Îÿ¤c˜8`Á¤MIII©©©¢H›ÌÇßxÛ }ƒ¢/"‚ D‚¦ˆî^2/éѯÌH­Æ»û}1þ~Ýøû¹­mMM²ê¦æš¦æZ¹¼AÞÚØÜR×ÒR×ÔTëìBT*ESÓoË‘ 'À¤R)!äžóa4 “^—H°JJJ–/_~èÐ!BÈäɓׯ_Ï yû0Þ¢@_D„Ơ苈 (‘ ,"Îçÿôôtfݰ§§·Ð¨naQÝ¢ÂBû¸ºzÚ¬KJekKK¼MÖÖÖÜÖÖ¬P4ËåòÖÆ¶¶æ6E³BѬP´´)ZŠ­VC ’0f>,99ùÛo¿%¿§búI2v~Æ™9þÜý VssóÀŸ~úé%K–B6nܸeË–‹/Þsl(û³dÐ}ƒ¢/"‚ D‚¾ˆ+(£¥¶$I€°Ð>Ý¢B‚{†Û2ßj‡RÙªV+•ªV¥RÞÖÖ¬P´¨5*¥R®R)Ô¥R!W©ª­­Y£Q©Ô ¥R®ÕjÕj…F£R©•µR­QªÕJBH``à‚ ÜÝÝM%aVlìÀ™-º“’’(O°Ö­[wîÜ9&5f<ñÄÇ_ºtiû¤ûÏ’ôEDh оˆ‚ ú""wÅ)µåàà Õj™¯ÃÂÂt:]ee¥wpppdHPdpPÏÀÀp¿û,-j*(Z­F©jU)Û4Z5!D£Q©Õ BˆF£Q©Zõ'BˆŽ´)š !Je«J­P«¶é!Sý•’••ÅG ¡¼¦'L˜ð÷¿ÿ}Ê”)ú–ƒ®Y³&==½ýRÿgIú""4E_DA‰}ƒ Ø·[7îÈ‘#ú%çä÷èaaaEEEëÖ­khhpppôõ ”úút ð¿Ïß¿»¿ß}>ÞA„HìUNfm;‘õ=!$<<œ]^ßZ„òš ÍÉÉ Õ·TTT 4¨¼¼¼ýv…?K С1(ú""J$苈t"(v*¼hÑ"ýÔ—³³«·W¯o˜¯Oˆ¯O¨·W·w·w·W ƒƒˆ§»ìBŸ`BvíÚ5kÖ,ë>¿PÆ£¾¾> €ÝXWWgÎc% Óyú‚¢/"BcPôED”HÐá!(•JQW_VWÏ-  TXXhõçJ‚Õaô}è0Ÿ~Æ+,,ŒÜ½ »µµ5%%¥¶¶ÖÃÝ×ÝÝÇÓÓßÅÅÝÍÕËÍÍÛÓÃÏÝÝÇÕÕÓÕÕÓÍÕÓÕÕËÍÕÓÍÍ«ë\‚dÏ`EEEYýù…’`ùûû×ÕÕ±/ÖÖÖræ´€ÃÃãÝuÿûßÿ®ýb§bAA>Ri0!¤´ôVnnî¡C‡åò6g'WWW/77/7WOG'gwgg7''wgg7'GgWWO'G''WWO‰Dâìäæàèäìäêèäììä&®åùR©4!!ÁêO+”_Aÿþý/]ºÄ^äž““cÇ.ˆ'ýj'c´3fPõÀ³±±!(ÈɰBKkkjêŽ&Y‹‹‹;³¶““‹££ !ÄÉÑÙÉÙ•âèàäììF‘88¸ºxB\]=m—œ1·2èñ±=±PÖ~ðÁçÏŸç”i6lزeËìØ+èή؂­ƒÅ_5T¡$XMMM xöÙg_xáBÈÆ7oÞ|éÒ%OOA^0Ÿƒ½;ðooŒ3gÎDDDDDDœ={6==Ùˆ‘Pf°¨!”,j Á°2$XV† ÀÊ`X,+}‚URR2oÞ<Ÿyóæ•––Ú»G°¨óçÏŸ_²d‰ŸŸŸÀ÷œ7?¨ÌÌÌ ûúúŽ1bçζì§ùÌ(++ëÙgŸŒŒtqq¹ï¾û&Mš´cÇ[vÕ|û騨èÓ§0_E$1`³~ZÄ¢ ´Zí† ú÷ïïææ›’’b³~ZÄü  ‡I"‘¸¸¸Ø²·æ0?"FóÉ'Ÿ 2ÄÏÏÏ××wðàÁŸ|ò‰F£±eoÍdÑkïСC£FrwwX´hQee¥ÍúÙyüýow‚ÕÜÜ>>33S&“Éd²£G6ìí·ß¶IO-`QPF,±ü#fC‚uggg¥RÉnQ*•œ1ªÃà¿7½U[[Û·oßÌÌLÞºÖAˆˆ} ~òäÉjµšç>ZÌÒ þò—¿¼õÖ[úoø ´4¢Ù³ggff¶¶¶2ë`BBB.\¸À7-cQP®®®›6mªªªªªªúꫯ;f“žZ Ão999R©T¥RñÖµ²("­V;gÎö[Äœ9sØ+%¢ ÆŒ³eËv˦M›Äò˜ Ö]` MÇ‚ª¨¨;vlFFŸ]ë Seeå÷ßß}÷½ù曼õ®ƒ, jçÎcÆŒa§‰|vò­`ãÆ=ôýê‹‚rvv6\3nÜ8þº×1©?ÿùÏÿùÏxëWÇYÑš5kÂÃÃú駺ºººººŸ~ú)<<|íÚµ6é©, *===((hË–-ÕÕÕÕÕÕ›7o tss³IO­ Ö]p‰Ph:ÔíÛ· ð믿òܵêäk,##C*•òЯN±(¨Þ½{ß¼y“Ý"ÀW`'‡©¢¢ÂÓÓ“‡~uŠEA………^¦ñððà±Ò±‘ª®®¨­­å³kdQD={ö<|ø0»åðáÑ‘‘üu¯c,¦#GŽŒ?ÞÓÓÓÝÝýÁLII`P÷dõw6q—ièß¿ÿ¥K—Ø-999111öêEDÝyS, êÎ;Ó¦Mûàƒ&NœÈï:¢“Ã4tèЪª*úÕ)UTTÔ³gONÉ(¡ÕŽêä0éY¦Á¢ ú÷ïo“NuVÇFêóÏ?OLL à³kdQDeeeC‡e· :´¬¬ŒÇþuˆ¥Ã”‘‘ÑÜÜ,—Ë?îëë;räHþ»)tâN°fΜ¹uëVvËÖ­[gÏžm¯þXDÔ7Å¢ ªªª¦NúÞ{ïM˜0Á&½ëˆNÓÉ“'£££yèW§XT;ŸólÑWótr˜¶oßþàƒòЯN±(¨¹sçî۷ݲgÏžaÆñØ¿éÀH©TªO?ýtÙ²e{¯½ö:g ’ðâÅ‹/^¼xñré0þ»+àÅ‹/^¼xñòOÃë`yñâÅ‹/^¼\b¼–/^¼xñâÅË%Æë`yñâÅ‹/^¼\b¼–/^¼xñâÅË%Æë`yñâÅ‹/^¼\b¼–/^¼xñâÅË%Æë`yñâÅ‹/^¼\b¼–/^¼xñâÅË%Æë`yñâÅ‹/^¼\b¼–/^¼xñâÅË%Æë`yñâÅ‹/^¼\b¼–/^¼xñâÅË%æŸà`­_¿þÞ{ï­U«VXXXçÎüñÇw¼xñâÅ‹/´´´&Mš †òâ™3gúõëWµjÕªU«öë×/99ùÿ§ô¯ñOp°®¿þúÌÌÌü155õ“O>‰‹‹›6mÚ¿»R^¼xñâÅ‹—¿‚¤!C†¼ùæ›åÅ¢¢¢^½zµoßþôéÓ§OŸnß¾ý7ÞXRRòw—þe ’þÅ]üÛyñÅß{ï½s~îÞ½{ï¾ûîcÇŽý{kåÅ‹/^¼xù |øá‡»wïž={¶ÁPæ¥|ôÑG;wîœ3gÎ9³vìØ166öo-ýËü"Xï¿ÿ~ù(bãÆ/IpÏ‹/^¼xñòÿÌîÝ»§N:yòäJzBBÂàÁƒË+ƒ^´hÑß]ú—ù'8X•X¾|ùÕW_ýï®ÅßÈù!Ç?„tþæ¿TTqÇÎóL.¤8*îÁ~žõ¼£˜Ï;réyU9Oq䟧£Ê‡Ãz¾™Ûyß’|±"E›6ÉfûmkffaRÒoÛTBDZ¯¿.1™þÔVkQÑÿÏlEEgW®,ø“1lkvvá¾}¿kV¼c‡³¸ø7 'NÈZ¹‘»))áìÙ‹nyâÈD§“œŒ èl™@þ…tËywÁù÷`?ÿf)¨Ü»È|^SùÆ9ÿŽvb9ÏæüžÁQñßßïmÎë *SIÑyUÿ#}éýÏ¥¥¥ƒž1cF•*U*%%%µmÛ¶¼Ò¦M›üÝ¥ý³ÈÎÎnÖ¬Ùúõëÿˆ±¿¿ÿ¿zú¼xñâÅ‹—ÿ<þø¸ùŸP‡s<þøão¾ùfùºûÛÏÏÏjµ–7¶Z­þþþwé_æÁJOO¿ë®»>ÿüó=züûJ'TÒ_ƒ©iÓ ›­‚>nœ@­Z©’>äi¡;.SœNuTDê•Éeâ/ûdè£à~:‘VfÖs‚ˆÑð¯ËÌ–qª2Ng ÜÊ”ƒ"^uf+ÛìVÆ j¸F…žš >)Õãžýܘ­ T=ãÙÉi)LBšê1˜£â™š*õ¤ì’œÒ0ŽTâqíä” îÖ²h%¬ÓY÷WPRŒâŸÒôdeIrÊ9S3ã7USm²I*PÖL=¯˜íúÑsÜå Š^¦»suDîݾ¨ÈÝêU¢ã.%WÃMŠHSk›Žzj×WBª/rúÊ„ÒëË~­œ¢D´3@9óÝJá!­¬¥´±³,YnqÛËŠGSŒÚÿ‰Ç,U¯Tú¤™rOâºu ÒõzsÅ §B´iFÙõX1Ewø*½ØM™gÜ¢Õ¢G»+uôÕ—ãäðœõÜlÝÚA(ÝÑ]{wª<±±2ªWO³gËéQ‡ÊÎ.+ÊÎÔKÃt™"PëÚÚ´¶¬hÛjÝTW‘¨wÝë©t‰>¦h& ,3NÞ­ÑÍÜmxÿ ¹†%»YßõS¨kÜ–i›5«¦âÑ¢rØ$Éi×ÞÇ•€–ø(å;·Yéím D”ÔJvWWbUv´L(½ž&—‘ÔKBj(w·`ÎÒ“"ÒÕÉ¡I•Òc‰ŠÜ¯»ì*–dSÉ/‘ èízÃu(“ŽLÕðxÅÕv—²Fkâ÷®ÞÍSž$‹lcµ Fñ“´Ü³Iñ=Z­„:íR¾Qz¤{ê×4Y$Ù¤¾ÊŠiˆr\{¥@ yº'iV‰e¨FšLž›øÕ‘¨¦ûUâQÞ-Ôu£ž[ö¦¥"^xN§Ã©.ÓDœ¸ùÃsWcù~£*±JÎ)gö‚ˆÖ³çzaió®UPW2•‰¾jÜEf‹Êó uíZ¾ó¤GÍÓäª"vô|çoøü-Z”””ôÊ+¯ü¥­ÿóÐ?…³g϶mÛvõêÕ| ¸ØQ^±ÛÕ¼y˜¦M+.¯[,jÒD É“+ì!-CaÍD„V¬-w”±ƒºèXr™øÀû"Zw¼U¦$™ä÷„ŒÃ´åx™È½ ˆÓ€yîÒKD¼òìßæT‡ "AÃ÷¹•<».Û+õQº[9iWë aÒ×%ne¾„"ôè åFÈt‹2­rJÊ–µ·öD*q–Ü>àrŽVB-O–{È™­u1ŠYs T*©D%“4)Nqó4Ï)§¤³:0UÇkعŽr¯>KPôO\ªLIN9Žë¥DEîÑ-f¹Æok¶™‘®vvw_Y"õ”H§$ÉY¢¬dBé d?í>1É/(%”6Áý•ŠëçÆJ@k©Èã®í›¨xƒâѦXÉ)I…©Šo¯8ôAÝöžöo-ÑW1ŠA1èËA2{FÙC[õhCE£{ôÁsUì6ÅQ£"Ñã½”ééNÍ›¥¶uêôÔ exjI‰‰êÖÍ=Ê^{­6m:WâHKË{ì1“Ñh‚¬= F¶'—k:®/—˜xrР~~®a~Ó¦©ãÇÛsrÊÛØ OÇǯkÛ6VÕ«—?Õ©“8`À‰‰ó+wÌœv{ÆŽ{ÞÿbÎÖÁ©SO/Y’¾uká©S¶ââ îäð¯ô6«µ8%%{Ïž³«Vš1cëÈ‘ç;U ;wÞ6jÔ™åË­ç9Iç°dd¤-^|`äÈõ‘‘KŒÆMݺ%ÀŠjÕöÇÆŸ8QÁÔáÈ_µêø€;}|\çü@ddf|¼£âpOŸžÝ·¯ LÙ¹³uÛ¶²â¬,ÅÆÊÇG ˆÅÇËnwÙlú*^­ÂøéµXå{|k‡]ñcÔÁG‘(æex<ݳ‡ôT[E£»´hbÙQ¶ÌÒˆ`Å 1-•âîBýÑìÞŠCã«éÔ:·åéMVà=íŠV‹Úh‘]’Möw´0Fñj‰CI™Ê|GïÄ)nƒ6¸ÏªÖÄ+fšžL×IINÙ¶è•E¯×Óv™%9e=¢‰ŠÜ§;¬n¯«4KýLŠHW»Û½+–ºKHM¤TIr)«»L(£©žÛ }¢ JDgGº'sªÖ·Wú©®òvyÎàlMõS<úyVI²hv”âHyü¡ìzl™¥§BƒF7Õ™_ÝbQžÞéïŽ|#«'–¸}'ÀP[[V–í¤¸HŒÑ•Š@BôÁY<›8š7O d0hÀ9sn;ëÎÙ7ޘѪ• LFcvTTéâÅ•¼"kjjêøñ{4p ù¿V©r*&¦dÏU${ýú#o½õSD„+6s.¬µó¾ûN}ñEáÁƒºN»=gÿþññ« ˜Y½ºËwù®yóò^×´ÀÀ¯""æµl¹$*êçAƒ6ÅÆ&Žs >þÔâÅ©6äìßoÉ­<™vñ½­9''gÿþÔ N-^| >>q̘M±±?´$*j^Ë–_EDLññ)_‡Yááñ0ÅÇgAd䦨Øãóæ]ì ’,¦ùó÷ñK«V ù²,$dßðáɳg;JKËÛÛssÓ'NÜwÕUî¨a@Àñ 7n¬´[ÛÑ£#G¦Õ¬éº^Y={–|õUÙõ²Z5q¢ÂÂòóSl¬òóË6Þ°F=¯vÇ;ï‰Ò¡ýeEÙéÞ[‘¨ƒQ“FÊṞ­þ¡ŠFÚ긧q–ækê}e‹ÇùË>ºl ŠCê+Ýý:<Ë}#¬}È»²æjÓuJ@+ª+Û“V‘ÿ“~­¢Dt´.?©¼¡2¡Ôª²î$9¤û%¤pi¿û´éq“"ÒÔÊæö·'ôr¢"wëÆR«tP3½B÷É$É*ó|½¯˜¥úØ)‡$“Loëí8Åm÷LÒVhwŒâcõeŠ'5[‡¢•ð¨ÖÉ*©XŽ»µ?R‰ïÊ}7m’å2™êË´ÁÝÛi„„ÔXîÉ¢Cº>K˜ÔÏ3C±8Õ:I$êyO7›gÓe«D‚>ô ™¥ª5KÄkÖa·’U¢ð÷Dœæ'•5ïWе~CVÏ¥Ë*Pø"ZóË5¢YKD¤êߪ¢’2ñÕñjq¢«·Ý&ÐС•õþýsÀôøã•ÃÞS¦dÓ¦eVÞà"üç8X¿ êÙ³çÊ•+ËÛ¯\¹²W¯^®¿ÿ¾Ò¿Ì?ÁÁJOOoݺõÒ¥KÿÔViiVÀhLùÙ­ïoqjýÊ+]Cxj@@΀–ó‚(¥‡Ÿ9rw.‡`O:gGŽ´œ>­ ñ¯8[展”§¤äìßvժófí›81q̘õ11Ë££uë6¯eËaat’F]ÜšøÍUW-êÖmytôσm9rßĉ‡gÍ:»jUÎþýÅ))N»ýw+öל*IN³9gÞ¼Cݺ¹Nc¢Ñx$**gÞ¼Ju¤¦ŽŸ~Å3`€¥ÜR¯$9¢èh÷emÚTåg}¿Ú”tp§†^§HôD”ž¸QYž±ôÌh­htw`Ù² Ó©Õ5Ü_1èíH¥{d[‰–Ç*űà^TêjºNmy^ñhŠ’>s[ÐêJ@¿´T‰§Áœ–SoÈdPj€Ì?yêú¢„$¹Wóõ¦I©ºÊâ™wÕ¤DEîR×B¹§˜ÙÚ·N#}JË\Ê6-ŒWÌL=›¯tI6Ù¦jjœâ¾Ô—vÙ%eªàYÍŠQ|‚g''UÐ_Ë¢•àéŽ)3R‰Ýµë¤J%9¤û”!ÓÝÊr]¼t©®„ô§ö¿ZåŸ*ƒIË<§ÿb‹ƒÁËtØÓy.;#â<]Ç<È §eˆSÀ[:œ%I€Ó©^Š=>§ìÂnH’¡îÒá³eâèÏE¤Ú?X¡·¸ûQ¡á/«<‹š5èü±¾wïl0YPIÿî»Hl¶ß¿]ý ŸKî`4lØðí·ßÎÉÉÉÉÉ;vl£FŠŠŠþîÒ¿^ùqûÿ.N̽ø’Aù }|vúùí¹k³I‡cÿ¤¦tG›´H‹â7Q‹T$©TEßè•xÅü¬/]ÚµVÃ}B‹]ŠUûÔ'Q‘Gô„SIef¨»IYŠvÊ8+5”ºÉµpi?£œ»dòSFkÙ==ÖRFœ:ð’P‚AÇÞw›å×·M¾¹JyGÜgÛ´S“š( Õž¯Ê®Ê®ôLuÅ Q tÌ3ˆçë½û=)ƃTê¹ý’vhPE¢H4¤“ön)ÛÏo¤ÚHúùgµiã{õªì¹;æU«r 0ùøT–T¼í¥¥Y³f%µm{Î?8¿jÕoxK—ÊÙºÖÂÂücÇÒ6o>µxñ¡éÓ7nó³ÏÞGŒHŒ‹Kš<ùÄ÷ߛ֭Ë=p 4#ã_9Ð_vª\˜;;räîðp÷’kµjgbcÍ•’±$kbbî A&??wX±I“Âñã•r 5fŒªVMãÇËâéUœN-ž§ÈË/œœ—‘¢¸‡Ü)}½ëhñŒ²²f–ú+=Þ\'=A¦ÂL}­4Ì oceó%ó€>kíNiß:Ñ=,9,Z}¯âÑ´÷$°çns?²¡“,žû%ùEORã9WĦ¼GdBÙ½Uz.5|Œ„ä/¹}Ç7)"U Ìrgh¤ëëDEîT§¤XŒ̲Æi~Œâ'k¥+ųPÖ¡ú9Z <¡¨Ó*í¡_#•¸ÄÓ5MRa„LW+-ÍóøÎíRo¹ùf§;?5Öã'ýÆâàGž†PdSïE¼>ôÜ 6‡Ú|.âô¦'½ ˜¹YĨΠÊñD3mvµ!¢õf¹@rº‚»Ép­6üZ&nÛ%C=…4RjºÊóh¡Jáéuë,` KÍήF,)2ò€ËÁÒæ¿ÅÁ’tòäÉ;ï¼³J•*UªT¹óÎ;+%lý}¥±òÿú.þ{ 8‰/¼P9§xëV«Á` MMK«Ð|sr.ÐÂ…ì×nªÖLÙåüº¹ËE¤êôV~¹ññÉ"Z×*ëEOg+ô)£UÊÓ#‹Dœz—‹u½´UÄ«õ|Y=5:¡pÈy …Có„I×dÊâ”$‡'üNÏn³ä¸Fé2MðDÔRN¤»h×a¹#r3u Z õS¦g1qŽÖÇ(þ%}•ë~2È6MÓÊÏ>³”<]OÅ+fÜëtgõóõIPŸ3rO…ÍJÞ£›yL/8e—dWJº:˜‘­{œîü‰ÓR é&É,Iöe¶‘ ¥_!›'èÜCOû[Ê♑Ÿ˜¨%F% ý±r:$©$M "f×QæN÷Ù¶hÁƒ®y¿~$‹g›uJã»(=î«ÅcÜ{P¹aï‰:ééqN­š§è+‰®5h䥜,»x¹Ùz-Öý°XËšš:±B²ó§ŸªF |}õÜs:ïÆ¶;V0rdZx¸;v–cÛ¿¿’™{…+00~­ZuOíÚG££SÇ/NL¬0S®HáÁƒ§¾øbç}÷Ÿ³µëþûO}ñEÞöíf“ÉYéÚ?Ï%ém-YYù{÷šæÍ»`NÕÖÞ½Œ›½qãù«¥ç°¦¥åÌ›w&6ö@ddR»v¿•ÀžŸ_ŸÑºµë´_,1N……úüsÕ®-† SùUÅÝ;Ô§«;Šyk%–s¾Í%š9^×UU$êä§÷cUèq¾K ôþpåOlÕËW*=¦óËe–ÞVú´¹ÒöÈu¶­…Zz“âÑŒj2yŒŸ´ú¨jyý³ÏxòI®ºŠ¤$Ëô›îcÕz^λ¯¹‰ë†²q7¯>ÂØán1·ˆæ“‘Ïœçyð·8~//¤Imº¤ ›õe<]JóOÉ*áÛþÜÛ  ÔN›ï9VÀؼÚÀ.ºnbGïdòÕùZ ÙÊ„Ëx®@±hŸÅ;/‡2® ÀYh 9ð ` Ö{È|KÍîøorz1YW8›…Þ`ÇN2šQíºúatàœÈÒ#¤6¢ÎsôñÅXDÑT¦Pp ×ÜÁÀ)~]EÅ£¯ìy]^ÒnF?ÍÖõW·ã­éäyŸHn.qq|ö;²u+½zÃ]wáë{®Éb±,^\2eŠeõjWó ¸ñÆà˜˜ÀŠf¶´´¬iÓÌä|óÍ9Ñ7<<´G*×_zýõÁmÚ`¼ðûYJNœÈÙ¸1gÓ¦Ì+JÏœq‰¡-Z<ýªW¬W/0"¯zu×'°^½€ˆˆê]ºøÕ¨a0¨øË¬å±X,+uãtJÂå8œûÛ5tºßyî×3 €Áó¹èn%98r8p–{ý¤Áh4øùU>!N§l6ìv×Ñ1ðó3øùUþvN'v;çÞk4P¶+ ›Õ]j0àPþ2á°c³º+ãã‹¿?cÙnmfä~øx¶rذ[ >øxì…Ý‚Ó`ôÅ7ÀuV,s€91ð rËŽÃ `ôÃàÞÜi0bðq‹*'âm¸ß~.EXà ‡°ü ¸ª-V!F\ï”›|'N;vÀ_#FÀŽÓ þø0¸;N0àãºVdGFÄ\§Ìü1Np½ö7wUP*€ ƒû+9¡ÄéQ vav€`#F€C”Ú‚}ÝŠD‰ A/>ž‹Vbq8ññ1äWvýK,‚üËÌNJÍ` $°¬5Ù˜Í Uhbf3v;¾¾ÀnÇlÖÉ“Ž+¯ô©R¥B›ìÕëÈÚµ…ãÇ×5*âîƒáÓ?húgáºsÿ‡ù_w°$ÝtÓÑU« ÆŽ­÷ê«åK÷í³_sM¦¯¯áСZ –õÝ‘‘ìÙøq¼ür™ýž´¿ ?o¤A}·¸ó ‡àïËÁï¹²ž[œµ†‡&R§‡¾ Z€ÝIäÛì=Ë›}}»ÛlÚ.†&P7”C# X—JÏü}Øu7-«,¢ýz,NVtâ¦Z« ¸ù(þvµ¤e À+=²ü\“ëý@„íЀ÷(œHQ]|V^£ç`žÀ|7á¯pPˆí96¤Qr#—=Ã5@¥ãø!—âhu?Ý€4Ò¾äK¶[¹µ#],I$ÁÀ;YzÀaæå;#þx£&WÅì;“NJjsÿå<Ø9˜M?'yAô¯ÆD0Âè90f€YÈ{óB¨>€ÛyëKÑ|ªÓx1¡Ý²Öx7ö£¸ö|«à´òËÃûšz´{–O¸ÏxÖ!¾¿ô=ø5žŽ±îÞno3¦8›ê—ñè\š\`-eæ(&tëÏSS ©æÞOÆY>}…ås¨]ŸÇ^çÎÇÊÆÝU Œ~š3'zGóö§\v…»èÈÞ{¹s1›®¸‚¡CyôQêÖ-ß2m;w–L™R:w®Š‹cDDðàÁÁO>ésùååÍ,'NmÜX´iSÁO?YO:§CCC;w®Ú­[HÇŽ†‹¼n·èСìuërÖ­³æäìÞmÍÊ’ÃqAK CBBèè‹•zñâå’“—§jÕ*xWÛ·wêt¨jUW¼À÷O9XŸÿ 5|Âë`ý/—ƒµfMaTÔ‘Úµ}OjTa";p`Þܹ¥<<}zXy}íZzõ"4”Ç©W¯L`8ßüÈ#÷1ýÃ2qÐëÌYƽ7ñí8·"qãk¬Ýˈh>æ×å† Ô¯Æºç¹ª–Û¬û 6'ót'&Þâ6ºži‡è\›Mw¸§Sc2ú0W³÷:ªø£ÀϳùüI쮼†>#è9¨lš´ ϰw @Ë<ÿm»¹‹Ì¥LŸÄıÌðyr$AîÒ¼<æÍcÒ$\?}ããCÏžÄÆ]~z«üüÒï¾+ž4Éî1 ¸õÖ§Ÿ¸ñÆóÃH6“©hÓ¦‚Õ«‹6n4—ûýcHHh—.!ݺ…vï^¥GÃoF˜¥¥¶Ü\KjªÙd²åæÚrsÍ©©“É–›Ûøå—«wíúÛzñò?ʼnŸ:°à»¬CòOŸ »¢ax³-ûßwU¯›.á!¤Ê7ú]wÿñǼ—_®;n\ýò¿‘ü»x¬¿ ¯ƒ% K—C[·úiƒ'Ÿ¬UÞàÔ)G³f™‡öî­Õ²¥où¢þýY°€Áƒ™5«LÀÇx¬&5íØø “Sõiq+±FŒ =|œÌªve|(—y¬=ÁH¡+x9œ»+s$,¡ÄVak Ìð*Œ@¾AÑ` ôuªÄÈAò2¿ÀàCƒÏ(9ɶ›)>JðUtZAH€“?°þ1,¹„6 ××Ôõ8@‡²èQ̹„5 ß×\Þ *.6ëÉ#s¨V å0?|ÀOÓZtcèG4éàÞÄšï™øig0¸±?O¿O„'^•–¸—Y0‰ˆËõ6ýUè27ndÒ$~üѽÌÔ¸1=Æ£^¾)Z7n,ž4Éì1ómÚ4è‘G‚‡5Ö¨Á…°¥¦mÜèv¶ÄÓƒƒƒÛµ íÞ½JTTh÷îÆJË^¼xùØÍ¥ËbcŽ,]|~QÓÛûÞ6iŠï¹©Ô%åÐ!s«VIþþÆ'®Žˆðó:Xÿ x, äöï¢aÀ#GZùúV˜<ùdþgŸ•ôëøý÷ÕËëÉÉ4oNi)ë×Ó½{™ûŸ|É7óãŒ2ñ)ÄM¡]3¿*[)9“÷pmc¶Np¯ÐgÓø{žÙwþ0ú{\±çâÃ-t¨ÇÖÇÜ!«„Óô]IUö÷çòP¸ÐBá†"n8ŒÑÀ¦ft 8d'2‹1¿:ývBW°Á¸ €ÕX†ã oð1g¿&ãJgÐ<#0•¤Åœ¬AÀGô¨A ð›fU‚_å®j„-`AI5©ùXDîBÆ04¢CúƒAØw0.ƒ„wãÝ jÙ$œâM0\ÅØêÜXø%—!ÂV…WBÀJ¸>qÿZyñ'<NBb©ú‘[L{—”Q` âuêÅXÒÙ~;ù; ¨KÇ¥„µß·o_ë†UYs?é[0úÒîUÚ¿îÎVÉ?ÂûIތї¯r½G?¼–é’ŸJ•Z<4‹«o“µs˜9’Ü4 ºõçá÷©íq¤Ì%Ì~Yïa)õ$f½Fp¨»ô×팎e×6€.×óÖÇ´¬ð›£¤¥1k_|k™/ €¾}‰‰!*ª¼•ãìÙ’©SK¦Nu¦¦ư°€¨(ÿž=ý¯»Î·U«‹%]ÙÒÒŠ6lp­$–ìÚuÎÙ2øùµiS5*ªJTTHçÎ>¡¡ÜÜ‹—;Ô^H¹ÐÏW{JÁ+7Ô¾ºë}³or÷ÚÛð/óã£[±äb¥MnísÇ´9—öˆ.zèÔ¬YÙÇך<¹åF·?‚Á`˜ö7Té1¯ƒõ¿üýÏ5A§“Ö­“0Ï™ÓðÁ+ÌûSSMšd””hóæðÎýÊÍØ±DF²}{Ùø•™M㮲ö{n𬙔ZhÑŸÓ©ÌÃC}Üb‰…VÃ9•ÁgOðÄmnñãŸJŸYÆÁ7 (´Òr2g ø"ša‘n³~«øá$·5`©géðü…ÂçÎòQ:ÍÙÕ×Êç'ÅÄnd_-êÆÁ«PöB×—¢`:ÅWâ³’ZU0”à|˜CÇ)íIµ÷hdÍÖ}d· ú8ºøbtâœÈ²Ã˜®¢öóôñÅÇŽ}3L˜®âªyЈ1ƒSk˜VHæ5ÜÜ‘»ÖmŒÉaõºònÕ€4f¤0Ù€o#> £+`fi.ƒ£*q!İ úîÙ`þ¼‘™ TûÒ„›õ%g†!;µž¤Á$0â(fç2–ãJäü|ÿ.aaa8íü:–]o!'õo¤çWG8í¬Ëú·“†½¸{¡…ÌBÒ z>Eÿðñ0óÃû,x«™€`ú<ޝèqM*%f=9ŽÛ<ñ*§“o¦3þU²3i߉* Œá–;ñ+×ÞœN~þ™)SX¸» yszˆ¡C)©r8ÌË–•Lš$«Õº~½»W©âß©“T”·n~Oº²gdoÛæZI,ùõ×sÉà-ZXOžô©^ݧzuÿzõü""\ûV¯îçù7°Q#ƒ7âååßÁt°:?ýb÷—ÜÏmú`Ü–Þuý}i¬ã«–/|è¾ß¶¹kæ·zßz  œ=kmÔh¿ÃÁ¡C­7àÏ;X3~ßêOó°×Áú_þþå›àôéY=vºuë ={ZVZØ~ùåÂñã‹¢¢V­ªà{•”ТgÎ0s&C†”éoL nÚ³%¡lÁgîrަN Ž,¤jˆ[\¸…»ÇÂÁψ¨àÝßcË žâÃn³ï0`>Õ94‚Ú!i%´œO®…onä¾Fp¡…B‹èp}¥ÄÖæãË·ç°ÜÂÍ,¯œÐ~†[a)ÀŠú½[_¿ :pË∥þ`êùXžaCæ>\ãNT·Œcaiú07ùäOej1Åé|37g9¸’OØ;r÷5Ü Ø)ÙÂ+ù¯JÃ.¼ãG¤4f lÂ'¡´Jù.ç€0>æ~¶B4dCOøªX&ç.T@ÀT_ˆ¡ @Þœ|g)Õî¢áב½ÃHþ£?mgPÿ÷YNYÍÚA”¤T›fq¹Çu=¹†R”FHmîœEã[$~žÄ‚qظ²#C¿%¼¡Û>+™Ù¯òË$jÖç¾×¹ù±²ÄöocÂ3ìÛ Ð²/L¤Ç /Èã“ñ,[ÀÉcuëóÀ£<ðõ*¤®“’œ9LžLr2@` ðÌ3´o_ÞÊ‘œlY±Âº~½uýz‡çy@Àêßµ«þ×_ïסÃż"{vvц …¿üR´~½Ól6o²dƒ{1ëY·²/…È·qНÐÎ3¶FÍÒ£ iËÌ;ÝÊ´C ]Ox î¡V \h¡pw aKsk€ÉA›,²Ä‡ m!>W½Na¿™¬Bô!a÷ l¡àiŽ&Ò¸+aÀ ò_d³ÇÓ´ârà,Ùï±È‚ý~ºß@K ™äYÌràˆ&:’Hà$¿®fŠPhÁu€•üÍŒ,"¥&­;gÄtšw²øÁ‡Ð¦ÄÓ (fz£Á§:“é @Üg!–AmÛNrnÙ_j,ÅX  pÇïÀ‘O•hô#>a ¾Äñº‚ËÓtŒûéôÒtÖæìO`àê§èüF?€â æøJ0Ðé)nòèG×3ýArÏR“?'Òㇷ1íYmh|-C?¢¥§—”Xö“F’æNÌzæê6p—ä³ø;f|ÊÁ}F#Ýz10†[ïªø¿ƒe˘4‰5kÜëz‘‘ÄÄðàƒ„„P‡Éd۴ɺq£uÓ&[¹u@|}ýÚ¶ ˆŠòëÖÍ¿Gcµj\gi©#7מ›kKMµ™Lçÿ}ùĉU{÷¾Øæ^¼ü}ü®ƒåãçUï›.Kxø—í5›4Ë;}rZ×kšEßytŧÝþÛÖæ ïlþpüßRï?F×çFu}þåß¶Éɱ_qž¢"ç®]-Úµ v‰^ë? gfüâçgˆ­ ¼ûnZ¥¢jÕŒ/¾¼üra¥ÖòÀtíJz:ãË݃¡!¼ö4ÀȱîÅÀ``³ |ð§LeÆŸ>NH _­eí^·Òº>OÞ€Ãɰ98=‡ûøV‚|™½‡µ§Üʣ͉ªO–™¶º•¡¼ÚÁ°}Ú® fL=CO“c¨çÔ0€ç 8b¨Sx\U¸ß÷ ^¦à 6  U# ¯q* pa#h |ξ£ä—Qó!z`›`.çò>ô–±ì§€†´»žAÀF¾>ÎÀŸ°NŒ ¢V6ûvò®p€á FUç&EGyÊÌi „GCyy>ôéêU>ÌÈ‘„‡³s'ÆQ¯Ʊo_ùVêS¯^à€U?þ8<1±NZZõÅ‹CGŽô‹ŒÄé´íÜYô}û¦‡‡g¶j•?l˜yþ|gV1ùÕ«ÔªUÕ¨¨šƒ×~úézqqWÄÇ7NHh¶qc«¤$¯wåå?‡ÍzUÏÞÀÑe‹£Ë€+o¸Ñy®wþ/çã3ŠŠœ·ßvλú øÿ /^«Œ'ž¨U³¦ïúõE›6U*zúéúõ}vì°ýø£¹¼n0ðñÇtëÆ7ßpút™3& 9|œYóËÄNWóÀ-˜­Œ*÷N·+j3ª?#¾ÀfgãÆÀ›}©_§˜¶ÑmÖ¨:£º#± ›ÀS®#Ä—ÙGXyÖm6ª1ªqª„Q‡„á–ËP+.§òJØ áô€Ý>WQs~íp'«¶ÝA­h¶‘Àf”îçPẇ>¹OOXìu¬¿†Œ¥®KÊÕOÓwU’±í81Ï}¥;=Í#¨Ö”íÄ·'i@HM†/æ®wðáðZÞŽdîãf¸7é>€Ï2d<!lœÏ-™5ŠÒB€ bâXx„Ûa)eÊÜÕ”¥³ËÂKm"y/žÝ&Þ‹§Y+ÒML~—N ¹·7 ó9÷Jª&M?žädfΤK ˜2…6m¸á>þ˜¤$*Î ŒµköéSeüøðÄĺyy5V­ 3& *Êàëk?p dÊ”Ü{îI¯U+£Q£üaÃJgÏv”oÖ^¼üwrUÔÍ G–.Ž._b0/yÔ¿‹âbçgŸe#GÖý]ãßÀø7|¼x—+|ýÑ£McǦöí[mÑ¢F•Œ?û¬äÉ'ó›5óÝ¿¿–o…760p sç2d3g–‰ß-æ¾Ç©W‡£› ö<–{î• ë§Ò£[´Ú¹&–ƒÉŒÂÈþnqþNî™Bõ`½Ií*Vm¿àPã£éyŸÀû{xiW„²¡~p¡…“Ú¤ÐÁ7 ¹¯@¾h›ÉioVat(@1DÂaxÆó%èV²ŽbLðx€qèæ[¨1–†€½Æ–$rÚþ&|0}ÊÊýœ¹œš/q‡?¾BßòíŽÔ¢Ö£<@°v³Ò¿[‰ )ÇÑ­¼j§ôJn¿šÇ'棌(bwW5eª/a |^,á»® áù\‹nÅÐVB5XרˆÜ~X~ÂXê‹ð¿ÀžÃñ>mÆ·—ÒÀšÅî!d, Ÿ¢Åûý¬ù¬ʉùMÑ#ß K>‹‡r`>@›AD_0@I.+ÞeÍDìBéý<·ŒÂÏ“á”u–Ù¯¸³jÔãþ1Üô¨ûMZÀ®uLx–ÿ\ÑCèo…'*Ø»“9S˜?‹ n}ú äá'+gh<ȬYL™Âe—¹ãXUªÐ©QQtëFÇŽ\$Ã]ÅÅÖÍ›­6Xׯ·mÛ&sÙD¿G™ÍÆðð²O:eתu±÷AxñòÿÀIr!%ÿë¾½M;·Z±~Îm7ÔïØå¾Ë~{C:kñ9Ç~/«QÓæw\²¬?Lþù³;‡lÙÒ¼¼þg—¿ù}«?ÍýÿóK„^«Â×Ïζ_qž’çÞ½-¯¾ºÂÛJl6Z´È8~Ü1cFµ‡ªPtêÍ›c³‘˜H;Û$ѵ/[w2þUF>Yf7…7Î{eúýô|… öO¦a·ý)K÷1¤ 3ò˜¦çL‚üØ?œ†Õ¢ÓBvfñLk>êâ6{”Ei8Äš.T÷˜šEÌiªù°·%—ûl°rC6FØNG?€]Ðl®—ÉÀv7Ù-ðBÈ'1áP Žç¸üj9˜ŸaC.–~4zˆ@1–wX˜Y.áÝ‚eÓ  ïG?|@˜{ þEó|8—YìÞΛNlÍØ„{‡‰)åX­šð¹Áà(dB ø…ñi®g2-0æA ÌÃ%ÊBÞƒ˜`¤Ú<û8‹91€üåCi´ª®7ˆãïqh4²Q­‘ßt…[ß÷1ÛGá°Þލï¨ÚÄ}i·ObÕHê¶ãžï¨ÞÄ}êÓ3ÿyö-ø?öÎ;*ª«ûûŸ¦Ð»(ET¤b±b=jÔ$jb7j,±×Xc&v‰=ö5ö‚Æ‚ETDQDšôSïûÇÌHÑóü’çÉ»Âw±\²Ï¾gιs¹wß]¾ÛÁÞk¨c(¢n²yÑw<¹ÏÆú!­–3»Y;ÊU‰ÁÞ‘OFÓ¥?NÕK^i¤¾æÀvölæås©”N=2†Æ-KhåæòÛo<ÈÕ«ú\xÌÍiÚ”N qãß3¶P«Uèr¶”AA¢J•4Ñå>3$ÛÓ§åQ ü/ðžVÈOk¯,œãØ*.øJÛùKý†zëÏ"æüé£C>+_§çö}5;t)_ç=¡R îîáqqÊ'Ü»v-•:\a`ýPa`•Ýþ”)ñwïÔ¨!Û¾½z™¡={ ×®Í72]¸`kfVªÔpòdBBprbÿþbáÅ`&ƒT‰TqÐ Šh:;kúwfèGÅÊý–ó,‰šUØ;U/‰I¥Ýj*[°ð#Ú{ÔŽð<[SN~fèã’AsØÈYÝŒU4-n`bD5S¶é™_ø8†×jÌŒ8]SßukrW”hᲞÞ}ì1œAýA ב'†õX×A \!k)qMÀE—ðEæîÚ`Ü·68Éd­ä„-~¸u .EÖ.vYa%GÞ›Þ"DÂ%¶f‘¤¤°cmp’¹ý5rìªÒÖž€šŒ' —b/ ö`½rYYÀ6¦ 4G×åQ€)°$ðµ!__CöXGAŠùLLGjâF’s­ çEØÕŸ ¬Bû"³#/šºq꣗§…r±/3r_øîýôò¤P÷EfFæ >Ü@C5"u‘C“H{ŽÔ§Úô^‹ák®fû4Ð’ùšúí¹¾˜1KYÄÑÍü²‘çñoÅýk4lK¯´íUìî´Z®_b÷&Îá I T«Éç_Ðo8Öo9“¹~à`®_G—áÞªW®`b‚Ÿ´kG‹ü‡»F£IHÐ&'kÓÒô?))ÚÔÔR¿feÙž8!¯¨"¬Àÿïi`e¿ŒÝÜLÏ0÷eH„…“óßa`ñßåÁúñÇÔ}û2%.^ô,Süþg ¬£ÕšJ g…õoÞÿ;/ÁÄD•‡Gxa¡öúõZM›–*È7N QÍœi¾x±EÉ¡´4ÜÝÉÎæÂ…R=†ðë9|ÂεŃèó5¶–DýB%}ib:µFQÕ&wÅ‹N¾«oÏ2ó(5+ñp.¦2€×ùÔþôB6wc˜¡0n ïãiEØÇ˜HžæÓà*ùú£¡*Å IDATó©#@ªšº$«XâÌ×UÐ$0ýLØm  ….p>€ó† ú4²vSX £3Ø[#¶ô‰–ýŒ·+rà¯Öó@†x ͼ°ÂxùçDˆÆÐÑWà5¯·³]ÂÿùP„H‹&ˆM±„™aÝ©Øñ\c%PñUùPô„/T¤XX“ïEHvd3 ´fŒ²d¶®Á-,}:æëÏNþrr¦€Å7˜ÏÓ}“$Í'q¾B[Eî2œ*†*BU&á_‘° ú|–#6Pårk2‘›j £ÙZ}¸P™Ë¹I„nhô-gcfp?jÕÜÞÍ¡)ä§#–ÐòKº/ÀÌ`ý( 8ó»ç (ÀØŒOfÐs2²nч78³‡_·¡,p©ÉÇ#ùh(–¥í§×Iœ:Ćå$¾05£W?.KUZ¬ÿšà`=âÈÂËӳÌÌhޜ֭iÝš€Ê„Àÿ*• Õ–ßf§ø›ð†éª t–SI+jGûæ©áUê5èú2d™ýÇø¯1¹kµ8;?LNV9R³gϲ%ÀÖ?Ö;¶ÿõ× K—&·li~åŠW™¡{÷T¥I$¢Gì==K=‡–,aÖ,êÕ#4´8ö—€wK ‹¸t¨˜wè:SÁ îÆöyÅÂç¹·*„ÿ€‰ @­¥Ñî¿bZG–¢öûÂùü,å<…«€RKÃ#<Ê`R]V4Ñ«ýø’Ѱ–ò°%UMÎçÐù)bW½Ð™ŽÏÔø¥‘+°Ý]Ø3êC,+Ÿ¡é÷Q"ß‹­˜Éó dVÃøgjY`üHøibm¯$Ðà$¡'¸kŒt:9a Ä¿“*T~À€ÕYÖ&mŽmw¦šc Är2œ"Ä ˜âD  ˆ¸h†©È°¦KEEœÊâ+… [³RO.Ê*›õÂÂd 5¦C°Ú€ÔHYOQ­¨±©¡AwÜ&ÂÇ¡U`Õ¿ú¦:@ôN‚G£ÎÇÚ›v°­c¸&6q˜çAHÍh6…_cd05ô‰Y«P+1µ¡ë<ÚŒAl¸lÒØñµ>1ËÞ…‹Kµ2r³8¹ƒýkIx “Ó²;½FШ‡; ç³ãG®ém¦€æ M‡î˜ý>{n.·oDP%¹ÌÌhÚ”æÍ ¤eËß #V ÿ ¼¿usõw׿_ÜbƼÆc'ñ·X:<¿t>âðþ´'‘ú^„µ||>îó×ö"LOWÛÛ?hÜØìæÍZou­0°þø÷X))ŠÊ•,ˆž3Ç£ÌPv¶ÆÝ=<-Mý6'ðÅÙÛ¶tì(?{¶”;¡°//^½bÏ>//ÒñŽÖöâþùbjî˜xêô¡HIÐÚ:ש5L"ì9sú²À‰ ‰¥é2Dpkþ†PÒ§‡8AÛžÈ÷Óh| Àånú@¡ÝC8ùšö•8×Xïá™Ïò×¸É õÆÊ`G!ƒ³0b·à7h\€¶¼FÛ‰´×hFc6K@vO")h‚åÜiæqûinX-£™1Flåb1öX|MOsŒç<ßË^ šv´kNs@â4k’‰±¢rw¦˜` D³?š="$Ìt (äi4_ªÉ±ãÃêÌÓù×”\Ï`¨@®œ@¶ŠÐ¹O@_(€n°LŠNÕ¡ã°Þ‡HG“…ýP% ±§úv¬ A®ìPBûÿ ‰u~ÄÙðedEÔ‡ŒGHLhô-¾ãõòŒgœ›HôI[:®ÀÓ@ؼ~ÂÁ‰„Ÿ¨ìEïUú;:DßaÓ8žÜðmň5Ô(íÒj¹{‰#›¸t­ÀÛŸž#èÒãÒUÙ±ÏØ³…½[ÈLÇÚ–¼|êÑ¢-ÛМrÞ›SR¸|YÿS’SÔ‚–-iÖ °·ÇÞž*UŠ9ß*P ü£pw¿vÍ+0°ì{Ô©S)]»V¾p!µ];ûw[Öß„¯õàANýúVgââ>°¶––]½:eâÄWÞÞÆú”éN˜’¢õòJÍÊÒžeŒ–ÂÊôsa‚.,¨&2ƒ~’¥Ôµe—]»î;ÐR¡œD'TÝ&£+Ú4¤M°=‰Ø@Fì`²O‡±¸|Hç<ÌåÑ—$ìp@12Prs‘›<¸©áîöâ"g'’ò F[:­ÆÁàåžààDRcêv¥÷j**U-ç¶°{6Ù©x5ÁÄœŽ#hÚ£Ò¡º”ŽmæÐ2SÌ­èЇÏ&Pû”ZaG÷ò0”Ýß´»A&Ç¿ ÍZÓ´5þMÿ~[›”®\)•³U«QQ¥tärlm±±ÁÆ''3OÏß™±ø÷BxÛ½ô—àéSÅ´iñG–-xZµºqõjó•+c&Nt{{ômˆD¢Óõò€.Ö¿yÿ"‘N,[æ=mZÙkT©||ÇÄ(¶m«>dˆ]™Ñ5kò'LÈ©YÓ(<¼’±qñ_V‹¿?aa¬XÁ¤IÅúç.Óés,-ˆ¼Š“!KG©¢þçD¾`ñhf2­³³³'ï°ÚzV¾ü¶Dÿ—Y ¤Î|ž§±¬Ó ÔðÓç0fRŒ¢¦ ”N®ËrC ð×dzÜÅXÌÔ±ˆQàIކíÕl/Ð0(5£LÙ` †6 ]à¤!¿i;³È6Ft »ºH‡ä$Z‰0‹j=±È›Ìõ|Týðì«ç_(ø–£Yä·¡v_ôôw¹{ŠS"Dóqmj…äž`yÉ•qëÂ)r±á%g%˜6a‘5@.!¯øNE–%M«3W„ЗA?51F¸Ú²O‚®YD t‚gP΂;€:’ŒNhâø`{6;ÏÒÊÊ RÖ? A‰©?nû‘»ëO_üNBS€y-üba0˜¢wr} ª<¬½hw[C»VÍým\šMA*b †Òv¦•ô£—7p|.E9Ii5Šblðågqx)דàPŽ#èðÖ†+FÝ(¸zœ#›¸ ëáÛ¼eåçz‹«AÜ &ì*•^.‘¼¯g+1‘Ë—yõŠèhRSIK#%…ׯÉ+KljT$¹W ¥¡„aÛB7ñ3ÿõFÖÓ§ •Jðñ)û²t÷nV@@0tËÊRYY½W>¥H$:ó—¯:WXÿæýë ,ggãçÏÛÊdeyÑöîÍè×ï…³³4:Ú×Ô´Ô¨FƒŸ_ÚǪŋ-fÎ,åž=}š?ÄÆ†gÏJ5áýh0ÇÏ—Ív¿J›/1–~7g€G9W¯Sk©Ùì›Jß–zÍKQ´[±„‡sq7$ö>Ä¡ÚTçâÀß C°ý ¬¸ÕÝ.w¦3(31÷¼ñ2x¤¦q…{­ùÌ êC:¬C¦½—ŒÎbo‹8Iú7ÄJmÀà à>©ó¹£E˜Š_ œ€ç¼^ÁIô¦yKôd-׸v‰KFõ¥¯;î@>™Çù>—tg¼;1Æ©€ÆŠ®È°hÊR \\Bž1YK%Íj²LŒ  %+“JdË.):‹'ºÀ}¨§¡€6‰ŒÎ¨`äô4m­‡ÏÇú½Üåy_1Yàú¶†(o^$÷z“ŽØï¥Ô0„³žÔ›Œ‡Óxiq¸(ÌàÊ|B6 UclCëy”H½ÊNâÄ7oAÐbåH·o,Ѭ0?›k8¾†WM>¢ãê}PöE8*”#9³‡Â|€JNôΧc°©ÄÛø¿[%¡PžNf&™™$%‘˜Hçά T  ¶\¾=tË¿/ZVÿË'OIQ98”½½{ß;t( ºý©¬ ëïÀ¿ÝÀª_ÿJXXÎÏ?×4ȥ̨ yï^ÁÒ¥Îo“ä+[¶L71EDTªVͨäP»v\¼È´i,[V,ŒKÀ§…e³ÝÌe÷i:6åìºbáÖ [K"ÄÚPÈ8p;»nÑÚ“K“ôÚ´|7ð:Ÿº0ÚÈõv 0_Cƒ«<Íg¦;‹ \t^°;?SnÖB&XŸÏجńÚSÃà8ô€@øt1%BÏÒ ïÀJ^í%ÅÉj9#Žñ|+2Œ–ÒÔkàÏÎñ Œ/h€Þ_x 7¸!EÚŸþ®¸9¤gyÙթ׎‘bÄÚP¾K⺫¦,3Ç( ò)ãÕd˜áãÎ 6€@A&_*¸(ÂÔ†Mr}þX| çÁ~ÚL2?By #g¬¶!7džjrˆIÆ>»¸þˆØ @SÈã Ämpü„z[è}…ÜGÔ¯¡øÍÁ¢zñ·˜ŹI<;`çEÇ•x” ¿yy㉹P­!}ÖP³Äe!<¸È¹MÜ:†ZàìE»!tŽEéB¼lÎ`ÿžGHe´úè‰ð%ñ×[¨@Þ…<…ÚsÆù¤¬¢Ê–òè¥,MÞa ý_ V eÒW€/ <=‰P©ºþ)ëì_»8:UXÿæý‹D¢;^ æëkñða«·#å—/ç¶immmô왯]Y_kß¾Yöéc²©Ù°0üý‘ÉxòW×bù‚•Ì[^6ÛýuÞŸ™Ãáïø¸­^(´™É•pÆucͽ0=Ÿy¤ä²u C Lî¿>¡Ç~̤„ÄÝ@¡¡áQg° !³ <72iy.5¡•@žÿH¢‹˜\™åÛ²W&G‹l§·º–Â×à÷@gc¾Ix…Ù,-Â$b‚ÉöÄd+µLëyxŽ8[ŒWh‹1p‘ðƒÜ0B<Šup„“œ %TŽ|0ƒ«PÈ á+ä{и5CDˆ´¨CX˜J¨ öÍXf‚  á)_)x%ÇŃõrt{Pg3£€½ ±â;Sú „A°d°P("k Úx”·0‹årC"¤ï$nÚŒ½qÛ‰!ü¿“ð1¨ó0óÄÿ–õõòg{yº›WgËðIÃ…ÈJä€GŸàìD2cÜÚÑy-ö†”)A ô0‡§‡H„ß'|²ÛW ‘Ä¥œÞ@j€Ì˜æŸÒc"n J©iµÜ¾À¡ ŸÒ'Â{5 íÇ4n‡·ÙÐaI¼±åפ¼jÄ üG(RiLFü Ûß—Ôûmˆ†ù?Îð·â¿°¼ò˜s$bÑ }òâœîµôôù/|èW_…ÿðCì!U·o¯ÿ§ ¬ßþ†Å´©0°þÍû‰DJ¥ÖÝýR\\áéÓ:wvx[§S§§çÎåLšTyÅŠ².®øx·wj^žpé’]›6¥ªÙ?ÿœ}ûÊ6Ïy“í¾ò&Ž(–ÿô £¾ÅÑžÈÃXdá/ñ›€VKÈ*ò÷ܦÿ6¬Lˆø'ƒQ÷Ù/ì§yU®A迗Ƙk„¤qñCZ;éÕfE±ä5L k‰¥ànÍ£P wGGœ¥¥A±¦™³Ì@ à7h — ý;ß$¼oÀZÇðžfOžSØëeÔƒa·ÂI¯…ÍšJG¸sŽ0)’ñtöÀ~á—Ç<6ÃlCì°Rˆ=Å*E>´ä3@ƒâ6s3ˆ0éËäX*ÒŸ1®€'RìÝYkŠ.D%ä²2 2g’“uB˜߃–¸²´ä-"whb½#CÛ™¢Hž÷¡ðbcœ—â`ÿå=!´9Ëñ^V.ÌO tQ[´Ûã7›Ú_é¹µ­Š ü6Eb)£h³¹¡:U‘ÇéÅ­B­ÀØ‚Î3i=º81K?ƒ†»§9±–õ| îþtA›þÈK¦&rzÖcSIß{ÇÄ ÏúÔ¤q;ê"ûýôöß3¶<¼‰{µ V6Tv¢²#V6e­^³¼Äùÿå?;u£@è7mTÓÿ1„Åe7˜§ëþ}è¾A…õŸaýر»¼™ó{2 =gœ/Pê{†šÈŒ¢–´wµûÏ›1¿22T®®AšGZùúZVXÿsüÛ ,A¾ÿ>fڴȶmí/^lò¶ÎÇ… DH$¢ÈÈÚnne©—,É›5+×ÇGVIZÂü¦yNH~~ÅòóWèøæD]+Îv×j ÆÍ‡Lüœ^‚õ§&oeå1<¸µ‚7)’ÝàÄCz7äÀp½$½ß $ç±¶3cé… B™w3~‚@-Ðì:!Y ­ÊVÀ²df$PIÂ¥wT¦¡†_mèf ðFƼðGÑ`¢rÐ ÇñKœ€\”“N¦  .“¨°‡k׈4F6™®®Ø4ûÙÿŒgVX e¨%–@"OΰNƒª4¥7 &ÿ&³²‰±¤zS¾•bh)ˆaZ·Œ°pg…9ús϶æ‚ÖŒ/,™oàL]“@ ã`ˆƒƒƒKÉì‹&‘Ö›1þÔð­’0ƒ”µ6Sm F:2Ö""§ób-@•ÔÛ†ÔÀ›z—›I°ñ¡É ªv*þî Ò¸º;? h0±£Õ•0Â2_ql·váÞœ—÷¨ÛÆS³9eø” [9·…Üt3kZô¦ûxª–~9V*»FÐ!î]áå“b¹±)ušà× ÿVø6.ÏØÊÉâö5®ÿÆ­«ð4òw5uØq‚öq’û{X³»ÕZØK¿ýyÇ"üª_ê?ð¡[‰õÇßaý´û>øbDÊ?ÿ¤ Øtw÷͸R’f®;‡7ü[?tÁ‚èyó¢?üÐáäÉF–«ÂÀú;Pa` 99jW× ìlõíÛ•åÌݵ+½Û]»j”R*…:uÒ¢£Õ«W[Ž_Šö}âDV¯¦cGΖn÷ʱ³ôëÅîõÅÂGÏðïVKÈ.ÈM øŒæe ?áKÓ:.ßùäqt= AªãOøh?¦RÂFâa  ÖÒâ8·RàÁÎ6zµÈ<ü¯QX‚Þ] žr!‡–œñЛ!ßæ13—JbÂìq2ƒæP[à ÚßNx¿MÎ8žiS£¶À+r§p½õ¼{Q¶pé.1O¡{½/Jµ›ÝqÄU¢Ò†˜`ÄqŽ4¨èр΀‚ì›LÏ#Á‘u­³±T/˜—Éy²,°AŸ{TÄé,Æ(ŒùКõ"tÆñn *èÛôaAm:ÙC(:`2«z–, ó0/‡£ÉBV ·ý˜Lðä#<øU&®øíÇÆÐxy‚ãÉ}àÚ•f«°t/M åìâ®8úÑi5®-ŠGŸ^ãü÷<:©wSUkHË/ ø y©K •‚ÛÇ9¾†Èë"õ>x7³‘Bøm\çNOî7Ið¬G£vÔkŽ_KÌßÍÖ¨GQ!Ù™de’’Dr"Ù™dgò:‰×‰de’ɂմü‹{þ¡ea,‹DN6Æ‹õ]wNP|f¡R-ä+Ôå<ƒÿðÁÿÓo/–~’”UTßÕú‡õ;®NÏSmî!—ˆC! KO=‰JÊu´6žÛÝ{`óâ¨nȋ̙‡ߊÉÐ BÃ6 {ú´ô*&"ÚtùÅ·§ž$g+T³ZÞ§NóÅWJ.ã÷¦ÍÈWÎ=q2,99»ÈÙÆdx«êÓ»xéòÊlääƒä¹G#"s]íLFµqßÞýí´‡¤¬¢¯?ŠHIËUT²÷ðsZòIm cÉÎPÎÐï­¼ÌòÞ©–¯P›<îjgúËWûm IÈ,Êû©ûï-òU­ƒ°½W™ø½ó_ Ô˜}ù««éí9­Çì »ð8E$õp^Ó¯ž©¬Tm\ŽJ½•VŽÂ;‘œU´éJ¬@ég«ˆá-k8Yÿ9GoëZö­k½«lå-(ÚêÕ/&'+._nÚª•ÝŸ5°®ü©e½ZUXÿæý¿¹§N\¾<¦o_§}ûüÞV‹Wzz>V(´wîxûû—õñž>­˜6-ÇÊJ|â„­mq±af&îîddpþ<%Ûàê²Ýó ¸tˆ6%<“W±r>Üü#Ã4‡¯óéRl̉ú ÃpÍE&ÄÑŠˆo°6,§ßö>¢YU®Ñ·|žCý_ÈU±ÿúh(ÖÅ2.{[á(HQS/‚dß»0¥2€:gp^A+íÐÝ~vÃ0†+ s“½3á})+x%G¼OÌ€[$/á0›†¨ hÐnà\8¯l0ŸJw;ÌŠŸù9™dgœ2P† xÁý‹lÒ¢m§ui’ö˜M¯¹cŽKcæ£cÐâYýš="ÄU™^ }a ’ë|!##ж˜†ô"ô‚øŽ€.'¿–Üé ¤~XïGb ŸUÆòü3òo!’PeNsõþ°Â—„ö%ó" ³ð˜[\ ¨.$|-aKPæ –â3Š†ó‘•°Ý£OpfY±ž]é¼ëêÅ£)O ÞÊmä¦[ЗV£¨ZŸ2xvs›¸¼‡¢|[GÚäÃ1ØW-«©C~ïp;èÝÆV½æÔ¤q{,ÞñšñßÇX2‰¸k½*Gî%F,nïíd“’ï>ýܧÎGï%ªµÂl`}ôºóÊëo~u²6~£Ðhí¶^"A)–¿¹kŠD\šÖB÷|ð*»é¢Ë…†¨ “ˆ¯}ݪ‘› p.üu§ÅÓV²§æ*Þ,£œi{¬½ùëý¤’+\ÐÓgN÷Ze6r-:­õÒkÚ÷óUŸÕÐÁÒhûݵkOÒÔÚbµ¡-ªoêWþ å •³ò’Ëû=5µV~qÔÎ\æbcòàU¶Nÿ÷Y¾UÎù×hÉG­M¥•ÍC^d¾Q˜ØÁ}åguù}|s,rþ¯ä¾ý;1ï#ïozxÿ±lÜøräÈG Z…„´àÏ3¹ßüÏ×ø»hú¯7°Êrü;1aB ™L|èPÒóçoº¸ÈF®¤Õ2ujüÛ£]ºÈœŒnÜP.]ZŠÈƆ©S¦N-~®ÎÌø `ììâ,`þ—xTÅÌ„-%(u?i·dæ1m{±pl[šÕ$)›Y¿ 肳7^±î¶^âfÉwF^ã•ai_U§³iJ‡é_¯$l¯Žf&p;@ »¬qsEÉ·†ûÃWP=@w³—!Ú†meŒ‚Q|KŽNí3zQIv21)¨€&Té—€°‚û/ÈŒI{ªd’·šS9räýéo‡] ûÙ¯F Ô AK‚臣L°÷e¤Usy̤\b¹0Ñ™±Bß& /È”ÑÜžcF8* N£‡†d>€KP.B[Ð}§"ÌÆcw‰;ªPÒü)44d•UÇë2ã4$Íçi'T¯LªÑô25Æ!hˆžOXò 7b‰ õ§Ó; ïZÂײ¯&ákЪõ žÝý˜vK‘™}’|šÒp®<èµ”¥¯qïv(r¹¶‰E XÒk›P–¸DÝý³‘Ÿ³‘j¾d$qx_Ô`A7‚xûÖffI£vŒ]Ê®»\ÎbÃM§^sD""ï±-3zó=²|ø4dz1’߯ÏÏáþ5B¯rÿ*wÑ A±žõôDk{¬í±­Œµ=VvXÛ#ý{Û¾OVâª.ΓN׫juþÍ_¹“‘´ºKåñ§Þy`ÿÇ”Ñt™t&!³ðé²îæ@trž××çߨÙ~u"3_URß­’YÌwSÏÆ¦<[Ö±¦ƒð<5¿æ´s5*™=ÿ®#à<ñtbVÑ›Ñg)yÓßkZÿo.…¾ÌªjkÒÃÏ©­w¥¾•ßDµJž"‡q§Rsñ+;;۔ǯ‘[¤ž~0üØýÄäì¢7÷þ?œ¡œ¡rV^ry¨ö`Áu«Zýá"Ë\%-ÿüë4ïÏÿ ¾«œ]ä8á´X$ÒlëYÎéúÿŃuôhr¯^wkÔ0Žn£ãn¨ð`ýð^4¯ÿLZs×®ø-[âæÌñ°³+ûä°±1š>½òôé S§Æ‡†úˆK;þêÕ“~ò‰ñÁƒE ämÞ\œËblÌüù ÂìÙ|ò Ɔà»LÊÚEtüŒoVÐç#œ [=ZÓ©©úìMÉ”ÕìZ ÖtäëO™·‡±¹¿©À׉éYxŠa; ›ƒ± «'ê²ë!ƒqm¨>P¸µus!ž SÀɘÍuéu—)´µÃË`© Wò¸_ÀØWì¨ÐZÆts–ä1#‡S¶T#…ЮÃ4X @Cdó±œIö ²k!©‹T‚è;ÜIÁbâP]¨7—ÛiÍáö2šÙ 7A6žÎßsâé?q~,¥Ù`3€?óóžçøG|$BäKù÷8ñÛ¤È]©#ż ‹î³<‰·™ãÏt]¿B;ºaõ‚¯Ó9®!»KÄȨjljL*¹›N7vÊð‡pK.ÿR¡+L‡ AdõnäÈMá.Tw°>€´€uwLïó¢y׈nK•Ù8ÎAdD•ضÀd±ˆÛDÒAÜgPcb9€½Ý®ðò7'ÅÙ®8·£é*l},œé¹ÿáœ@R(Çy„úƒñìZLLZÙ‹^Kéö Opm‘A\ÛĵMTó§Åš @jxæùâHF"ç·ð*Š«û9IÈI3k|šãÓ‚Ú-ð(kl™Yø!ʃëÜ",˜¨PŠ ˆ-Ý*Gciƒ¥ öNŒÿ¯·"˜?­›Ô´½ù,#ôeÖ­˜Œ@O;˲•(ºÈ«­>úîæP*.§P]F?9»H÷Ÿ„Ì"ÀÅVÿuèl‘„ÌBݯiyJ ªa´ªm©dƒr¦Ý:Ô¿ÿ¦Ç 9ë‚bÖÅT¶”Ó¸…gÙsY*à·?qßíWcuÿ‰Jy9Ë™¡œ¡rVþ§Ô¼-Þg‘å ü󯃯‹þõ¸Š•1 ý£©[ײ‡÷ŠÐépãYƅǯË×éPÛ¡©{Ùî å.à±|y 0i’ÛÛÌX`Öß K__‹*;—ºqcÜÌ™e€qã~ø!õÁƒÂ}û2úõ³-3ºh‘ÅÑ£EÛ·LœhæãS|VdíZîßgýz¦L)ÖïЊž9z†i ÙóC±ü§™’Ú½Ù}š!ÝŠ›@Ïø„}WxǪ_™f ŸÕ…_B‰HâÛ³Ì7t^×…ßb¹Ïê[Ln à`ÂÆô8Ï´Û´sÆË g¸°+ž~÷¹ˆT„\ÄA7ü"Ù™N{KúÛÌ· QÑ"údrÞ T†ÃÐ Ö@=À`LÃQí¥`™g°·Cl…d%îCˆ:Mº;&©,A<›€YÜ|Fön}K3 ¤˜L ËwBâf‚FÒ^ŒØ‡~ôÛÉÎ<#ïLgÀŸ®j”8ÄÆÎŒsÄSŒÔéø1޳!,ªÃW:Ö´ôä§gLÈâÊ3ÆÖd¥æb¬mÙŸÉHAô1ÐÚH$A°¦Â·pö£k³c2i#²ú zHz,–b6@VÏK$-"yIóÉ»B=HÙQ{ ÕF9•×'‰œAÜj-ÁÑP“X­U;ñ#wç‘Ä?¼†°ãJ®-~—‡»šNnzbîH½4Yœ›%5ÆÿSü?%)‚›;¹¶‰—÷xù%GfÐdmÇw6´u¢ï\€‹ˆ&ò:ƒyAÈ)BNÈMqk@í@¼›S»%f¥ÓÛM©Hý@MGQHømcIŠ%+ÌT2RÈJ#;¬4”E¤%‘–ÄóRâÿ'ÐËßù泌iõ‚ÐËß©Í÷¬í·5“%gÅgºU2bRJ…þ­M¥éyÊì ÝÞæ´1“¦ä(^¦xV1bÓòS½š¹,)«xÚ'I¹ï9m}W«ðEíÂr.E¤î¹wçyæà-÷t¾Ÿ’¨l)Ï,LÎV¼±áÞ‰C! À±qM;ש¬Pk-GŸÊ*gåJMW@ð‡‹,åŸ$²eMëZ•Þ3ÇÈÈW®{Wx´ î¼ÈÜ3²‘½ù_æ¾~=ãÆL[[éàÁe¹„Þ¯;úߊ ³µºèõš5/ŠŠ´o‹,pfÏNP(ʾ÷xxH¾øÂT£aΜR÷M±˜Å‹/&£tBËš…˜™²÷(—‚‹…Õ™9`Ô·(”z¡Lº/æï#6E/”KØ:±ˆ%§ 3äZXÉù©+À¬‹D¤ê…Ug°'j>¿„ʰ³u¾T3á^6‹žê%îrV»ŒzIt€¾µÄBÌoJ¦é“¬h › w Ë^‚¥Òx4£ÈÒ½¨ºa¼€êbXOüU²S$ói\‹—äÎçvjÀóqt6Ãø/抮îÆç¾ô5Âèw®qÍð¹=½i©FuŽR‰Dˆë2Ú“Ï´YÍ^¦u¼Ø,£r.¡Oª$ajËvSú d0¸€}ˆ`<C ¸ à~K’ZØÝÆlB9Èì…6@$Áé<. u"÷2õÉ6´I5¯EÀ š\À¢ùϸכëMɼe¸døŽ§o ¾ã´Dnâ€aËÐ*AW 8ñ/¨;{oò’¸¾ŒµîìëÎÓS%.HGz-åÛ—ôßHÕdri-s§‰ {?F÷Z˜§¢Á/<Ëaž?ßøëÕ‚3h}\kFCÆm¿ìÍ ¡)× -tn*i“B`»5ƒ ¯¯#a#¸Â]ÐÝÀÞ0¼Äl®¾4m$m Ñ£íxÕÄH§h:7^SPûy4’!bIYÉ)ªÖÔþÌÐ:ЍCÒ¢íHÇ&4„ߨúŒ»NxðQe}6±œzÌF¡:Ýj3\„P‘ú”±…<“áäÁ:ctéfï¤!²a`¬C4¤èÙÃÐfbäŠõ>d††6êTb‘}D8ŒÅå{D†/]PójOæ¢x "?Ág9&%®¨¬HnNæÕ+Oáö)%‘t{›x° u!€…u0«·.Ë—÷¸¶‰;{PäXV¡é ZÄ®zYÍ7(È!ú‚xÌÓÔ% UܨßïæÔiM¥wü ü7Q~ÊTI/Tý¹¼ÊnXÝ&d^þÈAõ‡ Gî%~¼þÖ›_mLta&þùð×KKºÖ«rhLcàYJ^Ý9K>øMeF·ç¶ÑYlÇB{®+žÖÅÆ$>³Ð'–3íôCáߎ.¹Â>\öjTf#ÁOÓ[~{¥äýìû>u¦tò 4º¬º~æ¡>†e"3òªb—mc&ÍXß­œÊ*gå%—÷žj¸È*ãO½ÎÑÛ—eªË?ÿoÊ_KÓõ$9·Îì‹*Í;^Î߆D, [ðAmç²é¼ÿ¢£ó½½/K¥¢ØØªT)ŽáþÙ¬ûÿ÷¥¼…ÿú¬ V)Lžì,_þ\û®B$±˜Å‹€… “22ʦ8:ŠÇ3fÌÈ-3´|9b1kÖðüy)ùÔÑxÕ$"šµ[õ’àà`™”Ÿ¾F$bñVž—¨qY=+3ŽÝâÄbáÒ^¸Øp'–.—Ð숅œC,Ö{0—òskŒD,¾Ï-ƒ,ЖIn¨úÝ'×°› ®Ôs·€¹‰zIS«-FesÏð¹Z@ôÝ¡•oÁZŠè'ò Ï{‚cGl ÐL&&5`‡ñBÛ HÚ Bµhê8Œ¢ƒ£Ë<>Å=ݱµ¨Õ•®Ày·ˆµfH]Ú'uŠUq<ÔiVçÃL#åD+T€”Jžl4£Ž’Ä' ËG÷Ê(²`²%‹@”ÇŠÈ„è‹)­à ¬l‚æ`põ÷Â>iš8Ò[“¿Zˆ¤î'q^‚Ȉ”õ<ëFžát‹$¸Ž u5§ –’tˆË><[†ÆbíMçÓt8†•ÙÑõæt'²K0‚:úÓu#_Òþ;l=ÈMÔ;´~ÌË+¥rRªùÓ#Kãé³Gr’9·ŒÙî¬ïÊí½¤Çò6L-©ßŽAKù.˜½i|s†Þ3ñ D*'ù9g7±jC«1²ë†sã0ñOP¼£ºöŸƒ:½–,‰wÖ ½A/§ïzûV±26–5÷°;:¶ÿpßÊûG5òq²”‰mÍdŸ7©úÓ }Û"wóËÓ[¶õ®d*32“KÚ×v¸úu+_ÃC´‡ŸÓ²O}+[Ê¥F-<íOMlf"3jMùÓ.þ¸öô.ž®v¦2‰ØÕÎtl»š—n”@ ‡Ýþ‘|œ,å±W‹UŸÕܱ¬u¬ëW¿…§½‰ÌÈ×Ùòøø¦Ë>õ­jkâbcRþ å •³ò÷ݼK—R—û€ÄÆâæÆŽ¥9w™Q3ptàÀF\J|àÀ¹<‹ÇŃK‹…k޳å<–¦œùKCŽìñŒ?€ƒû†ãfHˆ Žã“ƒ¸Ù°²#M qùé·9‡•œÓ°”(´4½Ž‰˜Úl2”(†äÓåÆÌs¤£á&0"››*¤çì¨$H†¨°Ê°Â¬"¯âï°j€P¢N´#^‹‡ð’ܯ¹é†•-ò‰ÔÓùœ»•KŽØ6Ä­=úÕÜæöe.[aÕ–¶žxÚëì!ij:tðF_Í—ÎÖXá&BÔ™Ì-EÏ™QÈ3¹òµzÿSg²-£1Ö¬ó&Žpú‚R`-|n«É]DÞBdM™b½±Á…™wƒÔÈ:†‘¦T]ƒÜÐÛ(ŒãÉlâwc׊ü§ÔZ‚Ë0$‚hU<ÙNÈ,¤–&á1€€%¿•ÌíµDC$FfЉ~Ãð†É[š:‡Ö­]ØVÅÌŽç7±rÄ=ïvx·ÃÞ­¬~IhÔ¼x@XÁD“ŸàîOQ>ñQÈŒ1·ÁÌ;'l1·ÁÜ['l1·¡F=L,Ê›üÿ[èŠÑLdF?ú_¯¥(…W¯ ûö½Ÿž®üõ׆^^¥†þYÖßQ*éý¯÷`UXe·¿eKÜðá=<Ì?n-•¾##òáÃB?¿H‘ˆû÷½}}˦|®^?qbŽ··äáÃJ’ñ„jÕ"/S§èÒ¥Ô!ŸdÿqzvæÈÖbaj&µ>&#‡=‹øÜ@ã®ÑÒj×#ÖÍc‹•mgç-ZyriRqS™ù6[îÄL  ÔÒüWî¦ò¹;{ ¥£òð¿F†Ý èg°—¿fj<•$„ùà$P´Ïàš’Ö2ÎÛé#߆V (Íð>‹œíä;btûʈT”ˆ 6¨ª[`4Ù³¸Y„º+Õ¿ÄWwìžmã0€VÍÑSÚ_åêoü&AÒ~Õ©®ÿ¸p‹Ã@Cºû¡'>È!ö6sdZQ³óäØêxV¥p@„¤:smÑŸ}%!YÂD蹎Öü(ÃÐfˆ˜«Áð-+Ï“ÙmF.XïEf a×’¾•„™hrã0 ǯ—¸ß¥_%r Y!¶-©½«¯ïEi„¯æþR Uqjƒ÷ÌÞÊWÍK&â7Vý@jFÏ M•·òŸòÒxò~%ü¬žÜAûx¶Â« ž­Ëv•.š˜P"‚‰ºAækžÝCYXžþô4ì"D"ý¿%ÿ£ÿ?‚ ÿá]ÿy/ˆ0’ !6B,.¶Vß ­Fÿ#”߈K3ÄÐký­«OÒ|ä9¤i•ÌÕ¸ýQ¿„¾nâfssv«2š†ùÕj}m±±¬´š€V‰V !–#*(#¨ú½‹¤ˆd%v$ .æ%GT2_[ºH™ŒKø …îòeLZ-ºO‹‘¿ù-*-À©HO*¬Û’ #6¢øCU¨"©A( (QFˆ%†ÃµJ4€±Ä°0 ‚ A rDF†OW ¨õÐs“h¡•H»V (A&¢â}jÑ€Œ "-jäF¼¹s«µiL%Å÷Æ"5j-F"J&Ü+Õ(5ˆE˜–ÈïPk(R!yñáZ‚"01.NÌTj D"LMJq­ÆÆHJù … R!‘`lüŽË¸ @«Õ"—‹Þù$Û±#¾_?çݻ˺+ ¬* ¬²Û×h„ºu¯FDä®_ï;fLõw8nÜ«uëRͯ^õ*CZ¤Ráë›­^¿Þj̘R•Ø+W2y2®®<~Œy‰‡or Þ-ÉÊáןéÞ¡X¾õW†-ÄÞšÈÃØÜáOh0ŽB%§¿¡³!›*«€: ˆÏduoÆ *44Þ̃×|é¯Ï|žåà÷ ¹*~nÍ O½pKÃb.án žµA ]žr.‡–æ\òÔ3>$k H#^ÃWf¬3x¶v Âyh­;ðé7PÖEz ;cD@ù3ybUÆ ·ã’6Ÿ;J´½ñ`0§~ãñ~®‹ ¥múʸsœ»Å-)ÒþôwEoDsã*»´h½hÞ‚þ:Ò¬Rî07S±À\ÿYB"›“Ø"G†;1Ð ÂÛ‚— Y©ß#s&X0ÞИí„QPÞpƒ ˆ&ž¬Ïÿ{çeÕôÿϦ÷ž@èMz“P¤ ¢TPA&BA°PT€  ¨t%éRBÝÐIh!Ȧ÷M6[ç÷GöÎî&õý½Ïõ¼×¥sí»sæ>{·sΜ™ïÌ`8ÎøÌÄw–mm3¦¡‰&û;°àZƒ³ mk ©ëIœ‚>•5GÐìsÜí|995™’4ò®¢r¢FoZާndEB,$"~%‰Û3@xQ´‰KUácÙ·I<@â®rP¶Ê-[ÍŸz`«œ :´yhóÈM#Wcýž—FŽò=7•₇õШ·ÎýÉ¿¸y¤XȪ4•TÃéaµMôÅÜ>Iânç®ÈÌÉ…ÚmhÚ‡f}hÔÕ–ÞžÒâ?ýqÏŒD‡ÚŽ*¿¾Ûy࣎&íük$|Ëõ5µ ¢î34CÝ62(Þµ™²¬9ÒšÎÃÍ.ê¾ä<÷Þ³z–½ÚQ{)>Ýl­¥±¼Ž%§¢6OŒÅ¥1V€už1—Ç;2œ`©;Ö]T1—o1ÑD¾7­±Ø…ÀŒ>ž…™œuÆ#‚©aXËäÝáüAV›1ÖçÑÞŒ*S°ôèײ6´0Â^ãµ²bV™|Nl!%m©7–>eð9s8mÀò,õGcÍ)¨¦h<·ÌÈjV¬Å )ZŠÖ§Ý×ÇȃÇà ‚-Ê{¿OOÿ\~Uª£sÓ˜¥!Ì…‹Í©î `zžàD‘ÕØÑÁzìíBÚm£ÀÀÊŒij=v["ƒ7áíÊy¥°pþ>Åláð$z(žÕœ"Z¾Mz_å»J›O½ÍþÓŒìϺmÌì\šõ ;—_V0Ìî-†eófú÷g×.~B‚©M›,•Š+WB7®ˆOÿè#Í'Ÿ¤µjåyî\³*“/\¾\Ô¶íQUBÂã V,1ò¯‚õþU°ª¸ü_Mþyuh¨Û­[½ýüªˆË(,47mz5-Íøãõ_~¹bʆíÛK Ê rºy3Ô¾xŽÙLÇŽœ;Ç”),\èpÈ×k?“:5ùîÓ“Oö±¶¡Ï8eÔ³|÷‘Mø‹í|°†A\YF ¢¨í¼Ä€ex¹q~&•U;!‹ö+Ñ™Øñují ^ûoÔƒhªèm/ŸgC*­ý8Ýͺ#Ì2ñh©F> çcÜrÎH·tÂJÆ(#z2| Áp«B”‡¥?Ùw1¿€çWXÿã4…¸eDÆSëª)ÌŒ¨MÈ«4}kvŒÝœÿ³Î8½É“­© Kìyλãþ¯UÇš:ì.²Ê„±mz3ÆWÀHÑææ‘èŠoG> TÒØd²é_€%ŒkóþwGSÆ|î»×Ûí±]Ëb°¸Ñ5oœ(Wz`\OXQ _qbÁ­7ëq²[zKâ¹÷Ú8¯öÔ^ŠO[«IËí/¸µ‹L¢ÑtkƬ2ÊŽ'q%7Öa.ðkDÓÑ4…G¥t8¹·8÷ç¾CWVø9Œ¶¯;dv¨Lÿ[ÊÖƒ¨TK^™fSEA&ù™fS˜E^F–{phqþ¡TÃ?¿ëw¿PÛÏÿ1•)U·Ž“ÇÍ£U(UºÒ¸'¾˜J¹º‰“‹È¸|SÔ?F?è¶>ÐÉÉ¥]½€)ý?ÓFÉVg1pç7W’zÀʩޕ–ïQïy[ê2 ûW'Pt ¤7-–àk—Ö”CÚÇd-C̸„>“P»Êßö/˜{$?àTî >ÃàøB ¼¤ðÍE,ѲÌnt `ÙÉã7ËÊÆçóG2ZÐг,3`¤è,ss­cdV Víã*‡O°Q–ôêÌ0%^ÄZ*4ˆ ×yÝ íçìÈAÛŒZïðt™ùê:ùqJ‡©?õÞRö$7(Ë"ÌCªìŽvR:–<'XKPoÜ3 €=ÐŽCYò±&:åoa®/3•¹î¸–^7°¿?ByÖçù"‰ÚžœïNYC£…ž±œÌà…l¶V(ESD«oÉÕ±rc”ºhzæs9•IOòÅ ¶§ôÒçür”^­9ø‰Í"µn¯Î&ØŸ„Í„ÙÍýO ÍÚ<´o/ölpx³~ÿ~ýðòâêUêÕshêÛ7wï^ý{ïy/YRñµ¼uKߪU‚^o‰‹kÚ¹³7UQ¿~§ÿ=kâÄ‹5¯Üúw¬›.õ·é‘¼‚…üƒé!—ß­[ÄΚuýA?ü êjÕ.æå™*·ö铚ɓ *ðÏžggqq‘sçøf³<)„Ësø×ïŠGgQµ—ƒgì„-Ò}ª)¯.v~í!J:/“ÙÆüò„-¡ŸIºÖÆ|ù#­6K‰ÑÊ)2J“ÃB¬Œ¿bû£P\ã¥çuÙoc®+4⪑£zå|D"Ei.R~ÁWÅÐPÒÂE³\l¼Gr:ˆº½¨·KV93N4eg¤Äþ*·Ë™Ûät”ÄŒ“UWä^Ç"–Ͳ9Z¢?“ϲìÏÛkåý‰Ú. tÊ™DwZæÄJäny!Cl÷.Ož“Î{6ý~\—€‘kym«ßÈußsíà¢ti«‘ðtiY*‡ìnj‰ÈÅ©5R¤ÈÖ¢?(éÕEƒ¤‡Ié^‡'!ÉÝ$—êˆQ«$y¤ÒÚµ7äL¤Ä"±È¡G$=V*PIºœ_ ?Õ“$ùÎ]ö‘´ãÅDĨ“«›ä»ÎD#sœd]¹¾C,–*„í)+IŽÆHÌ™$QØ>„KÌ9#Ùwþ¤‡ÿ:•j%a¿ì˜-‹ûÈ87Û%¼é"ó"dëT¹¸CtÇ`Eʹ!û§Ê ë ü¼šìŸ*ùw«,N•ó d}MëCùÞOŽFIî•Jb·D=Dy¸D³É¡ÕbŒ%rÞ_ÔH¼«¤Œ“ãšîJvgÑ )œ-b7˜%FÄ]‘v"7mGˆ&[ž×H¸FjÊ"¶)K~—Žj‰¸#s, ¿X2Ë›±yPÞ(’ûåg¦–1#cղîsÓzY-Ñ‹dQžä•1 ¥ä#Œh IDATÙ%1 å×R±N"ÉRø’ü)±_Êy‹X_¿»Rú¤\Œõ‡r»üJ.‰¡¤…‹fÝäðŽ"ÕERN¡EZd y>WÊßæ £¦m¢¤ÉGRb°1=%DŠ÷ rKccfçKØ“B„üà8d÷þ!„‹WIr4ÅÅÒ €|ù¥T Ý»KA˜žm®Ø&Ò¿ÿMPõÀ1øÇÙëï¿';[_¥ÀßZÜäÿÀç®`ˆÈ?úúòøOÊS©b½½wk4¥U X,Ò³çuPO˜R¹õüyƒ““ÆÍ-íÆ c…¦ñã¤C19*fñ—Ĺ–<ÒE.%:ðç¬"¤ñó¢³GIiâó‚)ÛNؘù%Rgš%ŸÙ-÷f‹ô^+DËÀŸmÌ"ƒ4Ù(ÄÈø8S/XÙf§ |)¨%ð¼Ü²» 艹.÷”K(i)‚Èsv ÂnÑÕMMÑìÛÁ›$3BÔ$~¿ä–3Hʉ ±ûl³«l’“Q󎬾)Ö2‰éGù1Z¢×Ëz{+W4dZŒDm’è"¥[‹˜/Ê×±¹SÞ•ß˘F]ÉÖ1Ï|^ïO×xmkÙ§OW?¯á÷ë˜!™º! ×H™)b7×ÊZoDšˆ\°±M©’ý¸h³E‹ÅN‡s±¤Î–s¢FÎyKêl±8¾KYûåÖ•ød)¬´T[Ìr¿ì"+­‹úÖIˆ£¶¢¤ˆÜ;![GÈ\w«¢ðuc90]’‰±¤ a‡ó4ÉÝxÙÿ¥|3@&8([3‘ÇȱUri§Ü>%ÙwD_ü'½ý‡Èd¼T¹wQöKÜ÷²uŠ,è,oºØNõ-WYØE¶Ï„}RZÕý±'‹YÒ/Ê©¥òËó­²Þ±5ÝåòÏbª¼\Y¬Oa•‹õ)ll&——TñLZ¹>[vyH,²Û[®Ï³ÎA `¿\m!jDÜè#º«ŽÇ›¥8FÒÃDƒdÔÃiû#E†Ù)ú¶gZ*GÓ¥µFÂÓ¥u©±?íT‰QK„ZÚ§JL9·Pîì—×b%òyG'ÙÊšÈ1µJÞL›oÃvÙ>Oæ}!_äˆUy)ý\Ù%1seK±XoWªhGʾH‰ýDΚu(Cô‘r)BÔä¦Qa¦‹¹d„‹f¢Øöm«Eñ9i»2 WÐHóL)P”!ƒEz^Ô2è–æ}„ìbeá-ÛÅïIUŒ¸¬’é6æÒSB´„|&iv¥ø»âú–8•c6•U² ¤ÚËB¤|»Ûá ½:[ˆžcô³<ÿ†. —Iš2E@Z·ƒÁo2IË–™ Y´¨ŠwuË–\PžÏ̬¸|”‘Å"íÛ…ØO?½Y¥€ü«`ýß ]„¼üAƒÔÛ·§[wÅŠJE߸rE×®]¢Å‚ZÝ´mÛŠ.ð×_ÏÿáÝ /xlÞìPÕµ¨ˆæÍ¹ŸeË7Îṋ™·”öm8ö«Í"m0òèn3k sì .ÝÁ„U„qå‚”ø­‰<µ7gÔÒRñë¥Ñú[ru¬ÀhÅ*ŸM—_1ZØþÏÖ³2—$3ñ*®œïN=/¡·Ù’G+ON6ÅÛ À ‘¹ü®§+ǃñT$CGȆáå$¡ý‚"T±„4Qð¶«H‹AãŠj:+³bI^ÉU'TЮáeý#Gã¸æ‰ÛûDÖ!0bÜÇ>5jO<‡3¼V$x ù{ø:‡û^ôg|½ºÁÏ7øTy±1Ã5âÖï; Üv[`t¶bY]-†)ǧ”æ>ÒoÀßu.b˜]iÈ·ÎÔV.å ƒKà à=…oAû9ú­Ô8‡ã3¯Qv@.0ÜCó!9?¸7¢æ|íR^‰‘;˹>S*Wê½E“qqL­&qm×VSš àæOÃa´O`¥º™¥ù\\Ë©%x… Q8¹P­ úP§+u{âþÐàp‹™ôk$ÅY=‰%yÕ›’nW*ÇÕ¯@¼ ¨xUßkâU1„þO¨$| %y”äQVÅ÷¢L+мŒ|BÐfãäLí¶4ìJ£n4 ÏJ÷­åÝæönàÎaJ²ê?Á½8š¡Ë$ªµ©(o( i#W–’—àäF½giEÍ>%Ò¶0 Ý=PQëeš}†{u[»þ&©’·À£1µáÿŒCÆSLÄx ·>8ùà¿§òyC /BøÁJ¦ðME,-ón»Ó=€¯SÎÆp/²Ø¦Â¹.cÅåpù,óLÓºƒikB€U)\vÁýI¢j+®=ºŸøé>÷Ðàiž# (Ű˜]wȪFÀ ðÅÈF7•™èÚ:‹®8y˜Æpý¥­ñ^FcOœ=2˜œs;ᶉ WTÀ1è† ±2EÌ×äÄ™*ãé½{|•I¸+êfÖà‹ðäieÓ7”]­8ô m·’^ÂÂNLQžêµlÚÅ 3±y/(.5½‰ˆy\Õ0­/ŸÚÕ$²€-q<цýsmSñ‘sô‹›+~¢i=›pô—Ìù’çú²y¥†ýÊÚµÃl&.ŽÇr}°bEÉ[o4hàœêî*)±´hqõÎÊuÆŽ­ÚiþóϩÇŸ¯QÃãæÍ^^^UCÿ®‹0ù/Šþªÿwþ«`=ðòoÜ(nÙò‹…K—z4o^uúĉ÷–,ÉìÚÕçØ±ŠhwÆÜ¸qVq±9Ü£‡CÞÑmÛ<??¨i—ê¡°ˆ&Ý,éYNkóú0ÿÔeºŽÂÅ™óh®Ú[„Þ38r…³~’MxìzVãÑÚœžŽ«2ô~ºÌˆmq_^bò)ݹ0˜:>Ï«ù-ŽïjÄÑZè”HB)ƒØÒЊ͵Ð1›$3#=Y§,¦GáI0Âz%½À8òCWçÝ„)ˆï%Ü_O†NËx¤ VlÅ®ÿÂMœfÒ>‚0À‚¬æš$_<&1 œ@ÀŒyÛHpÅõ^(ËÝè)ÙËòtnºãõ4oWW]åiH½ö×?÷ÚZàç–Qçjt¶"š/^Y<ÿÃ/µŸ Èçm3éN°ÄòÕ´¦ÂW ‚Õ(ð2ŒñŒÃxÀµ=~‹qëfß?E‡¹7Ý%ß'¨½Ï–¶V}&×?äÞÄBpw‚§Î4œ°ŒÜ½ñ ï>!ø„â†_˜NåîédA›MQ…éÖ/EYh°‘“ >!ø†âŠo5u%´!ºáîó°£ÄLúîáîî£4ÏÖä_—z=iò, žÀ½’fV†„»¹S1€wMšŽ¦ÅÛÖÒFöd.&õ2v± °3-–ÐÁ&`)&ýsÒ zœ¨>jm9ióm §PºÀ¹.~_àQŽø ¦€ÚÃ/ Ê3©ù¼e@ .>¼çËÄòpŠRR’™n´hqÒÕe–?ÖW1“çøÂ‚¡:]Ú1É 7@Oñï,Ë Éï§y§O×bw?«Êe²Ðu gRõ(ßÙ!Ð?ØÊûhι­]Ÿ2üsü¼¸ü u”®7Ðv8×î0o3ìò?'Ý¡e/ôv®-îßÇ6 ,ºwçÄ Þ}—¯¾rxeŠŠ¤qãÌôtËÖ­ƒyàHÓ¦¥.\˜áuútSgç*°íƒ¥yó?’’JV¯nóÆ•f …þ®‚uïÏ¥þ6ÕþWÁú'_ÿŸ¾‚o½uyÅŠ»Ï?_}Û¶öU ™›6½ªÑø¡Þ«¯VLJ4gŽ6:ºèÑG]Õê õ¡Ÿ{Žß~cèP6ntà/üêÞ´µƒ¹vŒ;åØù¬ÜÆc­ˆ[MyWÉ´y—"[¦3XR•Òúcîä°x(ž°õ0|+?_¡s-[hg÷{—ኴ2óŒSQ•Ç6–WPÁ»ðyyâ‚R~/`¢…gjð­6}.—Ý),0S¢2TkæöµçC«‘³‡¥ùdøÒŸñþJxGYëY_Ha(¡/ó²~<`$b˜ÎÉŠà7ŸÎÞÖCË»Ü<‡¶6îßÑDIêÂR´ )òAµƒ¦¸EЮ@?ˆU ¿—ŒtÉ¡XXêÇxeb¹¨£Ë5J,¬ªËheÐü‘CŸSìëÄ sÞyfž%Ì“‹ƒ©®øfbÞ1êpáMÊ+VŸ¼ÍSK(5rb*êY™Y´|›Ì¾Ϩ'mÏêÃåÌ_CˆįÇÍ.¹Cä+ì:ÀkÃxÿË­ZÙ|ß~˸q„‡“@€ãØš>½hÁmçÎnqqÁ¶å7oê[µºj4ʉM;uªzÿ³tiò„ W›5ó¹t©çCJ;ÿ]+í/Šþ ÿWÁú'_¿J¥²X*,µ”™©oÔèpQ‘éøñ.]»VŒ,£ rgÌHmÑÂcóæ†ÞÞj”N'M›f¥¤˜×­ 9Ò!&üÞ=š7G«eÇ pèð‰¡:ÎØ‘¬°‹4,ÐÒ|š,bfe—ƒzÙ.ÞYA¨?W–¦ìÃ]':–S·95vJ¶£üRÚ¬ ¥€¹½˜iÍÍIV)m¶VÂÇíùHñžÊ£Ç ̰§#O)¸ßòy> '»ñ”âeÚ^Êà<œ 6ˆ~Ê´õ¬€p8ƒÕ§ÁÜlªçðŒÆj ´ ÓH>D^(®«iRw@`—ö’â…Ë<:7»}s>00H±xÅw€@Oz>nÍQ–†ô玪pêÆðfXƒÛó¸¾öÑî¦LýòÓ“•ˆJ;ª[pëíÓó}ª½u¾,£º³ºˆ¹‚Ñ•6|묤à‚;ð"œwXãmkª”Pü5ÚyH*7¼ÞÄ÷cTvsšh²–#&\‚Ÿå>ñÜ]IêÖ´ï5©3šºãp«xÆVÖWä]P9S»­Þ£æL e,æÞIRŽs/Ž»G lõÁ#°êÃÿ:éµfP”©Ø«2ÐfáLaºÕ¦åW ßP|Bñ Á'„‡ ¿Be–ª”ãV½ÊÞRU®T5|’€úì¡ð6×VVt¶š@@³Š’¿qw%Ù­É«ü#¨EÍ—q¶Ã ŸåÞ{ŸðîHí¯ðîdß ºõNÅ’*<^Àï œí3“…a þðXmZ‚¡ˆ¹Å¬ñài;)fT úT¾Îä ÞuùÈÙ:Ö*:ÊËäsÑìai1ùAÔìÇxo¥ŸTRâ§JjQk8ÃË22TiK.ÁTV¾½.¾ŸÒÙ7¬ãúö!òÃpýަ5¥ðWt«(¾ˆñ{‚žÄ°À³°šÃ ($UšÆsMt¸Æm=o†ò­r“2õ´=JšžèÆÌVô™LºíÀ,üÞ'•Dr'ïÓ} ‡^¥g]+S«§í\,Æödª]áìÁŸ²íO¶eïǶ·òJ/c2st]í<ÉÛv3x4þ~$!ÜNsNO§ysòòز…Áƒ^Ÿû÷ÍMšdétrútH‡ë^¿újòíÛ†-ŸßЮgvãlgÝø>±Gú$?µ1ïfÒú] KØ8•¡ ò§<³Ë„'X<Ô&‰«¸¶Š’47j>IÇ ïIP‹?Iwn,æÞ îáΕ܈m¨Û¼BðÃ; ¯ë§²ïò?A¥ùgR’MI%Ùh3Ц‘ȽS‹mb!ͬزz=ñ©ºÈ•J4¤%í(¹—Hpñ¤á‹4Gh%0€í)(™]}›S'ŠÚ£pqD€‰¬oÑ|„¹'OÂÆ>Ó!¡¿9…¢™è~p®…ï<šxö€ >€y婨KÙYÀd …ÎÔä[WÅ-ä°+…O-”zP¿Ÿz*èÃ¥Mæü!k*Ñv½y£_fPÝu3j*Ÿù·øð¡n\èA ÅôÒA~I¢C(qÏâªø¢bYuŽG«sj4nJŸ{¯ÒïkÜœ9;ƒV V“K«wÈ-bíD^Q ]Ë7óöBª“¸…;,î´y,\FDkNïr˜¥÷î¥o_¼¼¸r…úŽ6ÓÓ§;g{x¨®] ­S§âðéÕëÆEGט=»êX£)}ä‘Ã:9.®kçÎ33?úèÖ ^X·îÆÈ‘UÔ£¬L*•*û¯ÈýM ùÇ[°þ¹  R© æ“O:|øáËŽË–Ýyç+Mšø\¹ò@Ÿ÷ÓOßÜ·¯pÚ´êŸ~Z±@ቆnÝr<=U×®…Ö®í0¨âãéÔ •Š3gxôQ€ãÇwëÖ­DG‹Ç¹soæñöë6ù”tZ E[Âo‹h·š¯ü±ËñãÊ2ª)võó÷xlF3»ß¥¯m¦7Óq—2x»ß({LzÆr"ƒÈ:ìèkïË-ðóš2Ã:c“g¦C"IzF³®ž•Y$tÎæª‰ç<Øh=<:ĊéÊyî¦t,yø ÿÊü›i ד)m…÷r%ÚÈ€9š3—É Çk]‚ð Ñ}ÁŽ ÚÓpÝÊu¬;Üù…_ôèëQïE^t·ñ/²¦!mۛѣߘ¿Vª-§ùuò÷ ÔoÀ|OlsS ë ™)\hÈ %ï<¤ÀK Åð4|†Í“@i,…0ßpïƒßR\ì²þé’líDCêÜY†î€“5†P¢C½k‡fRvså+,ÒŽZ™®¾„u¢fªw%¬Nd,!í÷⬰-S)ÁMȹ^…¤‹øÖÀ7@<ñ­O8žV¾_Mœm9TËÞm‡L:ŠÒ(ÒPš‡.Ò<‡ŸÚ4 ïÛ´={ò«Eá}Рµ»R¿~DûZ©DCz©H?N^¢Õ»W«…É4Su*W}÷×qg9º'ª  n!•£ÿL]-Ú/¸•7Þ“ñ™†Êàl€oa4ƒ$X‹RÓIÐñI1«žñçK'%öÖLq órÙÓ¿3œ°öyìÔ~çÇöçVJ·{…Ã'­©D{wf¨RÀÈæpïJ×>J`‡À.ÎíDíŒó;ômFMÀ‚|Îùãhüqû”.µ—} šU¤¹¢ZL£Ç”3LÄ8ˆÜ,¯àµÀêäô=ÄØeï]§ãÕ|\á`0Ý•½ß¶|^HÂEÅÁÆtW†Åé|ºÇavt RÙ.-Oàíã¸qn0õ5è÷[ô߀›3g£h¥øÓ²µ´šCz!_á}»'ùÌv«‰ì@ì,3-›æCÈ/bËg ¶ÓºnܦuoŒ&â~ã±P^oŽV­HJâóÏ™<™ Ô½{Îñ㆙3}æÎ­5µgOAÿþ·BB\’’ZúùU½u=úÒêÕ)C†„oÚQ¥@>¬éÝ{'Œ--5¹»ÿ¥]J¥Êûs©¿Mÿ*Xÿäë/S°jÔðJNîæöÀâßF£´hñÇÍ›Å11­£¢ª®à_Ò¡C¢‡‡ÓÍ›-kÖ¬¸€ œ·m[éë¯{­YS1^i–.¥CNžtØmßàQøùrí¨ƒwÑ&-¦Nu®nÂG|ˆðÌöÄ3°¿Í´ ÏÛÍÌߨÀ¥Y)ˆÉ«Y´_‰ÞDìpžQTˆ{ZÚn%WÏòn¼¥(û²èw†nAÌiÌã ‚ÿ’Ž.×(¶°¼o)­d3²É±0Ç—r;Ýï Û ¼Lî:J¦Qà ˨,™GsMƒ¡#~Khä† (Å<‹Ó‰äÖÄ{]pòÐnäÄ%RªðýKX&™ëY_DQa/󲯲QÎäöï|SJ±oqÓ·Þ¯[PÕbmO¾n²çË>Wp«É»a¶LÙ¹œÏXwTøø³À“A¶VÂd(/˜S•LÔeÇ@É·ÍB Á¯×ñ‡“Ýrn¸OêTrÁ·'~ýy—J 1“¹›ä¯*¡Fà\ «MáÞï¤%íÅ÷m|7?ªw£zÂ{ÚþO”-“ŽÔ3ä%“Ÿlµ•™‘Ê>JûUIn¾øTÃ+¯êP”f=¶8‹’ì¿T|ÐÝïj6³Y™-¼-¡-ñ~ ÅJù×I?f½ ÚßÕ—ê] ïA' mW±Â`eáwcê¼AíѸUª®-ò¶‘¿Íš‚Á«-µ—âcoË,ƒ[MÁ’*<_Æo¡Cê6Â4¸ ÀhˆF)'eâVcM$ªp÷åCoF—VLB23ôÜwÆ»3‚°!‰Š¸›Àš,ÎyQ­{S–²EâÙÏNP y}í IDATEðL”¿—ýì?ÉIªþôo¯º,XÖs,ŽëÍ©ù8-ÚP¯ì\¿æÒ~R¼q™G熊䉬ÏHqBõ)õŸÀj\¹ƒé9r2±ôÇ#†À²éí.t‚ ˜‹”>eäñôÂ*F+ÓZ•SM¦ž—/ Î'ª €ÜÕ<:lGgâ§Þ¼¤ì³Khõ-éZ?Í», CW²9žnøc’­’àšýŒúŠo®,£¦ÝC<…m‡èß•]K{•HY`út, U+âãqu[›6•–ætóf˜ŸŸÃF]„öíÏ+Y´¨ÖĉU›Ø¯]Ó¶juD¥âêÕÇyäañ¿î½ cÿúâþ¯‚õ¢º‚ÕºõæK—rׯï=bD£‡HnÞœ6th|X˜û­[½|}«(ž r{Ë–¼qãB—-«¨„ݾmnÞ<Ëh”3gB""†]yZ¬o¾áí·Žð*;÷óÊÖÚm³…N¯ŸÈû#ør¢ŸšC«wÈÓ²~#·2-B¯/9z“áÙ0Ê&üYSæÍå·S†ê–Û 9€‡3§ž£2Å,JbR"aQ[ñŒýœËðd\·•ûõôËÅ›yAÙ™/„iàq(}J0‘+ªï ì­X›î¡Åõ\Œ½ X@'T@1ÆœºMA}üæÓÙW Ÿ’¯Ù}ŸÜ¼ÆÓ¿&VgY>ùëYŸCN#¤ðóHÛÃÒï~¬vøPÕ¸Ñ ôNŸzSF* л3•í¸ -`ªŽíXÝ… T”ãšïà X5`68&IJd£Kñ20ã„Ï,¼ß¶«Å Ú8îOBŠ)¹‚Ê€g ‰Â¯*ÄzñMRVso5†lj £þ»ø¶¬(YFÆ›ßÅ‹G©Þš}¨ÖµêR†¡¿kªÓ”c=¸x8½þÌö—¨ð¶õJ++U63^GœÜª8Ö˜Çýu$EÉm'7ª=KÝ(Bªz ú$²W‘ý=¦LT.xw ø5‚G9xN ‡)œˆñ"€k'ü—àꘉ³ð> 9|6?²ŽÍLJ\h@Œ+åˆ{Éä—û|%½hÞ€yî¶„mÜå÷V9áL›V¼UVòÜ‚å8ë¯ç„Ëã¼ÚH)mnƼíW¹êŒóó<ßB©h¼šCçHvÃ%Š>­”7ß‘ð·Ýqþ˜NÍ•!¶›Üh’fR÷Y¬;‡tÌÏ’ssÜ×X¶kÒB7¸OÁ.åíO·Ð>›T3ã½YªÐTi,7 Ožâž¯Î¦ÊÜ ¥f:mçR.o6ç[; éÍlIà‰úìi«Ó¼î¯~Ÿ—fQW™åÊ'Ï “ÞÓÖÃî8žyoO®l¤^ ÿç_>ŽÊ±ÞW¯ò裘Í?Ng‡<0 Ò¢Eö­[¦U«üG®˜4qÓ¦¼aÃn׬ézófKOϪ·úžÍxçz_ý€aÀÍ›M›nruuÒëGÿ«`ý×韮`­\™u4""D­ôpá®]ãNœÈ›;·ÉÌ™U{µoÜ(mÑ"A¥"1±EÆW…É“ ¿ü²øñÇÝ®¸ Þ¾AƒªH‹u÷>Í{¢+åà&zuµñ/Þ ýHD8½–» §ïðÆR¼¹ü µûHr6mæRTÊÏ£yQ‰æ¶O¬ã;<×”ív ·¢Ž²êÍ9û<^.VÉgÙI[?âºRžÓîýû,®ŒøLËÔ"|Tœ ¡¥¢9Œ†ÕPÎ@¹Áá —Sì‰êg‚:*qF7ÑEq½ó`B§+zúiœ¼¶)s•,;%è—±÷é^¸¿ÃÓ •҄婽ñÁˆp¬v‚‹i©ífœ²<‡¤‹“êÂÇOÔ¨©¾Ë\3En„×gžM?,[ö¦ ºJËp&Bí`ôtèÝ”@á$ô¿¸4ÁïKÜNì!;†‚]VÛ‰GB¢~—J¶‹žŒÜ]I¶RÏ?‚úã©ùªÛ¥JÒI?FúqÒãÈ>g³!9¹Ô†Z}¨Ö•ðî¸ýÍL¡"}Ú «Õ ÁlÄ;ôÅ%fò¯Y5HÍak`y†Ú‘êݨՇàG+Zªì©bðf-ꌪ:xSŒäï ;†Âƒ`ðjKÈX‚GâdgW0Ý¢h¥›œkãûI%¸•½F3ár\Ð0MÇ6*©ò&òî]@¨ÂV‹÷Êsˆ˜(¹Ì²T޵èÕŠqÎx`M%º2…+.¸?ÉØÚŠeÀ°‰MI$yàñ"/Öź)_Þ¸¿m7¾Örm ·\púˆ픚ÍG)ø€$32Z/+‰r±>{ÒÓ«.ž#"o¼qÔ/¿|»rS^ž9$$4¿þª«Üúì³2dˆ\ºtÉž?çK!\Z<^±ÒÂû‹„ió’ÃMžûDˆ”È9̘£B”L[q¹W „hùþ¼©3IëÍBŒŒ± kË5H£CB¬¼lW?Ñh‘^×µtN½]ŒÔky‚FêgH–R1G'ò˜"]ÅV1Ç"2IòÃEÓDҮإ¹(EÝä\„¨—‹-¦1KJÞ‘;SN”JØe— ºí'(zÑ$Êëj‰ˆ—Ž©c_Î(72¥·FÂÓ¤žVV9Ün±ˆl©§6‰´ “*¿Ñ;$£¡5Ž,§/W0h$m\ªg4Œw—¤!Rð€(«re¼ìñ±F·í«. S¥8¹ ÉŠ§‘)wvÈ驲5BV:YÃèb•β5BâÆKÒ¦?FüËTáÝþÿ"³Q²Ôry‰ì"?ÚÎ<ù1\ö‘ËK$K]õí²'c¾Ü‘?ZYoÝN'9ÙG4›ÄREQ1Ü—´J‰I䜇òPÉR$…³%Í]4Hš·ÎK…!¯™-â)‚ˆ§ÈT»ž""¹œ)]4ž&Jd‹}S¡œ½(}ÕqAžÈ—cöMyrã Œ‰•È=2ô¾üQ~·u¢ýUÄHÔ:™œ%¶ÚvER´BVDKôòEš¤ÙõSü±lŽ’˜é²!MlÁnåF¤Ä>';ψ­úŒZ ;˹Qk7` ÅÒW²ÂEÓ[²òíFÍ D‚DnØö¨|A#u3$Ó®"ß´û‚ZÂ.HŠ]á¢Ÿî ±âºSŽÚ½’›’„ñøN.Ú1oç‰ï|!Z~²Xf‹ô^$DɳŽmVì"%d¸¤;öÿ\ˆ#J»ŠÈ„YB¸tè'fGþGÝ©^]ò*æä˜ƒ‚ÒA³wokǪUY nÜøŠÑøÀ×µK—ãûñÇ7$PFyyzŸ5sñbÎßZÜÝàóW0äßZ„"òá‡g fÈJe%ŠŒ<±ï¼Si9Tèþ}ƒ§ç9''õ… U€ûúk-h6Ì(-­8RRÄ×W@~ùÅ!>¼T/Mº áòùrùbÔ DÈ—ëøš zIˆ”8ð|#DIŸÅ%´Ö^¢Åg¾Ü´››®äŠçj!F~²+r•P$~{„Xù&ÙÆÌ6JýË‚ZÆÙÆÕY¤C– ‘'s¤\÷K©%RG$ÊNI1‰DIn¸hZIz’MVŽH~G‰õ:»y¼ÊJgf±ü(G£$æMYyTlMbÚ*[£%z®Ì½,—÷-^2ty¹v¥zu˸ƒÞ•K"’ŸŸ/"fÑ_‘˜X‰Œ•ȳ2Ï`WÑÙ"¦T‰QKµD\—· v-¢+™ ×Hx®Œ6K…¢Â%" D|Eq/v•×DDÄ Ú%’`-ë›%æL©Hf)Ø/IC$Þź¨_i"i Ę]IRĘ/É_ÛŠîö’ã]$q†dìc~ò¨4Wîì““e{G[ѽ2ekgÙÑSö¿ ÇÆÉÙäòR¹¹Aîí•ìó¢½'¦*6 URÙÝþKd1IIºä^͹½U®.—ø%î=98Bv=-›[Ë¥êç†òÇërý)¬boS‘L%’}X®GËÉ'äh;ëíÚ_S®ÏݽªøëOÁ,%k%½šh“äsZEY+R]•Èû, eT"›Ò¤¾FÂ3åq£\³Ý1§JL¼õUc»d-b¹-¿í’çb%ò¨LЊF”»](Y¿ÈG1õ“ÌÈ·;$Wr¿’¯¢%z©,ͱK2¢‘Ü©²!Jb¢eS®Ý@Ø)É‘;Pv±S¤®KÉãr>BÔŸÚíptb$Ùá¢é,™vÚÕw"]D\Dìg¦ÅZA#ži¢¶Û@nÏ•Z\âå°-£‹\,ïÝB¬,·+œT þß 1²Ò®~«Ù"=¿¢eðF‡»h¿%¡“$Ýn¤ÞÉß!B¤lrPVåÌUqî .åÜ5þåDq­#εäœã"ž.MŽ¥½Ëèí·óAÓ¿{Î\»ö%PoÚ”[¹µŒ6oÖ@lXؾ¦o(£Ï>»1O=µKþ~-Âÿ# ÖÉ“'GU¯^=WW×ððð'žxbˇ=ÆÃDwïÞ4h¯¯¯¯¯ï AƒRRRþ·ZÿgôOwŠˆFSR¿þOf³Ü¼ùbýúU—Ä)£¿3,+ž3p`Ào¿5¬Ðd2ѶmÖÕ«¦Å‹ý&L¨xø’%LœH½z\¹‚·]ãþ£<õ"^ž$¡n-Ï úÇ˃Ëi`çXüñ0¯,Âß›ËßP[±7gÑêc2 ùúEÞée~q ¯Òµ6G^§¼*÷ Œ;Ž¿çíâq¶§3X‹ŠýÑSñV/¡ëut¾«K¹m[c¦}6i&{󹂨¸ÏÃmx–+ž#òy‡Ñ×ÅùW‚«)þ‘=äήé¸CÑ NaìE­‰´)~ÚË…mœQÁ3D À\#Èœà„js⺠­“•œô0¦OnûgU8ugxS% )Ή‹|e¤Ø“°vL´süræÉq!¨>Ñ~t)oÒ±¹€‚Á•æ^ŒðbxyÅ’²›s`5˜!>GÜ•%튗ƒ §@¼§â=U%€1•œõd-Ç „³ù $ ¿ªÂÙrrw†²öY9*'|𨠮÷Äóϰh¦b²ÏÛ`[>u(¸ñ0ygÜ­¯x…[¿»â­üô¬fuštòÐç¡Ï£$õ»ýO]¦­¼O•Ø ³žj]©ÞZOá[ïÏ®HKþ)r“Gîq,¥V~ÈS¨TÔKµ¨*a+iä¬#k†;*w>g8Dáû Üê1üW‚[‚Ip€°ºÚ7¹\È3)fî{ñš³U BÑ@f2j9¯Â©:£Ã­R^3XœI<¨êÙŒ7œ”,—Ô=|UL~(uûò®§ù‘FÚ6S\ƒ#á¥8“Éü†ßµ”6 ìúz+1(‡¸¿„‹ oÓúiÅwŸ‚~4×s1>MÐ\ê—Æ’·›Òê8ÿFpmeDo…a`Ÿí*)ÔÓ73üÀ0þw­”N×(4³´6ã÷lž‘ÇH*ad-ÖµUn—…ž±œÌà…l¶óñá!júré-‚”nÓˆ˜‡ÎÈ–± V\ˆÐw6ûÎ3¬;¿L±õ`2ÓñÎ_gÊ+,oã‹Ð뎜dü(–Îux´¯½ÆÚµôïÏ®]T ë×M­ZeY,\¸Ú²eÅwlÑ¢ŒI“î·níyþ|s§ª<Ø&“´n}$1Q»bE«±c6rÍfyä‘_’“‹öìé×·oí¿›Éý/ÀúÛäù÷]„;v|õÕWûôéS¿~}­V«V«§N:pàÀ9s攟êƒúÔjµmÛ¶}ýõ×Ç,_¾|íÚµ.\ðòòúÿlýÓ¿ –#Fúé§[|Ðæ³Ï:=üQ£.®YsoèÐ7¶«R ;ÛÔ°á•ÂBs\\“.]*ÆÛïÜ©0 70ÐéæÍÐà`‡ñd63`™™ôèÁ¢EG ‰bËN^ˆdóJþ°élÚOß.ìq¬uõÜ'»Ê .¬|Ç–Œø·‹<·WÔ3h¡6óKiý-÷ ùô ¦ÙáC_<ÈÆ$:„rüYÊÃ+§$òyÕÜQw§–€ø1‡WîàáÄÑÆtPôÂzåbÖøóºò~þýAS <òF‡¼Dî MqÙFp€²ll&ka¥ ¤ëäÍät)¦ÔC‹rë0W7rB'h9„.åKßÎý‹>ùâîé6ÔK-|šÜGÍŽsìUGžkKßòÖbÒÎñY·œpiÆkõX¾ŽÉLæ£"âÁ)œ7£R·Š‰)aàJ?>¶/]@<¼eIZÂRèíÐnºBáûè÷¸÷ÁcžÃò¿—‘)ˆ%+†Â6ôOè»Á¹ÒÆÀTDîQr“{Œ|5½­É«!AÝéCàcx?,¶À\JÑJÒ)ÍD—…>‡ÒlJ³ÑeQšeýnÖÿI'€Ê™°NdŸÃ\ú„ðÁ#÷`|ͤ’PC( -ô^‡*¤ZR¤*EEŠ" ˆ j¤‰Š èÐQzU&ôPC ÀBHƒdÒÛL’ésý?$“9g2,ÏûÞÏs»~ó!Ù{Ÿ}êÞ{íµ®u-[ô¾ ÷Ïà#tÑq8f»Xuµ$$À ­Ðj"&ºØH°R¶à‚¦î𛉡.ÖÏû2ÒÀ 8 _A9­S6 3ŸCÔüÑöKà#@©¤GQ·UÏ»¼ è•ÀgÖËK1£w.r,XZ”3úÄᾯ{a·•AJ½ÖÕ¬°½EáXsM«#òUxY·$‘™è»F3N¼Ž—¬Ÿ¶É‚ç¾Á­Ìì­ÓmoeC06ž@A1b6Â[ð5}û+¯G3Ü;OAàÇÎxóC4¨‡¸PÔ´ÆÌ™hß;wÂÏv2jT~p°þÝw=6n´ÑÅÅ––-£³³M§Nµ~ñEÇßó¦M)sçÆ´iãó¼‹Ë“P¤$Nž|¾mÛÚ±±¤RÉŸU°LÏØôψó?ÁJLLìÙ³gAA9 ÿ ÷õã?Þ¾}{÷îÝ%S§NíÝ»÷¼yóþfí_–,¸u+gòäó~~5Ž^³¦£ð"«¤§ëz÷¾Ú¢…Ç×_·ó÷wœ<çË/Uǵjåvð`‹Ê)@FŒÈ/)aïÞ.?þh?¢""0bºtÁ÷ß—Ób•IZd/ m+,šƒQ#lå™yèöÚ6챘*à°Ì*ÄÐ%¨W “`Ž ü­]P¦Â§6Ž¿ 7ëVêL"^;Œvõ°öEô²*^zt?‚f5пV•ÇÁBŒ¼‰ =¼\ÜÛxŸógը-ËSÜø¥K4hí„õµÐÛZxxèŒLµjðUäIÀî‚Wu볪½Èn ·wÑè9kß]änƽº¨æ Ébôpµ.‘HÙ†óÍÑÀn31ÄNªÛ7n:ágËìÚÇÇåʲ‘®ÎRñ Ån_´wCõxÍÕºY'Ìpàö×AxtŇ®¨Ð]ÊB·ÖUGW t-ðµ+*"‹,:œPc…NðuFÛZXî»`Rð! ´|õ€8 ‹>ê ‘BRÆpŸÏpéŠÊbHCîVäü S6j<ÒÛ¨3õß% MPG•ÛorÏØu"ï ÜÂkê Cþ¨ÑÑñáO•g4Jù>ôóÏdîr¯ï ÷ß3]I1 тܨ#QK†Â[ qFÍ®ðê/xu@ÓZ&æ"@ÖZÀ]üSb9-…ÐîBÉZH½`¼ —vp{µ»U ð°ðŠ€…À'€­a,Å®b¬‘¢¾©˜^‹¤¶¨Us¶â‚)5 óÃ2ÔµVY`¿ ¡Zd×F»îXàŽŠ›b .¥ân’›¡Ë ÌZ‡I4¢Cª†º-ÚŽÆè *ÑëHÁÝl¨{¢å4 ¨(FJ×€k'xM²ÒÂÀ4t€$Äu‚ Ž†1ƃ¨ÛÕª·ÝÞS¬iÒ/æ¡hì„^åg&&BeB©×ÚÁú¯û,× pOƒ›þhnÝ­|„Õw•³/£ÕÐUbDÀ^d•`x ¬³í›°ô\y€ôÜù5¬ÏþNæoAìcìY„á‚A–ðo-ÃÃÇØ„‘€9y? ©±âLèÏ%%7àý÷ñ¡ ¬»ü:OêW¯Ö$&Z"#½ë×··P-_žqæŒÚÅErñ¢ƒä]òócÇÞJKÓ÷]ûqãÓ\WÈ„ !ÍžÝ~Μøó¹ÿ'ôÉ?¡`=zô¨G¹¹åÁ+O¸¯!C†|òÉ'#FØÖȳgÏ~óÍ7çÏŸÿ›µ]þ¾—ñ¯oèÐ`@¾reÄڗɪUEÇŽ—ôz³Ã©Aƒ(@yà€·z\œÑÕ5C*U……é+×N™ò`¿~öÊM»6êÎ1Ôg÷IBÆ:ƒEùsH»NÐs< pÔZ¶ýœä|1:áÓ"ˆ-Ö±PÁ Ï¢óJä @¬r l}Ppº¯·pDB9à]ˆ.û¨ˆP±QU‚{9F:‘ …HÓ š2ˇªW™«“72]FåFÜeqEa,ó¦ðL‹V,È'0ãî¤ü§Ý¿3³€dÆá è•×{»äš}AûǼ·S»@ÎÀ}\*ÿ’Ì¢ò §(Â7òxOX¥aÄ]XQÆW…U–ss[ªè“Áj®±ÐЧ#7‘5Inäb •÷¡=ÌüITIÊ!ð¹XºŸÇ8”·Õ3?Ž))%ŒÊ‚£ŽÚ¶£L,ŠdòzF¿Ï³õËHe¿fŒœÁÇ»Xšú¤þš˜×.¦Ñ6ñˆ™ Þ[À+2;Ùnçd5Þx™ñA̽@ÓÓÎ[Á”™Œð(˜ÑÍ™õ#YŽ믱àõr» ÌnËâµ´Ø!ÌÌäv+ÜJJ~F¦°L´ Îbï2_!?3Q„ùÐ3ý>§+)»Í¾9<"NŒ“ÆOÊà$óa’(KÎp“œ›9û/ cXƒ‚t…W„‡óölÊ)?G[‚…ÜÅûTŒ¢â„`tÑ4…÷dT¾Å8µ ÔJª}¨òcÆM[( £È:$È×a&_É'TìžÃ"átñ˜P²A”ؾ?ƒyYxK+¦÷.Bε⨉Lj Ê6‹òƒ‹¥t6ç0\€vÓØù="€nõ`2ó¹7 WÒN&Í&|8j:ír¦}ò öíËË—¯ÚR\liÖ, PýôS1+IJоZµ‰Dyó¦ƒÚ2™5+ P¼øâªµUÈ™3yƒ¿jµå/åO-îø?ðû› FaaáåË—ûöí»téRá¥6hÐÀÙÙ¹aƯ½öÚýû6ü]ýúõ33E£,##£aÆ¿ö/Ë¿ V¹„„¤òºuwi4Ž3èõæöí/ŠU«TÕ¦,0¤I“»%%”°%KÔ€ª]»ìÊhwµšà¶m¢r³™Ç>|s¾}oc2×~äOýž`¿…¢(˜[)t}—’ÙüCBÍ`fß­DÇ‹š«# 9ûcŠ [bà}M¢­0×ÈÑ„’Ó’ÝZ3‹É™ÅHî$%¤„Ü.8WM½˜åCÕ$æé­³±…\Æ•ƒ'Èböˆš7@Å;¼”#Hy–μÅÜ=7åëyýú»NÛW¡]Õœuèã̃´…[Jý2ó—˸…ïDò´x Ë ãÇekX<÷$# pž’2%{>âw±öcbfßWÑWEŸ,v/åÁJ±l¹ä<«žéCq|¢õ T/f¦WùžÙ€êÅ4U¡÷hãøh#ª—+Q>L[LCšãÆvR’ÈT9•xÆ[¤lõ¡rSå,Myz'ÿß‹©˜9çÿ%¯ã WÛe;󊌱‹™sŽæg@ß[ôÌ?È„a6%5aóÒâMlѲtsº—¿•”yè=î(Vñùœ5Œ´7nWmäƒ<¾V¦Zåp˜ž×íðÒVRv—#5ŒVåðÎYNS0à,§f3RX•Íä}üLÎÀœ÷·lNË9ž+Ó®® vfZö2´,Lä²`#a¦å'F•¡ÚÏŠìæ™Œ“Q9–ѹ‚Ï~5>T5¥ê¬@»z@ú ǧ¹¸RöR’»r %]ÄÀöÈ"zœ´­1˜9ã"%r¾tRôv¼*à IDATÜwDAô\É{‚X‘l5}\~Bôxn#Ør5âodõNBFß™/ÞÇþq†ð¡gK&ŠGCBÝÜ(•2Üþ “äGª®]sŒŽ¾¦‰« 9/“ðð©4ØÍíDl¬¦ª62`À€ü›olÓúÿjKh>|¸ÉdSå_yå•+W®hµÚÇÿøãõë׌,...q¼½Á`puuýûµYþU°lâïÿ _³&ªªöréR®D¢¨VíäÃ‡Ž’Â’f3e²X@¹b…ªr­Ngi×.P­Xá`äìÛG€uë2'GTž˜BÏ–„Oг–få±þpBÆÍGEå…Ålú&Àb{Õ·gˆ@zÄtA8ñÃ|Öúšâ϶i™rîUºm¥ìµ³È± Jƒ) æ Áÿž–5# %¿lrÍl™E¨h—Ût Ò‰<"(L¢±+3}¨z‹ù3’™–O˜(£rï$ t©ó×q]ƒ6pC¡  ÏDc÷Ë9[ÎÀÓܨ˜Ê,4ÅsO0G)pŸéD-YÜ{›}””Ýç4 ´ªL ŒÌa@Ù šËq±Œ$y›ô·®Á2Ò~ûKV¬è]+zuU5˜ ™µŽ1m­$žLx‘™ß±øæSlZåç2³è“ÖòÖhž®#R¶ÂüÚ›7F2rc2q ïdV0 n°4•&ÇCào‰Å@Šê»Ì aÚ&­cÜRFòÖ†õçÅÖ<á&Pª\ÖŸqK™sþé–ª2Ñ%1w;“§3¶wù㊬ÍÇRWÅ–Éø€êÅ̬kÕwëS½˜¦dGMUd )%Aú’ö™žÍ,,âR›¨è“ÉöÅÜb—ÜBc×+ÙSIÙC~hD§Š?È%: ä–h†lá»råÊ"A¸«‰¦Ã<\Tk»'š6ó\ åïrëmÚvKšWQ@Å«t!|øó.ÚÉ‹/àìÙöå$ïÜ18;«œU·o;ر‡…i$eµj©©ü$FK×®—EPP¼ÃB¹tIȽ¼vªÕ¶sýYË¡|éº>ÓïË*(ížý*KVVÖÞ½{}}}¿úꫪÚlÚ´é…^(ûû_ë?Kì^ÿÉ“yÆ¿•–>%–ä´i‘€â…í\H’W¯j$eõêé騥Kz‰Dåæ–qÿ¾ƒsU5n×üLøÐ·›½£pßBFO>‡™‡Ü¡dGó–€?¥ªyçà="ˆî+)-Ï×±Õ>BΩD=Å Ö<Å{‚ç±J•”*y\à-¹gdÍ BÅïĆðO­,@—…±4´g¦UóXPqiZÞç•/‰gv 3,€Š)<Ë|’zµzó‹C}_][¡]á#›/%[ÛÛˆ2ÅþšdFîä|9÷pq†˜¶J`0x=›"²†Qw9RIÙɧ˜ƒ$Í¥<˜É.*ú¨Ø¨€ï›)V™Ë³š ‚ö«°Q”,˜F•‹Õ'Õ†šÕ4W×­ eâ& ±ZeÀˆêLÆŒÕÔ„Òò-IZÌTÇ”[¶N×á…Ö"}«òï„;ÏúðR^ÆÈiŒ™Çø/™*gæqæ…RcÏaȧ:†y¡Ì<ÎT9ã¿ḋ¿ËÝÊ-U™ÇŸ‰„‚¤!ù™Èèæ¶'“0œ1혵–f‡n3uç˜`óØæÈX"§Å¡g ×Zý¿®ä¼Jþ߲Š>*6)ä"3íãöKÓ””Ýf¿,î{F“ª–šS\/g œ³Ã¸ß,0é©ÿ¿ÙÑ‘,¡þ;¤|>w&H°ŠiX̰*&ót¬àòŒ´Ìç•Õ"Øçfi#ª|©úM`Î!; û¤ÒÀj„Š? tò=DJ~(˜»  #|î*u‚9jÏBN—-²jìö ÄÉ¢pþò¤×‡L<æb-[Í"ø…˜àÆhb¯i„Œ³+9_{—ðáàñö.‚ÐËË~'LÒd¢L–¨-*²¯#ÍföêuP~õ•ƒíw™¬\ùP´n}A«u DÊðá'ù²e·……Ú‚åöÏÿþ Ò… š4iRUmff¦§§gÙßÿºÿ³¤òëïÕë( ÿ駘§››«÷ö>(°·^TÈ«¯&Ê7ÞHvX;cF 4(W8nCCCYµåÙl¦ÿh‡³Ú÷6ñBFÿ™öà­yr"€Þa©`§T•å ²&Î RIC+føPõ™ÀΤ¥ùmG¾ M_ñFãyò¦!íÀäÑG.jW=í‰@[´ÔîàŽ ­æêT¦–=í2Ñ0ïw~#gàÎQò¸×RÎÏ PpT,wZ=5‰üø."Ø/ž³Ki¿Ý4³HÍlª¢O&Ûi¸Áb¨*&?#ÝI5ȯiO©UÑW5«™Õ´|±Ï¨ÁÂ@«`ï4f3oSf1¦MŸP‚‘5ù`$3¿cÉ­g³l™XšÊ‚pf*øh~Ã{1r:o¼Ä+2†4á ÷§(Ce¿SÕ O÷°wDVõ vâÙ†¼Ô‰×3b £ßgÂ2¦üÌŒ£Ì»BÍý?m©ª`-ûÝñæÃqÌZOml:‹šÕÌò³>jwL£!ÒqcšÉÃdk«=r ¡2ÑóZ‡Z-šã´?¯‰Ei\›}ã8ó.Š)z­™¼Y šÇX•’¿nÙªJL¥Ô¦SÜs|¼‹Ikÿ%£y3€aýy©OÕ¤¼>Äfñ:ß‚aýy3€‘Ó»˜Ikùx3³PImú3i~UÞ¬#K•Œ¬Q~³%J 7ÛáJ2£šÕXØŠšÕ4WEgŸI®&›“ Hw² yÒþÙP%ÀäÉJiÏDi¡)‹û+¾Ÿ4®7‰©nnÁ¥: }í–HžÞÌ9rçwÅ¢ª*©D³Y´„û)ÿ’ò'z,Â5Úf$ ¹’)2*2òžÀLu…ºfÌð¡j “Rr ²)¤XÍ2³u6eqz¡mèZȉ‰„’mcX xák“«ä-Á åëØr!ç4ñÐ9ãÀî®Ñ±£hžÓ·)E·±ŒC©"ãéÚ—Ò^¼¨•±Qw‡?m§,ZD€={ÚohI¦¤˜ªWÏT …ÞvÆìë(÷î­2GÂÈ‘7ÅŒU)ô"5ê4 _²ä¦]ùÿëôéÓ]»v­ªvݺu#FŒ(ûûûï¿ýõ×…µ¯¿þúÚµkÿ~í_–,‘X,ìÒå —Ë«ØÚŠ?ÿü5@1wn•ÜîŸ|’(ûõ»ï0 ä×_KUݺ™YYöô¤„~~øóÏöG}³‘ða³^T‹\Ç/2zôg¼ØÑtû!]ÆP:ŠÅÆŽÅGˆ@6^Ì\úŸ[ŽfØ%Þù}x³áoL4N)e½3„‚Ÿ˜”µfö¹O(égË¢c! ke0B°”È‘$ÈFd²àtg¨mJ•U? ¦ï<Ç1FFå'LF0Y,–‹¦ï=J¨]õøâœFgÑ*Æ8ª[¹àÁLªÓä‹\ ÿÓÊVUbT³4úì§§¯ù ò7•*VÀݺ=€¤…¼HN"]­oªyÀNǵP«á† ¶D•Ú¯¸E¼q“””))‹çœRQ–2ç*9t –R}‚knA‘Jú€vqWƒ¶r«0ª#™Y ¸+ò¯yL#ðô%°àuž  bC‹ß­™ü‰i½¨ìψHÁHTR_ff^"Ø„T5–‹,ì‘C¨Ø%Gàø'—¤JÖ‰d‚ੜˡs0% î8̾|гÛa áòXók"ˆr±bôú6"]–Q+x!9El8à¿‹ëôì<‰ñƒ5´“éó>7Ê^‹ºw..”Jyã†ý!$òÕë¯WʘC’üì³4@Ù·¯ãä¾}é€ÂËëtVV•9Ù*äÎ\‰Dîé¹-;Û>¤ãO+X5ÿùß_P°FŒñûï¿gee †´´´íÛ·7jÔèäÉò}Ë!C:”‘‘a0’’’V®\éíí}ûv¹oT­V7oÞ|åÊ•ùùùùùù+V¬hÙ²eqqñ߯ýËò¯‚e/$ò¦M÷TÅ ”˜µ«ë ©4øÚ5Ç€µÚäã(÷ïwÜ`øð<@5mšƒÑxäÖ©Ãlq³™Ï"|8g±ý!Ó¿ dìû†}þ¬/÷ô{‹E¸ÑÌ~«‰@ŽëpÛ­ñ8±9¢ÆÏ+9ûýNრͣë JÜ#ˆZË0°ñ]BÉ7“—MNÌ'T¬—É8Á,YÕ®7˜ÚÆTùPõ‹À‘IýB>ìÃÛ“x/˺ž…®^6«s?éôƒÚ•ïÁiùåzÉFÏææ@Ê÷3L¸D…2t#71h7w !’ÅÌ?ÎïÊbÝoðˆÐ'¨ga8¿,sÆPnHQÇÔD..[/ïrd.ƒi/†bnÉ`}2Ø´ˆK-¬è@.&½­‹w-2¬B‰·¨Y"gv'«3Ë•ù¨{zÞ'òÿ?eë‘¿¯T•ÉŸ°“,"ådgë«‘’Ãȃv@u’Zž­ `Èãtí_-Sp~Ù§ͱù´e™ ?mã í÷Òyÿ7.²îDx3Így¶Ì@{’'…¼$±|<Û)ßÀÓzÁwÉœ <@ÅW¼©܈–O™$£ò]&\(R÷hhÇLª>`|a²Õ-¼ÖR æ*¶Êf¦àmʧDI§Û<)@Ð%•Ðû ¡àçbøùÒ[„œ^;™$@µéLì!'‚8ñ¨ñ¶«D =ßgœ˜cÂj"€Óldzð!c‹W¨;O„”;*Åù B€ï¾k_Nr÷îR@ååå`ÏLòÑ#½‡G„DâØ§A²¨Èèë{PlÛöLyZÆ?È,°Bå_P°jýó¿¿ `]¸paܸquëÖuvvöññyõÕWÃ@™óçÏ;¶¬¶Q£FÓ¦M‹‹}+ÉÉÉcÆŒ)Kw3f̘”””ªö¯É¿ –½˜Í–Nò;ž¾AòÓOﻸ¿ùæªv$[·æ”yÜR6$'›<=3ÕÙ³:VÊ×6r$¾õ–ýQ÷ÐÝ_ž½,*/Ô°éHBƯwˆÊ&öþˆàÌu¢òÔ^Èä7˜ðR˜ªu,½ûl23 ‘,^Ëüq"Oké^ZGu‘J2ô´¾ r1Ø idB'[)†ë+q4TÀ­””Eòù î´ˆšb¹SÁQ Üärƒeób+øC‰8Áe! ·q[ƒ–qÙiÝiávâ:ãßá–@Êwò¢Y0.0m ƒ¨ø‘F‘…Ìü>ÊXè„ÚU"]˜éCÕLæWŒ` 9ÛŠ§Ú’Lä¸ür2¼dÁx¿m~Lj#;]"}K¤O¡t36ó´XG{‚bËu,z²XcÈ_Å*Ç®óDkNdŠ˜Úìú]:õ¢´¯ˆò…El"#|øãfÚÉÞ½åQÞ¹â\”………yyå¨íÛ‡ÖN˜(§ ÉlIJjÕƒ–-ÏöTâ+’±±Réf7·­ééN÷¿TÁú?&ÿ2¹;¸ýÝ»L›v±U«š÷ïOtvv” J Z­ÙßÿZDDÑ¡C²ñã}*7°XЧÏ}¥²tùrߥK4øúëâÏ>Óøù9ÅÄÔKJŠéܹsEUb":u‚^K—0p è¨Uë±d5üšàîyÔ¤ä ¹‰sáê‚[¿¢³ J\z|­G>Å8[2=ŽÀ9Ü]þ ºZs–Ñs3ârñNOl²%í@d.ú‡Ö„íƒðf[[ùœhÈSáëŽ[þðµr%)À„$H%8Þ/[³D”#òf@'g\® /ëÓÍ÷¾À9 â†¶£d)ÔNÀFÔ~åy+Ô0„‡wPÜî÷Km¬û©çg¹åtÎR‰¤ßû®uº³ê-ÌÝš¯#ªŸqV C;ø¾ƒîpÝ¢s‹c8–ˆD}ÐgFHÉUˆ¿€m¥(rGÁx£ lTé…ˆÀ·¥ÈvE®ø°}zKN¥a ù€´.^l„*h¸ËĈ(5–p€ º×Â2AªDr`/P hÌæ~ÚZ2Pú+J7@ZÆHxÀ¥;\ýá: ®þbžñ*Ę…â+(¾Šâ0”FÀ½5tUç"”ºÃÅ.>pªç:þv®‰ €èèhÛ·mÑÂ\cŒ*˜ `.€Éúoùßé0UyR·Ö0e³j CÍaðè.NéPÌ0ÅÁ} `É·¡0„Á}ƤžØ?ËÖ8=ßCA1vÎÇŒ¡‚Wk€l*b“°xV¿/z•3?Âöýè'Cèïph4hßé騶 o½%:$::úÇ›îØQ:hëÅ‹u+çð¸v­Øß?ÞÝ]×±iSùB?Ö¶n}ÑbáÍ›ºu{Z&(`Ú´‹»w?˜;·ã† ý+×þi&÷J©¹þ¾HŠþ&÷ÿÕò¯‚åàöÍfvèp0!¡hïÞ!S¦<-YðË/©ï¼Ý¡CèèR©ƒtQaaÅÄW«&‹ëؤ‰ýÐ2™Ð«Wî;ÆO?­¾j•}R¹/¾ÀòåèÜpvõÜ+¸uiŸVŠ™³ !·Ð±9 Á!kÿÀ‡[Q¯¢7 Am[ù¬ß°õ*:øàÖgð°^]t6úlÖ„½¯bŠ ˯ ˜q îN}=­iÜŒÄðp\ÎC¿:¸ØnÖÅî –g ¦®·CëÊžgÁÀ<ÄšÐÇ!uQÝúÀÒ ¿Gñ÷иÛà5ÌZ¬ƒ%èêþ3léúaj-Û;Z÷Z×—†×ý 7‹`hƒÚ_¢wM”ß’ ùëpª%Íàý>^ªaU×^õó8O°ÇøÚ°=4±ã1î’NÜã+ ¾ƒµÙ¸HZb\+Œw(û¤šLìÌÂ> Eµ˜ÖoH!ü¨Åa5VZ H«a\M|.EåìxÔÀ~`#p †À8áníUC(t‡`¸Sœ­\â—Þp}®àÚÇ ËEbTA÷ÆÇ0å” cL9å›r`Êzœë¹ÜÛCÿ°ü@>Cê3©'œ½áÒÎÞÖ_}¸Ô‡³7Ü;À­…ƒô5öb‚á W`¸ÃUPm«qòƒë@¸¿·aÒ>@°Ø äj€OTŠý¬¶ pöÄŒX$hTãf¾×"@ ôn‚«Y“Ï” ay„³ Ø­G‘öÀǵ Ru »ô(ñD¡˜ÙPPe‚)!7p@Yœj¶oG~w¥LFÿAÖ‹'° û Þ@ûq°e¦WÁð<‚Înк©uÄeÁ<y©0÷‡ëoðr·>ü¯Ïà jüP Îyá9ë'¯³àùÜ(Á€êiWë ü,_?„— nø£•õ«,6¢ïï¸W€1~8:Âö²¡»ùZüôÞëm;ãûû±á"ZÕÇí%¨imH¼üN߯è>ø}©è-^ëÑÈ/ÂíÝp ÊóW1|\]qÄ9l.Ä÷ߣW/„‡Ã.7óåˆÁƒó\]%wîx·kgŸè©b›½l™ïçŸ;Øf˜3'Z.O2¥ÑÞ½Ý6JR’ºmÛƒ <˜Ü¬™}Ò[ü«þÓ›ýY‘dÿ«`ýßÿ>ÁíÛãgμܾ}혘 u&¡l×îbRRéž=Ý_{­‘Ã6&$>\0}zÝ]»ü*×Þ¼i|î¹\‰·nywë&ÚkµèÔ IIX·vy'ï?@÷á0špá Òf—¢Ï Ä&ãó·±lŽ­œÄKA8a?×èŒè³wÓ0k6Oµ•oº…¹'ѯ1vEkÁ6;ð ¶Ä¡iuÜï µÉ€^W‘\бÓj 0%  ÐÖ×Û¡ŽUH7Ã?)f sCp¸YðC` Œ³Ô h6¡Ø’Ýðz®2îÜ>0ñ•ßZ¼ác»ó·úmy³€ ”~‰ð ”6Aõ¯Ð§žu½ÉƒfNe¡Ð5>ÀËõa[YS‘zG4иÁí¼ÒA´Ž2ÂqÄs}ø Ŭð®¨J†"aù¸ï‚ê­0®9ÆH!š^õx”ŽMàŠ¾x·.^*„Fƒµ¥ØJ]ÐËÝ<0ÕY¼ú ä6°ø ÐoïUL–lnÀ}Œ‘åY¢À .ÝàÚ®þp iéùž*æT0;´B•¨rA#ÔxšKåGIÝáTa⪧:pªW«õË©\Á©vÕg}‚˜`Œ‚>†«0„‚3˜Ô®þp·apjQÅáà`3pÞJF-©°r„bA¡õ¸¨Çenx¾&¾²{w:¤¦áÇ"\à†¦ðn ³ë'wïa›IÞèæ ÷®ø BY·À¢Äïwp`3t„7Üá)80ï0g"Ó NÃ1¼7zW˜µL°ìÄÅ[Ht†Ó›Ü-¬r¢Ïá‘3¤óÑulSV"´ïãA6Œíá±­½¬_r>,ã—Sw¸@ÝŠ„¡¿ïR`0Yp;Ë‹ñ…®¯ƒ¬[%Ó’±'~®¸Ùõ¬£äH&܆“gú`ˆ·­ñäLBÛÚ¸9bõfÌüûc0ºŽL´ñD4Fm„³¡‹Ð§¹­|ÝqÌßâ`WyQ‰aïÂIŠ›»ÐM`ŒWkÐy¥cÍX ˜<ÄÆ¢[7˜ÍG/±ÁZ¯g·n¹qq¦+j,—kÎC IDATYâ@ÝÙ¾=wæÌÔÆ]ãã;zx8°¶¦¦jÛ´¹h63&fP»vz°“·ß¾²m[ÜÛo·Û²e ÃZÁjðŒmÿ„H²þÛ¬ÿjénß`0ûùíä‡W™Ê@(Û¶=*ã…3;ÏË(žoœ;·Põîcª¢~êÖ¬ÉôJ”[_}Oø°yjĽ†EÑ©{3\Œ~œÃ:“‰îÓÁǤ³Ú\"{ÅѾ ÎÐy;m¢F€1˜ÙÿBΡÁ6‚’‘Eô#íùqHL€ï½g_Nkö³N²õzP£1—…:íÛW%5ÛoÞÓ§?5ãGW×-NN›ªÄ5þ©Åüó¿ÿrƒÿ‚ÜŸP»iÓ=@ÞµëágÁšL–¶m/Š;«Œ“ÿôÓ'Q6YZ¶ÌîÞ=qófˆÅQ£pêTûr£‘²Îÿ¾jáZBƶãX*ŽöÝB°Ö${¼çÆ‹D k}À$Á «Ñ³ãF"ˆc÷‹ˆŒU%ôùóq ò‘Œòä¬ç¤êÙ Š>QüHül¢ ¬“I¨8GÆi©ï ¨€t4¬+[{ôÛ"Då´ÐÎðå\Ä 9åyb®m-‹Oqƒœr^áo&1~<‡‘—øNÙJyKÕâžI’æ\Gq¸’2%{%óssíZ™ æŠL¶+S³2Ù¶‹Œ•´±ŠÉsäÒÙª´%W³E¸±SwŽê/™7Ì–·¸B)) dé®*³þ%21þb)¡>ÔªT¹WqýÏŠUù¶#W³™Yùi©.áo¬¡*6ÊãD-Wâh0æðÈURv›½S¸ÒX饩瞫`ÀI¾Ï=&±ú•Äk‚O3Åä¥FT”mò NL‘Í¢¯ò÷Rþ1w§ Ϋ¡a‘5ùÁ}ñ ^dÁsŒQ¹õ-ª”–±Ìõ¡ª³3ågH7äjñMÑÒIE‰ŠvÓØÞ<ö‰£TI…`°W•çBzy¦y»í­\YÎz¥P ›-òÈ—Ö‹æ(£‰}|KÙCò BFÙT{ºÑó¡”øÒ­c* ¸Ý» °~}æWú.îß7öîÓ¸qjX˜ãÓÉzH>xPìììäÿL¼sç^äSíÒkˆå_ë?AþuVyûz½¹eËýéé% Å‹MŸÚÛîÝéÓ¦EúùyÄÇ?ïêêÀ\\liÓ&&#øwoó)SxdŽÕ½új——4>¾ž··¨‡GСJJpá‹^/ÁlÆ¥#ÐGpýôšŽè‡ø` Ö.2a5‡a@G\úBÿçä-8 D/?\]W«?!½· Ho†ác˜òZ+`´`ÿ0Lø[–ÄaU%8ÅÍLIF’K|°Â×ÖøºÃóQB|^Ëð³ Ð_ŸX MÀ;IÞã&h²!ïù±IZîKõ®îúíçÝ7×Ï2‚/Ãë ø9[]FX¾Gd2Üà´²^V?š–=Í@a² ýd<ç,@2e ã0ç#ß®#1² º^™»ð¨&o4†Y5¾9”‚“ ØkD‰NM0¼-¦ºAñ± 4»3±³j`½ÇK°Õˆè²WôòÄÛîx±2¶ðØl2ÕÉÀ8`CÇ–½°Æpè¯ÀpÆ ÖVåÜnƒOHëAZRoH½!­ i½¿îU|va ,¹°dÃ’kýåÁ¢‚)†Àhm'…K¸‚ë ¸€ÔûI}–‹ˆ‚-@*À¼<çð#î–b·G‰RRÔ÷ÀLs‚ýä ÆÍ4¬Ñ" åp«ªAå$˜Ž‹÷±CB@âƒþðV5öÎ ã Á~è>ÓÝï19‡q8ÙÎp†a}ÐGØy$’Åe)$MQozY]ùÐ}‰)ÐÔGµeèÓH€<޼•H5ƒQo!šVL=p ¯@_ÒßQ·‘uŒ\F%À§À*Á©Cô(€žø¦>¸¹N«ñÊC˜‰­Íð¦õå‰a×q%ÏÕÁpóq1dG‘£ÃÒXÞÓÖÉÍt ܽ;Fã A@B_£AMD}ŽØ[Ð^|µ~õõj Áñ+ýÜ]¡ÜŽ‚‰«¤]‡!1«—`ñ\á…Fƒví RaǼñìdĈüsçô³g{üò‹0_r²¾C‡X½ÞÞ®woǨǩS#÷ìIûí¦[¶tqØ@(™™¥-Zì×éLwïŽïÔ©Ê1ø§]„ÍžÞìÏŠ$õ¿ÝEø¯‚õ¤Û_·.fþük2™÷­[ã*G…؉ÙÌÎ/ß¿_¼ys—Y³+dOõÄ¿ürþ©SúY³<6o¶«+VàóÏѱ#"#á"^d¿øËD›¸‚j‚(±; è3FN­Ç V®ßCfÖίØÊ KÑ}RòðÉ‹øz¬­\‘€1ûàÄkxQ°R¬Æ‡×QÝácбNy¡0 (Ü5­ŠZpÆ%ÂH¬iŒ¿B‡q0kjb`þ9LÌÀZà€Q«=4e̽˜‡ëû|^ìZ>•º»8]øx@¿V^· YˆÄ˜{£æ´ð°.ðgDŸÆ#)$sÑy„u9$p1Gn‚¥)¼gaX}*ÙC0‚£   ºŒÄHW”ƒÔóØ¢FŽ Ü`j+q¡šìKÁIÂìÏVߣ¥bÅHÇ騸`–µ«²EýQ@Šz˜èpQ˜“Àzà<à$Î@W ?à ê8:ÊN&ãUX áܦxÇm%îúÂÉ’:–ýÄÿ:5®BP KÌ*X ÀX *ý«‚¥Ðñ±Ò¦°¤Ã¹m9¦êY1dfàp.yÀ h¼ ¼GáD±¿—âW#bÊîÙ þ˜êPÙÕ!% kËàVîhêën•‹¨XlU#@m´íˆYuÐVØ Yç±9iNp郱0TX…¨8a„ÑÞ0¡¾@¿7Â|7. @wøMÇ +Dý1Š¿À\h›¢ÆWèã Û4± ™?!À 4|_€Çʆåuä߃q \W¡V ++ x(æ? .ì†ÃòPLÌóÄ:¢s£ÃPlÁâ†X-@¨ÞÅ–GhZ ·üQߊÓÒ›1à8nå`X#œ~NÖ‘]Ùf¤©ñ~o¬ÉÖIè þ$ÎÎÇÐv¶òˆDô]³!+0X ´ä¢ÓDdåcÝB̢ƀw?Åϻнnœ°Ÿ`?ú?þˆçžÃÕ«°[ÖM˜àxW\&eèÛ3êîÜéW¹@BBI‡—¤RÄÇnÞüéÛ¡… ÿÿþîøñ-²ÿ´„ò¯‚õŸ ÿ*XOº}ÎܢžŒŒÒ3g^1¢ñZ–ÉÁƒªI“"š6­–0ØÍÍÁ`³XзoÜ­[%UÅ’<|hêÜ9×``X˜wß¾¢Qn0 KÄÇcÍ,[¤ŒFô‰È,|ß}.ªZ¾_ü‚Æõqw?êf=ÅM¼²n.PþˆN‚¡u#¾ƒÙ‚Ó`x{[ù——°ì2¼ªáÖ,´,Óo\®´©…›cQ˪hLx. 1Œnˆ£2›‘lO>¦'ƒÀÖfxK`eØ­ÅŒBØZ o f˜À[€Ø L2½9åþ•н–dÖ( ~›Õëõ~MÊþEé|<ȇ©<סUØü0wᾘŒ6¯Á”ŠÜ­ɆÚ.¯c@o±¥¡b1«‹ºã1¾!Ú^t¡Øˆ[Z£ï¼î,¶B#-Û³q €'|Ûašü! ”ñƒ <Ñ© x¢3* ¡ÑâRì4" uCLuÇK€}¼ vw³µÐ è €g1ó˜`Œ„9æT˜³A¡)»JíÇN$žzCÚÎ-`~lëᙎõ€ÔÛñÌ¥ œ;AbrëH´ÀMà2 \JU~ÀT`0Üa@b%í¶V5Œ÷ÄL'G&¨3°9‡³j6ÄŒxM"ÖÀJ‡Ý¸  ¼ÛbZc ¶;uÂð×}m4ŠYuѤ¢J}0‚c  º ÀEÐ& · $ ù.p‹>C”" (ü 7Õ0´E/Ñ«†õCµ€ßàñäH!ùMÇ >‰G0OA~2LÍà´^~ÖÏì0È^âWcL”‡| ¦WÃÎÚ¶[ŠÑbPòM˜^;ýlåë’1ÿª9áJ?ôF4_ÁÖ84«¥ €ÆdÁðßp)ýãÒpµžµ Ý–ãQ>–¾Œå£mè èù!î=‚±X#&S˜°‡ÏcH/„l©J—®aȸ8CyÛ‹¹wÝ»ÃbR‰nb*ÒRv옓’bþå—Z³g;О?^&“&E<¨z÷]¿;9l ”¼<Ÿß¾âb£R9N&{ÒþWÁúO¬§Üþ·ßF-^|£_¿×®~rK$ºw¿¥Þ°¡Óܹ~Û<™ %::úÀ¿•+‹{ôp¹yÓÛI€îFŒ@¸ÄÑŠwî¡÷Ë0›qù(ü¡Ë&3ügâF Þ|Û¿2s=¶ŸC–_#bsX~_Gýˆú ­:™…½Á èÚ×fÂÃ:±kMð?Žˆ\Œj†ßGØt©äRô¾Š\¾hƒ¯¡ÎsðÞ#8Ip°Æ &Ö¥x¯NÀÁ:'0­æ®ä†ß-8¼g÷y÷½m|85Æ4þntÇÙ‚ ªtèßÃÇÐûÁ}Z7(='"Ç=+ëO $eÌL:vãê-<Э_Ã7Ö’‹ÜÃ8œ…,‡î˜{¸ŽÃ˜¢uw¼Ø¸R .îÜÃV RÔE—Ž˜Y¢ø5Â’‹ßUø¥Œ1«ÆÕÇ$w4‡#±.ùG-)x`¼f8¡*í¿·Úl®:AU «eëà¯N®åv¦‚r³“9Cô¯¥æ´ r„cOO¥íاZ¿¤¾>‹É­²”ןv×ÃQÅC&ôzœ-Ån=BËJ\ÐÅS«a¼XÄLPçA‘­fh$pª‡ñ>˜í,æh0¢ø!Ž$ãw LNpo‰±­0ÞÎ/¬Fv8ç µ…­Ñׯ¹Ø¸J ‚ê0 À nèÑbŽ„½¸ª‡©jbhcÔ­`»…¬o¡‡¹|Œ®6’~‰äs(p…d9šX7ïÃôò³`î —ßàåmå{ R€¶«O2Ã?ŒvÇaÁ¶&Iÿxd1º6·€³urÉÅK7`&ööÀd`@~sBáî„«£!TœÅ×Ѱ:”hdUªIŒýD¡·®~ ÁT9 ÖGû&¸½ÕÏxW0ÞB­ê¸»Mm{%”jÑu(¦`Åb,ù@ôrI ‚K—0oÖ­ƒ,Y¢Yµª|®ŽRâÄÄhºv½âê*yð`HãÆOç¨[²äÖªU‘£F5;~ü…'·üÓ –ß3¶ý"IùWÁú/¾ÿgùKJLÍ›ïÍÉÑ]¼ðüó¾On àØ±Ìqã”>>nñð¨DP˜81éС‚iÓêþú«Ÿ]UQQ‘«kÍŽs’“Í›6Õzçû]Ñøñ8r“&aÿ~ûn—¬ÆªõhÛwBàn›™ŸŠî¯A«Çáoñê[y±Ýçáa¾œ‚ ×låbÄZœÃ qò}›Î¤1 ÏÜÏÅk±gœ­}j1zE®Ë{bi[yÅ4º¯& žÜç*¬È@5)N·Æ@Pc©+‹QM‚Ó^(˜?bƒ>¸eã±öÓ®5±Ý@ÏÞ UsšS‚¹¨¾6cFŒïãaJ½á²­ÛX9\GæD`y>@·’"u­Zå¬+¸×0ùÂk†ù ¨°L0ÆéÛ¸  =Ú¨j‚>sñ8! Ð ]úbb-±§‰0¥âT<ö¡‘@ÚÃÛaª+DeÀ¬,ìô@»bD×€¬&ÖÆ@‰#U5@)v›ðàäŽa˜á†OäÛ,nW€+@8P*¨j «R;þº°–X²‹‹5Õ=Ým†¨§³Xý)É®€ÐJv».V»•d#î—âW-ŽRÔ©†I˜ê Çœ¥¸Ÿƒ8++@OthìneJÁ©ÛÛQ–g€6'£qÁ“/Ú¶Aß6Áë¸~ç-°øÂw<Æ×(C:÷"ôè‡6Sà_¶=(**ªU«ÖE¤­G” Š&“õ™—²‰7 ®§Ъ»Ã[È×€þpÛŽ:Œ ÙÀ@ x8 Ûž&Û‚yH0a°+NzÁ½Â©g€x$è0¸N¶‚»õìØz}ÞË®ÑÙ¤€ÞŒÏã Á–l ¦‹çg`€À1¾þ>8€Úˆ\ ?ƒï…»¾R)®}‡^ºŒôltžŒ5vý?öÞ;®Êúÿÿ¿ŸÁaïᨀ€qâÞ¦–ZYiVf½ËѰL³,GeKmX®LSSsoMQATYŠÊR ‡q€³®ïÈáºà XïßíÓí÷öù·Ã¹^×<¯×ëz¼žÏÇóñü”©bÁ.˜ýßo¤›?QGê·laêTš4áúuœ¤²!u¢ Õ\Ü`ÆüW_MoÕJuýºyB0aÂå}û²çÎõüî;³ ĦVkÛ¶ÝV\¬=~\¿~‘Uxd€åóðfj²ÿëK±xñâÿëkø?³O?ýô¡·¯RɵZãíÛ%wî”OšÔNö0*VÇŽv‡åØÛ+õz¡OóëïÀ@Û ò­­å:Xµi#YÅZYYYXÈZ·V>\¥ÑC‡ZÚÙIÎØ·/ë×cmMÓ¦xI•’‚z±çVVäå3PÄFwsÂΆˆkä0¬/v5Ø@¥¤«'ÛÎbðjNëT “1ؗͱµ¤¤’~5/K!mÙr + J´ô©qš8©èâÂŽ ®–øÔLCíl°Wr¦€<-]hZƒùÙ“£'¶‚ä*:[Ó¼fFdIŽ‘X=7 tQÒ¼Ú®úJþý7çÚ ?Õn¬é¦žðr=3«_;…Å)* …nHÍnƒb.q”e¢M¢¼VÍjÛ­°óÅå"Ù„Käö·jcQƒHÚàÞÏ›ÜË¡ø69: íj^ÆräÞx7¥émn—Sž@BSš:Ö¼#mplM+lsH)æÞ]Ôä6¡½¢&|#Cî„O†ƒ¬˜är2ïpJÆ™Ž²w‚ {\£%³‚Ô*Òuäg±FO±mRýRV*l™nÅP@Ï =7 d•±ÂH¾/9fcgà `|ãÀìádA œ‚ïàgˆ„,°€fÿ$SU“±TÖíP´Fî†Ìæ¿„®J ÖÂ|xn¸ è“à]XsaøŠPÄ´U)áã öVq´t±ç]'VZ1D^¸& -&ô._ZB¸€`O@[5eº…T–=ŸØË,/㮆{ntéÉ‚Ö SJÜ`B2‘±¶˜{Z4^ô æ…¦"ˆ¦AS-s¥Fݛޙh#b»gQ´†¹”è0L!h=•5ýÙÊÊê©gÉÊF3‘ö3é$¯yæèæ‘r­%òŸðî$z,G¨\MY† X¯ÅÙºf—Bx¶{™RÌ=#>JŽºb[ó«ê™’Ê=>Ví€mÍXVëy9–œ*†¸³¦sm.KìóäW0×Ea¸˜l–‡q¯”oG0QäŽÎàûÓdªÙ<¾"ô[PÊ;(,eþ$žéC¼ñ9ùÅ àó·$¿æÙ ìØON‡¶Ð¼©dS^Ÿ|Ba!ß~Ko‰çà½÷J Œ&X¿ù¦Mõo-,ÔöYvA~ÕªVÝ»›gVEFíÛ—SR¢ß¾½‡ÙX¿Ä–.ÎË«ìÔÉeá‡+‘6æí&iÜÊÀ#Ú§ü/ {°sû¾{÷ÝÉÉê•+ûÍ™óð0ù¹s!!•ÉÉ=<,Ͷùê«ì÷ßÏìØÑêêU_++3‹›çž+úãÊ矷þý÷ºr‹ë×3cÍ›‡‹”Ú}>c19»‡'DÄk£‘ç²ó$Ãûrtµ„|ðù.l¦•WWã*z/ŸLdøj2μǵ:ÏJæÉíÈe~žá¢ïLä­pì-8?ŽÎ¢«z/‘oRheMTP-Æ2ÂÛwX‹›’3Þø[‹¾/au9®rθÒII®mGßþÏu×οvŸc”ÝPmÝl" ôp°B©œIqÂp¬Öàd˜Öb\ÉÝä©/ÅsÈctõ—D᜚ §¸‰ÜQUèpõWÞt˜B°•ˆæRLñIN&’(G>˜Á}é+®URAI<¡1lpd¼7ýdR$QFfÒ8ØÒŸW<êÖØÁ@y!‡‹ /!¡t"ÄIöôÄœÉ×°³’Ã:®2,¬iË*ú5Ç ÎA2ì¬.¯¶f0zƒ4wpw3ÚñÿŸ[äBäÃ¸ç ¡F °†)ÐúCŸFåN‚´r~¯à#…€G^°f’RÄÒ[wóØ]À=j@‰‹;ã\gY/D[NV"rˆ\éÔŽñM¨ûŠÎæv;òI¼éÓ‰ÁnÒÜ“ø­#Ž£í%Õ/ %áO.ê1t¦õ$ú4õpÆ $&]Žl6]‹./ÊYÜÌB€Ýb<›‰Â”ë)_L‰>Äþ­Ú ”À¸!𧈻W*0¤€(!*þtÆÄð.50ä&Q儨óg;ÜjƒA`LÇòàÊ@ìk¾¯ÐrKyLôdÛ`,jŽ“[N¯u¤«y§/ß «½ñb ËHÉgá(–Šˆ‚À“K8t‰'{±{JQ'ýüWüHû–\Ø„»hB-)¥Ë`ÒïòÍ'¼3³Îïs?\0q";wÖå¶oß^1eJq³fŠk×ÜÌrÛ§OOÛ´©`üx§={Ú›]• AAç#"Š–.õY¸°!UáZ»t)¯_¿ý@lìÓ~~?ö`ýì1ÀjÔí9’1zô1elìÄ^%jìØK‡åÌœÙæçŸÍp–­VèÑ#)!¡báÂfK—š‰ä|#8ü‰dy7_ W[½…»{UÞ,‰xÿ¿—/žfë-ÚØ5Тv‘38r®¦¨©NàéÛTã¡äœ>5Ë?L,â@%rvF¹òú‹÷¬šüÐka¥òþeÖÊ= ŒoQû+\E7•ÂŒ=°ØŒ‹KÍ"Þˆðwv‘'G6V“D‘»4Ÿé‚U¥oÓ-@9Š&e3ç*кb?ƒÁž¢­FŒç8wŽsB;ÚM`‚Ô½”OF;³¹ ¸ÑºÏ4•ÆŒ€|bXWMÌr£«?3ìͱ 4$å²½zÀŠÖ®ŒscB~éÒª8¯á÷JŽN†½ K}UªèeAçF;Rà/‡3p€Žp]ÚÆ šC3pgsŸ=`ß›µ (ªq¤™û|´Ò]Ü!l {M‚dæRõM LËU-çªôÄQ˲zJf™K¸œÏžbN |Ý™àÂ(y½“¨¼Íž[üiDWC·šT'‡TCq${o ‚-NLð¦·TÜ_ˆ"ê'ŒÍ•oÒn!ì2·>x=O°Jô´sѬ ºm9úYtíMm,)‘ò9Ü*BïíJQˆßRú e2X€ý›¢.]#á,´‡s`šª*FrFKka®´®×FFÝâL)í-9çSëŸæ&°*W‘A´¯y̼pšm·hkOäxѼadèfΦӷ%¡/aYs|Aà­?øé m ›‡¥¨—}½—yq¶#zmEúR"A¯ Ósð;FKóL¦Íaó.ºpá ùࠃ׮MzTN IDATÑF::ÕjÁÏ//+˰aƒãË/›é0§O—’le%õóò2¿ÆÞ¶-óùç¯6ib™œ<ÐÁá!ƒE«5öì¹'.®pÞ¼®+VÔs¦™³GX¾oö¨&Kz °þ‡ïÿ‘ºà /œÞºõÖ€ÍOŸóPɆ[·Ê;u:«Ó QQAæÓÔ##ËŸxâ†LFddÇ=îÒððð  ûsÀ—_–ÍŸ_Ú¡ƒ2.ÎÍÊJrÊ´4ºt¡´”;˜K®æb|ÂxtMÿŽ‹¿Ègp˜‚%¤ëF㺈6&R’ú+‰z/œÞ§GS‘Ca7‘¡Ä Е¶Ó±½K(ÙÍî 2dÈúÓ?„:Ñ@=ÚxB¯rXG•U'Ö•Ö(f0Z`ïͳm#3OT7–p9—íj«ñAeŒ¼a ½Š0-QZ" d™¾—ã¡¢·%Á*•ü½À@ÅNYõË9÷‹æŽfÕ°'¬úC 0ïx€ ”k‰®öTéˆ7BVtVÑKE½e <= Iyì-䈑JÀ’–nLpcœ’º!ûj+æfk‹¸8áåÏLçzÏ6kì(%hM—'xÖ^ »TR÷°§Œ2[l'0¡½?‰•ÛÚà>ƒÁîå6ã&’’ ô£élºÚšcpýH44¯Qtš*[dkq(zÎ90 ¢aüH-œ7ÀóÅì¨À]ÎWüDÀ)©ì,Â]ÉY|E®½ß3™ƒ °§'ãE“ÕžT&ý°ocE^¢U‘Ì=†µ’³Ó ù÷O&1r5‚À¡·)Z"—Óc©9ft^XÄÖ£ø±•ÈG•›O§èõ|ý /K±Ñ£9z”±c9p€:©ë×/_©”]½êæçgë)M59q§Ñô-Z˜®¬ãTŠ® uGþ;.E].†ÃMhÇ©Ey¼¦f½G§\ °¨ý~F:òqTpÚ›¢¸Ù¡žºŒNàk?Þ¹zš(N¦0j+#[Ÿæ9ŠJ/ çròËX6ž"­QAàéÏÙ{@/ÂWÔ– 6fÚ'ØZsåw|¤½{â vfp'wÔåWýôo¾‰›qqu×®z=={æÇÆê>þØîÓOͤ’˜KÔ±ÌÌJŸÐòrÃÙ³ýú÷ˆ@®^oìÓgß•+ù³gwZµÊ|³ö`ýì1Àz´ÛŸ8ñäîÝ©#G¶:rdäCÿøcÚ[oÅ·kg“˜8À¬î(¢hýµk~:˜™÷ßxCýóÏuÝÑÕ–•Eçβq#Ó§K6 œÈ¹‹LÄoRù–[wèñ<¥~_Âó¢›xëûPfÿ­%çÓI?ÎßaðoTX;–"††¦å3&Š*#+|™'òÉçë ¹Ab%Ýl8â’wd∢”[G¼&…zŽ2µҹɱ¹ýr Àûð5(à×¼×!ÌF½Ÿ ²Õ8>)Šw$R>—[Õ2¤+éà"¢­”£ÿØpîiù&-E¬²õœ¾M¶ù(º¡‡ØY•BÊ®$’(CÖnƒT‡•ä’ÁŽ\Rfx÷c²X@²ÚrˆJ`½6jn[`ÛŒ`Ož´¯×¬ÚŒh‹8™ËV É@5ðàYÇz¯öúV ¶ªÓr¾šÜ]m"°¢hà¼ÿBÐh¹òO@UµUq'Ÿ}ùì«&°+°we´S,1/΢G“Ź4Ž”*Ǧôõb²RÔå€*ʯp(3FKlíÏÀ:XÍ€!Ѝsœ«¤ÒOO<ƒ÷±d²6pºV/1 ³” š»kˆ«ÄлèÑVäÖ`5w·SŸ†˜a …)è۠؆‹§h8ÄÃÈ„žpD*oÿn ß–c#㘠ÁªÚ³¼™ÁšjèÐG† °E4“E>XÿÃ÷ÿ7°ysò´ig\\,'7ibýàÆ§NårÑÞ^™œ<°iSóóuAÞß?1'G·n]›W_5£FRìâ"OJr÷ð¨;nŸy†;4ˆ“'‘K7þ´‰7àæB|(M¤eÖ¦,dûqzúq~ƒ„šÐ«RGÐW\IgLöÿG2÷Í9ÆêHšØ5ƒÖ5¯uSRaä `M:ÿ‰C!c{&‰âZi%«'?Ý<î|ª³÷Ú€÷Lµœ=œ¬To ¼ko=Ø’CΈכáUÐÁtX+Í[3圿‚íg8˜v*D7‡[Ih\°XE_é ï6êDgQ®B1ÿRWÁu27Z‚Æëé ô—"5êÓœ¾Æ5À‡A êB—:Ä,-šŽÅqÊ€^…M7Ftf°¢^š[éÏ䌡æÞ’AmiÝ€N¦ŽÂöå±GK6 ÇÚ…Î ´# !”PÏŒ:µDh9¯%ÒH‰iƒŠ^Z9®r\ä¸Èq“ãVóÙE›Ì¼ìÖß7J#…F Œä×|(4’g¤ÐH¡‘|wE ÊBE·jþ¾Šž22$M÷[ÁíbÎå³WüÐÜ™dÓ@ö€]‘éÏ'¦úG:x2¶…9=Ø,®G°³L ûñŒs=OX>ù'8q“›€+®Ãæ-=u  Mâ® †Ñml~lççÓ¹3ÙÙ¬ZÅlišŒ 0úEŽž63›¨Ëè>…Ô,æ¿TWy¯!2–‰ñéX>¹Ä c·qôÝšþ2¶5p­¡u*ði2‹“QÉ9È0wÁ`8øÆKɇظßkQ¹êþ;ÛZ¥ý صµKÿînÉ~g,E å <0¶Ké<»©x‡bLÂúkœL0Rƒa)‘”¸¡ú€V¥Ž‡ ôkˆ ­õ t²½>K©ØHh"w«©0飆{ÒH;Îñl²´Áˆ–õ<@jr.ðg×GšôebkºPϪƒP©.% !s¥k†7¥ßC‰ð–4¯"S†ÂozÙÑÕŽîŠÆ"!£ž›Z.U¦åœ W)ÞAŽ£œ&re8)hRýYŽ£œ¦ ©“2‰Ì5hþeú‰zQurÆ&’tÛãø>=šK5TïPõ5wΣöÀb5^D Ó4(&býhP¿Âk ‡Y°RZ º’•~wâ9‚ý>—ÙwPÈØêÉ3¢tɬJ‚"HÕ0ØÃ½ó#òm¿w‚o.àjMä Ú‹eâ€þñ*“¥JpS¾bû9zvàüWêÕÙh¿ŽLÆÙuô“¬Õ˜³wWâN×]s&&@U‡3²ä÷ß+^|±ØÕUž˜hf•k4týÂ…ò·ÞòøþûÃëÛ·gN™ÒXi†ê*m-ZØÆÇOrrjT¶¬Ø¬ƒ=Xçö³²4þþ;‹‹µ»v ™8Ñ| “ݺUîïÖ`¢£ƒ»tiðM0aÂí}ûŠÇŒqx'ŸÄƆèh|¤©Kð‡G%ô #Ǿg¨ht=€ŒõW#V#x“Ñ"¸XTIïuÜ,ä)_þœT»KCL àD¾KÁ^Éé>ôtŽÏ›·}³ÆÂö‡ÞåÙÜg–Êdl›ÙëÙÞ-zB È1ò”;œ%ƒH 0ö!yI6´X×!|Nz•×( ·÷h­’ºšL¼–ؽOvR^Ë böqɈàE³W¥Q@@¸Æµ¿ø«Œ2À¿a s¬÷òÎ$)‚Ed-ðíÇäúNŽjSs+•Y„Ѷ4kͰV U5*É(åb>*Hj³ç6øÙÓÝŽvtW4 k^Ï ²äÔx ä׸”î;™Êq…Šî:â„Fˆ2Ȱ¬ñ¹›\ebÏ™‚– ÿ!`ÐXÊÕ2¢Ë¸j{VÑÌ•Qv8h–¸&`Ìår*ó‰­|ŽthÃð P˜/JXˉŽÐ)±ìÊÐnŒ¬ãž4b¼Ä¥3œ©¤R޼;Ý1ÈFêFÇ£}iñ2D êðߢ³JŠÌNS´„t2lѺ©9)Ñ:n]àK˜2øKïksÓ‹àgG^Ó x9 `mÄžwµžbKèåÄ©>ˆ%Ê÷¦1ñ$ÀÞa<)B§[®1u/rŽ¿ÈÀ¶µß›²˜ßΗ¢ò\À‡˜õ N¶\YI;=¯ˆnSÈÊcéX(Í(¼F·¡”•óç:ž–VËÑéèÛ—+WøÏøñGêXa¡Ñ×7/7×øë¯N/½dÆEúõ×9óæÝmÝZïgoo>šo’fظ±ëôéá8&'«»uÛ]Q¡?rdäÈ‘‡ùÈëô¾†ˆÇëøþÿ6À~þ9ñ7ÂÝܬ'»»?d®ûí„•+S,Ù™©ó÷Oðó³øðÃcÇšqA/_^¶paƒüÊéÓÙ´‰€.\¨§˜÷'Sg›gt.ÝÀ¢54q!öšˆV“ c-?ÊÂ}8ÙpéC:ˆV7 賞âJ>ÀÇ!µß_Í'øåz¾éÃ;¢Õ¤¯ÄòëÜT¬»°øÖÚï 2Åú€wo¹ÔföÒ)êyoÓ­^Ñ1¸µÀ[6¬t”¼UaÜNp N‰E÷"…ù»a±YD7`SeÆZ«|BGl–Ó®µ4šv—²D§Rbü%|Çâ)~èÉÜÛÀébÊí°šÆ€.Ò`" Cwžó&f1$ræ2µTÔÐtžT5䪢ø.¥sLC Ç¢ ½Û0Ü­ 'Àˆ¦Œø2bʉ)åª)¬&CnI[;º9ÐËžÀF¶2­‘"âÿSŽœšs äQÉWè{”dXÊp’ãhrtÕÿWÇ?©¥#`¨ ¹„¨2bʈ1PjÚd[õ]ÛÒͺ ƒ@%…™œNãpù€Usžðdœ# 1)…¢/òg… ó¢wož¶©çW{0ÝªÚ )[Ï©Ûä˜Í¨0e¼Ú¢|‹.ARD^…ñ{2ÿ ÖÙ~jáåP3JÄÄÄpxC¯ 0 Ö€ÖÀ éõì¬dJXéÀ&ÿ³ˆgS1|Ó’wDÔrá‘„âoϹ~¸ˆæ"SÚàW}xO4\¸ËÀMTøy 3EÎ>Áßv“A9.ÒᮥÑç]*´l›')‰#Œ—çè߃Ó?£í¢×4žÈh^z†_¿«óÔY¸åËi׎ØXìêÅ÷fÌP¯_¯éß_uæLÝL# #C;}zZ\\ŦMmGjp(}öYò'Ÿ4JšÁh 8–=}ºÏÆ!hù{d€õ7ÏóÀÞ} °þ‡ïÿŸ,A`øð#'OÞ}ñE¯Í›>¸qQ‘ÎÛ;4?_»o_Ïqã2Y»6æÌô¶mU‰‰þÖÖu½Ð¦ áO>±[¼¸n¬§¤„.]HOgÙ2,¨{äI¯ñç!39ÉF#Cßäô%Föãð*ɦ†ÈX‚ÀäµüMç\ø[&9~›Ñ[1 ü1‘É¢Ò¥¦0ù/rö g´h1¦˜p‰¢ë&lØí÷ÒÅ–µ£\é×F?(`Ž+E»\Ð2»„4A*¶;IøXé0n€'G’ŸŽa …©õ¦âââ”Û/ åU6(>¤õHi-9±¶PšÎ¦«½(•½”ÊM„ÆsGÃé6œn6õD•J(9Å©³*(½Ä¾œšâÕ¯ŽÛa>[@( 6ãÙ\0v´lÅàÖŒ°¨—½(6#eÄÕ€­A¤nI {zÛÑÕž@ÕË!ÿÓ'$^öóëÖHÏÓ£šTE‹=U–´°£«Ýè£jÀGXsú϶E+†´f¸EÑU=U·¸œNl:±@Ú÷ã÷z¡Ã|òsü·W\‡3Ü«žLƒ€ÆD•RéŠý« n'ú-¬Ù¤Rù!)·¨P!ŸE‹Nq9;ßw2ëæ ÞG…²Õ8Ž!x-¼;Á¶‚t1Åæ¨¨"Ä’Dë@1SÐ |Þ‚ù¢ùL'0îGsieMx?Z‹V Y†"±˜—¼ùu€èûRz­#³”·zñ½40÷Öv~¡«S¥Œ¹E¥‘š±D4K¦\eGî*Âúá#Ú¥°Šƒ”épcë Z:f…ž_¹”Eÿ6œ|•È)½5’6beÁ¹÷l+º0Ù¿ðÃaz´'â+,E²øÛôšJE{¿füÉãI ÷(tzŽne¸t“FC÷î$'3>ŸNÓj…îÝóõ‹Ûò‰™LXXYHÈ kkyb¢›6 2¥¦M‹Ù¼ùî¤IÍvî¬KÈ«c¦×Êž=Ã&LhOÚ* IDATûàÆ°Çëß`Ö?ºýヒ{ç Í›Û$$L~0Ñ$Ùðõ×~ï¾Ûà+0"¢,(è†J%»vÍÏÛÛÌZÿµ×ÔëÖiBBT¡¡fœÕ³góý÷øùqå Òâî8Á¸—°±æêI¼¥ç?rž1sQYpáWº‹(\:=¯¬f$½¼9ö©ÄßžœC¯ÏQWðÍ$Þ"9Ú«Øp•6ŽDÍÀ£&¦ Àëa¬MÂAEèz¸¤‡Ùóâ$ƒN×$`K—7…šûiçnùñ@7;ÕÞb&§ XÑq͉D=# ¹c “’c.´ÍËå0 Ž‚ìQ‰Ø‰V‡)ø‚Œ s¯( НˆN¢Hl2^Ïá%öBeR´“ó×Éšã<‘¾þõˆí$f哞DØM"õhœ¼éíÇ€†ZFô9\Lçx=žÐ@Eãòhˉ/ãJ)ÑåÄU —W›mì°ÁO…«'%NJ\MÞúoš‘*=j=Åz täUQNt9‰B­^¼Üšöô°§‡=Ò[¯o5 ›§ h+\[3¬ £-›Ч›DX&IÕß¸ÑÆ—`/z+¥þËjºU(¡UT5D·ò(ÙMäURWì&Ò§‡"_£à¢ ©rDU¿nf9†edœh`yð€ò&¡öfpI鼩æ XãÈ Ñ%_(gX2eFÞò ™{N«SqPÚ—¢‡§Ñ3üáÙø;sv,®5ó’ ðü¶ÇãéDÔ ÜDg‰½K¿/ÑhY?•Wžœå›½Ìû•¬~¢uW¥–^S‰»Åùi¾d—*-½Fr-‰Y/³ziÇϬYüðƒù9X²¤ìãK½½•±±fˆz½tíZŲe-,hÇWK3XXÈâãC:txÐð1F¦Lé°uë ´|¨=2ÀüOÎÖÀaO=XÿÖûŽŽ^¿~ý¶mÛÔjõC/RVk4æ¾þ9À2…  .äÌŸßíóÏ{=¸qc$€—^Jûí·‚áÃŽ3£³UTdìØ1/7×øÛoNS§Ö%ë˜Vc °lYÝ}«+›ö l )ó­ü¸“­ˆÞнh¦Ë.¢Ç\îòá$–O•ì²?– kË8:›¡"ev­!› Ë _+NO«]­¦œfÇmÜ­{‡ÔË;'Õi4™m~ \ UÜ99Ûª.~4À»éýÅâ–^JC€5­™)ÊúI70¢ëz<wÁKäÎÓÃkð«9©w=¼úseרdyNú&3 ìàæÜºâöÝ]¤&‰ÌDÜ£ð¥Ådú6¯‡Šê³zÑ«?ýUõ‹Z4·¹’ÀéÂû%ðî;´<éÞžx)wÒ9z—ÓzÊKÜ t£‹ lõ«´•SFl ‘Õì%+ÚV’&n¦ÀÁ7%ö ”Ø[àn[õg¸«po¨M}3Re DG¾Ž<=¥Jô”Vÿ[ýÙ@‰Žq^¡gE›I¦£¼ÄBйYÀ5@†ÜƒÀ6Œt—ržÄ¦&çç¯s¾’2@…U{ýàjN',™äc+¢hG»ŒpǽN›*ô'ˆ=NŒƒ%Ê¡tAW Kψð7wpÓˆÐ×÷èî" °&¢Y@Ê]ªlQ|HëÒþf*ÐÙÅ6\ÛŠX‹ µU/óg%V2¶:ñ”脱 ¼A‘i®ll+éˆÝ`ÙM¬ë8¦52î8ÇîÐÊŽð'i-ò-9Çǡثˆx…N¢ZXNàrRòy½?kž—<±Ðk ûƒ‘]óyZJÊž¹œµ{ðkÇ¥ÍØHqÒKYñíÛs;)¼9uŠ¡CÍ{ý[·ô;çWU ýå:h™þ¼jUîܹwÚ··Œ÷kHøê‘¤öíK›<ù/ggË„„Innÿ(˜þÈëá ñ~ ǬëýûûûOš4iÒ¤I:uj Àú7òÏ”Tú(à{xɦo)ý†2<ŸV°¢­¨h1®®¡ Âé#Ú:HS´bÈÿ–«ET9bùÝzHßšŒgH<Äe Z9ò'ðG }=Ö‘˜˜eý`×'fU[µC+™‹t€-Î^ôòg ­´„°ÉŒhsˆJ倀P]°ÄÅ?|]ðs¤}#ùã Ie\ÕQPIšžb=EzŠ h³»[%.5~/'%NwÓÔ­Ûºéî§XOqµSª¥£‘£Rà¤ÄÉg%ζt±¤…ÝïN«B]ÌB’ò‰)á¶€¸Óµ„Œ– nÃȆ`¨}Ú}—Õý*Ñ5.«^Js>B1ÝÊ ·a 3K·Šäæn"K¨AÚM¤‹”B—Oå×D'P(Gö ^Ïâ%ÁàrWsW‡à‹ÍrÚµ’^̦˜Kßtk]€±;›qqÁ¡8Y‡¥BíEFƦÅYÎg‚D âF%!ÉäèxʉíÐÒ˜BÆÎžùqŒÏbgÊý5•È«¸ï:OïØ÷,c½%»Œù£ñôöäì{XŠNwò ˜KžšžaÉ ’ç¹7”§æa©"r]¥*f®<™Œð}ô– §«ÕtéBF†yÞ*0thá_UMŸn³q£™y87Wïãoš¨ÒÑm¼4ƒVkìÐá¥R¶tià”)frÉɬƒý{–ÉÓQþðúëa¿ü’4mš÷¦:RõìÆ²ÎÏœhvRqíP¬~ÆÉZ´õLPû`Ø‹„ºÏÈÈBbu4WpÔ™.¢á|»Šþ7ÈÒ1Üý$Bt¦Bκ"0±U„Ž¡»HÇ!1¾(©âË!¼/.ÜÇò£xØse!-E#½JGð\ºÉnué wséöj~xŸ7'Kަ© Ûn¦²pK?¨óŒyånߦ²’°°º™×ÀæÍÓ¦5¸Ž^y%}ãÆüaÃŽo°¤‡IšaÆ®/¿üµ…µk“fÎ ó÷w¾vmâC+@?Ô¬ƒ=Xÿ…ÛÏÈ(óòúÃ`’’&{y=ĉ5wnªU©ƒ¹:Õ§¡6ƒ[ñÙgÍ-2SÄ÷Á¾ëª*úô!&†7ßä‡êîûæ~ÚDW?¢ŽJ4ÜŸwóÆç8Úquž"úª ðì v†Ó±%Qßb/ ¬i蹌”|¦öá7i=ÄÝILÚ‰\ÆÁ)Œ¬YUl?¢øv² “ýÖõ­ÚEåüÑ>ã‡ø¹H™žÙž¬ò—í£,–ÝC%c_{FŠž±fªÙ¨A%c³#ÏH£¦z?LåRJÓÑû¢üçÒ·lÚ…¤ÄQ®@ö M_¥¹xЧtùà4Mêqk²)ÞÅÅx2€&8Ž#0 ý¼‘Ä,Sã,®'–FŒàˆ‡Aégõ@Q ÙùÄ’X@B¹¦ï•X9ѱڳ傟¼ÑA½Æ˜2=…5žªb=År,õ”Õx¡œ”8U;¥þÈkÈ4d’XHR>W«õ,ªM•#žÎø»ÓÕ?EÃ7+`ÌâF§3ˆ«vY9ÓÌ—`ž°h ²‘t«\Jöu…À»ñôìw©8Ý ·wéî$uM]¦t©yèœP.¦m´·”#|ˆúO*äð.ö³$*TµBíS`’râIzF’aÀOÉ1Z‰ü¶wµôO&µŠAöî€xÅw0‡§.£øÆw¤½ûƒHVÄb­äø(‚En­‚ z¯ãv/taËÉ.b¿…Œ“o3@ꈚñ=ëOÐÆƒËßInLyУžàÐʺe›ÿó!k~3?×:ÄØ±X[ƒw=é~“ð•Y&p劦W¯$¥Rv횟Oƒ±¼%Kn~üñnÝ®\ ~0fÒéŒ>>;RSKwì2yòÃóTj °Æ<¼Ù#_áÇë_ÿXMš4)((pss4hТE‹:v|H´»‘Gn¤Í˜qnýúë/¿ì³aÃC’1L’ û÷>ùdÝ•«ÉÂÃËú÷¿ae%OHðóô4‰0±/¯]s³´¬;tèÙÓ¼*±¦‚îCIN1¿ª{v;NÐËŸð Xˆææ²Jz¿CâžíÏöy’]LŒÔµ/0CZÑá£Ó, ÃÙŠÈx¹ «¨Øõ츬ˑÀŸçÂÚÔrП h¾ëÍÞr™ÌTúK_Þ—ªÍ»Ë×9ØÈ9êEQ8E€Jøª|ãÀÛÒ¨ÑAx40¶!a]ÝD?“¢ëè­}†Ã Ò7¢a Y›É 7Khë"y%OÁ×\- ÒÕt 6'pô?¹˜ƒð§ÕDú6¯Ç¿Ö¢ #ì"õè[ÑÊ×@›7,(PNñ ¯^F À¢=|дùƒîXH\‰W rÂÇW:9ѱ‘ùƒ ¥¤p­„BªP›6Y`ï‚_µ»Î‘ö Õs4YI„Ýà¼æ¾b»e{zúÒ߃¶ íRJi4Ñ©¤¦“øà3Œa.õ¸whJ¼£#é>˜Îõ®'•’UÄÞF­D>•Žãi'ØF„õÜ[O¶!û%xzH;d2ú×kúóž—öçŸ`Í µGé]H¾‘ÞrÁM´-OOÈ ’*écËIoìD›.1ä"‹¼øLªo¼:ž9XÈÙ;ŒÑ"…8‘á[M# ç¦c#º|SÞÌ·“x[š7óË1^ÿ+á_ }¶ŽO~¡…1Ûp“¬¿Âö¬yo}q1:‘™Éʕ̙C}{åõÆ æôëw=2²|þü¦ŸÞÂÌþdeUúøœ)+ÓŸ9Ó7$ĵ¡fÕ¶iSòôég|}âã'ýs÷`{x³G¾†ýÿë뿹vü?´'Ÿ|r×®]¥¥¥—.] ‰‰‰iÌŽ2s¶xñâððpS›¸¸8µºvÖo2}þðÃnVVŠØØ{·n•Ôo&>‚³³Å /(”ë×gh4q3µZ}èСêÏAAvC‡\\_|‘cö>øÀÖ×W©T2{v¢øqqq€¿?Ÿ|‚Jeüé'ŠŠ$×`cͯ+Q(„°HÂ"ë^ê—ÿ)iæª+¯à‹M’MvV,:ÙÎJ¸•Ūƒ’M][òN`²LÆ—‰¸]{ Àg v/0 ¼{‚Â2ÝÖtÕ¢¿]uoãôF'\&†¸ñ£—F.ã`ë3$'ZÑ’§EUerª´v“ V8ðzA°§’E¥‹®a,|uíš3\ƒÉ‘˜hz’•qIE$?M%ŸT<››\^äV«ÕIqñ³hñ íQÆJÞáÖUÊÄO²®«éß¾ÐÂåaÒpaÏÕ³u~‹.´ù„I/l©S$pg ç~'ìRÒUñ¯5˜ÁoòfºäWäÇs’“kY^“PÛMÏÁ'‹¸6£ÔóG3·†›D^bïN>‰çÔ¹ gê÷ÓlhÖŠÁ]™ë7«wÉ,jÏDG:ї̉üvT˜ÆÛIü–CTaIv#˜>7f\ˆ¯¡úï?9‚x“†ì ŽV/8!LIà—ÖÝ#¢ µ%NMôeš}Ì´al ä£vL©›ÄÇ%š=x\\œZ]œIÒ_¬=ÎOW9ª¡Ä‰¦½xªýÅq!L­FWõ¯!ƒŒ]ìúßB M'ÝÿyñYžM —œH@¸Hòì’ }ðZÂ3#è~A| Y%¿‘ô ñ–(«äËé;v2ѥ梩¿~¸2xfkðJasEᇨ¯£÷B¹4:£KÜmÑ5°¶ƒs³³W×ÌûÕ?XÉü ŒŒRèB]êMZžI!_SÕ݆£^ØÉkŸÃåb>¾A¥Ax£Í}teú5×]gW r¿ ¸®Lw1ï$™%F+ÝçêMÅÞûƒÁðt7 ]Uoºp]áÈd¬}ë>º2]CØUN_F.6z]™®!¿oÁRe\üÞ}t%þÑß_+ºfÍ2Ó(º~]oe%[»Öñüy3}ò·ßò5‡ 63m2uÓ5,_~ËÕÕ"$Ä„®êÕz½qÓ¦hGGÕ‚ÝårÙ£Ž‹Å‹×‹ñØþöÿV[³fÍþýû;ö_?òlöìóߟ0uª÷o¿ xpK½^5*òäÉü¹s=¿ûN S«ÕŽŽ÷}þÙÙº€€¤¬,Ý®]í&N4CjŽŠÒÂùón½zÕ% ÿ½óŽ¢êâþwÓ{!PB Z „Þ{ï <APA‚E@¤ƒ‚Ò¤WéH($”P’Þ6»›dû¼,Ä-Tž×÷}8Ÿü1›;3;÷îÌß=çw~‡Ø·AƒØ¾ÝôØo×ñù\Ê•åæIJ‹WWîÐn,* GVÐI¬<ø:½ žM'1ctþafýNw®M#Ðè„ 5vsü¡~Òµ÷ýnÿ<ð Ýö©ÞæÅòÝÁ©_Ï6¿vu6^¶ýœÂð›H$ü\ÁFKDÀœT¾JÇQÂqù3`{ïç£éÂ:OQÌï.¼ÑPŽò¼.nñhï¡h.²ôAØ­Ã;D.LG½†”ÃäÚ"CÀ{”5 ^ u'’QØ éLÅ!Tw7‹@ <ÉãÜÖ£wéáÍ ±1ãå’{ƒ÷¹ŸM6à„Saá„›;Eþarîq1‘;9$8Ó¸&­½^GÅJ<—¸\î¨ÈOå|qìKSlðpÄÛ<ðtÄÛ„:SÖ‡Z¥uÅBHÝš©(¼Ïå8ÎÉÈl±¯A³ªD”µªØŽ Õmn_çºá²Å¶>õC©D%ó4…‡¤ïâr2Ù@3ª·¡VL=z„c$þÂ9j[$ƒ îFeWñx‰üÙ<•¢ ÅõÊ×Óáe“‘D |ŠÛxÜœ¶>€ŸÀ6Ã@ñ·o,d\>Z˜éÆlw‘K-¶ˆÎ JLl×!l"m#izÇý+*ûŠEš=$ì牽+öý êMesb{Ò_¹r—dÀ¯45WÌtèîs?šèÇ/ª,W¡JÔ †5ÝQ=º'ÜŒãl;=ñ 8€êþ9˜ñJ0-J)÷²¸Gl])£ ÕÚÎ68ØãæD)'¼íq3l;RªxÛ _3¹µŠ\%¹ÆÛJò”äªÉ7h©[4WÊk),EÍÒÔõ%ÌÅŒ$^‚éÑeò4iÜWRMàŽo-kÐÌɺ~6ÙQDÝä¦5à†[]êFáa©Ô´”‚}\»ÊC¼qíMCsºp‡œõÄ>EÔÁg4¡•Äg3¾ñ"ð˜O%ñƒf,Ò§hÝ,Á³·Xy¤Þ#à »@\Å ¦Ê¦¸±HÌâ»Z@÷²µ4våP>F?`B-/“¦¢§{±7êÕ§ô?…VÏ×L«šï¿Ç‚ D§š–y&ìäû?ðuãê4ªqá•jZMãÚÚ×ãèìŒæ(½ž®Ÿpü -ësz¨ X´Ši )åÅÍ“¦ÅÁRR¨S‡Ü\6mb¤¸R¡Á†•þòKQ“&.øØZ )÷ïÿxïÞ¼.]<±šè—Ÿ¯ =›’¢\¹²Öøñ•¬íf0F_£Æ¯˶mkû÷“‹íµV¿—ïöÚ×°÷-Àú×÷ÿ/À ôôô   ÿ2ÀÆŒ¹°~}ü AAÛ·¿\#nÆŒû < v½u«¥³³evˆ^O«V÷/^TŒSzíZÓjw€J%DDäÄÄh>úÈeÕ* î=//nߦ¢ø)é„u +‡Sùr‚é÷Ï_&%½AKÙuêåˆü/#"SÒt1±©t©ÅÁþ<êò²E—¿ý(´wû¾ÑÌl—çÍF"ùm|c_ÿNG(Ð2±6߉f³î3ÿ!6ì§‹ç­Èä³dô0¡ Ë+ˆÙu ÝrÉÒÓОå0Nʃ^p¼á€XºP!|…|@œ–áé)F3בÏäI6oìæR¹©Ù›5…‚ÄF‘ ”Ãm5Ã-%ÿǸ‹+ÙÏ_«ߥ™¯–z:éQDÅ£A¸ã^ŸúD˜¨‹-—Ô8þP Mz‘²'AâEÙ²•#¤5_G)TK‚TâQ!5¸‘ÔHUHÕÈTÈŒ¤>­š=nŽxºSAAšÁ)%¼‚4ƒž/¼eŽx½øè列å­UX4=ú\’Ÿq/„tª)2ü¿<5%HBi]ÚÖä¯ÌÁn*4¦±5°«A{†»‡¹©Bã€]ju#ÌÑÌÏ—MÑVîÿÁ3Àç¡Tokµ3PÉ“Û(¬eZl¢`>r Bmì×áUI d3 DƒãgKç³¶[XåÉXñÝt0Ÿ)ÔÓË‹•1®ÚõLI‹Ë<-¤/‡"D„÷S)ô8†RÇÌúÌ ðìSºlC«gEg>l(jÚ|‰÷·boËɉ´2"› C¾eû9*ûqm™ˆØÌßȬµ”)Å_LW€‘Ñ´ì‹VËþéÙQÔ¤×Ó¡gÎЫû÷cnû÷+ûôÉsq‘ܼél!·ôðáüîÝ\]mîܱL5˜A·½Iï‹›¾”PµfM܇^ü§’‹íµÖ»ÿÔ7v×[€õ¯ïÿ_€A+W®<|øðñãÇÿñ3—l©©…AA;U*ÝÍ›ýêÔyIÁ)µZß Á…»wåŸ^uéÒk»Ý¿¯¬W/^¥ÒŸ:ܶ­…×pl¬6<<[¥.Õ¥‹…g¾öî¥];Nž4Ͳ9}‘NƒNì¤XÃ¥Ø?sóÆŠšŠÔ´˜BtÃ82G¿ždñ5Ù ¦væë>·þñäÔ‰€Nb·¾Á¤Ç¥þL>ønP‰ƒ€Ïèy•ŽùáÌG¿ˆgé#\l9*0~ÎáýD4Ã|Ø(ZI?ÒÑ9—-Um9VŠ £©RC`8Â/Ðßl¸Ž üŒ|úòØ®Á«8Ø—‹v6O® 3dÈO¤¼Ù‹ùÙë‰MFÔÃ÷jU0ó‹hÑŸ#îw¢”¨í±kK­®„9Y ·©PÝåîU®êÛb[ê hPÅ:«½R¤ŸN‚îÏ2ÏlY4js”Šœâí"² Ì—ÚÙ<'”à÷2l8âaM=áͨ<ð-GˆAå¨nMQ P ¸Íík\“!q¬E­"Ì+4[ ‰»¸œ¨CÅ4ó1ƒÎ*t{y´—5zGlûRµ?AfXí<Ò9$ÊÐúá°ÊuÍ‚Ÿ#=„‚ËWx8ˆïÃGÐB8&.Í©*e·G ¿xÑ_œSx IDAT·5‡Q‰hÞóaC Hï*SE«+ÜSÐØ›“D ŠW2èx…†ñµX)VË»AëŸ*ù°!?t5]xHû娵lÊ(ñü³ðW¦ÿŒ»3——RK\Úñl4íÇ!ÀÑ•t§bçJ©ß‘ÄgLÏÂi&#ʲeLšDéÒܹƒŸ™Ó33S_»vVf¦~õjÏqã,,`d2]hhܳgê•++Œoõ8r$³[·kÎζ·o·¬Ví%Ï—R©«Vmç³g{ötèׯrÉ;¿–½Xÿû`ÿ³]»vãÆkÞ¼¹Ï³gÏvìØñÝwß?~¼~ýúf'{ù™ÿ¦iÕªØ~ý*ïÙÓá¥;ß¼™ß¨ÑEŽóç›4kV °¨V7wnÚœ9©ÁÁN·o‡X”ÅZ´H1mš< ÀöÎßR¥LwÈÊ¢NÒÓ-§ÌL_Ä•ø•æÖIÊŠ's7èð!Më0õ=:‹'ÍÄL">#3ŸÏû°Tìi?ÿ/&ÍÖŠC>&èt’µFßøsý~ËJGüùí{Ê;§ÐêYژϢwŒ»ÃºD<ì8Õ˜†&‰B2ú>F®£‡';«àbÔõt=]s¹©¡¬ GJf]tð!¬‡2*Õ$GÇÉf KÏÐ#/|‚Û§¸›xv’¹‚gZ„Z¸.¤J€ãJ‹p„§Û¸_ˆÖI* ¡º‹bRxˆè‹Ü¼píc%ôâ{…'<‰&ú÷ôè²” '¼uìK$Bý×À–5S#W“}ózý°0sëo‚'kö÷A•Á’HºÊÕâqöÅ7œð0ÂÌ5÷‹- é¯\ŽãPßwiZÍŒ'À%Ò~$.“" 4Ã$5KcJÐÑ!¬~‘¾ÚÏ9Tò×M4ãÈKBçd)^=ÌÄ#ŽÀÌüüžžà u)ÑÞ´whE&Ÿ&#À”²,פÚFr3ŸºüÑo£;îVm‘§â½`6·=M ¹4ßLFƒjñK_[ëI6‘%ç‹N,î+ú®£Ñô˜‡ °=Ä2R³<ƒø'ŒëÏœÄÃ+Ð{¿Ÿ qÎÿf*mGx8EEüþ;=z`n=zä:¤êÐÁñøñR9â~˜´fMVD„ëåËÕmmM÷0LÝ2™¶V­sÉÉEß~[ó³Ï^žÕ»|ùO?½R»v©[·úýƒî+Þ¬‡ý{–Å<ˆâ«5¾{Μ9³jÕªóçÏçççûùùµmÛvúôéÕ«W7?Üü+þñî§¥í,*ÒFG÷ 3׳bS§Æ/^ü¨F ·›7[Z+¶ V õëÇÇÆY+­×Ó¶mιsêAƒœ·o·@ÿ:vŒ®]qpàúuj‹5äu::âÌEËd¬ïw1a)¥<¸þ3UÄî¥xÚMG¥aãÞƒÉM—µ•êÒ £¯ö4*àdÕ^'ªö.ÞAâì·ëã¦jŠ~â­qA`m >0òèé†Ýb[ ^öüÑ„zâ`Áõº%¥¥‘+‡‚ð5––èŸÇqnöxÓIìÝû¶A,t-˜Ö1ÑÀä«QЧåxz‹} 7PÌàq&OìæP©…%ñ*ê<<ÌS=B)Q½#̉íÉØÅå§du lFõÚšïVlrä1Ä\åª9/<+hd^ŒÅÜþ¯ƒ­Üþ)PÅ Oá5®e>缿ÜS$“s…û«Gpǹ ›SÝ<à˜@þzbãÉ‚ðü€ÐK‰ 騿äqŒu¶MÌG¦0ì×à]Q¬õ /á[p€Ñ°Q,9UG—DŽ’~•ÙÕcà‘"§ùfžJéP…ƒƒÿ¬šÈ•4]Ì]3:ŸL“Éä°h8SÄfµ†Öc¸Cÿöì\(: XüSPÊ‹'‡[5š6%*Š1cX»Ö|ÔÙ°¡ðƒò½¼lbb|+T°@؈Œ,hÖìžäúõõêY гqcR£F^—.53a&VP ­ZuGFFÑÁƒ»w·Àù;öÚkè?ûý’Ÿß¬ÿáþ¿ €Lš¹lYLÏž¼\W¥Ò7hp!6V>mZÐÂ…Vµ»®^-hÚôžäÆÐP 9)OžèêÖÍ’Ë…;¼´°ÃèÑlÜHX‘‘8ˆ—­é™„u$=“ù_0c¢¨I0…½g¨S+?šùúé4#–ãäÀ i,´“¾‹õZÞÅY›Äø5ü¥î8áÅ+Ç×Ë=Û£µ³ƒý±!´;ÿˆåãKØHø¥ ƒŒèž:A7ØFGÎ5¡†8àvOI§‡$©©éıjT0êZà½|vá á'O‰æ$ ƒt([Áü×:r"ùRôØ®Æ+BìÀÈC;›§—É—À0ʧ¬‡%¥¥Gä¯'6®Ä7«Wyð×¼pM$Ë—Æ·¢¦uÎõ_ ›Øÿ»`ëU{-»Á´èn“xøxRì±óÀ¹.= w6ór™ãìNT0G`z„}ä¬%5MŽ‹¨\S<ò9è?Az•Fâ: ¿e" †Ë`Óa–X†'VK—\’u„ÚqT,%ªxï);rq°Õ,9·HG—kœË¡ª ç›`4 $Èhù;i…ô dOì¾/»–?ŸMãòœ†«± YOï5Š¡¦?—§àiôTæÊi4‰„44g×f¡‹X³‡Še‰ú™Ò⋼zƒ},S¯€iÓX´ˆ*U¸u w3žÅK'OµZ ‹‹‹SΜé?ožUº3g²Û·tp°‰ŽnZ’ö¯Á/¾5uêµððÒ×®õùÇu^` ÿ‡/ly °þ‡ûÿ†Vv¶²J•r¹&2²w£F/¯³{õª´Y³K —/7kØÐjúá¸qIk×f5jäzùr K/Ðõë ÇŒ±º+( ,Œ‡-×>s‘ŽVÈXòB¿GÜcwf›y-úu¬:DYo®/£ü ‡4ñÉö^ ³2gž•V‡OÓ¼¨åìãæ9³õªn+®âáÈÙ÷RÞdúuìmØÛFðK­§OG2)ïÄ…¦T¯!Ó4tyÈí"ì9Z:F“¤Så,Q ÅL£… '@ãáLƒm©èÆ!½Žº„páiòn£pÇn8~ƒñ³7{w¾blHƒî<ñç‰KG Ø`S—Š-©B9kl^€ƒÜ0&Â7¤¡ëë#š ž¤q?•™<Ö½ ®êLëÑ9ãnN¸9áîŒÇ‹m·WÄs¯e* ŠP(ŸÿÉ‹½ØV’/#[ƒòžoü¨îOpÕJµ7±×%°,éyâ¯ð à‚c‚ÛS»”¦Ý+EŠ(äËxö€ÂFx8c3ˬæ%Ô#Í@çƒÍ ¼Úš)Áþ£ *ÂvW !RC÷\rô4qà 7>F+ÐÓÿÇd¸Ù°·*ÅÒø¹;ß”ÊFÏ]²‚–y*§]9uÆÉèz 5tø™ËÉÔ.ùx‹feÅi|\¹:ªF^W­ŽN³8Cýª\XŒ‹¸‹ÛŽ2d&N\ØHxMQS^>õ;ò4™)±hºéØ^ºD«VgÏÒ¢…ik±û¿o_§½{-#ò9sRçÎM+¤èêÔ9÷øqá×_ט:õåÉ€ …¦J•YYÊ'ºvè`!•øoÚ[€õo°·ëtÚ´k‹ÝêܹÂÑ£]^¾7Lš·lÙã·U«ìÚ¶µP1#ŠåêÕdz *™Fpå -Z œ9C+3Áù‹Y°¿ÒÜ<¿8@p?‘ˆaÈ X9™ñâP½VGçÙœ¾MX..ÁÅEFÚŽÞò“w®GË–/W>T*õõëŸWÌœYmÞ<«ì±C‡ò{ôHðð°­Y¾¼¾íKafÌ`Á*WæömSW¹^OÇœ¾H›fœÜiJÆÚ–¾“±³åÔjZŠ“нúý›ñó‡²_ûwÍŒ½¨ìœ~ˆø2Íí9D’HØ::|H“çTž^;8š@o.šÍ“"Yƒ‹ÇÄ…ÌdZ>‹eS2e9A˜ƨ†W®˜R#€¸8mƒÙ*•pèP©®]-¤`¿T(Ç`gÏæ´m{ÅÞÞ&*ªEíÚ/÷¡J¥ê*Uväå©þø£{ëÖVcŽÇ^`}ðòÝ^ûÖ¿XÿÃýs ˜5+jþümÛœ>ýJU4/^ÌmÕêJp°ëÞ½á5kZeÞôíûhß>i·nž‡YöB—,å¢ÕÒ´)ׯ3j6˜›‘E½¤g2o23?5m²’%[ñ+E´™ö̽g4þœByÑy_ɣˀ^bóS½ññ¥ÿTìY?äÀx‘E¡†Ž?s)™Ze8÷¥Äq½γñžœîN£™BË€hŽeáfÇÞtûòt%³. [ k*2Zü<­¢o2vŽü懧dÃ0Ô*úVbŠ¡²ÑGzÎ: F‹ð;9«I‘¢µÎøL¤\)K)~wÈÙ@ìë “FC!Ü#õñ7yjHjóëÁÍ©ájdRøˆG?AsÜ`vØ•§|%*Xžò¯¶¬™ÁóT@~±J¼-Õ¡  F*÷[ì]ñtÁÓWs— ^nx™k“¾® é¤'’ø”§I$ñ´\q $0À*Tñµ’ü=àW‚[âb¥V£±Þ¬öý¬èÍê³–”Ü÷É'”ó1»O. 4}il¾Ç«¥Ù—n…¡ªÃNK{"À\9sH`–sÄïýb¡öÚΫF€øËÓTt¾JŒŒ@gŽ7¢ºÑ„$SÓî0QYÔ*ÅÙîø݃‚À‡ØxOGξG=qô¿8mprG–ˆe-/ÅÓöKÔZ 3z=Ý'rô2¡œß€£$]»I‹Þh´ìÛL/3åôî“ׯS«–i«Z-DDäܾ­7ÎeõjË5~ø!ëã“üýícc-K=J¥~ذ[»w§Î* ’Ö”{Ÿšž%ùQ ¯òà,q¹({lëØ‚¬–›5X)¤$‘ô˜Çé¤ /ê-Ú`㇟Á­H ã›,ð¬A©Bi‹­n%ðÉþ¦éÑg‘D’¡³Ê?yZ¸áV‘І¿²”-ùd^áÁ9âsvØÖ}ÙP[ú5C<- é5dßòìE@8îŸQ>ØL6V•v\…W1J“Ã8ØÀPXiôQãòÙPˆ-¬ñd´øÎÉéõˆ|­ÝÙ_Oñ-|OA§«$QÓã(o¡ µt9Êù4‚<8ßñi¿8ÉÒ˸Øs|ÍÅîž¼Ú~Ç­dº×áÀ‡"½†bÍ—É}Y2Ât¸f®á«Møxõ3•ÄÏr1õjò‡,™az`Vµk“‘Á÷ßóñǦ­À¼yòcÇÔYYú[·|]]-Ü©©šÐÐX©T÷ÛoUûô±ÊŽ]¸0aúô{Ý»—ùí·†¯,&é^¹Ò»qã—“tÿš½Xÿ{ °Þ`÷¿úêÆÌ™¯e—J5ÕªÉÎÖìÞÝ «Å5k²>ü0Éßß>..ÔËË¢J*7ξ_ûõ×îS§Zp†­XÁĉ”.ML eÍ ÖÍ\ÂWË-“±re„áI*¿Ã÷_5ÂñÏÇßÙù³áÓ…À¿W\ÜØ°²wDµ–ñi¶7’9;‰ºb7~ªœf›y*¥}‰s¹5zúœàpå\9߃*F.¦Ä³ôXZ“Ifyô?d1! =Œ/Ãò ¢·Ó#rx¤£ªþ@)›P3S4 „p‡Õ0Äl¯ þi:ºRØ,Ç«½¥÷h"Ê5¤ž"¨€ãG”ko‰*$G³ƒûGHÔ!¸c?àÎZ$f½è¸©[å(È\.ÜÜT¨RH1ËRHÑ¿ˆîIˆ†H¢Ókà^Å^³᫚T‡ÿT¨Š›  Ê€ _EÃB€{¤\ þOuè2x6§z3j¸Ynµ…ø—ú#Ÿ¢\γ‹äqüÐÊ-‘‚nÒ(+yÀ x·Äû3_àý,Í^½«„]Þtßž¤ zB‘žÞ^쨌 iûº”n×ÈRÓØ›C ñ1ÎÉÕÓû8G“)ïÊ…žT»Ä]dÚiìm80ˆ.âuT‘†N+È–ãçÁïán4–%¨‡.Ðk8b¦)ZL½ŠãÂ~ÓõУ‡Ñ¡Ç›f#‘‘šæÍ³K—|5²¼ªéÓçÑþýÒîÝ=´JZOIQÖ¨qV¡Ð:T§[·W’ZøüóÈo¿éÞ½âÁƒ_eÿ¿foÖ¿ÁÞ¬7Ø}…BSµêÎÌÌ¢ãÇ»vìøJy"³g_™7/§Bç{÷Z»¸¼¤~ÎØ±¥×¬±üHŸ:¥êØ1×ÁAríšO:¦s ЭGÒ¹3GŽ˜Î>z=qê‚e2Ö­4A‘ŠÍ³ñ7ž›?óúZË–û¾µ7‡MÔKžÏ”•|]"g¶ñus¸=7ðâÒT33riñ#é j„EZºãl*ݸГŠ&Ôõ'|‹Sªòuˆ©SbŸ”ÁOPêéëÅ6ñ‹$GO<Ôq®_»ó‰Y¾ÝK=¹è?AzúÏp¡»yò p Ù2ž%P4Àý3ÊW·Tå&ÅFâ¢È¬I©Dd-èFåJ%&Äe"»È½ËÜ“£œphHÕÖÔ,o¦mbjÔÏxf€&©¤ê^Ôþ“ ñÅ×M*SÙÙ:³þµìÎ;µMDØþªiФ‘–L²áâµFŒxo¼+P¡"«RÕ‹—”-¶BÔÑ<:ÍÝ4ò$µ¨Ð–Ú%ÓÝ Ð^ õ0Odhd¨½pJ6”7?$íÒv“¥CðÀv8eágîÔŽ¡üì…2ȼŠ=šëPYñ°QæQ¨Öx8Úoö¤©<ü”ÃèD´–æûЦ@þT6}£kéáÇ®úWðÒ :ÍîÇ”qæ\Lª­n¹ÍˆýH$lëË@q0N££Ïß¡¼7'‹*Á —ðëE u·€„dC*gé'|n¦ÒôÍ&ÏÇÛ“'¨TÁ´uÝ:ÆŽÅË‹˜*˜µ aaÙh§NuûúkËOÙîÝyï¼óØÃÃ6..´\9«K—ÁƒoîØ‘òÎ;3fØ¿Êí],”xõjŸ† _úÿ²½6ÀšðòÝ^ûV¾XÿÃýÓ X²äö”)W_]éD¯5º•_r8ßP?G­ÖŸ;W½ysË„­qãò×®-¬WÏþêUÓï..zºa£F™›‘EXGÒ2˜3‰Ù“L[>°Y89pq B¸±yÝ™™ÏÝYnßGÌRÙ=_2»;Ù]šÞºvy@­¥û*NÆT†‹“ñ¯ðc2he¥žF–ÎG¸˜N°'ç{â'~ÝÿüŒ÷o£^žuE•=€³rz?"_G[wöUÅÃè…¡‚QR~)æÌž˜Ë~9Çe5ŠÅÈõÐ Çñ¸5¶à3'ÜL œ¯%oS4™ûx|›l@¡øt¡büí­;´¬¥¶5¢šÃëИԨ“HzÊÓDSI5ölU¦²+®®¸:ãì‚‹áÏWÃÆ?BäwJ[HaRhøS 0lPO¾1,C«¬"_Kœ‚ ›Wy¨F xáÚˆjm¨ém] ˆ'ï‰IU£|pFõæ8˜Å‹µ»ÉZGª-’^øŒ¥\)K#–Šn!ò‹¨2Ñ[,…™ï½à…u˜"_¾-àKhhÏo*Š/Ç:Ç’P;°-…·Ð +Ï&ñ£¤úÛðràLwL”÷ßcÀn´z–wæ“FâK¹•Ÿ.ãëÆùÏ ûå­UŽŠT4ÉÍûônÍoKM%S¯?¦^=ärvîä]KåŸ|"[¹² fM»èh_'' ór~¾.446%E³vmÅ1c¬Â Ë—óš7¿äädתR¥Wª§þZ¥>þ޽6À2Ïøû×°â-Àúîÿ`kõ:ÔùÈÅm||ëÀ@«Îƒ4KõêN·nY–f)(êÕËNHÐΚå6w®…UÚÞ½ôï«+7oRÍl!\LÆ:¶-M[Ç,dýoú³ë]¦A¹£çª&srž¯m%ÉïŸ4é^÷ϤLIÛeD'R§<ç&á%ž‘ a•Zæ´f¶XE"_MÛCÜȦN)Îöe-'³èý|Ù½³>&Ž¿»Et~HІ.©Fñ«mk壶c—õÌ`ÏK³´¢Qo¢p?E@7œfàhInTŽî§—¥Œ,Å’‘¤@¸bßÿžT®P¢C+•ÜóÄGò°5àŽs-*ÖÀ¿þæåðJ6ÿ¹ä–°¿vN89ãì„“;ît{A½Ò¢-¢H‰RŽ\Ž\‰Òü£‚—”i/Cá/ûØ Q'ž@Z"Ù÷Há…˪%5kY’5:P{žÔ£<}Œ ©‹O'SÖ¼$%pžüe$?CDà1‰òU-]j!Âjk((Bh†CœF`Ê Š„AðÔz–k¶ž÷¤V!ñ®,uÇxU%ÀçÏX–­„Uk†V>áÓ8ô*³Ž¥3MÔjiÙ’+W2„Ÿ6&8sFÝ¡CŽ W®ø†‡[vM•¸iSv“&®/ZÄh1@KBø¼ªéÉ'GòM .véB+± êz*í¶ WóQCV™åÃÍ<ÀWGp°ãÐÇt—³¿ý„f_P ä»QLìezàwÛùln.\ý‰šbz¥ ðÑ—¬Ùb¹à 0>³fQ®wîàmÆpS(„zõ²=ÒÍ›ç>s¦e'å¹sò6m88HnܨY³¦Uîݺu‰cÇÞ)™Îab|p~Æ{ƒmÛÖöUöÿ;ö`ýì-ÀzãÝ/®—þÛoûô©TòÎyÀgÏ”5jüQP ;{¶I«VV)5†òXvv’›7­NŸ}&û»èh_ggÓwk~>uê”ÄW_1ÝLY§cìTvüFXmÎì6Ë~hxO{}! ÙYwÜ ¿†Å­B‚Ž_¨coÇÉù´s2’óh¾„¤\zÖeïXìÄ Ä_b¶àÇÞ ¯+>PA‹ßIT08ˆu-L1V¼‚Î/RŸŽEPAì)ÈÐÐ-èBÊÚs$ˆ00cT L‘³² —›=1WÜï[WÊ2Ð}‹b…:ðÆæSÜÞÃÕ" (–íjâ:‰òu­¤^¼ÚS”èoÛQ¾3~V^í/.&ÿ‰HK ½Àˆ÷ísþÁ”­†9Jý# }ÅN)ƒóIŽÜücÞRï\¯Übw—;în¸]&Ýþ¡LÃ\HK í!éq|ƒÙa[‰ÒÕð¥|ül­G`Õ译ñ;Oâ_øð‚ðìAå–”³s³Ðl u?9zOìFáÿ¥m-í|ÍldQ¨:ØÏÅ£‘Yˆ9†–Xi@KL—£ƒFöìô¦’-ÝÛ =ýqB†—-‚h)¾Ñtcï°1 ~ªË ³¸áW7™u[~ï„ ôA-~$³€!uØÒ“RÅ?œåãØÚ°k4ýÄëÄ9Ÿñ8amÙb&s9†6cÐhùuýÛ™¶.XÁŒÅtiËšET¯nÜ qct:Nž¤­% 3jTþ¦M…õëÛGFúšƒ3@¥êÕ‹»wO9o^ÀÌ™V3òò4Õ«ÿ‘•¥.NH2VvµhOŸÊ«Wß¥Ó wï¨QãUÙÙ^`}ñòÝ^û–¼XÿÃýÿï,à‡b?þøRh¨wLLÿW,™>oÞƒÙ³Ô«çÕ¢„¢¡cÇ&­[—Õ¸±ë¥K–]Ù*•РAvl¬vòd×%K,d6>MÇŽØØpù2 š¶ffÓ ÏÒødËt³ïÅíì×U)Í3|…ÅM.8Q¶þÕðÄçMT¼)6=z [lÿq–‰e"½OziIË1 5:b_¿j” Æ¿eì-…qí ²c$ž%¥-àC;*t¦b€uŽ—ý.27‘^ˆÎIJ%ÀÍÒ¥¢[„|/E”Åö3Üãb>ú§`è‹Z™[À<å,CÏ0)'^„¿ñ0…_º&p£²ö ¢ž™Pû;ÑÎÄÕ–=át6—”»Èºx:”ãÃPzWµ>“Ñl3Iùôæ·wÍ–IWþ#lÊHñZD£¥ã,ÎÞ¡I þXˆ£øŠÓsh0„Ô,¦`áG¦ý=}‘Nƒn¡«öR* '6–I“øæ³Á‚'T;ç:8H¢¢|kÕ²|~ùeÊ×_§×¨átëVMGG«OÖ„ w¿ÿþi›6>%Hê˜Øðág·n}0bDõÍ›ÍÊh¼{m€5å \Ãâÿu€õ§Ô·Vl£G‡ºét–-^ñÉ“«:é~ü1¹„Ý/.`/•ê֯϶¸ƒ££dóf/;;.\PŸ;§6ß¡];ÆÇÞžE‹P˜Q_Êø²{=ö\¼ÊÎýÏÿ)OMÙ;´1ºŠ hfŒ®BËyìag#Yü Ô0å'JÑiC8ô1®Ž\OdúÓ/Á”fhô|ÉÅ$QS+›QÁ•Ø’‡9(œ°¡\wL¤Û2†O¤k7êWÿt¥E‘´™Dn ö‰…hƒðüˆ:?Òn$!% «óäæþfÒ ÑµÀs¡ŸSÁ]!|‹|<ù{(rBònç)=Ä ]ià ˜éÐ îXBWGU ’rJ…¿ §|Xa†®ªx/‘8%ÁN\©aŠ®²Õ ºA¤”ÒœmbŠ®”:Þ;ËÉg¸ØñImSt•QÀGGÈ, e »˜¢«·Ùp½À²¦è ˜¶•ÇéTðå·/MÑ•RͧËPÒ>‚ùãL|šÌ·kf}j]³g#“ÊWf%S¬,ýÊ•¶¶,Xàn ]EGž?¯°±aóæJ% «˜yTT¾dÅ 3õR+—çà`3s¦UÖÇ["##GU¹re‡€€€öíÛïÝ»×x‡¤¤¤~ýúyxxxxxôë×/99ù¿Óú×ì­ë¿ÔýcÇ’ºw?îæfÓ¿bÅ’”ŒÉêÑãš««m\\뀫T€“'eݺ%ØÙI¢£CBB,ïöÝwŠÏ>“W¨`{û¶¯··)ªV*éߟÇ­ÒBÞÈOqtàÒïT÷ÏÙÑ»S†¦'ÞÁë§ê^ø Êz:]Ùº¢Ïó¹\ZÀ»‹9q“^ømºiáT<ƒ6’­`vwæô5 sÎ2ï<ŽœF¸˜c–YÄÄ+ìHÀÏ™Ã]D:ï@‘Ž)÷øþ .¶ì¬O1{L Ò˜Š¾­ÀD3? |­à+9èäÈV/ʘ-CŽÂ,ˆ‚ؤj„ ì ð1:$àú nfü.€TÔ¿¾›,àÞÏžøx–ˆEähÎGîeÒ;lšáßJ!¯S•/…Á³Uˆ*úE]À ûjøãL@E|Köýß²ld÷I»Oê}R¥ÿ?ˆ²^¸áŒÞ¯jÌ¢è‰ÇIÎGTĽ¾ ´X@°Ø´çž$ÏÀ«ëL©~”³tˆû(ú y::‰ë8\ý-A½§0"ÁæÀDLû …r–(`¬ sÝ-Ü¢× èž@––Á¥X^Òâ»éI!]®q_A{_~¨-*2HÕô>ι4jz³¾%ÍLÄðŠh³…˜ ÔdCO|xûöí+W®¬P(¢¢¢¦L™Ò³gϹsç …¢^½z#FŒøðÃÕ«WoÙ²åÖ­[...o´õ¯À[€õ_ûºwÞ9µ{÷ã-Êž=ÛÃZ ÐD+¨OŸ¨ýûÓûõóß³§A g9òé?æ„…¹DFÖ0WdàyfMΕ+V+Æ?|Hx82™eÕ`ôçlÜNP€âKïn9q· ÿÌuö]Ýja¾þù:ÔÛ³SZ´¨!¢€?N§Ñ$²eLíÏ×fõD÷ßbÀ:´zõeŠ8ÝZ/0tÛïàåęᄉƒŒZÞ9Å‘$\íØÝ.âoÀÇwY›ˆ­„j1Fœ¾|“ÁÏ”¨Úû:®(o!gYbò‚ÍÌX» 7QÇ,©yÐ8v ¸ WàeöLO_k×2Æ’`æ÷ßL˜ óò²¹uË70ÐòÏ:~|òªU™!!NÑÑ!ÎÎVc;+W>ù䓨€§¸¸ÖžžâÖnïÉ“#¿ù&¦F ¯7ú:;¿Ùy±½6Àšý®aî?"|ôèQxxx^^ðÝwßEGGÿòË/Å­C† ‰ˆˆ˜0aÂmýËö`ý÷ºŸ­¬]{OzzáòåM?ùIJoÙDí:5UY³æÙü|í¾}á½{›i®¿°‚}XXÜǪiÓÊ.\h¹šÇ“'ºzõ²d2aÃÏQ£, ò]»8''._&,Ì´U£¡}upÔÀêœ6ü§ÐÞu}ÛÅ)‚Ñ›Üpxó ?Í1=öômºÌA›&0¤ik1]ã‡AŒû‚Œ Çž{bO•Vϸ‹l¼‡ ëZ0Ò¬FöâGL˜R•E!¦­{ò˜’¬¬± ufWeBÍÒç ._¸±ÀÝô}«ƒ¹°è 3ÁlØžÛ43]G ÔÅ~>áVÞ¯—ÈßMÖeò Qºš¸ô§L'¼- :›‰÷Åûö”o‚ÞÁÿ$£è!i ¤?"=‰ìÒxeA.c³ÃÖG]pôÂÅómO\ W`|okÑ)P¢*D•O¡”Bóm…ÖÎ2xÈ(ªL™ÊÕ üë¦F,ƒÂHÒ’”‚‚Wö |7Yçj€*8 t7|\,ýF¯Ž°S` œ†tè ›±p¿+‘O®uš \ÇØ$¶çb+a–?_–5U†û#‡>×É×ÒÆ‡} ñ¿îã¥t>B’‚šÞíbªë[¤¥ë6Î>¥ª7çG N»¼•LÛeäò^S63%VÞFŸÄ?ãËwX`¦úÛLØ÷ =Ͱ—ASÔÍ•ÈC„š=æJ%Mšpëï¾ËÎfC±±Ú† ³‹Š„;½Þ}ײ¢ÇÉ“²NÚÙI.]ªÞ°¡Õ@pñ„¼x¯^¢ ÙZ¡‚K—Ò[µ:(‘H.^ì٨ћ*Œcnÿ߬¤¤¤úõëgggmÛ¶:ujÇŽ‹[Oœ8±xñâÓ§O¿ÑÖ¿loÖµû&öìyÜÉÉöúõ>µj½’Ê÷ß?0ᮿ¿c||OO««ŸË—-[>áÌ™àV­,'œÿú«òÝwó\\$ÑѾ5jX8Õ˜1¬_OPÑÑxˆ—‰‚^¿gäÈÄ“û uÛmíæß±ùÓ‘>¾uèæÕ Š,Ë.o<ÁÚ£Ü~Âo_Ò#´õÇ˼¿`ÃPÞ¯ÙÕ:zïähå=8?‚Êb÷„s£™f5`Ž™›ï§dFÇ YuuL_6ñJÞ}Ì"œlXTŽOÌf?ã­Vló¢œÙê÷4¬…=`#`ø™îòüR¡œ‡,úá<2V`S&šýdí&+-à†mG¼âW¥Ä 6Zô‘d'ñÙ¥qÎ¢È »xÕ¥tM¼ƒñ.AßÁšI)Ì$?…¥Á{¤@Y¼­BóÒ3Øc熓Î¥ñÈC¡@™O‘ t@³Ã¶ØUfØpÃÙgwœðòÁó/€ª\”qäÝ&ë&ÙÖ¤T¹¥plKùnTö-qx Ñ#ïW2 ºü6Hšá1ˆ2 M‹†?7 l¡àä²â_àîné'(‚o`1@kè [ ~%gžz8ñ£'>f÷ÎB>æ¡ 7Ö2Äl‚ٛƛ(õôóç—0Ó"9×2é~Œ,%Êp¨3¾âÁPë賋#-?‰wSiý 9ô¯ÏÎѦožeÓ| J5}šðÃ8SªÀÍû´EAßLd’YÝŸÓé<Ž_×Ñ¿»ùà1b?ýDp0ׯ›ÎZ€R)4j”£=ÚeýzË•š¤R]:qÉÉ꯿.7uªÕu,лwÔéýûûïÞ]RH¡Ø ´õêíIHÍšUî\3±¯7iÿ¬üüüÛ·oO™2¥}ûöóçÏüüübbbüüþœbÓÓÓÃÂÂÒÒÒÞhë_¶·ë¿Ýý÷ß?·yóýúõ}##{ÛÛ¿<É@¯Z´¸|ùrÞøñ•V®,‰S9cFê‚i•+;ÞºâáaÙ >l˜ô矋j×¶»vÍ‚„±RI³fܸÁ;ï°k—¨é̬)76­-þ¸?bÒ%¯?/fx³ÀŸF5Ø÷ý§€•eèÿaï¼Ã¢8»6þÛvéE±÷ÞEì½{‹±×Ø¢&ÖDIlÑ$š[lX£bA 5QD,ØEQ^wÙú| ØYDß/Þ×^^ãÌÙaæÙ™gΜsŸûÌÙÁ‚ÝX+8>?·p°ò&{a!Çs$r3ªttÞïé÷f`Õ-&_Ä(˜T“eMrO߇_0 µžEÙ垣û 6òåsVF|è̦²˜vw<«ep"\ålu¦‹Iº0–À"Ѐ|_"ý¬V#ÖºŠ4 ÂÙxì&b/Ù2Ð"|IÜOìe’9ÔÇñC\Ûà,YöŸ…G$_'öOžgË£ÙbYƒµ(X“‚pú[˜U: i¯ DeÕ-V¦Ø}þœ­2‚[¶(íP8agºì„Íß"ÖðÕMâ2>1¨³ÖgVÇ¥!Eò0Ò÷s˜ØŒW¬ºR°…Š˜¯úôC3›ä{è(àXÙ ©Î&ó’× V€I_Mž˜ˆ¿ù´ €•ÑÌ G#0‘]ñ˜i™R¢Ëªç¾M¼Ÿ0à4*==ʰ»¹YyÇ’FÓr ‘Iôtcï'X弃âRh9“ÛÏhT…Ó ±ËycDÅÑpÏ^0¢;[LžñO©߉ØxæLcþ&ã›73jÖÖ\º„››„Á„ Ikת*V´ vµ7íÕÀ€¼¼š5³?w®r%ÛûöEöí{ÕÑÑòöíÖ%Jä«Yg†ð•»»ë¥K½Š´¤ìu,Éõs[3¯u¾ö0ï,óÏJ¬³'löãéСƒ…… P(ÒÒÒ¬² lèt:{{{FóV·¾1Þ;Xÿô駦êêÔù-44yîÜzóLC.R I©[××`àüù¦M›šÍ_èõ¢Y³{—/§ ^ð×_Ëšùë¢^½Øû÷õÓ¦Ùýü³¿çáCê×')‰µk7îåÊ K¾÷_¶8ËæhÙ!g+ÿÉ_mQÙõ÷éÍ•–r2‰ö¶\"RLÙÀŠÃ8ÚræûÜW`þæyceÁþqtËÉÍ›ùcÐiÒ ô)‡g[¬sNñ‰t»L¬TÿÚ ü–Àè'$(£`Wyš˜ì?ÆÈˆDŽ™‘É~9tðì ,„a¹M^"£Jj ,–³pèžgìä.ªýÄø¯Æª7®QX²ãJv$¢ !þ6ñwˆ%)ëZÿë‘­üC‹>•ôdT {¬°µ5ïšü-È©ÊZoƒeœÝ(T× 8æíÀéçHÜOì’3†Î ûns#†þR¼IÊa9GÉ^à@L_Üa™™j‰éŒJ"ÁHi v;ÓÄdä’ ŒyÂÞ€¡ñ(M.‘€YwXŠ æTfž 3{ë}Fû¢7òqÖ·È](£½Ù,͆ O ÅO„ÅѾÞŸæ–Viè0›‹w¨Y†s?P çÛQº–Öc ¡yN­A™óÔÔé´èÅÕtlÍÑíJÈ!!4j„JÅ–-Œ!1tÇŽiºu‹W(dþþÝÝ¥ù‚Û¶Å fo/®^±¢ô/$'ë«W?ûüyúºuµ>1%uJáäÉðNŽ)W®ô®Uëíê¶›âµ#X?¼…c˜õ—"XÑÑѧOŸþâ‹/>ùä“9sæðÞÁúß¿â`~~Q­[{Ëd² z4lX8ç&iµº¯¿¾ûý÷kÕr¸zµ¥••ÙÉýáC»ûíÔT£—Wù~ý¤]±À@]³fq:8|¸@·nÊÞ½ôë‡RÉ… ԫǵm›NÍš–µ5¬r›5e‡‹Lƒò…ì.Ín]Èáå~„`ø\¶£L1¶R$ç¬b ^Ân_ 9q~1ULØb_îgñ –ž@Ç96%¦Óv+ÁQ¸áÌ\L’³ô:I’–6Å9ðN9'kIÒ죦eà#.¥a)ãë¢Ì).$Hczf£·Ý.”—Šž©p€Ö°Ì¤ƒaüÐÎ%éz 9Ê8VÉÓaJÃp‚„ÝD?B X!k•?"|þugë•JŒ‹S•tLjó"&-`‡EG\úSX²ÑMTˆµ¤þBša‡lœùðd,,€Õ`€‚0>“*’Ðfdêßö²f³&À¤1ð158Y°¾ Y7}Öhk||ÏQÈÙâÆ “›nñ5f]FÀÌ:,2Iß Á„c¬ ÄQÉ©a4ÈUÏ›B«%Ü¢IyNNÁ>—‚¼žž 9~•òEñ[L±œ³ ™ÍÎã”+NÀV ™LWyÛSSiØ;w5ŠMÆž?7Ô©k\ºÔqêTiZUx¸¶víÛ †-[ÊŽ‘W—ôqãnzxɽ5!MÔY +ê,ñißí·HÐM,î†Kì|®‡ žph!n>”ØúãjA1áPI„Ü•Ø*„2D€¨YS¤™üi!„Á Úµ‹ƒˆŽãŒf~ƒA´n}{õ’:‚lð÷—Ë(GoÝÊ=Ý™Cÿþ§À£Y³Czý¿s½ÖÓ ?üýŸ¿å ›œœ¬T*3–Û´isâĉì[Oœ8ѶmÛ·½õñ>‚õFchÐàÀÍ›ñS¦ÔZ¶,_ZÀçÎŵiã¯Pȯ]kYµªYm!èÚõa@@Z¿~.kÖ”–Ì­|ðAüéÓšŽ•>>Lm4š5#)ÄwŒëGrñ2Fªr*¶®íâÈ´ÌÆsBN`Ó™ /2é±›H£á!NOI;Êån-$ Æ$²7`¨ N˜´ H„E°<Ĭ8Œ‹IÉè±ÓESƒ°-ù*…7‹²˜"žôÄ…w“¸ˆÜœ­‚µ(P§Ø8£°{Q†· †d´±¨#H½A|qÑ99U5)P“‚µp-ƒÃkâÞ8:¨BD}’ô“h€ú(âXÛÌ@yÃT =¬€êfv»/щ$™ïA­gØcN$#ƒ‰…YRÓkJ/‡ IDAT¸v”†.— N¢¨’£ ©›“á­10ì {¡´À³ ™0¿´†dwíË3½)äÌé'§Ó~W¨Yœ³_PÐ$B4y=+½q´å츛ìü·?è;¹Œƒ?ÓͤEô+‰íkÖðé§ØÛsù2ÕL „E‹RgÍJ)TH~ãF¡¢E¥ÉO«WÇlØ­¿q£º««Ùà±Vktw?ûvÊܹ•癦W¥°k×ÃAƒþ°³³¼ví£Šó`þÛñڬů6{íc˜ù7D°Nœ81sæÌk×®K—. Ê%¦Ð AƒÉ“'¿Õ­oŒ÷Ö¿vúÁÁ±ÔéŒ>>]:v4éª%…?¾þë¯ÏZµ*xæL“<úFGFêÚ´¹ï^ú† eFv•´ÉŠŸ/[æ8eŠDü<Ø'Ègt7EæW¯´ÛõáÚq¶õÞÚ}Åœr:=»ÖÒ¿Gî¯ß~DÓ‘$¥òÃg|9"÷Ö¤4ZÍâúcVæôwØçô; F†lf÷\í9û95rf%"R較/(ãĉ¡T1‰ëÇkèq‚ QPâ݉¦9‹ú4F†³7¥Ow>’ ×2è1çS±ñMQfÔùº^Ťd4w+¼œ©df~~_g³JÃóĬtß’ƒáz94C9ÛÎXçM³z3ž9H¦Kaÿ,³çŒ=V.XÛceUA”YËöXÀºJ'”yðÍA‹!]*ºx4ñ¤g,'‡&c9 m|fSE,Õèy£ô_.¼1¿íú=¨w JÄ(‡¦(`Û[ÚÙæ.L…ãT…ŸÁ¤3òKdo‹ÙÇšN8›Š´¥0ô1‘: Y²µ,¥jãBUt àal9ÞˆŠ&R¢=Oà‰‹’CiaR9—¦ã£=ˆ½‚ßúåö®TZ:¯Ä÷ ãûÅLàëí|¿ÇçÓÒ¤¢%è.-F£JgÅL2‘ËÊ"¶ÏýœyŸKœÚõë4i‚ZÍöí 1©:®^Õ5mš ¸s'½nÝ;Z­ñøñJ:äåÍŸÞ¼û•+Û]¿ÞÊÚúÕDõˆU­Z{ãã56´=ºê+íß^ÛÁZöŽaêk;X;vœ0aB“&M\\\¢££Ož<9{öì 6tîÜHIIqss=zôøñã5kÖlÙ²åúõëvvvouë›À{ë_<€ ‚æÌ ,QÂîæÍ\\”¼Š§¯«Vílt´fË·#J™3vïŽ8ð±üÆêåËKO1y0@ÃíìÕQñ_!—¼þÆTft©¼¸oÍ•›˜<;[ü½©eòés‘îS0 vO¿¹·FÄÓ|_ÐΣss7ÍÐøpGnPØßéTÉé$%¤Óc~O)`ƒ÷@ššŒ„JO¿S}Š%{ÚÓ¥tŽ­Y2¤…åšÏ«(§Wx, "Y…AÐÚå(nE¸ª£¡d¬tb¸ÙÇû0nЖTÁÀ tž¨~C­FE„íð|´ ÞKÌqâ2*Ý £h…s#ê`ïüF j2"[·ˆKFFJ"•IÃSÈÀ…#J'¬Q8£tDáˆÂ EØ­û•jTKD“„6m2Ú$´Ih2òÓŸGEÆ®ÜpuÅú "UÐb ADÊ Ò.’È¡Ž})ÔüUõ•ÄI4ž¨Îgz{µ±‚ml$ÿx˜k@`|ŠÙßã’–QIÜÖc+c¥#£Läêô‚…‘,ˆÄmð”º,Ÿh¾ J Ò;5vÁ»®9ùˆ‘*:ûp=Žâ¶øt¡¶I7NM÷ø‡SÄŸ!¹YíZ=½ÖâB)|§SÖä 'C®ÝBΞ™|Ø4÷ÖÈX#<š‘=Ø4'÷Vu:Í{t“î8¸EB±=!aÃ8{–aÃX½Zâܳêx¦Nµ[ºTÚsʪ3Æuýú¼ë÷ï§¹¹ÓhŒ§N5nÛVúe5S·tëvüر§;–ôñé’ÇkðÛÆÿ¨ƒuæÌ™U«V;w.))©P¡BM›6>}z£F² ¦Nš!OÕ®]»åË——)SæØúfxï`ý›§¯×›7?=|xå_mŸ¯ìØñ|Èà¬îÜi]¸°Ùš _¿G{÷&´mëpêTes÷ùøñIëÖ©*U² ú³†9õE䮞$=û³ ສ«BKÿéÈwu+zhR ¹ 5Í»)[Š+>¸šÌÔ?ncæJl”øn ¾I:$4’æ3‰J wö~™[;G«§çŽß’žÇU:úíåèì¬ØÛÎsïÜ ž w±”³¶9¦o’‹âέT:bk$ÇòL C¡ÃÕ’­eébò¦ž"—Äe-O ¸Y±Ô‘fÊãŒà Ó!ä0~2£˜$c÷Vµ†Öc¹|‹–uù}5Šœç(ƒ&¼$¶_>†“‰wd4Ò£GÒ½;{÷¢”ºg‡OܶM]³¦å•+J4øî»Èo¾‰(SFqãFusŠ6ÇÓ¾ý¥?þˆ;¶´‡G¾ˆêëÖÝ?Þ¯`AëŠýK]Vþ"þG¬ÿgxï`ý˧š\§Îo©©º½{ÛdʃB÷îWŽy1xp OOsÊá±±úš5o¿x¡[½ºô„ Ò{– ߨ±¶N€&%y÷‡cn‡dÙ©üݹ²féê–qöÕÒNùòAŸ®¡eo®\£CK|vH”RýŽ (^ˆË[)a¢äy3ŒV³HHe\gÖNȽ5ïL„A0”ãÑ‘&ƒñJÒßcv( …•l­“»ßmbô Ã'é%Ùå§’ Õ|šB„ô³a±fºqä fÙÃç0 3Eü@f@kêtP‹>ØŒÀ¶Dž-÷Q#1ˆÔ›¤i²‡Jc]ûºØ»ãPì-h%É9TYñ*g”ѨP8¡tB‘ÙÊ q)ÞBãù$ô×H "5˜Ô{¨²o•|-âOT~h2¾Ÿ²ú[ó±®S0nЖ9 ;•àç4§’&PÊøÊŽ/ì3Åï³á`"£ž¯§”‚åh.EÂ|ªf`°”ñu%æTÊ-vM·ãĦӸ0G:QÐÄ¥ ‰¦“'ÏS¨UX‚ãh ÝÌÎË8ÛrfuL"ÇÞ—ùð{ô~Å´^¹· Á ¯Ù}’ò%Øš»Û ðãf.ÄÁo Åv`Þ<æÏ§@)WNÂ`ïÞô~ýlme®ÕªI¿ŒÜ¾^¯ÞÆxüx¥>È+9¸aÃÓ±co-ª¼}»µ‹Ë« ˆ§¸¹íKIÑyyµï×/_“ùÛÃk;X+ßÂ1Lzï`ý‡Ïÿ]p°€U«nMœxÁÕÕúæÍ|½ô}z²w`ïç—ýÿÜÜÊWÉî:ÃË'tqgë€9mJºä Q?‹ ~'¢c™5‘ïgåÞ¿NÏŸrö*õªá»[“9Ýÿ.f“–Îì|;8÷ÖätÚ-%ð‰4—VæŸcþ9d°¨=3L;·Áê[LºˆQ0±&ËMdH_hv“1È`b9–T— g¨8ÎG+¨oËîòT0K•à—4¦’*PÈgË3 ß9‰Yá{è+m˜9“¾‰´ áJ hŠr¶]r ~IÀ€¸ú©×I 9…?Yt®XÕÁÞ û:ØW•x¦ÿO"Ý-T×I½Lò=TY®¥Yl2N¶y÷ÒÎÀ#ô»PïBp@Ö›áØÖÈ“ì¦ÁQ*ÃBó?®€}éÌH&ÌÐMÉr'*˜ü¢ÁŒp~‰F@Og6—¡€Ô±ˆbÔut”¶a§;ÍLÂɇŸ0à4j==˲«mn)QàÜzî"IC›²€c΋\ÆïÄÃGkNO£¾IòÄÿ.í¿A¥aÎæ›ÜÈÀìµ,Ü„£·PÃÄý8užNƒ0Ù»ž>]%¾þûïtîŒ=J§NÜÝc’’ÄúõNcÆHO¤z½hÜøîÕ«ªÏ>+üË/y±,¢¢4Õ«ŸMHÐyyÕíׯx–0E›6G|}#®èéÙö•öo¯í`­} Ç0þ½ƒõ>ÿwÄÁ‚®]}||žõèQfÛ¶Æ’ ­rá§ŸBg̸S¦ŒMHH+{û¼ƒ?Þ¹3>o‘âŒN¨] +ÚN‰ôÿ=k½Mdzm»%¤e¶CÑ[|ß²å¬1òZ~—iÛ½žÝkégBxI Ñp,ä4ucóÜÜ©@^õâ›J럹ARü1 “™seSO`LjIJ޹](à`ƒþ@­§wYv¶ûÓ+Éh&`åc¦ßF'hèÌ®º”—šœ¯¤1à148ZàQšRˆÏ |›ÊFFp•ó=ŸÙ™5†©p€¶° ^™„¸ŒviÇIÏøIŠañ!6#±-–¿ÖÎFDé×H»LòR’²qª `UÛ:Ø7ıЙfyæšµýuÄ Ë𨮑ú˜ô¬[ÚY%lâè†}]ìíó7J:Äq©Uolìò¤g%ÀbXZp†/aŠùðäS“¹ ¨kÅRGZIÅï¥3à1×T(e,.ɤÂGndæV>èU”Mn°Ê=Ú¿ÞgŒ/z##«àa"% ºÇÀ}¨õô®ÊÎ>©è¿ñÓIløL¢¥‰†ð0Z›Eð«7—oáó íMԶžѠ3±ñÌûœ¹RÄö'O¨_ŸØX.äk“²e@¯§U«¸‹Íö³ÏÀœ9 D–+§¼q£º½}^—yÿþA{öDtî\øØ1“ÕÂüù—æÍ»Q¼¸íÍ›} È‹¼ñÏགྷõ.àð0þ-¼#ðüyZíÚûâã5ß~[aöìv¯´×ëEãÆ~W¯&MŸ^áǥʔ3‘˜h¨Uëvx¸vÙ²RS¦H·‚޽╾Ÿ7°ÝŸµÒ¹i»Åå?yý’Ç#C&þhl_ìÒ%jÔØÉò L‹½þÞÔ4!<Ý £Ó$Â"Ó¯r7‚åUÔ¼õ 7ùø :#Ck³©'¦-ˆÎEÒë‰ZZç`¦ éÍ›7kÕª•aÈÀ «p²Ä£6ý¥^Y“ Œ}‚W¦döºÒÒžH ŽiÉœ×T³ägG:›™oõ°¾˜LbÖxe?ØŒ{Py¢z‚°€¶(Gc×åkE¡ž£É $]%åE¶æ€vXÔÀ.ƒ¶U»¿Kz4ûhÿuÄÂc(,98žÎ&ÉμɔÀ¾Ó ˜…Q°s!:æÞšElïñ6KÛÓÓiÞœ«WéÖC‡$ €Ù³S.L-YÒâÚ5ׂ¦mV5jt×`gÎTiiª¿’ >>Ñ]º\¶³³¸y³U¹r¯Î*ܾP·îoZ­ñèÑÎ;çûÇðÞÁzð®xÿ Þ ðô|0tè™råüüz/þêÒÐëדë×?4¯[7¯ÀÀÑ£Iݺ=´¶–_½Z­zui&¯Ï¬¯om[•õ_—jµ·µùÖ÷aBÖšŸÔ ñª´e •*qå ’‘ˆ‘SÙâE¹Ò\ñ¡ É;d@íÆ“¦fÖÇ|ÿ©Ä×ó.>z–@ËŸ‹£]UŽ|–»#pú1½w“¢¥Cyö÷ÇÞ$p+Î>1ó“€.}é‰ÙÂo.XÖÁÞ‡ºØWÆæuÛ,š†¬*c9ÛØÚ¿jWq°ŽCFà·,s^dšà§T~LC-°‘1ÉŽ¯ì¥óÈj#Sž±>à#6–ÁIòR çÓRõT¶Ã«uLEÁgXw «›ó‰ÔUµø_ž˜ÙŒE&ï6ÀòÓL݃…œ]£ékBdÌ»8u™nSÐhùn_̽UŽÇë0U*pT‚ØŒÅæÍT¬È•+8›0·€óçµmÚÄ Áï¿lÛVšY¨Ñˆ îܼ©þüó"K–ä%‹£RjÖ<÷ø±jùò“'KQ½rB¯7~vç·ãÆU_»ö-ö*x-¼¶ƒµþ-ÃØ÷Öøüß) ?Þï·ßµiSÜËKjž3ÁçŸß^ºô‘››c`` K˼žöë¯qÛùùU1Mü²ôü¢ùYÿU)çÿñª]AÑYkF¶(»idݬVÐ=zpð D*]C‹^^çƒVó” ¼gMµ?Mæ‹¡Ç™·|΃hZ-!2‰›²f„u%‚®;ˆQѰGájòæ¡¢Ó1nÆSÖã&2¤Ø蛨 Tw`w]j™h™·Ô xLˆ9?”`²™`…V°VÅœ’Vð±-ß9àjÆ!¹³àÜ Œ…¡¼Z64ã^TÛQ=ÅX!ë„r¶¯ÐÊBöŒÛ#ÒË`ý„tsÆ äŽX8bဥ#…°rÅ*c9kM!Ù;Æh0Æ¢‹A—Œ!}Æ¿¹ÖÄfsòLQë4 7ÎiFbØz3ªH €Ù(‡`Û"¯Âƒ—¸ ëÁT ƒ®0 LòÛ/aO5_&iDYó£#eÍd,ósu¥êÏçCK²¦&¦L!gØ÷k <ÛÒÇÄU0&cm 2Vwå©Î¨kÎòÙndà9Š roÍ[СýRULìÏÊéû_¼š/¿ÃÁžKG¨.¥âéáÁ¸qX[sáuëJ$&ëÔ‰}òÄ0{¶ý·ßJݮ̜ùüÇ£ªVµ ªfc“×õ2uê­åË7hàìïß,ÞÏYX³æögŸùuî\jÏžvvo"‰ò6ðÚÖ–·p ¿w°þÃçÿ®9XÏŸ§U©â•–¦?{¶{«VR ˜9¡RjÕ:÷è‘jéÒêS§æU´’”d¨]ûöÓ§ÚÅ‹K̘‘£´úö¾ÝǦŒ#sR=ª¬*—œeЪŠëÉ/š+,åÀ“'Ô«G\ßÏ,>;ðô9õ;Ç7SX0CÂ`× †ÌF6|èžy @ߊ`Òn¨_†Cp2ñ>Bè¸Ðª¹r|¥M"m zœÀ/ŠJw¤™I9p+…þAÜJÁÆ‚ª"ù›ÏkdA*«Ó0@93ì˜j'QŠ˜;°ÖCFðÐúÁ$ÊÊæ@V@ˇt=8 ³FÖE#MPV‘`Ýä ÑèÂѼ@›”-’”¹œ„^kF”!ì°¨ŽíCÔ‰èóórg,±,ð2Tf™ý¿¥±v}SYùHŒ—Р½„V‰ì&: –ý°Œ­ó«rIà«3UÍäÐÆB/ÌÐY-Ó’ Ö4°b©#ÍÍ—onc«â£ù¹>4ô<Áù(\”îHs“ë\k`ؼn¡´ÀóC>2QQ‚ùG˜„ÕèWŸÑ&¡™¼[27Òz,ñÉ ëʯó$^É^Il¦Y3Ôj³íœ½¼Ô X]¸àjeæ7¸t)­yó{2~~U5Ê+?påJb“&d2._nîîþjÊ`B‚¦re¯ØØô>èÕ«ì+íÿ1¼w°Þ¼[Æ?ŒwÍÁF>°}{\ß¾¶nmŸ—§ ®@‹6ov«X1¯‰ãĉäÎ4nl·n]™Úµ_NÛ¡¿û=Ĩ™mQ88l*ºåF¹”¬oU-æpñëÖ.vÎ[ǎѽ;uë²`t-OF›‹•™=…>Rm.~ñbÒO4®ÅŒaôn“{«ÁÈÀŸØëG×ú,C%.THV—F—š¬DQ“œBD < ‰¦keµ§†‰ø‚JÏ€Óx?¡¡}Âô&.I=ŸRõLa{8•íhêÂ/R`kŸ=E#hdǸB *`6¥tGÏçÉøh°—áfÅ\{:˜’¤ÃXA´K ½ÍkTf!ÃNT1Êl#SË î(Z¢h²–D¡ä›Cƒ1{Ø)]Ærö¸Tz¢R’ñ“œÌ WöX—#®(\±Ê †¹þ­‹Ñíe´WÐÚ#¿˜©ÚE,†`W/îZxÀ=8@QŸ@9¤Ç¦'óÄ@ Ž’|çÀPój´Á*>ç±–0 ã ±¬$’²á«Ã8ÅéXÜÙ]ɦY·˜|2Æ7¥P†”h5“Hm’†O¼9þ™ŒChiR¨30É‹£7‰Jbã0†5Îm ÑñÉ*\¢€=~?RÂDnôÁS¦-åˆ}ÚâµH‚˜õ0ŒÏ¾âÄY³Äö/3†£G?žU«$ €M›T‹¥ÅÄ‚ƒ •+'ýŠ“šj:ôñ‘#IÓ§ùþ{“f×ÙOJc:4øàÁ¨©SË/^üÊ,=À·ß­XqÓÝÝuÞ<§·ÚËüuñÞÁzðÎyÿ$ÞAK­Ö·oäâÅèü·Y˜5ë΢E¡ :ûù5³Êó©ôí·sçFV­j}åJ5{{yÄÕË{û÷Щ_>†-­m*/ßý‘w’Z÷²’¿ ½âÒìÖ çžÂW­bÊìíñ÷—n¶ifbi…ïêI•Æ-ßÉôXXpèg:štbÔ꙼žu>”.„ï"ʘ¤HÂ☺‡ƒ×(çʉÉT21HHç‹“lÆÅšCiQ:·ÞÈœ«øFr!бÕXÙ¥ŽË¹•J{¼êâ&E¹›ÎŠhÖÅ4³gE)ê™'ÅJg[:ûÕ=­ùÙQ¢,?;®€\„;”…q0 ò’”ÎD(úŒ8M âD¶_!äMP6EÑ E…7y¤bPa°Dîü¦±´×EF´Ñ\D{?a«.V.È£hŒ¢vn©K hÀ Ö@VÐC·<Ý4Á¢T–¤‘.¨eI¦Ù™i£1z¾yΦ8 ‚NŽŒrå#©2¸D£®³? +Ÿ—gniló=&^ÀJN¿òÌ«Oq“«12•.;¸EÛr,ïD-“Û'MÃG¿Eõb,ëÇ&Á-½¾‹8x‰æÕÙöôŒïÓÇeÇŽrÊ<ÓæÓ¦Ý^¶ìQçÎ…÷í«g+IÀ̉;wÝÜö9:*|}»W¯n¶tñ_Ák;XÛßÂ1 }ï`ý‡Ïÿt°€Ý»C<]¸°Íýûýœ^-™”¤¯SÇ7,Lõõו.”’çËDzº±I“{×®© (ðË\Õ'½TÖ–YXÔ[ºeÀyËÉ/_î1ÊVõhüi‰L¥ ÂΔ+G@…¤ô9ÇÍÄc;ÅŠpù%¥²3VòÓ6l”øüB+j…JCçyø†P±çQÜD!>«¹J;¼?¥i…ÜðçJ ¶õ¦ŸIŽMÀÊf\Bk¤®+^í‘ìÊz?~W¹žŒµœEÕ¤Ó1ö%ðy8Ï´È`HA~*A3n¬Iû“˜5Þ./Ŭ $ÃnX·PB˜ R²_Òxá2ºóh΢ Ï&…Uyc-P6@QåŸr¶ÞRÁh}ÑžG‚.KËY= ±jˆ¢±[°Ö@ NЦä£þÀ;‰É<1¼¤[-q¤´™‡µ^°9ޝŸ«ÇJÆøB|[\:טHÿ ©p´Ä£6¤ª\SuŒ÷ÃóÀÐJ¬m)#(4Nž<ŒÙ.½ŒI,>JA;Ž|Fc“4½Q0l);ÎâlÇßKäñ£ãi5–»a4©ÍÉUØ›xx=Fpì4ujpþ ö&‘w!6 OOÊ”! €"Rb‰‰ÆúõcCC ãÇÛ®Yc6—·iSìèÑOììäW®T«V-/±þ“'c:u °°ùù5kÔHŠži‚Î}Žöé§5V­Êÿ½øáµ¬]oá¾w°þÃçÿn:X@‹‡ýü¢¾ü²Î?äK‚åÂ…øV­ü…àÔ©ÆmÚ˜ë³áÁM½zwªð¯*N5¦dÒØe²æ‹~ùä~ñÏ’þ4=_±´®hPtÍsz:­[@óæœ:%ѳB§£Ó`þð£n-|`g2É ÁøðØ£§ÖÒÀä-9YEûo¸ò€*%8·ˆ"&3žJK¿õ½‰’=cébBŠ7&ù°æ 2VtæSŠ.p5–þ§MÆÁ  4i¹CN¡‹²É:è* IDAT g©Gtš‘Ÿ¢X…F`/çó"Ì*f–gž˜ULÎ<FÛ¾‚þc„?`=àe@&ƒ?^«%Ç ɲ?ÐDds¶ #o„¢Ê–(KçO2ê]@"HÊ©²FV «†(Z¢hŒÂ*ߥ…Nççºð †W÷똜©ÐQÏŠŽ43ÿŠôG SžqS ÐÎ¥¨!ŸÊÐi›q­‘úNì®G©ßûvýNq+KV6•è EÎ*#ƒ(d²Ÿ°8:­àÞ Ê¹r|•M<!¿ã8Úrj! L±Sh;Žà{¸UæÌ:\¤^Z>ûšÕ[(Z˜€£”–JÙ-\ÈìÙ88àçGm©¸ôí›ðÛoénnVþþmÌÄoÝR7lxW¥2nÛVvèм&Ƙ­›Û¹ÈHÍ¢EÕfÎ4y]“±cO»v=îì¬xð`€«ë+ú,ýóxï`½ÿa¼ƒ§ãÆ !ÄÕ«1rùz…bÃIùüâìÙwÁ»dÉßãâ´y[zn¸?£pŸŠ;f}üW-ë¶ì#~Ëú|½ïVÓ¦±ѵkœÑ(½ŸÈHQª”1b„´A\‚¨ÔTPL|8J ƒôµ žpn-‚îJ$¤ ÷I‚nÂm¢ˆO‘0ÐĘ킱ÂrœØp^ú0–_²y‚yb’Èu.£¤N <bè"M'½Ÿß"…óq·(sJ\J¶BÅö퓪·@›’âշ닛׳ָ<ö`Õ!«N‡f­ù¨~‰=…‡êÖ5.Zä0s¦´(_p0-Z–ÆÏ?3mš„Á½Pšt#!‰ÙSùVªHÛ`dàWì=Eáœ[OÕ²¹ ¢“hõ%wÃi\…ßJÔgÕ:ÉdÌéʼîeÛuFFgd˜{ü)Cš]ízÛ}Æû¡ÒSÍ™=í©)%Ô¦b@‰¹EMq:…Éϸ¥hïÈŠR˜ CÀv5³Rˆ0 ‡1¶L²£z>’u8 Ëá"YÎ6 ºñ& ˆæZ´IÙÚ6D¡CD^yAä…°(¹\yäæyÛ9%wÄcŒÇ‡!æå‚1clæB8]fõ¢2w¬š£h‚²>VÊ7’E½ë`/ûc‡1ð©ùÞÌÙod³š…)$ 2&Ûòùœ¯ÊÈQ,~Aº;9_äæ<Çà`ž§ãª`‹’m±’µ|ržÝ¡C+±®¶–`2ÚÛo0ê:#ÃÝØÐCB‰÷ì}z­!IMÛª£Ôå:Û“…^(,9ð5]êçÞªÖÐeg¯R¡$¾(.5v¿ûÒeÛað‡¯œR€€]Ë–q:Ø·ÏåÃ͆ŽFz²yslõêÖW®T³ÍSÇcÕª°‰C\\¬®]kYºô+uQV® ™<ùb… Ž·nõU*-x› Þ ¯ÁÚûŽ¡ï=‚õÎyÿ$ÞA+ Y’ çÎuoÙòÕ’ À£G*wwßädý¯¿Ö>\BIÏ ÓîÖï‰ï™¬5É%ºº~÷íä7²ÖÔ/ërnVK[…pô¨¦Gø–-sç:´n-êØ¿Ÿ¾}¤»”s“5¥n[É>Z½>Çç"% s~#eMÈ%á±´˜IX4íÜ82k©Y}–I»1 &¶ay )êSøÐ‹-í˳¿?R;Éždù¡!“¥ÚójŒÌ¸Ã/г([Ü0×V'XÃÜ’ /é5 Šãh&ó¦ü˜Êâ4Ü-ñ×QÏŠ±¶ µ1K‹ÎŽ A¦í¼,¬£` H¹ˆùÅ çÑœGã‹¶ ²GÙ2‰¦P"sF愼E;!wF–µì„¼ŽÙüž$ŒQ“0&a|ñ†DDÖrÆXŒyý=¨•´@Ù«Æ(ÞTk^ ‡`=œÊ\Ó &ç¯Z¸ªc½ O5V2ä™9AsÎqQï‹pžfõ~,AQ3OööMœÙ]—²RiÁ XúŸâaž n`ES#`f3~h'!—p ˜A›H×ѧ.ž#%æ€å‡˜º 9»¦ÓפZN§§÷õ£DaÎo¤œEì^(»’˜ÌœiÌÿB 2’FxöŒ?fófés‰‰1šxù²näH›%K̶jöòJ0à‘µµüÒ¥ªnnyùL·o§Ô¯ï§VòÙsHHÐTªä—îíÝ©[7“ šw¯í`x ÇÐû½ƒõ>ÿwÙÁæÍ»:þUww×ÀÀÞrS—A Û¶…~ÍÎÎ"(¨eåÊ9#Â`ðÿñý£‡²ÖÜ×5Ù¤œ%ëoÈ„2mæ´)’­ËëO?¥Í˜‘\¤ˆüêU×%¤½ƒ ˜3.\@²Êš_ùô+¬•œÞCS)"”*Γð ¢b)|7P̤Fîa$­¾$"žŽu9ô4Kùà5mD­£·;;GIËvÛIt Šsd…¥5¹hÂkšc/ù·¢™ÙXww]š˜¯ŠÓóm$«c0ŠY1¯8£Í묇ø1_U¤€"rFÚ2ÖÖ¬"evDÃFXÏp‚ÐZAõ7ŠieÀQ^`Œ3RÒäC Ë™Š»èâ³ÅÆÌÁrÌ ¾\~¹²$Ö¡O(œƒsp.à #`Mݲ¥õˆù™ù ÞµëyýúN/6ÿSµAˆ“3'ߨ±5ˬ˜{ý­×ξâåÏÁÚÒï«VµKåˆrtéΩqc«sç *¤ô1…`èPvì lY(,%<=e7ïtƒ³ûq3á³Éi´OàmjVàìz šÄÚï=§Õ—¼HäæxÍÀRÊç8wŸ^kITѦ ÆKÈ>J “'â)ïÂñ!T2äÙvŸ ~¤é©âŒW;ܤرOÕ Â?K_WbN%é'S²?_ëÙ²2ÏçkŠ`—šµÙžßm•Œµ¥·õ«Ã*Dø ¾™+ A#híÁ¿¿µM:" c""ƒdh*C ¢9J?4€YQä…±0÷r•èðWñüàœ„°Ì•àŒƒÑù °wõüªf½Š#€‹œ¡6L¶£¼ùÃ}-ø#–!ÁDj(¬dk:I%Ú’´Œñeï# /‘­áÙb¾6éu`Û|¼k'ð‰‰ôŒýŽq²çôZêIÕXªÔtèÏ‹X*•ç· ØšÜ˜B0x0»våU˜ Ìš•²hQjÞï{hÒänp°ª_?/¯¼ä—É“o­\ù¸bE»  ùª¢½{7±ví}F£îS«Ö_ ¿]¼w°Þ üó´¯wïàéŸ?Ÿƒª½mÛ}ð(Rd[rò+¨ëYHHЖ)s ¼—- ýs·‹¾ÍÎjßÒ¦Qxø‹ 3Žg±Ú-Fî÷¾)¹Ã¸8C¹r/ â³ÏÌ2îÕjѸ±Ñ¬™HO—0ÐëÅGcÅDñ:âñSéÄ$ˆ}õD"^êO>NýÝÄgë„Þ Û7$“¨[sžx&ÅŽJõ<óD‘ŸÄÆcÁæÎèN‚¨½Wà!¬7ŠåR|^!„Æ ¦„™·À[ ·¥høY0 ±'^”¾!²@Ñ7T<}¥=P+Æ& ÛÈ—,øâ/ÄÌdñ4¤ó'B¬b%2)Û!z±Tˆ@ñ÷Ñ×óa<p1V^›yþpW! Q<ç ¢+…¸¿ýhŒbZ´²ˆ—¿E½á‘&TyžŒÖ(–¿NÁ‚@auULz*’òñhøä†(tBà-:\QR÷‘âr´(¿Kà!·¯Pi!Äɳ?Ø.˜'œ‰sR$ïì"ýÌîÇë¼°è!è&–”6˜¶TPOØ6¾AÒ­è8PPLTh""_HÛÌž-@8:гGrø°Z&‹°´Œ8{6¯;güø'X±âͤ¼‡[ˆ?þˆuu=¡P½z5ÏR”œèÜùxL˜»¦&×Ôý¯ãµžn€8ò÷ÞÁ'ì?Œw:„ó¶ñŽG°!hÜøàåËѳg×ýö[Z©øúÆÍœy700Ñß¿YýúÎ×¶n<õÕŸJÉÅŠ÷þíD/ÏGþã³V¶T–>·Îìþƒƒu͚ũÕbËç#¤ QQ4jÄÓ§ ί¿JhutÆÉsT,‹ß!ŠH½¤FÇÓr ÷ž˜UÐñ¿Ë¤õ„½ Y5vÍÀF*ð$ŽN+¹EÙ‚ŸLjpŠ–>^üþˆâ¬êBo3z®éf°2 wY6µÂEJËðP›Ã9…¥Œ‘¥XP…Âæ%Ú_‹ãœD#{ÒY™Æ-=€tV2ÙŽvù¦sGÀ8§àQ¶õöКAshA>Úïý/ +Ružf[_¾~/ÔÀ›UÄe °áS[j¿JJëT2SÂóUåhŒ¬|ÌwHÒÓÆ•ö®|YA" š]¹­~!¼ÚQÞ )4‰>ø< „>C$¤D_)q’5ǘäA›Ú´¬Áì_­æ‡-(¬8¼TB108½Þ/‚ß!ÊI–öî¥är¢«TÃàáC}ýú±IIâ矧M3mÜ·/¡oßGJ¥Ìß¿ª»{^ê%IIúš5Ïj4ÆÙ³+OœX6Ëì8uêy‡GßYi†ìxí–Ï[8†Îï#XÿaüOœþÅ‹Q2™‡Í¦°°<#$9ñùç·À»Zµ37öìYRÒ9+vµªf¹Øû÷­»œ]”Á²Ùï¸k—™ºj!„ëÖ¥A„µuäÕ«fciÁÁÂÞ^€øñGiƒäQ¯£ ˜¨ÝV$˜ ‡=e» ê‰öã…ZêMÕï¶p è&Zω©Ò;‰OÍŒ¦Š % 4zññAÑd“`žº_¨ÌH3!ö=Î[¢Ìq1JÚ&V#&…Ë#oá|\,z(ÒÍØ^žc¾«ô³ã¼FôV™A”JÑbQŠˆÍó™â¹{„+Du!dÙ‚:¶B4b¦¿ ¡~½]þûÂCˆ¡B”Ê©*"D_!– (^O³Á Äïé¢oüKÙ"DÝá‘&Rò±—ì:•C^¡Ó!„8%*œx ¼E{q#YÚ,F-ºú<„ÌCLº`V¯A±÷–p^$ .lO¤þz\ªh¶8¯»#s<Ý„¬»X´WÚà»M‚zª‘8|NÚÀhc¾NUD°™ÐT` °µ V­2{$*•ÑÝ="zõŠ7§#„xòDS À5\½:Ú¬Q&F޼ÞûåS—AHI3¼Ëx­§ |þþÏÿÄö­â]á¼U¼û¬ xz÷îÐAƒ*îØÑ6Ÿ_ÑhŒuëž×…^Sh‰Ì¨ÍXiecÓ×ëðš'ößyßͲìT«H'«ŠS&…;;[U+WÎl cÔ¨¤Í›UeËZJ«Ò§Àþýô”êåO‹^Ü}Hë¦øìÀZê¯=|FË1DÆÒ³û~” [Ý~F§9<‹¥f|æQRŠÆªÒÒGn`§Äk ]MØ÷B°ò23Gc F!¼úJt-Ì@X N¥œ¯Ý™SWšnu7•éw8ò ´ ª0´d^A¦|êLæB”‘­*ÖªxbPÊè¡d¬-í_?ç3ã=AüÉT·º™Ážf¯²õàøÁ϶¾´Ì ËÕ}}vÿ_Þ×Rš‚’˜v›sqUíYR®RüE š§ KÁÕš_[ÓÕLášZÏ—§XЧzàbdye|0ùlë|°³vc:JجÞÃg?"—ã¹€RÀW?ðÃ/ØXsr7Í¥$“#"hØçÏ=š ¤wŒ‘¸u«ºreË+W\Í`èt¢U«{þþi}ú¸ìÛ÷ êÕ©S±|pI¡µ¨^ݤIµ˜J3¼ËxÁzð¿áa¼%¼ƒ–ŸŸŸiÇÐðð´*U¼Ôj½¯oæÍ‹æsW¿{ž½<£ŸRö²õÜÒêí^¶U®»œuÒÕ‹;^ü¦•“UŸ>¡û÷'6h`ççWE’ɤ§‹æÍã®^Õu름áÌÍ™;sŸ9÷œç´mëÿæMñÖ­­–-SJ´•¤®^4lØű«8¼¿ªL°î|>ôûA°¾ã㯆‹ «W?Ú°!ÜÚÚôÁƒ‘f8ˆÜ„8÷‘ƒÙ¥UÔÀár‡î=œÝªwÿ-BIYÚ ™æÃ?û40Ö—'íÔ):!A¸ti­mÛdhh•"1Qje•ͬ[§·z5k"ÜÌ™8|X^±¨ôú 9¹˜:ÇwÊÈÙð$}g#¯¿ Çá?eØð 1lîGÃH^¡K(Õæ›XyI^žT¡s½p*¦¶Ã¾¡ÐeÉ·¿ò¿úƒ'D=]œ¶×en)X !8Àslm쎠ʵ~mtÑ[3MÐPqJà‚„ä )Ù š/åÚæ€aù§öÖy7À«HRÜJŸ÷¶¤ÉýÅ@A%ÛéqU@>álñLJ¸ñ¸óp5^ù€Õ¾Rì~ ±(,¥Ô ñw °ð¬üì‡oÀ´Å¶®2BKqâ)æzC Fëš83FFДȱW„ëqï9 uqõOØÈJøõðø•H±u!–M•Ý·‹˜¶D8²ÓÇË0`Œ…+WТ<€!ËKH©¦¨HDgÏŽÇóäí?lØ+UUŽ¿‹nÝäƒÎœùìðá$këAA=TT”}ù&¤*£ÊËO±Y•ûÐ÷ÁúŽÿ"X|¾¸yó³ii77ÛÉ“Yô+ŒÓSOXü¦bKq—%S,ëºþnfy-gM5?§ž]›¼M3~ô¨ÈÆæ¥XLMFŒ`­uêã#<˜G//#;;Ù '"„¿?ºw‡¯¯ŒJ…BÂÑoøEpœëdÿÖýg8EÅpœ€²” ‹J0n3®…BGçWÂŽEÁþHf»AÂ`~_ì”%C àÄSüæ"1ZãÌt`!OI|LòEPº‚åB| ¶Åcó+”0ÐVÁ‚†ø£äd‚‡ °"ibDƒ ØêÃÁ#kÈÖ@z%„ %Ø/Àý²Õ`ôRÇOšè¯6ªŸ äq@ SîOÊ.w)eY@ríèVÀs J¨fš•œd&•>¥¶dñö* UŠ|Dp+F @}ÌÒÆLm˜)U‚98…\)¸@_=üb‚IF¬g›€ iX×°¯—6²« –ân*&û"U€šš8уëÉ6Ëb¶'ÎFÀÔvøÏÚ¥ ‡!kñ$æF¸îŒö²êšßưÅŠð÷ü9Sv—BŠ-}Õá/ª‚Ì€žù8 Ÿrji© ‡š˜b9åXBò°8÷s “þmƒ^ìÓ´”°î1Ö?†”Ч6NÙ¢6Ë NÁÄ Hȃ\‡a<‹+O™Œ¸4 Zƒ¸4´ª‡kQ_Vjj¸q¶,a¥ ;;Þ­[ÂnÝÔïÞ5b‹[H¨OŸ˜  þ!^^Må{÷ $þIIÅ[¶´Z¾\ÙÅAC†\¿~ýÍo¿µÞ»·-ÊÇ‚U-ðucꫪááçå±&I¥Œ•Õ%ÀuíÚ06‘@pzÄÀÊ’W·œ-Zò=*§ ®¿-sw†¡#^¡ÖÖÑ"kr ÃÐÈ‘< µC‡,»Pd$@7²™Ð¥k¤R—8µéà)V?RíB°¤ÍÇYû³æTYÆÓ–‹¬í<ˆ#ãÅê³òD²Îv±˜¯œ Î4Âr¬­ÝN&³“W2=A7ß°š•âa.u ,˳¼Gþòò5‰ˆò$äšEí"˒Ѹ¡Ô?†Îñˆýš¼ƒ†®Óä\ª—Q–WúÑI£~9ä\Hw„Tô5©ˆò‰¢ 2ˆª˜õøI=Ñ.>ã‘yú;§B?ìrȵˆâ•V‹,&§d2zRvQ ÂÉá5=e!¥HÐÔð2±´Ú·É5‘äg­eh€7Á•¸È)˜Õ˜aÈå!©ýMp¦.)îƒDÔŠ±½éÁ8³iÍUÖ ‰¡š“ öÔe e±¤÷?'½žKúeíûEÓ+ð,Š [ÌiîJÖß $ è¿ÿXmˆÈÉ©H­U+=%EÞrrJBëÖ}–•Åž \Ž™3ŸžÖÖÊgÑíÛÉ€kG³²äå×ÊytÿOP¥Ù }þO5œa¿2¾ë㯆—_~IöÀÀ´RɆ¤$’ R±è”ѕٕǯ“‰dÖ‘°Êìjü¾`9©Î<ž¤Aƒg@èªUÉrzÂãI›4ÉR§NÍ•cví©¨—K¬6ûÌI¥.÷dµ9éMÜÎı¢},ãDär…¸ÃöäèÊ:e4Ë>„^ɳ/Eh9¼&íÇe“ºùSrJ¦x J™H‘йbrÌ'ˬ·:™H%ÕT²Ì"Ç|:W\e­‡ƒü±ý¹ & ‘ ŸÆòÈè]RešNö9´©„¤¬n/Q±”Îñ¨LÙ%@(YF‘k):i| ­yIšÞOÒ¾FNQT —0D'bÈü$Á•jŸ$¿VËt> :Ip&Ž39^'‘¬ž<{öL"%‡“R™Cî±¶æó„ôÆìiÀj*`á‹ÏbÉØ–`ISþ$)Ë¿J ³ösšâÅ– IDAT0‡Õ&!LM  %KXûCDW®”iŠúûËÓ½~=ŸË UU T,aãã“Åáxjhx?΢„! b±´mÛó€ëöíOå[~á­<ªL°|þO5œa¿2¾ëãÿ/ÿèÑ·×iÓüÞÿÃ\[8§2»:;f¨DX²õzLevÕáwŸ±‚™áÁ¾šZ—zã«t;=}*ÒÖNR”Ç6o&€´´èÑ#V›µÛ æ¤^ŸnÞeµ9|…8Vı¢C,ŠÒDäæGj# ö4u;‰X&³”\j÷7ÁüNѲµë‰ˆó¨Ça‚3©þMküX †Ö„’ÕE⸒Éqr‰PàŸ(’ЦW¤wàIj^äøœò¿xS®„\³ÈâcZÈ”ÒÕbr* Ù¤žöùhœAyt\@ _Sßý3ÏP€6RÿÒz÷¸ÌÓi,\ø*ªšE}”ËŠˆ¤ Cf·žÄñ¤±¡” ˆL?È W®4À‹úyQ»ý­82ÛFp&Ó­t=–Õ¬DL£ÿ#8ö|òbŸú•¹eb“È|Á’F,!1ËðHI§FÖsê?ŽJXHQAYX@ƒ“„}˜ÅĈ Ò€Ô;Xd(=]dföݸ‘ý6.G~¾¸~}Àsófvá/Yع3pmÒĽ¤ä»1~¬ê€ïúø¿ÅË—¯¡q¨Y³3wï¦VÞî»æ÷Êìê¤]oaa¡÷Ó4•_/½%Xc.Ù ?)6lHB ŠMN–÷ªì˜HíÒ%+8XžÙôéÐO?Q&»þß‚?æÔw …°V¯¡­'Ê éxø²Ú\%1¤3†~q¡"OOŸºo&8Ðà]t›½ZŠHJN·‰ãLziÂJgÚ‡fRW‚+i¢Þôî•‘äbšN\/‚'Ù=¤‰ÊV©ìÐâ„R—hrJ&¹—ˆl¤¤KÖ[²•\ç”ROUiÿmsÞ'‹Ss«¶üWB¦ÌeÕ4¢j.«RÜͦAIÛàI6A"ÏÃKD—O£oSw‚+Õq£1¬DP$¥e·¨Õ^‚3Ù¹Qû€|ãiÇHm.™,¡‡ñ¬f;<¨Õ\‚=9cuú&¦ÑÈ¥K8•9eóh¬qjSW{â³PC‰„, jÛ– Ø]HùùÌØ±<'uìXyš¢b1ó믯UUà Šaó–UÆòå‘::×»t©Úâ`jj‘ÍÀõÊYņª7~¬ê€o)Êû³ãÛ r¯ÀÿE9:Þ77×md¤àáέ[ÖWÔhØxÒå›/ê½6Þã %¥õµT»d™ú\Èž9³þÁƒ êÆ3 ~û-ÉÕ5ËÆF×ϯ¹ªL‰Àºuü¿ÿ.41ᆄ˜Ô«ÇV~³fáÅ hiÁÛº²ä¿ÿƒí®0ЃßE´“U2ÀÖ“ØtMêbÉL(Û&$+Á/][Àó/˜ÈJ?*cå%{Egaù؇s©  “v¶rùI9Ï^y ÁÁXCÌ7…µ2õŠeAHx$F€"H€Ûe™¦àíÔÐG†\Ôä¢5¹¨É… 5?{Éhð  2¥ÈfÍ ƒA ƒH1ŠQ\~ï6S6ê襎êJ)WÉDŠÿeá`62Ä0@­´à`¢”,€7ÅX³©0Ò “ê`Œ¹¼Pý" 6†cû3”HÑà võ°ØÚ,‘ö‰ùÁ)hj„¹VXÜUv€Ûјz a`kü9T¶”(–ÁŽË¨UMÄoCd7Ÿ‚1+Wˆ>VسÚ²tò ÐožaüpìÛ#–üã¥K nnhØP¶TŠáÃy×® ÇÓ:tÈ@Oõä­Z•²qcº­­ž»{cSSÉ §N¥L™Þª•î¥KV-[ʽ'+ahÀo_ßÔE‹Úþû¯,5°ê*¹?þ}èô½¹“ ãs¡,eÔê$¦woÏû÷3ìíë_½:8êÂéë‹CùèÖ2Ÿxå–@ÏÔzß^qéF5îµ%ÝÍ-kë@@zòdÇ)SdIsV'éÔ):1Q´|y­-[X•±$ØÙñ||„:¨ë²È\fe¡gO¼|‰Áƒqå Ôee(V”-«i ÿKhÅ’¼½í$–ï— —¥X Kb@|:¯Al*š˜ãÆZ45—aÃö'‹¨/eл9NÏ@m–¹!³S=p+`Elè6õƒýQøó ÅÐR…c[¬î]¹’TžX‰„òÔýÝmÐP^ µwÈÇ®LxäABÐI³¥³)„xRžjwO„B U¼”Ȱ4äœ C. 9¨­Rþ‹Ú\˜«ÀƒZ*¨ÌZ?ÛÅ„\¹„4)Rä2ÈeÆ UŠ\B.ƒ)òeÝ u¹HfÐXý5Ð_ÔQãÓ_˜;3q†1@KMÌ©‰™&ÐQ®Yƒý‰øó% %ÐRÁŠ&XÙšr÷õLÄ‚ $òÁÆ4Æö®¨Ç>õ_}‰_®€WŒzú83ÝY$ÄRüî> B×:¹žK Mdµ)’àœö‡º*Ž-ÆÄ^²[{…¡ ‘•‹½q|- d5%(†ÝdÜ{ˆ¦ áïÚ," 6`õjhhÀÏÝd•,,Å¢E;ws>4nÚ”•6]¿žooÿŠÃáܼ٬_?R ¯^YZHj7c‹¾,¬[÷ø¯¿BMMµž<m.'O¸ß¼ÐhøèCÇë;>þjH°”Ä›7ü.òxB—Ré•ÕŒ¤lÔÐÓñš^³Ö}6ß ‰Ï­°ßÿsÇ9}8x0ÉÁá™®®ê£G6 _æ‚‚øýûÇZ[ë,Zd:r$«2VAuïž)2DãêU#WP\llžŽ pêd Á‹Ä5Þ>¨c†{h,C0vºcÉ¿`8MÃÆù²_åÓs1t-ÇÁÌלё¥x† &FjLtqüÖª·DØrܔлNFmö{ª+ƒá êê`CgüÜœÕ@±[â°%)º¢­~kˆ¬º?üœ²°/ Y¨¡‚Ÿ±¸–²R¥r $‹'E‚Y 2d1ÈfÉ€Ç(Þ] 0ᢦ L¹0åœ[æ…ÊbÎ ›@‰›O‡óÖyfÂ…© jqÑQj0ùd/Z ƒs¹ØžgÅ Â>š¢¿Ò'?]ˆCIðÉ.«x3ÖÛZ£¾\Wx6ÞG@:Xš`Wtgo’0Xí‹-A `x #–Æ“x˜x÷ã ÊÅCð—½l9~ ÆnÂ0èjâÂïÔIvk¾ðÓ2¡\Ú=YC$ƈé¸á‡zµqÏ YhŸ«+æÌŠ ÜÝ1v,ë‘>,˜93_M ·n÷éÃ:vE'Æ'%‰æÏ7]¹RAY‹’¦{÷ ððüñãkŸ9Ãr¨²nkëÅ0tã†Ý€¬¯—Õ?VuÀ·Ê0> ¾]‚ÀË+iñØ}3 ©rJk{@USkÌéKµ»t½'øòãÔ Ëeƒ›mÿ¶ßÔ©ánn)zÁÁ6ZZ ʲü÷_ÖܹI*µjÖŒU‹)>^jmͬX¡»y3+õˆˆ@ïÞÈÍÅܹطO¶Mq †LÁÝû¨_÷<Ѐåáæv ¿þ ±ÓìqèOõ ñî\rqv”ÝT6ÓŽâÚsp8 – ý1é"R a¢?ÁN®àkH&ï#8úÔÆÎîh'w°T1ë~.⊠›!æ5Äsh(G#JœÍÅžL„ @‹ +Øê¢ºê(ð¦|rÙn§²ï 2T¦a6ê½Ó‚&†œ÷ý^•au¸ŸêšúÆòvá ±6 {#!%kâÏNXÐFž(ZR>&\Àƒd¨r±Þ+º³. ^~‚_#W€z†pŸ…,Oyâ¬ø­ãô ü²"1¦ Á‘¿ &Ë—$cÔLx݆© ü/¡%˽pù2ÆŒÃÀÕ³f±©¿¿hà@žHDÌšÅê. ÉÆæEh¨`üx#w÷F kZÌ™áêšØ´©NXXO}}edÎ 7WرãÅÄDþªU7lè¬ä^Õ ?VuÀ7Ì0>ß4ÁÊ~ydð®¸\;TEe¸ëñfvÖŸØv#¶Âlh{³+ŽÝT*=Åù|IçÎ/^ðçÎm°oß5?ÀøññçÎåZXh=|ØR›}ñ) @Ô¿?O$"WWÖGäƒèßÖ¬³³l›"OB`š5Â=˜±TÀõ Á¨e(`X/œÝ-Yô¯òjÈñŘÀ²B„]¾X~b):7ÄÙYh$«€4€,¦yàú+p€ÖØ6µz JkæÄby02‹Áå`rSl¬?àU%áÐ䈠†~®‹EÐHéuÃà"ìÉD¦·Ê•0U9h¯…þú诇ºÐúZáS"*óW•º¾Ô8PYüV©GJç ¨ž²!^ŸBøÀ¯Ùå+žôQÌ`¾)F)§˜ P÷Tì}gÀåÀÖŽ`_K^¸•„Á‘—Xõ9%Pãbnküm¹.Æ+/ñËeä– ¾ÎŒA7–7 ¡+.b—/Œh#Ó`ÄŠ§Ìº9€Ýg±h;ŽðïÙžf©Sæã̘áîE´i!»)??ØÙA(Ä?ÿà÷ßYôåKI·n9¹¹ÌªUº6È[ò›=;ñÀì ÔÃÂZ+ Lçϧ¦¡Á}ð GÇŽÊÖÌ$¨Q·._~Ý¥‹i`àp59·wõF• VÔèCëï`}×AþÕðð•SÉ}¿¯C³ŠœÁ-µ ž¹Ÿ ¢#¯+‹2t\s‡_"#÷úÙ³-­k€ç©SòÄ®JQX(mÝú9:i{>9R¤ª©¥úúÊS¯¹z•TU  ÿeµÉË'ËAs²°¥ìD+üœLú,©ëtÊfÑùcZqT¶ é{g;8­"8ÁB:Ï*æú¾Æc¼¢4±\!9“úA‚+S,å@D%R:—JÝ˵I¹^ÔÿKU¼cò%t%—¿¡NQÄ }«á¤F½^Кò+ Á×ýüêBA Ñ3íÌ Q¯ÈäÉÛ3€PªÿŒ~N #ÙôZÞ8}Ñ…äøœt¯—]³[äE¯•Pm¸“BmÏ\ ®Ôß‹ž³çRˆËÓWKÕnyìò–/Ó©Ã:‚iüF.>ïd¾w¶CbÈt2Áž:/¦Lö;e+Á’8V¬¢¾¥f3—ÌÉ =zÂjöèéé@óæ±ÚQNŽ´Y³L uÔ(žü|@7· TSóqX˜b¹W¯Š ®žû÷W-ÐÅ%¢TV4!¡ rYôÿ@+úóªá û•ñ »p>ÕЃ•ŸŸo` àeKåþÓàÜøW[¼ †NÛµ¦IwãÛE嵜ÍkhÿÙ·KÈÆ¾}¯çÍ{®§§Ú³ység/_–téò¢ @ºý9sdÑ(Ç’%ÿþ«8LÕÍ ?ÿ GbÚ4Ù6Y9è3Q1èØ¾Pƒ%,&:ƒ )­ãæÔeqwí¼Š%‡À‡áßYeë2žíübÌ< Ë– ·Ž†:ËA„¤`ü¼Îƒ±Ž„½Ü(+/ó°èn¼€V5àÒ•íËÇD¸¥@ €&Ú˜Õ3êÁ¤*ñU|ùð)D !EeqÜøêž-eÆö§C¦§ €¹ltÑ_=t”Í ,…ˆÁ• HÄì²*Š–pl„‰u;½â ð{ÎÇ@3ìè{EaÖ‰ù˜p•X¼ð3O ¿ á>]ß]ï«|¶}ž`Ô?(,Æ€¸¸ z²_Ê`Î?8tª*pý¿—ý£D˜ÿöƒ¶nœFOkÙf¯^ÁƘ4 'OÊvƒ‹1xpޝ¯¨cGµ€cv—æ³gÅݺ½˜#Gþò‹Ü…X@(dzô Ë;ÖüÜ9–¥²…gmíQR"½tiàO?5T~G|­á­<ªìÁŠþ}hõ½{°ªÃøš¨†K!D……gÆ É|þ¬b‹¾íôÙnm´ÌÔÕF””M)Zê*wzuiÌR¤0yrøéÓ)––AA=4Eúœ=›;aB¼šçîÝæÝ»³FÇ3 FŽÌõô,iÙRõÁãì4»wÃÑjj¸rvv²mRÒÑ{â^£»nºC—…¦fÁÎÏbÑÀ7÷ Khü… LݦôÅGÙ‘%(_.\q " ,àì,4a¡”ÙL¿ ïXp€å=°Ò†r—ÿx&bÑÄ€}}ìî†JœÍãx2v% ^\ ¯‡èϲŽ)Õ„l}^|vRUŠ”LÂþDd @_jc~#X(qÉlyŠÍOP"…Ž*–µÇï !7âQJ8ôù!³ qv ¬j˶,ÃéRٲ਎8ü3j°¯ ŸôÃŒ]Kð³--=ì%·ÞÐÑÂùͰc%X¹›÷BKÞ'Ñ·‡l›”ØØàõk //Ù)Ã¥˜=;ÿÀ¹97$Ĥn]Ö³“—'µ²ŠŽ‹:8˜¸º²ÜÞ•°`Áó={^7i¢ÖËÀ@ÙÐ+>_leåñòeÞüùmvïf9¶o?VuÀ·Ç0>#¾9‚%))¾0ytòàŠ-­G²Óuâ/wÏfC¿ì Ååp.ηÙ‰åñ\ŽÂB‰•U@LL‘£c£;YêÄVÂÂ…ovíʬWOýñãV&&¬­ÂB²±ÉyöL8À”fØb 3E!t¾ Xz OÒ1 1tÔqd+Y‘Žq‘M5lú ûÉkvçU,>"8ƒË,ÙΰÊ÷ާ º³kä9oÇÚíPSÃ¥C° Û&'½z!* ÖÖ¸s:ìÎñ-[øNN…ZZœ»w»taM. ÂèÑqy:hß¿ßBKÑpôôÌ1⑺:7(¨‡¥e\JS§ú¹¹ÅZXÔR憬ި2ÁJø}hôƒ`}ÇÇÿm,’J=çNñ¾ €Àယô<âð))‡ÛKམì Ë­ã-– fQ‘zaaù=z …ÌÅ‹V£F)Èy‹ÉÖ6&0߯ŸÞÍ›ÍTØÄ €ÄD©µuvF³`ή]¬)ïD˜=ÂÀþþhß^¶YlzBZ†Ä…ƒPcy+ùñvÎHÉUSx;Ôý \P‡“8 S»â¿ÉÐfyž‰E7p'ZcÛ@Å+†)Eø=¤ Rïì[‚ƒIØ÷Y"0PÅøÚXØ­•ð¬°!OŠ>ü á_ˆ§Åe€õÀD¦j0U…Iù§–jª~’æ–ˆ YdK%A¦Ùß%HãeÉ;¤ª:z롯zë¢kª«b¼ç)TçbD=…³±ð>ÓÀª&vv—'ÁPŠÙX~^1а¶ Äh•]'â·Ó(¢¥ÎÎB;öUf"¬8ŠmPáb×lV)Q%½¿v¢¿ ¢‚S{1žeQ ÀÀ BÛ¶ð÷‡{ÚìµkÂáÃy w÷ãÇË#Âÿü“þÇ)††*aa­)ººIIÅ;ÞãñÄ»w·?¿¡|ãÊ8räåŒþ::ª¡¡£Z¶d•¤ù†ðƒ`U|K ã³£,Vµ:¢›Ë#ÜO ç|ë_h<ŸpöŠš¶¶Ã±Çý_Wö®mxwC_åq×®„… #kÔP{ü¸g#E¹jééâN¢ÓÒÄýe¾v­<Ùýû"[[žPH{÷üök³R)&NÄùó¨]AA¬ÏÑè;9¹=göƒÍ+V9ŽäÀø…eˆKÃà5x•†z†Å××kµ‘sâ!渡XŒŽõpÖÍXb¼øÄcÑ Df€m#lˆ (+B2±à>B2 om¸(’r¨ !ƒ«8Ÿl <Í¡~2»ð¾RxϳÕH1%¬Æš\ªÀP†ª¨­s5ßÍÔÀ­4¶Kð¤È• WŠ41RÅeßËþ!WŠ 1ä(mµÐDôS=U•ñ^¬[M̬y QSéX·œüý¸L‚Á\Ζ˜ÙRž^1¶á߇I¡£†eݱÒš,c»°sOãT0LíŠý“ ÃN6ŠJ0fmÆçµ4Õá¶£Y^6¢0h>Þd McÜ`_pä f.€ƒÛ0c¢l±#FàúuÔ«‡  Ôc‘Åð䉸gÏ>Ÿ6nÔ[¹RžŸŸ_ေDäåÕÔÎN;J,¦Þ½ï?x;lX­+W:+q¨@ll¾¥å¥ÂBññã}~VþEç]|óB£?Ö@µc_Õ`±!`£sðžK¿×í}¡õôýZÎÔzƒç‹Õ—*å×fˆõî BCF5o^ßøèÑ¡—.¥wî\#0°»ºº„Ÿ_áÀ± CžžM‡ ‘÷+çΕL˜ËåâêU£!CXg‘ÆáÖ-4mŠ€˜±’'‘°ƒÜ|L‡#;XÃf‰°ö Ö‡ƒÍ °ügÙf9…ö7ÔTð(§a! +EøŒ?€ØLèibÿ$Lf ì fp4«}‘%—ƒÉØ2frõ\¥„ƒÑXŠœ¨r±  ´E£ªø¢çÃ5§RP$€Úš˜U¿5€é'ør*/E¬©"dK!)ó*eK)F¦Ù+¡8ªÎ‰*Úk#ªÙ)±‹*§ÌOVSµÔÞºÍLUaªŠ–š¨¥´`•”08— —„çKR³Kpô%6„#_u.Y`u'èÉí^é8ùÃÙÊ“Š¨¥†ã1«§¼Æ#“0a Š…`Ç¡‹vnðsØ/BvºZÀËÆì·òÉ ˜¾DØû沤¤aútœ8š5€, ÒÓ™.]²ß¼‘þü³Öñãò|EÉÉ¢N¢³²$kÖ˜;;+x°xq¤‹KBýúZáὌŒ”%%ÒnÝ.?y’3mZócÇú(¹WõG• Öë/Ї†?Öw|üß Á ?vðÎËJ¿ U5¶öÚš¯ªWK_cÛø¶Ó=fÊ¡…™^ÛDîE÷8+«šAA#R¥ äå‰;u HH,YÒxûöÖ í7nL_µ*ÅÐP%4´UãÆò¦ñ?þ(üç¾¾>çþ}“6mä„m¡o_„…¡];øû£ËS70ƒ'¡H€¥s°õOÖì*T’zwœ—¥²-…bÌÜ 7?˜Ú{çÊή*ëa æœÂé@ ÿAn 6Âå!„åž 'QV¹B8‡a_ºÔÄÃLØÖ†C+Œl(OdëýÄ8öû[ºªèaˆÞÆèi„Î5”U+ý3ȕ厪ü=] úêÁ¯x×ée¨Rîëz÷{-UÖzDŸ)!<<ÜãáM1Âò ¦:~­‡Ù ª 7 ,¢á 5¸\Xš`gw´–—Xž1Xr¯xЯv B;¹Ëˆ>ÔÖæ8뀶ìLƒ{¼°âJD°hßÑ„ÅØ+㇠Ã{á ‹†\)Î{bâoJ±} –Ìf5[¼..ÐׇŸ:±K¦Sß¾9ÁÁbu# Ök,Sß¾1AAüþýõoÜh*' ¡ÞޙÆ…¨ªrüý»wë¦èTÂܹÿýÕ´©þãÇ£õäóâo U&Xi_ æ?Öw|üG,–ªªVË ÞrD{œ¿æè@LÙ[ÿ‹)7ÌËâZÕT8âò`c]õ«ûÔÔPïÔébBBá’%í¶oïªü¯‰ Ùð¥PãÀT º_ý†“ž ‡ |²‘[VûLP$ÅoUQÌS‚ã18ø/ò@…ƒÁõðgGX+ ·zœ†%7áŸ-Œ±Îcå¾Î( ¿³öà| Lí‹ÿæA›…6ðÆÌuK0}®–]¡ÇÎbÖrôî†Þ]ñçbV³µkáì uuxyaKð;"Lžœçî^ܰ¡Jp°‰©©¼3>~ÒÞ½Yõ뫇…ÉK©)Å›7Å;ääˆvìh½x1‹>½,\¼˜0fÌÉ/= IDATm •FtìXõ¤ÜjŒ«ZàËKmUSbÃ‡ßø_wäTþóõ=¿ L*EÿnÛJkæ¥ÊR¢¥µ¾Q™¥»<|˜¡¦vÃq½~=©J?½m[àihx#!A±Ž_A¤eËç@è¬Y tü¦K—, µgÏì’yB™oÞPýúÐðá$–!Z†;¤Û”`Nƒ'_nOo“^O‚%Ù/¢"Yj¥gûE2up$Ø“ÚHÚtþµÆ•Jm ¤5\|äY–Â7:üGp&8Sç¨x—D–ÜSè·j{—¸^eÚ˜ð$U/ê@‹#É#²ª"³ùéxolið%t+“þ|A½ï“¦÷Û3OjæK¿>¡co(Q ™ÐÊÍ"‡{¤}¸ìÒ˜Ÿ$§`ŠWB2¥€nÝz€ÏWö‘€Ò>ÿç{&¥ø~=X©©‚:ut×#Gzÿò‹\ÇÅÿiá¡çÆ  ¥ª¨©ß›qôr¼èCËã3­~îñ6T{ëÖ§^^Iii‚  5åWf©"üôSè•+éÖÖ5z¨)RQŒˆ(îÚõ…@À>Üà×_å½ü¥¤H­­sTThèPͽ{ äxq¢¢Ð«rr0u*Žgõ÷„=Ã)ÈÌFçð>‰šìºƒ¢0t!²raÝ^.0aY|бâ(v{íqd!ŒÙ£ ŠÅXt`jWì›]¹ÑN ÁíVú öͱË”HT*]:‹" j`lc8¶E›*,€@¡Áyeþ›„•B k£‡lŒ0À¤j«cÕò´Ô‡×Û ªŸ'¹8ì‰D( ÕRz W Æîl¸‡BÔ¸˜Ûkû †Ü›Ry%6 a·'–…X‚.Íá¾YÐDX± ÛN‚ÃÁ¶EX2Y^–ý®PQÁ¾p˜Âjéá±cÁ08p3gÊ;¨C‡G BBÄÞÞFÊ»a^¼(éÒåEa¡ÔÕµƒƒb¯ÒŠÑ[·ÆÕ«§ÞÓØXÙ¬" à]T$nÜXïÔ)¹Zßrs…íÚ]HNž²sg„£#KÞ»àp8”ñù{©õ½{°¾_‚€Ãá®úúêÏžiÐ@n(òWGöËè3£ìJòrKÿäp¹7ã æƒëõKφG~}'êzûø¤LžÜÔÍÍVùÍÍwêðúµÀɩɦMìÉâå8uŠ7eJ‚¦&70°…¥¥¼ùùÉɨQ¹ GG;å­x…„ _?ðùpr¦M¬fñ‰< ± hÒ7N£iCV˯1h~™ÔûݨǾŽs%¿î¯uMpj)ktp)N<ļÓà Ñ¢Î: ½"Yö"1ö„`ý=ðEPWÁ+¬ë }%âÐ D8‡ýQx’S¶ÅÒ­0µ™RêYïA Åã|å"‡€äWVÒ€Qßêd ¯²^µB†!yeká`ÊïZèÂÆýk¢¯qÕ´ï+Pe%€™6¦5ÇìVJe!áB4–ßBb>Ø7‡Ë`4QD޳ù˜~ ÞŠk HÎÆäí¸WZ§ÜÛ~e] ‰1Ýî7¡®†k1~ k›"1~^€³W¡¡·=cÏjéë‹!C bóf¬X!ï .^,?>—apêT‰åÑ[>ŸéÒ%::ºdòd#7·Fò\¿ž9thˆŠ çîÝn=z(‚ ¸ºFÏ™`b¢9ÖÔô“ÓP«&MòuwÌ–H…±k¥àp8”ûù{Â1üA°¾ããçp8cÇÞ>>¾gO³»w‡qå'UE¦¥ºP’\±ÅöïÍ‹2[T»ª@·¦FA«ú¼çìIH(l×îŸ/öð8rdCå:88¯gÏ ‰„._î<|¸¢ ’ª”_õó Â+)!gg½5käÑÙ;w0t(„BlÙ‚åËYÍÒ31d ŸÃÌ×O¡»TjZ6ìñ4µkâÆnX4eµ|“I[.VÇŸ ÂNÃøƒˆH–¶ŒÁœ^PΗ\€u÷pè1‚‰6V÷Âü.ÊFs—Nö§_/€ê×óÛÀ¢ ÓÊ;¨™ä›SV^º¦èR6FèakCe !5¤–”qÄ ç£âö¹¢ÍòE8‡½‘xVu—U)&cÉM/€O6y¸—ƒÄâ·Û[ê"CsMª½ó©­ s·ÖÒPÀ•)ÖV,E®øOš©%ïlá‰ÀCT¾ü§£‚ež*#h~Zý§¸¬JñЇUåÉ uôðWoÌì¤@ @t–_„wúµDa ÎÌB#öűÊ+Úý;àä˜}à«8Û9ù°_„‡¨e„ë»Ñ‘="'ö?ãa˜â7–ØXØØ 3S¦àøqVÍ!!â~ýrø|š?_g÷nÉ[·f¬X‘\£†Jhh«&M<²$²µ}À³³3õöê€#n^½š8|xƒ+WUa7¹¨µSSçy<¡«kÏÙ³[ÿ Xÿs|®^M1âfÇŽÆ. hܸ*ùZ_OBC£Ö­J }Ë¥:ü<£×ºmmWûÄfðÙöj\S'êŸïúO†zõò É\¶¬Ý?ÿtQ¾ CöönÜÈœ6­îíc%&Š,-£%úóOó¥K8½ŽÌœ™ß Ê† z“&Éco{÷bþ|4oŽÍ›1r$«™P„© pÞ–í°Ê£X«J0þwx {;¬ž »îˆˆˆ°°°i|ç)¦lGz.ì¬àhÁri“O4æ¹#&Zj°³€³½‚CD8…•>x#- h‚l!·täûx”…ƒÑp+sh ­ #ÌmúŸc­ûUQ™A ”I?ÈG/cD”ñ°Úå_ÊIXmMä½zÞªMÛ ÂôöK R…ÈCˆ(Tª{}¡§Z&BÑÑàS…UðÅ8‹óñ¸—)ËÁÀºph…aõ{%ß6"º{¸û!)ÐU‡S,í®x7««¯à^,^¤ÃHF`fOy?›Š?Ýp6êªØ8 ‹GÈU,Ûñ)pÚ‰ ¾hZ7÷ 1û°ŒO„Óz\ðF³F¸éŽFì껉‰˜7ÞÞ6 —.±ªþˆˆ,\Xàç'œ6MëèÑò9¯oáܹ‰±±ÂË—› ®8DqãÆW6Ī…‡÷2©Êð™3qóç!2r¬™ÂFJCÎÃä«aÉ’;w><¸ž—×`.·ŠY„ùŸ¿?ƒë;>þŠDÖ%KìÙ9dHýË—Ùc¾<‰Øcú„?ŸŠ--GŒºçÐö[qËÏFÈßwÛx‹¥”Çyù2oܸ;Ïžåxy :T®`ù»ÈÊMŸþäÚµÌÅ‹ïØ¡XËǧ`îܤ¸8á™3ÇS@öîüýw!Çœ?o8r¤¼pßíÛñÏ?àóqõ*±¿j2 Vm“(àc÷zV-D)œvãÀ%”åI½—"3Ëã\ D¬õSä%´‹¥p½‡k¸ U.f÷ÂßÃa$ÏI%¸<„O<î$@S˺ãwhWea«P ÷W8‹'9(C•‹ ° -z›W¡ù2È!GŒrDȽóg¶9bd Ñ\òäµÓÁOä>ÄõTÁŒÕa¬Žšê0V‡±ZÙŸ¥_*6*SPI¼Èþ(AÖE皘ÙR©"Ü•qæ9–ÝBJ!š¡W}¬ësELW,ž»pöBžV ѳ)VQ0fÎÀa ø©V…•\Çç“Ø-@z&ÛaÇb˜²/%?ŽÀЩHÏÄäQØá SvçYj*zõB|<~ý»wC‹ý)6VÒ«WNN3gŽÎŽúrx€˜˜’nÝ^ŠD´vmí%KØåËqéRú˜1¡-Zè:Ô¾G*¼—$'YXœWUåîÛgóÿlqÐÛ;ÉÞþ†•UÍ«W™›kWY¦¡X±YUÁÑúA°¾ã㯂™™ÅÍ›ŸÍÏݸ1dÐ EáÊ_Ä0Þóf¼¸z©bKý½F»]Èsš9ÝâÉH¬ŒÚj±›™è¾ÿ&÷ï¿K–<07×~þ|¬‘Q ƒƒóz÷¾/2'Nt˜:Uñ9qqÉ\¼ø¦&×ϯy×® ˜Å_®[ÇWWç\¾lhg'¯W+V`ëVhiáúuôî-¯Í‡°x ˆà8.³f VH½pš†M äµI„]å)Z›á¬ÉõÐå °éþ½‘†ÚXcù}åEq•"§Ûp{z7„}3üÒÆUŒ» ÎÄîç8_¶vÖÎãcP]t4ùRŠïALÈ"Sˆt!²DÈ"­ò!: $¦ê0Õ€™F¥/0U/ûòqU«« "yðK…_*.¿. áêeŽymðSUÄ]ˆ\ys‘ek‚Öu°g¬«ŽÃ÷CD ôo—qh#w¯œŽa—'ŒêŽÃލ!÷&»†‘K‘ÏG_+\Þ}vcß@ü4…ègƒK‡¡ÏÎ,³²Ð§¢¢Ð¡|}aÈNl’“¥={æ¼~-í×OÃËËPSSÞäñ$ݺ½Œ‰)5ªÆùóMä‡xù’om˜Ÿ/ù÷ß6‹)„¯† ¹~ãÆ›Ï»8X 1çcbò+b]~¬j¯© QÝPùð7m \[·>'V(Póeà»fe…ÞÕÖÚú'‡ôñùD´ÀíɇÂW2? Üž|جTÊôî}p4éNU»´gOàÙ«WPTT¡2ö¿ý–„š™=MLT¬°´lY>ª­æï/ϘahölH_ŸB©8Ojõ æô³#‰Dò,÷_ •ÎÔfMXEùФv‚_¾:¨À˜ˆ^¤“Ý.‚ÁZ­¡›‘Šw!¢ $²>HmöœIc=G·ã”Ú±2Ò´)œêºQÇr-Ý#Ôß‹6…S@‰þ7C»º .Ÿ\£hª/Õq+;9¶ž¤yˆ¦úÒ“ì*·–VH›©þ¿gRYKÝÓ¡Ç$UB‡)‰GS” ¦«é\¨â]^–KµiŽ"—+ Œ†vºSÏKšð; åÞ¼H³!Áœ¦ÌWpËäå‘¥%daAÙrOWf¦´U«L µk׬ÂBgD$blm_¡;FñùŠha¡xìØPMMï‰+4~ûöE®&&ÇÓÒKý}[غõ)àÚ²åYQùM^¥ÉþÏG ÿqãÆ™˜˜èëë[[[{xx|ØU9&11qÔ¨Qzzzzzz£FJJJú\ÿý8ü Xe ¥Íš\÷îUn>ü¬Ú¾±2»:ؽCQV&½H+P›á¡$ÁRýõÒóäü/ÐÓ;¸ž;Wå{ÅŠh.׫M›»|¾D¡±D  „¶ný} úõéµÜ EEŒM6Ú¬YfzºbvµiSª¥õXÅv*÷©ëê^WÒ§^ GþĉUväWÌœé¸ÚÛ_¯¼±Ê‹>ÿç#Ö²e˘JwÔÓ§O›4i¢äqíØ±còäÉ•·Lž~æc! JÕ©Cqr]?B!3hPZ¿~Æë׊ÝK^^y**a\n¨‡G®Bc" ÉÕÐð}²KŸË‰‰òžËEEeëÆQ|¼‚fÓ2¨Ó@‚9™µ§Ç (+ÝzHµ,©Öº©ˆåÑøÍe~…©ÛI Ü“ µÿ»l–í»žUeŽK%OÒÙP6Á×ÞNkü(C©w~V¤”“­F§ßa$5“ýõoƒlUBÃwÁôs*"–\ŽsÙ™ïq˜ÎEV!”-‡OŽgHeÁŒ“‹I”Û÷„/éŽ!ØS‹Ùô4Aqz œG°$Ž9n%‘ÜeÇB> žD0'ݦtÃOAËEE4mikS­Zôâ…<ËŠ7¥ZµÒ_¼P¼ðùøq‘ŽÎc tË–t…ÆDÄã‰5ºx.X èfþÑѹZZ‡×K—ªºoõG©gnéÒ÷[ÿ?Ö… :uêô^WkÕª¥ªªjff6iÒ¤èJ+¦¦¦ééï §´´433³OÿïGãÁz³gß\û÷÷úÒ¿žõ|WËzìj{}ã¸;7Ÿ={¦pÇ­×c*Öü“2ÛÙpäÈ ÀµF£oÞTyrž7/ðlÐÀ';[)Bqæ à UQ óòRÌÉø|¦Gl µys+ ùù4cdnNOŸ*h¶ò\ró® ƒÊgûMõš¥ì,EDÇïÖ(‚=ut¤¹ƒ H:þ€j.%8êr8IYUYèÈ/!×Pj³·l²WÿØ@øñ*ŸEÓ”JÑßkj|È%‚NÇ’O2=Í¡”¢”WflË„@LI…šE×’èøKÚNS|ß÷T•’ª½‘ù9ÞŒR hS ÕÝQvªõ7’ƒ'EdT¡±”\ï‘É‚©Í%Ç3”§Üâ|åeÁ©Û©P‘Ãåv0™ $X’éº^Éó.ól§gVᭃǣ= þýÜkR)MœX¶Öÿü¹bv•š*ªWïúË/ ‰ˆahäÈG€gçÎÿÇÞuÆ5±¼ÝºôŽ((¢"н+*±7lˆ½ì½€½7¬ØÅÞ‘"UEš¢ Š€¢HGj(i$™÷CrÈ.àýß÷^Ï/v³3³³›ÍΙgžç<Á½ç¯¬LЫ×cÀeîÜ—´*ÒEïúàîÝ$ÀEW×µ  êk™.ÁªÛ|"Må³Ý±ú@Ñú\]^^^›6m‚‚~Z)=ztPP›ÍNMM=v옮®nTT”謬,ïçH Wn«ÏÑ:ãLCÕËÏÏç¶n}'?Ÿûô©áo:uá÷o·ÆX±r~”weØÑÓí'ÙQ‘¾û&mÊÙ7¢í1]ôÝúP?ïøñ~'jàë;œ–öqY80,,¬`äH=w÷TênÛ–±{w¦ªªthh›öí%¨ Ί*ëÔIöÅ M cµKK1a|}¡®Ž'O0 fõv¼2Ì^‰[!'‹kΘ2æ§£Uî¶@ˆ]±û"BôjÛ{Ñ¢ÖÈùwI˜rŸ3 ÒÎ 1spÚ•QÀ‚“΂/„¦¶ $åP!)pÇãxð…ÐV »cnü¢ÑQ|-BHB³á“Š”0UGüÏW ÒÐGEè+BC^ü©¼ÛT ê¿t¦Úg›+@\p‘ÉB«ší,ªüK+"‹môÖE¿Æ°4@Wí†IžØ ÷öEVÜK0 1ʼnÉ$Êñ:s— EyœZ„Ù–µæ °ûv]„Pˆ!=q}'ô+éWýz·©§ï™ ÄÄ ysøú¢MÍúï„`Ñ"æùó,UUƳgZÝ»Kqc³…&¾ySÚ¿¿r@€‰œœäßM”[BCC62² š9Éwï~·m[„Rl¬­ú¯eÃáïWrg³ùíÚÝON.>~Àüù¦UŽÒ•ià">¡ÀàÖ™`dggOš4ÉÉÉiРAµ;{öì“'O|||ÈÉÉ•––ÊÊV +ïÁ÷#t1„óô«9CbµÈ(Æõ÷8õiE *)í±¼'ÚK–i¤Š„B¼ÌDZ)>3‘ÍF¹ärÄä£v(É@[zŠÐQ€¶´ ÓÅfLc‰å+#&&¯gÏÇeeBoïÿ™ÀáïÃÎï#:wÖŠˆÿkRçÿ×+==}ĈGŽ2dHí%³³³[¶lYRR@OOïýû÷zzZ…YYY]ºtÉÌ̬çѺ£ž°ÿרéòy}ܪùR$Ñî1BFz“AÄ1‚%÷’Hp&ùOÒK¯+XCù·ý*Á@1b´”Cœn¥‰#‰ü8²ó6)åH¨òðÑDÐ4AB(øP×.!„¼}Ktt@zõ’ wEqt,2ää2½¼$ušBÈúõi@„¦ftB%góìlNÓ¦þ€Ç¦M’‚‡'èÖí!à²lñºÿoHK+QRº¸VÏLkpÀ!ò þ©ÁHOOïСóg”â=333•””DÛœÜÿY¨åç÷ôü.rWÊÉiȨ“26ëö¸a•Ù•—êqÞ/ÊÌy$"XŒÙY\zz0„[[Àeð`šg&„M›>zz~”^©™™¼fÍÞ“''Q9ÝçÏeúúY@Ƙ1ùe’Ü9öï'Ȇ ’[¾ïAUS‘ü–%×› éjGkÓÍ „RÙ_ì˜,7–8¸HªWä’íî¤ÑR‚Dy9Ùû”ª³NÄd‘…‘nGÉR/òèS}}áëŒbIb’WÙÄã;¹’@ÅSÈ®HrþqûFB2I|ùÅoäo«Œ&“/‰ÍÍŠMëëäI<‘$-R 8eäZ1Ü &Êö—I:¥¨8"’{ÁÄhŽØãjäÉÚl.q8DР·–äSˆd¤®¾K  ** #G‰@'N”ÒÒwïRzI^¹’ DÈÊFQ)/‡} xXX„••Ñþa6o~¸ß..¦Fuë¡ði¿†ë…iÓž.“&ù×T€.Á*!J þ©ÁÊÎÎîСƒ——Åò'Nœ°²²m9räW©…ãÇ×ÿhñ‡`Õ‘®ÁâÅ &'äóÝæÙUfWfNüL"(ªÕ®~ZnÄúœMÛ•“ÃÖÓs­›ªjù[oР0‰JW"ÄİTT¢ÔÕ£öí«U£ð/¼_¦©™dLŸ^ ÑÚtå ‘‘!YºT²iêY0Q5!Ð'Cl ³HòÝŽˆ#­Æt#*ýÉu ù´\²à‘E0’hM%ÇŸPKýKÝÛü QXJl]ˆ¥ŠUP®ÕÔ나:À‰Ÿ öˆKùP'%­†ÂÿP‰‘RÌ%þIÄñ±t% »Åwfˆk½4Æ>g“ ‰î¢³š(-']wS•` „¼Ž'}׉©U·•ä%…ظ¸¯¤ã‚nD¡9~KBaÑÝ>~0šˆ ·§77oYY3$S±«WY Fƒ‘qñ"%1F__f×®Ÿ€ˆK—r¨”'„lÙ/šË¥§ÓžåFFæÈÊ^’:ÿò%ÁºúA θ®4ÿQæºuCXXƒá¢ pñÛ·©*]‚UHÔüS‚Õ¥K—Û·o×ttðàÁ÷ïßÏÌÌäñx_¿~ݳg¶¶vd¤X£±¨¨¨E‹{öì) ­Öÿhñ‡`Õˆ¸¸YÙ ÒÒçcbè¯Üü ¡ÐgõÒÊìê΄áeœ:šÇúî,'XÏãê28¸¹}\/%&RR^¨Œ¬,N“&þ€ÇÖ­µ†nW‚·wa›6±…!áá<•L cÉÉÝss#€ŒOØ’îèû8Ò´ >é>ŒdSxÕ•»­b›ý6RLa4y›Húom“§r¡ˆü™Œ:%VÌÂÒi'9ý¢.-¡De§@2äZÅâ—ècx”Ø=$ç"ÈÇt-§ÿÿYLî$Þ¤ó9"½£â&Hï Ïoâý…¶J>!„Ç'÷"ˆå±Š_ªË.âùžª^kJ±?B£F’&3ˆ‹7%~Í“(õ#èFL'h Ú,B!Y»“@ŸHÓW$—?y’HI€88H~0>dKKgGRÂÃK”•ßÉËGäÛ·ocÇŽ¥»;vlòϸõ9Z7üKVddäâÅ‹EAÔkI,¼|y¨h)­~½#„À[+³«+ƒû° ©-$T‡ÉgÂË ÖµIËW5ÀÎîàÒ·¯ECTeæÊÈxJIy>}JÕáÈÕ5—Áˆ’Џs‡R$ýóç\…L cåJÉ !DMdð`”TüË7Òª>11'¨éˆ•omÆ“(jUÜÉñ<1ͲÜJ>Pþ•Êí"¢Á»>-B_H"2Èñ×ÄöÑ>øÙRÝG,]Éþüü]sïߎô"rï#qð&Ý\*üÒàDdv’n.ÄÁ›ÜûHòê´KI+ û}Ä«uøiŠÙÄñ&QO0’(N ®’" =a–©›+(~ …*%¥d¦>Q0"$yi …ÄÑ‘„Á JnÜ×—#/Ÿ dìÛGÉvž˜È)ÛÙ}•hc!%…¥­í xìÝK[´²jUàÒ¶í]6û÷>ÖIÏ|ûvU²¿ú×ÛøÁÆvfžËçýÖ“^¹’¸4mz£¤¤¶ÉÁÿS‚õ/ÿ$ŠÐÌÌÌÖÖÖÖÖ¶}ûöÔ¯HbœEA×Äänn.ÇÍÍjÌ£:wïÝe—çÛÖ—ïª57šææ«¤K/"¦2ÖÝ=ìóY´½{|»-£ªÆèRAa!¯C‡ûii¥GöYµªÝêû÷Ù´)^CCöÝ»þFF”b§ÈÚ¸1]V–áîÞjØ0U‰åýü¸£Gp¹dï^•M›”k/üᆠCz:ºw‡—tk ¦Ë+À¨•ÅÛhœØ…ùv’;ŸŒ)›“9ì_‡)’Ex|œ} Ç[`–BV³-±{:t¨…róøxƒóÁx/–ìk«™}0¿4•(µP-¾ à+BRœ‚äJâ J²èÜýšÁÒæÍÐHrt×?¿û¢„Ïãq>¢ €icÌêKã·ÜxõW]Íqh6šSˆ÷ŒˆÃ”ÍHJƒŠ"În‚ä*q‰˜¼l„B\=޽k+,`Éœ?¸¸`Î ¿xÁ><ŸÃ!›7+ïÙ£"±3ééeææñß¿óFŽT{ü¸¥ŒŒä¸Ï²22hЫÐÐüáÃu=._jl¬g+//]‡.Å=¼ûtÅBüu"E-í©n¾Æÿ¯ÏýâÞÍc~ÿ&«£×¬K·v§¶ª¥Mgÿ¤·bDÛ ¶87³K:Àß?ÍÚú©œœtdäx33 Zu ÁøñnnY={ª÷•“£¤g±n]ÚáÃÙŠŠRþþ­ûö•À™àr1zÆ¿`]³&ãÔ(Ib‰68ÃùŒˆKÛ¡)™%"¯;oã´Bh(cì 9ʃý—¸‚+aøQ ²Õ úò-ÕjBF1BS’‚мˬК’‘B'=˜7C¿fÒš$̨"$$¤_¿~ Ò”€ :KÜóÉÈeUR•GϦ°4†¹!z6…\]þ²È(Äõpœ DJ>ÈË`t'Ú7? k.á}2ôjƒcóЇ„ˆ8ßÁzgðÊЭ-îìE+ ª|§¯`íNp¸0nÆò»£ØÒ¨¶Â\.¦OǃPR½{>\BãááeC‡æ“%KOŸ–?JÚÍ*ARJxå U1 9ú7Gÿfh«MIîUbD&«ÇQbѯ6z˜m޹æÐ–<)¨@B:¶ÝÀýh¦ƒ]Óa?ˆR÷r 0Ë OCÁ``ùdZ9 ú`aázÜuû‰8wе2ãÂBŒà`hhÀÓ}%½Bbcùæåç íí]½ª^»ìKheõ94´¤}ûF/_šhjRšR—+xýzlÏžìŸÖ?–äÂÏž¥[Zz©¨È&$LÖ×§¡#œùîí½É£ËXâùµ´¬Üx×{ÍTèҺ͵ûâãYSõÖ6£Æ\¼Qí¡ˆä‚;^ˆ¶;¨¾ßU«f­(*âuèð %¥dïÞž›6Q# •SÔ§O(›-¸q£‹]S*U2iÒ×G äBBÚ4o.y’zòd©ƒC‘´4nÝÒ˜4I'+)Á„ ðóƒº:ÜÝÑ¿¿„Æã¿`òB¼ÿyìß‚ó$_BJ¦mAh U™ÇrDcå|L€!pt:QªXŽßgÐ*G ¯Ó’"¶o5SEb~måd ¡FÐP@諈w›¨@_Yü½ž2DRˆl> Ø(à €ÌdW³›Ã’ eÚV\Ì Ñ¯Ì›Á¬á‚2™p}s/‘œT2Y 1¥ÇÛò‹±ã6Î<_e¬‡¡@Íó"Ó·!#Úê¸âˆ‘’`o¢0u ¾~‡ª \VÍXð+²²`cƒèh4itä ðå ¿ÿ¼¬,áØ± ÷ïkÈH"Keed̘$oo¦¡¡\hhCCJWþåKi÷îÁL&ÿäÉöË–Q©RéVV^rrÒoߎëÐA“nuê8efÄ),ðm5.Àxtµ†&=±Jr“–WXõµ!X¢<3gš\½:Pbá?럀?‹RáÑ£}=<¾ïØÑmûvªfçÜøwÆç0Å.! iéÑ.×ZÛT¬Ö'ù{?ž5¥öFÆ]½Órh5nÙEÜÆ+¼DÛꊲ§GýZ†:D/¦ÆÝÝ­»w§=X9“¼té¥Gº›™IvË@¥Ùí˜1ê/6§"è¼sg‰£cqÓ¦Ò/ª &At˜Ë…½=î߇±1ŽÅIã ›ƒÛpá& ,Ÿƒë &ií¯Œ-gpø:Á‚qرkUÇ®\ñ´vÞAA Ô•0k¶N¥ÛVnÑ8Œç bƒÖ”Üv½ Ø é@8|$"«?J‘ÃB. yY•rþ2)ñ’Û‘•ÂÀM‹‚t;bۘ裣Ÿw[kBµAu§…~q¸¯X”r  ÀÌ>Тi ,ãã”î!<2ÒX`vЦ°”,ª{àß³]qs7šJòÓ qÄÏ 7½»áöIZILHÀÊ•ðñ¡$Ô 9Y0wnáóçeZY}.,Ôt'Ë[ؾ]yëVeBxãÆ<{ÆýµñÊÛsË–Ø•+Á``¬]›TíU0™LQ­F 8N+¬,à| ]­ZRûUÈÊà žž@/Ó‚›>´'nãePhíW@VCŒc#-….-qÜÆsù§<ÁT=Q-w2áS¬ukfÀ*$ìÄzk4Sc?ŽÂ‚Ð_‡1‡³>eJn¡–ç¡ò6·”Y–;Г̰´†H‡8ÛàÖÌÀ 󨏹LîV°¶ }5\{¿ó·Çµ±8> ³[¤8ô‚m;˜ÂTK¨£ÀÈ¢ŒU9)¡¾2ÚéÀÜúų:ð-p|®ÅþNq ¾¼mxÔ'$n)‚fãÑdìÏœ¬»²7¦wİV`'…”³+ŠWQË}‹ˆ;áÇn¿6θÖêÌ)=ðb >í@O…rvEñNúD¢õ<öê‹(å¦+®Ì~wz±˜]Il!0ÝíqÓÍuŠœàÙ94Õ•p?rac‡õ» ¯ÃZ9ôHÌ®BBBÊ»T¥…7’ÌÍ [[:ôºœ]Õt'ÓÒææéááeÓ§7zôHƒÍ.ªý*Á‚)ÇŽe÷ê%ôön-bW €L›åé™=q¢Î¥K~m¼öø|áäÉÑÑy'ê-X`Tm-ŠÏCíOŸÃöß°À=³y5±+BH¹v^ìÃöí‘**²Ó§k–³«òœœœ~ÄhìBH5ø‡nþ}øïZ°RSÙÍš)üêÙ³ZÃlþ‚È<»cG÷íÛ»Ö^’•—{{¬uÁ×/åßôÛ°½·Ãš*ÅÎv1)ý!Á€¬¤ÛxqTBµ‡ZmðMúQ*Úþ¸Ç²]jsäPV&´´ô ÊìÛWïÅ‹QtÝ8áàÁ¯^½*èÞ]-0°¯’%¯œ?ø&|úÄéÕKÉß¿µŠŠ„Z„`Ù2æ… ¬ž=åV¯V?^²ÿÖ‰Xµ „ÀÁÇW]å‰íðóêHr*¦.ÁëHÈÈ`Ë l_%yí/3‡\qì´o‰k1¸‡Ä~‰‘˜ŽUñ4L pl†ÕÉ1—Çǃw8õ¯¾€Ví`ÛÃÚ¡‰z]lpðˆŒùرƒ™’$_¢¿¹%L„ïGܧ Œ´° ?æöƒ.Mk¢_2±ÙUìneÒGçbåÇ 9ëNàÁ3°êƒ-³1@Â;^¾Â´%ÈȆ¶&\aósJÒ_Ÿm˜2,FÂ;P”dùöM`k[Àd µ´¤üü´TU%Ø®Á²e)gÎä(*Jy{·0€ªÃšÈ±]KK.,ÌÜÄ„¶S¡ƒCØÉ“7V|ûvœACø$Ö‘SG¾‚öþþ‰¤5cÇÀNßR伟?3MMïÉËK§¦NÓÒ’üÞ»r%uΜfoÞôèAéÿÏ`0’Iózw³*Œßÿeƒ.þ»SIIÀóç¹·n¥S)ïàÐÀ¹sq<^mî!¼’’‡Ó'TfW]ç-þ•]àH<)§ Fç Ö´|¶Ä¦j‡¬¬Ô½{–JaaÙ‹Ó­®  åîÞ£U+¥ˆæÌ™ÑB!¥?•®®Œ¿¿‰±±|xxé°a_JJ$äf0pê”Ú¶m*¡¡¼É“ ®]“|Õ+VàêUÈÊÂÙ³f¡ìçõ©_G #C>„Ã\Øqcg#_’__GWÃÿ Ú¶À‡$ YŒQ«ð-Cb×À¤)¼á¶-õŸ'Ì:†7‰”êV†œ ¦õDؼۊý¡ ‹o¹˜{ M7 å̸‚óÁâ8¸ÿä¤Ñ§ëÿ˜]•pð ¡û^è­…­ ’rÀãò-î-ÀçÝØdSv•”‰-®0[‚û!PSÂÑyøpŠ*»bqàtílñàà¸OŽHfW„àÀi ™„ŒlXôA̳ªì Õ=ÛW¯büx°X˜5 IfW‘‘e½{çFF–µk'ãã£)‘]Ø´)ýÌ™99ÆÃ‡-©³«óçSœ¿ÉÉIݿ߭ìÊÕ5ñäÉrrâ7ÝêÔ‘äï-r™uí¼L"»àÒccCÚÙùƒPHìí[SaWùùe6|”Ä’Xø~+þ»,QaÀCOO>>~ ººäwçÎcbòj ð¸ímSB^–ÓvœípçóŒêÌ g:µbåæÔ~ÆZ,Xöç#n¼Jm_œÝuî#‰ý—ˆ¨¨Ü~ýÜY,þÙ³ý-¢P÷3âãKúö -(([¿¾åT®SRx ÉɶŸCQ)äd±hv/ µ ˆ2>Î<Åö›hkˆðtm‰…Ã`7J’_§Õ ¿~q¸ŽàÏ(âT|ßVM0Ð&Ы—Åóÿ Š8JD`"^$ :åÌ_Q}[bBWX·C‹: žÇà¼/…AA* Ú‡æ@²ÉÐ#Ëá{& L‚Ã+ÑŒ‚4Þ\Ø/‡ßK0X¿{6Bš‚½øÀlÜ6`ÿ~ÉåycÆäKKùG4TT$ó‰íÛ3víʱ«‘#©©½ÞÞ?F~+k×:ÛÛKrû¯^eäÉå .\0o^]ä©Ãmδ/¾^ImÎQfN¯·êÕ‚v,d—Ü,*âÅÄLìØQ²óþ‚ï/\HF …Tx 0ŒDÒºžýü&ŒÏÿ2‚Aÿu‚eaöòeE•‹ãçÏêÖM;"bü¯G‰Pè¹xv‚§[ù7-YŽ»zGJ¦*u㇟9öæôq"àÜÊzÄØË·ª=´ùÁÇ}^bîå8¦­Ó؆‰"»qã³½ý YY)?¿áÒÊ Ê·²zÍå OŸn¿d‰ÅZ_¾p HÈÌ,³¶V}ò¤•¼¼ä·ÂéÓ,¦P¥cÇT%.ä½áÑžŽŽñô)šRˆwLIÇ´%}Kc¹@f.œÎ㢄B4ÕÅÞ¥°N5-·Gã‚/òŠ@C³†`‘ L(EgVÑ©ù‚Ð$øBa¥ ­±6,Û¼·A}‡€X<„%‰¯:è3xbEÈH¡“!,MaÙýZA¡®æ´&.ûãœ7’@#9L€M¶hMùï•€‡]Mqb-U±ç!˜¾™ÙÐÕ†«3¬J®"`Ù2œ;iiœ:…E‹$WqsãLZÈá;»FW®¨ËR¸QGf¯Y“&-͸u«Å¤ITŸ§¨(怯JJø;w¶Ù¶öŸ™ÉêÑãqzzéŠí¯»T ð9ìSfF|g—ű"yª$Z[Y.çäÈzžúøñØU«^ Ò4 `„ÄÂoßöî*#ÃàñFÐ ãI›úu³˜2þeƒ.þ%‹QÝ&ñÒ FllQ×®A^½2ïÙSÂ߆Ë4kvëÇö«Wc{÷®Þ°iu´ë¥ò]ý®=&Ýu—ýÙ/(ãŸ^~uü ;?¯ös‰0îÊí–VÕËÿ}ñu‰k´h{N£Ks(xmPÃÚµ¯y¯¥¥ðæÍXccÚ†Ž«WSgÏŽ‘–f¸¹u9’jèoBÇÂ"1;»lÜ8õ{÷Œ©(>?~Ì™6­Ã!Ó§7º|Yò0ðíll€-àí6m$K_òùØ}»ŽA(Ä~¸q )¨ox‡‡ñê=ô4ƒó:ôjO©"nÜÃqÞâŸæm±b4Æö†l=Ö+“-¿80+­¯ŠÈ–e[ jCOç‰PhôW°Ëù¡Iø„àÏàVGªÌ[¡QýÖ(#¿à¼/®?›-õ1ß s­¨ Ècb眾ZjØ6Ë&Cšq°ë¸øQdŽ›§ _ëKt·9ØÛãÁÈËãÆ Lœ(ùDgϲ–-£1upòä‡T))¸º¶°³£ª‘ÁéÝ;45•=eJ“[·ºÒU/ãpoÞü2¤©ŒÌïuwy_…6âÖf:­ŠÎv—[Ö*y\+©éÝÄDæ“'Ö£GKp“H!QQÌ­[[ïÞmú‡`ýÏñ/!XuƒÈܵfMÜÑ£_»wW ï'1-ÃæÍoö틞6­ÕÍ›?y=„Ùv´Âò®eb:å‘w#JïB<Ý‚÷í(üþb÷Ô›·˜]ÓQÏ Þ-¼ IDAT˜¬QÇÃDÛCÍtýÖ6ØÐ%’Q£|Ÿ>MéÔI+4tŒÈY¶nMس糊ŠLHHߎ©>11ìÁƒóóù¶¶·o·––üÆ}ñ‚7v,…Œü|ŒÐPhjÂÝææ”: ûåÈú]m\? + JµÁõ§XÙù’‚Ý0^ ]:ê<ï’à⃛(倾&f ÆÒ0¬wN Ù ˆGÈ%þ´ŒXN¶›ÒV(ø›Á"&ñø„/b_uÒRèló–è× Ví Vo%z÷Bpü ¢þŠ!Ü ¬1¾/%n$‚hÙÑÌÈÊ`ñDì\5jt6-Ó– 8ÒÒØº’ª15?cÆ $pwrKwñÀ•+ysç&8w®ù‚TÍâbþ€aÑÑEhúùõ–—§MæÍ ºt)ÞÈHåÍ›q::uZJ§ ‘4ƒ€!sØ|w®bÄV‹•³6l‹¼‚ÌòØo5iDÓ…‡Ç÷Ñ£}ŒT¾|™"ñ•xâÄ·•+?6oÞèãÇÊÊ2Öÿ).æ·k˜–Æ9w®ÃÂ…¦éé¥-ZÜðõëÔr‡Êh×K›V——QnÜdÚ?Uƒ Y‘ŒÈ7/woOóªJkʺ•ôô²ccjè&¸>h1xhµcR™·?m›ê«|Ú[}±º¡ €Û«—ÛçÏÌñã[Í›ÃǦ’Ü“,_Î<{–%-³gÕæÏ§äh¯S’¿w•F䔕{.YÙmþRYEůÏýâÜÉMøÄüþMÕ°yQzZYi‰¨˜Š~“YÏ_Ë«Vã1š_ÊÓZ&VW”“.u‘$¦I …½z¹1™¼º)¼óxBkëðÀÀ¼®]Õ‚‚¨ 7 +±¶þ\R"\¶L÷äIJÚw_¿ ¬­ó¿|á·m+ãë«ih(á\|>/ÆÅ‹00ÀòåX·ŽS­Ñì>ûâæi4¡,}ü9«ŽÂ+Ú4DZ5°¡ï1g¸½FLšbŽ%æ[C³N²Õ¢²M(ô‹˜¾´mŒOYedÑD újÐP‚†"4ÑDújÛê42-ŠÀ.C&…(`¡€…‚Rd2‘Á¬ØN/¬Xõ ¡ˆPÉÞ6Ä´aR‰ r`?ᯱŽk·VX` ûÁhDSÇõK*6ŸÆýhÝ GWQRf¡ò µeÜ8=jæåKì܉çÏÑ©ž>EIÎa<™1ƒy÷.[^žqó¦ú„ ”øé£G…“'åóÉþýM7l ‘º~ùò§N%kiɽzeÞº5íŸ- ÝÆÆ[ Þ¹c9ie¢Z'”g3cÉ*èw€%+¡·ªrH:2R[¹aÔ~ãâ Ú·¿¯¤$›–f§¦&¡Í©Sßݹ“1~|ㇻƒ¾;r4¡N":3bþËVùåñæéÓ³g^¾,á9 Íê×Ï]GG!%Å.ûMУ“eâ¼h²ŠŠ“îyèwé $;3ôð¾woTñd—’‘í4}VŸUµ«yYÆÆÆjqY·ÇÛ”×j7qÊð.ÕöDe‘{É_ÃNþ©Q ïáñ}Ü8¿õ7l衟?—Ž¡ûäI*K~"•ÄáW­Ò;z”Òy³²„66ùÑÑeMšHûøhvè y„ß·—.q“’ämlpõ*t©Ù$^„Ân2³¡£…k'ª ¯o°â0â¾ÀÈþ8±Æô½×³ píÎÞgà@ IOzö|üömÎ…]º¥®KÊJÅjŸÒ²rã®Þ18„WRòæÌñÈó§ÊØ? 51&ÃG÷ßä¨Ñ¢eM-3™L55µà}Ná§Ž•9úüu“Õ$½j»Ù?>³X´½sH'Cª¡ÑÔqøðûuë^ëê6ŠŠš@%?C$%±úô ÉÉá­^m|ä Ý_ߢ1c¾p¹ÄÉ©‰£#¥×wa¡pôè‚à`ž††”§§Fß¾’Ç 7·ÒÅ‹•²² « WWX[Sê[Nf8Àç…8¯Îáí f%B}¤*CHàõÎxó“‰eú (6h™_QÅÚô«å)­°"p¯2º "R«7.*ÈVc +ßÖP„¡&T¯›ØÝõ98<hÝs‡ÖÑ@(r¿ÛàŒ¬<0˜nƒC+¡Gg!ËݳWŠUBnŸ…95U­ìlØÛÃß .ä9;ËI|2³³…Çç¿{WÖ¸±”··fçΔå:LDðòú1fÌ[¡\¿N5uieðùÂAƒ½ðÁŽ’ãþ} É\#;3fÀÏ –/ÇáÔØ!p¾„u»PV†ž]pç,Z4£ÒA1*K94ÑÁ¾e4¤ªàs.ùW8 ©+aÆ`¬ ã†h €…ÅF¯ì"äC[™L± JGº™¸t”i¸Š78ŠÙ¸ýgž"æð—»Ã(ŒìQÇ_$"öhçuèMǹ…ÏÇÖ8x„`´®‡&5MØÛ#;›Æl!9Y`mŸ˜È76–öõÕlÕŠÒÊnhh‰µõçÒRáòåºÎÎ4ؽ{Ç0 ¬´T°géæÍu ¬Û¸ñÍÑJQQ´µ3ãþKøª|×ÓdÒK#qfX!KÞî5*¬”®ER§n8x0fÆpçO«IG[»v}Þ¾=¡ÊÈE—`½&´þh¢7ãÍ™`àÁª|ù\®°S§ „„’C‡Ú®][£‘ @AjÚ±ÞýUQ¡=xçåÆúÁûv|KªRX«u›þ›[YK–0©ŒœOoØ ,_|li5|Ü•ÛUÊ̽üîrp²hû̌΋ýw„?Ø]º<ÌÈ`•»ÑÅõëi3gFËÈ0<æZX$df– ¦êæF)™•<žpôè·¾¾9-[*†„˜7n\—Œ-[ÞîÝÕ´©RtôßázUîÛ.B®¢ÞѾ;ˤÄK·Œ°).”ÕïÖÃÎ= a;ðáC~‡TTdÓÒìTUk|LY,™ÙËädVµ Žt V ¡& L/ÿËVµ—äÈ×Më¢çœ7T•­Íûä´OÛ”všäZPEÅtÓÞn󗊶?e·Ûâ/Ú6ÖQJ:H- ®®¨¿3›-°¶Îo×N%8¸¯¦&¹¬“SÆŽ™²²Œ‡[ŽE5^òÙ3î¸qÅÅdÔ(…»wÕ5¢40¼{‡)Sðù35¾}X±‚j'SÒ±õn<!hÚÛWcîTª’¤"|ú†kž¸ðùE ª„)ÖX<Mh4R2òÅÌ#ô¢’*V ¥¥Ð¦©˜l êØJñ3ÊøxŸŒ€hñ¥”TÒSGÖbFÕˤŒv™¹põ¹‡HÎ9YŒ±À‚ñBÓ)>ò=ÖìÀËW`Ú ;×Ñðá‹‹ÃäÉøð Ø¿ŸÆóyà@ɦMÅ„`Ãåýû©†G¦¤ð HøþF:v„B2ujÔ½{ººòÁÁ}MLêÂâŸ?ϰ²òàç7bð`ÚÙQë€Ê¾íŒ Ý×}ÖÓ^Ų’u¡[”yEå…ÖõJ„9s^^¹’°jU‡£GûÔRlýúO‡%Õ”ƒäÁú'àÁªæòù|²ÆÄÆKƒ]5íÑÛbÛ®&Ý>„<˜>!9P,Ú.£ÐÈÞç¥HÈ´„ËWYä.ú^^FŠ}~lƒH{ׂ—/3‡ ñ$ÞÞ6ª“É·°‹‰)êÕKýÙ³>ÔHlÚ”¾–œÃÍ­¥ UŽõömÙˆù99ÂÞ½e==5µ´( ÅÅX²7nÀĉ¸pêT¼"üV9âU$tëˆ#ް¨í=Y 8û­(f#L1ŒE¦ˆ¯!xTQ&M # ]uè¨AOzêÐQƒ®k@G :ª5®Êå0‘S„&² ð£9E:ªx+VO¨-ôš‹N-Ä–6ËÎÐhhIwBðü-nùÂÕ|´2Äüq˜5’¶ÉJÔÚ‡¸r/ÂÀ`Àvöo¦§GG@]çÏÃÖ–jÅâb²vmÑùó,55†››æÀTŸ˜ØXö‚)¯_—Œ¡vãF uuìêòåÔ… ß‚º[Ç ?ÕhÒD1*j‚®nƒe÷« åYqÊ¿qí´4VOì !'à­ Û¢ÉûôÉ«k,ÿ˜Üà}(+vìø0>¾Àß„¥eB¬îîÙãÆEèêÊÅÇRS«þF—`ù†÷0Æðý/ ü!XÕ^~eqMUR^•(«¤tæÌÇbºw×~øÐê÷tS …3<ÝDÛR2²ÓÜýwê2âXØÓ÷b×åGËzëöwø(üøÁ^¼8äÉ“d;»ÖW¯¬›éîõë'§D_ßœ¥KNžlO‹cmÙ’áãÃŒ‰a9b¸r%U¡§ü|áܹÌà`OOÍÞ½©z€q8X»ïÞáÕ+ŒK—h,ÈÈÆÖýøš‚—¯ÐX;ÖbÞ4JiO~E|2®zà–/ ‹Q\ uÌUÓè…­Q!ˆO÷l|ÿ!¶‰íI…â 6­›àsFm”[¼ŒõY€Ì|1¯â j¬2 =‚>@Væg›™*´U¡¥ mU˜ÂÔò œJŒnùàÔ=Ä~€Î&0ÐÊ©u1Y‰ð.[úmZBC GœÐ—Ž#!8x[·BWíÚáÂQ­›•%1"?:ºÌÊJ~ß>ŠBí^¾,;6IAÑ¿¿ÊåËFÊÊ4ž×Ë—SçÍ‹éÕKcþüfsæÐP"ý¹‘„¹s_ÔÄѱ›…T]u"yÌH§\á³&HËÊ­JΟÏ3'ðÉ“ï—/[̞ݠ+7?ƒŸwuHŸræ§Õº½oв;Ÿ\¿‰¾91­“ÃÐz÷ÓÁ»w¹%%eŽŽÝœœªÑ³ ‚gÏrGŽ|ÃáW¬hqüxmÑÈ¿ÂÙùǪU©B!t3¤ÈW82}záÇÆõëê'ÒˆHzò³g£ ÍšáΟBâ© ê¶"ä tïçÝèSÇÛ6wüpú>"?€´F[`©-וÔ¥ä#«?˜Èa"»Ù…ÈaâG!² ‘ÃDqt 0CÐÇŠºš*UÍ]•7tÔþ ßqú®y¢¨šêbáxÌ‹ÆuõúÏ+ÀΣ8}ôõà´†6·ÎÍÅÌ™xúTœiàÐ!ÈQ¶Y&% llò?æKûøh¶nMÕjëæV8mÚ76[8nœú­[-¨{µxð sÊ”w©œ¶….^¼È6ì)'<}ºß’% 3TDn!„Á¸ßnöĸ«|X0}z2‡#œ>]óòe£Ú³•C À²eÌsçXÒÒ8tHnÕ*ê|))˜2¯^AF»wcýzÚ„ÆÃË6#% ¦OÀ¡mУ¡l_‘Ÿpþ1®{Í€ÖÍ0w ŒƒF}Ó 5Û«r˜(,*•WPÒ×´äþ^®Z r`?q^!%vl ‡)˜j]÷¨C>§¯Âñ0˜E•Åâصª4Ó¾|‰iÓ‘mm\½ŠtäŠ_¼(˜<™—“#ìÑCÖÓ“ªP;€Ó§sR„B,[¦{âÕ©‹gMšÉç“:'ÃðáC~ÿc‹ý) IDATþî……¼Í›»ìÙC- c½!r ¹´Û~¼’¢fn vú–&ü•¯w4.®X&¯Ö·½öW7Œï÷øqòС¾¾Ãkz±ÄÌìeBB‰«kg{ûêÍW\.éØ1.1±ý‘#Y«WSR b0ÞdX{^l>ÿY‚!ÂWɽU+yB!–.M~zô»JþWëw©°?L›ÖjÒ$ã¢"Þœ9õ|œRRRj9ÚÒrX‡i3Ëwß]:«”_ñ·JÌ­®Òï‚áÙ³ýÁ‚AþþuQx`e¥sçNWYYÆ‘#_wïþL«î„ ^^­TU¥oÜÈ·±ù\TTóšS%HKãìYµíÛ•=Ê^µŠÉåRýÍš5CP6l€@€1v,òi ¯ŠOAp\y9\€–}àt\ ÖÒÑ­-\6#Ùû—£¹>>§`ãI4‰…{ÅË[ÿs0ÐUƒY3 쀖ª_mº¡³1šjýSس'n£ÕX ]Ï`ÈËÂ~8¢o!â:fŒ¨;»z‚.VX¹Ì"XöG´?Nì¢Ç®Á20ÑÑôØÕ¥K¬uëŠsr„#FÈ¿xAU¨89e,[–BõOž¤Ç®|}s¦N}ÇçGG“:³«Œ Öðá>……¼É“[îÞý7±+™Q\y¿VcxšLzcP¡)8ø«Weve2bôˆS~m¡öW·D\¾œðøq²ººÜ¥Kj™¶Ý¿Ÿ™Pbl¬8uêÿ±wåñP­ÿÿ=cßwI)R!-DTh±¥õ¶¨hUi¯Û­to{Ý¢º¥}_Т½H+Rˆ„²§BöìÌ`Ælç÷Çø ‰ÙT÷w{¿¼¼fÎyæ9Ï9sæ9ïç³¼?ߌÐ:p øý{:€+ø¨“U)‘ÿñsþâ¿kÁ@"‘tu“>}bœ:Õ}Ñ¢/n€Ì'îÌ›Ñög[˜ˆËÊèýúÝüü¹îðá¡+Vð¦M)55¾C«ss¸o? ÿ§û\îk 1RÙgE™Ž‰Lù6lxµwo¢¢¢ä‹ã °Ví[E.. ,±g¡§'Ssr2ÍÉéCAÓÜ\68¸—¦&¯OE__ÚîÝÔ÷ïÙffW¯*óî@ˆyóPQnÝpõ*†òT»2?aãÜ€Þ=pp;ÆØñÝIS°Ø¸÷Ç®ãYÈHÁP#Ì0Ò6¦PæÓvòÿLbSñ<áñ(«× ­ßK§bÞ8ay…øË þ7 §.n‡³ß””ÀÍïä\P(ÄâÅÕ411lÙ¢ðçŸò< @°ÙÄÒ¥¹§O—‰‹“NœèæîΟ[4$¤lܸX:³zµÞÁƒü¹ûA¥2mlˇ ëüäÉ))~ä„7sð‘þÄ-µÈ4j?ÿ½EœÃ@"“'ù^ëa+úXÛüüÚ~ýnTU1.]²5ë› AÀÄäERåÌ™þîî­§Häç3ŒŒRkj8€9_1Xw‰ ‚ ½ML$Ýû/ ü"XׯWL›–¥ª*ž‘a¬®þe*jQ*¡Z5åŒÿXZZ,>~rŸ>˜Í—umª3Áá(“Õô¶önܵy¼áŽIß#d¡Ù³Ÿ]ºô¡K¹èè ::zHýüòçÍKäpˆv+mììzGÇïßÓõô¤?îÕ«¯+§¸8æŒU?²HÇŽ)¹¹ñ‘©”›‹3ðò%ÄÅñ×_زE¸õÐH¬ÚŒÔ @)‡HͱëÈ+Æýˆ†-d2 uam{ ØY@õ§q ~7°ØH|XD¾EÄTÿO‰tÔ`ÉX1ŽCL;hD {Ãû(èõ“ÅK°q… 9ž¡¡puÅçÏÐЀŸùñÛÄÇ3]\îçãÇ•\]y½Ÿëê8Ó§gÝ¿_-'G¾~½Ç˜1ü¹º¢¢*ckjXË—ë9"àò’Éä8;?zò$ßÈH9*j‚ŠÊ÷°4fVK©x[{1Åš}a$‚Xç¥Wùžû¶iXˆAprzðøqþ„ ºwï¶ÅÞîÜù‹> P!-…?–`Å|h ­¥ÞH)B^!òíÎÿÙú©У ì-a5¶ƒÐ•/Jë`0p›¼‘W nSàõ':ó_(«¤›7ãΔ–ÂÞ—.¡Ï®]¿žÊ`Jða‘­¨`ŸU£ª*¤?t(k¤˜˜ÊQ£^Q©¬yótΞí/X¡@‚À‚Ï/\ÈÐÐ~ùrbÏžßé¾l\H_í»(A»eÞÊмÐIé_Ò”9xøpʪU/54¤““§vêÔ'¶°ˆ|ýºêèѾ˖é¶Ú ,Œjg÷^V–œ–f¬«+ÅÁºMLâwäíb2éΙ`àÁ"âÇú~ýR™L":ÚТY´{VØ“´›eé¥2‹ë5¥»öž¿Ï£ îB¡0ú÷¿™“S#°î0julF½¿ÓȲw©_Ï ÜRYm°ÀŽ@EEýС÷22ªu‚‚F‹‹ H.ý´bE ‰„Ó§¿iÿjk9Ó¦e=xP-'G¾ySßѱý9ºñjûùÑ–-«®©!tuÅ®^Uá]Á@` ÎC` ÄÅ1>vìàã¹ØnºÙÑ b†×o1Á‹\ag-š¬ÀŸ„l}‡bÏßTq‘_„³WpÂPW ƒž8¼ VüÑé8t»wƒB­-lm±q#µ²2ÎܹUÁÁõ$V¬Û»WAJŠÄãÕÎÉa8:~x÷Ž®«+ùèQ/þ*ý½}K±³‹®¨`º¹u½xq€Àe˜·oß¶-^VV<4Ôyð`}=í¡QPº@¡Û¡ÁÛˆ¯~lqÞúïß¶9(Øí™I11¹USüyÓá·ßôÚhùàAÉØ±±ZZRYY¶22­8OY,bàÀôädÚîÝ]6nÔâW¦!€˜Þ~;>áBºö_&øE°¸§¿~}þ¾}Åææ²¯^µ:¯åæÒzõzÆféé#zõj+}<,¬ÐÞþ¾¸89:z¢™Yu+IIòšææc±¥Å¼@±âÕNêìŽ(ãв³©C†Ü-.¦-X`xö¬àe§}|²×¬I#ùû›´ÈÙ*X,ÂÃ#÷ܹ2IIÒ… º3gò¡™‘Árq©zû–)!?ÿ”ß²E÷'\EöîÅÁƒ`0 /µkáé iþ‹Ò¾M…×Üz {b‘+æLƒ*?²[mã'!["Äw&UX,>Á)„D€Ãcìò„ÓHAüŒAAX½YY`oƒy­/ÎEx8ÃÕµª €­®N>^iÜ8>n»”š“ÓÇü|Fß¾2õêÒ…¿ðÍädêÈ‘ÑååŒÉ“µ®]3ã«$CS\½úqÖ¬02™të–Ä º‚u"¥Ú˜­ÒJt÷êË^íæÊbuÄtÊáÇEF~ž=»·¯ïˆ¶ÛؼŒŒ¬øçŸ>¿ÿÞ£ÕÿüSüÇù={J¥¤KI‘~¬Ÿ¿€Je¥0Ïë>~ë¬hÁ‚Äóçó.ìvútÿ¶»]¹òå‘#)}ú¨ÄÇO––î¨8Í̧Ž%¶=/Lº ïàÔAøqq¥#FÕÖ²vï¶Ø¸ÑDà~vîü°eK†˜éÊÓiÓøÓÐ$lß^¸}{‰„-[:oÛÆÇÇëë‰õë©GŽÔ¤üü”µ´øx`fd`ófܸ::ص nn‚˜ ŠŠáw'|‘“R’?Z”­Fü{ÉÖ÷'U\Ãÿ&Ž_DnHKaÜ(,r…½ ½½~µkFFØ¿cøQVb³±s'u×®6ÇK^¾¬Ü¥ ³Mx8uâÄÌêjöÈ‘ wîè+)ñ7S}øP;|øË¢¢zGG»wII h´/tt|X_Ï>rÄjùr£ãWŽ'¹“™ß€åßj3;ñh¿âørìÙóöÏ?c»t‘KNžÒvÌYhh™½}Œššä§O¶òò­8‹‹™©ÕÕìààžÜº_ëgÀ/‚ÕpúW¯VÌœ™­¦&ž‘a¬¦ÖÊœ™YghøŒD‡¶Ý»·õK£ÓÙff·ÓÒ*==Möìé€òÏ€ óÖíÅ7Å.¹óBOGç‰ç.wÐZÅýû¹'>æp_ß‘nn½îgÓ¦Œ¿ÿþ )I¾uËÌÙ™o—Û‘#%«Wó-CÊŽ{ô ªËË9:‘ýü”Gâ/Ø6, k×âí[4@0·‡ƒ°(œ¾„;¿´æNÇÂY¢4h5‚Î@L2Â㇘”/Êd2lÍÁdASšªPW†º24”ÑI­áµº2Ä;`QAAi%ʪPV…ÒJW4¼.«BQ)2óQCkhI"¡Fšc¸†„F¤—|ý]ècž ÜgBM ÃåçãÏ?qéêêØ´ Ë—CŒŸË˜—Çž5«*"‚!&†M›ä7oVàëãwîTÍœ™M§s&OV¾|™?)Q99´áÃ_æäÐ4ñûñF¤¥UZYÝ«ªblØ`âåÕQSå·pPWƒÁâì·ÚU&ûÍFVé®gh/úÖ´´J3³Ûõõìà`''§vôîGŽŒ/ß½ÛpãÆÖs ]]³/_®˜8QùΆ !~ Öeb&ïƒç³HWþË¿VÓÓ·µ}ÿìuùrÍ#GZ¿Ý]]ß\¾\ÀK¦L||Ù!wÙl"<|œ ¥¸’““ûõk_,”ÁâèÌ>["õM¤Z]é/ÿRRW눴—¶qòdÚ’%‘’’äœììøóñ5…§gº·w¦¤$ùî]s''¾m·oWÍš•M§s~ûMåÒ%ÝVŸߺÚyylWת/Ü –ýûyÏ“ÀáàÒ%xz¢¨œqèz´n×oŸqéŽ]@^! ´Õ„´°léháC›?Ò’PQ„¶:«CE¡åkEtÕ„’ü—«M«GQ KQIA%µÙëJ ŠÊ_³­#öÑÑ–ªF|.ï œòGv.À­ô,\x\m-ö탷7ètÈÈ`åJüù'ù´6]øû+;8´²hc&9z´dÕ*—òòhÇGgg×Y[«>zd)'' ¿.,¬2ännnÍÔ©=ìŽß YaOº…j¼ß{ZÛ-÷Oï·Ö±ýµ"S7L&gÈ»ññeK—ö9v¬XttåСQJJâŸ>Ù)+·2EEÕØØdHK“SSûèé5Ü ü¬‹ÄœöÛñ‰¹$ßÿ2ÁÀ/‚ÕôôÓÒè&&iââ MLZICKO¯éÛ÷¹¤$)3ÓV[»X‡¿þz½{÷›=“—çõùÌ£ðþGÖ]Kn»sÆ5ÛÂ0n=ŸïŒÕ«_:”¢¤$9¾o_þKã+V¤;öIVV,8ØbľE¶ž=£Nš”Y]ͶµU¸sG_Q±å“ «ÝÔÿbi)qõªŠž’º:9‚¿ÿ• IIxx`Ç,õÌfãAŸEh£Úx,rÅÌIïÈ’2õ d¢¨¬™ ©¤%MÞ²9í÷#/‹¬ôO⥕<WYš*_ŒdÔ ñ¿·š*èÝ yÖÐHœ¾„»Àd@O]¸ÏÂ|h¨õÖ@»×¯Gq1H$L™‚½{ù¨*ÈES/ö¨QR~~Ê:µÎZ½·…q sQ\\?bDô»w5C†¨<~l©   +•Ê6,ðíÛr­'OÆv\(Å×h̯“ó¶ö®“hçNR–•øà=Z]¾äh¾”Ü7mzý÷ßoôô§((´ótpt|õøqéÖ­½·mk% „Í&ÌÌÒiÛ¶ioÝú¥hã/‚õ3àÁjvúkÖäùø”XYÉGD´ºB:5þæÍ"^êº4®Q–-3>zÔJ„î¨eôÚ𤢶ýoVÝöwÖ½Ná¡y‡CLrûv¶®®BLÌĶsÛA`É’äS§rääÄ>´´±á›«¥¤Ð?0ûõ“yøï0ÞÆb%%Ò©SJÓ§ó}"رçÎ͆š֭Ú5|”“û?áìeœ@i9(ÈcÆD,™“ï¾Ò ´úËSaé+TÓ×¥¨gÀvÂ^€´äÿL\Š­X¼´5ÐU’ßU.÷ ª(¸ˆCg‘öÄÄàd‹UîÂÀ…„`íZ$%€¥%DœV˜< l6±dIî™3eâ⤓'»-XÀw Ni)cĈè´4ª‰‰bXØ¿$6›˜4éIPP޾¾btôD þóA„@£4Ã]ÃYQÝìyùÈ {ýóˆjþgÏœ‡ k§ŽuBBµ¹y„œœxv¶­ºz+Ç‘#%+Wæuë&™žn,+û冸E°~ü"XÍNŸJe¦2ýütÝÜZY«&&RLM_ÈÊŠeeÙjj¶ÓèeðÀÉÑQÀªò_cååÄ#!™¼´‹÷/¬ÕqùƲ³ ŽŽ.63Sþ|¼œœ€+]‡˜3çí¥KJJâ!!ƒÍÍùŽ?úô‰áèø!#ƒ®§'õèQÏÞ½ù›ÍËÊ8óçWѸ¹Éœ<©$+Ë÷“6!k×"< °s'¦Nå·f¨g ð1N_jiÐrý ²ßIšƒ?Pë@©…„Ô•…•ôì Ä'áô%øß]´àú–̓ßVžfx÷ëÖáþ}èÖ ;w ˜ú Œ’€ÚZÎôéYÁÁÕrrä7z89ñmJ­ªbÚÙÅ$$T÷ï¯6XMMðUÂÒ¥‘'N¤©«K¿|9¡W/¡ê÷ñ‹Fi†R9­†îb“x²œ‰“IowØwAºÎ67¿šZ¹nÝ€½{-Ûm?aÂëÀÀbOÏž{ö~½·¤„e`RUžwOüøfs#¿ë,1ŸÇƼÃtþ¿L0ð‹`}}ú~~åsæ|êÔI"#øÕÌšñã_ÿùgÏ¿ÿnåŽo/¯·7ò”'Â#2>Sûm eòâ•ÄHHÜi/’yA”•ч½÷áCõرÝîÝ-&& €Í&\]ß*+K„†8ï¹¢‚5n\æË—5jjâAA=‡ áϽÄUqܰZ_Oôé# Ò¯Ÿ |1$«W#5ìì°?LOµl@F&.àì”W€’"¦ÇòyèÇ¿äéÕ\ ÄÑ HN¸AýVXäŠINà±ÈÌ·P^Ž;pü8X,¨¨`ì^ )þç*•Xº´úÒ%€)S¤ÏœQRVæ¢ yÿ¨®f98ļ~]Õ»·ÜóçCµ´ŸÊvíJؼ9NFF<4tì!üKÆ ‡Fi/uìî¹6îýñ¶}VPãÛÊ\³&ÚÇ'ÙÈH9!á·v£©©Ôþý_HK“³³[_ÏÏŸÿéÂ…òQ£?n%Æ/Á:I,æ±1ïð ú/ ü"X_Ÿ>A`äÈ÷ÏŸS׬étà@+åÊcc«,-#Å?}²k×HÎá#FEDð¤t>Õê¾®çóVËòrƷ󬻟_`öÕç¾23)C†Ü--¥/^ltò¤àQÙL&1eJ\``±††dxø>}ø.­×ê ž¯«Àœ1£êý{–Œ iÏ…U« b2qá6mBi)ÈdÌšootnÇKÐ>êh¸ˆSþx•$† Æ$GØZÃØàg±}¡QÞQð¯‰K·¾˜¬ÜgÁ}&º ýu08q[·¢º˜7;wBS Hü„¦‹KÕ‡|ßuW[H .€º:¶£ã«ˆˆŠž=åž?ÒnøiÈœ93”D"ݼé0i’®Àý ®4€9mŸÁ[kãèV}XòÚ‹LpˆIKO8ãÏo1 ^nïÈÈÏÇ‘ɤ—/' ¤ÑnŸÓ¦Å߸Q´fMZ‰H‰‹«³´L'%'÷ùúkýE°~ü"X­œ~J ÍÔ4@|¼Qÿþ­¬`F~õäIé¶m½·nm%ê°²²(ܪ©aÞ¸a?eŠ ¹d­¡Õz>×ú.ˆÓþò;÷u7ŸmÅŸ$ºhùÙÁ!˜Ng80dÍ^³l¾ƒÁ™<9.8¸¤S'©ðð!††|=>…F#<=©‡×øí7é3g”TT!/••ðö†êë!'‡å˱iä¬âØ éà{§/¡kg$¿yXšÂÊÖ°™ïîòs!+‘±ˆzÈØ†«‘VxÝ`²šèÈGMåo pó&6l@v6ØÛÃÇÆ…Ç5µ›‹¨ôíË·IMÈD4{ìØØgÏÊ»u“yþ|ˆ®.¯E¨¾Æ‹E£F=¨¯g:4tåJK ‰ƒºl&ƒE–8j¹©@¡ab”fÑ~Þ¢B+㾓ìˆÜ ÚZÖ€733)Û¶™mÝÚþº÷Ý»cãç¤ÌLÛ.]Zþn9 ò.6¶ö¯¿:ïÚÕŠûÁúðß%Xuu„œyÙ²ª£G[q9­X‘wôh‰µµü‹­D»¿|Yie¥¬,ñé“’Rû³Þ±c©Ë—G©«K§¤´SmJ4Öó©ÎÉ–U×,-,:l¹µX¾á'''%þzËH#m¾M>"ĵk™3g†‰‰‘nÜp˜0¿"ƒMA£±_‡…•£¹oŸ‘v,᳨ܸA_´¨ºªŠÓ½»Ø•+ÊC‡ Œ’›‹M›ĺtÁ–-X°€?1¤oZƒg/q#¯ÔJ¹’„ùXsÉ–T¾kô˃‰¸DDÆ"ò^Æ5xQ¹PR„Õ Lp„ƒ ôD´‰Åï¿#* úôÁþýpTå·¼œ3ož°‘ífѶ‹êj–»{â“'¥ŠŠâÏŸíÑCpv•’R9kVXRRùï¿÷ÿçŸÁ÷#0²Âž¤Ýºöþþ]‹u¿÷´çº_¾›ɧE7¾í ¢Î ¾8{ö©©ú«WÎÒò›áÂÇ©pë@רßì3·qãâz'çR|Z„X·îÕ“'y995/^Œïß_@q,4{Þ¼ÄÔTjffÝÕ«¦&B×®_¯<}º¬°°JSSñÊ•ÚÚ|»Nêë OOêÛ·ÌðpƸqÒ/*©ª øDåú•6oFM ttÀdbåJ̘!U ÔÔ"&‘±ˆŠEÔk 2Á‹ “aÚVƒ`mÑ# Ø1æÎŽ‹Áb³ñ6!ˆŒÅ‹P¨ Ý …ÅèѽἬÁØ@ô‡NHÀ©SˆŠÂ»w06†“þú ‚^@®[pÝ:Šžž¸¶6Ù×W¹[7¾×EõõÄúõù!!ŸUU--åöíë*ûÏȨqtŒ¥PX&&ŠçÏh»vEÛ(+£ÛØR©Ì¡CµüýGHI}ï•^ÓXUš¸ì¡;«¤æ%zåïÑ›e™µMÛ·]Ôù[hãö&˜šÞb³9sæüñG;•Ö¸ððH~ô¨dÆŒ.­&nÞ\xölé¨QJ¾¾º_ï=|¸vóf*…Ò¹¾žÃ#±þE°:"#X555ò"‰"ùŽ ‘HÚÚÅ……leW×–3›M§edÐýýõ\][!C†DÅÄT?ÞoÉžÜ^\q9'':¶>`Ijòå±¶— æÄkÛ¹´hЬ!"“Š1cFèõëY;ËFEMÐÓü1Îf+V¤œ8‘#&F:z´¯‡‡ nÇèèšyór22èššâ~~z£G ’kHŸ7¯º®Ž02÷ðuw—ØnQW‡ƒqñ">~€Ã>t IDAT®]±d ÜÝ Žn\÷YÈ „E!&þKmI 6ƒ­ìl`i*z’'*p8x›ŠgQxö/b@ý_9B ý 1Ò ¶Ö°¶è²BêëqãŽCÌÿª§'<< #Ä/,>ž¹jåógvVÛÓS~ÇÒ?|¨wqÉJH¨“’"]¸ 7c† ¥|^¿®;6¶´”aa¡|ÿ¾…††àŠ 4ËÞ>øåËâ~ýT_¼¯¬,„œ@hÔeàâRÿ%‰Z 5yH±8n¯~廦í;¢¨ó­[ÙS¦<ÕÖ–ÍÌœÁ‹¤jqq½ž^X}='%e¸‘Q˧jU[O/¹ªŠi`eÕroE§wïÒòr ÍW Ö/‚Õà›`•——Ï™3'<<ÜÂÂâäÉ“½{7DyóR÷“€D"]¸P7o^U—.bïÞiÈË·$û¾¾åsç~êÕK*-ÍøkGÒÍ›ES§Æëéɾ?’7SEE½®î*•3± #–H{ÌçéÞ݇-·–È5äDÉK‰Çmi õ#ƒ± θqž<É××WŒŠš d8š·wæÆé ô½¼‘%(-eÍžýè…DŠšû÷w•à{±Ÿ“ÃÞ»·æøñ:‡+YZ ÎJ¨T\½Š#G’’’˜0«V‰ØoØu4DÆ",aQHH›Ý°]NÃÃj:i@SêªPW…–FG™¸¾…òJ””¡´%e(.Ea1RÞ!â*«¿´1쉑V9#† .¶Î ŠŠàç‡#GPPJJ˜>«WÃH]Œ¢"ÎÆ??AÀÞ^jíZ9GGAtnß®Z°àSU[WW2  ‡¥¥ ‰®!!e“'ÇQ©,gçN×® ”•ÜàÄfS¦<½{÷“žžBTÔ„ÎáMu^w±¹nüEíÉ6ë¾ÓÇ[Mw„4×|•˜X~ì˜õÒ¥íÈSsÁ­6eJç7Z‰…ß²¥pç΢ѣ=j¥€Ï’%Õ'OÖÙÛK…„¨ñE°öðؘw¬'íÿױтoV´`Áiii//¯ÐÐÐßÿýÚµkƒ ¿–`q8ÄàÁe±±ÌM›äwîlùÜ`³‰>}ÒÞ¿§_¾¬7sfK#‡C…¿_{õê@žÂ¥¹õsÆŒéì(šsøçÚ”±¯SóŽ ÞÄ$7¬ûë(Ål!óCƒ±¨TæˆA eææÏž9ó^D¨U\¼˜·pa‹EÌ›§sút¢©‡—¬[—ÏdƒÉ]»¦×XÌ‹/ÑW¬ ää°I$L™"½¿¢Î¦ˆŒÄáøs§¡º°™-‚›d:XG”ëF y$$ƒ `Øï>6k#% U¨(AE ÚZè¬ e¨(A»:w‚ŠT”ÑY“'9Mz=*ªPY…¢~Fe5ŠŠQXŒÊê†ù…­Ô%종‚ÏèÜ Ö°·ãHt¼è%¯ˆÇ¡Ch(žcj Ìš9!Šö0™8~¼vË*…BHH`ɹ;ù¾étΆ ‡—˜È3G©'w£›±&f«Fígî[‘è2|«ø#×|uü¸õ’%<™¯¼¼>nÜøÎÎN=$¤•\ËmÛ ·o/rpP|ò¤óÕ¨QOŸÖ¯^-wð "¿2 ? ÁzñâűcÇ †‘‘‘§§çĉ›6ÈÍÍ]³fÍÓ§O888øøøè4qÌwÜ^ÁÀ7+’‘‘)++“ûߪ-<<ÜÕÕ5$$ÄÈÈè_J°¸¹U]ºD›2EúÆ–OV6›02Jýð¡þêU=—–F¬úzNa……ôG,Gn_8ÀŸÆîÙóvìØn÷ï·bÄâ«${»H½qåáê%Wú-~ÓùËoõÖòÁ“Í„+ÿ!4²²(VVŸ?×͘ÑóÒ¥‘Bf½zUåì[VƬ`h(~à€¢““€Úè~~åË–åÖÔp ¤¯]ë1`@ÃÍÆ×LBذ!}ß¾L ûöõY»VX¹¾ãÇÓ–-‹” ß»7ÚÉéG†~r-XOzNzÚc|ãÆßÒ.ÎÞøV$º ­^p~ÍWõõ=½Ð¢¢ú'O,Z>Pª«ÙzzÉ••ì/ llZš¯nÞ¤OZ©ªJ~ÿ^CMü/%X$iäÈ‘;wî455MMM]¸páòåËÝÝݹ{kjjLLLæÍ›·téRÇ÷õõ}ûö­¬¬l‡î|,[[Ûõë×;:~!žžž999ÿ^‚UPÀ64,­©!žD€›7³’’*ttäçÍãI ¤¨¨~Ë–Œþý÷ìi%c‚Ba:T`Ë–V¾£ýûk³³ÙÆÆâîîZ\ØùŸÃØ·o©‰¡¢gÏžyyyoƒ‚‚fϞݴýìÙ³ïÝ»×Ñ{ß¿IGGÇ'Ož´Øøûï¿ÿëÌW-°n\Ïžâ©©¬3gZF…HH6nÔ°}{!ç«G¤¢¢ø¬Y]¬]›–—GãåXk×öWPÎ-ÁÐÛ„´’²ã?ǺRrÆ|¸Ñ¸ñuv寛©}èv1r¤¶¯ï2™´aë „5Ñwî,>ÄÆFµ°>|øËÈH¹‘¹¹lB‚‘‹‹*•Êž93{öìOuu‚#2³gËddh¬\)àôé:ƒÒC‡jsô†–6lÀǸ~öö Ppú4úö…ƒnÜ€ðýÿ‘€Å‹¡­Õ«‘ }}xy!?~~ ŠÅgϦ¦esæT•–r¸äÛÏOYCC@I?¿rsóôädš‘‘ô«W†Ü +P\\?|xôãÇ¥ZZRC¿öIñ‹¤¤ŠÉ“ŸÔ׳—-3æQð©#p™{£¬è#·2Ù†0ˆé)çê«›6îå4NÕ«vAص+ÀŸšðfº|yrE³kWéQ£Z©âuøpIEkäH…aÃZ: ØÞÞ5T²Bùφ‡öíûEÈ>55u@ódÿþýÓÒÒ:z¯Àø9ÊÀþ’"yy)Ø´‰Z^Þò:w®šžžTZýöíVŒX..Ú“'kQ(¬ùóyá™jjÒË–ع³¥+22R°ñ·îÃFšÎ]hÒ·$¾qãÁ'î½)ù±øÅôéúGZ/Žxð€'`PV–xútðÔ©++™1·nµs‚ߺڊŠbW¯êùúêÊÊ’ýýË JOIá‰: ò¡CŠÉÉŽŽRœÕ«)ýú•>~\ßþ'Ûƒ¤$¦NÅÓ§HHÀ¢E–FH¦Mƒ¼½†~*tĽ-$ ܸ˜™áôiÐé°·ÇõëÈÈÀ† P…ÜC^{öì*[Ûò¤$¦ŽŽ˜¯¯rX˜ZÿþZèTö¬YÙsæ|ª«ã¸¹©½~mÔ¯_ëÞðv¯vVVÍË„„j}}Ùˆˆ¡&&‚èÀ5ï2zôƒª*†‹‹þáÃCÛÿ@Ç óéÃFYÑäNfñ¿„Xç„–%5mÜ{ìø±Gψä¸-.8×|Õ­¯æ«€€ÂÛ·?+*ŠŸ<ÙJä\M ‡k¾Úºµ•RäžžÔšbÊé¯ã[þÕ¨¨¨øë¯¿|||·TVVªª6‹„VSS«øßd×q{Á¦L™R\\ÜbcEE…‹‹ =ü„øúôÊÂU«ª¿n|òd glœÊf·ÒUQ]Uõtñb/‡.+£)(œNÅÆ–ð?p¾Á¨«;7Ì|G7-Õé§0÷÷OeY`viíw8z»Ø¸ñpJFæ\TÔgá{c±8I@˜ØýS§r„é*%¥ÎØ8ˆ“‘I8uªTÈÒzô( Bgçò¬,–6Ei)áåEtïN@()¿ýF9B$&­Þ±ÿe¤§§O®®„…EÃåRQ!Ö®%>~åQjj8[·R¤¥‹€B9¹¢­[)4G˜j{õJâÞ\ºT.LW¯_Wjj>‚ Š()©¦+.JJh½{§lmƒètQÞØüâμû´÷i+nÒë.;˯qºë4åÈî®êÜ]‡ º-Ÿú¸ƒÆÀáýûßN<™ÆKûÒÒzî×qæLëóÕßqVVï¾ÞÍ ‘ ¥¥‹ZÌ'¼?܉o[l¶ÚþIüÍËŸÍV[aÆ×øüùó°aÚn”`0M·0 IIÉŽÞ+0xƒ[¿~½ŸŸßþýû]]ÜÕOŸ>]¼xñÌ™3wíÚÅ7­û9ðu`S‘µë™L¢wï”OŸ·néOžÜЦ‹Ÿ_þœ9o•”ÄSSG|]üükpÓ˜Çë8Z¸óà ÅɉWÆÙ’ézÌr#›Ôpj–=T#þ&!öƒ ™… _œ;÷NMM:"b¼‘‘$s¼½3==ÓÁeH¹¨©á,Y’séR„ %æ‚Á Nœ¨Û¼™J¥22¤•+å6m’ÿZáV`4hS(xñ¢a£‚,-aekkØØ@êÿÕ*—Wde!$‘‘GcP‡ƒòòàá!âD‚ÀÍ›ô?þ äæŠLÍϯÜÃ#—FãË\»¦gl,xjjhhÙäÉq ËÞ^ýömsa½JT*säÈ øø233õgÏÆ)(üHùnÚ A"6[÷Qµá‡/Îa®xµS›ÚðÅwP9çF\¿ž5}zH·nò>¸HJ¶?]̘‘Phk«2øëL©ÚZŽž^ri)+,¬÷È‘ÍÄ ßÒqä7ÈÝ“ØÃccÞáEÚÈû𢠠`ìØ±ÿüó]Óí:uJJJêÔé‹êÇçÏŸMMM‹ŠŠ:t¯ÀàõQ±wïÞ‡>>.\عsç¤I“ÚÿÀO JJ$€ÀôéÍv:T»z5E__,5U£…Úä±c¥Ë—皘È&$µºÚ8w.×Ý=IMM25ux§Ní8c5±bc' ¤‘*¹·ŠêÜœ³6kIR>ƒ·WÊ4ñÊ1¨k¢·*ÕW¢cjò1¼jưaIIƒk††:ËÊŠ %&&¦ÒÙùuy9cøpµ{÷))}é“߫ݴ ɤIÊçÎ骨å÷!øûÓÖ¯§sÈdÌš%³oŸb§Nè±¥PÛà,{ý Æ—]=zÀÞVV6 ºº¢?tÝÛ55ˆ‰Ad$¢¢ z“eQ ŽQèé‰üÈ_Àõür+ÞHJ’<ÜR²ÁÝ]½kWÉ·oë‚‚Z7b-XÐÍÑQ£¼œ±xqûëu55inýnB/€eWÊ2ÒK–Y;#å4™Ó`Ñ©•T¸Ò1‡DðáaPæÓ‡:†6 ¤$ùàS÷îò11%..¡,Qˆu ¬òâÅ™çÏË­¬¢òó¿<ù½ÚÒÒäC‡tnÞ졬,vçN•©iZLŒPn6‰+å ¹v­œ˜üýi“'W¬ZEINþJMDPT„½=¼¼‰Š DDÀË öö‘AVNŸÆœ9ÐÓƒ¶6¦MÃéÓHM…¨Ü—"¼·)„„ÀÓÖÖPU…ƒ¶oGH˜LôéƒE‹à닼ÞÐÓÑyâ¹Ë=’6–VicXQQ¿p¡áéÓÃDÒga!ÝÉ)6)‰Ò½»Ì£G–††-µdøÂ§O —¬W¯jÅÅI»vi¯_¯%|ÉšŒ –§'5#ƒžÎ`f&±h‘ìÌ™2" oõõxýˆŒDd$(MBÍÍA¥BM êêPSƒš45¿¼æ¾PÝ㵦ee()Ay9ÊËQVÖð¿´ôËëòò-{4666 VVèàJX,ÓÏœ©{ô¨žÍ‰„©S¥/–³µÊ!ÈEÓʘgÏvŸ2Eʘ¨­eO™÷èQ©¼¼øÍ›f¤5‚¹ÿ¿¯ßÁôéÓ?®Ö\¦²²réÒ¥W¯^혱u8H$ÒË—„•$%‘œŒ^Íg‰ *éóçËž;×ì¦Ó9={¦0ƒ‚z:;·>Ÿ8‘³ti²ººdjêpMÍv–žë׿ڷ/qÂÝ»wE_˽åÀþW[A"¸ö½š1÷-‰ Üþé]žÚÑ)6¼àÕ«;»ûµµ¬Í›îØa.’>++™ãÇ¿ŽŒ¬PU• de%TF}=±~}þ‘#%ñã•/\讪*‡fz:Ë×—völWŒMA4q¢ôìÙ2ööß/÷ÍFR""ðâ"#¡¤„÷ïÛù™ÜŒl©©ACêêÍx˜Š êê¨R#Oâ¾àÒ)î–z¢ï,, /aÃ`cƒÁƒ!\¹0þPPÀ¾t‰vâD]N€¤$i©E‹dí줄'Ù\·àºuùL&1hܵkzzzB}ïÅÅõcÇfMvû IDATÆÆÇWkiI[ (úZ0fÌCƒsðàÕ«EV;U4]1ÖH*²ƒ*ÕpŽj´’5Ñ[¥XÍBi{?æðiqé‰ Èœ1#”ÇäÁ%K’OžÌ±°P~ùÒJL¬•[‡Nçôè‘RTÄ|ô¨×èÑÍTÊÂÂvvå­®ÿmmñìV¬À‘#¿Ößµÿ?›È:{6üý1inßn¶73“ml\ÊdÑÑêÍRc*Y½:oà@Ù¸¸ÖXÑ£_=}Z:sf—Ë—MÛFY]OïjM 36vR}}†µµµ°'ömpkË7¾­‘T<8dEªa‰,Ï ¬y¹U…¨¾¶¼ðÎ8ñ ‹ÅññºjUßö?Àêë9®®onÞ,’•»~ÝLIé½Wûöíª >ÑéDÏžRîîêË–iˆ‹‹ÀàT_OÖŸ>]ZÏýöé#>{¶Œ»»¬šÚ÷ÖÔ¨¨hfOjjLjÜ‹ _ïÞ5ïß·o8”“ƒºz?kJÚ¸¹¯55!&Tðß`³ñìYýéÓu·oÓ¹Zù½{‹ÏŸ/3¾¬À‚ì-S»vmþçÏÌììúõëµvíÒæ^ŠŒŒìÒe £ã«÷ïk{ô}ôȲW/ѤJ¾~]jk{¿¦†¹q£ÉîÝ"éS`4® .˜®L×0án'sØË^ïîV€D‚šAuÃ>}~›Þö£±/^D,_^Ì£ù*<¼ÜÖ6ZB‚oÓ·oËÜ@.(^»6ßÒR.&¦Yol6LMK““Y^^ -’¯_ÇôéPUÅû÷PWç`yÇylÌ;N’–þ— ~,‚ ŠŠ``*áá>¼Yƒõë)ûöÕ:9I=xÐÌÚA£qôõ¹k‹ž£G·¾(Ìʪëßÿym-;4t°­m;®kúôöÂS;hjÁâ"KÕð”Ù:nýÊwkrü—½ù)*Û?ŸáîþœL&]¿n?y²hâhX,ÂÃ#ùܹ\ ÒÅ‹¦3g [|íÓ'ÆþýŸ+0fŒÒÚµlm[Ÿ1À»w¬³gëüüh¥¥²²¤•+e§N•8ð'÷›ÝÌW^ÞÌ(Å}ѧÞ¼iiÜúÚÜ%ݾ„ÜwE~>ûìYÚ… u¹¹lÒÒ¤)S¤-’µ±7‹ë-=t¨ÀèÑŠ«WwrtVW=.®ÊÅ%!3³nÐ åà` ÑŒ6=½ÒÉéaNNÍܹ½ÏŸ!¼ÑNH4®£ºÙß5œÕ¸Ýñã-»¬=w1 Éï°b¼u+kÊ”]]…÷ï§KH´Å¹i4ÎС‘oßRvî4Ø´©uï*Æ10HÍËc÷3¦Ù#æÂ…ºùó«¿ÎÁ¢ÓajŠwïpò$/æ[˃8ÁccÞq’´ä¿L0ð‹`qOÿÐ!øûƒÅBBÈM~ 1uje|<Óß_ÙÉ©™­þäÉÒ³gË$%I_'w4âÈ‘lÿ‚Š FZÚˆ¶-Æ%%4W×g11%ÏŸ;›šv`¸èݳëH4â‰þħúßÎ$¥^>¿¹ãÆÀ¼¼Þ>|˜]|ýºýĉº"é“ °eKFTTennݸq¼½x‘«iAAÕkÖä)(ß¾¥9;+9ÒMWWd`ƒ¸w¯ÞϯîÍVq1›Å‚™™ÄÊ•r3fÈYøÚ@|<óСڀ“‰!C$++9sçÊ,X «®.2#b]gïÞÏÞÞÅ22dYY²««ê_i)(k;>Ïß?¿ºšÙµ«Ì•+¦òò¢)P—‘Q5rä}©þýÕüýGˆ‹ÿøJkÜc±¼ö¡Á[™ä†_œ^å{8o2Ñ"ób8bÀ€[22bË—÷=»ˆ´]»>œ<™cn®tã†ù·”2Ž-ñöþµ=MM™~ýT©TÆß¿i»¥è7}Öײîõ*ÿRÕ2€0Kÿñ.B.<=Mll´˜Lδi!9"é“DÂή®Úd2ÉÇ'ÛÚúeVVËtQ~1nœRjjUyyòýûÕÆÆ©;wÑé¢Ñû“”$M*¤úü¹ÚªUrÊÊäøxæœ9Uzz%»vÕ””ü›U>ÐhÄÙ³u&&eææeþþ4Ó§ËìÛ§ž®±aƒ¼ÙÕõ땆†©Û·1œI“”ãâ ½¼ºÉ®¨T–«ë› #"*Æëtë–¹¨ØÕ‡ÕvvÁEEuêêÒgÏû±ìªQõª®¼ŒE–¸Òoq#»’fÑf¤œidW:›šuôxnÝÊNI©(.¦¹¸´“¡YRR¿o_fA}Å ½o±+&“Ø¿¿8?Ÿ9mZËü†3gê Øt:1aB3vUVoo`ñâïí=ÿ…6ð‹`€¤dCá¦M¨kþ¨õðÕÔ$ÇÄ0ÃÂM·ËÊ’W¬Ð°gÏçou+&FâiÙ¹óCy9ã[͸X·®¿ŒŒøóçùQQÅm·ú£Æôttn±‘D3RN7™ç³N½.¦ˆ@êS$صkÐÆ&\Áè  Ñp,óçw[¿ž¤¯/ûúu•©é‹€€B!;”’"oØ •‘Ñ×ÍMFãlÙRØ»wªŸ_¹HFË…¾¾ØþýŠEEš¾¾Êýú‰°7o¦êè”L›Vùòe;7ØÇOXì¹ ÙÛ¶Q»u+Y¸°:1‘©©IÞ°A>3S3 @ÙÊJdöHtGÇÓ§gåå1”ˆ08w®»––°ÖÈÔTê!Q—/ÈȈýþ»ÌöíÂK‰rññ#eäÈûµ66ZÁÁŽrr¢!m€E§.r»í6õÝÝ›eïÒ6ûQ¯É… ÝLN÷S¡5“ÍíQ†¦`29ÇŽ¥ðô4i×þ×_ kÂ-;»oz*.]ªÈÉaI׬hX}=±o_-€­[å[8g·oGu5œñ•ø9¯ CZäåÿ~¬̘ssàСfÛåäH«WËع³¥¥jåJM%%±Ç)qqß´Œ«éà QYÉܽûcÛÐÒ’=p`pM gîÜgJ>,í=¶¥@­B}õÌäS˾ÏÕôyçâ8?uw÷n‹ L Δ)OƒƒsEÕ­»ûˆ„„aÓ§kS(¬3fÏ~[W×Rí_hkKøùéÆÄZXÈåå1æÌùdg÷>5U”úøÒÒ¤Ù³e’’4""Ô¦N•æpˆ7èVVåææe§O×Ñé?Ë·Öš½!$"#Ó¦Uvï^²}{MYÇÌLâÔ)¥OŸ4½¼ttDi¨®f{zôïŸöø1EUUÜÇG'6ÖpèP¡DC¸ðóË·°ˆLM¥öé£k½woëÅw@NNƒCpAA­µµÖƒNòò?Ò-ÝBõ*KÕðE·/µ\E›Å4mßËiœþ¨1:¤Í›ã"">»¹õš?¿í«´4êÅ‹yââ¤Ý»¿Ù’ÃÁþýŸüùggróçó¹s´ü|ö€ãÇ7ã.\;11xy ~¿ÐøE°@"aÿ~سÅÍMHË–É©ª’ÃÃ/^4ã=JJb‹kðòú¦ À¾}Fd2éèÑO?¶#J9ožAŸ>*?R.ìÀâÒ2ãOûOö¿a8á7uÃ>22jFRJÊ=+ÒGd‘}˜T¼ÿᇎ¿Ø³Çbùrcƒ3ujHhhû•ˆx„¢¢x@À@__1ÿüAƒ"SR¾éóårÑц¾¾ºâaaTSÓôU«ò(aÙ[ X[K^¿®’“£¹u«¼š9>ž¹xqµ®n‰§'5?_ÄÇú :ðó£õï_jcS~ãL&M*©§¾h‘¬ŒŒ(C¸ ~~å©ÞÞŸY,ÂÍM-#ÃxÕ*ÍVSôù…ÂrqI˜3çm]ÛÍ­ëë×ÖßJL™™›ÀOŸ¨Ã‡w~ôhÌeW™O~|t¿QæŠ&.wµïBâÆ%zåÄôf~½ÇŽ{ôL‡éñãü}ûÉdÒâÅFRRípñßOc±ˆ%Kº÷éóÍ/èÖ­Ê´4ºžž”‹K3ÿ “‰}ûjlÞÜÒ|µ~= ÌŸÿì]wXÙ×>B¯¡ƒHP@AékÃÞöŠ`Y;`ÅÕ]±Ëª¨¨(*6”¢€€‚Ò{é% Ô´ùþ„¿O߇Ç'9sfæÎ5sçsÏ}èêþ÷ ùÁÀï$÷n—ïà¯_ƒ‹ kËãÉÝhoÏÒm9aUYM-½½–šªÓKVz=„Å‹=ß{“òóŒž66’|}-û|@ÔúM›ÒÖÜrÕhß7œ݈Šû§˜kJõ¾/×€¢°m[´¯o¶©©ì®]cj]!II K–$æå5 ò\¸ »q£rßûp€º:ЇGÅ¥K5T*ª Àëé9bÕ*©ÁX{ÕÒ‚Þ¿ßzñb3]^X™<™ÏƆßÒ’oüx^ìMé ; (¤§S""Ú#"Hß¿SÈ0bÏ–-B7 R¢ÄÄgç’ØØ&˜2EäâEåqãFŠ©kµ ˜öêձ˖ÃÒ‘™IX° A@RR 8xè 9?_·ss^ ¾É“ùXÊkr ƒ]g³wRÃÂÚÃÂÚ?| áñSáööü­­¨³³ð¼yƒ´“™a+*òž>=` EÁÛûÛ¾}Y$ÍÈHüáÃñ£F1~T?ßÛŸ>U98¼­«kŸ?_íΫ¡]ÑqÅPë=ßè':keÜB Ð]×µÉöÛ«iyÀ•5ƒtÐhè´iÁ¡¡¥VVŠaa3›š{ép*54ŒJK#ö¢Û¯^5Ìš•//Ï[X¨'(ˆaÚÆŒ©ÉË£y2DGÃÑ£À\Q¥¤”Gô`-E^0ü!²ìW&ð+O&¤¬Û õLUAÆŒ5k€L†C‡º9‹‹#NNBpútËqöî•›1C<0°¾—²tŠŠ»w«Àž=™½ÿÞŠ‹‹—,ÑX½Z«¥…²xqXKË`Õ¤ûÚ³æ®Ù(ÞFXš~ŽV–Ôµ®¾ùuøÜ#GyzN “i«W8{6ågŽV\Ü-KT{ïžá;ÂÂ;;~ss>]ÝAŸ1Šjrv.NMm[[Qooe[TW¿tibQQ‹¸8öÆ ý>Ç“þÂß?Íš2™æè¨åë;ÄŠ ̘1}{°•´ó³›LsG",w"XññÕ/(Ú‹ÓúH'èü=¿xqÊÆîîåZZ))cº…¯ttjrs)wïJ¬\É X ŒYYpù2lÝÊ8NìW°˜h9RT‚ª('øÁ$üê‹G Å` í=h3Em'ÀÌ bb€ùÉMvŸ7OàéÓn3wííèøñ™™™mîîŠnn=vׯoÞœª¦&”•eÅÏßǘ•ž^7aÂóÖVŠ¿¿Í²eÜ#7¥%~S'·46^1Þ_$Ñq^^Läþ)f£~ªx߀ãþýüµk#ÈdÚêÕZ.ÌÓÖFsuÍòöþóçËûúêKH ØK|^^ûÎ%oÞ4€·÷ÈÉ“`'¨®¦ÅÅu­¤$2­“ "ãÇÿ¯’­aBªè(/'ïß_vï^-Š‚†ÿéÓ#-°‰~ú´àÞ½™d2:a‚ÄÇãÕÔ¸ã¥K..±4êâ¢çå5iȵÚ ð}Hfࣼ¼bWùõdÖt……™·MK#»¾Žš:sî¿þƒÚžúz’¡a`QÑÕÕÀÓ³ïbA‡çœ<™gj*ñé“EOý™Ýfh˜E"Ñ""´YFƒ{÷ZW­ª×ÐàÉΖeN¦¼|œœ@[ÒÒ +K£ÁDø’ PÑ¿)ÂÅè#9G²äW&ð›`m܃޸3íà“ÄhShjBe%<{sç2ìUU4uõêÖV49YzܸnÛOŸš-,²±X$1qLOÙîT*j`•žNüûoúŒaï¸|9ÓÉ)Z\œ/)išÚ€- ê¡ÁÏÖ.«çÇ7óháí¸Õ•¥„’|(Ár´­[‹¯^­15މÑîiÒ'8¸zÆŒxŽ7/ÏZJŠÍÓ4::šY.hÙ²ð‡ 8¼“Ü&ܸ”%cpËÐ¥kQôãOœL¹ÖW=sæÛÚÚ6++Å  ?ÄÄúÁQXz›-rs›—,IHNnäåE޽oŸÆ¾Ó·¶Ò¼½«Oœ¨hj¢ cöì‘;p@aH’ÐñxÚǤˆRd$)-A¶øù{{>A¤¤iiŒœ´4†þYZ#+Ë#.Îik9éí.´¶¢x<­¦†V]M«­¥áñÕÕ´ª*ZN…™T©¨ðXZòY[ó[Zò©© Žux8ÑÅ¥83³ ¼V|øP»bEbEE»Œ ß;Ó§Ëöî߯Þ…Ý»?yy¥ñð W¯NÞ°¡rÅÜAWi¯2Qå ÝÑî½ ç´j3º¾jNŸ5çæ½AmÒ¥KÛ·ÇHHð%&v{ïí©Ã“ïÞ-í} ùÅ‹Õ..% ¼™™ºÝ~À¶.[V¯¢Â“›+ÃÇǸ|¶Ó,Ä&О Uðà ,›û›` =~u‚…¢èßWaÏ1= RÃ\ª§éíŠ š†Fu{;š’"£§×íý¸±‘ª«›YZJºxqäöí=S§Æ…„ÔìÚ¥þÏ?:}¶°¾ž4~|à·oĽ{õÿú‹{ä†F!?ZèPöåsÐèåÑÊŒe–>+ œlû޽q„iÓÞ”–6I¿y3]Vv`Àw¡½¶o_ÇtáìÙr·nHJdÎï÷ï¤?ÿ, $€è¼y+VHápCVð‚HDãâHaa¤èhR|>‡QPÀàpÁá0ŠŠ<,_GŒÀ0³ÆÖV´¢‚V^N%hJ ÐZ§…ñµ—3jkciC©b…‚¾yÓ@¸¿tu½½G`µo RÑãÇóNœÈ£RQ++©û÷ X#›D¢9:~xô¨€ŸŸçþ}› Rå?£ 4øÙš¥ôÏ—MtÉÇ0C¥!ß)î}QŽÖÌÙ3¼¯cøögF37’“Œ>b±HF†%Ë*„.“ôô2‰Dê³gsçv{oGQÐׯIK£\¿.¾q##|ÕS¢ðÞãpî L2†è À`~¬¡Ço‚…’È0Îr ÀëìØÀØúìÌŸ²²—bLµí·mk¸r¥eåJÁ»wYƒX¯_788ä cÒÒtÔÔøRSÇÿÈä§[jjö½V?>¾zòäd2-(hê¬Y*ÿá2ÿˆåe~S'ë/M8X*¦J7òc1Ÿ[ª°^ø£¨ˆ8uê›ÜÜuu±b}ïÓO<^¹n] @9RðÁCsóÎHûð¸kW ‚@rr+??2{¶Ä¦MÒ¶¶bC›ÓЀæçSÊʨµµñ$<¾#¤TSC«©¡56r4€ˆŠ"ÆÆ¼éé<ž£]A2 ýó×Ñ£±ƒ$XÅ9JJHþþu—/ד°XDGG`Þ<‰ƒ˜Ã ?ÒÒ¶åË?~¬ãáAÖ]üÍ›ßoÖ­K¹u«dÑ"…€Žªzz&8/##œ¼PQq€sZ{Aaø»§«—Ô Èx™¹·a;Þ 5åDÜmD†reUUëôéÁIIx¡·ogŒ7ð)ùÅÅ­Ë–%ÆÆ°XäÐ!Í£G51˜û~ú”pã>4´‘>I§©É¿~½ôêÕR?_¨nð@ ÐÊËiôÈ€VTPY¾––ÒH$ÔÆ†ÿýûv@p8„)Ð…ùñ«‚ÏpH¯þmm´ÀÀz__|D‘>vêè¬_/½~½´¸øÃÂð+W&UUµËÉñß½k`o/Ó÷>ýÐîàð66¶JNN08xº¡aò¸+†ZÍÕUT{Îü^H®'7uáÌSöüƒ¿ÔqíÚˆÛ·suuq_¾Ìì{ ªœ;÷+Ç›ŸoÓSÌûþýº•+¿IJb33uääºù (˜˜àÈ—.‰oÛÆö{kœµ^…†åpã@ÿ…F§¡Á}ûõo‘é¿2Á€ß«ëò§¯€·`ëj¸|šáГHîÆ 7o¶¬['äë˪,‡ÇSÆŒÉÀã)þþjË–±Æ÷¢;š––6vìX…ٳ߾zUli©î0Ø«ú™uÊ-þ’WªœÉ]ým]ÆÅ”mí{í ÷ÑÔDž??44´‡ãùrª¹¹|ïþl{»wP(è‰yÇçÑh¨­­ô½{†òòìC•?ƒ²2ò½{µ×®áé)ð<<ˆµµè¦MÒóæI`±Ã’wô…ÆFô˗̱cÇHKc0ÃeÕÿ™ÙæçWëë‹Çã) €™5K|¢Œ?ÿ3ãä·]^Þ2mÚ›´´:UUÑššC&ËçUe¨dR¤êôWZ‹{÷<·dìŸÓ~Js¸O‚ýœ  ð›` üouƒ€Ü—®ßƒÔ,†ÑÔ,€ÖV8v¬›ó"X,ܽÛòíkÅ7iiì_)€‹KIOJ’ŠŠþ©ìtG••ÙHª øúZ*(EFVœ:•Ôÿ‹ûï°ØwDÉtÒ¸ª/f¥ºŒñ¥7"‹¸Ù !"ÂûòåÔ… Õ „ö?þx\Ò»?ÛÞîX,èÌp IDATâî®õx8ÞÀ *4´æ¿¶·GŒÁëê*ŸŸ¯ª¹hއÂÂ/.TVNÛ¿¿¬°°}ÀÏ8ØCŒ•deÿ÷ØUc#õúu¼…EŽ®nÆ™3•x<ÅÈHÈËkdyù¸€u;»gWÅÅ­––±¹ ¸¹i…„˜þßço;;»ÞÌìyZZ®..:zöpcW €Ãµð ‡©ÏêÓóÄËl|©O·ÿŒüüÆM›>€yO¡q–¿rå{f&QCChóæÿ#vì(©®¦X[‹::²)Gvòdìß/ÂÌ®"#áõkí&…M¡À.7€£»:ØÕo üŽ`1.Çðöksxÿ˜áSXcÆ• ))ÝJi®^]ïç׺e‹Ð•+l¦?þÈ m\µJÊÏO•í©9”žcFDD¹Ýk…ÐЙ66í2 h®®ò›:¹_çcz¸L´c°àE©;“þÒ‘ÆJkÑY¸t°³ú*ݺõãÙX,æÆ)kÖ°Éýyp!9¦ õñc‚OuZZ+`0`c#¶j•ä¢E8Åçß@$$´\¿^ãï_×ÔD žÅ‹q[·Ê â4ý`§úÑñõkÍŒÁ55m¦¦²¯_O“’à¬ùŸ]õ ŸY›—óX{Uœ’%'{9Ûix¯]‰övê¤IA‰‰øÅ‹Õ=²ãd—úz²¦æ<žôü¹ñœ9ìãèoß6NŸž'$„IMÕÑÐ`%Я_·;8ÔÉËc á+… àëW8u `8{Ý€]n ¡ Àß¹tµ¿,;4„CgΆüñ+ øM°˜/ŸÐZ怯ƒ§¾0o:ÃÍÙ||ÀÁ^¾dóó)£G×ðð yy2Êʬ¹EE¤±c3ššh/_Žrp`ÿjxãFñ¦MœêŽÒqèЗS§’””„“’HKsoL,މz¼ln ¿Ô…‰Œd,é–ªŸÝù)mÀ•õ;ýŠ‚‡G‚‡G‚À¹swï7g¡PP7·OÏEgÍ’;p`ÔÀ eýú#ÿþýºæfÆ#Û6Y}ýáÒóÿ@§³—.UÓuØ&Mqt”Z¹RRHhéì÷ï­û÷gEDÔVV¶Ï+ÿï¿ú8Ü $Þ}øP>wnHc#iæLå€;!¡á’Oɬz•"ŠÿL:Éáó ‹A’ÙêŽøÕ-;wÆ^¸®¡!–˜8ŸC˜½{³Î+°´”Šˆ`¹™6n\faaû?ÿ(íÚÅ&èdaQCúûo±Ý» ¡üýaÅ 1rsA¨“ä×Õƒ–9Ôàå`®«Û_‚e…~èÛ¯Ÿˆ@¬e‚¿2Áj'?rèz‚‘\—nÁöC0z¤„_ç­TS£FAc#DGƒ¹9ÃyùòúZwî>žÍ]ý÷ßU{ö”ji $%a;.wéŽ^¼¨·}»*'m¦PhÖÖ¯¢£+5ïܱæüb1gO~òú+E~½q Õ ÃŠ¸åiW韹 @Ó_œ=›âꇢk’¦CCk®_/~ò¤A`×.uggUUÕÁ]ˆP_Oõ÷¯»yŸ”ÔB·,Z„›3GbÑ"ÜÀ.aûÕI|ñ¢Þǧ†DB`ÄÞ5k¤×­“RWø4;f45Q®]+>|8»­fc#=gŽœ³³Ú ý\Ÿ?ÿ¾tiX{;uÕ*Íÿµ>ep€Iõ P@émHPdˆ˜”}\œñ/³?ÆœÈÈ kë—¼¼˜˜˜9ÆÆ-2(-m5ꙌÆÅ™³_p}à@™§g¥‰‰ð§OlDÃÂÚííëdd0ß¾É wl%‘@OòòàÖ-X³†á¼Ë¼®ÃT+xË$_ “ ‘ªZT–³èo‚5HFw—QP àiù ãæU0g*Èp…IØ]FމY+@<(bmÍwÿ~ke%Íž;eçÎÅ¡(xzV²mrö¬Î”)R§Nå76vdkEGG÷Òf,ãïocn.÷î]é‹ß9ºÎ‚œ¾!èWÆ›”}ì2&)˜~Uì œyÁ/ B>Mòg°w¯þ;Öff²û÷ÇÓ‹ê°8ôÞÛÂÞ^æömOÏ1RR|::‘îî¹­­¬Éy žmÛdǤ§ë¸ºÊKIa++É+W~£gh•–b2ÊÏ`@z{0ÐÞŽúùÕdZYå5P©`g' ^T4öÄ ÅÁfW/_VéêFººf)+ .Z¤póæ8—`Wl{ÛÛ;}Á‚I“äœõnß¶Vìª 4¸‹]@¸ú,fv¥^—½ ÓÙ_kæì™>7µImmÔuë"ÍÌäNšÐ'»êêðÇsFqrRé‰]¥§·^½Z3eŠèÍ›*ló Nœhš8‘÷ða‘.v·nŠÂܹ°jÃ3·üÀÒ Î3­s§ÑÀå,ÀÝ7œ]ço ~ÝЋ=¡6&~…a| ³WƒŒ|ÑÎ’PMM ¦x*É%ÎC®©FMs˜ë{Ÿ;íá¯_/YÖÜL™6mäãÇv""ƒ¥wPVÖæêšåï_†¢ ¦&tþ¼NOé‹–Ú£G„ ªRRZ€Y¸çâ"kjÚ·ÊÚ/޲2òåËÕ7nàéëQäåy·l‘Ù¸QZQ‘¢ééDgçôˆˆZ05•ðñkl’=mZÞ»w..².Œüqkl,ÉܼVRST$+*ÚqR*F†ü|xü.d8/Ý^À¦•pí/†Ñ76H@š[Q!ÎI±@£8rí¢‘)¿2Á€ßKÊ­m€ÿÀ¬) »ùlˆý Ç÷Áá £»;xxÀÔ©ðö-ØœL?/$„|û&+#Æë,]Zøè¡—l÷èèºÉ“cÅű……¶êƒS(´qãždeÕûø˜;9éö½Ã@€®ICÿ\%2â‚éÑ®ª«rMe;âŽñRIÜ©cÿðåKͬYo«ªZÇŽ•|ófº’Ò 2/_êœÒ¿|©[[ioo].Õ‘ŒŒ$^¼XTO¡ ÂÂ99¬¹¹¨……ÈŒbJJëˆä¢µ•–ÐÓF¬­%'%µ€‰‰°‹‹ìâÅ\šcmn¦ž=[pút>‰D“”ä=zTkûvÕÁ[$A"ÑÖ®ð÷ÏçãÃܺeµ|9÷ŠÇsŽ®¦T\õ²ñ®áEˆÜäw\º¥¸9ÂÔÔ´ij>lh …„̰·Wê{X¶,ñáÃò-[T®\a¯‘ñæMÃÌ™ù}š«­-‘–V7yò‹¬¬úÁ<—ÄçÏæwîHKóÑuvìÈ {+53P°´}òD½ @oÿ~ù©SÅ IwïÖnÞü}äÈ4 ôÍ›¿?~L¨­åFK†(4!¡åÌ™J{û~ôÊ•’\`W( ~~¥£F½÷ðÈ¥PÐU«”rr¬wìPΤì£QEL××8%ËDE3Ü ,)¨©‰ÆÆÎ±°/*"š›EEUÀ ea0ˆ££RN޵‹‹ÞÞßFŽðó+åλœ²2ßéÓ#Ô¾~ãå5rÑ"œ¸8OaaûõëøÅ‹ eeStu3èd«¾~Å~—s°¨T4!¡åÂ…êÅ‹ ¥¤RŒ³è¤ŠD¢éèlÚ$  þ𡺙—æR““'OŽ]½:¹²²NÄýü ¤¥%¸Hï튊–)S^„„”*(EEÍš:•S®À}àpíX[†.DþŽyRÐE·49L>\arrêoÜÈæáAΜá´lttô‘#94ºe‹ÊÈ‘ìWõ^½ŠOOoUWçß¶M±Z…ljff|;w KK3ÍCF¨«ÃÒ¥ ç˜/ð: D„ÁÕ‰a,©‚ AàÓÜËo !~õ)BE_}„Y»'¹OAº3+1!L¦?äÅ‚’B‡±ª ÔÔ ­ RR€Y$™¾œpútþ7oØÜÿD"UK+£²’üø±úÂ…ì—ñÏšõåÕ«ªÞKV± ) olüŒ“½DEE¤ï~Ì |è ñð]˜èV-ÜñöÄOiÿ›7ÂéßkƒÝ’ŸA{;ÕÑñC@@!??ÏíÛVK—j ö¶oOÿô‰––R/êË¥Ã.P(hJJkXXcX1:º©­­#ÙŸ‡10´³37±´²òÒˆÂÂö°0bXXcXX#À`êêüvv¢vvb¶¶¢’’Ü& Èîî¹—.Q©¨¼<ÿ™3cV­RìZ@™™„éÓƒ‹‹›ttpÁÁÓ••}”è/º$¯¾Cyù¯k¬Î’1èÚj_øâünˆGM9÷_ÿ3ð˜5ëí«WÅ[·ê\¾ÌQÍAHHh01ù( À“ŸoͶ7‘HÕǪ̂ª"?}ª1o›ü÷ÿmY¿¾AN“-#!ÑA°PŒ!1®_‡Î6‹àC Ý {Æ% VL‡{Çû-Ó`Œ~éÛ¯ŸøŠ˜üÊ~,úåOs†wŸ`ûb¸¸±uÑ&xò ¶8ÂO†‘®‰µ|9ÜgJæÆãicÆÔàñ4‰eËØ¼»\»V³eK±šV–.??›a5-h`ÅLJäçÛŒÁ©ÀÕŠïýýóW¬uïž ‡»üg„¼y¶v‹±RTÉÛôÓñ ®-$™-È7¬ŸÓT*ºcGì¥Kžž¦ûö z¶/ŠÂÝ»¥{÷fUW·c±È¶mªÇŽi‹‹ø3Ùúø‘ØÞÞqûc±ˆ¾¾ ˜¨……ˆ€ÀÿRl»‹T½Odž¥“*ssÑ¡ÊBûñÿøqm1±Aÿßÿô©jÖ¬wµµmffr/^Lå¦l'`‘¼€gcVÆŽ´íú:®êËÊ”+t{<Í»õ@ãƒÝ¶ˆˆrkëW¢¢¼¹¹Käå9•\™1#>8¸zß>3gØ¿$ïÝ[zî\•¥¥hDé㮇ȃK—2"/^Àœ9 ¤ å w0m9àÄ¡à3à:×E|Jóõ ÀYO@E¡ßËø!Ɉá¯L0à7Á¢_~f!è/Hò½Î Fn!èZ‚@V$h¨vKJ`Ô( R!3´˜núˇ´4&+K†9ºK•Šf¥¥µþõ—ÒÞ½ìk,\˜X±}»êÅ‹z¶¿´´Y[ûQk+%.nž‰ÉÀ‚eÁA,ø¤dýTDZ뫓­ºÏJö8s&ùÀx--q … & ú¯¾žìæ–{ùr…‚JIñ9¢éì¬:°µ¢û‹–Zll=¬ßL&w ‚‚˜ñã…,,DììD§LžÚZ……íÑÑM11MÁÁ%%ŒLD^ ;;±©SÅTT†8µŸ9~ie%uñ¢žžÞ Ç/Q.\H{úôÛÇ• ªß½k- 0ìÞyX“*ö/´—w}Uj(Úöõ4/µ[‚)w”öh4t„g øÓ§'ìßÏéPK07ÁXËʲÑõøö­}̘ 2‹cl̆´Ñ§A¦Mãî6 bn±±àí ÎγY—gþm ãÄ5ŸG7‚Çf€þ þ&Xƒß«ãò·ž†«`7B/3Öí‚[`Å|¸çÃ0nؾ¾°~=ܼÉ0¢(ØÛ×…‡·³­ ïßmmsEEyòòtYª¦Ó‘‘A7.JT”'.ÎB[›Ó`þþýñgÎ$O™¢ÙwÅ®ŸÄ/t<»)Q!Xì¿Åd™)›åÇà OžîßWP@=ZâÁ[6åÀ))ÎÎé?Ö€±±¸ÏXSSöb9\F}=52’øþ=ñÃbzzkר *Ê3uª??"-•–ÆÊÊòÊÊbéŸéœŸ¢¡¡A\¼2MM´šru5§ÔÔPðxJU™þozz ©²±µ¶µ±US\Ù*QWGöðè˜TT8}z4æ ººuíÚÈ7oŠ1äÌÓÝ»Ç-‰g‹‚ÐàgkùDÙÒãn¸Ð0,׊wŽ?!ÚÞÀ¼ ×jEܾ»vm„’’pNÎÎ5î§M‹{÷®æÈÍcÇ´Ù:,ZTøä aÍ©[·TÜúömûôéuBBHZšŒº:ƒ ‡„ÀÔ© 'ß¾`祾†…AAòcA¨Óè÷V»ÁYÈ aA€ßkxà7Áê¸üh͇z"{ôN}»â2Ð22ÞA§BAŒ yy ¢Â8Z^eÜ8|{;*ikËf”Ÿ1#?8¸ÁÉIÆÇ‡}ùÏcÇr½¼ ttÄ##Í8\UD$’55VUµ>þÇœ9ªœ]÷O¡ð}H擇øœ¬†ïßÄUÔ(mmU¥eLÝk„;4ŸÄy=lÔeþD˜‚‚âÝÜJRRjùùy<<ŒöîÕçÎÓèåË*'§ô’’V Y±bÄßëÈÈ #…šÊçÏÍ11Maa‰‰-šš¹¹m=9 `yxq8ûãg,//iiic;S[[iµ¢‚\^N&(•@ t~¥”²2rCC9øššüuâDaz°jüx!.pA£¡÷î•ýùg&OâåE¶nU=qB[T”3Âïß—¯Zõ¾¼¼EB‚ïÐ!Õ={¬¸pÒÿfÉ«*‘>uàâ§´9ÅŸRh*áC)dq5®©^@k+E[; ¤¤éþ}Η[^½úýÏ?3'Mâüx²„›—çOŸšÍͳ099º#G²Þé--èØ±5……T–Â8`i QQpæ ìëÌ]¡Raœ-dæÂ¥S°mMg³Ûaô(®„;à8³ÃØ_‚¥‹¦qèÌ92±¿2Á€ß+,µíLÂ9wö^€1jòx;ÇCzèÙ@ÐmÆŽ+V€¿?8;ƒ·w·ž<Ùtø0QS›š*- À:ägeµéëgÒhœ'€ƒ§¡‹ŽÂ@s3øø NŸSRâ‰'_½Ê†^ìØ!;jff›¯/þÇ­¼¼È½{†¢¢Ø»wKýýË8¼³gM1äÂ…´ïß›8Üe`¡fc?ýÀ•©—yÐŽ¼œúÊâËŸIÚ´‡XXtSDرC/:z¶ººØ—/5FFOïÝËãNKyÜݵòómÌÌp8oBBÃÎÊÊá«W'GEÕýÿx déíÿ]äç7:”­¬noÿùñã  µ²’ Ÿøò¥IOõ}‰‰xƒ@oïtAA¬—פÀ@{IÉn k†[o¾yå´þ¶­Ù…QòÏK1ÔrVrMe+R¯bÐnÅØ¥+8Æ bïÞÏT*ê䤫©ÉÑBךÒš5É( ô÷a`×áUUä³g«àìY%ÌOÚâbª»;||ÄEDº=°23áåK‚L‚ìÞ¾PV Æú0wZ‡Ea (ü¹4:§£FÁÇ íÑp`ü¯ßø‡aÚMMM666ãÇÿþýû÷ïßÇokkÛÒÒ[8íOtf  À£ð1£Ã¢¯kf™{½n.ëAIRáé†ÑÍ ÀË º-(QQäêUq8p ±´”5ŠÅLJœ:5Ž-ïiÔ¨QÂÿü£Û¶¥q24”^¶L£­zð`<'þƒ£NkkAw IDAT³¬¦çvY¾|«?ò,s¨Úóß0a‚lRÒüeËF56’V­úàèø¡©‰ÌS!ð÷ß:öFríí4?¿RKËXmíîî¹ß¿·r§¿Ámm´Ç+ìí?ki}8u*¿¬¬MKKØÍM« À&(ÈÄȨÿÏ´ÿ… Ò'M ÊÍmÐÑÁÅÅÍݱƒSå¼!¥­õŦUOW-Ê~þŸ™+0ò¾¼C×V1Rý†Ä(Ý~ÛšÓgqAP´ ÁÁ%!!¥8ÿ¡C†}{ (lØRQÑ>eŠäž=ê=¹m›9“ÿÕ+6iËS¦ä|üØtà€lPQZÚvÿ~ÙÕ«ßé$ƒAll¤6mR™;Wž.|ðÜABBƒŸ_éýûeôI[̬Yr›6©ØÚJsùÇ\SÓ¶vmÄë×Űj•æÕ«“9×j*0kŠÖ Ê^4=ÜÌ×A8xi¤-_Î(7t«sÏ5É+:¨TÔÀ 0=½îüy³;9*’ìãSäìœ.!Á›’2EY™};SRZŒ²xx =]WS“•B=xк|y½¤$&3SFN®[˜#?F, `DçÃáÇ<à6Œ^ß+àæX?§ÃèñÜýÁ@¾ž,OÿVª¢ß8tæEˆÚð$Ü:,ammýîÝ;fË»wïlllzòÿoBß«¥U^‹‚z;Œ±éÔ¿(¡:‹P2¥ÃB"¡f(( ÿ>dn €ÊÊ¢Íͬ¯¨ JHT”¶þxê„„f æ+?B~~³=55µës]IY9 àå±c¹^Ñþýq×ÌÌžÓhî1ðh%Ô]°0Ã-¹k雞~Ç7£(J¥ÑÖÞüJ¡]㺃¹·Ù"+‹``ðà/ï 7·¯Ô¡h9•J ­Yµ*IPð ÀK€—òò!..é©©ÜoÌÏ ÏÞn H×®}74Œ¢w;ÀK#£(/¯ÂÚZÒ´',¬TQñ.À5ié;/^õîè€âêÕL€kêêÚÚ(}{£hFF#ýN|ø°ŒÙÎÒáöö¹_wï.ùñµµT9¹J€r_ß(ºf €nÙ°ÔÔ¢¢š(( 1_Æã7Q0Bõ—¡j‡¥ /DÁHCÑ~>@-ð¿aK0¸†azý²²²•••Ì–ŠŠ yyùžü@NN‹ÅÊËË/_¾<++‹“³tý÷ßû€‚*·mèüÁ·µ£sP0B¯2ü€ª˜ mí £™ €^¸Àæø—/7”ËËWÔ·®\YðuéÒBfc}}=ó×ÈÈZžWXì«ØØ:N®¨±‘$'çpíÙ³oœøð9Y»'ñ¬èLÍŽ¼%Si7"¿ÁšÀ›‘CÙ6f°ô6[´µQ\\bäÀ5;»WåålÆDî ®ŽtíÚw}ýHæçýµk߉DòP5©_ष‡~d´8ÜÛM›R’“†ªId2ÕÍí+sàš•ÕËÒÒ¦>w&½ýlí2:»ò5ûD×€kgNZJßôlÝò¡j^c#I^þ.ÀµÀÀ¾½Q´­J¿7nLaÙÄÜáÏŸ¾âpIµµlîÍõëëÊ--ñ?¾ÿŽòñ¡¼¼h!SsvEAåȰTÖ¢bSP0BCãÆågQp@{v|í/Á’G+üï7Á¦9XAR²ÛÌš””T]]]Oþ³gÏ~üø1‘Hüò勉‰‰¥¥err?ÖÓ-·„‰ÚPUçŸwXøù:Öe½ MéËæÂ¸1ð½n0UÄru…‘#áÅ hüaÍÙæÍBææ|••4ww6‰ç§NÄ{F‚åËA­³9epÕ08Δ…âv›a®Øu.yü’¢@€άåä:~ƒK¦«¿ šau$ZÝ–vTM®ëècP1L“ÜåääRSSåä™Ú•••†††ªªª444ššú,@$á;:¾³0àâ3ð86N…ëÛ;,1)`±ÄEàÛ Àu¾¾N˜_’Áç$8u¾+¤§Ãøñ@¥Bl,˜š vïn<¾ÙƆ/<œU ¥©‰¦¡‘V]M Öœ6­Ç÷ã´4¢‘Q• ±±æœÔ~ýºøúõ¬÷ïË#"fI÷é?xøs÷Æ ÝF~VIz^i_ô‰¶:.'´þ$h4ôäÉ$*µ³qÿ¾¬ìз<3“xåÊ÷Û·K›š( ­-²c‡š££’°ðÿ’ú€JEŸ?¯¼pá½ü62{¶œ‹‹š¥¥Ô?¡ÈdÚþýñçϧ¢(ÌŸ¯æë;EBbXÔ±îÌ Y®j}F”îŽsB;MR­ÕÎq'„IŒ€ëTÅ¡Phvv¯)tìXÉ+Wú–´ PP“Éɇk?ξ¢3´µÑ453JKIOž¨/XÀ:îݺղn]ƒª*OV– K-µövÐׇœœnK¦*ª@à ÚIz£;Œ+ƒÿ[ز®è°¼ˆƒ9'@Z n€˜@} à„û—ä.ö8AôŸQHO‚Á5 Ó–®®nJJ ³%55UGG‡ÃÝ9ùOM*XrHåÔN®^,ü ™’[æú`c MàÍP†ƒ.g.©sšKOvî œœàGqÑ#GD$%1ïߓ޽kgÙ$"‚Ù»W\]Ki4€äÇŽuqQ£ÑP'§´®ÀI/˜9SYVV°©‰¼`Aßc™^.`á™3»hŸXn€Œá{;jä¾~ñzûÆ¡h@ÿÅ1äÈ‘ñaa3„ÂÂÊÆŽ}ΩPÙàAGGôâE½ÒR»³gǨ¨æä4mÛ–¦¢¾n]ÊÇåUU¬¿º¡Â𑾬¯'?^éâ’>eJìÂ… ?Ö‰‹cÿüS=/ÏúéSc+«¡gW¥¥ÍÖÖ¯þù'•‡ãé9áÉûþ²«¡êmŠ.>ùâ…ÓºäU!FúÞ¦.v%DnÞð3»®kŠÒ±wo\ddÅ·oîîýŸ ““UU…öïg_åŒÞá/Ö”–’ŒŒ„æÏgeW­­¨›[œ:%úc¥Ú“'!'tua÷n†ÑÓZÛ`‘ƒ]åãàÅ‚k§ …£÷Ž,í`Wpü5À¥N®¬ È üýê¦ËÁÁÁÏÏÙâçç7{ölw077ïÝgÜ€üjð‰è°h*Âz{ ÒàSŠÕ±-çýЙb5g*Œ%åp‡IyØÝÔÔ !.]b=‡9p@öîmü‘~mß.£¤Ä—šÚH€žåÓVUJHh¸|ù{ï×E‡ù„ ²ß¿7-[Î '$`°¼K–üaZùã¦DE³q5È ~YÌõ¦üW1F++Åäävv#ª«[§M vwO Ñ†þ-M\»gFa¡Í‹&vvÒ£G‹ÜºU²lY¢¼|¨†ÆûÍ›S?®¨«ÊÔ·¡•¾lm¥†…áÝÝsíí?Ëʆ̛÷õâÅ"aažQ£„==ÇÙž;§£¦Æ%™ÐÞ^flü4&¦räH‘ÈÈY®®ÿð IoSÚZwl<ú¤€rïK>;O¸¡½žÌÓ¡è̓R“}¤[ªXöⲦ(Ì„o9¦>‹þUº¥ /ÄH¢µýöjZë°ÈýL¡ÝÄäYAAãªUš~~Ö}ïðìYåüù_Åİ™™½½Ùâñ ôÆFjd¤ö”)",[·nm¸zµeöl  Ö©C??X½¤¤ ;¤;‡ÿZ¨N€¦fø ÆúÆ¥áQ8-Ÿ}–óA°û&ŒU…dï•ì9`óˆ Ñ»Køº±mˆÐ°%ÜÁð%X\‚ ™å¨þq ¡|ôˆ­0j#T7Àk7˜aÜái¿ ÂâáèFðØÜa¹«œa”*dE1„Ý+*`Ìhh€  `™ÏDQ07¯ýô‰tì˜è‘#¬·Ÿ¿ÝŠß”•ùnßn´¶îqr³¤¤UG'²©‰òò¥‰ƒGZíçϧíÞýID„÷ó繺º¬÷ö`ƒD¡)­¸^#Ô£ºTKÍžØCü<È®¢n6ŒŽèè蟟I).n:w.õâÅtÐÑÁ9cêà Üç^C‚ÖVjL !:º.&¦.2²–Lî¸÷yÌÍqtòai)5H2ñÒÛ=¡‹T}øP‹Ç3Šd«« ÑI¤­­´¤$o/GB$'×îÙó™žÏ7sæÈýû -,äûÜ«w jo³…ïºõ[)ö]‚ÌWõueêeEùDÅP Y\EMz´ŽÎ‚%ê6p³…4êàð68¸ÄÐP:&f¶ `ß$»¥…ª«YTÔâã£çä¤Ú‹ç’%qXñ—/Y“´rr(cÇÖÐh’"£«Ûí¤uu0f TWÃ;àèȰ8ž>0Ë^Üé°dÂØ¥À‹…üç $ ÀîQECÁä$Ãéyp`z ÖÀWâjCe‚ðkë€Ñ/›? ›ÐéÞ ûßÏPp@ÇnG»„»cSP0BŦ µZƒ ª9 ÔÿY·c^¸€ ÊÊ(‘ÈzºÈÈv€r‘ŠŠ VÝQ*50ÈøêåUÕ{›Ï+x©¢ÖÔÄ‘î0Š¢«W¸¦¥õ°¾¾½oïÅÙà\fiA¶f‹/hq¹aŽ/ŠFzp àšÍË„„š¡nQ É¡¡5®®™FFQÌ«.ñR‘`;»Ožžù_¿Ö‰r=稬l (ß´)EE%¬«ý/B-úzíÚ÷ââ–¡nc(-mÚ´)Їç:À5Üÿ±wÕqQ5]øÙeénÁQô•Ïzm}Å. ì.lTT0ÁÆîN0A À@¥‘–îíï]ØDñùíË™™{ç÷Þ=sâ9ªgœ‚èôš>× Ý‡oû€·µ{G3 >§è¯}Ò×­{¸©«Ÿ‹¯i„eË>]»úp8Õ= ©©,YÙ@ åC` "âáÃs´yóÄP¿ÎšEÒ»7%ÍÉP·û …cí ÌÈBg¡d¡ÄjPâæC`GZ¯#tV­‰Feý§¾OÁ˜7oŸWLìT«Ña>þ>¬>}r(±±ZMšTpÄûûÃÂ4‚ƒa($aÅ¦ÝØ¶ƒúâQY`êÇxt)bËÌW™h;Eta¸pí7"£×í`cV»ú¼ Ê‚edddcccccÓ±cǯ‡Ws]ÅÅÅ&&&¶¶¶óçÏpäÈ‘sçÎËÉÉý`ëw㯂EìõÂÊ›0ÔAè&ðChÎycº Zj!ú¤%àM(,f@A îÐP6í-‘˜Œ›'ðßáaCCafïÞÁ´buöjlÅ&MJˆ‰avë&wäHu>¦÷ïóÍÍ_Q©°êÔ©FìÒŸ?wíz;;›±ukW>Õ{=`ñ¥ƒO?Õ¤g+JôþR ,zéûŸÏrr vu c0¸RRÔ¹s;lÝÚUYYŒß¤a"#ƒéë›ûôi–§g6¿È´BTTJ9ªªª¤®®ŒŽŽŒªª$ÿ£«+££#ÍÿÞ´©ŒŠJMýqyyì´4F^›ÿIOg–ÿ™žÎHKcdg³Ê½™|hiIef²äå%zöTí×O³_? SS¥ß%b‰Ãá>½ys@FF)€¡C[¸¸XèéýšøŸ…Þ;}|c²¿–ë'-}í@àß÷«¢-££ó{ô¸[PÀÚ»×|ùòN5ÂãKË×oÞä-]ÚúkÞvQ¼zUÕ{":£Èxƒ7›[™«*ôÔSõ\e¥ ]¯¡ÇuTQ$9¹ØÑ1èäÉ(¨«Ë¬ZÕiÙ²NRR¿™[òâENJ =&¦äËf¹ ‰ÃùöKC^^BCCJ[[`÷ÒÐRTä±Ù’™™Ì¬,9*+‹YCæ55IMÍrš”……ªB×®*ÕdÝ6L<}šº|ù›°°\=zhíÙcþãáVbQw÷¶(âŸyFܺö8‰sXcDU}ø‰,üïmyúr]ϪŠŠØææw#"òÆ×»rå5uäHâ‚á::Ò‘‘}••«|/qML"ãã™+WªíÞ]Ù|uù2}Ò$ñ¹MÎΰ·GÛ¶ ƒŒˆárë>lÞƒÿYâi P¹ù*î.šj@ÂÌ—‡ƒ0j Ùèà&þöèÖ ¨Vù†‚emmmoo?`€0°ÏÓÓÓÙÙ™Ÿ*÷#­ß \ÁŠË%zªp'£AM±Û &÷ßcØVh(!î8”åàmzÚBAñ÷ © LôÌ‘š÷sÖ_xä¢"t耔=йs+œ4+‹×¶m•ùº+VïÛÇÕÒ¢…†vÐÖ®ÒPPÀéÐáEZãÔ©Î3f4¯áõîØ´~ý{%%)ÿ‘ßf„ÿYà0èÛŰí‡ÓeY6n¸ˆ©æ8g ¥lÈKý± –¶¶vNNކ††µµõÆ ¡2Õ€ù‘ÖïLJqý¦ýB˜F²÷ÛO`GVÞö黎`(ÙpA(´ˆÀŒ¬;,”¸ž$Ԧ俙„[1rýÖ-%%’šZùÔŽŽE@š‰I·r°;ár‰µu4ðaĈ¸êçéR ࡦö83³¦¡ë<±±ñÜ ®ÔwÀû'ï'ólÏX›»èiŸ±6¿;s’“yw1.¢ñ°k=?g‹‰ý­áå•Ò±ã ~ü»¹ù?¿ô_=£ú@QûÓ§’7or=<2ΜIÚ½;îС„mÛbŽK¼};ÝÇ''2²(+«¾oÂ_‡Ì- IDAT‚äda$»šÚY'§ ãwd/Çùqëƒ{M¨I"Ën]¥»3'Õÿ<·m à'ÄÆ|»wÆ<þý׿únwîäddÃÂĤSìÞ] ¤uê”Åùê¿=lÈ„ _ 9BäZ“Þ£„’°8BíFdz’”²ô§àxBFdF“ϙɫ8B™CdÏ9‰Ã à\p .•R´y3©ÑgóæŸ®`ˆ>|øp:žœœ¼ÿ~--­   ~“¤¤$‹ÅíÌb±¤¤¤~¼õû/áÇÿ¾ ó£:È©²L $BC¤æ“˜²[Ù?šP†ÙÑ$%[ ùA(]‰‚ÉÌHJé¤ßXrètåS .þ)*-åµhñH»xQÌc™œÌTU >œ9“ýu«(úõ{xØÚÖø1"¤¨ˆedtp5ê ïW§ˆ¦¦ì7ïÚj¤³è»XgéƒÐäZ¼  °X\7·míó€…âfcãõéÓŸvñ5ŠŠX›7•=¸IIX¼øU^ÞŸ SÆy>äkWëõZIL½þMKvò… ³g²éõÔéé™,!qœJ=~ÿþçÚŒÊ<ääÆÇW·Ùûò…­¥ |8xPLêwn.WM-H{ò„Q©éæMñ{ï„$"׆蚒·"Ƀ£W˜‘¥{…’ †’§ry¤Û;²ÅC I)$òÛ Ÿ_40ÈÏÿÔ‚U GŽ8p ÿ{T°~³ Ÿ™2Sñ:o2À¤9¦õ‹ûÛ‚¦îí1Òt¶—¹ÃÍ 1¨'ŠK±¿,@Vó¦À:'¤fT8ÅÁƒPPÀ•+xð ‚\V–²e‹"{û":½òî¡Y3)W׿-JŠ‹«®ÜÑ£Æ22Ô³g“Ÿ=^* ’·oPV–ºs'qÏžo¨K(ê6rþâ’„3úÙªòéùŒ>N/_Çåü‰ýtHJRíì ãâÆoÞl&#C»q#ÞÐðú’%¯óó¿‘bù¿)ØlÞñã‘mÛ^ݲ%€ÁàØØ´‰Œëêj¡¢òÛ¤;Tƒ°+J«ºôpàR¿]€N“{×gQ=×tOL,š8ñ—K¶l1«yÔ)“É[´è#€Í›ÛWS:‰̘‘˜™Ééß_iÁ1<[·çæò¬­¥ ¨RT„¥KÀÉ ºº†,Þ€R:úZ GYjTø'Ü})¬š"¼ ‡g”å±ÖF 9ÿïÑT+ÊbTÖ>E ¬(ßÏÄèÑ£ËËnªªªææV(Y““£¦¦öã­ßÆ«`ñÑ«9¾”`ÏkÁŸ;GAI·ƒàU&™šN…EXáPáà-Zì¦ ¢¤¤BÓÔ©²]ºH¦¤pªÀŸË¿W¦LQ7Nµ¸˜7}zb5•Û¶•··oKæÍ +/òM´o¯|þ|_*•boÿîñãäo¨K¨·ÓŸtùƼøs&þå¼ö€=¯…V®YöÓQÏq$ÌbbÆÙÙr¹äÀp=½+ÎÎÁLæW%*ÿD4œbÏu§OS»t¹=gŽï—/tss-_ßáׯ÷kÓ¦^óëtµÓƒ>d(6sí¹©Dª¦,$GŸÅL-üv¿Ÿ:óß^ÙÙŒáÃ[®[gúíeptŒŽ.62R\¶¬ºpÉ£G³<(PU•8uª%?NtÁ¸G–R©Ø½»ò?}ãF¤¤ [7ØÙUß~/()b×F‘ÎGÁãa¾ t5û³°z4Ô ”…Mîà<òÒ”KaúË` ADü›FFF!!¬¡¡¡:tøñÖš_£€7É„â@dÉç2¸mìˆÉ6alÖ¬CÉX'áÀÁ‹ ÌÈnÒÏ)D¡-¹ïUál615%Y¿¾òÙ½½™@šŠJFVÖW¡X„äåqš7>89U²Ãdr ŸŽŽ15»h6lxÏi¾ªä·¯öë5éÝ×NÔ­ 5ëΕ·É¿zju…€€¬¾}=øY-[^:w.ú—{lÿâÇñþ}fŸ>îükûöW¯_ÿô«gT'˜gb)3ùb%6Q‡VMù~Cþg_K_8ÃïcWŽŽ.––~@¡xøùåTÓ-6–¡ |¸v-Wl›\ ÍÖ¶2³hH¡Ñˆ„ ¬ /)%­ºè#g… hBéJdz’Ô²X«›¯†©¤˜.l¼G`Gzìò”Z&p k¼jM4 :ùùŸºwººº0€ÿ}ïÞ½“&Uˆó›4i’‹‹Ë·~7»‚EwƒÀL¹-–²H˵väÌ+$5‡ÈýG(ÃÈ›(„‰%oI¾ˆ<†»è–ÝHqEÇý»wDB‚HI‘+O`àÀ mÉñ*ާg…òAR2àýûêB^¼È¦PTêq>W¸“S“)fãôàœßg‰i7DŸÓŽƒ×ïh®!ª]ýZÒö}ûB7…Óááâ ±àñˆµõÀcöìjº±Ù¼="Ó¦%ˆíàïÏ¢PÒdeÓ“’*·s¹ÄÜœdùòÊC–;ènÿÑpøË ÌÈŠý‚?9\b8`(9úP IÎ%r eñH®$p Z»I~-㟠ŸüüÏÏV°¬­­oܸ‘žžÎb±âãã·oß®¡¡Ào-,,lݺõöíÛssssssõôôŠ‹‹¼õû/áÇÿÖàÿÿòˆŒ#¡8we!‡—ü ìˆöJRX¶QXs–`(éc/;t)Yí*”°ÙĤY/bëâcÞ<++RÉJÊ–H“”L‹‰¯â,\˜|èÐ!¼´´º—õäɀǀo¿}Í"ÈËcò«»Lšä]«u„˜‡î{[¨ê1’2í¦èë{Íõ°_=µ:›Í=zôcyü»­í‹F’føÇ **oíÚwÒÒ'7YÙSk×ú׊n]ã“÷ù3ÎX›ê=ž2½Âãii=wWSåJÚÕn]¥;¶_e÷Ô üüÒ%%OP(nµ5ž=› x¨«?©>¹uÆTàC³f¡¹¹âSA--³´ *Wã9x¤ysRX±%4‚H¶ ÍH È{.0ŠPº¹^$£lü1ÁPÒfa–ýVL6fŒ`§*ÚZZÊ50>¬\Y³ìˆšÚcÀãÚµ´^{ÙéräåOnÇGÔj`!üú¥ÝM•§™ô¥M½*úŸw.ˆ[.´J«ý Q\Ìvr RT<ݳçÀÍÐðÚéÓÑØïtÃYퟋ{ûv¼•Õ=ÀMNîT“&ll¼j^ä®®ñ³V›M/½7{òn]%ç¦*=û-¬``ž~³¿ÕÔ¯U+þ'îɃŸ2Z!#£TKë<àfoÿ †…JÈÉaij><ΫîMëï_B£P©^¾¬\k–¿à·oÓ4-­Œ‚‚ 頻 ¢¬Lrûv…Q\.1J C–nª ¾ŒÀŒ¬,óPÑ™¤ùt‚¡äš¯@ò6^@ÍX–kîìGà@Œ~ÕÄßWÁú“ÐØ‰Fù—_ÈÄÀ‹`r±©7FÀëOXv%Lx/ƒ¶칃ûï % ϲ²Ó˜Š^±c¡ð˜‹Ö#, ²²xt±Â¹®^Å()ŸECSS¹£Gç•–’S§Tºw—üš9  tæÌD:œ9ÓÒ¢B±Qœ8ñùüùÔü|ö›7½jÁ‡~çNâ¦MJKÙ÷ïÿkhXì£U!ð´Û³«ãÔ Ïš,fÒ„ Ç]èqh4o®¡oØaÌø6Öª9H Q?l×5Ç—/ôC‡>ž:•ŸÏ’••`³y&´]¾ÜX_ÿ×ÿ_~ mµ¿¬³gcöî MN.ÖÓSÊÊbŒ¯·reçvíP¹›ŸµÚwgNŠ{|Ÿ%!u±óüHÎår=.ü”hnŠ(Úý;lÄÉ‹b›ê#F<ÉËcÉÊR>,!Q ×E‹ÂCC‹”•%îÝë^û+‹EÌÍ£dd(½z)îÞÝ´RkAA¼¼²¥eŽ´4Æ—™7O^´uî\DFB[ׯWuê ŽžM^W¡XövŒÂt(ÊâÎ^h©€«;nøAQ7 J† =„b&z·ÃÖáCGï3P‘Ã?èßø&÷Ü:ÐÔµ‚¿Lîq„_ìð{,|}u„Ï”#y÷B°ôØ?,´™ô\øÀñzNü®p8¼GR\]ü½SHHPFŒhµl™qÕTù‹š#**ßÕ5üüù˜ÒRccµU«:ݺ†üà¿>y=º3}|‘´òiÓ¥)J­Ê岜’éAÛ䉯*ø«žÍ‹c§Ly®®.nÓ¤I-Îþñc‘‰‰€  Þ;V™¹m[ú¦MiíÛË„„ÊȈIÀws+;· ];ÚÇš’"e8¢¢`l hÛV(/,‚¾22qíÆÊG,‡»VO…ób`° 7i¹x°ƒ»€wú퇊¶CEVxbß n‡ ˆ ¥Ú2¹gÔ&ФQ+hÌ4 a¹0Æ <vfh§†èœ tp *Ç|’2RX6¶\t0ÕÇK”Ð…œXT•Ḗ; ¤œœ@¡`ï^dT¤ËZ½ZA]êãÃòôÏzµaƒŽžžtX}ÿþ*™ (>lL¥Röì‰-©ª›XìÙc®­-ëã“~òdÔ·{×=z­ZßeæÜæ óßïTa¹I>©¸™­á«\1Ü,œýëæX‡ Ñ¨Ã†µxútHHÈ;;C))‰Û·¬¬Ü»t¹}þ| ›]S>Ž¿ø‰ðóË;öiÇŽ7Ž‹ Ó9ýú5uw2fÊ”vªv ìÊ…/ º»oÕ®ÔèÙ ý·—kW :º$ee5 :Œ3úÂáÇ/Ô¿v•“ÃX±â-€}ûÌk¥]X¸0œÃ! ¶ªF»Š‹cîØ‘A¡àèÑbµ+:8:ؾ]Q²b‘³Õ«Áá`îÜ Ú€ ÎÈÈ„UØ  ƒ¢áá yY¬˜,¸=FZ.ºèá_3dË}X3P ]}.Àáw Ràh-èà 'Äë¼Q£ñ*Xí” 8gc@’*¸;^XÚ:êbŒlìx$20´”ñ6^eJ˜ƒ(¼†¬<á‘gMDwS$§Áùp…3öèáÃQ\ŒíÛ+È••)kÖ(X½ºˆ'î×SV–zâDK [¶¤ÇÇWI=jf¦òøäõ¨êcüöèÔIÍÍÍ*1q‚“Sw]]¹  ìiÓ^´hqÙÁ! '‡ñ«g×(ÀbñΟéÔ馕•ûñ4uÊ”vaa6^^C† kÙ̽uŠWÑYG»ÚçÉ -ëÍ ¾sÔ*h#\Þtï7Kâ2¦{¿zøÔOñÝ–,y™I·¶Ö2¥}­^¿žöâEŽ––ôæÍÕ œ7/‰ÁàMŸ®nm-^ Û¿¿$%…Ûµ«ä˜12¢r__xx@Aë×Wèÿ1Ç.€FὑÜ@ØœƒL6v߇‰‚nÂá ,øG0dÓs0¹˜d Ó&R—00RÅ_üZ4^K¦ŒŠmÝ;±À¦Ì›!­®oMÛ†ƒFÅI?Äg€¼ –‡2“U9±»ëá‘©TÞ*»#6¡ÂIA£ÁÍ qqä‹É5o.ÂÞ¶-HìlûöUœ0A­´”7~R5åìl¨¬L»w/ãñ㬬ãÆéѪ €µdÉëo÷®P(’2²”˜ysß;·,®W¦¼ÎAóé Í„]ý¡8ß‚úRKKvÍ“„„‰çÎýcl¬–‘QºeK@Ó¦—¦N}‘÷íñ ¿Åj—#3“îìܦ͕iÓ^„…å6i"·y³YJʤóçûý?\?¾Ú·>¤º´-ê£oŸóqNÀ.Efh7F^îWCë'_º''G;~¼w­´^:»fM€íÛõUT$«êvþ|ÎÓ§…êê4gçfb;äåñœœ 89)Vš€½=¬ZíŠå°®›ÓÑÉP(üÚ|uâ Rs`ÚC» $`?Š2–‰‹¡’€Ã?‚küQÊ‹* p‹·>WÁâ£W|¡ƒ_3†BS?pòCf ´×Æ„î`s±ý¡ ÿ¢¡ÐTÆëH< H6͆EgÜyŽÄ4áa»vÆ”1`²°rK…ÓéëcÚ4°Ùظ±‚\F†²i“€K—š±Ùâ§êêÚ\CƒöäIáµkUþ¬jkK¯_ßÀòåÙìÚ9¿±TV–ºu+áÎÄZ ¬#¤ð¿È±Kì>ì-§S(¥r´ûšD•¶é~ä–––?4Åz„”uêÔö¡¡c|}‡ÛØ´ápx.Ävìx£ÿŸ‹8‡ßeµCCsçÌñmÕꊽý»ÔÔSS 77«„„ f2ßß0ðƒ«íê7öÈ;Uèýì–ê;3h¿4§²éTFõGˉü JK9 ¼°m[W=½Úå8;JL,55U¶µm^UŸÜ\ΪU)öík¦©)Þ¼}{qQuÀéÿý¯Baœ[·ðú5´´°lY…þWïáÅkhiÀaeù†#èiŒ%ã…æ+ç[°¹Ì|u/ïÑD óú†¬} Á‚nh£ ï2q%Nh>¨Øuðiôhì ÖsP€Ý¡H*€>-ño[±°³lû·u8¤h8÷Ñ_@^K†À¦2Ó‰¹1šk#"ËöU8²óz¨(Áݽ+È·n…œ®]C@@ùôérRÍ›K8;‰ª†mÇŽ¦–.MÎË«rw°dIëöíå##‹]]ãk¸|èêÊ9:v°`_C¨‘ÇÈê‘R\–mÐÑ”%:Mþ„Ùª`ŠÎ¯˜Ú¯„¥e“ë×ûEE[¼¸£œíéÓÔáß^wu §Ó9¿zv¿1ÁÓ§©Ã†=61¹yüx$“É:´…—×ÀÀÑvv†2ßó“õû!þ™§û‚Yýl6,½Ê+SÛ) ý?Ýûñ4•'æµ£cjöµ°>±ví»øøÂnÝ4—,1®ÕÀ˜˜âÝ»?Q(8pÀ¨š”ÃU«R339}ú(N™"> )"‚óâKOObçÎ ÞC.W°‘Þ²¥Bæx)öÛÀi=TDÂóððb“±²¬òà)/¤dä †wBæ«uƒ!'¾Ix E)Ø—©Ó+Þ‚+:Õbþ¢îÐØ,s-ŒÕƒe¦çþ Rpä=>å@+uL5—‡me› …š"^Eâe¸@â²*Џûî>Â#kkbÓrX²LuEW‹¬¬¸w¡Ñ°}»âóçÌmÛJ‚ƒÅ+ÿ³fiôí«˜‘Á^·.µª+’’¢8ÐqÀÍM›b ªê&óçwèÕ«IzzéÚµïj5°. £ZÁ#A8CÝz~R.aIHî´àªÊWCÿ|´m«äêj‘š:ÙÅÅ¢ys…èèü¥K_—]~õì~30ÜóçcøæÀû÷“$íì #"l<<õëW9ÿO‡Aw·›r}ÚÄ šÞ ]Êå„3>üÄ€Ow«h<~rUMõ€wï2þH£QÝܬjÅËÀf“™3C;wVš?¿•¥e•F8Ÿâ3g²¥¥)ÇŽµë|d±ÈĉùìÁƒeºt©àd§À¬¦Ù…¹…Xå {–BU Øìº›Æ ÌW7œ ]Ì*S§ìŸÀKhÉÀõxøe@K«…|ñ+ÑØ,NÝ!# 1xŸÆZ˜Ü ,.6?tØ8Ò4\y‡ÐP’±¶–Å]5QÇÖ¹°hŠE2Í€±!âár¢Âíí¡®Ž/àåUAþÏ?R£G°XdÒ¤|CŒ×‡ŸÃ"-M9~<ëի⪮hà@M==9:;zô‡ììZØ¢¨TÊÉ“½¥¥%ŽôõÍøö€º„N—n•$aÑWÇÞ(—p(ÝÞí{û}§ø½¢‚¾†²²Ô’%?}ýz?ss­ò°¡©SŸ‡…ýúȘJh€«‘QêàЬ٥iÓ^DDäµj¥èäÔýóç‰nnV¿;÷XmWûþ‚YÁžÏܺ® Õ>wÒ†mk—´7Uj÷ï0½ƒ¿–?‡7gŽ/—KÖ¬éljªQ«±+WFøù妤0ªŒmg±ÈܹŸ Áúõ:â½Ã›6‡„°Û´‘:4\TN§ ’™vì€hRá§Dì?.ŒÓ-‡ýAdæ¢wL)[ÎS^øœ £a<LJ°id%àV$^'CGKÍ€ÅÃúwàØ JRµZ c°ê,´RÄc`Ékð•šÿƒ, —Ø-Ô0Ë<"4b-U< …ïGd ztDR¶™FƒËptAªˆº¢¢‚5k`Õ*TJ¼xQßȈÁÙ´I¼£P__fÕª&<æÎMª&ÊÊÕµ£……jR}âÄ .·:*kÖtæñȬY/Œ_ùˆ›$VÞ7áá¨È ”2ÿ!Xq5ÌþF¸ØÎÕãw‰ ª’’T›6oÞŒ|ùrØÈ‘­8ráBlw;w¾¹xñë7âÓÓK¿}”ºGYíÂBÖÓ§©ööï,-Ýÿý÷ñ–-99Œ^½šÜ¸Ñ/.nüš5&ªªÒß>JƒG­Vû“×#ÿC=Ö'ª´+*1óæ¿ß©Ÿ]å“Õ~Èð!‡NTÕZر#888§}{å º|»·®]K;p AR’rõj *•‘;3"#íÛˬ^-ž‚îõkÖž=ÅT*ΜQ0ÀB´iϤ¤ {wŒ]aÈ’M`²0c‹´Ø¦p-³Kæp¨Â½á¼¾mMéLýãSç¿…OŸ ÿü¹øÞ½Är¡ŽŽœ¥e“~ýšöêÕ¤CÕÆ¶Hii¥¯^eøùe¼z•˜]þÎ8°™ššÌ²eÆÝºiþÒ þbìš±p³k±”0 ¨IQÊÌ ý¢,t :º2Ê*Ÿ”[¶Ö0èÐá¿q¿Š‘èè|“[L&÷éÓ¡ÖÖºµXܽ»_a!çèQã¹s[VÕ-6–Ù©S“É{ú´½Xj†’bjšËY·Naûö ²³¡§‡ÂBx{ÃÚZ(÷ðÂðiPUF´4˺8\t‚lœ%ð„8þsèBJ—‡Ž[•SS1£¸`î}´WGø|HR‘Å@»«(`áÉ` h$µ–D£Qu  4jYÁJ,EkyÊ`ò ;À|?´QB„ ¤%Ç@ÛÈ¥Ãk úµ€•7±× Ã:Á}” ÕLä—À×–Ç\´ ‡®ÃÒ>'„Ô&Éi0ì’R<¿‰D69gÎ`Æ ´nÈHHWÜ3oÞ\´ukqëÖÁÁšJJb~ _¼(²¶Ž‘‘¡†…uÐÓ«rÃíí=p ?!xð û Aµø yû6³W¯{T*åýûQ&&âC;ëýáb»˜îb[¿.§3ÊL÷òœn2’"¹zp8¼Ü§OSüü2^½ú’—'¤OÓÖ–íÖMÓÒ²I¯^MzôÐ’”ü3ÍØññ…ük÷òJIHÚƒåäh¦¦––MzõÒ¶²ÒQQùoÊ…»iã\}XTá:´Ëœ|P†Cí&¯Õd^xêöúGúôñðó˘3ÇðØ1«š,.æôèñ*"¢hâĦ—.™VÕôïãí]4s¦ÆÉ“â•°Ù³ Nž,51‘ô÷W—’ªð–^²`èPxx…,6Œû"&´& î IDAT±h†P¾ë<Ö@Ûæ½ Yi`s ? _pm ÆZÀÙ×°=‡¶ZˆÜtÚDJ!nØ`L˜ï‡£Ò÷€ÛgÌmEyø…ü«U£eù«`Õïõg± %MyÜ5Á%0¹…ð\ì1¤`8¿‚ýStÖFàP)È.F›õ(bà͘·€áx ƒÌðÈApÌÂt°Aj&NnÄÌÂsmÛM»a¤`/ÐÊò|¹\˜˜ <`Ñ"_AŒÃ…Eöû÷ìY³äNœ_PlÊ”„‹s Pzò¤:딃CÌ–-1jj’V­ZÉÕ|}æÏ÷;z4¢{w­×¯GÔ*zô§#þ™gÄÍ«ÙÑ‘üݳº¾AÉ—Œ”·¯|]NÇÚPóÎ"s%Ù*)mDñÇTÇ«\.‰ŠÊç›p^¾LOJFï)(Hvî¬^fÜÒ–•­CRòº^m¾NÉ7S={–&ÊŪ¤$Õ½»f¯^M,-›XY5‘–þóUð®ö¯O˯†ryÂ_³ôW6ág$Håð I©e‰µc׫;>üqáÂW::rck¥"xýzš±±âÛ·–rrUÞgÏæØÚ&jhÐ"#44Ä<Ož0ÿý7WJŠòþ½†±1 " žCC°Ù€‰‰pÈvWlp†‘>‚<…QYI0‹âRf`rØá‹õÏÐMþ³@¡ 2n‚„Œ‘*Š8hÿ(·ÒÉ蚕עP(¯M cãU0øhÔ×O¡PàA Ú4 %cð#¨H!v<4dÀà ýA$âò˜ÐÖßÅŽGÐO–@nZÍDþ{ѽÌ'xÕÖAM Q·„ ™,÷ElmÇ[á<<0|845%% 366É13˦Ӊ‡‡ÚСblT99ƒÙٜ˗[O˜Pe G†}ÿèQf÷î*>>ÒÒ55W²ŒŒn¤¤”8`±hQÇŽª.×Ó~YØås2åuO˜­às»óѵ•êÃ嚊ßޤ)_íF¾¿ìéÓT?¿ŒÈȼòFíÜY¯…X[몫ÿdΧºXí’NPP6ÿr^½ú"JTÁ÷Šò/ÇÔTJm\nÑêW;þ™çÇ[×O¥«ÜS®9Ô7á῱7)ó£Ðp,Xii¥FF×óóY·o5ªUÍîÛ¿bE„¢"íÝ;K…ªºåäp ?feq.\h=y²˜Wkv6ÏØ8+#ƒ·w¯Òòå‚¢Îå >q"®\­-NŸII‡•?¿ìàø¸²C áò`8±i¸² ã{Àq_̹ˆöÚøèy è¹"ï©°n ƒáQ2áP/X§8`…GH oz …‚à:ÐLµ‚¿ V»g$¶GÁ÷Åzˆ')XÔ,àtfº£µ "BZù¥h³y¥x±}ÚÀÚspº‰!Ýp“ð°C–àá+ØÇiá½'i[ÙûŽª+@Ø·¯dÅŠBMMjx¸¦––ÅèÔ©ìY³>kkKFF©ªV¹ËËc›™ù&$”.XÐêСZ¨J÷î%ŽéÙ¹³ú•+ÿ34l`IU„¼tÜôþØ…Òª'Í–ñ¹Ýù0ÐQ|²¢W õZXì'ÒÓK}}3üü2|}ÓÃÂrËó!¨TJÇŽª½{ëôêÕÄÔTCWWNQ±FFÁ:Grr˜¥11ù~~_üü2‚ƒs8Až…‚T­¬tøfª-ªümÌà»Ý#=ºn43H§G¹œJx£"/˜§¼¨j`ÛCFž¾\Uk½Ë%S§>¿|9î¿ÿZß¼Ù¿æß¼ÉûçŸ7l6ïÆ ³ÿþ«Ž?ÏÖ6ñìÙœþQ|ö¬½ØhűcónÜ`XZJ½x¡.Qñ½‚.] %…èh´h!2dnx`ü\9*ÞyŽÑ« $ˆhZæË;ó3\…æ+ú›˜ƒk³1¶+ðU]çgiøß}(J"v<´e‘€þsй ÃjƒõWÁª4êë§P(7ÓȘhJ!ÖÊ4­@ð0R—ÀäÂ3á:‹{À–ûpð€e[ø®€œ"´ž‰":ÞíC·2O]\2ŒÇɆ÷Qô‰2½a7n»„Bôì yyÄÆ¢IEs.‡~ýrž?g)s玘ê„ _¿˜gÏŠìì4ÜܪŒÖ\hañŠNçž;g2uªøjb±m[àÖ­M›Ê½~=RW·Áé+ï»øìØ  TRþt—¥Ÿ•…ÅTuTdž¬°4nV;fçÆŒâböÛ·™|›¨5ÈÀ@%**€ŒŒ„®®¼ŽŽœªª”ªª´ÈGð§®®\Ó¦òßç€ËËc¦¥•æå1Ë>,þ—ôôÒryVƒ¯N)(H³QÑêÖ·¯îoÄ´þ«pw椰§ÏÏš.ŠWÕ/Js˜“Bf‡T3pÔ™+¿‘¡üÐ…ÿþksð …ŽNMßH_¾0ÍÌ|SSkÖè99VÓóåË¢¾}c¤¤(!!ôõÅÜNçÏÓ§MËWR¢„„h¶jUùVïßOŸbõj8; …¾þè3²2ˆx‰–eoßRŒÆ"1 ‡VcÁXËC‡ùˆIÅ¥•˜Ø=Ç¢«è¨‹M Rð¹úÁæáƒL›€K`z a¹ØÕ«:À¤ \NÅ䦸Øå¯‚õëѨ¯ŸB¡Bú¼†O.VëÁÙæúÂ-ÃZÂ} xÄ`øhÈáÓb(I£˜‰6ë‘U¯¥ègkÎb×-LèË«„GÞrÇ¡ß!W ]!—ˆŽÿ€ÍÁt ¯5 wïbÁ:Ty†))ÜN²óòx.¨Lž,¦D|L £sçH&“çã£oiYÝ–ýرÏóæ…ÉËKøû[UY4¾ nÿþüü2:vTóõÞ#‚ƒÎžx¶q5áñXRç;/ŒÖºETå%ï/µ°hûË‚ô_0™Ü÷ï³øÆ­âbVPPNQQM³®$ÕÔ¤ÕÕe44dÔÕ¥ùßÕÕe”•¥JJØ99ÌœFNƒÿ%+‹‘“èáÁ)ðem­«­-ke¥cn®%'W‡qc>y=:=oáÉ.Ë3å…&%V¾m k³ÂÄj¶ûw؈“?T÷ó§`ûö  ÞËÊÒ<=[ZÖ,¼àpH¿~o_¾Ìùçu//s­J¿“ILM#"#ŽŽºë׋±r•¿ÏœQ™>½ò ùÉ |úµ2×"‡³ÄÎu°_(ì¼|ö_F×x{eþ‰sÞ˜îý¦øxT0Øh·)y¸3#M`Ú]œÁ”N8? Ü"1×­9Òx—s?HSÕ­äj©`½¯M [£V0ðWÁ"„ «h|샶òȤ£ý5°à9ý›€õ9Œ®áÿ@È2ŽA¡ "~•lΜ)1£@Y™ªÙ¢…ÛÀæÍi[·¦ÉVJf©[Û³g“Ûµ“ÿÞJY¹¦?K,++÷°°ÜþÑ}üøß qëÚãåóy—B»j<+¸‰Ðñ!/M»¹ Ç cñUOýü*¯ö_T:#jO*72‰ššrs™L¦xú4##Ùéb›PµyLWWNGGŽÿ]KK†Fû3s:ÄÞÛ.¶ó˜] ¤…æpíâ´™AûTé9ÕªýყɈÙàÕ'._Ž›<ù…B¹q£ßèÑ­k>pÕªÈ={>5i"Ø[G§ºÐL‡´-[ÒõõeBB:HKW~—òxèß?çÙ3Öˆ2wïVv)øøø-[fˆÝ»+Tép9e›¡× _7Ûaq0› ïΣ‹@XX ƒyÐQņqÕö?ÅòèÒÖBAX&LŽFEä´Q² ]ï›6Ðû5|s±¾õ¿n5\" …‚·u  ˜7j,þåO ÆùØèàºì ƺw謎€Ñ à]*ÌOB††˜Eh¦„&ô6àK!î/ÄcØw+NAOa‡ [ö½ Dß9‘Bøu´)«·Q\+¤fଠ¦Îdölœ<‰ñãqå ¾Æ˜1y·n1þ÷?i//µ¯c˜LbbÅØ¾½éºuÕíêètn¯^¯ƒ‚ FŒhrçNך“!¥¤”XXÜKN.7Nïòeë/}ÿîÃ…³¹lå¾þ8Ÿ–Ë›hàNŒ:×W.GC߰Øñ¿–¼§1 ¨ˆ›ËÌÉadg3rr¹¹Ìœfn.C]]:#ƒÎ7A©«óÍZÒ22JßÃ<ýµƒgø—»½T¡Û«U~Üôàò¬ œÆ4•VmßÏž¥ýûïC‹WÛœw÷/#G¾§Ñ(ÞÞ=­¬ª«K]î ðönß·¯ÿþý%Ë—jjRÃÂ4µµ++ú/bÊ4mŠØXȖ颙ÙзD~!îŸÇ~!ËYxŠ¥±¹ðËNÂ庵ÃÛ½ RÄüÐ ¹Œ‡±XfŽ}`Ý;ì FOm¼ p36Ð’Fl_(Ñþ*X úúËoÁTôŸ£„  X©Á…áu$ádoÌ4€ÿ®ãv$æ˜áØPે‹nËMã±E„~|òF\z„Axt@(¼|“@[Q¾ÂJŸiih×t:Þ¼A¡ýE€ÌL^ÇŽYYY¼C‡”,vð͸rÄÆ–tíê[XÈqq1Z²¤»ÀœÞ½= Yöö&;wv¯ùÀzCÂ3/w»)l:ÀóÖƒ¶ú¢€ ¾Æ¯cØ@¶ãñõ‰Ó¾‰sϳ¹Â¾|˜vœÆ«ìœmPt |„†æXZº±×®5Ù±£/ŸOŸJ»tñ),äìßo´tiu¯»òxÖÙ³5ŽÏÅéÒ%›N'w搜QùËb¡C|ú„³g1mšP>cÎ\ðþp?'½‰ùNÐÑ@äM(—…u„F—¥àñð~?LÛ€óØßF×–x· |“Ðû ¥·ZòH)þ5Ð9ð m°xèø±%pë»þ*X ÷úKxP ,M"û›À–¼È… {€\ù×0Pgà #茻I*®Ù *lôÝ V¸Æ_GbÁQ€‚««¡_f¯ú’‹ÿ̓šVOÅÐ22¾|¡÷êuOSS¦M¥‹­knwçpÈÿþ÷–B¶¶ôµkߨ¥sáBΙL&yñ¢½šZåð B0xp.NÚ¶¥<)†]ÌÅ—.ANÏž¡<¯0$SÃûèµó ñ¿ù fâ?káñmFa)zèÃe63Ño?lŽ`ÄUä10¨-ÖYÀ|?D䣕<Îö—x\J…4/- AÁƒ U¡„•’Ž5ÛHR(øÔ&лñ*|4Þ€†ÌBVê!ª³p'ÆëGð&Ç"@_]tð!;|@F“ºãÕ'l¹þýcaˆ.mÅnÂSh«aöHøa¥ Øe= v®Çóר}ÉiÂÎË—#$‰‰¥b½„#FÈtìH ç,[V(örvïn\z÷nþ½{ùÕ_øðáÚýúiDFMŸÌáÔâîÿçÝ­[»†‡ç.Zôêݻ̚¬74ëa1öš‡”¢"‹ägSC‹nП·|Ûp*¡Pby|òz ,,ì—͵ñáïj×'ø«ýÔó³ŠjWTÂyqDÔe±ÚS3±ò_6›gcãõéS¡¤$õôé>µ*ñ´{÷'ŸœÄÄR7·o°¯qííS?|(]¹Rûkí ÀéÓ¥3££9»w‹Ù‘ffâþ}„…ñV¯†(kê­Äÿ µ+[N ( jJBí ÀYox!á & $‡žÃ?Tvõ4îшÈÄ¢î[€QxMfPÄÁÎOøP€uí A—`M*<_϶ ðêàÓèÑx,¾'K°:ä%À¯×·6 °Ù vŸá´¾7hTœAB>̶B3U'Ã#TpÀ]¶ÐP‚gn¿žeÁXthƒèÏ8zS(41‚ÍP0˜Ø²W(TQÁÁƒ ‘[´ééb&ì⢤¢B½{—áîÎøºU]æà `ñâäÒÒoÜÚ»v¶m+X°sg\õ=+ÁÖVÁ#ƒ;r¤gZZƒ(!\ M:›6é,Ø­vÌ ˜¸_š#\®7Íûžï¼€C• »z@ Q¦š¿¨cü]íúDSm­kv¶#\ß<ç6-JrYSƒY${W3Ðxü亟]M±ték_ß ¹«WûÕ*½&2²xëÖ nnTT¾Aáæàž–ƶ°P˜2ELÆqn.oíÚ"..Jªªb~1çÌ·7þû3dˆPèù^>PQª9ø)GoB‚Z!ô*¯ög`ß,¨È@ ûŸÀ–a‚>Û|`¥¥`Ópx˜¡6J°ë2™è­†ÁZp<üd’¹ºÀfƒ@ãU°øP£áq!žÀì–h'˜œM€!-Ð[Y þzª˜d 6;}@š†ÕÀÁC`ÄRWĶɰôŠË~ÓipZÇ‘S <ïÎu’ÄÙëø(bŒ7ƒ#'Ó§ãëíe“&Ô-[,ZTX\,f÷9ož¦‰‰\Rk×®Œê¯Z^^âĉN ¶n ,¨¾s%ìßß³OôôR/«!nRrb¢Ê¿·Íœ°K4Œ7\ËìT—e !aCœ†ƒ¿«]Ÿ¸»výòÜ΢¬%rìb»€=FYAÕŒj÷ï°†@vÅÇ… ±GŽDÈÈHܽ; V$|™6-˜ÁàÍ™ÓràÀohŒƒ3©T¸¸4k![µª(+‹×¿¿ô¸qbümçÎáî](+cçNa¢!X·Ö-†šCóò}`±1s$:‰”7[w™°2„ÞÉÁçÈ,‚…ž€ È;>Ÿ¡.‹Ýàc®ÇCZëM “ ×àÓ{q±µl^mNù_Ô»‚ÅϺ[– $Ûô`s J¹àØ œƒ‘Ï€}@£âlp™ËMU”Œe®»Aè¡älì¸.<ŰÞ`޼Bl;)¶n»Éàr±Þ©Â|Nœ€š<=q挘Ù.\(ߣ‡dR×ѱøëV Ê¡CÍ)ìÚõ%>žùuQüóúüù­82cF›] G¡¤$õÚµ~Í›+¼~ýeÙ²×ßPï`äå‰þÙ¼ aþ{'Fn¹$NÍpKÛ¬¢o,Ñ_üÅoŠG7®(5OSš Õé™ ý··Ê­fTû!Ç:Q÷³«³çÌñpèP¯îÝkV²¸ ÎÎqïßç·l)»kWuœ¢|,_žÌf“¹s5»u“ÿºõÕ+Ö™3¥ÒÒ”ƒÅP§¦bÙ28t¨oûå;EÓ& £½€»äà`'ÄáÄÐ$px.øêÝ׿«­/óÕÆ÷àÌ1Ds؃"þÓAOUØ‘ 6,¾£Š«>]ÁZ¤…vÒˆdàtŒÕ…™2Ò8˜VM`­‹|\Â@OÁæÁÉd$±jl.3bQ)8<T콃ÈdáYö/MGn &I(Ü´JЏ÷~ï„B]]8Ë–áóçʳ¥Rqø°²„öî- ÃÍØ«—ÂäÉêt:oùò”o^;ßQR¸sgu¯Ý¯¡­-{ïÞYYÚ‘#'OF}{@ýBFµ2EVIÚ"Gbá¿$Y©eï>I9 ÑËùñ#ðŽÈó H´:g‹‚øEþŽš¥ Û :º$ee5 :Œ3úÂáÇ/4ìÚ/_è#F<¡Ó9 ÍœY»|šÈÈbGÇX ÇwRTüÛßõëyOžª©Ñ¶nÕýº•ÃÁ‚…„ÀÞ^^__Läû¬YÈËȘ,âVe±±yl[¹²åäñ°ÒÖN‡ŽF™`Á1pyX>Æ­ÂêÍWÙ¸›YVw€˜œJ‚D™i ……™ .µ¨ÖQ†¿1Xu€Æ®`IQ°£)lLE!`§8Å!— ÛºÀÞPd1`coШ8„Ä|˜Óº*L£‚šµÅ¬`q°H$Ú½CØ›ƒU.B¡¦:–ÙÀÊ­B‡ ŸŸß¤I°±Aa!fÌã(43“œ;WŽÃÁÂ……b£Twïnª¬,qï^þýûßðýÉÉIœ=Û™J¥lÛP;G¡©©†››€ùóýüü¾á‘¬gètéöµP‰™7÷½sËaÌYTzQ—Mža)â“þâ§ÃÏÏïWOáÏÇùWIÿî{] aÔQÇÌÀ¹œ+‘] \Þtï7Kâ2¦{¿zøTC »âƒÍæ÷4%¥ÄÂB{ïÞžµ[îœ;·å€ßp––òV¯NàäÔT]]Œ*æâRÂnÛ–fo/Æ"tä?††ÜÜ‘Ûûè9|J„a;LùOØùì}D¢™–N ?†4ši`ãx¤*óÕŠróÕ`¡šÊÀú(° fµ€¡¬NE)“Ô Î÷¿]Á0FV ÈäÀ9úk¢ŸòÙpŽ m nb6ö†@[5Œï6ί€2#•‚3¯À+SwvL…¦2¼Cp]äÅq”àî/¡på\4Ñ‚ Ü=>ùò‘#ÐÖÆ³gbŠçرCIWWÂÏu挌¶¶äæÍ:={ʯ[—’•Åùºƒ(zõR›?¿%‡CfÎ ©m@Õ”)í.4b³ycÇ>mPïÆã&‰•˱Kì>ìÖÏæ²å”òú8½|Wõ_ü,ü%ͯk¸zÅM?õA”ìÊ2ÉkjÈ!I®o #ïÿìu\Té÷Çßw`†AÄÀÀ±»[W]cw5ÖN̵QQPÅîs ,Ôµ[ƒîéß3CŽ |×]öŸ×ü!çyîå™Ç˽çžó9Ÿ‘ј0vìõË—ƒ 6=p µDòmO¨yó^ß¾åà`êíurpÒ¤E‹ŠëÔ14È6ãèû÷ÊY³beË,Ó³™Þ¾ÅÅ`Í Ýå‡×r€ù®ê|¶¸\WÌ‹©NB+<–;–Á\g\{™8)ÊhÃW>ºðÕ¨:·?s:s1«ÜŽâ`&¸–¸ÏÞŒEx¤T5äá_Fnw°|dK‹!‚Å¡Èæ9"Àòw¼O˜S –?AãEÌlŠ¡ˆM÷R‚XÍËóÇ=Ö]ÑžÓÆ¯¾c×£s<ìl´=s&-#ùhnÆô±Sâ¥4-G½Rý¹@~F×ð æÂG¬$Œ« p:” aX‹™P à`$Wã°3dJ!€™±óõ”BåáEîu°j‰>*Yàm©ˆÝ\˜[‰ˆ­ïñ‹˜] ‘ÀÚg¼pk†À¦ûDüRUˆNdòAíÉE«œ1±ôüµF‰ÏÓW¯5ŠÅ̙඀„Ä4<•åË)^œ¿þbÁ=ë_¾Ó©´ IDATÜÒØXؼ9áÒ%=ñÿB…Ä»v•40ÜÝ?=›ͨAëQ£´…߈ʙ„wCc“Nëwü²ã@…Î]R3y;¬Þ\¬~#u§{4ªîȪ^ën-9ûÍ1¼<|=ò8X;NŒ|÷üå5µ§>³­šl4QĹ»¨ZðÍL$‡é]!!‰]»ž“J•£GWúVb;0wîë;w¢LçÍËâØøxÕ/¿¼‰Uöêe£79˜˜¨92˜3ÇÂÞ>½ø–Ÿ³f!lÜHêr___÷EÄ'ÐåGÔJ±O]I|"¿¶¡‘ÎVªµµ—®)m?Ž>äØC,Y¨ ‰Íº©ÂW®·&VÁÆ•šé/f”ÅZŒLÍÔ³‹`i€Ÿ‚Í ?eÖ5-ÿr¯ƒ•œTŸGŠ¢~·C­ ´–2eP1”j\_8YÓ£4R%ž÷ÊÚÐÝ ™RÄVöÀ̈7¹ ó1ª—bx;Jíß’š?³ÐæmMYɯ¨[ƒO!,ß”†§beŦMîîe÷å”߸l""Kvá¯ë“#Ì›དྷð4N´jÅðáH¥ôí‹,C jêTóòå Ÿ>U,Y¢?µ¦–K¤IŠøx±èw£nyØÅgÁ ÈQzWŒsýÊ• "ELhõ­Äöä#Z·Î"9¸fÍçíÛÃÍÍEû÷—25Õó‹^¾T,Z/±n•aÅÝ;w(U oïôC.ž( éc*ѱ Q©´ä ‚#qß°r8¦ºä䬼 £f œ›ê,—Æ×ÇÒÀíÀ”ªXJ©p 0§>]–<çè]ið×_)ÄöÚµ¿¹yž†Õ  [¶TÍ<9¥üå—7‰‰ª1cìz÷Ö_A¹sg¢,~‘‡Gú¦ÎIIôí‹\ΤI4i’fH­Æ}j5ã†R¸ Ö(“3mÀìáXéÜ+OØ{ K†¤;z/r%ÎM©[Rkœ¥Ñ¾ªO>cÔºðÕÔj˜«`Þ€yŽˆÞJYó,( °!' J0â›ÝÔ<|äv ˜eŽJ1XZ À#ˆ0†L) àò •šâæ ®€RûG[ºUDšŠ‰Õ¸,}ê’(gä­EX9±!+Oðà­ÖhoÇøÞ–¤Ð³ªWbú@9té´4à÷ßQ(èߟÄÄôë_²Ä2_>ÑéÓÒ£GõÇdëÕ3óð°W«8ÐÿÝ»ÌúØšlÛVÍÀ@˜;÷u6…vv&G¶155\³ÆoÆœBxÏá2yÏÃg*vù5c;G*[O‹ÎQJðç~Ï<Ô§Û±¡}Iv?_ÀÀÀ¬'åá xësöÄÈA›[6hÜvìï»%g±5r ÝŸn©ôÄ\s¦C2BB»uË>±=¹.gäÈÍšééÓœ ÍÝïí[i:f è—9‰QOž,^lik›þÉèâÂÓ§T¬ˆ»{ú×lÃÇ—V £'9§—ïåU Ž%ü“Ö"S0|5j5®¿RRç‡m»ÁÅ´Ä£³ÖâÈ%òkÙW¼åA8ELRÀ;m_çIª`K SbÕÌŠX`‰Q^œÜî`ÉÀZ„F§w\ haA[K¢”Ì å@)SDzë#Àôê˜rà-Â!9ˆuºðÇâîØšóçSþ¸§µT*ÁÈS*G4péO±‚ÜzÊî3)‹3##Ë×X¾)ý:==©T‰çÏquM?T° hΜ̚@'üùç|QQÊ_}'•fF0ª_ßzôh…Bݯßä¤oÎô%ÞGŽÌY„w½¨\¹²¡±IûåëÛx/+$ýœ®Î+‡Õµ§&·yyòØÉQC¾p¦emm°woIÉz »¸Ä©7–ôé“>êëËŠ²mÆiS‹o˜â‰Tư~V–º°WD s·€®IšKŽðì=e‹0ágÝ´x¦XÜ|º˜ÓŒ‹  _©ÔZFÊÌš˜$eé[Ðõu¾Ïá(ÌEÌ)07Ž`õ%ülœ­.5y¬ï€Üë`iTz0Ö”ÒþæÜéiyÈ¥81rðË“ÇÄæëjMzT0¥ ”‘"iÀýe5>ÝÈäØœ¦Åb{±bæ‡}³b;ððaŒ——69hnžYrðÆø3> [¶8”,©Gõ ¸sG¾~}‚¡!+WZ i°¸8ú÷G¥ÂÍZµÒ ©T G\<¿u¡k*mã™k‰ˆ¡]~Ðuúy†Ç>€eC1Òõ1r9Lh,MËÑS÷¿z5møj÷kGPœåf½$^I×ÂÔ·N)xŸTˆÂb>(YË,`³ÚÃ<|oä^Ks‘‚ ð´p%F­­wUèÄEúØSÕ’€DÖ¸TÃḆþ ˜Ñ„%9øœº†+CS¿AÑÌ:¡µX˜0À”-Dê þúþH­Š)2ttlÍÀHeôC:ñ…êÕ™:•ŠˆMëG‰D¬\ie`À’%ñz›@ùò:TÚÄD´jÕç;3ë’al,Ú¸±Š é;‘Ù&~Â{pðƒð®AÑz U­©k§“"Ö#É·¦Îÿ|e4?>Þ»3y(¯Ö0ßoÎ~}æD¸i•u§ûçK©O³”Fޏ=7õ…š9M‹!5’‰í¶¶³ûfÆ}råà¨QM›f– UtíúF.WOŸ^¸sç|zç¨TŒ­T2q¢y•*ât£¿ÿΛ7Ô¨Á”)é\°†+Q¤ Ëæ¤Ÿû³þ"æMu’ Ä%ѽít!ÅÛþlòEbÈš^ZR•šihæÀô&ä3F©Æã>€{-$"^Ƴ9ÙåöDp=Ž"b&˜K‚šÞ&Ôšmȧ⴯Åç¸lKY€÷nuÅó#„=÷“%&í–—[/wR§b\7wê×Ç› Ôéår¸CjÌ›÷àôé÷66F;v4‹¿ùé#“©ºt¹sòdH‡v™% õÀþ2™zĈ­[ëiج¯¯lçÎD##aÑ¢ôÂW¯^±l"+V`¶!á‹7ÌZ„ °n>©’Š»Ns÷övŒÑ%çⓘ½À«/ç~œðxZT ³®;¡o »abÈÒ¶ró¸ÕD$p?šã!˜hû:/ !TAsÚY¡WMs,žÁ6CQê<ü;Èí–4”=!ÊÒ×9¸Å +@1 9 h™X‹ß)ÇJÂØJ³ïˆV¶Ç@`ÙMêUýPÛ‘,:§µØZ2选›Ifï¸ Á”ùöǵIASÖÏGp[€_Ú ›‘+V̜ɧ òì+VX‰Å¬^ýE¶;а¡ùèÑ u¿~þ™S¬† sèÝÛ>:ZѡíààìÄ|W¯näè˜ïéÓÈ1cr+y·5¨ükïŒs¼¿ÐçQšv:ëŸ)ç÷Kþqá™WáÿbÉév;Ɉ“*\vÝΔù%ÉÐX!ï©<ì\éÎÉDjU¿mí_ô[ôj1äÀݾr%ÈÍí®H$ìÚÕ¢D‰ìhóôâÅðÂ…-ªhlœÙÃkÖ¬ »wJ–4š7O¿êš4ߨµš©SÍË–MŸj3©”Áƒ©[7]¥bð“Ô“6)ŠÜ»ÿÄmÀœá˜êba Arü¢+'|ÄÚ+ˆXÚ]· #O¡†i)™`ÓsÞÅâdM×’î/QÃH쌈V²8ÐJ3ìIä¾{œM&‚œ!U·ž¯Fë; ·;XrÔÍ¡-Ä‚'³Í1´®‘À´Bnº V Û/±jfx-*FÒÒ)DK»#Ì=M Ž21þ'ŠÙòà-ûu$ªÖŒÿ ÀeÅ‹O^[‹FÚŠÂÁP¦}kmÓ†Ÿ~"6–É“I''Ã#Ììí \]ã2aYÍkïädòìY’›[f‰BA`ãÆª X$vèp+>þ›Ș™îÛ×ÊÔÔpÛ¶—9M}4õn¥Û´/Ó¶CÆi•CÒ·ÓQ¦úÃI”)]ùe<*én·ó —§"ÕÆ@¬‘Õ…R6Ôœp¿pÊSÝH!íy½—¾t¸^-†œ¶Ûq^V(TS§VkÛ¶X6ÎàéùjݺSSƒ#Gj+–½ìÞ½oï`‘ˆ-[J˜›ñ·pa¼JE©R“'§oê¼?gÎ`cƒ§gú£–oÂ÷… 2Fûé»eÞ~¤rúên!Ÿ£Y|`^?’‘ã W2¼ •íµ–e7yB&6©ð~à®/|µ8„Íia‘Ð<³.Ã)°€éÙómò8Xß¹×Áú„p& X †°^¡}H½²¥”~Iì˜]`‰¾ àÕ’Âæø²ã‘ÖÒ 4]k(gºN ÐDÂÌžÓ¶#Õ…E&þFA|på¡UêE.r£hanÜeõ6ÒaÙ2ÌÌØµ‹‹ÔNæÌ±°±8‘4qâózÆÆ¢mÛÄbaáÂà«W¿˜OÔÌåfͪ•õpà@ÐÌ™/E"a÷îêuêèW[Ð@*U÷ëç/—«Ç+Ø´iúÄ_2®\‘͘óü¹|×®|&&ièà Ú×¹s±µMs”ÿ{fÌX=ëTË’=Æ€÷m?AÀ}71 tªKó*ZËÉÇœyе)îµ–à8æ\XÖcC€ÏñÅÉš_2„¯Â, ð°•E“uQÃD¦%¸‹Ž›’‡ ¹×ÁÒdÕO‘t™#ô9LtùìSR.Ê L/àþ …:%ˆµL_ËÒˆy­&#RwÏ\Ô S »ná«s-´Â©8ïBX«­47eú €ÉËQ¤ YY²ÖÀÅ“7þiÖ_¼8..£F¥W̲°Ö¯·22V¬ˆß½û‹…5kšNœXP¥¢ÿ¸¸Ì…ùóKޝmm->t(xêÔìD¡zõ*Ó½{)¥RݯßÅÝ»s•†Æ&ÖïøeÇŒeYsNùÓ¹’a  V3v÷Ãy’X¡‚ñMMÿ’T½zE)L™b^¯^ú¦Î³g@Íš ”Æ®V3t’VVô§¶i†¼¶M³š´k µ¼ fãY DxõÕZäJ&p뀭.Aúû¢¥tq¤}Y™Šùf×Ò¾ZBŒ’¶–41'QWèxûáØÃ¢ö"xM^Çú‚:?A(¬þT ñlƒ¡ă/4„Ùq¸ÅRGÌ_¶¨Ô8ùñ"‰­ôËÏõH^ÃÊw-±3ûnwøµ4{[¨Õ´ÜÎEFÖf¥îÅÒõ(ž§¨[’S´±âã·è4ksÞlÀÚ@&§N_,Ìø¹™6c˜Œ^#Øs„8¿Ô*Ã2Uªðâ 2aBúo·bEü˜11ææÂíÛ¶*è/f–ÉÔµk?{ô(qôh»å˳ˆÛ_¹ѦÍ_R©jõêÊÎÎ%¾r“Scöì{nnw „;[ôèQ:ërÞùØuU††Û:xw©ÐÕôƒßÁ}aÏý¢ÞY•(i[Þ±b×9¶¤+ÿ<ÞúœM}…Ä”­;NÚDïËM©ˆçý¬4QhËPD††å~ìöâ™öÒªP±b—_sþ¥õùsR‹'ž<‰¨RÅæÂ…¶¶é+õ²„¿B½z×BB¤C†_¿¾J擯_kÒä¥ píZù:uÒ'þ4P©h×.âìYiÓ¦’ ò§#°¿zEåÊÈå\»F½´eŽk·ãì‚­ ~—)ª~ñé[ú¹;yÔª¨5v›Ç×òëGi-KÎ3þ ñh&b€+4ÛŠ‰˜§#pȰö#}©lÃý.Ðù6ÇB˜\oG>+(ý„X%U ®^qL¥¶˜›¶È¡"¼­ÐVçElPD©VeEO`|®v0ÈÍ, Š`ðùQ‹Àx&‚Æ›QPÄ-9Ç“0HÄ’©i`MËTA¬±•hS”}oØû@Xѱˆ5w¸õQû[¦µ£˜57ß±K§^Ù±-ªÇ‚CZ‹DÌü1ø>Àu ÏýÓ,r…'v¶øø²yo»D¢e»ÏšÅǤÃèÑf½{›ÄÅ©»wLLÔ•K$Âöí%%aåÊгgc2ß«&MlÖ®­ Œóäܹì7ÌœYcÆŒJ¥ºoß‹Gúgã /¾IúR¦PMýãi&¦|Þbåƒý7B_<—'&æu‰N‡\.4šÜRPS'¨¹B…Õë]™Êãß[’ì]&6¶ß¤Åv;,,©eËOžDT¨ïÏ?ÛgÃ»Š‰Qtìx;$DÚ¶mÕ«³HHPõïï¯Tª]\ }É»fÏŽ={Vjg'Ú½;_:ï ·}РôÞÕÇ`¦z¬™—Æ»’+èçÆÝgT+õ)Ù»ºõ’ƒ×1‘0SWNÇ)€ÅÝ´Þ•LÉð¨aF­wšÈ´[”µdA=Ò‡¯¼‚ˆUÒ9u͈R±(`®,‡7Pú@8ª•h™ ßöt—}‡O®Gnw°&bx›ˆz2‚¿à˜ L3˜‹zÙàhŒ¿ŒmံYÁR«[ ä IDAT)€q7ˆ–8`L]TjFžÒ– šJðø Àåñ:êßÜ~Kò>LkiSŸH”ÒÛy*MƒüÖÚV fñ!-%½uk~ù…ØX=ÚîÀÚµV*>~¬7î‹ÎSÕª&®®…Õj† ˆ‰É"¤Ü¿±©SË(ê®]ï>~œá†Ù³kM›V]ÓçõøñY¥ó›¤/—Ÿó*$3²`UfGÕ xþU´™\¤M=äu‰Ö — jZ &ÿøÉ¢øšÚS­Jéœ 6^ ?ñ­m›ÿõÝŽŠ’µm{êñãˆòåóùøt(TÈ4ëcÒB.WwérçÉ“X''‹½{kf‘[œ4éëWÒªUMfÌø¢hûÅ‹28‘ˆ;ó)’Þ½úãΜÁÚZ·}„ Q1tj“¦ç ൙»Ïp(ÂV¯”Œ¤Ë6ÔjÆÿDQ…Ëõ(ñ´r¤]%­eñ ž…QÖ†qºÃI7‰”â`Ak{H˾ ’³. 4rôsã‰PÑÆˆ–FDÂ<€ƒº5ßìËæá{ ·;XÝ1­Œ8åfâÍÁ €É ƒá¦”2à‰‚]‰¸ðBª¦5­l‰V°ôÀ  4(Hp‚Vwpk†½w>±é¾ÖÒ§.uøÅ|›:X±Ÿg“…–ù9ÖÈŠ¼.ѹš–‚€ZžÚÕX[ÛeIýYo­+drÈɲ¿*D)ò˜9¹msFDGËÚ´9y÷nXÙ²V>> þfï 3æÉùóa… :UÇÊ*3ÅvÀÇ'vÍšÏb±°i“ƒD¢ß Qõî©TâînѺuú®Ï Ú×T// ¤íß³uÇÎ’ßšõ ÒØ¼Äk "[ܰÐ}Åã·¸ø(E‘ð bÃU SI3¼Áó*Àòv\ fÇKŒ XÞ2„¯æ‘¨¢›5ÕLù¤de<̶ð„phmà5Š]$Â4¾ÈîÏù¸wïÞˆ#òåË'zþ»tébiiiiiÙ¥K—÷ïßÿ3£ÙCnw°D0K`qŸQ 'x ë@"àf03©šîÖT5!PÆÆ0€Yº V„Ö6F,bÅî‡XHXü€Ëy>'KEXð'º¶Ðóú!1dÛžèB9–flž‰ 0k=wŸ¥Yê*/¬­8yž=GÒØ‹cÚ4gg¤žÊ• —.µFŒˆöóÓ/õih(lÛæ`b"Ú¸1ìÔ©èÌwLØ´©jƒÖþþ ÙnæÍ«3iRU™LÕ­Ûù 2d7sÜ<‹ˆÿ¶w¼Äâ|©NžMî­4$Ø¢hê.ÑyÈmx¼g‡ÔÐ询M6ðØZmôëÌD257-p­XKÍ¿srÛæŒˆŽ–µisêöíÏeÊX^¼Ø¡H‘ìxWsç¾^»6ÀÄÄàÈ‘ÚÅ‹gÑó'&F9`€¿Z›[áš5õÿ:¥’Þ½£‚‚T-ZH¦MÓ£Â5gþþÔ¨Á´áæàP&ÌX:›‚©/©Œ~nÈäŒþ•fºð¢RÅÔm3z`¥ËRŽÛBňf8é‚\ãÎ'ãW'Ú–P¨å‹¦W§œ¤ _ÈØ†€{€Yq$¨éfL]1þ°R¸˜EŒú`Zž,üQ}ô>ÙBŸ>}ììì®]»–q(..®E‹5jÔ¨Q£FË–-¾÷h¶‘Û¬d´À(õRb À €Ù ¿™PUL€’u hƒXžA$¨h`MëÄè˜X•mé„RͰ«Ú´`w'Ú•!"‘©çµ¿«~)zÔ"QŽËa­¥T!†¶E©JižãëëÛ¢6#»¡PÒפTÏôÂYè0z:¡a¤Æ„ T¨ÀË—,[¦ç;jÚ·¯I|¼º{÷Èøxýd¬ ŒgÏ. ‘…亱±èèÑÚeʘݹݯ߃l7ÞÞuGŒ¨˜˜¨èÔéÏ‹3è¥þ#øJžÊ‹àصß}íIÓn†R0¼[¤Á¢ús&ÆÖ:þ (73>s+è_APTÒÆ |^¬Ø?Ôì‹¥mq¡tÇx‰EöJÿ­Ýމ‘ýðé[·BK”0?wîG{û/r¡2Á¹º¾øQ Æû(«QÃtòä/ÖΘ{á‚´P!Ñ®]Ö©W¯_³d "«V¥×m9ˆ(Ú·ä·.iìîëyôŠRöx8ƒn÷œçi % 2LWfxô!gý°6e¦.·xî-Ÿa!aÑZË¢G<Š ¬“ªB†ðÕì ¤j-Må•‚- €»ÀtÂoP®!»€Ôáw,’Ȭ*\?äßá“-<}úÔÝÝÝ)]÷G6lØP¯^½éÓ§[[[[[[OŸ>½N:7nüÞ£ÙFî%ù¿%±´`ÚWýl+^£hÉgàÊcØ|ÀæÂ±$:GR@Ä;Ìê>çv<‹‹2® 7"ip KCÞµÄFL¬Çý|ŒgCWxA•5H\Dý¢"©àF¼”+i\às4e†“ÀyZVÕ®-!‰ê½xÈÔxL³ì¶½øó=:³'mkóçiÝSSüü(‘¡Â/>^]§N˜ŸŸ¢gO“Ý»õß°T*š7qåJ\ïÞ6;w–ÌrŸ?kÐàZd¤|Ê”Òóæ9f9?#ÔjFŒð]»ÖÏÔÔðÔ©vM›~‘9‘ñġ€R®õ…c¬nm~­x˱ž·ä*ŬF¶(Õ·aqcq†{|þ_ u`dÙúWì›_QUf÷.Û·‚xÛ”ŽYÏˈW´oúÊ• âÅÍ/]êX²dvUwîD5mz#!A¹d‰Óï¿g}#:q"ºcÇ×FFÂÝ»ŽNNúc]§OK;tˆ‰ðñÉ߸qz] }{NŸfð`6¤ue÷£Çp,-xr‘b©|ã›Oh85\ZGãêZc¢ŒòÃxÆÞÉüÚ@¦ òl^†°²'#›È”TYËp¶aB}€÷qT<@œœSíhW Ò¾–âø5<­Hyc~dCMYgŨ xE¡a‘»b1ó ŠW‡u ³vÉ÷ïà ¸ÿO† ¤?¼E‹...mÚ¤”wœ={ÖÛÛûÂ… ßu4ÛȽ,{Œ€§ÄŸ%¢,†=0UÀ\b… ‚¥Œi(᳊%ñà¦á§¢¾.ˆµô-€…M÷Ò)7ùœPÖ† õQðã(TE­™Ø`ì>m «€•6U?uÉ×’©1[Ý1á½ ßi–­é~µ÷(‡ÓRzZµ¢[·‰¼t03²¶°öìIܼYØS$bëVssÑ®]ü‘µlf… æ‡×’HDÞÞoÖ®Í]]X½ºÑÐ¡Ž Š<}õjp6N’ºK´…4ºÍ›#Ó¯Lèâ·Õ.>½Jþ£÷ÑöÝw˜xÆýȳð¸¼2›ÿWH®|vôà•pÉÒÊãfêsQ™Þ»2P+„¯~êì~©xú1‹òÞ‚„E‡g®\ *VÌüâÅÙó®üý:t¸ <¸ø×xWQQJgç@ÀËËþKÞÕ‡ʾ}£T*<<,ôzWrú4ÖÖxy¥±‡G2vÀ"·4ÞU’ŒA³Qª˜Ô'Å»–á}µÊÐ]W`°Ì‡—!8fhc­eþ5^„S±ctZý£¯'§Gi­w•.|¥Ñ_ŸòÆ<”óGÆ®æ“@c¡8ì'á1òb Â,ùvB€‚èù²ÿi<}ú´jÕª©-UªTñóóûÞ£ÙFî`‚ ÔTß±Cr§XhHh,ê}Ø4ƨ'ì…¾° |e4Ç\àv"ê?ç¯x¼í™\(} hšÓï\ M8­â]ËÛ1º@¢G7ÂÙÚŸ~õe”ƇTï=¸¬À{¥‹ò`7æ©x+·0z:… òôR5ápt$.ŽÓ§i›VOƒ={{õŠ26®_Ï_½ºþöò«V}5*ÐÖÖðɓР~±}2¶ly?pàC±X8y²NëÖ²œŸ*•º_¿K;w¾²²’œ=Û¾N»lœäßÅ‘A½5ætP Â3Ûª¾Å[¿Ê_1㨱ؠ[mûiÊW(üf¤æ!Gõ~rþümûÆW‹ÿi¢'r`&‹­óñjÃ÷ç­’ô¼À”ùáÇŸ6ïÎhÿO !AѱãŸOE‹š]ºÔ±té/öWÎ11ŠF®=~ûÃNœ¨“e٠Ы׻={"40¿r¥œ^ S…‚fͯ]“µootâ„MFÚtb"+âïÏêÕ8;§=ùö¡yC.ìO#@8n1KwãX’{»0Öù0a1”Jt|J."4–r3ˆNäÌ~pŒ¦â*âåøô£¹Àé÷´?¥¿nh²©©ÃW/’pòC/œ(iÄœ•2Ùo NB°†×`ŠºŸ?¡\C¾Î˜xp„°»B­¯¸ë¥“4q£‰ûWâŠ;Wfe4ÿ½,‰D/§<˜är¹¹¹¹T*ý®£ÙFî`iPÓPdûµEäŒ90›XÌ#Ø w¡‘„öFÄ©ñŽ˜U`~1Jê[Ó¦1 –¼ÕžpYŒ Øôœë!@JƒtW>Řˆñì 0å1I@Š\ÊÔm„†¥pÌg £rÞ|`úê4kÑÆu abÚë¹hQ\]A'å’={š dš”¤þõר˜ý×ýˆ~øÁ2,L1lØWÕ÷ PÌÅ¥Œ\ž}á‘HغµY¯^e4ÜØ;w²£°•=DGgÁèÿJèí juÅφÞ]ðû_î5?]©ÒÐ>“äÊצŸï¸ôúy¿Ð¿e%9×nçL\‰˜û8ûWÊšE"6.ÂĘÍ{ùóRš¯3nŽŽ¼zÅ’%ú¿ïÊ•–Õ«‹_½R ¥w‚ °i“ƒµµÁÑ£Q»vEè“^^ÿ«pƒ°}{ó=JGGËZ·>y÷nXÖÇü ü{D"¾Ô%:ö1=žlp¹æÒüÝ)Eš­J­>ñ0¸õ_‡Þk~kðÓæV OŒøÖçì—NõßÅßµÛ9 ¾¯Â»¯¾Ùêx¢oñÖRÃ4Åÿê²á~î/›ä;­qÀ9±ò‹I´NðÛíäZ`;;ŸŽŽYsÒõbìØ'çÎ}.TÈèôé¬E€ÏŸµ/ -[6½æ‚'NH/Ž‹Ù³'Ÿ­­ž‡Ýë×,Z„ ¤ç¶GÇàì0o:¥Rìñ‰ôwG©bú j§ŠJ¿ aó‰HÀ³Öòð›¯!6`AW­åÏ7{¥Þ­´–9÷xKFèN5ãõ­[;#'r(c.…\b&›“_Äx%a8„ \C<0K–ð^‰º+ÙI&ä|X[[GD¤y*…‡‡ÛØØ|ïÑl#·;Xµ±h€eÊ#LƘKl"jWÈá T6¤‡ IjfÅxXB¤’úÖØó4–):U…iÕ(eÉãVêt¿W¶ÇLÌÎGø¼dCwD‹Îñ:HiYµéJ‘ðTa jå˜>µš¡žÄ¤¸^”+…Û€a“‰M%~)‘°v-‚ -9Îccaÿþ|––ÂþýIkÖè'cÙÛ‹., Œøþ}ÖÎAÔ¯ÉÈþiì—òú=ÕÊ1m@û´íÈBŸTÓ ÇNü¥ŠÑÍ)_@ªdÌi€ÙÍ)bð2šÅ ¬mŒ¡`ï'N†ò2ž‰¥¦D# PT¡$nÈ(,b¬‰0€y`óˆM@Ýã:H®sƒ ó_-ÊNNN¦i|þèÑ£Š+~ïÑl#·;XÀ8Š äó[’º`Rq0ÊõÄçÓõ~ ð°@"°-?ÌiaA´’%!Kœ03`ß'|ÂL YÕÀíãŠ[1¥ÀèÓÚ°VÍô®‹TÁTdC§ºôiN!k¦lI³¼i©ãD@Ò¥&§v5>0mn{“&üú+"QzÂf2Ê”1ܰ!0n\ÌÝ»úKi´ýùç|QQÊAƒ¾&‡nl,:r¤VÉ’¦wîD÷ïÿ {iw±X´«,þùsR«V'Ÿ?×c˙ȤKt§õ;*þÜ}À¥[§ºK,,ŒIÎM»:qÀýe%¢ß¤;O¤‰í©²Ý<›,ZðÆ|ëÈ1ÿÊwÉ× ¡±ï4pÍĉluüV’þIf!nýæèŒËã{<ÙP0.Æ› |é 14þ*¯"GA.WuízîÄ ­wåä”MïêàÁ iÓžkDêÖýªØŽáFZYlÞì 7ñ'—Ó£GTx¸ªcGãß×/±o·namÍÜ´·Ð ¾lÝ‘„M‹¥zB^¸ÅºCHÄl›…$=õÜ®<¥yæèr¼ïqþ,˜ñ£Ö2÷*/édLjÚZ‹óU¤J†:R¿ @¬‚‰~ÞŽX‹¹›À‰hÌDL.ˆfĸZ`&°ÞCè~È(F˜Š… õr>)œ/:X_™ ü¦Ïß:lß¾=µeûöí:uúÞ£ÙFn'¹?T®‚­¯I,‰ñ ®!›HT 6`m†¨„AÐFÅpONU1k,¹Gì%üQŠü†Ì}ÍþOp².b Ë9B©’ŸÕ ¤Jj®ÃÎŒ®µc£hàC~<¢Q€gïi>²…™Öv©cø½¥…3å‹3s-ë¤Ø=㇞”-É|W꥚L‡˜›Óµ+£F¡#GF_¼(³³:ecjªç$¯]û¹££q÷îÖC†ØfœÏžÅ5n|½zuËæÍm§M+ó5‡d„L¦úå—³oÞĈŢãÇÛ–(¡Gìà¿‹ÄȈK¼lÛ¨Rho?ï¬ËùoõÄ®¦JHÿ¶#¨ÕÍí <6©WúTçáoÁêÃ÷7‹6Mö1ÎU þË@­?ˆkfWÈùþ×öÈáP«0à’¿Ü£GáçÎýX³æWÝ"2âÉ“Ø~ý„„HÇ/5~¼þÆAéðწk×·Ÿ?+\]  _†ÀÕ5öæMÙ›7Ê;wlmlôÄùé'”J\]éÖ-Åž˜DǾ¦_7&H±Ç'ÒqÁáüÖŽiSì1 ´ŸET}š3¥+€LAÇU|Šfd3†7Œ¦Ïaü£ØÝ…†Å¼aÍ3ÞÅr÷lŒ¦=çZ$J5Wê#èçÏË$š[àeÏ®D6&®â®-1Ð a4…ÑD½EQ‰;–Ç ?Ixò8Æ + ˜|Éý÷ïà ,ý›ebcc«V­:xð`ggg`õêÕ[¶lyøð¡™™ÙwÍ6roëQÀHQÅþ5‰G D\C$e0¼l%qFàÁ0ÕœrÖÇóHNsJq)–Å!J‘¨â\Ëtl÷Eõ¸ÆÚ§Ü02`n+.ú3ó"QIöùЀ+¯˜|P+ÐàXŒîÕßùú1t%Q©‚K1®Wîã>ÙäQI$¢Z-jöøqÄ?žŽŒüŸŠ82Ç?/ÆhbmÓb¶w¿ó×KµÔŠ –Œ|ÙçáêɾS¦çè¨Á瓪¾Ç¥F^—Üþ¨Ì– kÎÁWhT­æ¼_hËéGF©[ûoλÔjÇäR† k_ò®øö~‚ÿ ¾÷n»¸Üܶíå½{ŸÏžmŸmï*6VѵëÝ{÷¢Û··ûJïJ¡POúñæÍøêÕM¿ä]]¿.›7/îÒ%Ù®]ùôzW2]»rÿ>NNi¼+`î .ø"3.-çÝ}=ï`jÌ”þiìã7rÍKSêÔ*¯¹ÌY?T*ëÄf\äJ‹k½«Dorñ3jh½«'±,xõVUB$p#žíáø%1¡ pã’”‰fˆa\„rЮ#;Hâc1—¢Zç;Ä¢ˆÑNž{yõ5[šÓ èî߀………ÏíÛ·K”(Q¢D‰;wî\¸p!Ùú~£Ùÿ.¹6‚¥‘ tPïMù”]ǧ UÆl3ž#oM˜á:ì0¨Ïa3 €ßcXOcþ°æNuža&âme rî3mnbaȳfØ̼Ü{Ô´åÖψ€VÛ¹ð—FÌm '¥¬+Á1ü1Œ.5TjšMåêS´bóØ”Õ*”ÔêÃ×̬a)öÄ$œšñ.žŒJK 5ŠU«(]š»w±²"#<×­.—«Ïœ±iÓF?KtÖ¬O³g-*¹y³B¡BY«6nn/gÏ~iggtï^c{ûlöŽ–5mzüáÃðzõì.\è`júíï•NIQi Êâ%·ì_+Þ*ÚHO¶¥´ÙèV¥‡4-i*É)ý‡ U¨öÝüà}ê¥ß'=bTFФêÁ7›œ)ÿUn?oÙóêx“ Ö®õsvöÕĘø¡h¶ÏóÛo÷wíúX¹²Å_525ýª«ÚÙ9píÚÏ?ÿl½fM1½:2 êêÕÃ^¾TL›fîé©_eìX–/§xqîÿ{çÕÑFñÿ.K[:"R¬ˆ {GE4;–£Æ^±MT,±÷{ÁÞb‹{ï,AAšô¥l™÷ U &y“hÎo?è3s/sgwïž;sžóÜ'«ŽùU U¿"%•kGh… û¼¢vOÔ®mÄ1‹¶íÌZNAG†÷R*—ˆMÂþg"ðŽk5€‡aÔòD&åÙpìÌfÜcê]jZp7ãwÁå¢YšåUZ¼äL?[3Ó†Í úÇRNÆÓ¢Ä€ÄÃ-¨ˆºIê8ŒFa¸…w+y[ý8¼&Î+^בhM¡êý3W°>|¹+XvÅöã÷ž”^X™£íCâb*¡íŠ^ b) Z0€é ã ‘K8ÌC%uä´2!A“¾ˆÕ¼(ßZgn¥ãkPÒïH~}•™û5Xz“ XCÝôú ¡TH%l‰¾›Ïr(Kæ L ωH¥ÌÛ³,U[ôõX2`Òáò¸n>¬âsÞö Oµó‘ͨãî;¾þ¬ôïÿ(¤iØ—µøºµË‹»úl¸››]™§ç+Œùöé–B²«W=Á|päÈë#®I$¬_ïüGØÕ²e¿þúÖÈH¶woíB²«%KÂÖ®ÐÓ“Ž[ìc.}ñ/^¨d“'ç­.8z”+ÐÖf÷nrd‰¹O&9…þݲ±+†ÁsPªø¡[6v›È€eÁÌžéì ˜w’Ȝ˥³+`ìi4‚ê§³«·‰,x°´A:»Úñ– QXê2£ÀõÎÄa¢ÅhKÔ07`ª!2˜ñÐêÁRn’jŽt q¨ÓœEGQ\ ›x&@!ÙU:þ1¥r>'|¹+ õ±JFµ‹çr¤°–ñV‡‘ v£DÕ ªÂkØVRÜäÒÓ gÚ á„«–8`(cw†Ú].cV]€ ·IPÔµ¡k’UL¹>€A©dÍ‹0Ö_I”·eV/€akˆÎ’!X¿ ;’ªdÈ\²>th‰ksââñ˜íÒtuÙ³~ûÕÙ´>`âDúuµÕcÆäí­£#Ù·ÏÎÞ^×Û[Ñ»w ¦K*•ìÜY«T)ý7¢'Mò-øêf IDAT€ÀÖÖàĉÖffºG޼>üߺ»”²ú¿g…–PÕ½öÓÉÃîÌ­”‘€ö±IÊågüìÆê½þîã‰Ç÷¿iöÃÇL{eö“Íà“¥Ú&HsjÏ‹ÇvóÙà‘“"K¤yßQÿŠ<Á¿W®¼ëÚõ¬Z-æÎ­×§OùO>ÏíÛ1ãÆ=“HØ´©zÅŠ…ÒYž8;vì[‰„K5h÷ÞÍ… ©«V%ÊdlÛfª§—‡´4(ˆ>}‚E‹rfî?Æñs˜›2wb¶øê}Üx„µÓ²oº¯'8Ç üØ1=ò6†åç‘H˜×)=rògü1ÓcBÆv¡Ç-Ut±ÃÙ ^•ž~¾ ¦Ú“CFYb.c«‚—*ÊÉèªÏ;X ø, pÇÐÉ&BãP5À¸Æw@„!…ÚmȆL±çÏ _:ÁêGE’Óÿ-EK ûšä£DÙ!ëŒ\ ‹HÂ$fB*x"—p(™»JjËikB¢†Åa%ôIÓvõ!Eг¬x›ÈüŒ Ð9ÍÐÕbû#î…ȤÌê0í(qÉøøø£:и2¡ï½Öä‚°)Êå{lÍn¾r6r¶ïãBöäeË’V­òÇócÉdlÝjª¯/Y¿^qüxÞj§"Ed^^ö¦¦Zû÷GO™R¨ªÌææÚ»w×ÒÑ‘.ZäwàÀ§Àqp0;t¨…žž–§ç³¹s|ÀïDÚlÿ]°®U7ÿe¢_ô¿¿lôõ)Žo.i‹l99©*ÍöëAU>[¾û ·zÍ77køÏwÏú{g»@h„˜:lò˜w–:Nó¶i¨–d[SÑêêawFÜšå~szíÐk9ˆOV­»`?êÐÑ0wQ#=U’SЙñWÆõ|¸:·­FX׬mçÒÂuõ¦¾çn¸¿z×÷Ü ×Uí\ZäÔ_?}¶CBmÚœxÿ>¥}ûR+W6úäóh4¢G{Š´[Da U¶ný*.NÝ­›ùĉ%d£FÅùù©kÖÔ?>ï%±qã¸qƒ’%Ùº•æÓLíj ìž->r1ñ|ó›fc²`NoJ¤ãµËl¿‰ŽŒ™©ý[rÿ¥M^@À˜›SÒFOâYˆ–„•U€&¼¥‰!“¬0Ób«5åetÕ'Ö¦€~!ƒ¡’U„¤ i…yEä§ zM|1äm(U˜‰ý5¾t‚AÜ÷”7@æMÄ}"šc^ƒ”» ·E«r ,$Aš¡Äš )0ÁC ‡“¹£¤¶œ’:ø¥0,@GÊŠ*Ó_¤{»;ZÒÝžd5ão§ÿÑ)M0×ç”g2RuF"añ¤ËÑí¬Ò]U†­á}–<¿î­hÓˆ¨XÆ-Ïv!#¨P–§/Xšk#â—_¨U‹W¯>*Æúé'ggµ»ûG·œš77^»¶$0|xÐ… …*‰“öx£ìÔénRÒ§¯§ÝÐ…`ðà+'NòyrÃ$Oñÿÿ ú¿³þ°å”VCúçK£»ùlÈ]C:Ô°ø~‡¾s/\é+Ý=bø_5â?†¿w¶Ó¦¯ÚÒ¬Á2{«-Íl2|È"¯’?¼õ~@.¢…"¬ýóS.êà›‡1lžøsËÝüü¹³—Ú¶í‰×¯ê׷ܵ«ÙÇêÒ3f¼{¤¦j:w>ûàA”ƒƒÙñã­ÿHJïùó‘³f½”J%Û·×(LбFC·o'–)£{à@Y]ݼç?6V +³fU©’Çð‚ƒéÛ!X° §ô :ž”T÷¢~­Ì "™áóf¥x–ô^·Ùq¹.[G§ožsê &úLÊxÿ—Ü (–Vt­ ¤âç;sëa¨ °ã £(¦Ë´òQªtõÕÒâJÙ¬ @ƒŒ.úé?:iJ•Ä€qÊ`9o5ð–ÅÑMËÖª€i#¬Ïð¸Î‹g8š¿àõÅãË%X–˜ÁDÝàeÊX#$îÁµ0j€qêM¼+‚´?Àlâ%0Èx˜ð0ÄP‘dî()¦ÍL[÷`4¿TÆPÆžNFØ0¶:À¨éŒÊ½>%MxƯJ‰¹ß “âõˆGæÏR ›Ý1ÔcÛyÞÈyi&ôC†ÎÍf‹ÕÜ™ïÚeŠ ²ÂÞžõëFâþýhË–?´ø4gN½~ý*(ªöíO½xñ™” Îßÿ]¦§oR²”óÄén·»Ì\`V¦lÚQù×VIµ¨«üüûjHÿÛ“©5B ØäUØÑá_;¢–È«»²þÏ˧zÛ4ÔH³ ­ÒëÛܘ<üö‡\逖¶,BüyÈØs@¼tæÌùñã­ÍÍóös) Þ¼IîÖížZ-¦M+ߢE¡ŠåÿæàÁcc-/¯²E‹~”جnÐ@gôè<ÄïiÒ«¨(\]qwÏÙºëç¯RÄŒ™ã²Å'¯! „:ŒèšŒŠÇm%ÀœÞ”³Iª4,8 0¾†‘ \XÔ"=UpeA{€8ã}fhÛǾ!REsc¾5C ó¦!…YßCUØŠ"u%díпGüubåhõÅê=ɇðúã@Òiæ|V.ÍÿF|Ñ6‰ÄMxš"ŸA·[„-ä¾)ºëøê Ê<ÕB²ÊFh;ƒf/æÐ­w`üãâX˜ˆ«.^æh ¡/·ñ°bž-À¼WLð¥œ>MЕ’¤¢Ò^^'°© ý*l}HßCØñb$rm€ù'™~D]¥„ÖuôêTÀ²#ŒZµ9Wbžáê’ª¤fžú3Í©Yr[BèèL\<ǶӦYÎë:”µk±·ÇÛã\ï… uë÷§N¥tè wèÐG«^$$hœœ|>Lrv6½¢@r²ÚÅåæÑ­Z=v¬ž´Ÿ´Í›£ú÷ÔÖ–œ8Q®Y³¼­€#G’;tˆ–Ë%X”+— ûé'~ù…%¸Ÿ"Ù­Iã¨äÌÛwlZB¿,DêÑKêôB£áö6jeщu_È®Ë4ªÄåù|¸‚y'™tˆ¦%#޵Ð×øá+nãZ¯ïÞ$RaI*.·ÇÉ `Ô–ÐÈœ+ ‘Àõœž£-á‘ôX«`h,•e<*J0”5<∆„G ÙŠù×èöÇׇÄaØöÇjÏ섵µwpù ¾ë$ƒŸ“{ß¿€ lù¢ ÿ¬9â@ í¨Ó–Z\{Fô÷”ïNù)ç}ŠÌ ô æ_ícXxA°?Ph° '^pË‚zÚx+¨ï‹¼+QMŸT 5.ó,y•ð( °ëÝÏSLŸ]1ÖA#¨»ž{¡Ìÿ:}Ç01…ê3ñ‹`V‡Ì¥fÀe"—Óó+¶ÿ˜9ø«p„Ž6vR±tf|ÑÆÎľ4>ÐËþ´™’BƒÜ¿O—.ìÙ“Ç„¼}«®R%2&F³c‡iMz QÖ¯ïûæMjÿþ7JM9pà£çÏ^¾L¼p¡A¥JŸþ\• 3榧ç³bÅômU§ÎçY4>,)]T­ÌCÝ"Ó»mÛøcÂÚD·IüC‡³+s; ”oÛþ]×)ƒwø|Œüó‘¢*?þthL²©$eNÐÚÔÀçYéã˰„ÑVV•RjåQ߯&>¨Aðù:!×eš‚}{ì[¶í¸iç_pÿD$%©zö¼pà@@Ë–%Æ«îâbSð1Z-zô¸ïç§HJR_¼ØÀÂ"ïÒËYqùrBóæ/RSÅÚµ%þè×<2RS¥JDX˜fÅ ã#òX¾:vŒvíɸx‘† s¶ŽžÊÒõ4¬ÃÕÙ²w†F¸éÃ=X<:³óá[tœ…\—‡+°ÏÚ? ¥ölRTœIËÊþÑTZ…ZÃ!T±èvŽ=~t·çW€ÇñÔºŒ¼Sݵ Ž/L¶f† ©‚ ªùÍŒÎz €MÐ6Ã_í£Xœ%zþEÑ>@•0ܹ"E²Š&”3Ø'5’A¿`}ÿ0]_4ÁàKÞ"LCgÓ<ŒCÑ ìÇ/’¤¡Øê 9I”/ŠX"}€ò4Éi&oïÀ,¤ 3˜P[Ž›*Áˆ DµûŒ µ{7{[–Dšá€Tœfs¯•` Ëú^H$L?Š÷ëôJ%l…¡;.pàzæÈjп=)© ™“mÇ} U*ò*E¹äVººìÝ‹±1{÷²n]³ak«µh‘0bDÜ›7Ý´±Ñ>|¸¬tÓ¦ÈÅ‹ ¥ˆZ»¶ª®®4,,¥eË[ŸžThh¨½xqƒ¶mK†…%5mêuìXÐ'Ÿê_йgå_C:46e·¦âlçE‡+vÖÏöïsêÔø_ï“ö?‰KúWšÎ=ü44&ˆº”e”II‘¾O}ï_üäzýWU˜pú˜(—ƒ]I„(õ´ßýe£nLs|s©0슒†ý¯Æû÷)-[?p ÀÌLw„]õìyÏž?¿Ä½{k†]=žÜ±ã«ÔTááa•»† ‹ Ó¸¸è ž» Nw½š7/vu÷«¶ “±z^¶¤Â{¸éCI«l53"ã¼`A¿Lv¥ÒÐg3ÉJ†6IgW€ÇYRÕô¯™Î®n„±×}s2r Ó´í#KSÝ`e”ÔÁà `Cj*Ë複lmøâЬ#˜ˆ±±†·€6úH7ñLƒhKi ~ã†39“a †ø ^_<¾t‚Uë”NAy„»1k€U*ê¼°F§3–XÍ[9’0æ¯ÉPbÍ…k€‘„ã)ÜR̵ÅZ›+ ìˆhfAjÆ>ÀÒ†H%üòˆWq-ËÒÜŽ˜dæd¸Œ~UáMQª°Ô ç£2ŘÝ`øÚl… ܱ4çÒ=vœÈ jk³v>_5dúb.g±xHÃ1–»{Þb¬ämÛêÆÄhú÷ÍçÙ£V-ù¶me¤RÆ{sèPLó,“IŽ©Û´i‘àदMo~:Ç20>ÜÒÍ­Rb¢ªC‡SëÖ=+ø˜Ïù»g¥É³FÜš5ìÎÜjaw¤"›œ.E¦wµdó¹N 7Õtm’^ûbé¶ÑB‹KYt2gñ²iw‹ÛVþcx´øD¦Ç¥Ò­"åż­-n0suÝ w„uޱ®*ÅñÍ¥1×'¹y/Ì*´’H¤Eªä3ŒÏUÞñ¾råüÂ×&M eU•'„`ÈŸÝ»CŒe'OÖwpøèNß|xvêd:gŽm>=wîLúí·dɺu¦¹³ U*¾ÿž¨(Ú¶eô蜭 ‰ôA%{¦þHõ,l$4’©ž+Æa˜eË}øÂbøªò|fçîkÊX0ï›ôÈ­·ìоŒ)M4÷ëð¨NZÙúmo¸E1]¦–S2-`eI ¤¤ $Ì0B ÓA} ,¬ 1MSt¡s€ˆ RJ¡×ž"Þ„ß'Âí®Øûò„`9:®d‘ëÿ‡¿_:ÁR¢ìŒ£ é5žÙm¤gyãGì@¬‘]'î6q½—BËÕ!’Ú€#DÀZ("%mYzY"€‰smƾ%M¾ØC¿…r" –½Ê‘ªaü­ô,lTÂÊÛøE\½zu~'ÊYò𠳳Ц®4©Â»h~ȲòdnÌ¢Q£™…ä4ª‹cmT*ºá].•s—.¸¹‘œL×®Äåe˰~½©¹¹4-í9Ÿ©ëÔÉtÖ,[†îÝîÜɹñ”r¹ÖÑ£õœÍƒ‚’š7¿õöíGÓ „––díÚÆS§ÖV«ÅàÁWÆ0Àøø7–.¤{Vþ5¤Ÿ­±²þ¤Uõ&Þ,ÞôR©–š|•þ¦çH»û°,t ×wŸæ¶õ ³]˜1 _~&…L­ºRª³¸áÌÝU¾3ÊYÅÅ85¦¹ßá‰W~úöé–ÜVò¢–=¼Î~6öOþl?zô¾qã#¾¾1Uª˜ß¼Ù±zõ¼ *B0l˜Ï† AZ^^õêÕ3-ðIÊá>†ÐPÍÈ‘qÀÒ¥ÆeËæQig®]£D‰<\¯€áñ}…ZóÇç›À·.´wÎ ºÉÞ«è±~D橾aÎ ¤6÷ÁH/}ÂÇœFÀØF7Øö’;7`Lu€8ž,rH×¶ÿø†5íMig°9‰`5ÕµùF—° ´a"„¡ÙD¢Æ`¤@³‘wÀØJ` Ï€®”3D{?7ÖÔ4àÓsþ߈Ïd‹4((hôèÑgΜš7o¾téÒ%JäH 1f³bç÷|¿‡ëçy\›Ñ¸®çɪa1Çͼ[ÅÛòÈwPé7£‰-‰ÖŠžGÒ ,ÀR5ôŠáD Í訇€f/¸Ïð¢¬, °Àg™j÷°$Êï!.•3mùÚ Ï!¶=¤{U~Í(°pÝçEHàºuK§¨6‚„döO S–åîæÃ8{›Ø093¨VÓâ{Î_Åʼnӻ²™»ÉÉ4lÈýûtíÊîÝyLÎÎI=zÄH>,šçÍë~½n]¤ö­[‹/xñ?.NÕ¼ùÍÛ·cÊ•3¸t©¡µõºlÞüÜÍíŠJ¥éׯºue²/âáЀ¯NýXk¹Öíšü<ãå ¯—'…Þ»#4šD£Å›^/Ñ,^·à ƒ^ KnT§0¥Ã†9‚Ñç>xð@.ϯԥ…Ä`š˜Ö›ÞŰù™Ý‰¤ü@ëRX¹q>å4êUÁ¢OÂHƒ]3Ì\ˆx‰j&½‘;ذJÁˆXJhñ´(†ž$QójÁõŠÔ7@%¨uŸxæVd¼=Àìûü|‡êEðî„–„·ñ”_A’’Ûƒ¨“!uøé7~9K%kîMB/Ã7o…?¬£¨ Wa™ñ[ù2ˆjÝHQrn _ÕɼÀwáÔlÁ»pfy0)Wrò«WÔ®M\ë×3p`óÓ¥Kôo¿%»¸èœ=[äcæ~€R)Zµzyþ||Íšò+W*Lqbb”_}ÓÛ;¶BÃK—+ö‡8Ö‘#¯¿ÿþœB¡jÑ¢ø¾}ÍŒ~®TÉIÇp{qìHî¦òmÛ·Y¾îCU–Äð°W§ŽŸð£•Tû¾µã¥R-à óÛvJé¦èI4‰áÙÔu)ZzšìÕcä––Úúr±IJ„P&)ÔÙË(¥:*éßùvh uÕ°»Î§KÄùØù›Í»¾ÀaË–nn—•JM¯^å6lhRÐ|àáñlÁ?]]éÁƒuZ·¶,ø˜93tÊ”CCé•+jÔÈïî½i“bÀ€XSSé£G%Jä||ó†š5‰ŒdÑ"~ú)ç±}©ßE[—Ñû»ÌxbUºŠqŒè’ÿnû®áR³³2—¯&fÖqì,x8C]•†jkxÉê¶ ­0ñ6sàhÉõŽHàq<5/ÜmLucT‚ZÏðIb– “¬ƲQAs]N›óª‚6¼P;¡Aœ£¨tä±õ*TDo0Þ“2ŽZŽXNfo4 q©I鬸Qòã#ñ¨*YÊS‰„Ž8ô9Œ?‚Ïá‰ýúõŽŽŽ“&M233333›4iR½zõ6lØÿQòŒJã§9­N+j¿qCŽVšïèFžÊ ÂXÉ[ b FÀâ“SXñ0TN}m‚Ṏ¨¬Ï(K40<µ@&aeU$0ó%iÒ£ŸªQÚˆ‡Qlz`kĈz“EÜ2ç*Ûð,4›õèpWšV%"–QY6 ˕̴ÅJɲdeɯ+ÑÒbÊBÎåÚ.°·O×¹Ƀ¼ªü­^mR¬˜ôüùÔ•+óÛþÓÖ–üö›]ùòz÷ï+ºvõW« þ:™šjŸô4°,V½W?yÑ¢€L£¬ûöÊO×'¼·¸|Ô“Ü&Oð:E÷y²þãÒY_VQò¢Y_Á Â?"10R¨ŒV¨„N’Ì ëëïeWUÂîM¸2¶Ç£µ%âü¥R-ÛºŽùtþrôUÃüùúõ»¨Tj~ø¡ÊÖ­_ýAv5i’ï‚~::Ò}ûj’]íÛ=ujˆTÊŽeògWoߪnj‰V®4ÎÍ®T*ºu#2’6møñÇœÇ&*è2E¾ÏÆ®€Ÿ×B]†vÎ îºÌ¾kËÙäžÉ®î3ÿR [ú¦³+`7Ï")_„µâY⃖5D’¡mW ~(“®m_†OöºüT àŽ’Í t$¬0˜ pƒ°ˆx%â[ôË#[OˆuSLk`xÿ÷¤”ÇÔ ›S<Œ&¡4–u°¿Æµ8â€*ä§)üÿ|ËËË«wïÞY#½{÷>|øpaŽ5ÁäïóØ…*–‡sí(mA0 gnO;ôCH9H„+z5ÑC³Å×Т`9Ha• Z°$‘‡J€i6”ÖÁ[Ág T IDATºHgó µû3=-Ôøù±©œ(¢Ï¥×ì}Îftelì–”§¸ú*}´i…FúìºÌþ,…ãûR© Ï_³p{¶«sqbü4z '4W¶_×® Hr2]ºŸËýÇÂBºv­ °}{òãǪœÍY`n.;~ÜÞÂBvìXìĉ…ªma¡sƒƒÑ£Gq_}3:ú%¯Õ«gyãFÇråLî܉hÐàðË—…µ!ͳ:ã¿…¯y—U/ATˆ|<È{‘ëó¼ö†?#„•0HMHû·¾EÑïvúlôU…Aá?Ûjµ2äÊøñ·µ´$«W;-[Ö0ŸëÂ`êÔsæ¼ÒÖ–üö[mW×b…9äî]EŸ>B¤[çÓS¥büøøèhÍ7ßèåi%3q"×®Q¼xÞÒ«axö’ÊX>+[üá VîA¦…ç¤Lö²‹úS*ƒ%¦¨è½ ¥š›Ó¸\z0!•—0ÿk´¥co’¬¦WyêYl N×¶O)œÊ¬P€å%Г¢†Á±hÀÀ 2ÃÐðCu$mÑ[R)E2 ›÷$Ä€C¤Ï—¶dn€¡« ϸ…êh³v ³6ò<Ãß! 3ÆÒ̉°zŒ@ËxaÅ jÔàåKÜÜr6;êMŸnèíÚ¾ýûÈÈü ”-«»YÉ‚ï֮ȧçXZêž9SßÞÞàÁƒ¸¶mo'$äÇá DٲƗ/·«UËÂß?®qã#ÞÞ…CPÐáò[¯–Èn”pù[“=U’¾*1÷Ë(%¶ˆ""Ï—M|pñ¸À/“”èüÿD”¼èµéf»Ö5k~Ùïó@!?Û JWדžžÏärÙÁƒ-†ýýéýÙ1wî«3^Èd’;kµo_(võúuª«ë+…B“VŒ+ÿÎîî±;v$u쨛öø—'N°h2»wca‘³uÃN¶ý†œ½žÈ³¼áj f¢R3ª;5+dƇ¬&<–¯k00˓˔#<¡¢3²Ðõ×K”8§C€kï8€\Ƭ:q*&ú,vÀD0*˜ ß™ÑÚ`M"÷•”ÔÂÃ`2h`ØÂ\âUÐy)´VðV‰è@;ôwð"uC¬0?Äd”5)S«sœK%µ"…ª¢ ÉÁë‹Ç§W•úç ::Ú<{õÎ"Eм_¨â¬µ´j º3èuÂëÆûß\q«ýÕ±¡199¬½žcE's-8E ½ORµJzZ2ÙA"{R¬rl’‰ÉC1¨£gjºÆ‚qû5ú2´M¢§>Åž\mcåô^ÅÂ0úEû”,Yrr9“õA¬ BþâZ§F¿4 Í ÎûÇú9˜”5fx=6ÝSH”ËnëþäpõêÕi휎>ÂTÎÛÂçuÖM+à:¬ ›NÄjë™ÌÚÃr·tËfçZôm‡÷SõO‹â®HLkÚ¶‚Z-HˆOœ½TkÊOzY›ôôص‹ºuUáá²;éÞØØØ   ªUÓwîœÕ«WA©¤gÏèÙ³CìíK~("›Õ*úêÕ«ÎÎNk×–úá‡à-["ŒŒB{ô¨–»›OÉ’™gð÷¿{áBƒ&M®+•¢Y³s—/7×Õ•BÎ1äs†¬M¯^Ý»|¹}—.g½½#zö]+4³B“Ž:EKäA‚%Bè+óÞ–•i”Úš¿¤â«BÛ`¾Óü»+Û®Nè5ƒÔø²í;ùøøT­ZÕÎ¥…K‹3ûoz7ÿ¼3œ8qiΜX•J)¢÷Ë/e3—Ž>m çÎiŸ8ñ^WWºqcu++?°.ð çÎ]]° ˜••võêú#FÄåÿ^,_žèã£20àÛoÃ,-Íst cÊ”D++ýÑ£¥iÂö¬gøuϽ­{k1cÉtl‹ÅúødŽÁc¡Ÿ¡~Y»âLsËœÉ׉IÀD_¹É];m%ìêÕ«z%œn`.geç„W¾igxùžƒãmŒŒ~i‰DÂÃG> ÞT¬d¦ý}YJrõêÕ3–NeäT0¤dÀUlÎÅ­¦¨L¸%<‡Šá$STºÂLÇ@Â=x›˜h£¯?N*õA‹0KUý cä‹"•Iª¤cLB S¡Ýà¥4´|ô€‡ yêøÆ=§êÐfe‹JÃÿ¡ß¿4|4ÄÄDí,%Ô•J¥¡¡aJJ‰%‰FhØÎv=ôÜqCìBë¡=‹ï_“8ÈÖÓì%Én¼0BëUŸ îD”1ÒÛ}„´1˜B˜Â®$ºÇ`%å¹%Æ^%Så)JÁJÔ’“ª¡Úež'°º*CK ºÌ_ºØ±çk€3þ´ØŽžŒ{ƒ©”ñøu'ó‘À‰ÔÈÈŒ|Bõ‘$+¹8çŒ}öÈ*~KT,{æÒ¥y¶+=s‰–ݑɸv˜º5rÎÃÖ­ôí‹™>>Øæ@‡†ª4ˆzýZÝ¿¿|ãÆÒÐ&Lx;oÞ»%t¼½+åS;,+üýo¼}›Ü¥‹Í®]5 SC#(•š1cn._þXGGº}»K—.välŸ ²êâÓØ‰B;cƬÐW)<®ŽÏ¿tÌß…C{\+ùuaz6 :;¶L\î„ÇÿœÐ²åñgÏb*U2;r¤…½ý§×°JÃïºtñÖhÄÖ­5{õ* ‘âú÷ܼ9ÊÁAÿÚµ ¦¦ù%,Ÿ:•âêú^­æ·ß̾ý6BÑ;rø0®®9’ss0%•®ÜÌ^¬ÉÎÌÃÞSñ[bâ9²„vÓƒ ÉTÊ›HÖgp«ô JCÝ9<fBkætLjΛ¹ÌàÚ¬uøõ=ÏSÒg]ËðWPé"jÁÝÆÔ0F-¨ù Ÿ$gL1€þ±lVÐA´údíà(xÀ<èCô’‡b8£yu™Ø^X¹c;Ÿ{W iK™!T^ÃéºP¥+ w±ë/êS¿­$’ßñã.‘Hhõ0“ŸÁø#ø¶ÍÌÌr¬WEEEåXÓÊ ±À6Ûag‡]2ÉW¸bO±j”LFy’ûU(R“¢‰¨áW £ºÅ£ÞE˜#:NèÄ¡YO¢| 1°€nú4Ñá&ÝÛÝ^,ÑÀÈàto÷9¦>'N0½2öúsí@s;Ô$YEÏ(3väê–fäW¨4¸í@,gƒGg„`Ø”Ë ¦Ìྈ؄lÛ¼ £¡Tòý0â³7}úðí·DG§œÏkk­ƒÍ $›6)–,)ÀïjæL›Æ ƒƒS»u+”à°³38y²¾™™öÞ½!#F<.Ì!ù@[[ºtiñc«§¦jºu;»t©OÁÇ|ȺAv¥NÿÙ$“Ÿ±Ë[´”†jÝ{×>Ê¡s7-OOæÏ2=ýzÃGÕì“Wv+DXÝ,ñU!Ou³¤K™‰Kþ¼¡}&ðõqr:òìYLåÊfgδùãìêòå÷=zÜS«Åœ9 Ϯܼ֯9J__ú믥ógWÏŸ«ºu‹Q©øùgÃ<ÙÕæÍ>Œ‰ «Wç!½š4û)[š“s6[FL<­f²+`úNÞDRÇžA™&q,>Ã`JaRëÌà/7¸ŒµazYŽd5“n̬ƒ\0Á—T }ŠSÃ`]$>IØé2Òà®’­ t$,0¸ ÇÀ~”gI–#Š/Š+Äê#íE±@⯪ƒô;Êþ@]d­©ñš×/x¡ƒNcpˆ$8Ÿ)ýÿ|«råÊ>Ìyô葃Cb^q; ÿ´ ¹ÍíXb;RO‚ä"O"‰ïE ! –”¡Ø; C5#`=‰1hf@Ø •&È`y">*€ÉÖXis=ýѬp2'"•…~6rFWs3=§ë;ã%M¸Êâ,öÙ)cÁ@V\È ŽïL[ž±4K¶þÀŽ4¨Æ»(fæÊ¡œ;‘•ñ dôÔ¼üzzéÝ´pé•a›ƒzÉùõ2Tmî\Íî‹+XI¾ŸmoïHgç#AA õë[^ºÔÎÖ¶`¶??ŽïØñNr²fèÐRãÇÛò¨‡“Ü݃5kJæŸ6øþ½¦]»è˜M§NzÓ¦åáÿæMºêUä6@¼tƒ%ëÉØ±£ìuP¯=dûqôuYå‘|Ä2/¤V ͬèÅÌcž=1ÈÈ|Å” «ÛòÔû*°ü1¯¨^„žånÇð[úZL+§&í¦¸°8º40< Œ5 ¼ ÀÆ€%,"^@_ ,®%DÀwXš#ÛŽ¯@´¥Lôr[À×T3Bÿ,g'œôÑ»Í œ‚ÝI2ñŸë/Àç@°\]]·mÛ–5²mÛ¶öíó{ø Hˆ›üV Ë*TQ¡ºÀ[ÌëQV…æ8÷ÊaZ—bɨ÷ãW Ãz' ÞIxtœÑC¬'±‡'0€*2Üä¨`t€‘Ómƽ%Y°Ø ,ö'8 À£:Vrn†s0 eÓ›: iñÉ0a—ë°ê{€I‡ˆLêj³bÀ´fô”JY;™ËvñðE¶ëÕÕá×UÈõÙ¸‹=¹”ŠM§VcÆð2g¹€Nô¦N5ÒhèÑ#ÆÇ'?Aº••öÎed2ÉìÙ¡'N6•©I“"{öÔÖÒ’üü³ïÆ‚öÜݽʖ-Me2éüù†¿ªÑ䱜öAŸñå ‚•QꆎYyÉÇ^Ê5­ê)–ð6÷Ir¤ÝÆ\¾þðQm‡Ž(Õ¸iýa¹<ÙráCÉ?×U ŸúWø´Ê/ûl_¼ââr4""ÙÕµä… ®EŠä±ô»ðæMr›6·££•;Z­XQX_€èhu§N~IIš¡C‹ö铟©RI—.1/_ªÒór{» ÁÀDGÓ¡=r}£cé5†écp¬­I­aø|„À£v¶™gé‰RÅÐ6ÔËâAê¶Äz;Ò"ãÉ]#x„$ýjб"NNNÑ)̰°~:3›à‹€í(¡0=”0%Mèd °^Ám%ŵ˜`°΂?¸Ã#”gI‘#‚Á3׈ÕGÚ“b/‰¹C˜²o±{B°/!rt¿¦êSž¾á!†Ž8>åR,á@E¾¸ûÛ? ŸÁ4hÐõë×çÌ™={öì›7oÌÓ=3ô1Ã?‡.¸h¡õˆGïx׺2¤7xJt/*J#0Šä!Ø»C5C`‰Qh– ì‡cÌ2ÂBʹö' ´ ¶œ€–„Ô3¥³5Ij¦½0ÔfJ-€±·HÕ4+àڤ¨és0s£°uºÔA‘Êð]™ƒo^ƒïœP¤0fcf°Z9†vƦ(S_ôõj¡Þ+¦z ·Çâ|’Hš/æOÓü„_ŒH)6ž~",HĵG;ŠcïDâ#‘P[Üm,î½Ê"ÕF„Ø‹ÐH¡V Q]„˜&„B-D½Aˆ˜—þ·:¾Ü2¾]î^¢eÆ7öp ÀS˜oWî=I‹œó’iBg¦xø.sÀë. Ü„Õñ>13¸è€ÀU”$’R2ƒ·ŸG!©#œÏyÕᑺ†ÀZÌ_•Çœœ>-$¡«+=Ê£U¢.^< BúöÎz££Uvv>pwÈ×ù÷Ì#|ÀËÄäÄDZ¿ëÀÁÇ'ÊÆf;xÖ©s <<éCüÑÇ.ò?|üÎòÚo³‹ãÒ²Å6»8z ëïwîÔ‡Ö³çÿð‘c¶çÍ»/‘x‚§‡Ç­?åü*•¦cÇ;àU¦Ì¹xRVœ?§¥å-•Þ=~<&ÿž§O'Ëd!IÈŽysn¥RÔ¯/@ôë—GëËah/°;ælŠŠ¥\µÅ„•ÙâÃ×\…Ó8¡ÉÂ?{l¸ —_2ƒJµ¨·^0M <’Ù­ÕþB¼ Ï Î¾,˜&l‹èŒ‡µ[aBâ)ô7Š x!„ˆW «Ó/q T!TQí‰à®˜*„!œ#!â§X!„P á(BŒB‘õ¹ý‰H¬“ñ<ï-Â]…WwqJ!”—Ä7á9YìV õyq~š˜¶AlÐÍ9±ÑS¸U"ù?‚õOÀç Áú4ÄÜe^iªÙR1™„œtÄÑã0žð¤%5 Ð}Æ[_Þv§¼’3¿%q(¶ØMø{Tã0’À&#Ñ8AoH‘4С—>)‚±ñ@z^®F#ÀL{€±ÏH“_Ï«‡¶ûëúÇ¥pa ìÍyðŽ9WÒ# kº£§Íú«œ÷MÊ´X9‰„yûxžEY5ê{¾ùŠ˜xºŽÏ)ÆjÑ„ TÒcx® ‹S®÷ï3{vÞS—5©ðèÑü$VÕ«ë/_^:4èÁE>=³BKK²}{ÆÍß¾MnÝúöû÷¨NÊ”1ºr¥}E|}cùø¼>Xþ‡ÿþ›íÿ'Òf[­^Z´è‘ŽŽtçÎfnn•þ”“Ošä»iS°\®uäHÝ  >¥RtéâªlÖÌhòdë|z˜6úç¾1âåÅÜïv϶`è$ fDpkoÊJ¶%¤ŸÎ­k9Læ­TnJíõ¬·a»ÛkQk¿ÝM{o¼Nò+àϵ”8oÀqÓãæ °<ÉWG<¬ T«K ¹;ø­ MªP%…3æÜUŽ€3ÄïáÌs4ðÂcΓñÕ °€¸$ìïÔŸ?È>‹£"|À;U=0 «ò$"\’ ~ŒhðѲï܇µ˜èê£x_-ÞhŽÝÉ+¿asÅ>Æ!‹å‹—nç«W¨̪ÝüyÉX.ˆù_àãÍØŸX\@C ðõá§ð÷cò\\¡ÚЦ ヒÝN¯^dÞ…¡CŸÞ?=]O>Y̦Âï¿¿¥qcOOÃK/±ZK*ì[¶¬×²e-n½ÕÛ¶”çžÛe·_Eàrå|V¯~â©§j''[;vücùòR!¾RüßDJŠí‘Gþøõ×Ó*ø®YÖ±cÍërÚ%KbÞzë€ÁÀäÉ÷têTLßÀ‚˜4)~Ë–LÂuŠîñ0`@þ¶Á¥K ß6|ò ûöѰ!£F]>”œÊKp8ö­Ýu’ÓxöCrí îEç.ÙÓùxÀøW v ríâÛuxz0í%¼]»ñFmb‡…[Ë2ÆÕ*ãL:l#ÇÁóu öz”LO‡p_€O£‰Íå¾@º•ˆHÇâ /ú †èOƒ` iÍð~ƒ€ŠxLÆ÷Ü.‡C£GßÞ»w1ò 1cFâ›ož3›3çͫӪUQº¦&dNœ˜åçgX¼¸B­Z…« lÞÌ7ßàåŬY”¹B ôµÁœ»À}Íùð-7»DŸáœ¦ÕÝ|úšÛÐ3HHËW½ÉƒÝÉ+³±;y·¡·æ÷Å2â/ 0ùI‚|œ¢ÏŸ¤çòl]B,›€ÃÌ<·!¿iÇI+ßÅáãka€Cv&dâãƒ1À˜>0€ùdmÄvÇ+ì#s+ix¾@•XN‘VÿŽÜ²’=™Xo§f#j¬ag(¡©°%@(Oæ’|ŽÕ†R†ÿ¸Ù¬;è g¾7^wñh+¿Ô§~mjçId[U&8–”­œx–>xFb9EZ?ª`!ñIä%8õXW‘ã߃'|ûÀ Æ|–ÁžÆÕø<†è\ ðÕ£Nkøo§;zÔ#ÓNï ùܬ2ÞÌ슧Ï7²ÃµªÃ«m±Ùye64ãUC¢“ølžÛ=AÆê߇°G.iñ„¯/3fàë˶m,½"ŕÒ%jÖôÜ´ÉöÚkEiŠÖªåc2Õ­ZÕû÷ßSŸ}öTnnIc¥úõL¦æžsæD z´„«Š†——Çôé~üñ½!!¯¿¾é…Öed\šW)ŠÆM(ëú¯`É’3Í›/>zÔÚ±c­ÈÈ. –+~M °z·nf«ÕùÆ· T·ä .L~õÕ³N'£FÕèÖ­¨‹Y½ÚúÞ{iS§–mÕÊ»Ð9ññ Ž¿?ƒÓ²åå£S~dÁRÊ3÷;<ÝcŒ/çðÛŸ”w§^›3c >^ùºÍy»†g¹µ"Ã\’mv'/ÿ†ÍÁÍéèºûï²ÁBe?¾m“ÿç=èvñúmÔ…U¼\‰Ð2陋 ¯—¡™7NèN çHÒ‚ƒñ˜„èA•@<çq xžúYä¬ã€ºÐìŽpÄŸv´;ÌÆd,ÁTºƒ¶‡˜.·R ›O)þ=ÜìVeB+Ó4—ÌÌoÊãþGsì,{ó’X[ÙšIÆ“4~ÇŒW'nüıF”iK¹lœ³‰­ŒÇ‘–…B!ìÐûò”bp:ÀCAt)Gºƒ¡€+òDÒíŒpé§?5ˆŒá»ƒù–6µèßâRù?cž¢F9¶žbŠ+³•×ÛÁÓƒqKÙ{úÒ=$c ùÞíö ¦Cµ*ù¬…ËÊwßÉ /àÞ‹èBBò3ù3gfWT§Â† ýV®¬_±¢×’%)=zœ.yɯE‹róç‡zyFŒ8>~üé┟}ÖlذfeËúüôÓ‰ÐÐ_÷îM¼.g.E)þ-X­Ž·ßÞܽûªädëTŸ7¯}Íšÿ´ NNŸÎzôÑ­))¹Ï=W}„;K¾ð×_Szô8íphäÈ|P­ˆ™GÚŸ}6Ånç£_x¡p Y«•nÝXµŠN:ôòÑg8à‡QÜæž_Ûv€O&b00c˜õÊáäÍIH ~š†.1÷3‰ ÿ`ò‹ººâäao+Ç(W“ñÓé Ù0±-UüþLä8‚¼R`}:¿¥äɧÕä°ÒJ†L„íp |Àç¤'âl…OWü÷‘±´@<Ÿ§Êz¢Î“B@{jýÎ.ö¦Ô©M••¬ZÓÚï]ü´äédDZà ÿú<[„« G)ëàf°R‰¼— xœáIMyØÆ¢jT½“;íØ7°¡ukQ1‘Œ¿8üêûá•G9ìGˆOn/îÂûŽoÉFAl„L€Ÿ²ùÓðuM| LOÀœðÕx˜t–Ãå|˜ÔàÃíse…>˜9œÀˆ¿ò-Á~Œ{àƒE\HÉ7Þ[—×Çî ÿ$·¶ÍÉXßüÈ’ n¨\‘™ã0ò;ö\}éÙ“Œ œ …4MhÚÔ{Ö¬r¿©põêúåË{þòKò+¯œu–øøÄUfÌhb0ðÞ{‡.,i‹ÃbñÔSµ·oïvÏ=ŽKmÕjÉøñÿ´Õt)JñoáìÙŒ4}ûí///¾h±xqÇòå}‹_V$$Ø:uÚm}衊3g6ñð(‘\;°|yj§ìvEDT2¤¨è*9ÙÙ¹srr²³[7¿áà ß6ôïOd$Õ«3v,—uÏÍåÅþ¤gðÒèÑÍýäi<7[.ƒzÒ¥ÛÐ{Nqk?uÉØo.™Vz芳7–Q›ð00£Kâà2ry¡OÕ¼`H=ªúâïœø¨!Þd‰Ò¾¢¢q×uú[€½äþD–7†Ñ”5ÀÅôU<çqèAƒd26sÄCgšáÈyΗ¡LkZïaEiU¨s1¨Ç3†¿A€*å`ÝܼV&³  JMÚ;±aδ+GH ±GØØžxîaO i,c—/†0n~æhCÊ´£œ çb=a e=`"™'°—…<òåûµ<ù AÿTìP×]²¡Q }jaÉç©„ÝB¯dÙ齇{¡pt$Û]ÎÓ÷Ò¥1i9¼»àÒ}}ö"Õʳé3Ö¸Ýoó;Õ¿p2Ö£òforséñW$¡¦MãÁ±XèÒ…¬«(-<õ”ßС%ÙTØ´i™eËêyΞطÇX/¾XcäÈFN§^|q÷êÕñ%]V$6mÚÔ AÙmÛº pWNŽãw6÷ì¹¾´\xƒPÊÁºqX²äLÓ¦‹¶n»å–À¿þêÿœ©S dÙ2j\Ñ‚ü“1lÛEí[˜0ÂÍžG½:c¡å]|öºÛÐùx†ýðÝk¸Z2ÎÞʪCn]qr]ÅÁþ-xð¶|ãøüMH¾½/ß2lÝQs*5üP®f™ÁY¡Þ¼R`$ãМ0„T'¼F@}¼ö’±ô@<Ÿ£êjÎÅu Aí¨¾„ívœmhX²yqäA;ÙûY†V<}õ©œð£bmž´0ˆfjn/Åÿþm!®€Y¡ôC¶—éi“Âuð´v>K­ÊZ¦eŠøI?IúJKÃeü];Ód}FËÃdÚ¯ÄÊj.sk튕MÒ@¥„ÈòŒ%9¥%¤þ’¤§êÇ ‹¾Ï”¤4»ªífý’$I±9 Z.LºØ&ŪZ? £¾Ú{é‚®jô²]úx’Uöm®%{.MûéOu¦Ê=t$Êí~Nu(BÕâ%YÝ;OäXuO{¢×⨄Õ«'ÐÓO»i_vòçŸOKíÚ±qqÅôÆÙ´)=0p˜ûö=sµŠxzþ~ß}‘«WÇ_ò`ΜcÓÁذáü½{¯O—žR”âF#'Ç>`@džJ{—.+“’®AT½X$%Ùºvݼ¼nݵ11×pæÕ«Sýüvùí·Ï;ù7RÀR­Z̹sWtïraÑ"yxÈÃCK–2úçyÖ”W-m6_>4f–Uù‡tÚ]ÙÔáÔ#«Å{z±@?±„ U(Â5{Ë%ãÇëD„jSºKxùdª¦ £~=o±:Tg­0iæyéŠÇû »ü¢åaQ^¿ŸË$©§)#D–fŠÍ”SR? •Ù(‹UŽÞZ&S¤¢Ï+±Ÿ&¿©©IJ7Ë¡ˆño—}½f¾F“í²®Q“ÂÎk]–ŽšÕÈQñÎÏ@#]ÿãæ0t3 º`ˆe®¶:t1ý6šT£~é{YÙŽv¾øãØiNw¡9°Š½àèL`.Gêâÿ åm8g|LP<6b]J޾oø¶ƒ¯1A§“à$È“¼—ºAÈqRÅ—÷ê <”/‚UÖ‡i`€vp09ÿZG>Ì•9’Àð?ó-ÕËñig€7~"Õ¥§ðü”$>g¾ »@žö"kûA>úÁÍ U&Íæ·•—û¨bE–.¥\9~ù…ˆˆ«øÑµ©ðôiG÷îÉEo¼ï¾À%Kêùû{Lšðî»× •0vì\?22é‰'¶ÿøãUj– /¾XßlîvÏ=ŽMiÙrqi¹°ÿûqãÊ‚ÀÙ³Ù÷ß¿yÉ’˜6mʯXѲjÕ’ž922£[·“99ξ}+ÛËù»ï2ø¡˜mƒ»wóÒK8ŒM—.—¦¤Ñó->yçr]†íùØE½º­ºÛÐÈù¬ÞÃÙ8Æô¾d|g>qé<Ô]ôùÝ1ŒÞ„‡™] t{o ÓN¯t»-Ú·§9•Å=Áô¬ði41¹ÜH÷òo§’#ú”¡•÷%nîhñ8ÇŒ ¸ †=d˜óÓWU–s6캔mMµ_Ù&ôwá÷èBôq¶xà•§,šM|0ujð`ãóP¾\ÃNO7à¸éq³Xåy؉Õ¤º<åK…ŽFÙŠ§Á°5NrÚÐXËÚºT½‹Z9ä®boWêá}¤}$„Òœàµ$Ÿ&§ %5 Ý À o‚ºúÑÉ÷RõW]’ ããÞ¯C-¼ L;—mÔäåFX¼òg~¡Ðדiñ40&’M®iý¢u,) -°×ÏØŸF5Ùw†÷Ü“Ä僙7 o¾ž{9ëΆŒÐw –+48o¿yóðòâ³Ï˜;·pgºo*L+|’ ?´dI]??ñããŒ*zòExx† k0hP]›ÍÙ³çî/¿Y¯%+&¯æýƒ~pÊ9UkÃeüY‘ÙÊ}Q«Âd2+6EöG´7TæJ”´W¶²Ü¢èSÊ•4OB ‘òz¢~&,êà"ùt;!ÌzólþO®K¤Ž[u‘˜´2J0M§\=O³lºã{¡Ñ›.ÝË'¿‰p…Ž”½ýiú*¦²ÏêTŒÛ;zúªÇ\Î©ŠŽUµ{Dˆ&Î*Üiï¿/P­Zнªc,È‹¯oôÖ­¶«NraÑ¢d³Á`ž6íÚhU‹Gûúþ¦_Üe³] “Ë…}ûö]mèàÁ¤ví–‚ÑÏoê„ ®‰(VŠBQ„·KQr8t×] óþ2gÌ8zµiÛÛ Xò¾Vo¿}Ðj-†LY§Nåä5r~õÕ³v{1_˜¬,gÓ¦ñ`éÙ3ÙqõéÓG ;îP|aφÓçÜ@„èçÅ—ÍþÃE½²¸ÙNu&Âôä§nʼçg‹Ï•ë2O”ß"ô—ëáì”Ú›„Qýþº´pú9aR•UZ¿ç¤¿Ò…Y»m“¤q¢{â•Gš —ž–$Ù¥Š‘å[¥KJQn{í •y’³”û¼V†É´Wñu>\Æš-Û­qq‚¿ês£Â÷jU¦bþP×ßÕ9Mgd2+t¿º8e½¦î·éú7w€!éæ½§2€T ³+u2+4UÛ,Š4)l•^²+g£æ¾FSrŒÓ¸EÔA‹’úiòšš¤Œ_u"L¦wô—SZ¬øP™;joºìr±Ý{ºØî÷IHC%IÉUŒ-Ë‘¤ÃÙòÚ)¯:”-IñVUY%LšzöÒ¥öX+ŒzôK–U'E„ÊŒÔéä|K¦Uµ‡ˆpMXçv›Ïajþ®¬¹nvK¼*¶¡2.ºÜ3‹—‹ÔÕ±S—I²ÙôÀÝwŸ¬ÖB&äáí·SÁR«Vñ„wI'ÆÙÓsç¢EÉÅN.ˆu낃—ƒ©C‡-ii¹Å/¸dgÛ ˆ#;w^‘}}Ï_ŠR\+fÍ:0-o+ÆîÝ ×ýüÓ§ŸóòúLo½µßḆ·ŠøøÜ† €ù¡‡Žæä¿ðå—SÀR¿~\JÊU'O˜ ¿¿vî,dÔáЃO‰uísùPT¬Ê?$B5ÓtùÐW¿Š0•Ngã.ÇÊïMúiCxõ‰E„^þí’eúaT¥YŠs= .d«ü aÒQ’ä”Úf ·Hõ¿çHÒAÉKòvqÛg)3Ûž%§¤‘:*óë:&ég “i"%Ñoá2®Ðž,e}®Ï#¥¨ÓÚmTø Ê•u—¾6)lÆ:dݧ'Ì MÔ²­ruèj¾½ 5uý›>ÀºyK„b€L¦‰èª¼D1.„–åih%é ¦{y “¹p?÷ØPrͨcDZ‚=OP»"~'HÝNlg*ÝM@"¹ÓˆþKP0k°®Åj€¯Á_Â9(çÁ@€iØ¡‘½+bŸX*ù0þN€÷qÞU(߆J~¬Œâçù–GêðÌdå2pU¾¥Œß?ðÑ,.Y,`âÜV…ljøÉíöC*1åc€÷ÆrüœÛP×ÇèÑÌ,z¿ã ¢¢·7 P³&‘‘|ðÁUÝûÕWÁmÛúœ?ïxî¹ä+Or^{­òС!‡^|ñôÆÅÌ.€‡ª¸n]ë*U|׬IèÐakBÂõ”^ñóó?¾ÍâÅ+Tð]ºôl“&‹þúëºIp•¢ׄÔTÛóϯíÕkCf¦½gÏúfs·&M*^ß=úäË/ïu84lXƒo¿½«äzWYYÎÎO=šsÏ=þ¿þZ××·˜…FcÖôéYþþ†ùóË•-[øäÍ›8`útî½· _ObÃfªTÂ8ÆÍ.ÑwÉitiG¯0·¡'2ƒïpKšê€ùääòrÚ5È·,<ÄÇ©àÏ.YÑ„o߆Ê.M‡7œË“UéQ`^›3¨îÍÀªŸgè¤Oø¼ vx@*Î1¤à öÇp˜¬%$xcø€Z™Ø—r èIÜ?AL ~í¸#’H¶úÔ¯Nõ˜€¦<žM´… xÕç¹xæÙˆñ§A:¤ñ9`åZ¤:ì7à(Å¿áý›, IR/‡¬ûô¸Y¡‰Z™ ý&…­Ð³6¥mÖ£ÂWê{‡ã5>Bûµ?F)¯iÊš’ ´¥:&SmpÊyX™Íµ³…vW–$£2Bdi­8«œ’ž“^’$Yª',š’)Il Ø%ÌÚ”žaO™…I(Ns½<Å»^ž¢ÓUv”ˆ©À[WçïE¸žŸâv›Ê«‹<žÔªÝ—{à¹E¨ÚôqË–KJNU­P¢1ßîº-[äë+дiWuot´£zõX° ’vÕIðÖ[çÀ\¶ìî={²J2ÿ"NžÌ¬[w-˜î¸cùs×¶¶$8w.ýþû£§çäÁƒ·Ùl×P7)E)þ9¶m‹­Sçg0Ϙ;÷øu?¿Ó©÷Þ;&OÏ߯³Å/(›Íùè£ÇÀ\·îþèèâ)»wÛüý£Á2sæU¿ª‹ªWhРÂ'<*¿ÛDˆ~_}ùÐøŸE¨*wPŒ»ÖJz¶öa`t³ÏÛ!ÂUá]ŹžRiVÕüFDhrÌÙ•e„¼â`¹ŠÊ–$«Su÷ ³ò˜çíò–Á¢6I2IH奼¬ãGJ ‘å?Jäzép¨Ìß+JÒ:&ÓGÚ"i”‡Ë¸R{3•y1}u\ÛŒ ÿQÚ•»]Ÿšv@SìJsÕa¶fjŽE!€SW/1¸ š®ÿqsº™3Xy0”ê\¶‡Ð°ð]T¢q.™'YÜ”NÞøaogÚÒXÏúÊ5§Žç ö>Æ­•ð?CúfbQ¦•h4ç/Я3ا“Œ?˜;ÀÇÀˆ@€ÓIÕ½y¯*ÀûQlÜ´ ˜x7•}XÏl×îº> y¸ 9üw{¾¥Z CÛô_F–k¿Æ„çôåç,/ 2pÿ|òNÑókb’)ˆ‰R«*›÷ñûÆÀrÁLûƒOưÿp!~kÕ*Ÿsúæ›ìØQ¸o«UóX¸°œ·7£FeüúkN±¿‹±ck>ýtùÔTÇã?særQuê”Ù¸ñ¾ÆƒJoÛvóÑ£%Í•Pú²V­ÀõëÆ FÞóÀKOŸN/ùå•"¥B£ãǸÿþ¥§N¥5o^yçÎî/¼P¯$ Kîm›Í٣Ǯo¾9åëëñóÏ÷†‡ßrM—×·ïÙ•+Ó*WöZ¶¬^µj…(¤$g÷îÉÙÙzë­€^½®Ú§kW,~˜Ï?/ì‚séñ9Vúõä‰nCGÏòáw?¤j·¡7~àèî¾/z_2¦ç0p!ÀݨìØ@TÍ«óJÓ|ËÊ(~:A/~pµÓ´ä0ðÀ„»¨áðîö3'­ÜíO¯ŠÿM'[ôð§™7vø/à"Ã>‡LON0ð+ñȬŠOB2É]Êià9àÜiâñkÇíy髆4¬NH^cœPÂÒ9Ë/üêñt4Óí¤Ñ,ˆ»Òù:ï" ¸«Ý—âÿv„÷oH×X‹BâõˆS¹õŒY¡±ú9YÇLzr™ºg+a›þ‡Æ9圠 ŠØ«½±JyMS^×”x¥-Ó™§´l¤väÊ™*{í •y¥%ý¥œYê+:FIƒ%¤6’3¯ZŸ ,–&IéŽ|aº‹¤¹Q¤²ËuÞ•²:–"¿©2µÖ¥˜—ëP“I"BŸà]}±B„«þÇÊ.ð2épªý¦Ç†]Îj_µU†fòm­½Ç.÷O¿DˆZtº\•ôÒ„~ÝrKQ„÷/¿ÌKPPôáÃÅs¤¬Vg‡ÇÀ\¯ÞþØØkãT%%Ùî»/L*¬Ø²%éšÖ–ëÖ]¨Qc.Ë–1þÉñ¥(ÅEÄÄduìø ã€‘×D9/!22ì=¶LËW­Š+~;Þ}÷<˜ƒƒwïÜ™Yìd‡C=––V­â­Ö«R¯úöèÖ[ '¶K2J„¨nk¥g¸ÙsíjÙK„ªÏðË—ÌZ+Âð´Ÿw¿þ"\Í?×E¾ÙþXy*ÏáÚoÉÌUŸ/×|îºC˜¶=ÿÇ$»*ìf­H•¤Ý6yXä­3vIúVBª«ü„ÒóJ ‘eˆR%¥(÷aí •y­’%ÍÓ±Z5T[%}®Åá2®.¾º  ‡µÑ¨ðyúÄ!Çf 1)ì¨~´)v—Ú˜Õ,S‡Òô•E!ñzüšþ¹TÒõ?nîC¥¬^ó¤z.r0Õ ?ÍÔ BBhíÀv‚MèèK™(Es>…S¯~ø©Sñ÷gÑ"*U*d¯Ë;™v­™ý-îâ\ŸOgÛjVáëwÜì'£yË0¡j^²›Ïòý<=0¾HßL¢ÿ2r¼Õ’¦®Þ‰CÍœJ£qEÜ•o™Å’Êz1ñî|Ëp IvÚñh0À tœ0 €[=I†Oø|`99°–Ãã}o¹‚½%Áí)wŒywàìÃû8w†¸`Ê<ÀÙhÃÖˆFÕ¨²›å@s:'°+‘}>סë~pb­À£~TÊÄ3¬Ø_Çå(å`ÝÜì–å Òù"˜A4³“ËìF¼dÀó,«ì¤ÞMÀÌ’{¸§•’HÚǾ0îõÀc3ÇRÈx–zÀÏO$§‹;Û}8Á>µ›Ü Èk?¬ÐÚ‡n~dŠaéá•h@Mo¾r B}7¼ù#Ž‹Šåƒ›pgyŽ¥2jw¾¥E z7Áæà­åùoO&½Àƒ fb“‹ԨȬw1<“mGÝœðÕ;Ô¿…=ÇøtŠ›=0€Ñ›À¬ŒqW~Ïÿ,o, F 6mº*áÝ``Ú´r zeeéÕWSíÅ}낃=W¬¨_¿¾ïŽ™]»ž(Zþ2”)ãùÛoÍ_~¹Vf¦£sçóç[Š_s¨TÉoéÒÇÆkãëë9gÎñ-ïߟtÝ?¥73¬VÇÛoo~ì±e±±Ù:ÔØ³ç©Ç»Iî’ÁbÉi×nóæÍÉ·ÝV毿ÚÜ{oÙkZ>gNâ'ŸX<<˜;·ö#/k9wnöÊ•V//æÍ+_³fáŠí[¶ðî»'ZÈ„ÝxiÙ9ty”6Í܇Ž2r:Ìþ”ò.'×Î _“–Åî§Ozb¦•—fа*CŸ ©Ë»Ó÷ðçYªñ`¾eo"ßÀÓÀ´vx{D[yï À·wQÓ`o6ëÒ¹Ý<Õú?¬¬±RÞƒÁŸA<Á†F &¨<‡È4¹¸íÀÙq¶%ä6‚þ`'ðmäìd'ÐŽv‡ø+„ ԨͽG™Ôã™\,I,3à]×Ò-2üx܇¼úh©˜ú¿;…ö/b U–’ãõˆE!ú!CÌj¶Km¬ŠÝ£ñ&…íÒW6åÌÖ@£ÂÏëÀ>í‹PÄXµË>SÂeœ¥?%}.s˜L£µSÒ!w¶û¥…Ȧ§d—î’¾‘$´Ë'ZžíÏ•¤µi2˜å»S\ìÏ™ç…IW*ÚÕlk¬<&ËgЏŠ`‰Yª4FDhÞK÷6x‘WÍÁŠOWAôŸ$ÂTïU¥ºgô#÷ʳ¹<škãDø?Öȳ¦}úU}}ü¸½nÝ8°ôèQ”ìÍEœ8‘Sµê^0÷èqª$ó ÂéÔ A‡ò»'ž)bæ?QfÚ¹3¾Aƒy`ô÷Ÿ6nÜþ¿}ž›¥:X%Á‘#ÉMšüF/¯)Æ™¯I+¡ ŠööáÃé·Ü²LwÞ¹!*êšõG–.MñòÚ æñã¯N(€E‹²½¼,žž–¹s¯úYÑÑùÄö Ÿ`‰QÍ{Eˆú¼sùPŽUw?+BõÎ×—½7U„©N_¥¸×{Íáº3B™."xb–*»?HíN….F ,К°ÛaÒÛò´9Õä0«çîxå=áã„Eã2$é„ä+yHy=Ç)=D–—+9¤—t8TætAÒFYÂdz^+ReÝ£3á2¾¯9Vå.×òEÌ×ü\åÌÑûF…ŸÕÞ(ýiRØjõ²Ëz\o™zN_çê˜Eµ,º%W'¥§éã«yû2”Óõ?nêCº™u°”/4Š4Ī…Ĩ¡CI'5ȬÐ3™­„eêþ»žLÕɽZiTø"tÊñƒ~ˆPÄNíLPúšòš&Ç(%^YOky˜LfÅI©³¡2¿ª#N)CÎ&Š ‘åeIZæ¾ä­TaÑã® /}Ž[1«é!]Îì²C˜ôäöK—ýÚFaTËÅ—x“wŠUûJ)®8,סûF‹p=þ­é*Ǧ&D˜z½Üƒ¿¡ªÛEéW°)FM! ¬§= ÷ä¤IùùiÇŽ«z{×.[¹r1`éÝ»D1ÖŽ™AA»ÁÜ¿I[–ĸq§ ˜¾ªLJJÊß8óE¤¥Ùzö\—'”Õ¯ß_.OC¹™ñ½ýv»sܸý•+ÏcýúóÌæÔμooßž\¹òJ0µl¹1!¡¤Í.bË–Œ€€]`6ìBñ³¥•+s|}£Á2lØUwÛlºÿ~Ú·WnaÜˬlµx\„¨m×B(¡ï}#BÕè)e¹7¤^n–áIyuÑæÃnöŸ¶‹p¼¥ƒdHû.zdö%Ë—{…Q·þ¨t×'Î>95vØaVíýºœ*ir¦°¨v¬ò´ÀºJH¯H’¢e¯§èY"e•4_q¡2?¡}YräÈþ²Ö„É´\gÒçú5\Ƶڟ®ô¡ˆÅìÖ2£ÂÕçNå®W?“ÂÎiUšvšº[ms•˜¨- IÕGÒVÉHî*«W@€®ÿQ`ýÛðo ’¿t6QÏY’ª¡Ù:»S-wªy¶NÔ“¶k¸]¶¹úÀ¨ðÓÚ}@.&±féÏpgj½¤…:&S¸ÖÙäHU®‹íž$i²Bdi¬˜49%=*!½-IŠw¨l´°hUŽ$e8ò÷úŽtQ,/jÙýìzš¥ZUc®0j’+rp8ÕzªˆÐ»’Lç’Tñ]®¯Ýw2»  ÿˆ0Íq—$ͱêžçD¨ú.ÄW}ŠÝÚ\1W!¾új>á=îêLÙÈHk``4Xú÷O½ê¤X»6Í×w'˜ÇŒ‰)~ö˜9ó|žjâ›o^›jâ5aöìc>º ŒÓ† 3ß&r)þÏcÇŽ¸-ƒñá‡M={®KK+^ïàïaíÚø  å` Ûž•e¿ÖådU¨°Ìýú•HÍaãFk@@4XÞ~»¨¯|ÑO§SÏ¿.BT»¥â®PWÝ´GžÍåÕBÛ¸ÙcST­§Ó ÝìGc4@„kææKÆmQò.ŸÏtÄuþ3é œ.Œ2¹n4:GV“f¸ÞøödÉg§<ÌÚ·WÉ©aÑ‚lIZ/!ºÂœ7”"K¸’T@·}½’%ÍÔa—fµs·N‡Ë8HslÊ]¦eŠX VeÍÔ»F…_Ðá3ZfRØ:õs*÷°z›­iVEZ­úÅå)[_Spà§ë”Xÿöü›\U½m:dQÍhÝ’«Óg5ʬÐhUêr=cRX‚öÐ:£Â*Â!ÇDMŒPÄí(ÄJΕãu­“i¡NHúÕ¥íž!»SꢄY>Wš¤Cî’¾£Ò…Eã•÷Ÿ9¯Pè³Sû\…©gó …1®÷³…'…QÁ3åÊ{ï‹•—ûæI¿ï“¡Ÿ¼_×f÷oSVŠ0>­£Qnö=GåÓJ†fZy¹¯l6µë.BÔì1e–æ·ÙÔ¶mQï yX³&ÇÏ/,ï¾[¢ëçŸóéLŸþwt«û-Æß˜ºuÛ‘}£BŸ¨¨Œ‹©¬† ç¯Zu¾ø5¥(…$)..»OŸ ƒŒµkÿ´tiQEíˆE‹ò»Kõì¹ûot—:ÞZ«Ö>0wî|¢Øf8’¶l±Eƒåå—SŠh65qb1ùï¡_Š7Ð#—ed©^WªaîêV§ùX„éÁÝDþ²mjüéåbvgþvì¡ë/Ö £^X{ÉÒ}‡0éqWq0שÐC¬®xkXš°¨E¼œ’C •FH’̲V—¥¶¢ÏÉ.i¸N‡Êü¦ŽIº ŒnúãIý~DÉNi¤~ —q䥯†kxŒbvh‰QáKõ¥]ÖÕêmR˜E‘IZiVè^=æPF¼µ($]¤_$¤*ÿÿXE™Îž=Û½{÷      îÝ»Ÿ;wîzÞ”X§]Uò)zÇ¢$õËUânµ5+4]»ê'“Â"5ȡܟ4ĨðãÚ~P#ñµ¾ÎUîý.ãLm´Gña2=¥e±ÊrH½u8TæñŠÒ óšRu‘$e;uk¬°h–+¢zý¬.+>¶U˜ôó¥‹ï²RõŸÙ©·—‹5Ÿ¬‚Éš·ç‹pÝò_%ºSz|)ÂúÎå-tFN¡ªÑIIWÄ? IªÛZ„è™~—k=ä!:Z5jôÞ{E¹}ÅŠü’Á§Ÿ¦5Ï…ï¿Ïo¤³xñµ5ÒÉÆ eË.Sûö׿NA¬]{áöÛçç…YaaËÏŸÏ(~M)nb8ÎY³ŽVª4 ŒÞÞS ˆLO¿Q‰+Iß}wÚÃãw0 pào$tããs5:æv펖ä]e÷n[ùò1`y饢(›7ç38gÌ(|ÂB“ ÕåY³MQI¯|*Buï ²¹³G-aªü‚,îr£}gç«Ø¤xKüf‹ˆPÝñÊvdîqaT…™Šu=“/êæ\T2ްäÓ’ëPP´°h£U’¦KH5¥LÉ!uR|ˆ,_)MÒ^¥7“¹µvžU¶¤aÚ&ÓwÚ'i§N…ËøæÚdÿCD(b¡f+}º£“'´Ð¤°¿ôŽS¶ýêfVh¼gi¡E!±jêTªT_B2þ`]m(==½nݺ#FŒHJJJJJ1bDýúõ333ÿùè ÂM`ÙOJïIHí튉V]‹ª[µý‚Œf…V¯\e­Ò‹&…Åjûam2*|ž>¶Ë>I“"±MÛ•>^ËÞÔ´“Š‘ô…v†É4Jf]ÁvGÉ!²ôV’¤X)XBÊ{hÌÎÕˆÕêM‘*P(üÌUCÊV¹¤….Ë…L•!ŒZr:ß’fU¯E„¦ ¶ÙÕê ®§&¹Ý{J†j¿"Â4È™îp¨m_ªžŸⱃGU¶¡ÑÈñ…»tófùøõ¸ÌCé,£G—(Æ2$ Ìþþ»6m*Ñü˰Zõê«ÁÔ¼ùƸ¸K¤“7þ³›Í1nÜþÀÀéyÃ/¾Ø›[Z1ÌÇu÷öÿ×0›ã[¶\œŽ?üðï‡ÿ—‡"p™·¿øâ˜ Ó°aWí]23mÚóÝwLJ*¾°¸nÅŠ1`éÞ=©ˆ|öÅW²wß-|‚y¯ÊÔ!šPØš¥ŠPù¶ÖþnöíÇäÓU†'µt››}þ.¿7µ»@æâbKŒß]B€‰9ª2[u±•vœU•W “¦¹îu/JzòH4uK’¤t©º„ô£$éGe†Èr¯b3åtÈÙC‡Bežt·Ý&ûÇš7F¿EêhªR?ÓgÃ5!³ggyxX Ë?ÿátê•W΀¹bÅ=þ¦Ë§NeÖ«·L­?{öú·Ó)ˆóç/U 7þeÓ¦èâ×”â¦Abb΀‘“ÁX£ÆÜY³þNÄSrØíÎ×^Û—·©vÊ”kkƒ“›ÍÙ©Óq0×®½ßb)>ÇvìXnHH X{,±ˆÆÏI÷ß/[ag½£MEˆ^),#Ÿ¬jE¨ÆþèfOÏVýp¦î]¼ŽÇ*x€×÷8ÿ™…"BOÍ¿dé½^Õné¥Ney½Ë:lÉ·\,¾åŠ·çÊË"/‹åJÒ'RKÉ)¥ÉÙX1!²ü¦lIó{%·}…ÎJ2ig¸ŒÃ´À.‡I¦E,Ò¢L¥LS£úÅëÜaÍ2)l³þëPæ^=bVh²þL׋Bâõ°”"U•–*m L÷·ê«#¯wŽë`=ôÐC+W®,hY¹reûöíÿùè ÂM`9³YPÖléK é§ÒbÔØ¢l-‹s½"Ø•³V¯˜¥ û@MÖäElÑ›r‡è§¼Â¹¤E:&Ó«.¶{žPï*%Iú^!²< 8›”-Ý*!Í$­³ ‹ÊÇÈâz?|ó¬0«‰«Pè”:n&=¿+‚éÖK„Qï`kvš+"Ôw©Û½.0‹pù¾¡]îEç‘óE˜ª\‘Hÿn¾U¥‡]ñéËDˆükkûšy¸¨Å\á]Ò´i™ƒÅ`°L™R|Œe·;»w?æ5öž9sÍ[Ÿ$EGç4iò'˜BBVíÛW¢öˆÿ«WG5j4?O†»gÏu1176ª+Åÿ~8š5ëhåÊÿC5AIV«ã™gv‚É×÷_~)éž²‚p:Õ«×i0W®¼çÈ‘âßmΞµßzk,X:tHÌÎ.ª^±=+[Í;‰=ЭðNÿ,BÕ¶¯.«?J~ÈÉUÓÏD¸ž™ì6yÕI¡2#uƵçrƒE£|§êbJñ§(aRðr]|/nfݶ/¿8(©k¢°èIŠ’$¤¼@n˜RCd鬧”¨Üµ;Tæ?ó¹í‡.rÛ•þ–¦…ËxDR”’—¾ŠWüFÍ5*|µ&ç(q™ž6),IG.h¢Y¡‡ÕÛ¡„h5´($GJJHÈ«è @ÖMEø¿ þ·XU«VõòòªV­Z=¾´´J•*11nž¢££«U«öÏGonâ+/R¶ Ør&Ku%¤™™šaQH¬Z;”å*rÿzN«M [«Wì²ý¢O ?¨õGu4/‰e“mN‡Ë8@3R”i—³¿6„É4_Ç%-R|¨Ì´/S›œ÷+.D–)Êô£„T]ÊcëôOQíXýÇ%p•éP½ý¬á®ã™,-&-råDö%Ê{Š<&k³ë/çX¢üFÈ¡H÷Xªß\®z+µÀCÒáT‡E˜:~âÆÜr:Õé-ª'¯’ºÏë¢S½‰Îöо¸éúᇋ"¼K7.,žž–Ÿ.>þÈÊrÜÿ‘<ŽmTÔßùÏ”œlkÛ6Lå˯ˆŒ¼!ít "++wØ0³ŸßT0–+7cܸý%¡—âÿ$vîŒoÕ*¿&ؾ½éàÁþç—‘aôÑ­`*WnÅ_%¿à 8úàƒ(sPÐn³¹ø· ¨({:±`iÓ&!=½¨?õ™3óóÜÛ·2êtê™~"D ïWRar³ÿ¡ ~@gÜŸ?ÓVåoß9â¾}çõ yúåØÕp‚ˆÐW›/YÍF}îzuŒ·ªÊ*aÒÅÜ_^qÐ`Ö*Ku~¶ÊÅèñDÅ:$éÿ±wžñQU[&Þ›‚`l)bW”ëu@D± ^K°¢÷Z°^ÆXT‡*¢tzïuBh P’“ÞÛdÚÿý0™D}/>¿ùì½çÌœ}æì³öZÏzÖ“ x€½¸›a4ÁØŠ èG|$ŽWã¶ß³ Û(–³˜eÅ:鹤䥼…±av,ú—¡oÉá}sOBT¬%»7Æégþe ¬®]»®\¹²¨¨èÈ‘#ƒnذaLLÉõw{;].WDDÄÙ÷ž#œ÷VZ$†Èë°vš@n*·˜ó“É"‘[éì!9/Ú±dN<›mDýÄ[nŠG2ÒŠu-k¡Ì‹Â6–eÀ2º`ïÎÜ J‹¥ûÙî‹pš1® 9¯ÏŸP ý8è¡j‚GS«Àêyãäî =$5”¾“$½PUwD¨šIòK¾à€&º¤’<ÒÐTI2I?\£j¡Ú_ 9ã*a~³ÂB´8Qñy’T)LãPµpíÊÐÄíGÏõ²†ú˜BC4Ù¡=)GÛÿ©×ºªr„¾œ®çÑö'îÕ[Oé¡7« èØ™«[[¿ý¨Z5µÿýPÎÔv쨯¿VHˆÆŽÕ¶må (Eÿþ5úô©æv3dHÁºu®“_±:uB,¸ìþûkgg{­VcΜœ“?aa¦1c®ýàƒËêÖ ;öðÃGggŸ Tõï‡nÝšïÜùp¿~‘áá!'î»ñÆß¬Ö袢¿ ¢þÏbñâĶmgØl;32œ·ßÞxóæ hW­ZعþÜñãž{në¦MÙݺ]°zuÇ‹/>uæcœì~è¡ý[¶5n¾fÍ•§,5˜ŸÏ3Ïd'&z[¶ [¼¸nݺ'|¬¸\zýuy<ºí6}ùe96ÆhÔ$IúîSÝus9>®èêr‹F|Ô>`Š ‹uYc|õh£Ç§ÿÎRX¨zDêÅÛŽ¶yºQ¡úäN]ÓH’|èËmª¡—[«c#IÊtkb‚*‡èËVjVE’âœZ‘§P“F7WPIšR¤Ã^Õ2iL-™¤ß¤"©¡ôŽä–¦¨¨†Loªz]…ÌV&¢‰*=­FÅò®QI¡½Ô²¦"V(.D!Uç]•¡Œ e„)ìVݧUTóJÝ")-T—ë±4M SÝzêªlŸRMªV]oIÃ¥Ò+r§Ê—"SuÕ(ߟôÿ”q°µnÝzëÖ­e{·mÛÖªU«³ï=W8§æÛ_Ň%±¿î8’*‘g<‚ÿ¸ØlÐ$‰K½¤í§¯ƒÈ†¦³ÕN—<æ¦`ßÚˆÚÌÜCÎðŒÈ#Ï…ç¦Ea[Êv`6,Ø_d¹_&î°5Çr€ä˜1!8Õ!üäõê'#ƒÒˆÙÊ<¢©M)Çôûxdçâ%”2âW#÷Î=z~“¶cêGõþì&ª÷ùEÑ®?eœ®2Vï¡Aƒ³rpÖrô IDAT¹- EÒý­cɤ~Ì_NDSBš0YùÓüæ›H\z)Y'ÍC÷ùèÛ7G2êÖMÞ±ãÔ»|Ç÷Á†ä7îL4HŸNlÐ`¡d¿ì²¥ÇTÈe÷îìW^Yí6m:q̘]çNeþoü)ˆ‰I¿ûî9þK|Ûm³&O./Ðu“ã~ì±Í’]²¿ûîÎüüÓjöís^rÉvÉq÷Ý{*’MR\ì»çž ?ï*1ñŸøâ‹H´iCJy5 SÓi‰Ì|øEùoóФÆ-¬ÝÔ¾d+!]¨ö޽Aíÿ…¢hó)ÙeüÅ^wŽCVzN?J<ý!Ùh5™œ@éù­ÈN÷M%®)/Ü´ 9x+àÎOõ–,Ô‹ŠáÒ2IK£È7cÜGºrñøSV‘Ld·ûû¬÷áË,‰{ŒØC0i£µ…é±Ñ{,¯å ¿K?²ÛÁ 1Üæ"5ƒæ<ÃR\é¤ß„!ò’1IyÇ FŸ’þ²¬o¾ùæž{îñÿ=hР㥆 rö½çç±å2$áy«É~Cd=Û *áLzù‹ççà†ÍÜì&c-ïÚ±ìá—DvÚˆËëÅLb’Ÿ“ø ¼Î¹¹ñöf©û,âŸHŽÄñ;<ø²ñ¶"ÙŒ±'ðnTû&˜“É Ø4ÏDnÝUr·{|´Y‰ì¼ê%RçGdcJ™Åü©éÈÊÕÃŽ è9E4EÑ/˜Á{˜ÊÝ1uav0ít×ÁÆÃûß—?‘Ÿ Ffê\Éþò4¨‹ŠˆŒDÂb)ßD+…ÇÃCeJFãÆ)ññz6 ˜$9L&ÇÀg"…½kW^›6+%{XØì~ývÿa¶ÎâÅ ×_?Íÿ nÙò×?ìü'â|¨ExäH~TÔJ?ݪzõ1ýú9 ÿˆ˜ °iS–_ˆ¤zõy6Û¡3›ííÛ ›4Ù*9n¸!.5õÔßÜëåÑG³$£Aƒä]»N1~üø“Û=îy™¹ÑR~Úàê-TºEòC0[4;ŸfÿB>ý5¨Ýqð éͲ`ÎÛ'+•F_’à”.žS”´lÈ"d6sˆ Œ–Š\°•¬ÀÊôp&2¸3½dMXT$¸܃·5ÉfŒ…8o8‰ãyvi=ÄÜ.ØwŒ`Q¶,v±ËŠu  (XÀ÷6¢Ö19—øÙt™C÷"2öño‘Gøº˜uâ¹Ùp#>£h†Hn€7í—H"ý·ã IÊ9¯Ó60î¼óÎ)S¦$%%¹\®|öÙgõë׎.‘vÌÍÍmÑ¢ÅgŸ}V*zÉ%—äççŸ}ï9Âyl`ù9X±³ž’ªb˜p­ƒÇAðŒ›M’hî!qoÉ/û› bíXæñˆ‹<;ƒlD9°g“ýŸY±Æ|ËÜ(l?±Ø@²û£%:r¾nlÄ14à‡€dƒ² >¾;xðÂ-éÈàÙÀ"™á¦ÑVä`T ìÆÀ‹l\ðYmg^qIšÌkó‚N|Õ^B_ ìÖjÿb²`îIz°ˆÁÂõ„µÃtær<|>º?‹Ì\{Wù„÷¨[—Zµøè£S\‘âbßÝwgHÆ¥—¦&'WH¢sèÐÔ‡äèÓçpEjH—ŶmÛ§ÓÛ§ÏeèNÖÆ©y`¿ |>&OÞÉ%“üfÖ7ÎüßVÌòÏöÿ*23}ûn¨Re´_‚!*jeJÊD³óù2ä@DÄÉ~ýõ+wïÎçŒf{ùòÜZµb$ÇwîÎÍ­Ðçõ×s$£fͤèèSdõ.[ÆUWL‚ø­O™F×PÞMpРáÝ(’:¶ë‰¯…ß *‰SPÌå¢(ú[cëÿ˜XXfGóäRd£óœ’Ý>®[ì|ؾ&¹¨ƒL ¸ág!ƒjIì÷dAm·[`àrÌ’$R|#›Û∥ø‚h ö/Ø ì%©7¶—Nž÷†X±ndcmôÍ«…älä;–8F—îó]d¤c10çñ-LrHm…! ¾'yIÂWQ¦$)û¼NÛÀX²dÉQcyÍIþr–[±~Ï÷^¼)d¿Ä¨ÞŒˆ'ø/ë-Øml’‰ãn¶äãqốT3Æ €!%¼øªÝnª$!ƒùÇýÄ ä î’KÙ Û[ÖœØ>:ÎD6ú”q ; *}‚ÉÊÌ`û[SQ—¼O^sÂëãöw‘…>;v®¾ûERùFÖ•·nçæÑòVdæÉWÊŸêÅ‹iÙ‰OqQrr|~¶ì 7œ"©Ó§gU®¼Yr<ùä3¨°æÇ‚©-”ì .œ7ï¤ú]¿+œNÏ×_oóó M&Ûsϭذ¡¼ðÉßø«"#Ãùõ×ÛêÖýÑ{lÉç\e­©©Åÿüç¿J{Ÿ>;œÎ3¬0sfV•*›%G÷îûN¢ZVkž?7eáÂSìIÖ¯§F ªUcÀ€|úübûŠuåôæ”Ô¡¿çeÜÁ6ÃôµÈBµãʪ¾0EÑÚJQÃ/«ˆæC•÷ÊT\a`²Qe4ûTþ¯ö#;->JÀxp?rp_ þ˜å¥I 2ø>?ð6nà0žæ$•J3¼ËHÿ%ØIf »¼Ð‹ïc¦Da›Ãf`)K­Xà>?ÿdÓ²Ùk§Ë\r’½‡WD&ð­“Eæd®ò‘ ­@ð=?`ˆ”‹q§°¥^‰Uaüu ¬ÿ1œ×ç/‰Ôïqˆ—ãI%¹†p΃—@ÐÝÍ£$vß>Þty˜A™ì´c™ÇCÅdÏa°¨MÌôàùŽï¬X׳˜Âº(l™éƒÃäucöýÌ>H.ð »Jë$üF‘ãj’óð¹ -Ü¥KÐÀ ¨7)¢ú‘ÝÀ¶Ga{I.<d|ʧV¬G8’J¼ÞcxµˆÜ ô³cÙÉylu¹™[Üd¤q·9Ÿ‘0-ðe“r!†(šÂ‘7pˆÝwüm`ýp^Ÿ¿$Ü9ìh…C¤#ÿ+ ‘v $A ¬Íæ s/²ßAÛÍÜXLÊú’ßý¸Túo†Br÷±ÏŠurÉ-Âõ6?Ea[Ç`8Û-Øßg°üptds2Å@WÒK‹€.T‚X<Ð6 ¼0ŒSm3r`´Œ?‚ìÔ[@Zàæs²9RIKŸ®“•[ÆPVçrG"•_ÆÔ›ÙÁN©‘ …Úp8-¨Ýíá®Q$×=F~yÑI3‘™ðf¬ÚPN/0v,!!˜LØl§¸4û÷{üÕ6ºuËôTÌϽiSAÆ[$Gûö;ÓÒÎøâ¶„‡Ïö.Ü·ïÜ–=ÉÉ…ï¾»Á_ýW²Õª5ö•WVïØqÎ)ÿÆi!'§xذØk®™â¿L!!#þùÏykÖü¡á]·Ûׯßnñæ;îX›p&šp~ ˜d29$Gß¾ § ÀŒE¡¡ªÁ°g\€D·nåkçåÓê6dæ±Ë?BßoQ$uï`O°Š•ÏÇ?­%"ÉeebÒò¸àMÅW ƒÆ݈¬ÔH|™l›O¢‘ËÁXdºoBvzÊ|åz¸prð]ÀÞšëDU“Øãð@{¼ Àf\1𓔀xŽ]‘8¾'XÌ ö^,*“OÑ¿…m ‰L´bý߀ÒM{{ìtñïäwó‚ƒÈD†1ËÀœÂu>r EIÁü1DZ;Š] GùOßÀJ>¯óÚÀà¼6° Hbc²¦ã[àN#åâ@ñœ÷üe<$%Ñ ‰‹Øý¼ã ò0Ÿ—õÜ–ºs²l÷µìŽÂö&ã )ÎÅõ ,Ø7’¼ÍþH8p5ÆhAR" kR’àú@ 0ÎM¥$B –ì§Ï“ƒ‹ÊTi¸k²H«ÉwÓl"²ñÍö£çšQH³ÁÈŠ5X æË(Іo¼5ìÞYèôÁ±W™9\þŠä7Ëߌ¾þ_dÆ|Æ ¶Óß}‡DH'–? Û¶¹ëÔI–ŒÞ½+J×Ý¿¿$ªU«‡Ÿ:êDÒ—ë×g]|ñÉ^³æ¼‰+úÔù½P\ìzD!3WßI~y¦š_±=¼=‹Û³}?Y¨ÿø±e¾zØP·|DÉÚžB•O‘•IeVÅ]ÙTÉÆ²Ä’–y©ÈNy”Ú«¯FÚí,Ùšæøh–‚ ¸ÑúÔóÖ­º‘nÆP²aÎŒÄщ-ùxŠp÷d‘û2€ñ¬ˆÂ6˜9@q¥Üö$ö–ÒNÖóË.&äã 2†Û\ *(´æ!ƒ)äûÜ>ÚÄe ïɧòBfSZúÅ~ˆNs¨6šme–ž ýˆXR†ØîõqÇ E·aAs“šM£'‘…¡³¶Ò¤Â†Û¸ÝÜÖ™¹©kù\¯¿F"4”_-@)Ö®-®V-I2úõ«è3Ì0\×^+9.ºh[EJ§ÙÙîGög¼?õTÌ™e¼Ÿ%vîÌêÛwƒŸÜã/¶Ó§ÏšýûÏD•ûoœ œNßäõ_ˆR“·¨èOøULjÔ©3_²7k¶xÕª3)€ãGq±ïÑGHŽJ•¢'O®¨—tÓ&WI’ñò˧Øö$$Т7ÝĉRµEfj_ÁÞørz×n-I6娮}ÕB&›‘cÖ (j½ÆÁ2Ê-ù.ZEV^,³š¹¼´ŸA»G«….^‚ì .Í%Ì'4š°hbÆ_ïldÐ> ÿ…ß •Áþå\ŠÌW‘œƒÏï¶Gâ˜J*0žìo°Ú‡Hë͈—™L– —ŸÛ¾‰M>|¿ñ…A1,È .M•»›çDŒ*d²9…v>2¡!æó †ÈìBA Ž6W¦p7‹›I"aÂI/ÑQüm`#œ×ç_b`­lCÞ:&6W¡øim0Dþ ø‘^Ò’¸ÌÀìÂq€÷D¢™ìÙô¥Œ±5Ÿï²l÷C¤½Àˆ—™D–ßK,·`ŸÉ~`G"qôf7pÏE$5ÁØŽ‹2Bÿ^Ë ×§!ƒ7ÖÛ>:pÛ¸ Ù¹j9¥ ïçV —ýBn+çÃ¥ÈJ“A¤•Ù,ɤÎë(ŠËTŒf®Gª>x,{”S%&§Ò¤ 2óƉs?ø‰ˆfgÀƒY³ŠÂ É<¸¢ù´YYɺu·¬]{VY¸ãÆ©Zu®d¿òÊegVoäìQTä7nw›6ÓJR:Íž}vøþØ”‘qæ½ü|ï?þqBí~ìÝënÔ(Y2žx"ëäT­ÔÔ’¤–öíÉ=ÁæhÉ*šbjÌôò–‘ÄTšÜ‹"yåóc»ÜÚ¿,ôÔŸNÍ>(ŠŸÖµ?ó²Òú{ʺ€ýTЦIìÂÞÛ‰ì\XEÝ>®‹CÞø·–c2¨”„_§Ï(tö¼ÿ[Á­¤š1ÆRüLJ$ŽÙáÁ—FáƒÌí‚=ŽŒc6Þ‹YlÅjÃæÃÇJQèë¹–÷ìXv3)‡õ"·p§‡¬n402úàf<HŠÀŽƒÝwá ï°çSìþ,Š.XççõùKbqSì"qûÂ!>‡s.†H®ƒ×€¦ ˜œËs89M»hÚ;Iðë¿íÀVHÎX^·uˆ­¥l÷u¬~*qÏbH³`„ù9ç๓-‘8Ö ü—3FJ¶]QP6Pã"Ü Ä`u êÕç0rpC\‰ãÚéåŠeÈΗûJy¸v*²ñ¯21A¯;~DVþ91(ö7nŠ¢fâƒ;ŸT’ÿì>n£þí/'K*\ç ¢2ókyu ýxûm$ªTaé©êþôS¡Éd˜LƸqÍ{w:}Ý»ï“Õªmž7ï¬ £¸¸¼k®Y!Ù+Wž3dÈr‹ý1(¥TûöÿÔ·ï†Ã‡Ï¤XÐß89N¥ýc Ý”‹;r¯ºjyéïðl•‘á¾ñÆ’ã‚ ¶nÞ\Q–aB‚§yóɸフ9§ýÈÊ¢M$®¹†ŒØ¢‡ip2Ó¯¼”—B'7<…"éôb9‹ÏÇ“…fÿ"»ÌîÉëãö¯P <9Y©üéÑ’8ÀÜØl„¤Tew>•æ2›µ_ÞgIÈÁeÛ)ôø¸4|¸á‚ƒ~N×hòÍ7“ê‚ÜÀò¾’l`  öAÄLÉ Ã_vðGœäã?6¢öÆV;–ù<â"'O;ˆLâÇÆ˜S¹’¡&V“ù0†È~–l;±¥>…û˜W³ÄÀª0$IÏÁë¼60øÛÀâðìbIs wAt(…Ûɸ Cä¾ 6\î%#™–æbVÇÓÏAäA>ÎåÐlºÌáBÒ¶³ØFÔ$Þ÷àò³ÝûÓ?—ÜcÈŒýØ`Á>ŒmÀ„`ÝÑ–$›1ÆÆïr Yp ðÝ\dpe*E>€|/Í·!ߨ— R‘ªs‰,˜±™Tl”­-{$‡zŸ#+ßoò¢¸ù‹ âBv>·½Ã•/òì7åÌÞÉ“ ‡ŽAfª_ÊŽ]åô>_‰¬sÕª¬\y²Ë|þyIAèyó**Råñøž{î äˆˆˆþùçò—ù jyK=÷ß¿)=ýÔì®s‡ììb›-®uëÉþhè‹eÞ¢E ¢åWAü¿ÐÁJHÈ80æÂ 'ø§·F1QQ+7oN;õ;Ï%J=©-[.ÛºµB†ÍöÁƒÅW\±Cr´h±}ÏžŠÞMÙÙ¾k¯M“ŒöíÓòóOöSËÉ¡m[$.¿œä1Å´½™¹ûŽOañùxøÉÅ]I;®üÃ<µ榷Y,æ>p>Š¢ñÛ¤—±ºögRk²22úhcr!Æoî\‡ìôÌÙ'U6crPZäúµdpmZɦw'T)ÌÃ×Ê`ÆX@0˜#‘8¢Ø Ä‘ÙûƒÌM¥°×[e’Ÿ&0ÁŠÕŽXÉO6¢f3XÃ;v,{ù5›U"·p—›Ì®701^AW\1L$UÁOlk"å[¶¿„]lìò·õWÀy}þ’pf²² v±‡_Å!öÞwô‡ë‰‡– ‘Çsÿtr8PnóP4_رlc˜ïT>ö뎿ð‹ë4¦œŽ{„¼nÌîÊìxrJuG§‘ #ߌq‹7Ù¿G>&PèôÑ:|ð·ÏÉFªm&>ð¸8Ùé¶éè ŽÞ…lTM\™ujöLV*}B´q´1³€ û¢(¾X4EëwQ¥{ùd¬S&þëud沎dŸà‰àóñÜsHԪŦMå)Å›oæHFÕªIkÖTÔ¾ñùè×/Ñ/õþÕWå,ö§¥v=}zRݺó%û….Z±âÏ •ŪUI=z, é7.»ì—cÒÒΜvv®ñWVr÷z}‹%ôè±È/Âî—×80&3óR=²²\=z8J¹€e}•;Û±±EM›n“W]›˜XÑcAïæ›Ó%£uëÔ“r.(à¶Û¸äO8ì¹7™‹Ú’^õëýïQ$5oeÇqÕ v*‘ùä—àö@Bôœ2v——£•‡&môú¸k6²ñ¹Gëäøs±ër±}Ðirð¯ø’ë\„„8\p\pø”\3F÷eÑŠm>|¯³Ò‚}{–ïÙÁ+ÖÏù¼€‚4Ž ÷H^Ê")•Ív,þ‚l;yÊAd2óùÁÀœÆ=• ¶~g‰# ͆Cl¿˜ÜíÌgv(Ù[þ6°þ 8Ï?g¯$æÜMê<ìb~ ÷S ‡È]p½>¿‚ ±´d®10;YtDÆÓ/ŸÄÙÜ?›n$'±ÏFïѼœÌv?FPÎÆ ö÷X,*£;ZŒïR»‘>’ô1ÂõÁ79ù»äԞìüVÆ–xj)²qÕ” þÁ+s‘•K¿%·Œ­²0®DÙ»Š‹¹÷^$.¼'ŽaŽŸ‚ÌTnNty.¶)‹1Ý@h[æ¬>¶+=—KŸG´ž8Ý\ó1Šâ•IAãßX€¬4Lf™MÇ7!Æ“ðô—ª ެ{cÒ‘ƒú[ð× rúh•Š > ln?îÁ}/éíIÝR¢,º?G?â…²`šEN~lpðõ[#3ý¿=áup¹èÒ‰† Ù¹ó„÷‹%C2:wΈ= ë§Ÿ2Âã%G¯^ñn÷YYE~ý¡ÐÐÙ’½C‡Õü¡BY'‚Çã›93¾sç9!!%˜6m¦}þù–¿5´N„ääŸ~ÚóÔSËÂÂJ\€W\ñë×_oËÈø“]V~x¸©×GûUÈN߸£§¹-ƒ*£‘ŸË”šß›AþÈÊø2T†‚b®øEñæÔ ‰òùxô d¡Å³¤ï;yRá„^HHæ˜Ì^Á½/PXè{ùålɨS'yÕªÓàB-Z”S£FŒäèÚõ40'²eéMš”¸~ùål] ¿#ŽÉï×ÏÑ Á¸ë®›ZªÕÔ£Ç"›-Î0þ¶àŸ·Ûëp¤õë爌œæ·Dï¸Ã1Òï²úëØ.¼õÖ5¥ÎÞQ:~|ºƒñôÓ§±ÁÈÊòÞ~{ºdÜsO†Ãq²x¢ÇÃc!Q»6›7ŸpXF-Ú#3¯¼WN¯‘Æ…÷¢Hž)/û¸÷Ð’2©G‚ép+÷”SV59Ÿ ¾BV¾(S4,µˆÆ?!ýGh+¨ IDAT¯èúÄä óž’KŒüÄ/Ü ‚çGøž|3FRrðϲ+Ç0‰³`“Õ>ˆ!> Ûëü˜KQ*©óñG|”@BYn»÷r^ZÃ;ñÌËdƒÈmÜç!­”þ ÷ƒ c0DJs\Gˆ©Cä­duGìbÏÇl|›N?Dø·õûã¼>ILº›Ø9Š˜žØÅæÇI‹ClkŽ'! à¶ îÁûL00§r“ c3´-do,£ìXVóø¶³ÄFÔDÞuS¼Ÿý¥l÷Lò_et¶]$zñ½Âr öéìú²?‡•x`Áºµ×“bưQÂÕ|>8PèOŽHb{iªð.äीoÉ‘MèlÂf³¥Œ%ôÝd£ÖXÊj"މAVª}Æ®2Ƀ¥%è—“Ó ‹i÷dá–¾·•=yRáGƒ™z­ØâÚšdoN§ïá‡3%£R¥¤_= Êц %!’Ûn+ ‘œôeZZ±Å²ñ È1œNÏüùGzö\vÁ?•J7…†Žhß~ƇnZ½:éO‘xø³„F÷îÍ:tG—.óKB%[Õª£ï½wî˜1»’“ÿ ’ÌÄÌ™Iõê-ì-œ?ÿÌkb–Îö!GCä»ax¯».M2Ìæä˜˜“YW>Ï?DÍš'cRº\Üՙ騅âãŽWè¤]OÉ-Ï•Ó;x&²P¹;vµgrÑ»(ŠìG½>:GV:ÿt”eåƒ.ó‘[g­fáñÑf%²ó^Àå6?9¨º™ýN7´ICoÖÒ/ü|ð{†÷ãnA’c)ÎU«V-.CùH¢ ;sº0{Yn<ðK¶eìÆ1Ίus€e¸íû˜jDz”ç=8wðƒÈ4¦ç2ÐÀœÁðLPß!RšaˆÂŸ9…CìëNâ$ìbQcr÷2ºêßÖ_çõùKbß$lâ§ÆäíanUì&²6ׇHDn? ‘Ö>ðã® ©Ül`.à—Ã|î r?ï¸)\DO;–#,ñáÊ'6¢Ì"˜í>‡è(lV&{ñn%Í‚½ó2q–%E‹pš1š“´û²‘A»€ØÝöB"¢ q°:àÖzy;ÍÓu#e‹é=ºÙh;=¨ñÉéÈÊ5Ã)*c3Yí(Š û’ìò02¸ðidá™ÓL*ôùxàn¾Ÿ+n9¡Â;ÁùGI'­;âñðÒKÙþRhC‡ž†c&.î(É7!ál+ýù| | R¥9¡¡³ï¼sí’%r®Y¹Ø¿?Çf‹³XæU®<ªÔ¼¨Vmt§N³‡ ÙÿG«ÿ1ÈÏw/Z”зï†V­&—žµd»øâIQQ+gÍ:ø§h„žIIΞ=c.¸`¡d·X6¦¥m²ªÏÇÛo'ø“< :J…±±îfÍR$£eËÔC‡N1QÿùOI.ðŠãª—–ý&ϽA‡û¸¨- ÇÝÚ>½‡"iÑ…ÔãbÚ 6v?¦.åTG}r4Šâ†Ïp•ùŽŸ®DV~IR“1ÈFÝ9T¦ñ‹}\½œKJŠ:x¹x;rðe`ªúå"ƒËR),/8è è¶û5¢]eÑi¤Ÿ±É‚}[{™•;ÛýÜöB ËrÛdÎãa;–6e0ÇAä6ºxH.•`„;@ð_ò`ˆ´k)Š%:Œè0 ¶²äìâÐ(–?ƒM,êqúÖÎsð:¯ þ6°È=ÂÌŽØDôGÄõÅ.ÖÞFÎ<"¦®Ã$_€!Šf@wÉ©B¦˜Sh[\âĺ¡ÝGXê»È÷³ÝGñR6É9äøÙî8PºYÊà#6Z°ÇVàë2º£Àk' ––kø2ü^rpU,Å>€\7×,Gvþ{ôd³Šiñ3²ñF™zõyÅ\ñ²òúü£n/¢(zŽ9vÆ¢÷Qí!daÈqÁ}—»$©°Íãå$æpÃ?™Ö·“š~lïÑ/™ÅõןBA§C†ä›L†dôé“SñøNb¢ëê«c%GóæÛ*ž¦~DGg?ùäf¿+ë‘G¢ù‹æñ–Ø‘‘ÓŽ·9&OÞŸ“ógÊOü.ر#sàÀ˜NfGDŒ,=ÁzõÆùƒ¤YÍ0·Û7xðZµæIö[o]û»È­y<¾gŸ=è—)™4é4’^×­sÕ¯Ÿ,:¤¥¥ÂÓùÎ;%ŠÁóæpŒÏÇKï–ˆ¶Ä”—ÈÒφ"©q Û÷Ûµ+Ú ýŽ«¬5}3Š¢Ú«ì.c:nH ücB>ba™ Ä )DŒÄdã·2ôµ™„Í&l6«sóæäàšØ¡Ñmn"’1X|6pùfŒëHÉÆ L$¹TYt+éì1/ƒ¢Lòü±‹Ý$S<ˆAV¬›Ù\ÊmßÈ šÏíX6Ñ߇wÝD¦3+‡~æLzÁ\ÔÇ{ˆäº¹ˆ½âð+ìÿ »XÖ’ÌíŒ cd8;NßÀÚr^çµÁym`¥l“Ę›I^‹ÍĘêäîbA}ì"e6{îÆ!޼IÁP ‘zÄB„Þ4î200æ0ƒDîãMð­å;–XFËk#jß+YYÊvßR&oPðsº0{/Ù¥Ât«ÉrðE’bÆøáÂÅÎMá¸@žË•;ƒÏ»Ã YDÌÁdgf™ýâÆÔ’…ffüÑF‡AÄ'˜¬Ì,Ü—JõWQ¿ç󟺦$©Ð¾ñØ®“'fåÐændæš;ËOÏö#5•V­h×î„Ð¥7®0<ÜŒž=³N.~XééîöíwJަM·­[÷;p`»Nšø|,]jôí»¡OŸ5uêŒëÜyn¿~ŽyóŽ$'z½¿Ã™¬^½úì")+«xýúÔo¾ÙñøãK[´˜tÏ=s{õZþóÏûÒÒœ\Põ©§.›<¹SjêS«WwýðÃëÛµkbú]>÷wÇÞ½?ýÁ»·oϻ䒪v{ÛE‹:\yeõ³<ì¦M]ºì_·.ãÊ++/XpY§N5+øÆ~(2¤ ¨ˆ—^ª:mZ*UN6oC‡jÖ,…†jâDuérÂa¾ÕüeŠ×Ô‘ºã¦c{·î‘mº@_½.Ë-A]^ŸÞ£Œ\]‰~úLe¾ ÈjÒ?¯RT™wõ[®B·n¼PÝQ¦Ñ¡Ú7Ôgm6¾¿[…µ¯­O¯”$/ú2E&½ÖP‘U%id¡²QóP ¨!Iû¤ù’I)Õ‘|Ò`å‡H«JgU–4]i&—»jܤZ˕蔧‘ªÞ¯‹÷*9]¹•ö Ú§)-Q‰&™º¨K± i›I!7êáP…ÔÜP…_ªGª¨NŽV™ÞXQEúÙ¤šUÔ%\û$§ÔTÞ®ro–BUc€2Æ*¤šõ•1]!•U¿“¼ÕT`(¼†Z½¢øÅ’T¥îI®àßø`â/û8÷0™LX¥­õØdÍl/¯SnQì¿”½I×ý(ïF¥SýgÕèÊzD¡MÕ`‘Lí¤Ýš¡XÆÔÒ¿ªJÒ ú:E÷ÔÔ‚Ë$ )j«FÑíõ´¸ƒBM%Ï,×{ÔùBÍû§ü«èÙY»E÷^ª9—¬e ¨ µZw]©…¯+$x{}¤¾µ«eSm¤U‚fuÑz=ð–ŠŠ5ëkÝwó±sn¤¨ç«Z²Zwܤ¹T¹Rù—æàA=þ¸Ö­Óý÷kêT……ì:nÜè~á…œ˜wÇŽv{ºu+´mðzéß?Ùj5|>Y,µÆŽm^¿þI?¦bX´(mäÈÃS¦$Iºé¦º_}Õ²C‡:gØ?™™Å‹'.\˜–V4kÖ¡Òö+¯¬½kWvåÊ¡uêT ¼"JÿnܸªÙ\µôß *‡‡ŸÉ¶­¨È“•åÊÊ*.ó*ù7)©Ð0 ýgd8]._åÊ¡N§×ÿƆ «Üxc£;ïlܹó…W\Qû÷™‹sŒôt×Çïùá‡Cn7Í›WéÝû¢ÿûâJ•Îv» 4(åý÷].¼îgŸ5iÞ<¢‚ïýè£|«5/<\_~Yóµ×ª|ð„ êÕK3F=vÂaßQŸT½š& ÕýíÍÌUÛ§t Qo÷Òç¯ÛûöX}9]×^¬ÙêÂúÁ‡]ª>¿ª¥YKÿ­ j•4Žßª^3Õ¼––>­_Á¸=zz¹ZÔÐâûtqÀÎüá^Ü®KªjQµ¨*ICSõêµ­¦e—«Zˆ{Õ*M.4·ž:EHÒÝÒbéui°ÿ°*|W9-6]õj)䀜VÅÊ×_-š*"JËräz_‘íÔ¨¿fVzuè¤k~ÖÏ{µ÷&ÝÔIÖhR¬–_ªvwêÙú-N£êªU}š¡9GÔ¿ºÚ\¢wÓt›^_sÃÔMÚ%ý¨œ5*¡j/È×YûPåVj1S+®èæuZú¢R׫ã`%%jíW&«*þp7™LÒæ >\>úÛÀâÛË”¹W]F(“vÔÅ©åýŠyJU.RÇÚyäU«mÊLîmª5\U·K䇋õB¦žQݺZ¯yZw©¾®ªë—é—r"Õ·‘:N×'™2ÚëÁkuÏDMܧ}íÔî^Ýû‹Ö,SìUjöªþaWüÅ6Qõïu›Cù¯hO¸B&ªe UΖï6¥¥É÷¥j=¡ª’—&I÷Js%I‹ôd¶ê…hg5Q†G-c•æÑ¤z´®$¥¹tí %ëã+ôáe%gZ¤«§*µHßݤWZ tõp¥hØ}zñ†@cžþñ­@w·ÔM]SÞÔŽCº¿½f¼´¿”4`¬Þû^µkhÓx]ÚôØi?œ¨[ºép¢ºÜ­i£^þÕ‰‹Ó­·*#CO=¥qãŽýˆcpà€·sçÌ}û<-[†-XP·iÓГ.ƒß~Ë~öÙCžFÂÇo~Ï=ÝîŸ>&$öí»39¹X’ÅÒhÈÖ—\Rõìü‡!)©pݺ”µkSÖ¯O-.önÞœîóUt¡¨];¢^½ÊuëVª[·RéuëV®];¢ À“™éÌÌ,ÎÌ,ÎÈ(ùÃÿòx|<~Íš:5©];âÆuèаU«:YÕñp¹|DzZ÷dg»CBLO<ÑäóÏ[šÍ'ØgœÒÒY^×¼µjs…ÖŒQ•à ˜±NPX¨}¢Û® êZ»_ŽRƒêzçêYÒ˜«k†+Ë©qÝÔóÚ’Æø<]7M¹.»]=//iŒÍSÛÕ*òêç6z¬‰$%»Õ2VÙ^ýv‰ºÖ–¤û³4Ë©G«hRmIúIê)Õ“vJ ¤yoSz®|£T矪ìÿÒîXôPþjú“vMÖ¾+TçKÝ´^{~ÔòÚªö‰IÔ‘ñ_I•^Õ«.åNÓÇHêƒjª¶\/¸UÐNýêêÒXuSí¦z˧ÉEúµŠ®­H©§Ô\ÞEJk-¼j°]{SÑV5û^I1:Ó¡J¿JÕÆèŠ™fÉù‚²jÈ´\ Ì M‘ZJYÒTÉoðÜ©ÅÅz¦ªF×’¤1ézö…kgkÕ •¤åê´^&iùº)à0žyP,TåPmz@W•6îÒ¿ªj¸bzëòz%+÷ªÓ`¹½ÛKOw š½ƒ©ºáueäi@/½óPPè‘w5e±®¾TëÆªZ°‹KÒžº¥›RÓõDwÿV!'غoܨ»îR~¾Þ~[Ÿ~Š«™œì»÷ÞÌ-[܇Ο_÷ê«+êŽJHp=ñDüÊ•ùþ'ÓW_]þ;<° ¼Cÿ½óŽ‹êlÞþ÷ìÒ»‚ 6@±bÇ{7±&¶Dc‰&Ñc‰±ÅŠ5hÔˆš(¦Ù{‹${Åv±Ð”"Òa)ÛæýP0¨ñù™ëZd)*‰Æ¾KÎOdo+‰ß+ÈR’&—,%XÍ¥æÜe"cEy'GNÅŠk¼Ô0HêMé,Þ1âoã) ]oÉzÙ/+üeØ Y'"¿Ê¯>â³Q6ŠÈïry˜øÏ–í1JlW x_jD›–ÜE®yKðZɯN"É®;Hò{]V‰ âúxJƒN,âD‰•£S´Ú„ Á2¢åú¤›B€”?,I…ÊÀ?8&øK½EXî|ÄÛ_´…„? ÃÄt„/JB#".‰º»¨ºÉ¾à§—24R£à-ï}Y¼ñ/߇ª‚«Œ˜ü¼=:|XÌÍdáÂç©å!%ÅТEb éŸYøx^›^oœ93F­¾Á‡†‡¿2:ﲇ »šGÉ]¢Äï¾¾w³³ÿÑõïÿw$'çܹ“vþüÃýû£7n¼³|ù ŸàÑ£§L 1âÔÔ©–,¹¶fMØÞ½‘§OÇݼ™Ÿõ_áåú;qölrÓ¦§ó*ÙkÔ8þë¯_|ÌŸƒNgœ93&éªuë°Çä#fòcF†±S§$ˆupˆ?yòÅß—ë×¥dI4è™Ã¯DäÈ)±p\eæ¢â~9‘?çÀÙ§—R2óçá¼ÿ‡c3r¤Îla˜tøF ÿ¿, ÌçexXhÌóüË‚¿”Y/‰…šzóHÛ+}2èâ`ñUÞ7^c÷‡B¬,/8ÕPDZI>Ïû.Ér•ت'z‰ì7äR ”´ÔÔÔÅr©«,‹R@Ê3GvÅxQ.úˆÏRYª}„\ö—akdl¶d¦Èí_¥ÛoòN¦Ähäf°4¼(M²%"E>×T™ òƒ"•EwKbM$ÖTt·åFU F’à>ùƒqn®dK‰ –Y*™c&‘g^êáÀ¹¿àõZ;òZwFœd‚«„EæÛHr˜¬uäþïØLÛsäþçŒÜé&Ù{$‰wc”ˆˆ"r!QzÅŠk†,É«ÁÒࢼ‘-Q…¾6Ò$áùtµ OHh¾’¯|Äç®ÜÕ‰aªl&þrKD&H`W Ø ·®]»v^ÒHðrñžd‰H¼ªJ¼«Äþ*ÙRhÎ訂ëÈ#k©š 9yd-Ùb~QTÁr¦à¡3ʧ…éY¨%0C+ž›™Z¨05Gܾ|dvQÊ™Ñ[„aâø¹ÜýñáÌBW)ÙOîýÞ&,Jì[ Þ²ä½,ÇóoÄS}‹WÈÃæÍ¢R‰¢È?_;P¹mènò“¥¼h#ȶZaÙ‚À¨ ; €_ÊEÿ!5ØE¸k-ÏFØvÇI‹Ì&ʈ¸ š‚-0•´4Œ*X¦ðmAH÷Kª™¦g‰ ªãKSÝ’/ 1˜(l¨‡½ »âYõ6¦¬iZá«+œˆËÚ›³¾'*…Ù'¸óÄTKúÐ¥IºKZv+ÎìGϦ$gÐs>Y¹E–ªT`í,…‰~¿XÌ´nʶ՘š2Ï…ß=s£Þ{+aøpvî|Á®š›+[¶”øøc+FºwOþ駬ç(תU«ðŸ­ZÙ^¹R£[7û´4Ã{ï…™•õg ƒž5lýµÑ¡CMêÔ±»?{ðà+Ÿ>q"镜üOYûÿ{$%i'O­UëÄöíqÖÖêI“*ݺÕzذ jõ«©Ûµ+µ^½›™åË›=ZÅǧLá3?ßÚ‘‘†¦M“ÎÓU¬¨>uʱnÝgBàÑ#:tàþ}Z·fëÖg6ܸEçdd2 Ë棙Å;ãIˤg[ƽÿôªÏ&~ ¢¤-»¦`U´*kê~¹J +öޤDA‘X®÷w’£gDCºT~"|­‘ÏjÒ¹B¾ðAî,ªAÝ‚¬ìÌXJ¨©iÉç.7ôøiPÁ·ö¨A Ÿ€À¨ÀtÒ16Ãì]¬€õÄ_%ÓÓQ”Nzê鎇+V¿”ƒ¶nÕ({šÓ™d–£\uª_ãH ¸V§å}¤rÛ'Oz%²Gà 3œ]šÁ"0Z1PÍ/ôuÉÞ ¦X'~>@Ù9Üš‚ñÍ­hà܃ᇰp b7έhøì„b û ^¯;^c+ŠÂÁ¯i2•)WSº=6åI¾FJ ¥ÞDŸAÔ8x0Û™™_!Ÿ-üf†ÑœBº†ïË1J]:gS9Q!¦X?äBÁÞtµÂî!÷¹؄&%)ùˆGW¸ÒÏŠ¸¤’uˆkUqhŠ«Ã&nã(ç‚Ù 4IbÕ³Œ³ÈjÂ80ÂpйÂ*{˜“É=ÀtWÌáD&£ Ü©ŠV|_`Ì ®¥ç ›•fbŒÂã¤kó…-*0¶ z#ƒ÷­Mâ? IDATϪUlú¯2ÜŒ£ß yŠÂš±T/ÏÕ†­xÚº=Z1ùôÞý’Å•ßtëÀÏß R1y«ÿÀìð#F0}:pòä ¶T­Æßß~æL½ž>JûúkÍ (''“_~ñ\º´¼¹¹²~}Rơׯg¿ø°?‡öí.]j±vmÝ2e,‚‚R[·>ۡùŒWuþñVkôó‹¨Téè‚÷ôz8°ÜÝ»m}}«ÛÚ¾‚6U ;Û8fÌý^½î¥¤Þ~ÛáÊ•ê-Z¼¹CHˆ¾yó¤Û·õÞÞ¦gÏ:yz¾àS¥§ó曄…Q»6»wcñŒ2­{‘tìGR Ý;機‚Cgs3œjî¬ñyºm%àó¶¢RØøKYÚÌ‚˜¨Ø>œ*.Oä3Žqõ!•J° ýáÄó\O¦š åKŒÂÀË$iéìÌH÷|á¾4Æs1‹î˜*ax:øÌ螆pªÀDŽ’»‹lK”¯qP ’☆»-êsÄ_%ÑÓÞxÆ‘Èmªwh”AÆ9Îé˜CæöMéc û€|$hcø(ÇF¢rد`nÍ0È«q›Eæ,Ðcõ1ÉÈÀ²RšG0±§Ü‡\ý á|ŽLh1•ßæc48{>wcÿÅ_Ž×ÞÁªÓƒÜL7Rÿ#ÄÀñÙÔŸ 4•ªsQTD¬À¾&%É<‰ÖÓ&¡Ù£˜iÃDSäð›BV>îóµ)fUè„°ZÚ›îÀ9v†¶´ŽrTKnš(p«id ¦š ª«$Þ#ÕõLÜXIL89 øbo²•¬“ä3¡"\ƒ<—¦•ý-ÉF¦˜+¬óÀJÅÏIlHοÐ>® )OŽ‘þ—ÉÎïpgV–""ƒq… ç·£–3·™|ø‰Ð΂€‘8Ù°ÿS÷1¡­%»¦`gÅÆã¬øõiÏÁ[MIH¦÷DrµO¯ï÷dÅvlHZš¾}{§Ë—[¬[W·téWÐ'˜‡¼ÿÉeË,,TK—–ß½»RÉ’/á·<©mÖ,1&ÆÐ¦ÙÑ£ŽÎÎ/xhµôîÍ¥Kxzrð ÏàÁˆ}H‡÷ˆ{HÛælõ/>Ä廆í‡q°%àl‹¶*ÞŽaàŒ‚ï¼é]d)8ŠÖ ‚ß»´«öDxŸÅg0Q±¡'6­#‡cX~k[cYð|ns<‰²¬­›OLóPÇÐ(æ–¡¶ÀYœÑRZÅ,€;ð(°, ™B0[wÔF˜C”ãÛ85ÅN‹ñÑ@?ªÚbº³FŒ­¨îJ‰ÃÖ¡«IÍò”¿Àn-ÙnÔ)‡W´¤9QÛ•f1¬Ð“jK£´Ë`¬ùH͸µÐW!{Š9VŸ¿ Ì\B§TšÀUhӨЅG÷‰¿Œ]9jr«ÿ ¾’ÿïñÚ;X=}Q›rj5ÕûcnÇ­=XzR‹ŒbÎâÚc÷–â2 æKl}4 ‘O 4#S«ž°tæ:ÓÛšZâãYëNW[Ü5Ä…óK5š;á–IÊ5yáU 4VÄ¥.î¹èvÅzÕ’Ù˸¦Ga× G-2‡H#R“±ØL - ±„¼”Ú4ˆ`±%TÈe{€—%~åFDVÀÕ¹¼&ÕlÉ`|h¾ÄTÅÚ6Xšðã-v„ç ÍÕ¬{35ËϳÿîSy8±ëÌLXp€ŠrFV+Çš±( ã~ää"K*ëçà^†¸D>[ˆ±¸œÛˆÁÌ„ÑÈ Ñì;ò̽Z²„¾}IOgÒ¤ûXÀ¨QÖë×;˜š²l™æƒRuˆX?‡úÒËË2(¨ÚèÑÎÙÙÆ±cï÷îž’bx–òËÂÊJ=iR¥{÷ÚŽí!ÂêÕÑžžÇ||ngg¿²·øâUþcqölJ³f}û^ŒˆÈòò²ýí·F‡5©]ûÕô æaݺü¨jõêçÎU3ÆùYšÅZ{ïÞœ7ßLNK“wޱط¯¤Ý ’• C‡HÙ²:„‹KñjI)tx—ˆhÕcÏOÅ“Ûí:ÊŽ#¨T¬Ÿý4uKf=瓦á7ÿN‘¥ØTÞþŽl#[óiëB‡hù`aj š”˦jùð³¼iT`˜SÉÌ¿‹Ja]]œÌŒð~u¼iÇøÒIF¦føÙã 90Ú0ôh u1ýk %GSØLX0 ÕMßÂí±!Ü·À´3õ㉿ÎuLÚÑ.‘û·9£Â¤ ½2ˆŠâwµgšÄÓ LÈaoõ„Yó,ÌçŒY`Äj8I;ÑÅ`Õ€#)g0+…ó;ÜüEEýŸ Ðv»§¼5õù;[ ÁëuÇkì`¥'ìø†fb4p`1o|ph" æ\œM¥É(¦Üÿ «71-‹&ˆì\ÌZbLB³Æ0Íëöær¢<“AϺ\b¼ø¸Ã–›ò.(WØŸIrG:g9›Jj/š˜  $,†äθ9«¬ÃIßÎ`å]0»Žf3 À§ØÔÂô>†Åd /dÁH\Tù¤Ã£ÓH5|äÄû%É4Ò7œ#€µšmÞX¨ø.’=ñùf¨î€o#€§‰/(Xª[ŸÖ|¼—äB)²•YÙ`äfNÜ.bÎwÞà‹·Ñé黀˜¢ÅEŽö,ÁÔ„ö0—bƒISÇ0ñSt:zÌÉgô «T¬_ÏçŸsø0­[søpñj…Ñ¿¿åþý%mm•uë²{õJÉÎ.òÞÍ›ÿµ,-U~~å·m«èà Þ¹3¥^½›gÎ<ƒ~þ?‚““™ŸŸ×•+-;wvÎÌÔÏšu»ZµãëÖ=x%´éÿ@<ßÚÿÓ¸q#½{÷ ¦MÏžM)WÎbíں׮µìÜù™ÞÏ€´4û•e8Ð1(¨z: ?)„?Z{íÚü¯ÀÈ‘V;v”°°xwõèmÛ²q#Íšñû︻¯–‘É[ïsó65«±#¶Åå*?C¿©\¿Ëª)O3¶‹0Ôè'?Ò#[GïˆI¥ee–ô)rÔ¨ýÜM¦¾+S[>Ž8Et&M]˜T7_’¢cÀe ÂTOÚ°•ΊåH.¦üìžÿü—N¢‘ŽæôµX GÀò˜a.¢[K– ,Ä^ ‘ä¬.”¼GÚ”!N Õ°ƒs@gêÛaù;¿ Ò„&8œe« µhkË V ºÙR!š…‚Ñ…~æ”Ng.`Ë ¼Ñ»‘³ÅË‘<\ Pf>·}ªÌà’/†\*äÎ1Ò¢q©ƒÆHô%ݱ÷ˆ¼þœýýþ­Ázõx¬ì €ßS§7v\ÙCéfØ•#æÙzJ7#ç÷öR~bà®/¥'ÄNÅv6€ækŒC¡$œVsˆ±@:Ó¬ðtʯv_èDmWšȽŚÒTªH==º ö”¥l-jéÑáH)ìZRÈìä¼9ê±ÔUP¶rçi6¨§PøŽØhrL` ö¦°ÍUt€8À>ÈKÙ}lES3âÌ(pV¹QÅ‚kÙL.¨X¯e‹ou€¡W‰*ðœFÕä­ò$æðÁq?Û'5£•1|¶¯ˆÙ†6cT´zzûžXdÉ÷:Öãa*½¿"·è—«¦'ëfcmÉê]Œ]\ü†øNeزsè6˜‹×Š×13cáB>üŒ ºtaÓ¦âÕ £];ó#GK•Rä´i“””ôruë}ú”¸|¹F“&ÖQQÚV­nç1¿¿Bä…:nR¯ž}ttö÷ßG—/ØÇçvRRqùÔñÃéÓÉ}û^ìÞ=ø·ßò*ÙCC[TîÕrŸž;§©W/tÛ¶;;õ¦MëÖ¹[[¿Ü­{Á‚Ì!CRõz&M²Y±ÂþYÌsA‹\¸€‡Ë—S³fñjZ½?&è •Ü9¸™’Å%¦¯Ò{Z#zóñÛO¯úî`ûé'e!ÂkŽ¢¢;?Á¬PÎñ—0Ö\ÁÊ”M½x<5`öÜÃÚ$¿w'C®M#¦žÈ`^<*ØàNiS€“ZÖgc©ð=@rAÑÕ7àZä R0›š˜æ%s ’ƒ:ŒßpEô¢buJvŸDGlÛR3”Ð(¢¬°jNó{ÅqÇÛztŽáx7Ìq¨Â{‰ü¢áºή|”ÉbL©mE÷‚ðÕ\2f€«‘<Ú„þ6-Ȉ'ý*–nؼÁݨÌðCàB€¶ó˜ Ð}6ë§\}v:à_ü-x,1²c¾Ø5…–ÓMÊb]ýš Ÿ¢¶"vf0÷ û™±˜µÁ˜JÖOÇd<Íša&TÖ¡áû²Œ1Á>s©÷âC51œLâzúš`v‡ ñÜmO{SLopã>÷»ámy÷CxP]p3 ~\Õ#ͰïŠc.F"ˆ¦am€q¤é 4ÌàSHøÛc ßj8¯°Q±É3…e ì))8Úƒî.¤èx™¼X‰?´ÂÑ‚𿙯¦Røùmœ­¹›Â·ŠXt©Eb&ÝV^hV ZŦ x¸p.Œq?°¬• 8VWDòK<¦l­Osð#=ý#0Ó]ɛШ>IC`Š •Ô_@´‚|Cæmô•0… °áéäàí(2ÊbÓ*¹èö ¼C#æ0І6jTçÙ 4äJ(k€ê| `(¨mÿÜÈC ?€Êžù° ):grö¢Xcñ ß”ñáö,€ª³ šŽ©ù—Ö“L¥ŽÜ»Fr4åë’‘KÔ €ÎÅq¼þ‹¿¯±ƒ•Û’\ü×ú”(Gä°§”©Ü¿N….è2¹ùî#Aó¡ô4€Ø™Øød~ƒq8Ã…£vÌ2Y¢QPí¾È kOz7Xe]-Úƒœa›-¶Mhä %foRØÎÙk7®}@uW¬#HßÁ]`<å1»†f € غcŠn%™À'ðÄ5McF¦å'À½­øª,C#‰Ò(ðcÊXp*™¹NL+V·øâa®˜‡+»ÃØ.¨Ð⩦Âï‹4:Ú²k –f|·=mìöØò&jæü€ïšbvC¥bÝ2º´çQß#ò~ñ›¦(øø°lŠÂ¬YŒS|iWaT«frîœS:¦7oê›7O ÓׯÿÙº©©âãSæ÷ß+—.mzäHFݺ7÷ïOû“ÇþI¨TJÿþeƒ‚š:Ô¤kW—¬¬üGxóægþÀ‡üç­ýOFllŽÏ÷×ÕÕ|æÌ*QQí¾üÒÓÙù•U²çáÁm›6acÇÞ×ëeôhçÓ§«V¬øgß"ÏÚZ­¼ÿ~êâÅsseóæŸ|òâyMGŽÐ¼911´kÇéÓ”-[¼šgço8•äÐV<*£síG“‘Å€Îü0íé¶Á¨ú}ÁÈÌþtmXdiûEæïG­bóÇxâyOÍ¡óF.ÅÑÆƒO &z…AÇHÉ¥‡;C |ÁL XY w+#‰ÕÑÒ†é®ùj 5„ê©bÂk€“°Ìa(Šî;2U°{s”(rü‰£ 9NÚnî)(£©m†zC¡4²Üqn@¥ \H&Ù §úÔ¿ÊL’œ(_•7î°%‡$*—¥m ßêI±¡~ Ú§3MÐZÑßOXÀ2¦ƒ`ý ?aHÇþ-’n’u[/T¸¿3{<ôŠŠ7&q`@¹lšy¦/õ©ÿ ^¯;^{«×$€µÓè< `×ÚÌ89‡ºSQTÜ\…Ë{˜–àÑïà†EurïqóHšÕ0Tð“9M-è.d§3§½¬ñÒÏšJô²¦lÑQì«Ç[6”L$êç›ÓÜ›<!¤-µJaGJB%ƒ9êQÔV`+w"É(”(Œ‰&×eö ,!ózøƒ),‡<ª)[ÜÔ\ÔñmAAÕç.ôp ÅÀÀôàdƦz¨fßáXA½TOT&KÏûGy<ì¤gu&7Go¤ïvnª¬zÜT¸ïÓ÷±hÝŠøðÙ*‚þ…êÑŠÍóQ«ør‹‹ãe05eûjZ6áAÞ%þÙ |£F±};,[Fß¾ääy‹-½¿âÑ=½ÛñÃt… ~|¿»˜=±´ `-Þµ¹I§~¤<;TÔ³'ûöaoÏÎtéBzú35óP¢„êðá’={Z$';tH>{öÅœ§àâbºå¥KË›˜(Ë–%4ovïÞ_°P¹²µŸŸWLL‡¥K½ÜÜ,ïÞÕŒR¦Ì¡1cB"#ŸÇžú…½ýŸ÷‚Vkܾ=î748µ~ý•JéÓÇõÌ™fÁÁ- z5c+ŸBn®Œsÿí·ï%%é;t°»zµF§N/ÝŠh0Øvèüûï¹..ª“';txq0ÃÏÁƒÑé=šµkŸ9…˜êËÒï±0gïÔ)F!:žŸŸDÇ&l™Éf¯øŽK÷¨\†uã(\®›JïÈÒ2´Ÿµ)rȸüv'+úaWp5!)LB[áRPô?ê×3¨aË’ù’ ¦Ç¢ÀÏnT0ÐÁàTj™0Êš6fó!ªÂüÑ\EWõ$l Ä_!ÓÓ1ùÉÁ;‘d”ÅzU€_Ò*†zxxRú8dzÉöÀÃÏóìÔ“[‰®TÁ߈®<¨œWÛîÌû”-TÛž>` ‹È˜ ‚õXVaÌ¢DOâO“C#²´<<‹•+ÎmÙŠ‰u>â”?*5'±ëk€~3ž·ÓÿâïÂkì`…]˜>÷g¬ŸFW€_gÓj&ŠŠsßPõÔæÜÝ„}[ÌK“z­%VõÐÅvó7‘L4+a8“U˜Ø0HgºžNtt÷YèB#gêȼźÊ4.M¥lÒ¯r õ\qM'ý<çP©í°ÊK䡺+Vá¤ïâ.0òΘ^#s €v¥Q_D»,`xÀEø€®æx¨ÉÞM!KJ¨ÙàZa~‡ ¼YUiZ‚9|\PQnoƆ¶¨æ]æñX^EaÍÛ4(CXïnG_(ײ2ßõøl3g åeÃh^ƒèG¼·ýÂ.tÃo<"ŒøŠÍŠÙ;[öo¤ze®…Òy™Ïæ mÓ†Ó§)WŽ£GóSχ¹¹²uk‰Áƒ-5:4mÕª— !ÍCQV^¾&(HS¿~èæÍÉ/>ì?‚½½É˜1áám÷îmؾ½Szº~Ù²ˆJ•Žuëtøpâ‹ÿÿ<|˜»`Á½Šöí{ñܹggó'|1@Õyûxûptb¤ñhú¡×Òl(G·’•Nãî\¼°kõs·ý_üåx¬Š^÷n¡ÃÓ›¤"îR­™‰\Þ×»ès¸°š##çRy À­i¸Îˆ›‡õ—  Yޱ ´…$˜aÃ0ªë‰Ðà_–Ñ&8¤s>•£5ùX…é}¥r» ½A¹ÆÁ åQ6œâ”†Ì®Ô‹#ù!·‰³@ýu”‚ŸJ¶¨¿Ä XAÌ}ríPfcÌ#=ƒUk5 °ÜŽÚ¦„èWàNµ°aº+FI¼ÀDaK}Jš²;ž•QùjÍKóy-ôFÞ?JFA%·¥ ;ûâbÍ¡p>/ê}ØŒ‘­ÉÑñÎJ¢ ¹¦&lŸL™’½ÆÔõŘÔ»Ìýƒ‘ÓÙQ\³K)GnÁ½<ç.òÎÐâIJóP³f~)îãâÜçÃÄ„Ÿv˜6ͦT)Õˆéýú¥¦§¿t¦¯Q#ë  jï¼ãžnèß?bìØè„„¿*$®R)ݺ¹:ÔäâÅÆU03S~ýõa‡çê×?µzuôÿßìYÿ\º”6|ø5w÷#“'‡ÆÄäÔ«gïï_;2²­¯oõrå^:êù'¡×ËÒ¥ -Z„]¹’U¹²ùÙ³Õ||ʼ°Ýïøá‡¬Fϟ׽ý¶E` SÅŠEn.ýú±hæælÚÄ„ ÏS^»±3P¾_D¯.Å(Œ$"—†ÖÌ+¨'û=—ÅL`³Ž*¤€øê#héû`Ùó¢ÉA{}AR<¼(©E¿†ãÉdÖ¤¼3v8`ÀPŸú¥(u–­ µéd](?U¨F‰aPŽ/„ ߃ʞypö‚-ø’1Àæsú!¹8¾Ïƒ½èR(Õ‘GwI ž jWÂcQ‚rí¹¼ SK¼p`5*5ÝÆ²q @%¯çíåÓø—¦áÕã5v°L ~X­šÁ€yÛæÓa"ŠÂáoðþ µ9W×Q¦föÜßiU¬*’qM6MÑ?"åÝ ™_Ãr0…UpÙžy d²T!½ Ú}±é!ÈuV•£2 è/°Û÷*TÑ¢=Îñr8Öˆvd-ÇsÑÕÆñMÜ'û[`ÿ%' »bñÈ$Ò€· dpsY(lrÀRÁ?‹Ít Ó]igËCD’‡*o‰m€q!\-pÅæ6¤Ž#áéL(ÄGUÁžÝïa®fÅV1¤ß»t®ÉÃtºKf¡tYélŸŒ™ _ïb[q“S‡2e(#ïOcÿ™bʹrh+¥9|Š÷>AÿlÆÝ3ghÖŒˆš6åLqg+ EaÎÛ¾}ï;8¨¶lÉ®SçÑùó/};(YÒd×®Jß~[¡m[[?¿GU«ÞX° þ•WeFýúyOúv¾¾ÕË–µ¸|9Ï8šçüuïûJðÏ'5% àa‡ç¼½O­^­ÕJ×®.‡5¹t©Å°a,-_à©ü_pòd¦·wèçŸß¯]Ûjà@Ç‹«{{¿¸ ý)ddÈ€©œ–-Mš¤mØààâò‚;|j*;²u+8À{ï=Oy÷~>ü®lb| IDAT–ø0äÝbR3èô¡ԩ¾eOÓµqÉôñE§gR/ú%êšÀ– 'Å™JÏ­h LhÊÇõŸÈOųô:&*6¶ÅÆ@/¼w‰d]]ø¤À[‘À®TÔlõÀLxhdH*smif°Ž‚SÁlšMd"·$ªØxx¥PçàVn‡“V«÷© ì!(´r”´ ÌŠ"*Œ03ÌZÓú6gˆ´Æ¡.ï²SC¬-nntŠa¥žꕤCAm{?SjŒ™…6í1T¨»’´ÅÇD®Ï©\žÐp>Çf´œÆÞYˆÐi{üÐëèø¿¬'[P§Ùó¶óiüK4úêñ;Xy¨Ñ€G±\½HƒÎdgpæ7¼‹.‡?Ðh$bäÔBjšN•aÓqÿ5V@EÖ ö0 Œ0ƌƖùÕî³KÑÓ/-ãø¹2ïYâœÆÝiDOSÌùChG:ªP]âR #*ôpÃ)‘Œ=C©Q«¼v`<å1½Jæ€ùØÛ£:Lî^r€åà» ¯èÜË„ÅvŸ¦aPÁF\L9Îâ‡ùèíÊGòGèdÌÕlj‹¥ þ¡D=1Õåø¾;Àèý‰x"Ïkö©áÊÕ ü c!£iuA„ý¸QèT1ïSÆD«£÷DNGÎîéÎÁÍ”°gÏï|4¾x’Ò<”,ÉÁƒtéBr2;²oß35cêÔz—/;5nlihÕ*ÉÏOó4ë}úi©U«ÜÞzË>5Õ0yrLýú¡GŽüµã]\Ì'MªÞvÛ6ïÆŠd²þÒ·þ¿àŸL4š–¦÷ó‹ðð8Ú½{ÐáÉvv&£G{Ü»×&  aûöN/>þÿ€˜]ÿþ­[‡]»–]©’ùرÎëÖ¹ÛÚ¾´3wù²ÎÛ;qãÆlKKeõjû߯bmý‚ú°ØXZ·æäI\]9vŒV­ž§|è$ýF`00ÿKÆ~\ŒBº†Ž#¹F• XAÉ?”åêx{qÉ´«ÃÜE–v\bî¾'íÉ‘¡¥Ûfeñ¦'_8˜¦eàQ Âôú4.àsÆ™ÊY°¦NþHœëÙLŒø®æGãžJ¼‘NæL°H‚I,'xˆq.À|ìQE‘ãO,0 7;ÔyÍÝ ÊêZ çá1n¨P ¢uËfÍrhNssLƒØ4¦§ŽŒ{ì$¿¶ýn"; jÛ-TÛþ5„A øŒŒiÖã‰_ŒèqBäZ Y¸ö&êdþ\ç´Tâ¯ààŽYYîbëŒ{+ÎîÆÂš&}ùuÝ“ðÁ¿ø¯âµw°F-:B¯É¨Ô„§ÙpL̸ÏžX” - ‡X•&'CIl½=é°kÊ””óX¼ƒb…f5ø€+ÄÃV[|lôÜÎåLy&‚*“`=«3”8Í1«Ã›*LÂ8[’’ h`‚IA*Ti¥Fu‡¸»ÄY Im‚Iˆ!Ó“ÉTŽ‘‡ÖÕ4lØNv*FW˜“×ÐyìI#¬èeAŽà“™ßÑábÊOn(°;• ‚Ri?/ªÛË‚{ù’%˜ÛüCyT(22°6“š¡7²ø,á…åvìA +.E³è`é΀6dk™¹‰ÔâêŽæÃdåໆK·ŠQ¨U€uXYrâ ³—Ͻ{===ÍCB²'NŒéÐáNHÈ+›],ÌÌT}ú¸ž;×<8¸ÅÀåŒFÙ¾=nìØ/¯ ÜKLü—§ôÅ0åôéäáïuízaìØèèìÊ•­—.õŠíàççåîþÒ1¤—BV–qÁ‚øAƒ"7oN¶´TÍž]æÆ]»þ'­+Vh&LȸsG_§ŽéåËNüâOʈ\»Fœ?OݺÏS>}ßoÉÕ2áS¾UŒBv.£r3œJå8æKq\]³¶ñ¶NB]èÉs)šïŽ#ÂâÞt©õDn&$: ¯Rlíý„>˜s™t™Rð±O&qàj…Mõq4È22/­0¢¹Ã–jÓãªbCþÃoè ¼ÀwdXtÇÒëˆèŽSSì Ènî tý&%uès”7©ë†ÓMnf‘eý¼ÊIÁèLEOEð‹‚R––Žx=b«‚‰3ïYP.›Ý ²e² äÝ4Ws c,*'Tíɾ‰ÊûA¤]F1Á}qÇÌ%,EEk‚w¢2¡û,ŽnÀÄœ·¿ààÌÌéóéó¶ó_üm× ?øÉì!â,#?—®ÈÂ~òË †¬è&ç—Ë,•|ßXB”Õ*Ù^Kâ÷Êofr¨¬dÊ%k¹l+Ùg$©“Ä;‰îºÈv3‘´LY+e¤•ˆî¾ø‹÷]ùBD.Ê‚é*kt¢Ý# üeØ- Ôˆf¹,÷Ÿ{rODÉÕá²zšlÑŠNDÖHhW ˜$FY ÑÞü¹Ü£È§’â*±ã%UDô"=Eù¼à*“ Òò‘+SÒŸ\úœXQ‚¥ê Ñò%WÒ¤Ì!QdßÃóeð1Á_z(j6£|ú›à#µWJ¦¶ÈÒáPq'ÊpùåJ¹&GúøJíQÒvªdf³zƒŒ["x‹s¹Uüv8.®uWY¼ê9›*"b4ÊW_‰™™(Š,\øåÇØ±#»Aƒˆus{˜ûg+ŠœãW_ÅÕ­{‚MM/Ž˜¨ûÏNõ²׌Ңŀ;»ý:›3çö±c‰þïù ÿ+׬[wÿ“O®µl˜g.3³ßúõ»tà@‚Ñøw|ƒA~ú)±lÙ«¬RòITdäø/—”dxûídˆ53‹›<9-;ûO]ÀÙ³âè( C†Hrò ”¯„ˆCUQÊÈT_)Ö>:½tÿ\ð–6Ã%2¶ø“,Þ-MÇ‹ÛP¹t¯ˆ<1SÜ¿†É—»Ÿ>dÚQÁGê­’ð”"òÍw©´Yî¤æKRuâvXT¿Ê’B'%K×»’]p—;+&±â/Çrò%'D‘r"wEDä d»Jì’#Ù)¼%x „fˆ^DvÈÝ®0YÎäˆ^Dvʹaâ¿\öëÄ íbY<[f‡HH†$ý(#’Ñ%2IB¤ëaš-’å@°x‡H½d¦Ë×±âš$ˆDúŠ 2JD+ ^’ØJ4?ËÝ·%‰™!—Kró 9?Yü‘cƒäÜRñA6¼%'üe²¨µœÝ%]‘ÏjËéñFÞ©"'’ú¢­-ëÿ‚×kì`ˆˆÈkÁº~ à«)t€JÍŽ•4|3KNmÁ£%¶\ ÀÁ WbΣ”ÄÆäëdj°«CN ‚°m!ƒ¤½¨+aL$mô„&ðfYÑßw=·5¬-Í5Ö©OçB%z+(áìÕ’âE ˆ_ÌP×£°[³[ÖÔt¥Di\zãéˆEÉy3Û?¤´-ꓤ#U/°1CÙLVZ5ÌSXy ·*æÙ¡ßLŽ5&”¦–%a9L|/©cÇç|p•„\•¼†¸Ù“É¢BƒkT ¾í©QŠk´»Hή]5&uB„?q3î‰ÜÊœo>"[ËÑ«ôúÃ@­Âw›‘L»DÇ?­tlÅ’Y¨TŒŸÍÏ[ž·±ŠÂäÉ,^Œ¢0qâóhH Wõêe±sg>KV«VI>>†—/!07W&O.}èPåÑ£EX¶,ÁÓóÆ‚ñ99¯t¼Nqðð°Z¼¸Æ¡C·móîÚÕ¥~}ûMŸÖ¦ÍY{ûß½¼N ~mݺQQm\í9ø/Ö` ’±zuô AW<<ŽV¬xtР+«VE™™©Ê–µ˜4©Ò­[­7mª×±c)åÕ³.<£G34:42&Fçímuôh••++¸¹ý'9óçu $îÙ“co¯¬[gÿÕWv' >ÇÚGŽÐ±#IItëÆ·ßRâ¹ ‘wÂy³?©éôè„ÏO“…" ŸÇÞ“89ðí$Ü\‹9ÉêßÿçÂX9‚zŸÈ€‰L¢±3»9ä—0æD­ðU{< Mà Meî%ªØ3¹.žÁ¾Ï®•M=;>óÈ—Jç»G˜+Ì-ƒ… MŠFXÑÚ@£@`T‚ld:éÀP¬Ê JEÿ1À \lP'µ…Û@_<ÍQß'ñ0×U(]ñ6AH`.¸T§z{ôèܨíL…<Þöò´3Ãî+gúBš†• Øð Âv°‚/Èü}Ƥ*©¿ ²ÆúMb6¢˜Rº!ßTÊi_€ú³o.@Ëaùƒq:~Ä*€CY:à¿çmíÓø·ëÕã5v°ê4ÈÒ°c  Ó²å[º|Š;Óv ÀÞ™4›ptu'ÏÄs*À]_JO…„åXŽAåŒö4Ù[`)¨a™B˜-3€L©À…A@ Kíq/Ck#Ú0ÖzÒÀ…JY¤^åPc—¤dIë’—¸d‚j0-U(‡¸É#kL> ø™›Iä8b:‚2À"îga¬ˆÉ¬0‰4Ô†QàS!/¹×ÜŒ)6aP*yƒøÌ6y`¡â»Gì+`™W‘6Ž$ä2¼€p»¬5ß6ãR“Ïó[ôËÙš±û]ìÍÙÊ¢³EŒ:¾}‘CÏ•E¦è”uä·”.ÁK¼» âSv,¤E=î?¤óh’‹c´z¯ËçbmÅ7«Yõ¢ôßgŸ±cG> é AèŠ+aª*¨Bõ±cŽ3gÚÌš•Ù¡CRlìrpr2ñó+ýz>}JäfU­²n]ÒßÀÆnn®êÓÇ5  á¶mÞ[·Ö=ÚÃÛÛ¸y3cõêèÁƒ¯¸»©\ùØàÁW¾ÿ>úæÍŒ¿“ þo®ÁJO×8ðhÆŒ°ÿÇÞ}ÇçtýÿÏ}ι¹÷ÜsÎýžæÍOÚÙí®RåÏAƒ‚V®¼{ûvZ¡B¦:¸}÷]Å™3+†…5Ÿ9³b©Rov40KHHF÷î7›7¿vþ|ZÑ¢¦¾¾%NŸ®Ø¤Éó×®yš>>©Åܺ¥¯[×äܹB=zäz`/¿Ò^½š6mHN¦_?6mÂâY Fs9¯þØÙм!¿ÿ„q^‹}îï۰4gë<*–Ê#êC ^ ðý§´©ë­/7³û2®¶ü1³C¿Í|׊ÖÓc2ðÚÍåx»óI…‡‰›ï³êVF¬É^'AÏÇwø¦VÄœÈm=µMðΞAÿ-˜@¹ìÅ熾"&`Ì#<ÝÛØ¶ÀXÄÅ ôÍ(Z“B Ë9¢ÇЂj%)OüMnÚ`ó.ïÆr÷§Õצý=ŽÆsÕ ûÒtŠb•† Ê9Ñ.‰©BºM© Ã@à+ f¤| `ëCÄT\>ãæ÷ˆŽâ²m2%;pó)÷)\‡»7‰§HUÓ »ŒKIŒì¸z—"8•âÄŸF=«vƒº íŸHqS)j$ÇH} ©­’³¥§ƒx!güd”“ D.î%Ź´VÖzˆ/rm…ø×?äÆwr£½ ác%u©D ÷ÝÄ 2H‘æ"+½"Ä=A¾ÒKFxˆgŒlM—˜ÒÅOÚÅÉ•ûê+ƒ–ÊÐd‰ ‘oñž.Ó$AD6ȉâ;E6hE/"ßÈ/ñ›!"¢ù@®zJÀ< ‘L14”(w‰øA’E$U¤º"C³©V¤~Œ!rôÏŠÄý‚<Å O‡Ý‚Ÿüþ8Û7g_±ùU.Ææ*½­Á¢ž"ê)²óz®ôä ©â- ”Ž‹ŸPº%N½/é:CtzyZB²Ôè%xJÝ~’œšw­-^.¸ î2yÎ3êö¡ƒÅÖV@š7—¤¤ççÏÞ*³pááì|ûöŒço¿}û«W¿ P·îÕ£G“_åÓþš”ÝÑ£±3gÞðò:íà°;kP,ëec³«E‹“'‡ìÛ–ö?’xï^úúõÇ_jÐà˜‰Éöœ¿´té}ûž÷õ½séRÒß3˜SLŒvøð0cã³`eunòä{iiyý¼˜ô­[ÇB„J1|x¢FóüM²øøˆZ- Çç=Ø—Ó¡cbW^p—n%%Ÿ?Æo— žbZOvÏ;ÃæbÜA𒙞z뼨‰ñ§r8$Wzb†T\$xKï¹Ò5ziê'øJ­’š}ʺ—.N{?ùéöãœ=B…i,ºì߸4UˆëH ÉÞ𠈑ˆ±È¹*ÚâQD"D#"g%©¶Ô—sá’!"%ÜKüzɞɑm0P|'ÉïÑİL–y‹·Ÿø‰Èv™ç+OÉF½hÈ?ñº#{µ{^ˆg¢œÌ”ÓR8RJé$\ÄG‘Ò"éßC"¸Î’ì/È9k‰?*ÛÕ²ÃTbNÉRKñUIä1™]H¼‘?ã"‘ó[äãRâ…ì_.<ÄÙü‹¼SYÜ_îâÀooàõŸn`Èzˆ0KßAèõøÎ§ûPDøù:ŒXû ­>Øö5 ÆšLͯÎN¡ìD€ÐY¸~ j¢aÒÓ·1Ü'y*Lg8›m™&i¬0p³C€{ühŠe):€\áWWJ•¦¦íY¶•£\%*iÐle« í©í‚í=âv ¡ŠÆÇˆ<É}5|E #Tk‰ !ÍÕ4l¹¤„¡·„•`?@V¤tcøÝ5›3ø9{nûX7Þ±!RË€ìçûŠš³ 2ÀðK<Š>¡½Ë¬¥Ýž\ÞÛ—gbc Âû›Í1áÝÚŒMƒ±·dK ßåžð^µ$û¦aoÅÇødaÚY³Ã‡R…9}™ŽcóŽ}5¸ËæclÌ”¹|8êY±€¦M9x Y3¢ò_x'÷V¦ÎmÛšÅÄÚµ‹1"é/_hÑÂöܹJË——ts39}:µqãîÝoÞ¼ùF‚¿çÇÊʨaCÇqã<üüêDG·ºt©‰¯oµ¾}‹Vªd“œ¬Û¿?fÊ”k-[ž´µÝ]»öÑ#.oØõ·îá_–sì¯téƒEŠìïÞýìÂ…·Ž‹ÁÓÓnøðRë×{FEµ m¶bE‹W®ló7Œ>¢ÑˆO”‡Ç¥… £ éÛ×éÆ*ÞÞ…-,þâ¹wÿþÌêÕ£÷ìÉtqQïÜéèãcûŒëˆàí͈ˆðÝwøøä1Ø—Óæ]´éCbÛ²b!Vyuð-ßÎÄQ«Y9•Öoç‘a_àÃ8Ó{1®k®·BÐ"ÌíF“+í„Þ¹CuW~i—k“ÏŽq(wK¶¶ÆÒ@`@±Zb`v\†Uq¬‹ÇZÍo%΋¿¡cdÀb;ÊDÃû ‡‰P ð‰Zø+OL´È Â>ƽ(fÉh–rø„Jv˜E’°›@ª¾46Áø gîpÇëæ4¿Í…{›c]ƒ6·Ø’F¤-%‹Ñü‹õ¤ÚÓÄ–:IL±æ3#, kÑÀhN“¾•¶s‰˜à:†PÄ@ñA¯D—Fé®ï%-šâ¸vŽä(<p;”·(Y•èxî†R² B.S¢4/Mó^ÿyÿt ïŸÈîRÞNÜ‘½[¤©£x"G¶I_7ñBŽ­—qEe °N|<Ĺ𛬫 ¾ÈÕ%r¬±ø!×§Ë΀„ Í9‰0’cÑ\Y$‚Hq‘ÔDù*BÜc¤›ˆ!X> Ï{â«•ô½Ò×O¼"äX’D/‘!?Ë h¹™ù|ç-Þ "!1H|‡È/÷$VDüä–—øõ“½)¢‘9–5S/ùTâÝ%¢<ìhʺ9²¹•ý{7¤ b)Aº¬2Åá¼ +bK÷³‚Ÿ4<öøþ/]'om|¥áVÉÌqãm0HçuyOxßvAÔƒD=Hv]z²Ø]«®‚—|æ›w½Ü·V‚§t›wG—ˆlÛ+–¥wi×ORÓò«á‡nÞ”²e¤ti¹ž£¿-!!!ÿÄ` RLM#!ÂÓ3úúõWš®ž’¢Ÿ93ÒÚú˜šž><,!áŸï1 K[³æî°akÔøÓÈ(W—Oùò‡>ü0péÒ°3g""2´ÚWíöyvi¿ ÌLý;i{÷F{{‡´lyÒÆfWÎ}vrÚÓ®Ýé™3o=›žþ×»ˆ^ ƒAÖ¯+UêbVÿe‹ׂ‚žw¤>“V+“''©ÕÑ¢ElDij~`ÎÒÖédÀ15•5kžÿEßÿ*ê"‚»|6Aôù|É–Ãb\WTµÅwcÞý™êÏ<)]*NJï%O¾5á€à-޳$4÷üìyA‚¯X,•S'.¼%ø‰ó‰Ìîe¾«yxBû5û„¦y+ZˆnÙhi'‚Hc‘¬¿À’ê.Õå~¢èEÄW"<% “\ʃˆÌ“ó^â÷¥7ˆèÅ0]6 ß5â/"ñ?]¦{‹÷U¹—·^&ûÊÀKr0SwI?ñŠ’sirV꜕·ÒåNª¬ˆ÷âi4‘ODi)¢•¨ª$+‰{% t”„²]-;Ì%î¬,µŸÕá/3íÅ Þ.#d ra»ôq/Äÿié*žÈžõRÃ]Ü‘ÕK_êâÀOoàõŸn`ˆˆJþÎYJ@€ªN)]šÏ>dö$*×àýž|?žrÕéù¿Œ xeºaÍP\ËÑy<[?¾$m¦r¸ÖÅiñ3§ßÅÄžú;ˆœHÆ5Ê$Ó‡´Å˜6ÄéÔ† 0ÅÀˆhêˆw`™÷`>VcZ™‘^äKÜÞañi¶±¯0åK\l©®ªþƒ?Ì0Ì`;ìVsôWKâ2Ž*Çñ«Ä¿GÉO©’†¾+W¢ÐŒ§xW EchDt†%8´Å\ 3lºàYw¹$°<*ÆœvÆBð[,ÞÆÎˆ •Èšh¯¥ÚŸÜÍ`vE>Ïž™FÝÍÜMåÃòüš#^N²†zK¸M¯*¬é’«€'û1u;ŽV|E©Ü±„öÒî24LêÉÔ>yTÎÅ4H|ƒ»²x|Þxú<^ýˆŽ¥nM¶¯ Ó³jûÁÚ¶åÜ9ÜÜØµëáCé/^¬Zµê³6ƒ€m¯^ 7nèllT?þh×§Ï3'­<Ͻ{Ú©S#–.ÕëÅÉÉøóÏ]Gr55ý{Tò—’¢ L:v,Þß?Îß?.!áá´µŠm®^MÌÍÕ&… ›»»›;8˜d½ 6ww7ËúwÑ¢vvyÍÓ^ ´ÓÓõññÚøxmddfDDFÖ¿ã㵑‘™ññÚøx̓ƒA,,ÔééŸpw7kØÐ±Adž kÖ´U« Daž<™:fÌÝãÇS€J•Ì¿û®hÛ¶¯´ã;ú¬ÕoŒ™0Áúë¯mžäýQigfÒ»7›6aeņ ´ió¬­D˜2)sQ©øz4ÞcòÎv(€¶ÃÉÐ0}(_~˜G†Ó×h1‘ät>lÁÒá¹zËDèê˦óT+ʉqXæ˜Ü¿5„N¿£V±£O®©W{ïòÞnôV7£W™‡‰Á)x%MÏOºfˆAÛëìN¢ƒ=[²7ÿ<‰9©”2â|!ìT³a8Ây(шÁ‡v˜‡“Ùƒ+Z ‹)W›‹ÄNà„ F‹hìŽÕ^.lä”#Ö“éf†ñ*VÝäfUªv¦ó¾ˆÕ· ±Ãµ“¯ðËmv¸àYïë Mâ”+½‹0 ŠF¢ð5§Ôc"uI_`\§@®5AeƒCÂs+¥G›ÊU_ÊôFŠã?“²m1¯ÂžÙTncÖM£r#J4aé4j6¢|SæMųEk¨~úI¦OçË/ŸUßÙT*UV{èuûô¿ÛÀà?ÜÀÒëUÆÆ|7›u‹¸ÆÂßøíkî‡1e[§Êð¥ü9èPú/áü\b®âåËíÅÄ^ á$þAì!ÊMÁ,Œ˜¥Ø¶ÄcÑå1Dc¿‹ÐÌáJ*“˜hD‰Büy‹Éñìsâ½L>ÂðdîTâ“¢´üI¤¼ËÐâTÛÀ†+\)E©¾ôÍDëÍñ¤tãíT½CòHŽê‘Y¼]ÇÄã¦FP¹&¿‘ö‰®¨ÿÄÅU<Ô„;ð| @ªàCˆŽ‘VÌÏŽØý&âidÍ¡r;Õ÷EÓú¦jN5|¼âÄùn#MÇÂú|–c•ûXÞú…ÄLæ¶btŽ‘ƒÐþv\¤F1Ž}‘ëL l=E×èôÌèÏøÜÃYNÑr(©éLˆ÷À¼ë0ô6­{z’ìYƒGÉgUxJ ]º°w/öölÝJãÆÏÊœSR’ œ¸fM:з¯Å?Ú=7„ã³;—6fÌÝÇ“òåÍ¿ù¦p·nojm»¿F§“ ’Ž‹;~<>>^{áBRLŒF¯þ¹ÂÚÚ¸P!SSggÓB…ÌœM]]MMMLÒÒôÑÑš˜Ml¬6&F•£yôÒéžÿù&&*ggÓ–- 9;›6lèX¿¾ƒ«ëó—1þ;]¿ž9a½?þˆ¡pa“É“ ü±“‘Ñ+07f|òIbB‚¡D £5kìë×ÑGh×Ù¾·óÈ{D¯gðx~Y±1?Íâã^yg;s…柒œÆ°·ÊÝ” IDATî|ÿE.Þæ¯ˆKæý¦,Å-Þ)ÛñöÃÁ’3_áQèqzp o-!)“y­U/Gzoo!Aƒ·'“=&ê„Ç8ÀGÅXš½Úô‚(F…SȘ‹•p58¬¡y,j8âÄÛ¦g !ha ´`( ›I³58ùqœÄö8}MI úa‰$µ?»âñ€ÄoبE7œ6•)@ÀvXb9”¡&¨gR:I­âŒóŸ Cc|ô„…2ÚÛ*lNc~*?›RljÍÐNÂFUIÂq‰¡„Ç´8ÅÖàß#KÞú“Mõ=펰ì]4)ôÜ΢nhÓº‹oº‘žÌÄí|Þ‹´dæoçã^¤$óýzõWiµrù2•*ñ”Öòn`J¥ÀÁ9ß0qÅJ2î+¦¤pI>ûš…áR‚½Yþ!N%è5M}°+N»Ù艥;­Wqª9Æv4 àZ=t±xlÂ4ŽÄOP»áŒj0¬…®ð{4­t\µa¢ ¯ÐÕ€¶ËSI?· ÖMùùg޳Î×®LÎ s1‹SImG»ZÔºDØ÷ì6Åx]]°]IÈz®Åz!MPæÆßÅq¥ ÐØ³h`5[Àš‚vCKÎj©‹VØê@;s€Õ®©eNQƸ>,œa—øá6•l8ÛèásÎÀÆ[tÛ‡ZŶִͱŽX~·žñiÔÁ(Þ‹•=Yþ£çlôæ~ÌèŽyTß:ŽNϼьêG òïõåü%Ü]Ù±’šUòΖE£¡_?Ö­ÃÌŒ•+éÖíY™Ÿ°bEú!‰©©R¡‚ñÚµö5j¼ô¼OØ¿?iäÈ»YñH›5³™3§hÍšdzlYVSÎî¥}KÚøxíÝ»éIIùΉ«]Û. 1¿wÉî!sp0-\Ø,¿N277³ÒGõ´¸8ÝìÙ,x™)––êÏ>s™0Áí/ÄdÏ)=]ÆO^¸0èÜÙ|É;‡¼I›6\¸@‰ìÙCùòÏÊœšFOÙ±+KÖûÒ¶yÞÙ®‡ÑèÄñ~[–{ç±&ôõç~<ë±a<ƹýÞ+´ý¶£MŽ?Õ¤Lê-áj ½«²ºóãô¸Lêmáz"KñGKUü¤¦]§”%±5¸šçUÒ lô ³=@´êÑDøÆ†‰Ö P nÁXø€hºk†ê…J`´›¸‰Ü²Åx#•0^NðÜ(‰Í|Á\¶_'²>åûÓ$‘ÄÅ,Ö éN÷ŠT<ͦ@ö¸S¶cÏ0í§ŠónU]¡{aÅøÜÏhšƒÞ™&œƒÁ®‘0ôu˜wÆæG.•GŸ€ÇV®ùµqDE²Œrýɰç”;£wãðbjuAÜØñou@íÆ&_šuFœXý ïu!FÏ–-*xñ‹»J¥‚—Šéð‚Fü—( ,iÙ’}û;– ¸tžI³9¼‚ÐKŒ™ÏÉåÜ dÀ|‚–H÷ÜXÎýó´ñáÞ*¢Ïðö|Òv½²qt'l(¦Å¨|…øVhN`5ÛQPR`w&VqtWaíÂÑHÖÝg…5Õʳô“£9_Šùp+ß™bV„J5h}‰KÙøh p)Os£…Gã¥Ã0‚#᤼Où”½¦—Ó1,¦l]l¯¢{—hìĹ*&À4˜.YAjf¥0>™Bj.Â] °7‰w¯cªâtEªY¤é©u”Æzð]ÅÇ…öußœÃÖ”¨”£ÛeÒ!¦ÁÑ‚3/w\¼ÇÛ³HÍä‡^ yçÉ*øíùøe@ë<êhÕNú{#¯_óA»<2)©tù„½bmÅÆ%´zæŠ"Œ˼y±hŸ~ú¬ÌOÖõì™pá‚ÖÜ\5s¦ÍðáV¯8]Z«•eËb'Mº¥S«éÒÅá»ïŠþµHDr²îÁƒÌ¬nª˜Mtôãnª¢E-nÜHuq1sv6qrÊêâzØË•õ21) -§çÒjeñâho½ZMŸ>N³fqwÕ&ø•+ºž=ã/^Ôeo#FX½ø¶¡¡´nMh(•*±{7ÅŠ=+s\íúq<'üVð¶gÞÙîEÑàcîDâÕˆÍsžl<aÑ4Ï(ZÖÀïkÌrÀíXjKl*Ó;òeŽ‘JƒÐ~-;®SÝ•ãc™½•ÖÀ»;9AMg޶Ç*{ðùD<Ž#p°MœtBýΤ2À™ŸKtŒg[L9äDÖžö‚ß¡øƒ)hÄÜ@÷6ðNEß•ËÑh¿¦D{œo“<Š#z˜Mý 8æòZŽÙb9…n˜®fu(¡•©Ü•®ñDâ·LRZ0PMò ¾4Ƽ)¾‰ìgž9%*±.ž29hI_;&Byˆ„•hŠû*s ]!| ±¿aÛŠBÓð c+ê`sPñÞŸüÚ}&=¶³°#=Ãv1Ñ ƒž¯¶2¢ßm¥oGT*¬¦K¬¬T))/ÙÀZð‚™_ÆÈÿrþÛsЃ¿¿¨Õbj*k–‰;RÞ^v®O¤¹³üù»x!½åÔZˆŒ)$׉72ÇMBÿ_dy!‰þSüT²ËZ2"åj @îMÍٳݧ‹ RID'ý"Ä=AFë$õ‚´ Ï89$aÛ¥Ãvé˜"÷îÊU_´D†ÆK„ˆ¬“uÞâ½BVÄ"éceÅ@ñ="WEä¢Ä¶¿N²#L’EäW‰ô”€Žr1Sô"â-‰õåA/‰ÍƒˆèEZˆ Ò4{R§^¤E¬!­båÑÔåOïRùòãÀǧãÅl‡4ô¿û Í Òc¿à+å×I\Žzƒ¼·Zð–ê?Jjî ïkN Åtˆº–G-,Ü&x‰Q{YûgÞÕôý:ÁSLÞ’þùVe¦Fz~*¸‹iqY»%ßlL* … §%/þ”»ˆ¤§†O„ˆèØ1.6ö5Ì¤Ž‹Ónjz44èÎ¥K¯4º`:zôè?½ ¯_LŒvæÌÈfÍB²f²·jõª3ÙY¾<ÍÒ2"*VŒ z¹,ví’Zµ@4x~ ö[aR¾¡à.¥Þ’Ð|³EÇKÅ®‚§¼ý¡¤äõïÆHéO/iðy 6$¦Kõ©Â@éôã“"¾Êgbû§G_q[)a9b›DgJ«“b½SÆ_}œ8áž ¥.JRös# S„±¿/·³S~AÄNäföVÓ$ÉKbÞ‘¨¬À ¹ã)K°AÄ †±âï%~?Ë%‰•äáòë@ñ='7E䬜õïÙ2;ER ¢ß,Ó}eàúˆ¹"†#2ÒO¼®Éï:I ”fâ™ G3d_„¸GJ9½<-‚H}MöÜöi’rZÔrÖTÒCädKñC‚'ÊÁ÷Åùs€ø odcoùµŸ D–õ—ïz‹2ÿù¼³x"ß’~^âŽ|5L4I“^êâÀ‚7ðúO70俦Awý:?u*½{£Ñ°c?MZ‘”À™³ÔnJB —/Q¥ I1„†àQŸäh®Q´)÷‰ Å¥ÑÜ;‰Kt)Ü\@±@ÍýÙè­±:’†Áh(Wà[¦¨0Mckî îáck1š º«,/B… 4Ô£=ÌrÁà…—V7¹H æÝ©üÁÉxRªàØ’âZ ‹ è‡k9,ÂÉüûÀØX¢>L¦7I€VÊîWÃ*{\ÕìÍd~öú€s‹RÞœËéLÎÂ^Çž…Uð§Ïy.g¯_¬‚eM¨Sˆz@—¢\­bM*:sáüru¯:|ÞŠtü³O-ùüY;¦öAo ß|üNçQSúóå‡hutýÿÀ¼kÓÔ„5‹ù|-½‡ðÝâçÔþ¤I,_Ž••ùüù4jÄíÛÏÉÿˆ¹¹ÊÇÇvÓ&GGõ–-5jÄøû¿êÓÈFsæ½zµrïÞŽ‘‘Z_ßèªU¯´hqmÛ¶„übÐÿ?*È‹=ÿAAéÜ)Vìâøñ÷JîÒÅa×®²{ö”­Zõ•ƒ¥gÏ„þýÒÒ¤o_‹€çªUó}tà :_~IÛ¶\¾l÷ÙgìÛ÷œ@í—‚iØPªVäèÊåótZFsõU˰cVOýÄèDZMâæ}Þ*Ï®)X™çz7]KÇÅ ¾¿}kÎû–`fÅHÅš.¹z¾^â§+˜±¥ŲCƒj t `o4­]˜’ÜáD*3e%Ƚ¬c\2ÀO¶”0¸cø²‚¡$s1)Ah~ÀÁ®º‰#T_P\~Ü&Þ‹÷)¬âhÚÚxÔ¤T2ÉûؼÇ{VX]`o·­°ïàþé]'rçÒtˆÀWG¢ uly+‰)€ cÔÄÂ÷ †¤.@wã2X"|(pû‚´(¢÷al‡s{BGm‚G_—¡2¢òûœ^ƒ‘ 5ºsäwŒM©ÝC›1³ f ömÇÚ†258v —4[[ cÓ¦gÕ½âÍûï6°ÔÎÎ@æÞ½š6m°´dͺ~ˆZÍÒïé: •ŠUsñ°i­ÆìÃÛcŽÍ¦ú8€ ³)=§FDþÊ §þˆ†ðϰùu!4GIßs˜l„™%ƒ!‰¯édG&÷¢X_ž~ÆXÞçx—͸nc·‚Øo‰ekZ{Ø“DRÍâ¿…"nygÓhéü9ǃð(ÊÞpxêW&¦òîd®„S­$;'c“ûK5:ºþÄ¡âRXõ¶9Ú^Á1ôß‚ÀœÜÛ³N,*XÚ„·\§v‰#q¸›± 2¦j€TÜF/Œs#+$~†Ð;ta %YÁíS¡;¤Ã§5q?Ãh¾À¦Æä[ H_\ËaCú*B€O©lñqB.n…yêÛØ–AFyÊW¢R÷ϲTMè7sÚÌVè«åA4U¨‹1&%:B)cŇ0´0C1’§Øúó©g0-†ë\‡sSÊ~Åù9tTÀ™¥è5ÔèÏ¡%t4Ä–Eˆ¯a¬Zˆïaá,€ÁŸ3c ãÇ'Ï™äz?_oàõ_÷n`eßÙ%ÍšÅСˆ°È—.ï£Õ°y#M;“™ÎŸ{¨ó)¦R+Ò >MÉwH%,÷&dÄvó¤…ryEgbä@Ò^’Žb3 i4ÒÞƒ$˜hÃ(5.2ØQŒ1@$K:—ùyÊÄošÐTl'²*U+R1“̬У½hh‰Ù%ÂÎpà ãT"{ýœX·ÃY‹L'L "Æ“°Æ“†xÆ€zAmÌlI¦Ð=dð´ä+7 Ð÷6ñz,©Î[öÜN£Kšì&KaK6´ÀÌèáæ#œYÞ|¾C·§©Yó ^ÕˆN¦é˜˜°p)ýGä½BÎ#¿ü2èüyºu#)‰îÝ4Í ÷F/ntø°ÓøñÖS§¦ôèôÌ/{1eʘ͜Y$,¬ª¯o‰ŠÍoÝÊ?þ^‘"ûõ»}ñâ?¶Œàk1eÊ”z^Ib¢ÞÇ'ÊÃãbûö7öïO²¶68ÐùâÅÊûö•m×ÎîÕƒ—¦¤È¸qÉï½wó¦¾^=“  õìùaû÷S»6þþ-Ê¡CüùgÓgÇqØ´“¶ï“˜D—÷رÛ|ì1èû5{NàâÈÎ…¸= %5¯©œ ¥laöLÅ1÷çè ô[ÆÎK8[³wd®p-ñ´[KR&}ª22ÇcƒºÆ'Ö¢w™ÇéónòsFl©CÑìVÚèp®ePÃïÂÙ)Ii)kÌÜì†à¸ U`^Ö/‚a$Dah€é`¬¬pÍn˜~Œ;ð—ÓÑ5¤ð[¸%‘¶“@OêÛbHà nX`ÑŽv‚á0Ëôh+Ò°(•/§¯M'Ú–REhv—‚ΙŽfØ'ãØâ Ûa78À4’F!I˜wÂè-"¾(æÃÝ5Ä'å:vM¹õFæ”ìÁÅÕ¨MðèHàfL,(Ý”³»°°¡HMaïŒc).àV¬¸~råR¢¢ æíÛ?ëP¼y·Ö¥K[[[[[Û.]º„‡‡?#³ê)/ø-FÅ‹kƒ‚2<¡¡ÏÊŸ“±13fØìÞíØ©“ùÆžž1Ÿ}–ÿFõllŒt¾t©ò¾}e½¼ì23 +WÆV«v¥aà â_$\‚â5 É1"¼H‘ ‘#ÃoßÖd5‚ïÜ©êë[¢R%óçoÿ<"¬^^¡BôìÙ)U«o}ô¨sÉ’/úø¡N‡·7­[óà-ZÀsc¿ÿ•nÉÈdøÇ¬÷Å<ŸH:=£æ±é ¶ì_L¹âOfH×à5ÿ+/ľopË=) U¬ À΂Ýé”chƒÐw7â¨áÆÏ9^‰Ï¤ýâ3éTïsí÷D3î**øµ:u³×~Þ“Ä/1˜©XQ’¬Xr;3ù) 3ëì±Vü+À ÖCVsÕ‡”£d:£^„ƒbÐþB$ðÅ-PûyŠûVB%` ÇÒȬJñº”I&y{€¶´Í98ø3Iì2® P‰RH䨖î Jf¦dFK3êCVT±oÐ\%}Ýøí÷Æ¡‹Å¶%VM™Pi.çf *}ÊÉ0èðÈþEˆÐ|Ìè4†e³>ü Ÿé#'2k6`øâ‹Ô… ŸSýÛK]ú ¸ÚÀJIIiÖ¬Y­ZµîܹsçÎZµj5oÞ<--í›<1¹ì¿ÈfêT iÚ4ùâ €i3ø`("ø.¤ÃÇôl[I“^è4ÙLÍÎh3܇Gk2 =Fáfh YE¹É—Gàô!–5Єq¶‹ÀˆTti0 0Ô’&T×™ÊOÅ¥Â(šî–§Ðoz=oÓ͇(n^ä %–ïò.°›ÝI$5 B%Ц’±Ždwbgl1þŒ¢d/S Ìî8FhgLÖ‚9à› k’’¹Š5öX¨X’ÆïéÆ*V—ÂZÍo±lÈ^ÇÝŒ­u°4â×p~¸ý¸ôú–å‹êh tÝÇË3OkF۲ĦÓyi9ºu,LØ>ŒFe §å"s?³¯Rñãz6&)6Þ\ã f¦lžÃ€Nìð§ÁGœÉ·Z›7äè »rÀŸ†‰xªÃì rü8œ=K­Z¬[÷œü9µli¶t©Ý¸qÖjµjÑ¢Ô2e¢}|R_}ÄP«iÑÂÖϯLHH•qãÜìíŽKéÞýf¹r—ÿ5㆙ÁÀþýIíÚݨXñòÂ…Qii†-lׯ/\yÜ87‡WŠ¿ðH` ¶I“Ø÷ßO¸wOïéiòí·63fؼøØNx8ï¼Ã”)¨ÕLžÌž=¸º>+¿Þs>&Áç›î2©XÑüæÍÇ㆗.ýLIIzŸ¨2e.µly}ûöĬÑÀ¬ÅnÝ^1jè#ññ†#’j׎9zTãä¤^°Àöôiç·ß~‰ Û¶Q£ÇŽQ¬‡ãW`ªœt:ŒeÊ\LMXµ(ß@í@\­†²ý(޶x¢Aõ'3è ôËŽ3²cï7”~jþÖ—›ùñÏÇ÷T9m f¦?Æj6t§”ýãôÇ9p7K¶µ~”!NK»3$héâÎ×9V-Æ}-¬é `€þ‰ÄhmFV8‹LèÉÐ> ñaw>C±nŒpœÄC$Xb4–¢Ào\‰%£2Ž­)žJÆ:Žݨç€Õ.l޹^O &CÐÍó‰ù0–-é\7£° =“øô–|bŒ)Ì`©‹Ïm \Ç™BøÔ¦Tùž€¯A¨<Œã>ˆ:CÙ3 åhÖÏèþÕÃî«&²ø;€!ãY°Ð–¶|9&&F;ÚÏ»³Ì%ý ¼^Úßpéÿ;ЖŸŸ_¿~ýr¦ôë×oëÖ­¯ñ+2CCû³g›ö2k–Œ0}ŸŽ˜7žÃVúÐz=»–R¯/z-'7P¾=ÚT®¢X´)\ô¡Ê"P: µN}‘LÂÇä˜í¾f0Þ”²æx ÉÌ(̧FX'r4™SåèY¶¶]([¸^”Šåx[6k °-m-°¸Îõ@°é@m` þidzQ²"qd¬&X_RÜÕ¢ƒHj`2‘$ÞCt…A = kôl¨ÌI0ð~Y=/C ÑÖîñ=b–®î|YÐý,׳Fj«›QÕ‘àzìçÑà•ƒ9Ûzakƪ ¾Ïýl`ÖxAåÂ\¼G‹ù$ä¾911æ/yד¨DZMâöSË3[Y°m>µ'%cX»'ß*.Uœã~¼íÉ­0ê·ãD^Óçs²µå÷ßY¾ V®¤aCnÜxÎ&9•/o¼{·ã¶m%K?¯mÔ(¶{÷øðð×Ñ—õp÷ò7¬ZU7|®]Ë1"¼pá ‘#ÃoÝÊôðxÍ£Y V¬H/_>záÂT•ŠáíBC]FŒ°zvó('Žñã騑¸8Ú·'0 ž³Ijí?`éZ¬­Øú½;å›óN$ >âØJæø2êW{2ƒ±Þ;+vO¡ÒSA¶¼ý˜µçñ¬€œMlÿ®%MK>N_Ìâ+˜±9ÇcƒZ¡ÛYn¤R3û/ËòX6ÄcgÄÊR¯a³R8‰‹šßìf˺‡,?go5ŠÄ»èkb2 ÃLÂO)ì‚éeâöfŒz(UUð;Ç“H/OáTH!%kp° ml°É98h@ˆO*çöÆXà/P„á™ìÒpR³ #`4¤B/ rÌm_IêiL‹â6ž‹C¥F‘žJØNL¬qiAˆ&V8Ô$ô8ÖΨ »ŒKIbÓ¸F¹ê]%>–MÙ}ˆÔTºtI\»ÎjРˆ €˜Ÿýô¡z¯—ö7\úÿN´u¶ì =IDATùòåêÕsÝ4U«VíÊ•+ùåÜÜÜLLLÜÝÝûôéüܯ°¨Z&zï^³–- ÉW¯R¿>D¥Rª,7‚±tÇÑ•@JÖÆ›©Øc3N¯¥r_TjÎ,¦â0Ürk¦%(Ò}:—GQd6Fö$ú‘| ›éI£÷  DÁT[&«°Hg³ën|„3ÏŽ2[ÜôÌ7 ­Ow+p󇬱Î9PØŒ*epK$m§T¨†PÍÕvî\%¾8æïãV‹ˆHÇ Æªæ‰†‘5ª´ªÃudÍd·£°þ¦§Ÿã>dyÙK÷/i`=añâÅ­[·~‘œ©gÎt:Ñœ<ù0Àð‰""ƒœ=)"¢É”às"") r7XD$9Z¢oŠˆ$†Kr¤ˆHÊ]I¾ýðãOŠ>]DÄ •äcµ!¢ÌþN½ˆ$U#—²’Òäš^R³þ(·2$þцËÉ·ž,ÉäÁ£·®I„VFÏýyù¦¤ß‘qÖEE)ºœ)Es—Æ® y"ªù®DÉuYDäVªÏ+<ôÎ0‰Ï|2Qg?®ä‘9KÈ}Ù5ßw£eýó¢¯Û+×Þ“GD ñY"IÉÏÏ™ÓâÅôr›%¦‹þTŽS`‚dÜ–¤Gÿ½*÷ Ù)™áþè­š)éÙ_¤‹– ¾6%ûßz‰ÓÊõìôSòð«5’yüaZf¸ddG•Í^ÅB›*ÑgEDôZ¹("¢I—»A""©‰~UD$.JˆÜ½#÷#DDnܨ(ÑRRD$åôé¬ëÚÿY«@¬E˜3ªBÖþ¸ºº¹æxæþýû5kÖŒŒ|*He^T£P( …¢ÀxÅKAS †Ÿ–œœ\½zõO>ùdðàÁÀâÅ‹—-[váÂ++«¬ *Õã=oÞ¼ùàÁƒ6lèäät÷îݵk×Ο?Ïž=µjÕúÇ~€B¡P(Š—ñÜKÿÿ—ÚƒeccsðàÁ3gΔ(Q¢D‰ȯˆ'L˜°fÍš*UªXZZ6jÔ(88Øßß_i]) …Bñä¥.ý_íÁR( …B¡øÿU@{° …B¡P(þ) ,…B¡P(Š×Li`) …B¡P¼fJK¡P( …â5SX …B¡P(¯™ÒÀR( …B¡xÍ”VÁrîܹ!C†ØÛÛç\ŸQñêºtébkkkkkÛ¥K—ðððgdV=åoÛϱ—ªÅ‹SŽí‚@9u+ž¦4° –¾}ûº¸¸;vìŸÞ‘•”””fÍšÕªUëÎ;wîÜ©U«VóæÍÓÒÒž±É‹¢ÿm»úoõª@ñ"”c»€PNÝŠ§)F ¨œk)^ÑüùóÏž=»jÕªG)ï¿ÿ~ݺu‡žg~¥ð_»—­Å RŽí‚F)aÅ#J–âßÏÏϯ_¿~9Súõë·uëÖjþƒ”*xC”‚U( ,¥¥ø÷»|ùrõêÕs¦T«VíÊ•+ÏØÄÍÍÍÄÄÄÝݽOŸ>ÁÁÁoxÿýþB(^„rl+–ÒÀRüûÅÇÇ;::æLqrrŠ‹‹Ë/ûöí7lØœœ|æÌ™:uê4iÒ$00ðÍïæ¿ÙËVâ)ǶBQ`)£Å”2ÿ™šš¦¦¦š˜˜Ÿ—=@¡ð+‡Ãóóóårùùùyxx¸ýªV«]/œ?@U ,àWŒÇãv»}<·Ûíl6û÷†ZÍùT–w°€xišî÷û×××Á`°^¯Ó4-{"€By‚‚Ïç§§§ïïïF£‘$Én·{yyY.—www··Ù`fƒF½^ïZWI’4›Í÷÷÷ÑhTîTEò ”à ¨0,€` ˜=P´¿ÿƒuåªG`ó!@0L`XÁ@0L`XÁ@0L`XÁ@0L`XÁ@0L`XÁ@°?NQ!€IEND®B`‚gsl-2.7.1/doc/images/nlfit3.png0000644016036000116100000102304213765510545013162 00000000000000‰PNG  IHDR X'bKGDÿÿÿ ½§“ IDATxœìw|Åú‡ŸSÒIHè%”Ы4é‚TQšH‘&E@@½ ‚HGzGz“ÞQjè%´PÓ+éí$§Íïx¹ádÏIð‡âõÎóɰóîì;³»³ß}çÝ9*!‰D"‘H$’W‡úu; ‘H$‰DòOC ,‰D"‘H$’WŒX‰D"‘H$¯)°$‰D"‘H^1R`I$‰D"‘¼b¤À’H$‰D"yÅH%‘H$‰DòŠ‘K"‘H$‰ä#–D"‘H$É+F ,‰D"‘H$’WŒX‰D"‘H$¯)°$‰D"‘H^1R`I$‰D"‘¼b¤À’H$‰D"yÅH%‘H$‰DòŠ‘K"‘H$‰ä#–D"‘H$É+F ,‰D"‘H$’WŒX‰D"‘H$¯)°$‰D"‘H^1R`I$‰D"‘¼b¤À’H$‰D"yÅH%ù_G¥R}ðÁŠE=zôP©TÏÍòYÛóáOªùÏð$Ÿõzn0pàÀìªrîXºté5kÖ¤¦¦õèÑcâĉ/Ûí6ÌòìÅŽÊgå!!!ÅŠ›2eÊÓ§O333/\¸Ð¹sgkÕ>ßâïïïáá±iÓ¦ØØØ˜˜˜7*Tèòåˬ9‰äïƒX’ÿu²u÷ïß/Q¢„^¯BèõúÒ¥K‡…… +ë믿ÎYÃÁƒ4hÛì¹~Bœ?ÞÅÅ%ç–sçÎÕªUËb¯œlذ¡lÙ²/å@ïÞ½g̘‘³ô»ï¾{)e£ò¾}ûþøãÏ‹~ùå—:X«97U«V}.§€¹sç*îûœ„„__ßü8–ÏÎQôÓÆ_ªòd‹ò<’sKçÎúé§œE‹-êÚµëkŽD"ùû –äçºvíÚmذA±~ýúîÝ»[”æüÇ“'OrÖP¨P¡ÜfÙ-›äääÜ[ (`±×s>\´hÑäöÓ¶>>>OŸ>ÍYúäÉ“—X6*/W®ÜÇs/^räÈĉoÞ¼Y«V­ 4oÞ>>±±±9·ÄÆÆ)R$?G”H$gä­+‘üŽJ¥=zô¬Y³FŽùº|ˆŒŒl×®Ý?þئM›?VC«V­¶oßžsË–-[¬;::ZD¤lÓ²e˽{÷þ1Ç€Û·o-ZÔ†N§Ë{[»ví>Ö£bÅŠþþþ9·¬Y³&Ÿû¶k×nݺuŠE6ú¹N:û÷ïϹeß¾}uêÔÉçA%Éß—?y R"ù»cû.@)ë™ÙØòüÕ«WŸ7o^>=Q,}ðàÏ’%Kbbbbbb~úé§>}úXkcÕªU÷ìÙc4m8™sã;wŠ-ºnݺ¸¸¸´´´'NØHrÏùßøøøì¬ç‰íŠêÝ»wŸ>}¢¢¢bbbfϞݽ{÷ÿ·[Û¨X´eË–òåËŸ9s&==ýñãÇ'N:th>+þaPPPff¦¿¿ÿó¯môóùóç *”ýallì¦M›<<<.]ºôÇš#‘Hþ>ÈUò¿ÎßJ`Ùx Ê¿†¸qãFëÖ­œœ<<<†ëàà ØºÃ‡W¨P!{mªüWÞ¾}{777''§–-[ž8qB±f‹&*T¨aÆ9×P}<<<ÜÝݘššú ,!Ä¢E‹*T¨`ggW²dÉ)S¦d¯U–Ïʃ‚‚úôéS¸pa;;»Zµj=_#Þv?ïÙ³§^½zNNNNNNõêÕÛ»w¯mÏ¥À’Hþ+É’É?œãÇ?þæÍ›¯Û‰D"ùBæ`I$ÿ4:wî|öìÙ”””¸¸¸Ý»w4hìØ±¯Û)‰D"ùßBF°$’»víš;wîíÛ·M&SµjÕFõᇾn§$‰ä )°$‰D"‘H^1rŠP"‘H$‰ä#–D"‘H$É+F ,‰D"‘H$’WŒX‰D"‘H$¯)°$‰D"‘H^1R`I$‰D"‘¼b¤À’H$‰D"yÅH%‘H$‰DòŠ‘K"‘H$‰ä#–D"‘H$É+F ,‰D"‘H$’WŒX‰D"‘H$¯˜¿‘Àº~ýúˆ#ÜÝÝU*UîRU.þz%‰D"‘üyØ~Ö‡††vëÖ­@ èÖ­[XXXþKÿzþF«oß¾ÞÞÞçÏŸ·f ^ä¯ôM"‘H$É_€µg}ZZÚ[o½U§N:uê´jÕ*###?¥¯ÕßP©¨T ^)n”H$‰DòÁƳ~Þ¼y×®]ûù矟oùðÃëׯ?zôè11ÑÃÃ#§±§§gBBB~J_âïG~¼Z²dIÛ¶mó4Óh4¯³s%‰D"ùËy©îßÁ kä|ÖÛÙÙéõúœ¥z½ÞÞÞ>?¥¯…¿cæx~òÙcbbÊ•+—––Ç‹IžU­_8`ÀÉž=+lÙÒæ¥ýX³æþ A§*W.tçN/µ:¥(48~ùrš5õ,›»T*W¾øàAÆ®]Õ»v-lQº}{òÒ¥ñ:ùÂ…òêã˜S§¦>œYµªÝªUsnOOÇ××Ë‘#Ú¶m_ðmþRÆ~Ie?ΣվP[«¾œògx–L±ôpÈ Ví£vEüWâ`ÿB‘Y0t«÷GÔªRüÜL\Z×sÛ¯ÐÂY=¨§Ð)™ŒÞËÆëØkXÚ•o(›ý^'|çÏ·çP±ËÛÒ¢¤-ûln&ðã6=¨éÁìz¼],ï½®$1ë ;£š{2«2õÝmÙ§šøð1û©æŒ–¡Y«ÆÇuô!ÆD-ºº0Á{+—ÒŒ,é‰2SFÍ'Zj•Í¢áCŒg Q ÑÔÂêÅ™„ùs’O¥‹ˆt.^ìœ>ŵ(/ñª³™¸›düFJf4˜¨Ám¡qûuIùŸ{ª<к É¬‚0ô@eœÔ€QˆÅƒAÀ Ò#1”Çá!™@9žå‹CÜzáY‡|z•€XGú9ôÉZá0“‚Ŭ´KÀ&Ìs0Ýg˜…f¨•é‚“Fè7ÓTË{úÚ)ؘ`V"ß&RËžd3{ŠPÙ^ÁLÀæg|L²‰Âvl,G[ëÕ¯ñÌ~‘X€Á¥XVœãMî‘óH8Ÿ^âa À¨Ê|_W%WsœÌìË,¹ PÍ‹}])[0]nEÒoÎv\à§. ®oËx鯌ÚD/ºÖeÖûÊ6ñ©4Ÿˆ§ G§`—ë I v¢â˜>ŒIý-K©×…*åY<…Æu^(JM£Á[øøðñzv{¡((HÔ¬i¬[Wµd‰¦rå:uJ¨QÃîêU/»;pëÖ¤^½B5r>wÎrL‚F®^º”²iSÕÞ½}r732RW¦Ì 8øbÅœ^ê›0•J5#Ÿ¦/É—ðÿ9Ÿõ>>>>>ÿéèèèÚµkGEEåYúZø¯™"´àUéÂêÕ=jÖô2™þ.*³o_¿rå xy98œ§ñ'ŸT¨PÁõøñhÅR•ŠO>)Q©’˱cñ¹K»v-ippP;f)RGŒp6=~l¼{÷…9&MÒ´o¯Ú°Á2ü=båÊRØ“]û-´è ¸ñà)×ïZÍMùxdæÏ–Ej³?SºFÍÇ?aÎu~T*~ʧos;œùÍJJ^GV½ÏøædYs…I‡É´>車5âL/ªy–Æ„ÓtÚMX^³!µ<ØÐ”í-ñu#ÅÀÔ›4:Àù¼&8ê¹³¥Ëkàã€ÎÄ[tºÂë»iØëÇ>?|츕Áç¡|ô„+myÛ‰{¥èF–àhUÂ8­S¶üÒcÎÔÓlf–ž~ÊÓfEà8ÚMhCà ¢?¦¯1%YqÕõ* ÁÓàÍ€ØCæÇ$}LâMò;ÁÙ¯Y”º@ÕÍ”Ÿ@Ñ.xÔÄÙÇŒ±G²‚.}°g!Ñ ˆOÈvâ÷¸Œ˜eÄœ#u.Qß¾Žg+‰ÝGâ-2ÂÑ«Àõ[†Ï§=I•=øM¤X>ÕU¦Y¤6 æºDL ±ßçF<¬©«'ˆö7`.€º ªËhÕU&ŒÏdFfhX餬®B ´ˆà¨ƒ …×K*««ï=`õ3*;Óћխª«d#0î.‡cy¿(gÞdE l¼Í=I¥ãq~¸Mh: pðm6ÌC]éŒ|{ž77q2”ÂN|ó&×úå¡®LffŸ¦×>#AÇåQy¨«™‡Øv³àÃFVÕ•NOŸ‚ÄtöLVPW&3Ÿüˆ‡­ë1±o®RSS²(ëZª+`á2ÜÜÈ̤GË¢åË;¾ªÒ¥Uê Ø±Cçç§8ÐÉ.W8R®œÃ Aê\˹sÉ®®šwßõzÿ}oÅ–nÝZ»¶{×®%ŠsR4øï%ç³¾jÕª·nÝÊYP¥J•ü”¾^_ðÌ*ùñjÁ‚mÚ´ùÿW•™i´³[¢Ñü”žnȯ2K–܆Åuën3›ó°ÌÌ4.¼¶ž?ÿLÑ 5ÕèåuNÞ¼™š»tΜX¸õöÛOr ‘ýû'ZlÏÈ>>zÐ9béÜîý¢PiQ²ŠÈÐYÖ6k…¨ØZÔ}O–Eï mc¡ySœ¹¡à?® ÷¼#&mPlŸÐÅÈŸ…ë0ñ[ ²M6[oŠ2ß Ÿ©¢ö|ñ$Þ–¥BoËo çy‚Y¢À|±&@ó:BQ¬z ¼7 ÖûubÈ9ñ8%ï½’ bÞá|H°_¸_ÝÉ6¯DỈŽ—D“»ÂãŠX#l¸v:C¼.x,ꆉÏâD†Sƒ‹²„g² IIÛõÊfBˆ!f £«Ðס_(L¹NéžÃL‘RJD‘ÅDäç"ñ˜Ð™lµÏ‘úäá›Úö[UÐÏoÏÉzô£ˆø\/Ñ Dä½DDŸÉ߈°¯Dè<¹LDïñDJÈ4Øê$[Üú‘"±”ˆì,⊉ÈÏEÒy‘eÃ>Cˆo„±†0Ø }aØ"¬¶õ²QTN$‰Æibn–°ÖÛS…W¨*|CÄñt«ÇÝ› <¯üE‘«b§ÍË{_´hpN8ŽÅ‚§Bo¥c²GÎ £˜{G8¬¬›Äš‡BŸ“·ï±èú‹`–PÍ_ü&¢ÒòÞåi¼h¶T4ùI¨¾SŽ‹tëW "Ë ¬¦ í ±å¢U3ƒQtœ"xGT."¬ôÉ…g[Qò=­d0gµ œ(ÿ–HÉ5|†„ G¡r—¯Y™íìôZ­þÑ#ËÎ=w. "=<¢SS-‹ÎŸO‡[… ßÕ)ݽzÝ“ß|£0V !ŒFsÉ’û`ë©S1Ù[^êÉÌøsþ^‰ÀÈù¬Ÿ3gNŸ>}r–öéÓgþüùù)}-üw¬·ÞzkÇŽQQQz½þéÓ§Ó§O÷òòºv-×¥ªrS£Æ­vÉ•+1ÐÝWNg,Zt‹ËòãÇCó4ž4)¶Žiµ+F~ Rüâ‹G¹‹..·=<îfZ=}jÔj#‹‹ µùgÏ6¾{wËí&“¨Û\Øy‰…Ë,”–!Ê4ŽUĪm ~³RÐP¼=Z$æÅ€c7„ö=Ñl‚ØrF¹F“è¿J0P´#ŽÞV¶ÉæF¤(÷ƒ`¼h¶Dì»gË2›ðTÑ÷ (½\8ÎݧBòÞE‘¬_^­Ö¿]âeý¹øœ0èC´¸ Ø/:\«C…ɦ$x ï ü…Ê_ô~(nZ?D¦YLŽe‚E×(q*êå#“h•&Ho§‰þé"ʺ÷„h- vBo'ôƒ„ñ¤ùòüî Æi"¥žˆñQEEä@‘°J¤EY ¤§g|7gK푳 _¡ýhkÁ+j}2ë»9[2rËùWA¦0ï½D|7_TD–‘ŸŠ¤»Âæc_ˆCÂü¾0Ú }]a.Œ V+“u¢tŠ ITN—­tC‚Q ‹ŽOÅÀgÅ,Ñ F<N—D½Û¢Í=n]þ…ëÄÀ›Âþ `¿xSÜSxçúÀ/!¢ËIá´^”Ú&úž1ùèé{ñ¢×~a?G8Ìm·‹sáyïb6‹¥þ¢ÞBÁxQbšøõqö1ÉbÀjÁ@Qh¤8vǪ™É,Ưµ?^½E 7_ÞíE‰wÅi¥·»àpQ¹­ œ8ø«B阉Bå.zV(úòK£J¥ï×Oá„ ’‘_­ðâ5rd8Üš4)*wQLLVñâç4šS¡¡Êçàðá('§~~Ÿ¿“¿¬ÀšûçüýeûYŸ’’R¶lÙéÓ§'$$$$$L›6-{ö0?¥¯…¿‘À²`;yòd—.]<==µZmñâÅûöíh3^‘£ÎgÒÇÓ}ú¬å^ ÍmÌ‚u‚ghÕ|^ÏÞ °•Kë9«.óÙ~2+ÀŠnt¬œÇ.ûnÐ{e½ðteÛp|¬ä1y#ßoÇÙ#ShZUÁ@—E‹O¸|—ÎÍØý¹ØvùV†}EQoâUèÅöšyx¿ ßN´ÜqüxÓœ9æÔkÖXžÝ!C’W­Ê9ÒeÑ"K×'OŽúþûg|à¾uk)‹"³Y”/1(HwøpÍví} ,‰¶NqöÅ. S(¦ Øni×1èn¨ÝQ:]f³©'†»Dd«+ SãYËÁ!Sûû%b¶ói¢zðÕ¥ô‘ªØåÎa¶‰áa=éÑ}EòYôhŒˆž8OÄm,n5°³·®®2`HG(P IDAT>æÞMð ú¢^ö-TŠWD€‰w2Øjà m´ìv¦Œ’Ý==]b¸eÀÆdqa<•DصtÚÜçt*4 ña…/…•D˜€•¡ô¿‰ ‚%Õù²UpÉëëÂët^Ï­(ìµt¬ÄÞÔ´ù’c|½‡O6Ѩ|Ø>w+N>_ËÉ›ódÙ'´ª©l3|ºLJú°}:Ž¹Þ”ÓëSêÕbÚXêäÒg+׳k¾eX4‹Dõ{÷Ä_˜[´PýðƒÆÝý…Ž{üØø¯¥5kæ0mš›»û ç>#ühQ¼¯¯Ã—_.QÂқÇNJhܸà¤IeTJ#Úœ9>LmÓ¦HçÎÅŸoÌσ/§qGPÿ ‡áŸ-0òDF°HK3,¸R«U§¦±·ÿ»¬›•˜˜UªÔú´4ÃÔªåeÛ¸a×.ů\Yoð`_Eƒ5.ß¾¶ukÕ>°üÄ÷Ò¥ôþýß=3††VvqyáοvÍЬY¼ÁÁÞƒÂêÕ¦ pó¦Öâ›—¯§sê4NNœÈõ?ïeèd ºqç0ž¹>q6“å¿P¾××ã–kÍÈ¢ß\ÎÝ£pANÏÀÃM¹+¶]æÃÍôoÌŠþØ[œè Ì=Ã×Ç‚:ÅÙÜ?˵,¸˒묺 PɃ[ÒÁ×fˆãß ç‹«ÜNÄËßL­E[¥P\N¢³˜úe!¨èÊÌJt.bÕØ ˜Å”ptfª93©8==•3òd¦'iÄ[ÃB/>pU®3I0!“•zhˆ,v¤½õgçø ÓaÌEP¥"Æ …ÚJÅ/ŠéY;ɸ‰Á•²¥Ñ¼…cÄÌ_Š< ®®¬a§ Д-=uBŸ<•Dÿ+†Ëè͈óèŠhã0·Ç± Ž òˆ0èaæmˆÓ˜÷POCígå*Ð ¦e±Ù@°™ŠjV9ÑTéš4ÃÂd&Æ“%híÄtê+Å™Œ‚L‹ Š3fÁÏå©nEjû„ÐpLfö²¡Y –jQ³ÅxÛ‰XRiE¨RÃÝU,wâ‚ dfRÃtDXY¢Úv ù m9H„ã˜{`œƒ9¯5´)…fÎðºŽÏ¸·Á¡êDÄÒ/ÜO*¨Íû³sWÓ¡û–ëy ˆÁtýNt3ILJžU$ú+Rz–¬L•ÑŽÀõ ÞÄg6ßÌK]a#æ*·aŽC¼ê(Úh¬©«sFj§qÎDaŸ9pÓUY]Ey/Š#èC °§ˆ²º É¢Å=N¥`¼ëÎåjÊêJÀŠPšùó4ƒ"ì¬Ëœ*VÕ•ÑÌ‚{´9ÊÝD Ù3¿?7ÏC]¥øö<µÖq4ˆ2™Ð€{åK]í¿Gµ9Da§atnŽÍ[]~@ýiD%ñ0šß&ä¡®>YÆÝPœØh]]í=ñ˸8²z’‚ºVlC£¡TQæMV(µ€ ¾´lª ®®^ññ¢xqÕ¤I–Qx¸)(ÈT¢„z‹"!8z4µzuÇÑ£Þ¢ïßOѶ­Ç€E›sèPdÅŠ® zæTW’¿2‚Ыױ­[­]ÛjÀ€JWù$$$µB…ŸG>,]ÚJăÁ\ºô¨(¿ë† î´´4S±bçRSMwï6¨RÅò&ß¹3ùý÷C*Ur¸wÏÏ"}ꔾU«xoouP·³ó ekÖ˜ 2Uª¤ºsGk±`þ’U|ò9~¸}Á2Šþ$”ÉÐqx íšYúù „º©]‘ïðÑ;ܾ}»zõË"xk2ÂéXÂûÙÜ cøÆàî̾ÑT±9‘¦gþYþu !¨V„•Ýi¨4òZ`0³õ>_œ&:µŠÕø¼>•<òÞ1ËÄÚÇ|ubÎÜM¢[if¾AY[§³`Scﯧ¸#•âËr8Y×›âø4˜x#µ\âÍ0å);ÓO„‘jæzñ‘›²R0ÂZ_êðR&oÏ$Gl$¡C¬Æ´]˜ *•'LBó!êBVŒ…0«^œX3C F²ÆöÝi´súÊ1<;ãJwý£ºâ*ƒ®ýÆNQ‡cÌ@D}ƒQ »@ €/š§˜ì 1•±«‹]}ì½òý†i€m˜g`.§o š€ú]ëhÙÁ¿ &î˜h¨e£rư=áÏH0Ó‰qî¼c%"µ#žáA·'ÙÄúr4·’‘É [}0®_•ÇÝzÐñRƒÎr7 `R ÆVÅëßÂîܹsMš4±°°é›ïsø)*W±oP,QÊû±Ì>ÍÚ+ïUef‡¼£Å&3Óösüçñþ,èCQëËh™Ì ]Ä0îsx Í”ò®€[h:ŒÔ Œetƒ›÷iØŠe˜;™Ö-KïܧvS€g¨–kq¥·ß6ž8!&MROŸny¦?ÿ?@¿­¤t!æ¿Ëî~y««ðDú­dÚ~î„ó}7¶ ³¥®tzF,aão<‰äØwVÕUÄ3þµ’:~ôk§¬®t™L_B–ž¦õÔ•,YE…r ¤ ®Nž¢P!>ÿÜòL'$˜׫Tä_;v$«TŒå•[]¥§›ÎžM†/ž{G ((íîÝ''Mß¾e”Ûœoìþœ?É?9‚uâDÌÛo5êÚÂ…¹Vá}‘Ó§#:v[Éñ›toÌ–ñh­Ä2ôŒÛƦ T*Ê[Uø¾[»™F~ºÀÖ›\ ÇÛ•…ïÑ£†r¦¼Ñé|{ž+Ñ„¥bt¯È´&yH¥òõ â29A!{&×dTådöçø'òãSöDQÅrÎ,¨JëÚÀÚX$QË™Þ^Œ-J®aüw¶¥ós2t¸ªùÞƒ­þ´Í#kôœ1#xGËR'JØtøb¦«‹¨†Ê£îŒ:»þ“÷wn¸0»ÿ›_¼U¹›ÅŽ©I SÇ}çí\þ™ÖÖLRvKmÔØÐSލQ¹ òFí¯ì8«„"6bž9ª¡* îñoÏylfŒŽhÁ-í˜êHe+s4ƒÁÏ7Ò܉ž® ³¢™~MaðS´PÜ=ùHyo¢²À\´ .ÉÄò±>ZgèÂÓ©ëIO_FUÎcf4^ÇÔ âi|éîGߪy÷¬Y°æ {ïrà>~…iQŽémñTЖl½ÄòÓüÈ»µù´5oÙüº0!•ÎÓ9{—¶µù®/õ*(›¥fÐl·Ó¯=Ë&(G¾ÇLcÁ:ºµcã8åA×mfàZ4å—M|ñd™Íôêe cǪ‡µ<ßß~›:ujÚ!ÎË—[ŠÄ{÷2«U{X¥ŠãÙ³å ²<«VEس§÷–-Õõå—³g~ö™ß¬Y–Éü/ÁZ›OÓ—d Œ`½nþD\]µÀÁƒyÿQ:Þ™™Æ7â²²òñ‹ö!U«z8:jΜ‰X·.L¬2e\j×vÏÊ2/ZôHÑ re—*U\RSMk×*tHÏžîZ-ǧX†nÚ·w(ZTbڱò¨KuéÒªÔT±m›e«]kêÕ¡z~˜ky,­†ñC8{…e›9q^ÁÕɨUІÍĨ&©VŠPÈ•çù|µÂédãlÏ’™Þk!Ì<İõ$ZOɵŒkÆæÞ¼]ƒ‰á{豉¶vɦˆ ËÚ°­ýª”ÉŠ[ø­fÑuÒôyìXÖŸ›1§>K’¨ç§@šdo¨­]b[æVÅQ;ªžfYF+yQ]=ØPžÞd˜ù"”N¸i¥>pa•}ÝH3³+nÑܳâ|;-?;3ÆgŒôÓ±XO†õQôMT¿ =„f ªÇˆ“ˆ^˜ú`œ‡9±÷Æj`÷õ•:ý¢§úÌÌÍ3'ož4OU •mu$ÙW˜äQÄ%¡)oâP»JhK¢ùÃêÊ ÇŸbòÃx ‘ ÍP}‡fÚ^ÖÕU&Ì×S5•ƒFŒð“Ûœ•Õ•N0%A±„iäÈŠÂÊê*ÓÌ÷´¾ÇÓLª9³ÊתºÚC³ ¤PPËÜ*̯jU]Ed0ò"ÝN¡QQÛ“ù¼š-uel¼G¹•,¼NH ß7cÓ;ôˇººJçu ÙÉÉÇt®ÊÖ>,ëš·ºŠOcÌz-çv8½²z`ê*$–NS±×RÚ›ùC­ª+£‰gróK2÷SeuuÒŸ…ë±·cÒpu•Ȥ)ƒ>´TWÀöíæíÛÍz=ýúYžïÔT±Ö›oÚ÷í«JøÓOñBЬ™Knu,_tè ü…“Ñ(öï4™D×®y},#y}ü“#X&“ÐjÕ*8x°Y… 6“\ G£$­YÓ²n]+ÃØkâÈ‘Ðï¿¿“~÷no­Ö– ö÷ûæ›»¦“'[88(X:ÿÃ!qq†Û·ëkr-n3eJÌùóé5k:Ξm™²´c‡nñâŒøxs@@a‹o6Ïše~ü˜À@­Ë‹èÝûŒžÀÕ›œÜ˹rNç®aÏ1‚à 8H¡\ñÿˆgô›JrRrã:ŒUnï凌ZF–‘*%Ùð™Õ8pø6c¶”AãrŒï@£rV-³‚]·ùt^.ÜabK>mBá|¼|wã˜x†¸ .FáíÌ— ^+_¦Á‘–’¤çt4­‹1·>Õ­e-Å÷¹—†2M,¯A#ëö§SúW fxÇÉÅq´r)Î`d.*øÎƒ1­½BÌLËⲉÛ&Jª™ëHW»½¹Sèâ`æÝ˜á ¢î•¥6eu¬Ñ¯G½O ú¬ý §¦=J¹ïÜʤ°.„2ꌀ3¥B·_¢P^§Ö&?cÞˆ(±Œøõ0Ôoä¥(ö“II5Q‚j~tÂÛÊ—³èC‘æN´rbœ»r¤ð¾ŽAO‰1দ;ß•ÄN©B‰‰, ¢…'¾Î|çgu+??aÔE\´˜Óê2 ¼­®nß¾à^}ôIž&SÕ 7;´¢J>©#S˜rœ[‘ÌD§2£=}ëä+ ¼÷‹NŽ«;2¤Y{ݦÃÜqsâ—¯(j%ýQFÌæZ ö¬ÿ_¥Ù¶°(jw¢šZ2n°‚ÁÇc8sžºµÙ¸ÜÒ+½žªUEŠ0l˜ºOË›jæÌ´Õ«uÛ¯]k9Æ%$˜Z´xR²¤öÇ‹U®lyÚ.]JéÞývn»vUsTºW÷ïøôÓM›z¯_¯°ÜËF°ÖçÓô%é/#X¯Û?‘l ñèQÚÑ£¶r8²ñõ- ÕªnÞŒûóýz9Ú¶-§{ø0yçÎ'¶-5òŠ‹Ë:þÙÞ½ÊQ—ví '>¤`à™UxÂäq ^ýô“ùñc‘œLÏž–Óôt1wnú£GÆ>}NÌâÅq·og ¡Ê­®€%KÂÃóªWwQTWÀªUAAAé5jØüí|cÿçüIþù 6j4L£¡cÇ<–ë J½?ÑÕÕ®uë’oùD¥ÂÞ^™£{ÿ}……R,xö,+1Qß¹³BÜ8{º¤$cR’ñÝw-#Ï j?Ö»ºª“’L-Z¼¼ªVco¯ŠŽ6›>øÀÉb”©PAuö¬HH S'µó‹ù@ê³s/^ž˜ÌÔy1O@¥¢y6ïý.ÎTÎz(áMÅRœºJh %½© tZŠ{Ò¦6»/àæÄÉ›´k‹Mº;ó^T*~ $!k!Ô+‹«­¬6´´­HËròuÿà2bæÏ0C<@\A8 ê„zš©hš ²² 73RÇ×YÖ"˜áÈR'JZyc½œE»H’ö*z»±Õ‡âJj¼‘ÁO¸Æ“Lúz±¾e•:à øîãï‘` …'›kÓÑÇÊšg‚µézê÷ìÃù ø¶¶­!ЙîOŸƒ¤5%]Z“-ïà—×·±B°ó6ב’EPíýØÿïT&?« n¼À·{y–JB:;°°…lö»ÌÚÅŒ]¨ {~‡³õ»xö&Ž^$9MShVKÙæ›„FŠ#kpÉ5§×3l %ŠÓ§ïw¶,MIaêT³ƒ³fiüü,ÏÀŠÏž™Ë•ÓN™b9’•%fÏ~æà þþû"eÊXž„ÃêÕQŽŽê9s**¤,¥Û²%ÔÙY;wn-…+éeý“RwÉ…FÿÙ<•J¥RmurÒ$$tUœ5{Î¥K1 î¬RÅãîÝ^™{ù$+ËTªÔúØX¿·† ­¯5 ÉɆâÅ÷ed;T¬¨0+š”d,Uê\jª9  ~õê–ŸdÖ¬ùÐÍMV¹`ÁFǬ,Q®Ü³ˆÓ¾}…:u²õ;t0>,&NTϘa9¦îÜËûýñòäÁUËlw`Ó^|‡;ñQJ6øn-ÿZA¥2웥¬±€€`>˜‰Þ@q/öMA›ô±;LÝǵÜYÑŸÎy|ÿð;'±ú2[o4)ÃÜw©—¿Ì³`÷C&žÁÝ‘kÑ4,Æ´&´Êkùàa Óo’Îéh*`~:Ø<âT&ÜçP,@÷¢,ªf5'ËÌ‚hFaÀωU¾4±2ž)X’̤ª9n`–'ý¬Ï´gÖ虥']$xߎ©ŽT´rÏ=‰½óÝþÁQ(Ò©U!ÊñíÇoØh½9UeŒsÂ4CW,MhTƯÃSL™K5>Mýöyºþ¢.æ^fZ—Í+‰R‘ˆ«ˆ‡póUDTW@ETQ5GÝ •MÉý;ñ‚Yø¹`ÂEÅG†ÚáfEg ¦&²9•#µXîE=+òh=%RO³Œ)J+ZüA#ns;•D3*óiYåøð4•Áçù-Šš4öajm¯O±|L‹û‡°ì"®4-Ëœw¨—¿WÔà8†màè¼ÜèP))“Ç‚Êd글­gШY8”álº6bübâ’Ù:•÷­, õëEZ÷C¥â·M4Qº¿ŸÃäï”WœfÌ0OšdjÞ\õÛo–*'+Køú>‹Œ4<èÑ¡ƒe¿¯_Ÿ8`@XíÚNׯ+$ŽÍ›öÙgÚ·÷ëkáaGœž7ùÙJz¾ƒš/Š±ÓªN<Ð1)Œ1Ád(¥É;ªøÌ[%q†_&0<Žp+³Î*F:pÝ•þöØÃ6Ÿé¨ãQ®šbÓ¥y¢;Ÿ75 ÷;_p‚ u¥FñÚÝþúznÑ©õÉv&}}òÁ,;³_ÙûsúìùtïúA—²ÿftÛ¦Wkâà âb+æŸ0}Œ©%Æ·1½‡©;¦­˜Ï t`£PA{íL4ò¡®R3³ø0ƒ9YÄúÛèÊ8{«êꌎîÑüHa-ãÝñ/®¬®2Í|ʸP"õ4uc}9«êj]#ïr*žzîœkÌç¾ÊêÊ$XñÁçù5Š"ÎL­Ã↶ÔUH Ý÷2ò8‡žÒÃó}˜Û2ouõ$ž?3x'ÛoñF Ö}ÀéaùRWz#31xGïàéÊœX?8ouGï‰NÄ͉ݓÑÑ–ºúù(³7ãêÄO㬪«ðhf­àÍ:|7VY]=~Êžƒ¨T,« ®¢£Ù»×ܨ+2ÐÌ IDAT‘ê‡ýæÍ:½^Ô¬i×¾½B¿:”¢V3j”´«üúk¢Z­úøcåÕ„àìÙ8µZ5`@冽<Ú?çOòÏ`M™rçÛoïŒWiölå·ç´o¿ÿȑЃßéÐ!†¿–°°´ÁƒOݺwýúÅlŽ|·n%5kvR£Q‡…uRŒ?xÞ¨Ñ5ƒA„‡+¬×päHj·n!>>ÚGü,áu:Ñ¢EüåˆC‡JãœXduqÑX>[Íî t¬ÇÜATT~Gž`ï ®ãæÀÒ~¼geég R³Xy‰\ E£f\SF5¡Dþ!Òô,¼Žž¢‚î~|ߌòJëPäDofÁ]ö†r>g-_Õd\5[K9Dd2å!kÂ0 ºe^«¿­Lçç8žfQΑU¾´°²X€€)lK%ÒD˜‘ñî|Yë·3óõlIÑE88i`¬}í¨ñïëbÿá™»–¢Ìi—^Yj«³ ¡5ÿ½ó «êÚ¾þïQ@@TDŠ¢Ø{ÇÞÅÞ½·Ø5öØb ÆÞ{ïbAÅŽ"v@š M:œºßæÍMpŸÃñÞróÜd<~ð¹7kí½×ZcÍ5ç˜<Ï¥¡ mlùÖYü88MÍ·/8–€RÇP7{ê­*•ÅÀ`n&RǪv,¬FQýg‚jŸ°ù)ï3¨æD@yÆVE&ýWïòXDP÷c©åJs¦6ÆÚï\yÉØ=¼JÀBA¿º,èDqýe›ÅÕ§ôZAr]ë2¯7 ÎÐ.Ów–æ,&.y¨Ô4êEH(Ã{²qÒ/” àß‘ [L›À’¹"w:T(^G¥:vüôñ£vÑ"›/ÝW7nä4nQµªùíÛåÌÌ ¾ìk×>5kö¤V­"ÁÁU¿Ç®]ûجÙõڵ킃›}™«ô_ëÁ:n¤éW¢ó?¬ÿvþp4lè \¼X¸XC¥JöÀ½{úÿ{pq±²±Q|ü˜·uk¸aËÊ•m}}m?}Ríß/žîïéiéçg­Ý·O¤§-ZX—(!ŠRâÿ’ç¹x™³Úi%ÄÙÕ•Þa{,ÕŠ°¥ë*èeWû"ñ;ÉÍDJY2¯*ëëbW·ãh{” ×x™Ê¨*lÏ„j¿4@»ÒêØýßÕ,»ÎÃ8¦4âX¶4Š]E§2q?óOò*GŽŽfSÿÂÙ•FËš“ÌÙMr­«±yL!ìêä-ƯF«cJ½ì ˜ÿ#!¡¸–`Ñdvì;̵›8Ø3yŒÈoÄ;t ãÆ‰\¼gOÞ… J­VÒª•ÈsÙº5 èØÑæKvlÝ´iSL”]‘@ëÖÎúØÕ?øëà߃¥RiÛµ»õìYú½{Í]] ‰?ž;=wî}ggËS§Úüi-4·o'Lz7..ûÝ»¾&&†˜ñ±cq‘66&Ô58u*ùû³µaaµ¾t³oÛöéÈ‘ áÔ©‚¢£ÙÙBÏžŸ‚ƒÕgέ_¿àÌ=s¦öÄ ÁÛ[rôhÁÅ'7^ƒ ¾ËÜiŒ!Ò¤9«8uµ†'DBMðHƯ&7Ÿ*žløV_×ÉÎgÀj>¤ñè›G3È_¯ågèo²ù:/0•3¯#cý Ñ#ýïR™s‘w©¼M¦˜9ý«3©6†B´ÿ…ÏaïgÞñ2¢fL®Á¸ªX&~”À²g¤ªy˜L¯²¬¬³þ/ú£’±ÏIRq#•ÖÅYWrzøŒZ`e'Óxƒ‹‚À²4Óï“»œÇôTð8ŸvltÀÅàa@œŽTœ‰¼ë»vqw®[ŒQèÛ@"É43»7qÄdÛ/’õ!”ð“Oõ<ѲKÅjh!˜eJCƒ×0>…X ¦t°Å=üæ½’Ṳ̈CQJ(X醅ؘVéXüŽ•øZ#‘°ËOïKLÊgømNÄÐÔ;S6Õ5t&˜®dn0û^âQŒÔ\~ô§EiCýúŒkï˜|†ø |ÐÁêöø’;ô òÕüÄìcH¥8Ú0Ο bÿq)ôþ[á4¬H»Lî\ÈØÜ™þóiX…&U™=H¯ÙÁ³ ›MõŠ,B ±Jâ1qøÖÁÏ—qà è(bЬ™&)‰€É¼yç:/¯$é”)–]ºœËÞ¼QÖªõ®vm‹Ý»]ìí >‚„UÅŠ÷*U²Ü·¯¢³³È§“–¦êÕë® ;vÔ*QBo™Î>^žsõªHµá^½Š^;VĹgO^D„65UèØQ„­_Ÿšž®uq1ù’]Û¶}HKSÛÛ+DÙpèPì¥K‰2™Ô»ú7`úÇüûÿû2 óæÍËËÓ†…e(•:Ãb ––&wî$:9™W©âàìüóûŸ‰ÔÔü¤¤¼.] *Êd’ÔT•D"ÉÊÒøû‹ˆ H¥’Ü\J¥ËÉѵjU0ÐÒÄD’ž®Ó鄤$M›6=ø•+›?®43“x{›”*õ»ùÅÒ¥’œÂÃ…=¤|cžåˆ‰ÃÁŽ[wéÒ¾`“äršÖáÀä2är*{ÿVKÉÍ _wNß&=›ô,êé™%ûâ^‚-t¾MÛê˜Te±µ o¼IÍáUKÎ’œEÝr˜QO«„ í|ð÷ 2©„ð,¼Š¥‚Ê% ÷„Ù›ÓÓ‹r¶„§ò*´|Ö>ÂÞœ ú~eê9ÒÇd¥’œÏ®wøÙéueyYñ+!é<Ê UÅ‘Dª¡¸ØäçhÂ7ű’q< ‰„Eñ”3ÃSl—IhhNkÒuœÉ%MÃò ÜLðúýãºvåò»c›¬w MÉ.~ÒöÛx/ôjJ ù6áéeöçÛ¼E¢ÓèÔùê\?W½1@kX¤d`q74ØHèdÂ^ +p6¸ Ê£s"µ¼TÑ΂ýŽ45ïj†–ñïÙžŒ‹‚z6œñ¤¢ž·3Žî1—a.cCEú”¿a¦šq÷|‹£9‹r¡µõWúKÌaÔÖ?Æ\NE{NÐÞQõâ_‡^ŽŠï¯ÑgylÍ]—}ŒR*îG1÷k.“˜½GG3±…Q.Þ<ßncÝiróiZ™Ósð)Ì›¹î0¯’–ÁŒÌ“³úŒIôžˆµõªñØÙ°m7CÑj9}«/Öµš‰u’1c¤Mš|'Z-³ggYYI§O·òó+8}ddh×­K±´”-]êìäT`iµÂ–-är錥˖çO+W¾¶°é^±¢¡=Å×Ê4ôÉðoï?2 ÿۼϞÒèèœ2eÎXZÊSR:k8ðêί֯o8ztÁ2Ãde©]\vdd¨BC{T®l(ëæåËÌ Î[ZÊãã;ØØˆÐ„”UÉ’wt:!2²Ž‹KÁ9/>^]¶ì+­–7o<Ë–-ÈMfÏÎZ¼8»U+Óóç †²ääàá¡ÎÌdß>Y‡õ‡¼k’™ÅátÛî:΀)”sãä&|ô¾Ø‰>óhT…^Íö…2Íoü‚΋IɤSæöį¬!ãÏø”Ê ,;‡ÊÓ¿ê{b\zÃÔ3ãl$@Ë2¬i‚WaÒŽgãu‡2ÖÜúÈò¬¨Ø«þÿmKbH¥Ìx˜Î¤²,ôÒ›ÞžÇØ÷eÐØ6”ÆAÿm/ç11…pÕM‘Â{꘡ÊÏÞ±Ê-xeЉÏeëo2e†ªûªÍ£2K^Ò˜ý.'S*‘.ì¼ç?Tf7ÏtTqXMq)·5 eŒ3¥…\ozைT3ﻳª˜²´-ôÚžûÄÄÞäa%c‡;zÁÒÕŒãàÙQÙ†ž|‘‹ò ‚?Òç19XÊÙT—>îú ,ìÉèˤ+±R°¥=½ Ñ§× ìyÌϸ0¡>SálD@:Á¼Þ¤¨%V¦,èDï:F àöKàâc̬Î7Í —*³…EÛq°eÙµÕk–“Gý¤mcNl¯ýð>†JuÉÊæÐá+`õjݤIZÉ‹rùïe×®¼Ò=<ä/_:Ⱦ¸ÿòåÉÓ¦%4kfuåŠÈdtútJ‡ϪW·¾¿†h—Ÿ?Ïðõ½P¤ˆÉ‡-, ‰Œ}íáy#M¿­ÿöG„ –­­âøñx™LR­ZÑÒ¥ ¹¦rƒƒÝܬZµúË%¦¦²ÄļW¯>YZš4kfHÉÁÁôúõäìlM‰~~"‰j²—/s>|PÚÚšÔ­[p3dc#{÷N£²¶–5lXð‰U®l²iS®NGŠ’%7Î %7o’œL@€´ÀcmM±¢œ½DN.­ü1ÿb“Vٛ܃¾g8ô[Sj9s6€ú¥ aWw£éw€=y™Dÿjl à›FE²çªXu‘.rä! 9£›²5˵KÉÎgò6v_#ê#ž¥8=‡V… Ák´L\ËÑëdå²q ôGÏêtŒ_ÈǬ,9·M<ÐS£aê\”ù4¬ÇÜé"II,]ªŠb×.¹—WÁ–i4¬\™#•2mšU•*7%*•°lYRd¤zýú’åʉ<Ê5kb_¼È7ÎåË ù3¶l‰ MïÓ§tÇŽ†r¤ss5ß¿ð«Y3«Îú¯¼˜Î¸÷¼ÉÇÃŒŽŒwàEoYô–úÅ(mÎO½ú/ÓéygŸ(nÆ_&øèu鶇1!ˆl]ãG€g!½‹Ï`Áξ"-—fô¯J7=gñ Õ±ïÓ‘T†LkCYC¾ËßáÒVŸàÂcœlÞšÝ0-ì€>;Þß‘’ARk'ÑV\tóŒ[À»¨âþ5xéqf/ZÁœÅÔ«ÍÙC"E!C´Û¶é† ‘nÝ*ò¾·mË2$£IÅ¥KvbέOÄ6mjuåJÙ/爈¼òåCL^¾¬]´¨ˆÇ2?_[ªÔ©ìl̓-|} þüóËÁƒ}fμ»xqmf¿B"‘c÷õhò·÷`ý]VppJƒW}|Š„‡‹³ÏÐé;»mééÊØØ¥J:ÿ‹ M›3çÏGzŽ©VëÜÜÎ$$äݺլ~}ñóÄš5>x¹{·Oß¾"ñþþ‘7oæ¬[ç ­ÀºÌ~L®† ¶L«D?ýÇk™&„³= oI¾u¯®Ã磥&F“¤¦ˆŒen -.’óàìéÑY®ÊøÛV]ï›wÔHô¯m^±GYÅo²Â}3lJ_ôß§–Êtà-ÅCF9)¥¥¸Jpâ ÁN‚•„ßþ±<H×ñ¢u¤<Õ¢ˆ¸¡¨,ã©4’SGF;jÊŒMöÑÂÞ,vd”‡¯)«í©¡ß¯óIÊ–ÄÓȆ|;ÝÅcÚ€ˆ\f½âàdf{0ÛCoí­¯™ñ+2TìnH=ýµé_¤²ô{©êHY[6øã`pk¡Ö²í³.–‹™\ø¾µdxm,ŒC.>gËuÂx÷‘ªn¬èN#㆜ÁòcüpŒ’v”qdý*üÔ?#>™1?pâ&ÎöœXJMC™©lÚÏÈ9˜™rq kˆÛ™unÜÈž2%1>^éeúÅyÉŠÙyåÊÉΞ™/†Õž>­ëÙSºfÈV/p?n!-ç!â;Å üHž’Y#i¯GˆØ~†ŸÏpû«Æ3¡‡^³Ïx—ÀÀÕ|L':™¾aL;cƒ«R²YxŠÇ1Üy‹¹‚1͘Ù£“xTZ¶Üãê[ž&•JýÒ¬hKm㎠/¿gbjj-5œø¡ .ú‹ÕQY »C®†;I´,É–z¸ê?¿˜Ìô—È!4‹É£²>i˜Ë|òµhá§2ÔúÿcèiÐÅœý3*ä< 5k~ݪoŽÔýTZ¿Ív¾¨Qü’ÜZÕ­áxÿúŒß踭ᕎ+^h)#å¥ÀNBªPTÂ' ´”Oe¤DéÜ¥Dè¼¥¼ÔQVвªË¨'§šŒ2l¾Æ%¦ƒ£ÙÌIÃIF®@®Àübt±4tÐv&éѼȣ†Ý혠ÇqìŠcT5lÉÖ°ºõõœG§æ3ä6'bhèHU{UELH@'°õ)‚°4ÁÉ’e i[X0Û­(F'2•:n˜›0Úëu«:FQ¤çñl¼ÊO×)c‰œeÝèèg”§ö3v^eïu®<¥¶'-ª0³»Q †¡oè¿€ø*¹8wƒ®åCg2‹ªÓ®zvbyùTk„NG.ÌŸ!b ôè¡MI¡qc¾ûNdNûé§ÜÙ³³š77Ý·ÏöK¿û… YÝ»Ç4mjyð Û—s©R©ss»ãæf¶aCùêÕÅ÷:þþ×?~ÌŸ2Å«ÿÒ:ûþ}–¯ï¾ìì™™*kk£Øñ?ëÃß…`½zÝ=p fíÚ*ãÆéÛ Ì{üøÊkÖüÙILFB£Ñ¹ºîLHÈ éZ«–¡|ž¸¸\ÿQQÙqqD6ÚJ¥ÎÅåvr²úáÃÕª‰,ÝU«¾}ò$oûv— ¦¦êÊ”IÊÊîß·¯Q£àH~úT¨VM#“ñð¡Ü×·à„¢ÓѨ Á! éÏÖuâß¼Ÿ‘ßacEȼô/›Ž3j‚ÀÒQL+ì\W£eÑA6žC"Á«?ÇÝPiÇßáU3Žrâ1f&x:1º)ýëajt=ˆ<5[î±ø*%‹úŽ˜×ܨDwµŽ59ùŽÛñXš°°>cªbPÝï˜xŸT%UíïC¿rzy@†šY¯ÙøÚ;²Ü/ý»™ô F‰LÂŒ$†¤íž]#åj¤Âï²õà$yiMÒ˜%f9_RYFÿúk³¢‹»ì+bnTt›¢t<Ñ¡#C๖9„ëÈp—ñF PZJ‚K åeH\¥xH)%ÅSЇ”’ÿ–(FàX;³9—PՔɶô´2äôJÑ09š]ÉÔ³F+°C¿ã*Kˈ0öÅ qe¥6z¾¨›‰ F!åC.›êÒKÆÆû úŸ#8ŽjŽ”±eS †Éê›üp AÀÓ­40"HÈ`Ñi6_ÇTN©b mh¬þÂg¼ùÀ˜Ÿ¸н õ|X5˜²Æ Æc×é¿€2Î8Ùs`v=ÊoÑ~(înŒíǨ¾zÍf/d×l¬yxÑå;wêÔ–(!yýZnõÅQ«)_>éý{í‘#ED®oÑ"òòåìå˧L94Ý·ïcŸ>á~~VOžÔm^\\nïÞ!jµîÂ…FEŠ¢M‹=œ3çŒùª ÷`#M¿õÿöëoäþùÿ”¤Ôj… íwärÙ›7é@·nåþ„þJ%™™ÒÒ”-[J_¶±1 I±µUètBÍš"9ir¹$+K+—Krr´M›ŠÔ?³°&&j£¢”½z-°+µ°dg  /^h¾œSœœ$99XXðè#‰„zµ8užœ\J•ÀCŒ?U«ÈËwÈdì9I·ÖXê9ݨî‹#·BIË"ô ­jÚ=K¥4ö¥š;'B°2cþ>ìm¨b\®½5=kÒܵ† ωJaùyì­ñvFfÄÊm"£¶+#ê Òq÷= 9+oòò#>ŽØ”‘I¨W’ÖeIÊåQ"R ‹îR¾(åô”«*c@9¢³IÊãj"gãhäD±øk3mŠÓÌžà4ŠÈ™ù¹”:EÅHiS†;b"!éÅãNû†Ôº6ÃL¥:e3áºUߩފ?Rez¶ãå ×óZÅïjIo4¯¬ƒ¡žÿö&PLBõåøËé­`ˆ‚oL3å;3†*˜bs‚¤Á IDATÊ3&˜2ÛŒi¦ Q0XAWšÊ©.£´ôëüUŸ‘¥cG=“8™ƒ‰S ËìØhOeSCŽ«=) ‰D-¬f´[Üõæ`ÞùD«,d|TX‰Ùˆ¦8kt,eâdªØq¼ ôïªö¿¤ÝQŠ™¡ƒµþ̨…¹í.?Þ&`7:Gk†Ôdo/Ê–» ä(Y}‰eçIÊ$îókþ>F  ;Ÿ¹{Ùz‘¬¤À¿mÿ¹ÿoÌßz°RR”ŽŽ' ijjg9®*•¶X±m¹¹ê„„AŽŽF„Cÿ7‘Q¾ü^SSY\Üáî§OèÐá–§§õË—mD™GDD®¯ï}Žè躎ŽaµZpw«>¾L«VJŠ®lÙ¤¬,áÎû:u .# øø¨ÓÓ9wNÞºµÈß^±Ž©ßQª„ރ„Č#‹< £QM.íD¡çvò&=f£TÓ·?Ϥ°mtjsvsàr%íøyÑ©¸cnGúÕ1vu’²Ùr w\‹@.epMæ7ÇшæV, B¸ò ËQÂ` à‰†“ªÄ¯Ã<á¥ß•¥aÞkÖDttd‰7ÞbwŽxûbóôêñ'ÕXÜ´êõмN¢?º[«²x{1·Öë.«ê.íýëÌîn…X±ÿ>"Õü˜Áö,*)¸•§ ‹íèhYHýÚH%£¢¸˜N5KŠËY_–²z³T³^±*@K6V¤¬¢ð.“áwx•ÁÇ<–UgB½çŒI¹ ¿Ä‰·Tw¤¢+›⸺Ê{Ž ÐËï[QÚg¢FÇ{L=DB c›2ªžF»·øvÒ°0el&wÄÁ¸ Æødz}‡TÂ0~šÊà/´ô ô%-œÆˆÞlœ¯wßG•¤}bíRñ"ÀðáÚ-[tÍšI®\ùòò„zõR,,¤“'[vî,òÐû÷ݽûÓ„ ö«W‹¸¬Ã²«U{РíÉ“•¬¬ÄGS… ç_¼È<}ºA»v†œÞ!!‰uêut´øøñ›¯ò`Ý5Òô+QçoïÁúßWrÿöö¦Õ«+]Úòöíf …¬~}gw÷"Í¢„Ÿáî^¤Y³RNNGF¶lÝÚ¹dIs…B’ªçV-[Ú9:*Qº71‘Œk_¤ˆìèÑŒ/ko/9ÓºIÓ;DÊé9;3gŽÌ‚íÛujµÈŸž4š6ÍñpgþRñƧ$ǜڌgär&,Ò[…èØ³«°¶àÆFÿ@VA ú‚°³fã(NÅ\Ah$“ùá¹ÊB®ú-+òdk{ãíÌûæ ñRÜ+D5þW·bv3öeZc¤‚ßÓqÓÏ^а çXÓk±™ô8Ͳ{†Äß;¹Þ™nePêXû‚¦çy%òŠÈY] µ(mÁûcÞ›ßé³§&~¸4w°bNÅq§›·ýÑ~ë}‹öúØ•Á4îžãÍùž]­¿dWJ3ç“e&ŽNÁ3†ùŸx¦*¤×T§sèþ‘‘)¬É C‡…”N¼p%À »RêXÏÄ÷\LÇNÎ'ÎyëeWáY´ áJ R˜æÎéšzÙÕÎwŒ¸Ãµ*Ør½5“+êeW§#èvŠSï(jÆ·5ØÞÚ»ÊQ1ý3.p4ŒÞœý†}½ ²«à`‘S£+/¨½ÈVQ³ 7§³¶ÏW°«Gïh4ƒÝ×øFõr\YÄÒþƲ««°ÛψúÀÍŸŒbW3VP®4=Û³~®^v¥V3s í[1v¸¸ÍƒÂÓ§(¬_/þµïØ‘›‘!¨T‚(»Š‹SGD¨ Éøñâ™FG¦+fâãc©]Ý»—&“IK–4oÕJ̽ö\¼ãädѯŸÑùÿàÆßȃ¬\ùzÉ’—ýû—6,Ö°téã3îŽUqÆF|ÿMœ=û¾ÿ+-Z¸îßß°å¢E/æÌ 0 ô޵D ‚‚>ùû‡–(¡ˆŠªûe…ÑŒ ­Ï›ÔzT«V0–$#C¨\9):Zwã†]Æ`*M›ªoßfÕ*Ùĉ"l>"ІmøÀþmô oØkÚ%ú³F±h’¡ž>|ÉìÍ<}‹§VàiD-»¬<–aÿ ’2°µäûþôoZøU¿B'°ÿ矱7À§ó;Ò¹ÚWx³^'³í>+n8Ù0« Ãj"ÊDg²ú!kÔ)ÁþT3(®}ä=k¹DU;úº3ÞGï©h††¥ïXö:;1·<îBúÝ­‹+>Ùh%ä¾1­yÉzÈ'™¡‰^žaóto¥FUªNûvÁµQ9ÊßÕЖH¤ã[­lU-(Ó¹h WGeClhi‡q9kÿ·Ðås8›h —rÊ™ÐÔœQE¨l°ÀgœOgü{ÞæãeN”D¬ €N`u³^¡ÔÑɉé娥çd5]Å”~O†ŠIøÎOü„ÈP2õ[ŸâçHmgf×)Ä©yúK®ñä 90­1æF<óÇÑüDàM€ö~ mH»Ê_É“ÌÚS¬>‰ ÐØ—á­èÑÀØËÕæô»á ïÌÂa8è=Žþ¡/ñïGj:cú±r¦!Ï÷w‹ ÜEi7NÀŅÕÒ¡ƒöãG¡kWÉôé"Ã2=]çîžœ™©»tÉ®I‘—4yrªUÉÇÛmÚ$š’•¥-Y28?_÷ìYM//q¢=tèƒÀÀȹs+Ì›WQoO@­Ö¹¸ìLIÉ{ú´WŊžʃõÄHÓ¯D•¿½ëïE°>‹5T¬X$,ÌPZppBƒÇüüž<Ñ_ý¿ F(WnWllÎíÛµkZ]##³=<ÎÙÚšDF¶ ¼½CÞ¼É=uªR»v"Û¬iÓƒƒ³ëÖµ\±Bde]° {îܬ€³#GD‚>K6¸ºJîÝ“;‰mv·îdØxÊ–æê)Jë¡DçoÐq8‚ÀŽeô1¨ÞõöSÄσµ“hhˆHÿ ÷_3b#O"†µbR'<–¼ÔZößcÑit‘Ét©J×êô¨ù+нf^@«ãF$+0¸íO:ÁØ«”¶!$IÕ˜QÛ*iš’É÷ þÈ»,—gV%Êè?”¼‘ʨç—Õìæò‰Ñëí…ôy¹Ë6ƒ£M Mñ²Ü4Ëç‡ììt]—­°÷öYuqÒ³¸;lZûöéYsÜçÿ?U˜Åþlrt($dêèm¯‚¦æ¿èÂÿ¡ÈÖq)Ó9|8™ PVŽ­Œo¬éc­>óñcþË—­½¼ éèŸ?=pàÕFJ:Ôòk•Üÿ!Xþ^K«Z¶¼qçNÊÓ§-=<ô./J¥¶I“Ïž¥¾ßßÞÞˆÒYÿ%¬XñdÍš§mÛºmÙÒİåðáŒY²¤ÒÈ‘â³õÏ?',Zô¾lY³+WDÆy|¼º[·˜Grß¾õruý²À–Уǧ«W•—/Û5n,²Â§}þ\ps“lß.î™ý-‡OàåAо¬/ñ;޲af¦LJý @V.ƒóè5%h[·ðÔÂÏÐêØtž}7y…LÆÈÖ,èC‘¯©H©Örø!óO§&-‡*®LjI§*_A³.¼fÆyRrÀ¯ËÚP¡°¢o9jÞåA×b¨âÈâ´6¨.r&–aÜI¢ºË1ÌS|IV«”A+ËÜYé¤KË”Ùݲìù怒ù–h”¯ÏJ’<Qùmíö¦òÞÊ#×”`(a[z~§] ÙïÏT×óÙ“ÅÙ\ä¼T£°—ÑÉ’Ê šSQñF¶2uAX$Uʳl”ÞÚ£¿ÅãpZ  |Ê—aËbCì*üµšR®,c‡1¸¿¸Ml¬P¡‚ÆÝ]²h‘¬m[‘畘¨swOòñ‘oÚdS­šÈ§³tiÒҥɽzÙþô“øŽ­råûJ¥nÙ2÷ŽÅ%Y÷ï>üa§N%wí?øƒ]½z5nÚ´ª£GûþC°þ"ø{, _¿={¢W®ô›4ÉÐAµ¿ÿÉ«WãŽiðgTCû÷ðæMº—×^KK“„„AVV†ýÆ®]ûÚÅÅâàAqµã¬,m©R·335ÏžÕôõ9cè×/vÏžOß~ë êÄZ´({Μ¬zõÁÁ"Û¸˜ÁÛ[“—Çò Dæ©Ô4*×£\YÚ´`êøý<88¸~ý‰elØÃØù˜*8·&5Šu:~ØÇ´ #»°jþñiÉ©‘µÚGô•ë~}%“Êæ´ ,£?sP#pGÉ¡l.ä’®ã“HÁ^†‡ •MñSà&§¼ã$׳tÄjx«&VC´† ¹¼PQÍ”J9nrÚYÒÉBo‰›/‘¯cG ³c¨`Ap&}ìYYýd£žó.‡Ð º9³ÑW¼<ð!—onqñ ©éÀ÷ÕôŠqD¥Óë ÷IXÔ€)5õÆfñŒ:Ω£ê2«)%Œ¨'øÓé÷«ï”~û`LS&´Àýk¸Ñ¥'ŒÛÌëxÌ´ªÊìžTýšy4!…‘Ë9y g{ZÕaÍøB²?#$”ÖßžIçXkˆ]eeS³)¯Þ0¨?oÐkÖ¡ƒöôi]—.Ò£GÅ?·ùó³æÍËîÜÙìØ1ç½R)”)ó*!A}éRÙæÍE&Õ;w2êÕ{ä計­g¢‡ž·hqãòåÄŸ~ª>b„¡'¨Tjœ¶§§+ß¼éãáaûµ뙑¦_‰Jÿ¬ÿíþù9»~ý;‹Ý» mÖ¬yzâDT£F%æÏ&ù‹ k× ))ùÆùôîmHÜ+?_ۢŠF·eK }eØ'N|ûìY¶¿±3DD0?Î;6^¥âòå2¶¶§›¬,Áß?U"áûïmš6Y@æÍÓݺ¥S© © \¹Î„äç³ã'êë'Oß.áÊmS8²žúÕõw€ý—¶ïÒ¸—bÉHJ!ú/<‰dÝ)ßÆÊ {V ¡…¸ÿ^/TÜgþI,¼þˆ§sÚÓµº±4+-—å×Y}‹Ö^\~ÔÆÌhRˆæ–V`í#fߢºéJfס»ÁP×#ïy—жäkåý‹ìûƒ³GäG¦—SFH^šÖ»b=(Cfh]U$…[…î)ãíÚlÑ +÷ÒSdä¥YšU)œÔ™/ w©:¬c•ÁFõ"Õ\ÍãV>q‚ò¼¼R!€¹„|{¥ä˜K°’â(å³*¼•„X :¬¥ËÛxáE:ÛëÓV2þá׌¾B;"3ØÓ–úK’ [ï³ø*ž<ˆcY†âxñɹ)X›ILMXÔ™nz¤ÏEòš;IÎ +3õ¥Û×è »/°ã,:Oß²lt!ÝÅåÛŒþŽ¢EqsfïjCyÄ:½“—G|·.`¡gïp옰l™6/óçe%KŠŒÛ¸8m»vŸJ”-[fåë+Âæ¶mK۵듅…ôüyq¯ò„ oCC³š4):w®¸AttNß¾!ææ²C‡êÙÚÚBŸ>ýþ‡žØÙ™;Öš¯/ö\p¬þÁû‚õ¿Ýÿ/¿³Œ uñâ't:!)©SÑ¢z÷­·n}hØðx¥JvOŸöüã›ùïcË–ðáïûû»\¾ÜÁ°å˜17lx;aBùÕ«ÅÉ‹9uê<”É$±±õ,-EvlÍ›G^¹’½p¡ÓìÙ"‹î¦M9+VäØÚJ>´ÿ’FäåQ¡‚&*JX»V6nœø²6m.Ë×RªOna¯GŒG:‹m‡¨S… ð+¬ìLX$ß®ãæÌl™A·¯ `?}Ÿ [ÉÈE¥¦Š;KPרÊÿ‚RÃ{Ì:Fü'ŠYâS‚)­ho´Îõ›d–±ã!@E'–µ¡Ma ˆHgØE²T_õ{w^Ÿ>æ{öˆœÎêtT¬øúåKåÁƒ®Ý»‹¤¥©ëÖ}T²¤é–-^îîâ,ïs~RŸ>n{öRU°G‹‡½[¾¼î”)Uø‡`ýeð·#X@óæ7’’òæÏ÷íÔIïŽR©Ôº¹írq±:¾½½ÑUQþt¤§+Ë”Ùåí]ôÀV®®†Ò‡BCÓ4¸Z¿¾Ã‰õME ¡^½G™™š©SÝúõ  Ên×î}£F–‡»YZ¼C^žàá‘ìä$=Û²S'‘'vê”®[7mãÆÒ;e¢Ñîj5MÚó>š6-Ù¼Z/ Ñh™¸ˆÝ'©Q‘3 çXÙ _ÆÁ+4¬BÝŠÌ„¥ñUn4ì¾Æô¤dÒØ—ò%Ù¿¯QÌòÕl¾ÎÕ—œ¥žy*¾ ¥¡`ñß!(‚±'p°¹Œuñ6xX#À¶g|{< M\éãM?ƒeÚ¶»ìxzF#å# SæpͲßsóÆ­¤ªl‹WgÌ#®XwðÍ‚9 ++ 9ëÃŒ£=ÔZqÅÔìŒû®òEÝÛÐס¯1ÐA²–4-i:²u¨ _`"ÁJеRì&ú 8ÂÂxÜM¹˜9 \èRÌP,9p8eïËÂÃ’nŒ.­×þE:ƒƒùÇÇ<–Wg¬^ˉŒ¾Bj. 9,iÈøjðŒ•7‰JE€ ¯Ö,ì¾ËˆNÁ¹(ʳ8{£k±Æ§²à/c {…ýš0£ë×Å/ªÔ,ßלÆÖŠ¥£ÚÑØ}Èâ\æÆ}¦ gÉ·…\¸‹Ÿ÷ð(”KÇiTO¯ÙøñÚ“'…2e¸vM.zÃÐPõ˜1™«ÃÃÊ”ùÎNžÌœ??1=]÷æç—©ÙÀ¦MñëÖŹ¹™?_Y_3ºu»síÚÇ}ûê´li(!;[ݾýÙ‡“ÂÃ{¹ºZóÁúËàïH°Ö¬y=qbh¿~¥ ‡ ôîݧqã*ÿ•ð€Aƒ®îØñjΜê rP¿þµÛ·“÷ï¯Ó³§x¶Þ¡C{ô¯TÉêéSñƒÑ–-£‚‚²ú©äàÁ"9Í»vå ^¾¼üùs1ö¸qš\]%GŽˆ/}±q4iOi7Z6eÊ8ÂÂÂ|}E Z«ÔL\ÄÆ½ØÙrewá Øz’å{ÈÈÆÊ‚sŒÍ.üŒÌ\ÖœâÊSn=G"¡Kæ÷¡‚¿EžŠÀ›ì A£ãÑ{j»³¨3ÍŒS2WkÙt•׉N§TUgzÓBªðÆgó}·ãyšD«2ln댷OîÇnŸY=åšA-1»kÑå¶e€F¢×­+4f‘7-ŸÊ÷®º«ëŠÏVl𥬮ͺuEß…­ªûжÛÎd4ZÛ0Ù™Ö¶†"‡þëHT³ù#·³¸œÐ¥]ŠÑ˾pûÈ\Æ>çC>¡™Œpe†®úÙü®wŒ¼K {,ä,®J=^[ÀÒ{̽FGO/æÖÃK¿"h|CrþÀ”FLiŒCaDçA+/rð>ÀðÆLn‰Ga©¿"%“Žsó9w_a¦`B&u2VÚêW\{ÈèxMKF0©ö… 1|†J͈9<Cè 6/bP×BìoܦU*ûéÑE¯ÙÑ£º®]µÅ‹bRFOÊHÓ¦©AAªï¾³ž?_„‡~.í|î\ÆŠ%¾ùFämétBùò!yçÎùµn-þ:ïÞM­[÷Š››eDD[™Á¡²s端úû—º|¹ãçŸ|-Á*DMñß…ûßž`ý„FÅg¹¶ààdA]HŸ¢7o&\¹÷gµëßÄ€^5k:>þÉpw€¾}Ý€#Gôö¨S'GGÅë×¹wîˆëQN˜`oo/Û¼9M+¦nÙ»·¹§§<"B³¿¸bæ”)²W¯„sçt.èD \J±q%×n°|-׃qug1 VϦC3RÓ™ºŒÇáú:ô/ íÈÉå”p ê¦òÃ^TbÚ§¢°±à»žÎäΘ+ £Ñt­áytá×þ scý¹>Á p°&$‚.ë²Ûo ¿ÖDÆØº<Ïàš¸eáUzíý%lYJZ±ÁŸ Õ(jÆ…(:Ÿ ð7¬±o_]žà°¢N”«À3³¦?Úo½aÕË»R||^ìÒ¬η]¾bÎÙS3šy3áB2Þ1åÁóQWõ]èS¢FÏÊ]WºñØ—ØÈ¸‘ÉØ(º¼aé’~ îf1á=U˜GŒ’ê–-Ïáòô1È®4ËßÑòç’Ð ü\™Ÿ*éeW)JFÝeÀ-r5øØr¸‰^v—ÅÈK¬}„N`jMvµ5Ä®„Ò÷ϰ5gsËÛ®Òr˜t€ÆË8xŸ6•80‚MýaW¢B£¿EF+ÓxËŽpï5ãÚ¾%¾Ž]Å~dôÌßÊ«h<\8²„ïGË®RÓ5—íGˆŽçøÆÂÙUøKÆO£RfN2Ä®RRøþ{0ožL»ºpAyçŽÚÎN:a‚¸36((ûСô"Eä½{‹´ºvíSLL~éÒf-[ê­xuìX,У‡‹avœ>ôìéaØÌþˆ:9ÿ9·HLLôððüÞ…(ù¿ýmLLL@@€M@@@llìÜŠÿGЮݭK—oÝjZ«–ÞÊ[aa©;ŸW«uÑÑz²xÿ:t8{ñbÌ… í›6Õò ™™êÖ­o†„¤¾zÕZŸJÅÊ•1K—FûûÛ¿_ä`I§£{÷˜“'3öìqéÑCd"<}:âĬÜ\Ý»wÅ-,Dæ…À@íÂ…‚NGx¸ÜFOPȲ5l$/G7pÕß!•šo—°ÿ4-ç¶QLj8t•šy<|ÍãW8Ù±m&µ Ÿ}‰ÄO^"èמ!•0¢5£ÛáSH}°‚ÈV²î2ßsâ ‚@?–vÃÛ¸ü{1L;GX"ÎÖxg]JÊaÌU“y•FÛ²,ñŽHØû]Õ÷‡M5©ð»b=ø£Á:ÍòÌx«§{->½©9j|Í1妿„%)YÉOB‘wCÔÏE¯5WX-î¼×Îê_YZ¦²*1J¼Íp7§¿=‹¡ø¯:´>ª9žÆ‰¼È£¶5fŠÉãD#rîe02 3¹|¬Yá£þ訠úݤ”%¶& õ$ ´^˳‘ ÁžÇ”µ£eyæ4+<âêðV^äÑ{”§VYfµÇJ› µ†íWøn/Z>.³f~*éo›(”j~:Êì-ääѬ­k3¶›¡¼¿xñ޾“ }AëF,šD•Â<Á ‰ÔiNV6=X¿Ü˜ÖøñÚ „ $[·ÊDÕjZµJ“JéÙÓlð`q‚Õ¬YdxxþܹŽ#GН/;‡Ý½›þÝweGø>me IDATSQ*uÎÎ'ÍŽ«çímè]&'çwëv^£ΞmWäÿËÑ~­+ÊHÓ¯D™ÿÀƒ%B«V­Ø»wïßÞÄ@ײ³³ýüü 4jÔ(`ãÆ;wî µU0ûSðwô`µkÛ•.mqúô6+Úefªbb²""ô”ùk@"¡J{µZ·wïÖ66&ÞÞ6:°c‡ÞÕ«—cF†æÈ‘¤¸8‘Â1R)-ZXi4Â’%I¢y»vfvv[[i` xµšAƒdÎÎÄÅ ³gkõµaÊ8*z“’J×þäçëíŽÂ„•3iR›ôLZ à’á&|?’…C±+Bx$õ†±|7ù_SªÅ©(³{°*ÓºRË“çðÍðõ¼‰ÿŠ›X™2³»‡²$s>¤ã;‡IˆûTøµµ\¹:ŒyÍ1•s, Ÿ•ì|ˆNÜ!àdɑ̭‡»$¡æÅÁŽ‹|êDí3Ô©²’Gm§í-ºÐ»’*³¬Bw½8Ý»‚ó  {u'Ïø•]ÅMYáÍX›KúØP×½åoÙ`-cHqÂ+³µ,Cy£äÌ'º¿¥a8ßFs9ÍŸ»ãKÑp •ö¯(õ˜ɼÈÃÙvºs´|áìꓚ)¯¨̃t2T,ób—Ÿ^v¥Ò2?ÿ‹ÄçboÆÖúzÙ•FDzût?EJ­Ê°¾™!vu/ÿ-\|¹ ã걡S!ì*2‰ökéþ÷"XŸŸú³¤«QìJ8B×¥ ßÀÇt*¸²jÇg}»Ž_ǧ{/’“Çÿcï¬ã¢Ê÷ÿÿœ¡SJ Dì.ÄnE]±ÖÂXtíîîX»]{íVTTÀÀBE”éîaê÷‡{]Å)Ø»÷w¿»÷õð™Ï9sÎÌ™ÏçõyÇëåÚŠC ™9¤ìê¢ÍÝ@ã:ì]©ž]eçÐëGb>âäȦUªØÕ¥K²íÛeòÅ‹³+`ß¾|??ÑÇRwwÅËöÓ§ù~~¹òÁƒÇâм¼R32¤ýû+­á÷òŠÏÈ(20ÐRÍ®OÏwïÆ››ë•Q&ö¯þ #X[¶l±±±}zÀóç)#G:­A™Ïÿ?DDdzxøJýý0TÙ¨õüyÆâÅ!YYâ;wÚë(‘Ù7.<,,¯o_«©SdèD"y·nQ99Ò•+Ëuï® vÿ~Ñüù9ééò{÷,¬¬¼EHˆ|äH©D¾}ZÍ›+žÆ22i5ªst¯ŠB*eÌBÞFRÆ„Á®ŒTâ·S …E¬;ÊÁ+èꀀ3éÞR£¿F|:kϱ߇6µyJ‡z,L“Æé“²Ù~‹ Þ4®BD"cÚ1»'d3÷:>ï°·¤H¯ýh¬$Ú—›•ùhÿêÚ/v›Èó¡É=#5>Íi‘A„a¨gº‰mÚOë×ïb©hK‹æš›¨ì<FÖëûŸÓÕVªÊ•(æT*7³ðΤ­)w³©e@Cº™ÑÙ”ŠšÅTJ 9„ÙTîæÐ̘"!ùô¶`˜=ÍPT”¬à$Çâ˜JSüS_…Õ5”г¯3~+=ž¦1­‹(-Aû˜Ãà«ÄåP͌՘ÙTiå»DƦ{,ö¡q*›³² Ž*Ûî$2vù²õÖ¿®R*²ðEE¸ G.'&¿kX+ÿ|’“iÙRbkË! ÏYYò–-S­¬„3fýðƒâ§zèÐØøxI»vFK—*®e[¾<Ê×7£^=ã;•jë ú(>¾pРʪå¯w÷Û?æþôSÍaÃþÐe)i+Aá%„mi#XÁÁÁƒ 411)v/*n­C‡óæÍëÒå︛7o®_¿Þ×WiÃ_¿?ÁŠÙÚ§ö"‘¬lÙK99’¨(×*U”®f¼3Æ¿oßjŸÅEþ›Ñ²åùÇ“Nœè¬Z ¨WÏ;$$ëʕֽz)6fÈúñÇ×r9ÑÑÎ åï~ù%eîÜ„–- >T¬ ß½{º··hÚ4£-[o¿6m’nØ ·´äùsm}%‹ïëPšwæh­_þúè÷ÉØ°ŸyX;‹¹JL[¿Ç«H†/çU$À”ÌŒÆÎµ_ð1•÷Xs‘m-·a’+ÍÔ| Å™ÌÒK|Êän8F,teJg´5Ø^ e•ObÐÑbV–tFÿ«5¾¨°0àÈæª¬d™€íç†=î)(}æÈuã_žÒ—å2`êbÇ9èu.ϤšôþŽo_}yäü³=ª¯p@“ ®õG¨½‘Юdp' ï¬Ï—™6fZ¸˜ÐÚ„&&Ô6øS9ÄÁù<Ì!VÄé4’Å44âEºº›1È’.fXj¬)p'_Þs# ›5[j᤼çN¿„°$ˆ"Í˲§¥ÒŠ+àb?ûZ@eSÎö¦¹òÄñû4&{ò$–Ìv`Q'5–O£s„—˜ÝÙÝTõ ~­ñÇœ#„D—ŠUÖdHÛ’©ï™¹«”·BO—•cù±sÉNÃS16äq0»—3z€úC$ú»ãyJ¸wC© —ãê*¹~]Þ¥‹ÀÛ[qç 0kVö¦MymÛêÞ¹£ø+ Õ©®«+øðÁÉÖVAPN,–÷éó*6¶pïÞ..ŠC\II…½{ß×Ñ^ºäR¶¬ªMFf¦ÈÆæ°L&OHõµéÈÿi‚UPPмyó}ûöµhÑ‚ïîE ØØØ¤¥¥YYYuèÐañâÅNN¿ ÊØØØ¼zõÊÆæ^›˜˜Ø°aÄ„¿èþÔ£4²4ÿWàã“lÞ»aCq §'ìÑÃ6""÷Îä‘#•z‹tëV¹|y£¼<±X,Sïù/ÁˆNÉÉ÷ïÇ«%XÇWÙ¿ÿýíÛIÊ–‹Kss##áõë© Ʒܸ1EKKðäI~óæ âäëכܿ_"ŽŠ’*ìaž8QëàA‰®.ëÖÉ–-SüÁÖ©ÉɃZý†sãNŽôVNq…BæþŒ±SVpÍŸ´LÖÌB[ƒýz´6¡¶!2$|*"¶ˆL ÏòxW@íßëëk’,¦‚.Œ˜eK3ÌJ2 ¾Ëcæ[ò¤H)¯ÏZ'†WT¥Ú›ÇÈ{ˆåˆeŒ­Áæf)y» óî’Jݲ˜èr¸»*9þs¯XãGx íí™Ý–v*Ã…b–yr?‚¤lª•e;]Ô•~fWi9ìòâ|ob1Ògãh~ê‚Q ÍÃR2Ùt’§¡Ü Âĉý™6ÞäÒMVí"ì=Êñø 4(”É7¸OXZpã‚*v8 KOX[ËûM)»ŠŠ’¾|)14lÞ¬4mwâD¦ƒƒn—.& ÙpõjjZZ‘ŽŽP»®]‹—Hdå˨fW€·÷Ǻu-¬­ þ¤¥›ÂIa&ÌÒìð°éϼý·˜1cÆ€>³«ïÑ»wïY³f5mÚ455õüùómÛ¶õññiР‘‘aañMˆ¥¥ezzú¿ïÒJŒ¿s+6¶ÐÎÎÀÈèNr²‹¡añõöرhw÷']»–óön«â$5kž Ëx𠟳sɃÿAddˆlmK$²˜˜*¨Ê0%%V¬xE(|üØËÚZñÏrÏžO&„·ooî秸t|ýúdoeµÏžU,Õ7~|öÞ½yC†œ8¡xyþ\Þ²¥D&ãþ}í–-•®P»ö3i6õjshÕe͆aWuõ´›Ž›Ò|ÊL-ßWT3ŸâO®wÆW‹Úã3T*SÚ©ð5äE5÷¬l?´B鵯òe„^@’˜7¤ˆ1’"¡’.úˆåu ™…¹6UõÐRYG*êRCŸjúªÌ˜U#®Í¸’Äû<ìè^–¥ŽJ-?ãc+‚ J#( 7;~uFEˆa× ö¼À€´Nõ¢žò:¡Ñl¼Ëå7tqdP}F«|>óD,½Ìé@ tÐÓáðhšjÀÔårNÞÅë)§îtŏÑ%V}Ë+`ó)üžŸJd³i õ¨Âíì8Æ•ÛX˜±q>£4«°”ÉX°œÍ»1+ÃÅ㪬·€ÌL†•^¿.›0A¸k—Ò¸·¿Q¿~醆ÂÀ@Ëòå[´(qÍšäáÃÍûM11zù2¯MUn@XXNóæ7…BABB}}Uqø´´Âš5OffŠFYZ~óx•”`iÐ]S˜—œ`988øúúÚÙý±oW}/IIIööö¹¹¹üW¦ÿþËÔôn¯^VÇ+h5<øñùó±§O;÷ë§T àÆw÷ÛNNæ÷ï+×NùïÀ­[çÍ{T³¦ùñãU¼y3ÑÝý‰¹¹nh¨ÒÄÛ’%6nŒ=º¼²JÌ5k’×®MîÑÃôÌÅ³ïÆ¹¿ýVhc#¼}[±tHĈÒädyÓ¦‚õëL%Ÿ AÄb&ÌäØiªØñÀKå:@Ÿñ)‰©+¹r›¶Í7„~ÝÔŒÿ2§osà ÏB12À¾kÆ—¬÷ ²òØéE`W4q`ùPº7.ÍʱÅÿ0üèlɬnŒo¯´0+ØïzÁ©…uò‚?ÿWsŸfãS‚¬‡>CÖ,ïS¡‘r‘I9Žà\4Þq Ò›ªWðXÓ;$½&>f»ú”£‡5îÕ~þ{ð!ŸmQì‹¡©9NÆ,ªN5•MßrØÎì§d‹ù¡2}ípWN,²DüäÍ…wØ›áêÀºÖß”Ð}sZ9;0÷:«³¹ö*´O>0l‘ɸTç‡FLê¨ÆËò3žG2q/OÂ1Ò“÷j&ðèJG¥2ãŠ!³ï2>Oðz€}E*°f<4ΕA~+vòð9ÏßÐÙ… s©^E£¥RFMäØiÚ¹°d.íUu1  ½tIöフnóÄbêÕKII‘­Xa•;;Kd2üýµÛ´QúÓÊÉ¥Mw‚CèØ–kgPVÿ…"–ncÃ~€eSY0^£’¬/‰9zƒ¹;ÉȘ1˜Ñ®Ô.¡CÎgI8r›§±5çY$X0€Z"Ô˜fÅe0ý)¹Ü £nE¶¦Ã·-­áÏ}:ºø³d( ±Oó[ãàãÚ™1ÖµëV½aZBË|1ï3YߎI QQp˜\È‚ûűÓ5½/VÞr»ÈY"§œsTÛ¿¦Iðß‚ÀLÅžÇ4´ ­ÀÂê8ªëîü”ÏŒ@>æñ(×Jìu¦‚r6ö,‘!×°0àm*¿va°òNå¤\&_æÜ+:8иkº«j€(³Ù‡µ^”+ƒ¾¿yÐH‰ãÞ×HËaÃENß#% 3#<Ú|Z2ªB‰²ä)çý™»“Ø$t´éÖ‚YCK¹9ñ{ÈèùÄ|¢ &0m¤{Á?®A¤ټxÅ›P®œ¦C5ã—ýô“T_Ÿ/´«USú›Ü¶-oÚ´lGGí+]%­S§Æoßžúãf§N)ÞpfeI*TxŸ/ káè¨ø±Ë©VíZttÞ½{Z·VcÄø9?xð`‡ï›Üÿï¬ï¡ú^¶oßîåååããlÞ¼9((èøñã_^6lXÓ¦M§NUÙ$õWâïO° ‰Ž.\¾¼j·nÅ™DXXöøñÏE"Y@@¡òï§ŸübcófÍjеk %ÿã˜?ÿÑýû =zØ-X Ò« V®|sûvRûöe—-SºO>ümdd¾‡GùŸ~R\.0gN£Gù5kêïÛ§¸ºdÇŽ¼‹ 33åOŸZi+Ù@/_. EF¤m®œ&$Ò­29U+sá ­xŠaßi–mèäÌšYT,a]N>»/pùB!_3¨#K~ÂIƒµê{qÌ姨bMD­˜Ö›¡íJPæuí%ÓOQÞŒO4®ÂÆAT² "øùÇCs?{Ý|¯ãècâ§£JUD+7ÑøÕY½¸'z¦eZÍœßpÔX–V¡”÷8ŠDJóòlj¯T1\&—-¾4,.£Äîåͪ´p>¹ö½Ö‡d2r¤ *Ïä*4-aeÏ_ŠB縞̩O´2'¦€Ö̶ÇAµ’ïáÌ}ŠcrÅ,kÀ åŒ\ÛŸ3ç.ÎÀþ®Ø+ÿîE1è8Ë›ÉÁ¸ªTŒ ŽeØ~RsʘÙ]ÐU¸’H9æÏ̃˜“œÁ¢ÁLêY²Jv¹œóþ,ú¹=mä–þDÿö%Ö~Ab sÖTJn>‡×«—¹ú‘ˆ¡cx„‘!‡vÓ¢‰šñÁÁòöí%ÎÎwwá AJŠII²fÍR«VÕž=Û¨gOÅ{‚øxqëÖï+UÒݵ«|íÚŠ?»_ýtøp‚““Ñ‘#J¿Â»wSfÌ®PAßÓ³µêO/#C4|ø­¢"ى˖-¥.)ÁR,Zø§aøï&X;v?~¼‹‹‹¥¥e\\Ü©S§¶lÙâããÓ¨Q# ''§~ýúãÇvïÞ}øðá—/_•Äóߊ¿?ÁZ¾üÃÒ¥Qå÷ïwú~€½½WLL^@@Ç-”Ü—. \±âéĉuwîT·!úÿ ŸØnÝ®:9™‡†Q=244»];?±Xß[Y¦ÿêÕ´9s"µ´xýZ±Ëáû÷ENNááá5ªVUÞ‹©S'åÝ;ÉÎe&NT¼i“HhÝZòø±ÜÝ]øÛoª6ªoÃhÓƒ´t† â·=ª¿àÑ æ®'è ººìYÉ ê)†ä Öaï%´´06 C¢–µ,ßC$æä]<ãù veÖŽÄU]Ÿà‡KØåË…ç<Œ¤ºvø í]³<µå¿WAeiYù¹«öiˆóŒB¯¼óÈ%µú j·x•¡Õ7»ä€OŒº‘™¬iÔFª"m™E²™gúJоÁêX³¿»ólÕ7ò,‹µ\IBåõ)£ÍˆŠ ®@Å?Õõgñ2›Ë‰ìˆ&­ˆ¦Ä0¾ ì(¯ÁU…d0î!BIüP™_±Vž˜MÈÅLj "3˜Ñ”Õ­ÑSòÔK¤¬ðeµ/Îvèhqb°*Q©Œu^¬½NEsŽzhTqõ0” {ÿ„µ5+²ãgª+­½V™ Ï{œ¾ÍY_ÇÊü2‰^­4úmƒDʯ'Y°‰ì\Ì˰zc~,Aà93 ·aøßÇÒï jªÚ´4š6•DEÉÇîÙ£êmæÌÉÙ¿?¿U+k×”V'Ì›—¸~}rÿþeÎSº4è¯oú®]Žƒ)MÃÿôSà¡CQ‹ÕZ¹RM~ðèÑð#nwíZÙÛ»×÷¯–”`)¶6ûÓ0øw,??¿;wÞ»w/++ËÆÆ¦C‡ .¬Qã tttôôéÓ?ç;vì¸uë֯˹þóøû¬7or]]_Öªetùr½ï]Í×® ½~=¡W¯òsæ( _Ÿ˜6XþSñosðNe ¹RlõxšI“2Œ¯Âàòh°ºçIXÌ…bó¨fª†¸UQ5þv n‘'¦’ Kœé¡<Ê—Åà<ŒaE檌wF§2l?ZîG°È•ù=Õ· ¦d±ù2^ÏxCUvþLwu!Ÿ¯!—sý!óvceƃW4ªGoFö,Y.þ ü1mlð¾‡k¶/¡ª*Ó¯âˆO¤ßpʘðò >©§NÄA*eÈé›7ò2eð÷×ÖUþYùû­\™#»}Û¼jUÅÁÀ„±»ûG©”mÛlëÖU̬ïÝË\¼øCrrÑ«WÍŠ yy’|—ú´sŠ­Ì¾`úô?¿OãÇ×7NAwð߉`ýŸÆßŸ`Éåòš5‡…åûú6ìСx êÞ½”¶mýŒ#"z*;‰\N¹r‡’“ BC‡89•°Éø;H‹D¡—ÎEùßN }“óé£iÅÊV5jVíй¦Û@…Ý[%Åĉwwï~=~ã5kT6ÏÀŽS¦¹º–¿zUi!èŠQK—F¹¹•½pAñŽ*4TT»v¸¾¾0*ÊÉÆFñôÃYY²&Mt7lP:kœ<)>\jjJp°¶ÝïPHHHݺÅß÷ázÄÉ‘ÚNìß®iøçè%Vì$===¬¡g{Ž*†O)¼Š÷c… ÐÓ™e4VÊÌUA,áä=–'&3êUaùPZªdS¯TE¡_áÞ½ø¶m/µlióàAÕä#%ET¡Â ÝW¯º*ÄJL,²³{hn®õôiÓJ•qs‹ñôÌZµªÜüùŠƒX!!’† SʕӺyÓ¢V-¥%!nnÒK—dî”l}†ÿ}z@³&³b¦+2÷Y©›, kº ,ûóš17-_ÆSÝŠQM™ÝVU­tz!“ns*¡€ ˜ÛœŠ_Ñã´ÜÄYgûÊäߘ UZ~,¹›™.uÍøÁŽÑÕ5£ÿŒl ¸—Îñ8Är´˜hÓÜ}!­-hhJ£2˜•j ÿý‚‹xšÅ“ â ‰ÈÃ?z¦¼ÊÆJ—þåékCG«HH„g±ù ß!•ãböæ4R/~“ʪǜ¥ž5Ck2»™Ò<®TÆ*?v= %! ÙÞKåeò™ù,¸Àá ÅŒoÏj7ÌÕU›¼ûĪ3¿ƒ\N—†ì½f.ãŸñä ¿]çÐDÊY²fC»–ÀFð›‹ÏfÃ~nÜ£¨ˆ˜OÌô`ÞÏè—°ïáÂÖmæY0Úpáfü¢ÏŸ—'ÑÒâÂmU_ùÎy3fd;8h+­mON–´jùþ}Ñ‹Žõë+ž!ãâ ›4y–‘!‰‰q.WNé.zøðÇÇÇìÞÝxüx5‚¾¾q={^«UË"(h Â%%X ü`ý½ïÿósöâE®«ëK¡ØØVß/Æsç¾Ü¾=bÑ¢Z *-§¼xñÃØ±~ ZߺջÔ“ô*øÌ€žE¹¹Ê´Y½²éˆ)¥~ @&“wérÅÏ/îþ}·V­ÔÌ'>ß¿ÿúuõfÌPÚH={väŽqS§VZ¿^qêçÅ‹üþýc““%115-,gV¬Èùå—¼æÍu|}•.DééŒ)¹zU¾p¡pÕ*5™ïÛ¬ÚÀƒ'L˶ušÖ|H¥ü²ŸAÜyŒž.kg1fPiJqÔL{áû ŸÇèêжc~À­$uë_Ï/xAZ6/>Я¿Œ¢Š5üËëÆ.`“µì=â4í wŒ‡½ÕSŠr C/DÜÈeå4ê¸z£mƒÆ@¡„y×ñ‹ÄÒ<1Ç~¤†Ê^¥³á}Mt6q9üÒ–±ÿjÚ?÷l÷µ—¿}=ÒX¯ÌÖÁ×B³tç?çQ "Ve˜=½JØ’#Á7•Ç™œGOH¢ˆ,1r p0¤Š!Õ¨j@Y=L´B¼-ñ…­Ì©bH†˜L1Ÿ ‰) WÊ“ Âs)¯ÏËl€šÆXè%¡»5Ý­icQ2i®4BØò†&V˜èÐ׎1ŽªÂlrØöœ­Ï‰É¢ó[¨r¿‰ËÂã|(xô¨I‹ÅÃTW®|êÓ' ysËÇ;);Ozz¡Ía€ääÑff¥i.—Š‹·kžýAíH=ƒ©”ºçj‚¹sýòKÐÏ?×Þ»·ê‘ŸïÝÉÉôíÛîʦòÀÀìæÍŸYXè|üèü½ þgtïåí³t©õ²eŠ[õÒÓeNN)))²Ó§Í R:+ß»'ïÐAR·®`ãF­ŽÕ¬{w0‚òåhíÌ–5õ~Fxãqç Àø!L“FUC ™Ëž‹¼äúCÇÊÌwgP' JþŒ$e²ý .!–`kÁ̤ ²Tð]^Aò‡J^Ðä¡‘Ûƒ¤å!>™Äð½¯áësBq‘µM«™ êq|Ë@ýßãqŽéê°½£šª¢IyŒ½É•H€Ÿê±Ô[#ñŒÓ½³ ¾ñ èQwØ f“9œfó^¥“/¡Oefס•ry-ˆÊçYwÓxžEfay6z$‰,tH´µänÀø*쉨fȇ|€Æ„ç8a£G 3Z™ÓÒ‚r%ÿ‚rÅŒàB4÷“ÐâáÈêFX¨mª±¢ m•—gIdìôeö$2ú5fÝT)r¾ã— x>A*cT'6ŒÂBM‘ψKf÷<.“0g%/d$RÎ^cñV>|ÄĈvÍY<‰¦jt‘ +›ió9rmm6®bê8ŽŠŠÂÙYœ˜ÈĉÂ;UmáärFŽÌ|þ\Ü ÎñãJóïŸõ–óóeÏžUoÔHñ´&Éìì&%4nÕJi„m÷îȉŸ«.Øørmvv¿}ü˜ûìÙÀÆÓÒÿ¬ÿüSÖêÕÑ^^iíÚ™­YS|-ÍÏ—þðC@\\¾¯o;[[¥kÿO?ù½z•¶`Aã¾}K#ˆôêø‘›s5Uãê̈*=Çzó&mêÔ€´´ÂÀÀª-%yŸ>÷££ó÷ïoâì\\ìþ †}óömÞÔ©•FŽT¼û~ð oñâÄÄ/_V/SFñÌuäHþ‘#11Ò²ÆÆJ×óýûe§OË‚‚äj§¥=P]Äsÿã§“šFÝÚ\<މŸ!—sì2»O •ñò-ㇲbe4^rŠ¡HÌéÛ¬9‚…)^cmΤþLì_šE(2EGäVñdž¦/¯#ÿƒŽKÑ~iÐÉßxx¾PÕIu^˜ý¦•—"ÐÖn8£Õì…z&ŠÇg2Û‹'±0D¿ ¢¢Êôʹp¦úbeHLsëÞ Züõ«ëœ³1ý#Z%–±êΧ_“+T7%WŒ‘6«ÓîOØMIå|È'<—„BBóH-BG@J¶zØR$¨kÊüPÌu¨lˆ¡;ªQYŸÆTø-Š")Þ±"˜ô"šZRÖ€u©©N]âLKÐÑ"£½]襜ċ$,½Å¾'Ô±AO›c?RNù£›Æä<‰ÂÂεÙ0PC¾ˆ§Ùx‘Vµ°2e²+íÔ4¨Á¿Ê³rÙ…¥û)kFJ3‡0Þ [¥ó„*Èåœ÷fÑfÌMÑÓ#%åÓPª®¡g/øq4v•ˆùÈžÍtÖ¬ž25I… ˜™ ΜQS„pà@þÊ•¹Uªh]¸`ne¥t ]º4ÉË+»Q#ƒ}û”–4ž8‘¸vmL­ZÆgϪª½ïÚõna¡tòäêjíqž?O9Ò×ÞÞôÒ¥ÊvÅ%&X"ù®êÌâ:Áú?"¨ü§Ñ¾½ù£GY§N%}ÿujh…†f_»¦JPßÑÑìÙ³äë×cJwá^—5,+*xúÛöÒ½P»¶errAppªŸ_œê‘ÚÚ‚:uÊDEåz{«âs}û–•ËÙ¾]éÙZµ2ffƒ•JÖa(P½ºöòå9*ÞËÃChe%ÈÌÄÍMZ¿¾šéÖ-9²™œÛw1Ž”TÕÃÿ€@€{_¼Ѹ629;Žâ:†ýghdýRº:¸wçÍ)æºÓ¤&Éì¾HõþLÛÊÇä’*#èüì§µi#¾fWtì·Úîe:Q»ÒNÿ`î¿ÒìþF­¼”´Š­w¹Dt\¯k¬t¼©>¿öce"Rð‹¤þ.½Vuajðb$öeÈ.â^ÄÅb¯Ö®Ðìkvè™ÑØø]?úÙ˃dÚßÀã÷J»qÐPÝWÆØ±¹Gp°>Wšòk=8°Ì‘eŽô+Ç»ö}oØ"2q¢ªú;Ÿô˜˜Â.]TuGEFæÞº•”Ñ­›ú‚¸óç#_¿N³³3)]mƒbÿšÿxüS>ƒ-L›41©REÿÅ «{Ÿ>š6µV¥gÛ½»]ýúVIIù¥cä©aoK4þþ‚¥RqQiÞ €Aƒš7·¹_½ÓˆUkÔ0 L‰dÊÆôêeUX(35Õzô(KÙ˜åËm23¥ÞÞÙÙÙŠIŠ@ÀæÍ¦AAâçÏÅÁÁbeç8xP«vm…Ó¦©ç;MòÀçf¤eÒ¦aïÔñÌLÙ»’§—Ù€g¿Lî\ó/Á¾†–>­yz¿¸µ##—pÄ„ „i@Ë_Þ½ùpl#§ ÿ¸‡­J'Í–0_™¢¥t_«Unòü …ï”0Ûòm7þèq-J¯æÉÇôÞAœJ‘æ^µšFïZd°ÿ “©¼cÛÆK}9Ô)ÚF;¸ØKj*0’*S¦Œ©Ój;uM¨nÊ™(<hv•+±Èþ»w¶i"Ö¼¢/磉ÏG"çj'ôTŸë<ÿŽögx—©.£ër­6Ê«Ôo„Ñy?iùT6ã—žLk­´èJ,e©'Ë®SH¯œK[•þ3ù"æý†ÇžEл9›Y7} ª”ärNÝbÄjSÏ»¤eÑ¢—7pföʪUœÊËŸ†½Y¶[Ԯί«x}ƒÝ4Ufÿ©iôŒ×MÄb¦Œãvš•÷I¥¸»KªTxyi›© =Λ—co¯Õ§þÀªˆùŽ©õëëW«¦W¿¾Ò¼G``v\œÈÞÞ`èPUÁ[OÏO-[Z b§Â÷ ¢¢rêÕ³rs+•³ÄÿðŸÅ?…` …‚æÍËܹ“yá‚ãpWWÛ  Œƒ?ääH”¡n]ËŒ чÙ¯^¥•â 3JæF CöæÌÉR¼Ñgôî]õÉ“¤ýûßH¥jÖ±ZµLO¢—W¼²1zzB7·²wïfîØ¡4ˆåâbdo¯{ëVîŽJ?Ÿ† uF2ô÷/š4)[O56æÂíyd¤|çN¥´ï ªÛsáZÂÞѪ+÷ª=âÛ«ªÅ¡u\ÚCjñIŒšKó~ø—Àg¯8Ú7f×,^£wkš8±ç"µ‡Ð/#÷ü±ß”NÕ~íZ7÷Å—?æ-¼L'î³Úù^O©(¿@"2 »jqc–Á{?-m擦¾÷¼é ·ãcðœBXYùÔYľ»ª®¶¬—Gpxc9÷ŠÆÛx­j¼NáøæË3Ö·jPIU¬ÑD‡¹u ìÅÊFdKxžÆô@ª_`}¥ßDüUxŸÃ¢ ìβð9±¹h ¹Ú‰û=pU·œgŠøù&<ÑÓ¢~Y^fl}¥Ý‚Ënáz˜Êf´­ÆËé8+DŒË ý/¬ðÄX—CñœŒ¥Êlxà;z,cçU>¦°Ñƒ£Ói¨Ùrü<ç± Y‚ÏÊ—Å{+þ»hR*!’ÛhæÆ²m¼ %%õs ºÂØ’h‡~›~ÔkÅ•„¼åê¶­Ó¨¤Ë™-X±Bã޳瓿F·n–J—Z¹œ;w’ž>M4H=aŒŒÌzý:­B#—’ÂþÿŸðO!X€›[Y 00ûû—¬­õ­ê×7ð@ýú €Þ½«FDdùúªÉ»)„¾ %xwݳoôuëZ:8”)*’=y’¤vððávB¡àæMU#Ç« ­- ÌNHPº$.\h\½š“£”-^l\®œ04TræŒ*q»58qBûþ}ùβ۷ÕÇ:ÊÙpõ }zžÁú-ì9¨öˆâø¡3Áר±-!/0‰1‹xTâó|A]{6LâÈbÆ»¡«Í»Xzͦ÷†ü1&ö]è­9ýl69qÄ݇†ý÷Xí 2è&Sö •Ëõ£,®Ï4~uZ Umßi¤ß£Öó—éþ-éÝ€X‘UÀŒÓütˆOʾ@€{#L¤Q>¤³È‡EÞˆE‹¤¢‡ïoû㇢¾ ´ó”%‡™.Ój5€C.|ÈaÞ3Üïáñ€%L¤þȸGïÛüà‹oL«YÓ´];u­ àç÷þ}–¹¹žV‰z_ÕBÿ¯ù÷Ç?ˆ`µicÖ ñíÛé¡¡yß¿:dHå—/3ΟWEžzõª¢§§uòdx)ÞÝÊIcK­!%´dYÅb5ªf^žøìÙHµ#¶«XÑððáiiJÉSåÊúãÆUˆŠ*Ü»÷“²1:a˜¿u«Ržjj*ص«Œ@ÀäÉÙ©©ª¢S½z V¬(Š— yóF=Ç22äÂ1~YÉó`&ÌdÄ8 Õô t´áF¤˧ҶÏÐj ÜyôBý±ÊPµ<»gu‘©Q™«÷é9ƒÓ¹r#òÖœ~&Ë불»(üW@HŽà­žË^«Ý¾&#D¥‰%ä·æ·šîÑ*Ì(S©òOô;~Á¼ZñpkS.NæØÚ8‘LíE¤êRkZóhË;“”Ãj?Zìäíw”ûÑ{Ÿ<Ñ7Iv@+NÖgý†^ãü·¿Œ€€€ïßÅ@‹„»q¹#Cí Nãà;\¼èy‹ÁD*Øþüåx‘ÆŒ@*žeÍK®~ÄRÚæ„ü@@Ozi@­¢²èyþžDe1¸&/G0®ª£.„Ðh;‰Ùô©ÍÝñª´$2–yÒm3"1£\Z†³J¤·鵒͞䊘ۣ3¨[EÝÕC‘˜½qÈ¡k‹Fóî,µ¬J*8"“áy‹½èó3ç®Óµ5çá˘Aè•VAùê j7gÏAŠŠØ²¿«T*I¦rÞ<éÊ•2{{ÁÑ£ÚMš¨ù&år<<2<(jØP{øpåi]xó¦pÓ¦ÔjÕt—-S¾:t(!<<ôh[{{UjGFçäH ª¤Â÷ Ο¯¥%ps+mÛóÿðŸÅ?¥‹ð3æÍ‹ ÈêÕËjîÜâáøðð'§ë––º‰‰?|ï¨ójõsU D]„Ÿ¡¥£;=Z)SQ‹§O“›5;W±¢qlìµå=zÜ»q#açÎÆ'*ÂïßÏlÓ&ÈÆF7:ÚY__ñì{ï^^Û¶ïÍÌ´""jXY)­'80#.NV«–Öª "d2~üQz~}ÁíÛÚVšØž<ÇØ©äå3¸?k–PE©º²*¤g²õÛÿ¥ôäÚ‘ntjUšS}Aj&ÛÏñêuB£O‹Æé7à:¯]ý¦é˜šù4R¡¾nic7N32Q#F”Ř#x½˜Ñ…ù®X©|xÆà~š÷i´·çÇúx4ÿCÄa™çȨÔЯ7¶kç\gýâîÇ‘'æ§zÌo®Êº¸Þes8‚ÛŸJÿ½*«ŸuÌé]™†–êÉM©!•˜Âµœ‰ÂÖ€$€¦V ª†»=e5Û|Kdì æØž&b®ÏÚ6ªr‚@˜5~¬òÒ]?¨ \}Lgòq<ƒÑÑb]¦wQ¸’Ë9t‹É¿RPDïæÌêKkuv1Ÿq+ÅûxñŽÊ6T±eÛôÒøl~îÜþi„} ‚ sÆ2º?FªXŠÄƱqÁ¯¸ÿˆ–Í8¸ƒš*kÎ¾ÇÆÒ}ûäÑÑòóçµz÷VÏ)5*ÓÒRRÖÖVÕøY³N2ÄL…ö•D"st|UèåU¿G¥Uðb±¼bÅ+ÉÉ…ÁÁ]ë×Wó³ÉÏ—XZ‹eII£--U=£%î",•ä²ú3gý¯‹ðŸ„Ž-€K—°–5L¬de¥w÷®Òt…žžÖ¨Q5ëÕ³*E/aíAC̪”¬,Qß\©·¨&hÒĺoßjzzZª/u;Ö¾U+«“'UÝWëÖfC†Ø˜˜h]¼¨”öµic4fŒe‹†{ö¤+¬]kjl,8{¶ðúuU& B!Gjõé#üÜ”¯™çû<ö¥C^„P¿§ÎktT1X˜±bÑwY> ¡·‘tA¿ \ôA¦¾*L1ô™­³fïNu˜®{èkv•-´ºl:ãå&ìJ(Î7~uÚÂ{Þgv•íÐãÙÀ'³æ×ŸipS]€Í¶ צò›Ö¼üHE\¥j¼³ÁÓ™êðóEZï&2 &-¼»:ÔtkRŽëýÙÝ[cîÄ2òS}ÉѬ¸ÊÑ”µyÒ‹»Ý[ƒºæ$°<˜ÆWh|…!wÙÿŽ·YÿžŠx‰Œ 4¼ÃÍ«“L dÍ+ôµH1¥O{Ø‹™µ5eWAI8Ÿ`Š/ú ¯Eèh~VÉ®B“iµÿHœ¬ÙÚ›ƒU±+¯W4]A®ˆê6øÏaFWUì*!÷-LÜKC{†·çøLØUL"S6Óe*ºÚØW`ÿÍȤQwÞœfæUíÛ¯XW­C—o ÛÍë¦ì£y 6ÂJå6ÔÝ—êŒ:DR6®Û˜Ù•Unè)™ŒuÙÚ›«¡¼Mâa ã.0² ¢¼sņY›V¬]¾) ÷Út«Ê†@6?# Ž‹lhÇÀ™ ¸ØàbC¡”€$.Äð2GɼHãB4€ž -i`A=s*SɈÊFªœ½ ¥Ääò1¨ž§‘-Æ3–| -x‘ •3£6ý«Ð¼lÉãr˜w÷™}Ôµ cÆd:9iÙÚjõ﯆»Ì›‘!­[W_Ùäö>>i©©¢N*«Nü=ýþ}®‡‡F{ï+W¢ß¾Í:´„¡Í¾Æ#sµTu?è&½6>®õÐ10h:~j³IÓµõ~_Ä6]æütµ ‹cÝÆvSsr9Ûo3ç-HÍáØªL¡¦æ1Ë‹ko©bž[ËØUÀ7­ ƒšMîQwX±Cž%2ÕÇñ8æié-oÅ€R­¡™ÜIämWc‰ÉÅJT.6¼L'G `c@yCL¨eþ{_£c¶¾!£S‚Òê˜c¦K@U‰Îű ímijE§òT.9áγùkŸàhNf!ו”"-Ÿ±çÉãóOS~h IDATŽa Ù톱òtb£#“áû–…½XÒ[óKX}–3Ä&á\‹ß¦S^ƒ÷ÃV!¯€»/pmÅîÙTR´WRaö,“qÁ‡…›°4ãYÊ1}cÄàÏEUÞE²n+~wIL¢jvn c ]Ÿ±˜±c¥iiܺ%;sF£Ì °`AŽ¿Q|¼48ØÊÜ\Õ!ÞÞ9k×&ú$yöÌÁÌLéD”3}zDa¡Ìß¿¡2÷ ;[ܯ߃„„Â7ÚTª¤&â'—Ó»·WBBÞ¡CëÕSé|YŠa©ŒÔŸ9韞"üÇ,_ߌN^Ô¬iôö­‚½žƒƒ×û÷¹÷ïwtqQZïÓªÕ…‡/_îѧOÉ«`[µrb‘ªº¯Ñeý¶zÃF–â]¾ ZµcQQÙš6UÓ¢òâEf§NþFFÚÑÑ®*ØØŒ[¶|5ÊöÐ!¥ù¬×¯ ë×§«+ˆˆpªXQ) “4hjm-8yÒÜÅE |úTÞ©“¤n]AÓ¦‚-[JÀ±ÂÞñÓ$"²r!3'¡W¯£ß!–pýk÷ò$C,ÍèÞ–£©ñÝT&“>8}ÀÒ{E%Iqý‹(Ýz·Œ=’tT=?ÚÙñF/Oê%üžÿ³ïԭê e*)`CQIÌ:ÈÅG4vÀÖŒ½“¨ fúåy Ãö–€ž6kû3­³CÆó!¬õ>SÇbó7W¨¥»eÐSQ&çê{¦ú“0¦>?×§ñŸ˜ÄS y“AP:™E|ÈáQ2ñùX› Юw¦ÖbÛ[€ †¤Š¨dD=sj›QÖ€ºæÔ3Wãl£29Þ1ç.v&Ü‹c|Cæ6£²:¥~ÿ÷ ?ͧ,ê–cMw\UÕ×q7œÁ{IÈÂÅ‘µn¸8ª•Äà < §S}ú:3¾»zKÍì<æïaï%d2úwdb?Ú5TsH1Èdœ½Î¹\ôpªÆòé¸u)¥ò¤¦±q[÷àPOñ¬_Ψ¡%p¾ú‚ü| \¿.·µœ=+tqш]ݼ)êÞ=](ÄßßRõ,$•Ê4ˆxýºpóæòÓ§«*5*ôÈ‘„3*«0Ž‹vwÒ¾½µŸŸz½ÔààÔ† ÏT¬hüñ㵃ÿG°þKðÏJmÛšYZêäæJß½Ëst,¾‡íÛ·âîÝwï&« X®®U‚‚R=J(Ášú!qKE ©\#Éðw×=ÿ$ÁêÙÓîðá°»wãÕ¬ Ìʔщd¤¶n­ÔyuâÄŠÛ¶Å夤•-«x>ªSGÐ 3OÏìýûÓ–/WÄrrÒÞ°ÁdþüœÍ›ó4ÐQáŸ4m*¸pA»gOIt4ÖÖ²ùó5-träîu6ídãNvàÞCϦU .mút¢O'üsþ{N²ï4!áT«Ìèþthùû°§^çµÎÏk z_ìpM|šE¹Fo/FÞB&Ì«9tX±¾j{¥F™Um8?Ÿƒ·Øt‰kϳƒáÜFÕ]4¶#h)óγÃïD²s(唇âú×åIØåäo[üšUí¨]B}èQÃ!l|Ê™Pž&PÝœ%ÎÔ)•ÑJY}ÚÙÒîÛÌZºˆ9„g!’Ò¶€‹ Cí1×Å\ ½O¼®Dr2ÏDR*s­Ôõ²ˆ™wƒ{ø”E몜L%å5629›}8HBíœøì]y\ }û¾ÎÒißw‘h/²&„”ìÊ–ì²EBуìdDöìûQ(Ѯš’VZµï{g™ß=/:êÌïïy?Ïó\ŸóGÍ|ç{朙3sÍ}_÷ußZ.èXð{‰3Oð*Ý•°k†Pð© ~c>‰ƒŽõs±s)%ÓÑï{ÈÃãpxœG\šša1 ¦bÞäÎø…þˆÒ2ì÷Dr‚‚Á``è ìÙ ¥v}nAQœœ¸ÁÁ„¢">dÖ ¶ °wäH=‡Ý»%IŸñîÞ­,)áöìÉrtôSRÒüî] Nst$9KbbJ…„è¶¶”Êp¢£ $%YcÆt°w:Et>Mò/áïÁâr &“^3rd+¹ÕÚµGæìÝÛsóf ¾MbcË,-ûvKK›ÐÞ´?–›˜Ü“”ÊÏ_H¥°ögœî§SWLnO@\IeŻθB|CXXÞ„ õôdß¿ŸI:øÐ¡”ìì4.^$`ØÒ¥).|mó ü†´´¦‘#?—–rRSu{ôh÷çÛÜLÌŸ_åãÓ°l™˜·7y)‹Ÿ±f ';{÷26oîX‰F\</YÒåüyAŸ§¼¼YO/°woé[·†*)‘GVGŒxðêUѽ{㬬4Hw8‚Õ¾Éí¯€–ýO`ý«}|ª¸¹ñWZZÊh³ÎÄDN\œ™™Y›–Ön¿(9 µqa?®ÆÑ­°Ô Ý-1pæ«I|ìŠ f¼è¸“ gbÅl°+VÁ;ù õï®ÒØõ ÑJ5mÝ»¼½R·z˜£Ð­`P¹LuUÀ¥58» uxüƒÿÀ}2S{ë~¸f‰F(­Åñl»ú¶ªÿÂ?ñ7¬a÷Xú ÏºÇ(mÃTîOTUU†»ü§bÇP¤Wàq&_ÇÊ`gáöÒÛÄÅå$Xùâ`Þ¡‹â¶5f‘±+G£1û’‹` Œ[s±Ù\aŠÍÀ˜Ãþ%)ìš‚­V‚'ç`ò{QæÂiGrvõ0 \ð ÂBر§7PeW-ÇîyVnÇh;ÄKg÷Âç–Úþ»ª®ÁA/èã†jja9Ïàҩγ«Ç 33NVàÌ&EvàÀZ?¿Æ¯_y{÷J fW¼¼J¾|i®«ãM™"ˆ]±Ù;»îêÕ,ch4X[+ˆ‹3öï4LCƒÕ«—p]ÏՕĈkåJq ¦œmáÂ**¡š3è‹Ñ™L¸»ó6mêÇ £…gà숱£àûV³0r"’ø ž(!7=%xÃtÅCCŒKCi­#2¥Ìn·Zú43ÛÕX´ôi– ÙÆ*ù@XJÚÂíÀü'‘]M†°ˆ{û°Ø*ò €‹°ÒÅ¢Ÿªrðߊùæ(©ÆÝhôZ‰§½²h4¬´À©yÐSEJœoÂëÙwë©ÈÔ‡n+$"$ºÁrü£…˜bø§Ž{ìy|ùiÇz÷îÍ·DQ ;M¿NÐU•XµÓX‚wi·ˆÍ‡K8ÔÏ`k2+ÑW }ñÞ«ûC„ŒU°¹8…iW…î²p¯ÉmÿVXU©'°æØ\è¨ |º´¯Ðjh†ÃIÌ8€ŠZh©"æ Œ4Hö'4«p;⢘e‰ó›¡CÙn7· 7`»vp4$Å1o2.`í¢˜’üŒ¢bò‚Fo¸@ì+Œí®ˆ ÄAJ”—cìXÎîݼª*LJ¿|™A½x%)‰³pa%‡ƒ DFŒ ×¹ºÖÖòÔÕYƒ ªõ#ŒêƒÆfì»ÇS¨äêŠ>êˆÛ†uãR€«/`yy ^DªßÈ!šãD…Ä{Èáæ\EqT7bù=¸G´ÝÁ²"Øh‚ÏËpÛ † ¨nÆ›"L¾Þ—à‡|òTöïDZ<ã u¦7ñ±M\Xv‡‡9âí°À, "îÄB =‰«ñhfc© ÖÂB`C›øl pC]¤DqÛž³¥sJ0q'²‹!ÂÂQ{œv„„@ßþÆfl<…YÛ‘WŒ©#ñáVÍ /0lA]¼ósâÏšb6› EE\¸ÀX»¶7²²2Þ¼y•Ʊ¦Mqq!÷ꈭÏÉiÖÑ`:Ó‚ˆˆŠ¢"¶ŒŒÐܹ$Uy~~y#F(.X !)I)$XTT?dˆò¸qêJñ/þ:üý Vbbã;U­ÁG–KH¨óñ)ÎÈà§,]KKâùóÒ;wrÐ>úöUŒŒüJ1,ÄŠ®î2={͜Ӊùù !!¤¨(‘OÅ€^V–¥¡!ñüy± $©°0}òd…ˆˆŠ£G SP`.X [¿n]`¤¬L?vL*:ºyÓ¦šøø?Sº-Bö`eE¿ŸùáïäIÞìÙÜ&ì¡M aÙB¤¾ÁŠÅ(.Ã]?ô‚;ñ9KÐVåÅ…Ïv,!6ô’~Q˜h•}æÒ˜¯Å¬O(œ{-fÕ^Ÿfá¼WòAë%nÓØ”zÍñ{:ÁË[L±m݆”8v/GâuÈJB]Ža¼¯>’@ %ï†û"dãôôwFœÀ<£( ‡lqË_+ž»ó8ñ²¤†ßfb¤ÞÔoÏ0ÂÇuÞá™ØˆÇðŠZ›!:&káùl|\ŒiÚhä"©®‘p ƒ®aW,Þÿ·DZ<ñÅðz‹þW {wRð¹Ý¥0Fö¶…•&¥üF#ÛžÂîÞ䡲'§áÜtHµoÕ’²™%¿¶Æ‚æˆC_'„'‚Gà•œ­Iö'!ÖÂûjê°c .n†&5ÅAàîŽÃOÈËÀ@ ©ÁزŠ¿ PÈøŒåk`ç€SçÑÔ 9Y¼DtPgÜ­øvÕË‹7l‡Ë¥ áÝ;¡1c:‹jn&¦L©øð]RBܽ+KJ=y<8PÄá3gÊtëF’ž;r$7"¢bÊaa’ëùó_"#K&O¦txrrj<øœšZÕ¯_§ ,ÿÅ_‡¿?Á²¶–RRb>{Öê¹XD„nm­ ¤$܆Š|æLuaaú»wmÄ·¾aêÔžBBô”ªrõÑâêÎ’ô`ÈfY¾Ä`ýž0ëĉBïÞQêl¸xqeccIr6Ë–u¦gg7fe ’X9;+¨« UVr}|}Ÿ&N^µJœÃ!¨«©!ÐZÄÓ&,-iAAL<}Êstäuªê@Z k‘'ôPÇáX² ó–ác ÿÈÚêª`õ kµ†¤_%ø¥CiƒN)œy*i/¨OsY†L¨›tì1F])i ·ó#º $wàÖQÇýp™…nÊx—†Í§áä‰j²x†åãðpzuGj>¶ÞÀ–kàŒ3Yàƒf Âûä—·k*õÒoåª(Žƒ² zJH(ÀîP,óEi]ÛÍž†<ÖBþ øMÅÊ~¨iF\!vÅÂáTOaÎcœù€¸B4u8Ü \ïŠq,ΡP>‰9p9 ïŠ!#Œ>J‰ÏËð‡1zPnÊš±çqø9jšà<‰.$«ÊzÌ=‹s‘`sád‰€5Ðl_Íáb¯Ün¢¢SÃÇF=a¸<콌5GKc¼ºÇé n· ü%lWÃy7²óÑG¾§à½¹_(»6ý«×cÉjœ½Œ¸x¬XŒ¤¸y}ù3ÆFj*akËÙ·ËfÃÒ’ÈTë æ{ãÆš´4N×® Y*ßÏ­[IIMœ HüE¾|iÈÎn¦ÛÛw<29¹šÃá)([Xá[]Ð¥‹¸™Y—έSó¿óúÇãïlÓ€F£=yR3iÒCCáZ9÷”Z['öï/ÇÿÉfššssëÓÒ&hk·öæñCÃ[))oßÚöïß™‹¢„÷W|i;&¯­»(âu'¦m995ZZ×ÅĘ¥¥K˜L’ë ›ÍÓ×’™YûîÝØ¾}uÈrvN;v,ÔOÏ×·jöì%%fjª®¸¸ wol$–-«JJâôèÁ¸wüù²‰‰„›/&†`0àïÏ0 ó—¡¬ì÷„_**¡¬„¾½±ÙC¡¹±1ú²§F´‡"¯ Jý•©ýLji® i½¾L"ñ®pvt‹T‹ý£˜­ºÝÞU+”ÈÌøPÛ€WøïR¡¦ˆë0E ëU ›qè>¼ƒ_†!z¸¹/ﯢøì)4Z«Ø£ýˆíô'¶¹I'cq4 ùÕá‰X0d§ÛO“p–ƒ¨\¤UàA:¤…QÓ }• )ƒ^òP—†ºTÄ¡)ÆOG»ª e (¨Cv5Jê_Œ¥bàåW0Gr¦jCE“z²;¥<àȯ¦'øRŽè,ÌêƒÕÃ0”¬Ê=î fžÆ—R ìÍ0µýÔ1€¢JÌ:ˆˆD˜õÆÔÁp²"Éñåácˆg[l[LÕã*·.{q/fOÂs̵¦šOü\.?Å~O¼z9Y¨u™)Ö­F÷ßáÜÄãáüyž‹ W_ŠŠô5kè \µàðáºÃ‡k%$è>>2}û’«ÅË˹zz©UUÜ;wºO™Bâ*ëä”vüxÞÚµÝ<=µܲ%qß¾äµku==)ÉûgÍzvçNú¹sæK—RïvئÜn¥3 }ø§Û4üý VSOU5¹¼œ›˜¨Ó«×÷ð}c#OI)ª¶–ûùó ~]ÃÂ…¯®\Érwï³aC»ÕëW??q"qÛ¶»vQhÖ¸ÍMÉ÷}²ÂC ?¼«ÊåϬ,‰z+ÛSàCqG`hx+9¹üùó©Ã‡“<`X½:þĉô ôÜÝýòâãk ˆSTded i))hÁƒ3^¿®wwWÙ°ä¡-5•cbRZUEœ>-íà@µalq1¦MãÄÄÊÊ8wŽieõKz9y¸|îGQß:»Õæü¬ú]y…?¬¦+DIÌ|':–h?§Dã4‰¥ˆ§<¤âZý¢”=ré£Þ@VËfÁe1:J³’>cÙ~¼H‚Ƙ`Ý\¨QàùQ1×¹¥ … Ó`+P ãûÖûáû‹?.cIzÍ~Ìb ꊒQ'•@WIˆ0aª†‘]1¬+´¨ò¶B='c±/ • P—ÁÊ¡X;BùAàT8ö"¿Æ=pgz …¼H“7Þd ‹|6”¬ÊÅ/N =‡bÍ,X Ì9~‡‹“×på>R?4¬·ÇÆå—±75áòMø>Dn>RÒ ¨Ç¥X¹Š2•ý ÄÁƒÜ7‹Ñ==2ä‘ùqëVüy•ªªŒ³g¥&L ÔÖÇÕµààÁss‰ÐО‚ygi)[GçEe%'!Á¤W/Aº.‚€­mLllÙƒGŽ$`q¹„²òŲ²ÆÌÌù={’µøþ%Xÿ#øû,‚ ví*zþ¼ÎÂB|óæVÚCW×Ì[·ŠV®Tsuå}ò¤`Ó¦aaÆ«Wí:h?^°fMTc#'9ù7(¥. Pñ9ãÇ%¦ë6Yëúë3·àÀø ’§MÓtwB:øÍ›Š+⊊š¾|™Äø9DðRŸ?¯tqé¶t© Þ[·n]ABBcJŠ®€æ9-xü¸éàÁÚØØægÏä-,¨z 75aÅ nr2ÀÄ„vèƒõköÄÅÅÄ¥=gÇ–íÑ$Ú()íHŸæ{ôÆ?Åd¢²rCÖlè·x9Nÿˆ]ÇQQòJ¤gÁnÜœ¡Ò‘`(‡3ð0 áñ†Çj,!‹v(¯ÁÊ3È+Côг«Ú¶Sâò¸.w¬+ë[9q°¹³wZ¯Ñ¡Ð7(ÎA£!µ‹ao‚Á¿¦Ð­gãc’JPTø"ÔÃë¯ ³nˆÌ€5pô-¤…¡- !:Ô¥ #‡®0T€,<9¡O‰÷ïùË…¸JJ~uuœÏŸ'jh´-–âpxÚÚ×UUÅϳ04ìÔñˆ9´÷Åу?.‘ÓÒY÷‹Ó~CDD¾¹¹Ÿžžì§O”è ®n`ZZMHÈÈQ£]}Ÿ>-³¶NTVf}þ<„ÉtoŸ93Çǧrþ|Ù«WÉs;vÔìÚUÛ­;:º«ºz.©/ò–/çr805¥Ý»ÇT¡@ÚD\À=†ïfíÆ6ª [ú4‡IÚÕÐi€YEIïo0«þ”‘љ̾vKM×o–lõú!Þwpæ&Šrøc –΄|Gп–`¥üžÃX’⸰ ä1Jœ{Š5çPß„!z8é€~šü^ =¶¹Õ"‚öòó¼òîGç`épr&÷îCRtm¯ã1(ªEM¦õÂÞqÐý­:ÝŠFÄ~EE#2*ÀLf]5HÀ=)0X‡&`÷¢°¬¸‚´"(HàÒLx«n€ÃIÜŠ†6Ø5—¤Á_zl6!!`=N¶”R{å•p;Ž+÷!‚¸Nºa\;ÉåÄÄÄŸ]6~D~nú`÷!ÔÔ‚ÁÀs,œ ›ÉT…_¤ øùñŽ'ÂÃy V­¢ïÙÃ([m›‚e# IDAT‘‘M“&UÔÖÛ¶IìÚEÉé€Ë%ÆËjhà *v𠉓BC¯oß×**¬={zNòÓuv~wìXš‹‹îáÔòƒû÷¿Ý¼ù¥ƒC¯Ó§;PÐa‚õ ~‚f~ýO'X‘;€áÃÅG’èÒ…_ÿãòqãä† “‘‘aþ\K(*ÊX¹R{Ô(•  v…ÓL&ÝÖV[X˜ñ蹇')ô§Îà[Rž‘Vü1ñ×gnÁ°aªffjJJ¢Ÿ? ôü-Ò9R) €¿‚ŒcÆÈ)ݽ»ˆ¯/‰(þÀ##‘ÔÔ¦wïÈÝ"vì\¸P´woÉiÓÊëê:ð]¼˜ÃìуÆdÂÎŽÔáŸ÷û°'/ìûéݘÑ&»Êb—;ê/½V»bÔÈDyÈDîÿÆ®º6ôÜb—;»ÐǧÜ€ãÑ[ egÐ@¹(²‹"¸ãÎ46ƒÍÁ¸_©o…ýX¼=ŠZ…éì¼ >O·ð~y»ŽÊÀ¡šÝi4ì{Œç‘KÖe §F·Õ¦ˆsÂjSˆ ¡¸3®Ãö:’;Ù¡ ÈŠ`bOÌ3ÀNSì4…y·ßÌ®^ç`ÔY˜{ƒC ‹¼§#Ú‘œ]5qà|“½ÐC#õðÞ„]¥æcø”×@J >®Ø·€„]ÝÄ;H‰CG‡á<“»ò†þX¼KFC#þ°Gb`»ì €ºz»ñÆœ<¬\; —ÓÁxpwa;õ·±«øxbøpÎ’%ܲ2ÂÔ”öú5óèÑN²«˜˜f[ÛÊáÃYÎÎâÙ€ãÇËÊË9µµ¼íÛɃ{7o©¨°dd˜¤ìŠÇ#>~¬25Uœ3‡j87#£ÊÌLm̘®Çwÿþwð Xt:zõ‰Ž®¿}»UÙ?‹E75•ª¯ç=|؆#ù€²!!…ׯg ˜yôè®ù—/wʤ²5ä´t zñ-Lñ»÷ë3·€É¤++‹>þ5(ˆ¤4¯Ó§w‹ˆ(¾páKCƒ ò- Ó§+GGW:D2m¬9sd¾~e;9}%}ª¡Óáé)‘Áyû–½pae‡ž‚ ¢½zÅÔÕEX1agÕ*n9£€Ô7/œ,5ÏOèU÷þçµåŒ.¾2®×d÷ µ{ƒ¥7×J¼¿&ÿÔ•Uð§³§¸’Êx¯3³î(ê xë^:ð9Žýë!)ŽÊjÜxQ8{\Ê¥s¶£q Zjhh‚oÆ­E.ÑëŠØC¬‡&6ÜnaÆ~ü‡3Uç}úÊïJ?ÆpÚ¥%¸ëˆIG¯m8ËoðÞ ÒÒÒ¤E°g,27bŒRŠq7½=áòï5 øë“…‰±.a•>2\±ÌDgU >`Ä~ A3Œ¶j£Ûw¢0p ²Àæ"Þ 6¦‚7±á|Ó7ÂH šjx{}IÕPTŠé+1Ób`2ˆõK!&ÐO«åØñ!=KVa’-N_›.ªxñ ÑA°×yi<²³‰å˹..ܘBD®®ôçÏ™ýûwröØØæñãË‹‹yêê OOª¦ììæmÛ ããöìQ– 9ÞÇsž?¯œ=›œŠEE•††4 @É£¹™›“Sûõkݰa‚Òÿâÿ‚ÀÖVFLŒž’ÒÈw«4H:5µþíÛ6Ì ÇW•`64ð Úµ!07甆"&,ÌHHhþ£ÐŸÂÄúäw—R:j;V]AAäãGJý µµ%åTTDBCÛwÿˆùóU…Øl"&Fmy6›(/ç÷Öo²²´‡eed艉7·Ž¹O**â̦‡ƒÅÂõë¼… 9QQ‚¾ÆŒoÜ,U=MKC^ÛH“•´ó–?‘,ÜFëžÐŽXúS¹€µbiAàqЙBý—8,yþÆÐf6ÅûÏ #<¹ˆ«ÐB<‹AÓð8ŒÊ¦ '…‹[qojëüóÝp–ß"”BL¸ÍAðt‘CN)æÆã8ýthíB%-*ß¿ûã{ãÕvôQGuÎDÀñ*¾’øo€²¶ŽBú8 ƒ²$ν†ËcL¸ˆðÌßx‚ÿpx¸›€¹·àˆÀäTb«%2\±r¨ göÎFÂé:DXÐP@¤+œ,y6.Ãëj1ß¶AS`F;»“7àæ3 aþx\ÞFb:Ú‚»˜¾~ÁÆNg„^ƒ®@LJ6ñ)ë·c¹3.^Gr*Ö8"17ÎÁˆÿ‘°óÈÌ$6là.XÀ={–—”DlÛÆHMš3‡Þé¨Xllóîݵ55Ä‚¢§NISŸgÿþb‹fk+3i9'{ú´ŒFƒººˆ ¹b=4´PEEdæLªu•oß–æç׊Š2)é_ã¿óúÇã¡Á@04Lûô©1*JsذïšÞ†žºzLY;=}ˆ¦&ÿI`ùK®Äàx(JªQÕ€ƒ¶°A5ŒQPÃQ¸›€ü*¨HB‚…e&X0 ä®ÚÿE×âöx>GvŒT!DÇD}8 ƒ<µ“.§ +¯ãñp-V(ôþZÛˆù„þZp{²Þ‚1X²Êr袀½è¯K2@A1VlÇ£0hb„ 69 kÇ%‰ŸÒ°s?îùƒÅBW5Œ5ÇÚ•Ðì8E€ìlbß>ÞÅ‹¼^½h))„ƒÝÅ…Þ­Û/ÅÄ"#›­¬Êµµ™£G³öî•bP¾ÙûøTΜ™£­ÍŠŠÒRV&·r6ìmLLÕ™3ºË—“Xr55ñºtñ¯ªb'&ŽÓ×§NÛ³çͶm¯œŽí˜ó}‡5X¿æþÚîÌ‘ÿj°þ Ñ`e% àÁƒV±QQúøñòû÷Û0áœ2E ÀÇ‚tHÓ¦õðèÑ—_?‘¤Ôºªýd8ùé÷e ÕÔÄ åjjر±$A©X[w‰Ž.½?¯¸˜D´hQQQú³gå?÷ÏæÃŒÒ¦¦â……OOA¢[ ®®nfÆ:uJ:2²ÉÕµæéSAަm¢o_Ú©SŒ-[èL&Nâ-Y¹y“×r¤Ê ¿>Û±„µ­×à¼ûm²«Ï¬¾ç伤V `WÌŠ,Ùˆ=2QߨUÑ器™PµÇ_9ï#I§cÞdøžÄl+ÈË ü%&ÙcÓA”RóµU–Ã1\ÝÜ"¡«N9°+.®bŠ+ŠÊa¤…›»(±«»O0jüC #…ÍŽ8¹³cì*:::=«Öc‚ ü $„Åóæ¿“]%&ŽŽÜ… ygÏòh4ôïOKNf9ÂøEvõðaãÌ™55„‘³C쪰³m[ñСbÛ¶)SaW/_V¿|Y-//4où—RT^Þld$C‘]ˆ-`jJ©_á¿øÄ?%‚àdžùósKK¹¹¹z?Z—;;§ÓéHJâ'7õõܱc#Þ¼©HM ®Þöµ– 0yr@hhÞ³gÖ¿þKxwù\è–u?.“WpˆOý±?ݯààÁx/¯„Y³´¨õøV­Š¿u+{ÇC''’òc7·/±±•††¤>{IIù>4DGkõéC©ž{ß¾Úë×rr¸ÁÁrC†tÆ}!1‘Ø¿ŸO¤¦c,+—u’qZ‚¨osp)³kˆÄâtaAžBôÆ ñ÷E>GЈ?õät¦ôÈ%>¥Û› ž›/Ù2+—bº5¨·¡ý啨y _òð8 r2ص³Añž‘[ûýøüRâ01Ä¡U#û¾ã3q(h1K¤U#ž~êÃ׌öho“/q! Ÿ¾¢ªÆcË$k¨Áåáñ'ø'#©q¹Ð[Ô0Å£u FnÙI4rõ>p? zJˆÍB?5ô”…½ Æèt@Qô-peÜ=q|. © Çaý%˜ÅÄE'( ôŽ/*‡ƒ;b`ØMñÇò}«¬Æ*7Üz„QC!&‚Ó» JÉ0ü;róá}î^àp0b(ÌGÀÞj¿õ.EܺEœ9Ã%XXдµi6Ð{öü J®3gêöî­“•¥-äá!Ý!qØ”)YQQu3fHŸ>ݕʆ)ÑÑU‹wqq!ÏúÍžýâÅ‹2WW½+(¹r8}D‰âbNDD«ö"ææ²eeìëù‹‰1ÔÔĹ÷ï·á„Ô úúrõõœ[·(7 nºVSù¸T}YiN´@-qG0t¨ª††d\IÅß7Œ¡X^Þ|ë¹.~æLåÊÓ§ó ø{Èð¡W/‘qã$edy›4oÚ$1t(«®Žpq©NJâPÚ¦5z÷¦Ý¸Áp]_ç:nãyÅž£Ó·É®h’O%—yËÄ®¸Íb)䟬Í ûÆ®º¹04vÉ÷§âÞG±x¤¥û N®Ð€£§QDõ+燜 ŽmÇáM˜0å•8sÆSñê¥m»)ãɬ˜†ârœòÅÀEˆO%ÙDA6]°ÐŸ&`“¹ƒqkÆ¢¡nþ°;7Y”vƒŽÉ†¸8þv84“ô‘X€Ëo0å <0úN½ÀëœßÖâH,Ä¥8Œ¿ùØ„ó¯Q^“ðd1î-ÀX]ªìŠËÃùç0ØŠêFȈÁy4n;°«ŠZ,ðÄšsàp1@~[HØÕ‹$ô³ƒßsiÁmÖÍ%ß·ˆWЋþÃÂið;Ó1vUVŽÝ¡3î^ÐPÇÒ¸v;7þ6vÅáàÑ#ÂØ˜3bçÙ3ž˜V¯¦_¾Ì8s†ñëìŠËÅÖ­5+VT‹‰aÖ,áÇ;Æ®®_¯ð÷¯æñ°m›2• ããkΞýZZʶ³#_ÕÔp¢£K55%ƧúU~øPVZÚÔØÈí(»ê „þ;¯_Caa¡¶¶6­õÁÈÉÉ™>}º”””””ÔôéÓsss©¯ýÿÇ?ˆ`pr’9R<  •bšÉ¤-Z¤bf&óøqI«™3»©-¨‹ßìÙZÆ©~úTñëd]L^AÝ”¿xú7f ML”EE™¯  íà &Mêbn®Äá™™üì“zzbvv*ƒIŸ=K^æì¬Ð­‹ÃÁ¹s”Šh4x{K¯^-&&F5ªìãÇs,vsS¸÷¾á=·ÈzÊ ÏÒÒ§ùxKŸfZÛ˜Ÿû4éÞcê•;3nûËiýäÓÕÆ–uÈOÁ¹ccœ<œ¾=c,_‹IÝñ?¡ÓçáwÊ faˆ –oE9u9†µ³ðäúhCAK÷‘˜8„~â?Ù›Tª« ~ei\YŠ  ÑBaíÆ‚ó(#9eZAU ëÌðh>­Ãþñ˜jˆÜJDdbç3 ? éív .pöb³QH­æ¡¤¯rq1ë°Èò;aä‰ã±x•ƒ„™Ø5Éëãˆ?F@™j ?|̇•6û‚Å€š R÷c.É7„”< ߈²ȈãîFì[@Rèí‡Q« ®³~¸¶#È\“›à¼cì ¢€!ýÿsÈšCÿ6^g0Þw ¹3¦ ÈçŽAý7ùÔÔÀË‹§­ÍÙ³‡[Y %%Ì›GËÊ:vìW‚-¨«#f̨¸s§AQ‘¾e‹äæÍ9œÀׯì­[‹ŒÅ¼¼º¨©Q¢Gæš™ÉØÛ«ÊË“øðkâJJÂT•†oÞÑeút –k¿Žÿ=‘;Avvv»víúqamm­……Eÿþý³³³³³³û÷ï?jÔ¨úúz*kÿüƒR„23›µ´R¤¤EE""ßÕ!!å£G¿70ÿø‘?KX[ËQRòãpˆ/_&©©µ[Ê1eJàׯužž¦¿^O›äs#h­ãKX’’ŽïÓ™"¿§düøGAA9·n™5‹B…7°`Á«kײÜÜzmß.Èh@ll•©é[99¡œœ¡ââ$?¯{÷ªfÌÈ––f|ú¤£ªÚö*::zذï…{Í͘6­<  ©KFd¤œ–¥´)ǹ}^!È­+§ ½1iƒžJÚW2=‰ •gH¼»!T–öm SDt£ó Uk™Â‚o1¯àyeˆŒóáXï„qëË ± G.Á팞…#[0ÛŠÚ†Íp;‡[!È.Ä\ÝåŸJÅÙõη&6²[]’â?:Ê Û€ ÓÉ]¦êšàˆ`s1¸kù²1r M;ùIËêùoóð )%Ciˆ³P× &4å!- a(K ‘ÂÈ­DU#$Xx“‡š&ôVAb!hÊ#³ ²£s-˜kB¹S¾J5póDZôïŽü œ_„±*鮄Âñ4ê›0T—×B[àE¢±+ârÌúaD?ìXBî ‘ö6«˜ a<6ÁqnÇ,©?…³+>gÀÒXµ 5•­~z¿‚Œ ÂË‹—’B„„ h[¶Ð§M£‹ü&·wÙÙÜ3*DEi‰‰ÙáÃ;¦"àñ`c“•›ËVUzøPƒÊ&©©õ¯„„h_¾ UU%»ñ㟜;g¼t)UÂdcäë›yñ¢Å¢EVsv8EHVcÑ9Оv>Eèééùþýû«W¯þøYŽ9òöíÛëׯ6oÞ¼Aƒ999‘®ýKð÷`56~?Àšš¬E{ödED´z¸63“UUe‰ŠÒ?}ªãÛ\B‚éè¨Õ·¯t`  ©»¾¾lIIã³gíf©Cg¼5—j®©ùüë3·À¢«¦¦tB¹Æ¼óæu—“JL$7V:Tzð`)UUÖ;äù0é $edèîîíFù.ñ,îÝ“µ°`UUñ6n¬IN&cÅÜû°D§ïc‡öØUSë²ì;2Û°+F}¹Ô«32!;dWš–ãE¼úÇ&Áì €© |¯áÂq8;@JUÕØãx_Bc‡UûÆ&|x )•âä5L²G…óN„…ý+qa T“€Å{ðäÿ˜˜Œ@>vŤ Mh—ŽÛQ»_É,>Ä…±k*ÞîÀ c¼-;Š»ðœ,/Ù&äÅþ4O^‡ò¸;'ÂnÆê@^ Ô6#6ÏÒ“» ¸›€ˆL„¤#.™e¨i‚Œ(”%1»/öŽƒ§ò¶àË&xOǬ>aWk±˜qWbÀ#0PÉ{ÉÙUm#ÃÅ`Ô7a¾9ží&aWÙ…·ao !ŠU6ØeOή®>€ý47C·'^Üêù`W)ioƒÃÇQ[}]<ºsÇЧÿO¯àñðä áèÈ3‡{â/6–°¶¦0“’˜sæüNvØ4{vÅ»wì’Þë×òeW¼¼J>fçæ²ÏŸ§¯»|¹ [7á… U©°«ÒÒæÚZŽ””ÐÔ©ˆÖÖ²•”DÿŸîÿcF£ïß¿?wîÜÉ“'ù–?zôhÁ‚?.Y°`¿¿?•µ þÎ¬ØØfSSá… +.]ún°{øpɺu³gËܼÙÊKwçÎ/ÞÞù ¨º»ó7 ñóËŸ:5ºÙ·oÇ´÷^))7¥¤X‹DEUîo?/=ðÑKt&N¶>{õ§mÁ‡e}ûÞVW—ÌÎ^@>àr Çyyõ¯_66&ñÇ{ô¨ÔÚ:ACC$-mˆÉ/,+«yÀ€tee¡ƒU'M¢Ò¯«#6mª¾zµQHOŸÊõïßvô+.àÝw«Nc»÷öj†|”ø¬Žöi ÛCÓb—{‹ÑwøGÔÔâÆ]ÜöEd4º©Ë…ýB¬YZœ6A¸ì‹}§¡¦Œ¸Dl_…uK)‰ß J±ë"Bß #ÌÁ>1A<¾åþœ¼ŠÌî9z…ùž ·Øp‰YÝŽ0…,Ö²{·_ãt8¢Òп;äÄqt6 I*Ù;€z6ò*QR‡Úf4sÑÈ!$X†”0”%!÷û´+ñÙpº‰˜tèªÀD k,Ñ‚wBl 5†êØb‹ÙdRâÈw˜¹Ý•!%£k`H쨭Ǫ¸r¶®ÂÆå§æ.+Çqoì= ú:ظsm©OFy9|}y‡ñÒÓ UUZ}=±h}ñbzïÞ¿ÙÛ»¹™Ø¶­60°))‰íä$¾{·¤”T‡ß"6¶ÞÌ,@PPQ£(ñFt:íÓ'“=È¿qoïL‡7VV]>¤ê¶ž^©£sCYY¬°pÅM~D‡#Xü%¿4ÿÎD°LLLΞ=;xð`´þ,ÊÊÊ ÊÊß=] ûõëWPP@ºö/Áß9‚¥¤DÜ\_ÿýÛØHÓh¯««k¥C3F®°°ùÉ“Rÿ„?^UFF(9¹:=½]釞ž¬±±rM ›¢Oº`üì8ú9äiS ¥7¤02’WUûúµ.%…RÑ?ƒA›>½«¦¦Dx8y‹“‰åõõÅËË9þþäA, –‡G—ôô¦]»ŠJJ¨ÊªÄÅiJÁ*-å-^\ï©ÿù,fÙ½3ÚcWšp¬˜Í …³ñ¢ãÚeW!’-¸Vü£ï7v%$*:Ôeã°cW$%à°!~¸}Æàk!ÜÀj&v¹£œšÃ7ÐhXdƒtïŠúl<ÇíÈÈ&ßPU§Öc‰˜ xÜÀrwdäñN†oI-xÇÇ®˜ëO0nžíÂÌáx• ›ýX 5dæø4f›à© ŽÎFzB’1êÜüQH ¥1!è(ÂTcu`¥F˜a„)†°Ô†‰:ô•»J+„ý¬¾Ž˜tt‘Á–I¸¼ˆ»ºŽi{‘š# ÜÛD®70}ŠÊÑ]w÷‘³«wÉX¶!1Áѭؽ†*»âñpæ"¦ÌÅîC0ÐŲ…xþ (—¦ À‡Ä’%ÜAƒØû÷ó22ˆîÝiÎÎôÌL¡#G¿]¥¤p/®:x°¶¦†çá!uô¨T'ØUe%wëÖB‡pqQ È®\½ZÀá¶¶JTØ€ÀÀ66TýE¼xQ`ذ¢Aƒ‹‹ËŒ3ZØ***ääZ=äËËË———SYû—àïÁ@£ÑDD ._–ž9óû/aþüÜ{÷*/_î6sæ÷ÈA`Ò¤„àà²~#Fð·”Ú´)ñôét]:¤K—R¶lyѯŸb@À¤_ÜmNSãé>Ú|Œj¼×C›Ù¿8s þø#æÂ…OnnÆÎΔº¨¿~]6w&nv¶©žæÞ½¢?þÈ`&%™æñ`oŸwûvå¤IRwîðßµø4X?‚ÍÆªUU60׬·²ÿ*ïò–¥a4´}V }6}"½¼ž&¨k«ø£Ä»k̪V(š–ãFí;,¥ö;›‚= Ã^HH ð¤$±z9Ö­îL4ëqŽW°c5ÖÛSJ½L‚ÛyTÔ¡‘y¯ÏÀC= >—&ÿ8 ‹ŒÆ¾é·iÿá áÿ ¡0ÑÛga@ªª–Ž+…UØî‡¬2¼ËF}–ŽÀæIP¦jô—!·^Á𠇇‰}з+6N‚Ǫ:8žÆÍHôí cmx-ƒ¨À>•÷ïó7A„„pê”´½½xDDóÔ©§¿ Þ0]Éc¨qih{ì*_H×[ÞËWÆU»bÔHÇ“‰Ø÷#»ª¤i• ¿§¼ü¶d—ßÜçüà IDATruŒ"±åŒê—ò·Ô´Ð›Fû!ÂG£aµŽ/‡¹^§Át<ýÀiß@!'çÏß‹Š4ÎÚáø ×FÇB`s {ÿ¶hÖoG^¶Þ‡öFĤÀü¡81{¦SbW¯Ó0b#nFBBNV8»Š„]e`Ä \ „ª¶-ÂÎ¥$쪡›aµ›°`*Îï£Ê®á~GÂç&ŒÆ¾íxz¿mv…Ž`”–âäIžµ5ÇÚšBde[¶0.\`x ×ivuâDÙ… ……ìÝ»U(²+9 <--Q*ì €O.‡C¨«‹QgWbc ŠŠêûõS¤¾É¯€˜ÞÆkg/€Iéµ³WÛ3tüñǵk×íœ:²²²|©²²²oQ+Ákÿüý Öˆ¬¼r¤ìÉ“”$ÿ,wwÕaÃÄ7n, ž(À``×.‰½ÛKOvžùvÐà¼û ´m?PÍP¼%³ù’¼G ³]jzs­DÂmù§…ó^} Q©2ý Ÿ¿*46ŒcnÎ9p€÷ÛúCMx/‚aÜØ}Lá~õÔzT·@Z×ãñ9¨)£©}&áìmò­d%1sÚEÑ–«R«“ŪÅÏòèwÃS78N€„<ý±ÀŸÚñšéÝ»÷ÿêªàþ*¼Þ†…¦ˆIÇ×è±›}‘ø*C~â³±à<æŸÅÓ$°¹ÐT§}¸ºd½†¼bÄFtUÀMÄ{a‘%É&ao1Ø’bÐêŠk;0a(Éøœ¯0›ƒGafŒž8éaj’î°ç°²Åù+b`ÙBܼ²¾c÷3‰­[¹Ýº±wïæ…‡ff8}š‘›+´g]Só7g[ÐÐ@ìÜYcgWÅfJJôÇ%Ï“‘èä{½xQ¿woñÀb§N©ihPÕÅ7•™šÊlݪAq“OŸªGŽTš=›BRù?¨­e+)‰ß½O §Ýo5"ÕáWÇ‘™™©¡¡Aû¾ýahhøáC+À„„ƒ–¿¯ýKð÷'X ââØ~~߃XªªBbbt!!ú“'­rp}úH””°cbªÂÂøå0L&MKKâõë²[·‰\FîõõÒ¥”_ßíî#ÌÅZ=¾ð8œ´À‡¿>3€îÝ%ssk£¢¾¾{G•±Mž¬YréÒ—¦&roP;;•kƒƒËþ&ÛÄŠòªªLqqƲe¸Ù–<Û±dqšñbá»,´ÍÌØ4‘@É%ÇÏgi/VM#8¢™arOÖ‰¥<ï?óÐh6³–¿x»?ÄåSªØ¨Qô‘#鑑ĦMÜîÝÙóçsüüˆfGÕŽa°1.ŸF°?tµÐ­+6î„Nœ»Ò±^ÈÍñá1TP]‹å[aë„ „’š¯Áï´¹jˆæXqá¶+„˜Ø9¶CIÏÞ£ÿx<ä­õ#jàÒÄ $Ep4FÛ1âÄ£©3²¿ÍÜ{ƒ…0À ×bñ¥ z*HÚƒëË Eͨ3¿ waÍ94s`¤èƒ$Õ‚}W0Æ :êÛËÐëNòèk…¸°98¶•ªÍUE%–9Ãr2BŸ£_D>÷QHvÊ¢¢e·ÃÉѣ9}úpNœà1™8Ìðp!ºDg§%E``S¯^%nnµùù\]]æ§OŠÓ§w¾1/mc“]XÈ67Ÿ>½)ùC‡r>~¬SP`öëG©(§  áܹÏéé5ãÆu@MWõµ¬¬QHèïƒæñ¾-0iÒ¤«W[{]½zÕÚúÏ_‚ൠþþÇoölQMMFll«,ìôéÒÅÅœ°0~S[[%}}±¨¨6ÂT³fuWSýô©ZÀ Ïʪ‡¡¡œŒŒpRÒ¯ ëèL¦öx~ƒ£ß˜%3F½o_Åøxªþâ††ÒÆÆrZZ’¡¡äRw11Æš5ݺw¹}›RÓC ]²²šKJ8.”hâð.EgÏðz®¿9X|¹¿Á–àÙ'c/Eg7sxj«*ƒ=Ö7¹h I¿(J´Msx4F´ØO•›oŦðˆvÏsVQ’ìÓÍ’o/Л¾W0(õ2šý h‚—·˜¢MMÚ¶môFp0sÆ º‘íúuÂÓ“«ªÊÞ¸‘÷æÍïT1šš ";\1°ò pã. Lpׯ3ÈËâ¶|ŽCNU°œÿvûÄdsÛþ‡h ro0Ìû0}(šØ¸ùžÈ¤Û뫎»Žx±ö# -ŠWŸq2 ]ÖÂù&Þý†*‘àC.v?D·uð Æ«Ï…“%"]qmô)ßïFcô64s (‡Û°ß"c"Uµ˜âŠÀXÀ¨xxÒÓM.vÃáó0Ò…•^ù€’‡ž…Ár ž†‚É„ë\óÆÀ~T?x<ïÂ…†¼¼ï ÁéÓ¥óòš/]ªÈÏg·¬ôéSýéÓy?g ‡W”•e••5ÇÄ´+-a˜›«…„äž?ŸÜÞêПŸ%Ì{ý¢:ï÷xÿ¡J§Ó:@gÍRýºìÒ¥/T;:v­®æœ;WG©øQ]]èÒ¥n11õNN_}#Š{o I?»anœsVAy}37ókÅÔιÞkûnºëáV²²ÇàxI¢þGËõÿNtTåJ¸ä’f^»ú fE–Lø™ÈýÌêïÖó"Ò2næF¨ó×°Ðé°´¤ùø0™žž 99š¢"ÍÝklÌé×sò$¯ˆœyR…żí EJlbÒL$w$0:c<><Æÿ±w•qQ´}÷ÌîÂÒÒ) ˆ ¢Ø…Š­ Æm&zØ‚‰ b+ ˆ¢¢`¡  „4Òݱ5ï}–Ø]Ðûñ½Ï0;×5³ìÎ\gþqŽz'Ä&aÂB,vk!á˜Zø12=´Åá¥%†Ó]»|æÅu¤Äpz Ý@Obaú¶]ó?¨ÖÌž¿CO žÓ‘}gfCZ¥58ñÃÿ†Álº…·i`ó$‰˜/8Ó-èá†{PX Q,Šœðœ-y~§*¬À´}°ó@©áÓqضå` Ÿ³ÐϹEÈÌGÐAlˣ誠ܰý"ÞÃa, ýÕ5X¸6“õC &{·A˜o‰¨ÆŸ]u5æØÚ²ÇcGF’998tˆòå‹§'Uïâúv 1‘µdIE·nEׯק¤°Nœzÿ^ÁÚº=V¤ßÁb‘Ó¦eÞ¿_Y\̾{W›F€zyå<^1v¬‚™¿š2çÎ¥GE•M*XífhhvLLIÿT~€ð¯ùùÙ””|òäIdd¤–––––Ö»wïBCCÅÅÅùyõ¿‚!I’ÎÎåiilGGÑyó~´nÛÙeÞºUyô¨ê¢EMî¦ææ‘”]»ô† á.…Þ¼9n×®øµk ÷íkÕ·âÇâž=ýMLäÞ¿·£Ó;jàÕÇ”‹Q ܲ³÷Ÿ K›‘Q¥£ã£«+•œìHá©Ï ÈήÕÒº¯ª*?JR’÷™‡G¦¯oA¿~R§Nñ׋Ì™óåB@>Í6g-çÊÖ5¡”³„Öx3â¼P  |Ëö>ŸþEØpZù.É`´ÒØYÆuÏ|E×Õ‹µUñ@­/kêÓ adAAÓ­0Â[’\Ã…P0˜ˆNÃþ9X`Ã{H@8v_ÀëO°îŽKnÐæ¤xƒÝ'‘™â2øA?s¾N,ü5NœA@0X,lsÅš¥í”`¨ªÂ¹sœ‡9AA$A`ÄŠáèH៨µ)),w÷êÇÔÔh>0gÏݹSò«ìN±m[Á®]…²²ÔW¯ôõôxYYõ¼'I"0°›‰ _©Ð¬¬ÚîÝ2™œ‚‚ñââD°ºw÷-޵75å›é7…À:X³Úw^3_ü_7{þŸ X!! '§255jTÔµ3(¨jöì,55ᨨ&ÑvOÏ/›7§Mž¬tá·AARRåˆaUU¬üüñ­^íÓ¦=¼y3ÕÏoø´iüÅñ[GØÎ-‘§Ž4Þ¢lÚÝ)øy§ýŠo…‡çGEÙñ_J9gÎ[_ߌ3gzÏšÅ;H^XÈ´µy÷®2*Ê¢G¾nI¥å,­å!KÉ‹_ÙÕWCJÜa°çâÓÃ$è2¢¦TxÜ‘Zý™n€ Ú*Z"Ø Ñä‡b w)Ì&ñån=†íú[ÅŒWð¡%44àÑ#ÎÙ³dE™žŽŒ RNÓ§SæÎ¥ôèñs'EÅØá¯ðê-t´á¶3`qIØr÷Ÿ€FÅî5Xå ¯Ržz¶µµ!N–[®ß·½÷ù¥X8‡VðÈy}EH4ŽàÅ'Ô2°hvÍ„„àu2lžFX"|_CT_JQU y ôуQ'«B_ Ú P•­õ5·°Y¥È.CìÄ~A-Aq`¢Š¼ Hˆ`t7Œï¡Æœ|ä•bÍ9\ƒ¼™âÐ}ÓI›3'áêÕ‚eË4š+Q·†ýû·l‰[¸Pÿðaò²•• YÙ3zzRŸ>Mow Ö‚õ›à‚`1™èÔ© ´”“ hdôíI‚É$;uŠ/-e'$ý8¤¤Ô¼§æç[77ÔëÙóá‡å÷îõ;¶ÕÖ'>.Y6r¤fp0.q­£ .æ’ ·÷³Œ–޲iw!ûL²£ µÿYræÌÇ—.%?>pñb>ÜÔW®d<˜$##üè/QjÀêÕ)fM™¢tý:_‡ðz–žqε1»jßÙÿ @ g¿•Œ¹L©i’á‘‘í»r}Og¢ÃKGI îÞå=ÊùðÔÕ%ÒÒÈ^½ˆ9s(Ó§SdøŽ9µ¤d,]a>w¡+ße ¸yb¿7¬Í¡£›»ƒ§W·Z!''®ä1åú¹‘•‡QÏÀXkü½|4B•×`£NCbR_ÌQü]ZDz1"’‹Ÿ » dÄP^ ’"P•AU˜ª}˲é+b×”Õ@N y`¢†O9 !‡Ê:ô7À0c éÓö n$üžaéi˜h".ûç`þHÞd·´KÿÆåGèÞÓ†Âu&!,6özaïqÔÔcéLØ!>" ©éX¿Ÿ¢¾®+±u„W0¨®Æ¹s??Nd$I’8pw§Z[ÿ²«ÿàÉƵku^^µ$ %%ʤI"®®ZZ?MéáÚµr‡, ¡ƒU'MLkîÓ§êîÝ#©T"!ÁRW—_±|s󨨲»w­ÇÀÁ ,,wРÛÊoÞp—ˆð V{äâù˜ùü‚õ¯~ÿß¿g®®•/^0mlè[¶ü¥¬_ŸQ;z´äÆM:…fÌø”šZ·j•¦wѱcÉ7ndëꊟ;gÑÚAËË&M **ª «¡ÑѾï>Ý*¾´Üº(«£g{âœr·Vó•mÃÇ'ñìÙ„îÝŽá×À¡²’9qbDqqCPÐUUÞ7š¼<†ƒÃ§ììú;wºuíÊ;>jØü˜UÃ9QmìÓvE+M•üà+Tü¹ñF‚Bé2Én°ÛnQ¹vÆá[CL yïyø0[](.Fy99f eÁÊС­&I\¾Ž5[` œž@UõLhÊÃT*Rè®nè¢ÂÛׯmÄe`“/‚ßCGFê8±j||w¢?ÃnÄEQPŠs›0ÊŠÇþ%å°_ŽØ$t3‚ã8ÌâÑlð ×ï`Ár˜CJ›ÖÀªÕûS«¨¯Ç¥KœÙµµe'ììLüjjU]MÞ¸Qwà@ÍǬaÄ_½bÎ+¶zµ¸¦æÏѺs§rÆŒ,33щ¥V­X\jÊ”…… ++)}>‡$%UM¡¢"zï^:]€¯Ý©Sýü>¬¶c‡¥ çù,—vªÍ™Oÿ!Xÿê÷ÿý{Ú0lX©¶65-Méû"÷ða•Mº‘=!Á°ñ¨£G³—-û~džs¦¡¾¾ô›7ùv±™Œ€EsÚ`WÕÕ g³™íQd21‘35•WQHzÞÁAÓÈH*:ºœÏýׯ×RP*(`ÆÅñ–'/­a0@›+´²-'Õ($Û®Â]¹áÏ©(Ì:‰¸«òA«E2_4fWµ„’üŒ£ö7)» "‚ñã)§OSÓÒh›6Q,-)ÑѤG_Ÿ¹r%;1±ýß i)xzÀËæHÏÄá“p^‚rþTѵձ`Ùižì @=³öv”7Q:nìÆÅ­GbzÏÆ‡dÞ¢Q±z²hâI¬ž€ðx¿‡Ñ"ø>ý™Â4˜¨ašæXcÛxlaÆ0R²ÔÏdWLŽ`Â.<Š $žä‹]Õ5`þœ @=&ºx~’7»º ûåÐRƒ™ ^ßà‹]%$¡¿ ž>ÇÀ~ðõ•³³«GÈÉ“ÙÞÞœ¬,²sgâÊê‹´_Ç®**H/¯Zkë’Å‹+½½k++IQQÂß_6#Ciõj‰ŸÎ®î߯tsË76Y·®=ì À±c9Ý»K._®Î?»šZmn.çèÈKܬئ¦òææÿ†ûüRü¯, ãÆ‰¼xÁðõýÁ¥h4ÂÉIîóç?¿&tAYYØØXüÉ“2ÿd¢ìì4_½*9{6­Ã©i` ™YÚ~U…Oþ—Ë3Ú:ÊW”g¤}ò¿ÜŽù©TBII4<<÷åK¾Ôª¾ÂÖV5/¯îÒ¥Œ6¬¯CU•¾|¹FI cÃÞ÷râÂÂ`eRB«.;Úºmàˆ¦>‘ Z-–€Æ"O¡B³öä:ï>sVEppÃ?óp¥¥E¸»SoÝ¢^¿NÕ×' ‰Ã‡9ÆÆ¬#XAA$ŸúœÍÑÃ/Cpt qÞ&–æ=*§<="…_¹Ú°¤»ßíŸgŽÂ+oÔÔ">}çãÔm¾P;Éâï¹xsUQR‰­~èº>OÐÌQýwIâÖ+tý ˽PX«.ˆö„ç¾âpŸ³`5I™x—ÿ8±Âm–Cq8ØrvKñ)–Ýñò:4ÛÔ)ýŠKþ0ˆØOPí„“1ÃŽß·öÉɤ­-kÄÖ;iiøúRß¿§ úKáá —Š)SÊ\\*""))ìM›$?~T •³³iG¹O\¹R>qbæÛ·µãÆIyx´‡]_º”—]¿~½6ÿ£¢£Ë®^ÍÊʪ±¶Œ'ÕÖ²nÞLML,31ùÉu <ðÛ(¹ÿËð¿B°ØÛ‹xû–Éj$mc#™ŸÏŠˆ¨á¾rrêàÙ³–ùI“ÔétJRRUAA}óW¿‚J%úöU‰‰)¹s‡7Cj IøÕ—üx·}‡èß_•F£|øÀÛ4ð;DD¨ãÇ«Ñ锯ñüÀÅE-#£>*ªŠ§&V5ñ+LÖòƒ_aŒ/ëé9mì@+N‘üp‰Rß$¤£ae=ûÑóS‰žîûUÍÍ…®\©³µ-?¾ìÁƒ†vS $„)S(—.QOž¤.\HGI ÆŒaÅ>s†Ó>7R*-À•sè×¹ùؼ –£¸¤­!WÞfsZ·l Éñ{}ðûŸÆ:9‚ev¨k€o0œw¡€?µ^qm=®o…‚Äl8{böaÜ{#˜Hý? ’Ľ7»‡ïâs Ô°Óç—£+ñˆO°pb’QQƒ7g`ÇË0§ª‹Ýpö¨Þ u¼ pªk°h%–®Eo38ÙãÎè "3QU…õëÙ rž=#%$àæF¹v6cÆ/iÌÈ`»»W;8”õï_âåUÍ´±¡ûùɤ¥)º¹I˜˜üªuØÇ§ÌÍ-ŸÅ"7mR⪲åL&yöl.€-[t$%¨ ΢Lª!΀øø2QQš±±œˆÈ/ðqlÖ¯ÁÿÁêÞ]häHzJ ûéÓQ^½DGŒ|ýº64´IkÂECC±ë× 23¹õed„,Ð+(¨÷õÍhãpÎÎ]´´$½¼âóòÚéý\œÈ¯ZiQB;uMû÷W¦>z$X˜ÍÉI[D„Úv ¯1…¶mÓ)+cmÚÄcÈÄÞšá”¶¬£8õšôæ2z[å_LƒŠ¾+@ùv‡’TUçå3íÆ#cbõjñ§Oå÷ì‘6ŒþðaÃüù††Ežž555ÿÐjßµ+qò$5;[hþ|ÂÆ†Âñðàhk3·mc—ñe,Ä }<Äá½PR€÷EtµÂÝÀ–÷ŒÍ~—ýZ ÉãsßÅf¿üþ§ˆ0ïáQ4{öððPqwog‡…—WÎÝ»ÅcÇ*,Z$@ IÂÛ;UB‚ÖŽü`TTam-ËÊŠW.ùþŸàßO°ò¥¿lméõõäùóMO¿~b®]k𣌧¨®.Òb–pØ0e&“sæLzkƒŠŠ¸™™"“É9w®ì§žïõ¶¾¬Î<ææJõõ¬èè"ƒß¨€Aƒ”„…)qqññ|©´pvV¡¶o瘚²fWñ•zm ËÂû(÷GA!¶íÆÆíÜÒí’ãÿöX;NõÊO® ×è¾ðÝ›>((Å® Ø} îbE°¶æf%B4,°ÿzu€“ô IDATš•¯sûŠ´4ræL–[D½z/Rwî¤*µÜiþÙñ &÷ï7¬__©¢RèâRñàAƒ¤$áè(zåŠÌóç [¶HüÜöÀ–N€tuÍwuÍ#¸¸È¯[×Îb¦ª*ööíéœU„„à‚oÞ”¤§×ˆ‹Ó,-Nó}úTÊázz‚©HüÁo‹sah(gØ0êôé,?¿o—tf&{ΜŠìlö»w RRß®™¤¤†E‹²óòXÑѪ‚‚J<<2Y,2<œ»gÅ"Ç‘‘Q{æLo+«V¯¢'OrvîŒ,)iˆŽ¶£R~\;ÙÓ ¦/ûq¥N‹¢“ÿ+¦M IM­8}z ¹¹Qô­[?FF– ÞiÕ*¾z ìߟuï^•Jyö¬-Ù½÷åƒ=žÏ«¹¾å ज़)'SMèo€ô¢"£[›`T+Þ[¬;hèà{eux¨²Ù¸}»þÎú›7ëÅĈÒRÎäÉ"C†ÐííE:âw&(ÂÃIvUž?'ee±buåÊöXç’$ŽœÂ¥«Èʤ|N¡_+娩…wÌm2–#”ö(:VÔkøPpãppìŽß@N1tTà㆞œj×^Àí2:ÉàÍgôzX4 =WTï rKpé)Ž=€–"hT¤åcÍ$,°ˆ UAñ·ÄDPX¿íèkÊ{ˆ×U,ÝŽ¾f‚ÿÞ8$‰}žØ¸úBWÇöC”oW^^œµkÙúúD~>yð ÕÑ‘òs £¢˜õžžµÅÅKK¡˜ÖÀÂÓ§‹Nš$"!ñËe´¾¢¨ˆeoŸEÈÍeº¹)O›Ö~º={2nÝ*ÒÓ»zU°n˜µkc""ŠFVݼ¹­`|‹˜=;4%¥bËó‘#Ž~5†À]„ë:r´ÖgÞ÷§‹ð·ATTÔâÅ‹eddZ ÊÊÊš¾&"¢âÃîö701‘ޝ¸t)£Ø8 ÏÞãA¬]’ýí%~êxhTŒ³Ä•µøtËÆÂL÷#qõ9tçaìN¸û#†/oqQ€°qÃØ8ÿOc‘U ÇÁ߇7à0P0‰‡gQ²i9Ã*ønƒ/=Ý’rŒž‡ÔLˆÐqÞoàmû VÑ’†.x|«ÿâ×(©¡û÷³'L`gdººÄ±cTª"I3žŸI",¬ÁÞ¾\]½ðÊ•ºØX¦¼7—“™É +Kqt6Lxøpº¨è/: !ÝÝÙ ÂÂÈ.]ˆíÛ)S§ ¼b=yŽ™.ÈÉC7l]Éã¾m¯ª/_zyI6!n»'_U“Ñ ûHËÂ@ lù Cûòu¬GoáìŽì" 1‡­5–NMðb›zß!<Aï˜ 5t×F?c˜é¡«dx;4ƒ…ø,ÄÁÓX<ƒ¢^'@'Y 6Å3LìiçP×€íg±ßÝõ¡$‡ãk ÇG%tl"&,Dz6Ì»âøvXò¡|û>œ ¦Çàüq¨ñò‡þq¬Xrölvt4Ù§akK¬\IûB¯ìK—ê½¼j925•M¥ÂÉIlÒ$úˆt:ý¿µÈÊbΙóåÉ“êÎé3gʸº* Ú»Çÿ{ûOòòB‰‰}SX´èÝ©S©›6»»ó‘$nŠèè"3³k&&r? æTѧ7vð€­Ì¼û=Eøÿƒ` 2ÄÕÕuĈ>!!!¡¡¡<§’’bÈË!!4ýÿ´óØÙ•…„0öì‘\´èÇýÆÑñK~>ÓÙYvútÙÆ3tíú¦¸˜yé’ñðáÜO$GŽ|^³&fî\“'{µq³f=¾y3mÓ&ó ve+ˆýà?u £ºU‰Na ‰i×´Û-ƒÁ–”ôîÔI,>ÞA\\€»Illy÷î­­CCµa}Í…7 §Ný8b„ü­[]›[=6GCU団ž]º<Ù¬B“lJÌ`ˇD0I2:zÅCw–V6ùÎÈ+ˆ­Ý0˜Béè?9™}õjÝõëu••df&À€t]]Š }Ô(‘ï•|¿®]ãlØÀÉÈ }}bï^J×®‚±¨ –ãs*`;ÛA§ãUjð©gnw“W>dÿC«¸ ‹·"ì-T•0q6/? ü¥•p¿OQ1º/v/‚Q{+Iêð8oñ9a€.ýMž5èv‚šä$P]I1–€…HeÕ¨¬EZRóÀá °¯a¢‰OY ¯‚žz°íѽ ÐÞHAôgìóƒÿ#ШØ<gñÅ&ï< _<Š€EwÜ> U^EÜöàúmtêuUxód±pìûÚ5òÕ+ÒÀ€8žÚ·ïOø¢¾Ïôô¬©¨ ïÝ« ©I]¶LÌÞ^TMíŸÕøH/–ݺUP¥¬LóöV;¶£±Ÿª*ö´iƒ‚J¼¼ŒæÏà!“É=ú9‹Å9rÄÜÔTà4ß;ésæ„¢vóæ(AÇrA`‚åÆ{·öœÆö?ë÷{ÿÍ¿ÊÊʱ±±ÊÊ?šWóóó{öì™—ÇCЉ ˆåËYžžœíÛ©[·~["&O.32¢EG+|ßÓß¿|æÌ/b/^4)Üñôü²zuн½²¯/wETQQƒ©i0€¸8EÅVH>t› ˆ¬¬Y’’«éÄ~¸¿Ø¹,½•Ni Íq^—:®¾¢_¿[/_æ½|9ÙÊJ°ºáß=~\pÿ~ÿ1cø½‘$>úûnÛ¦ãæ¦Óö®Ÿn^ sßZ[T ÞÌ|¹äS®]îe¨éL^b¹tUܧ’Ë>܆vÝ{Y´\Ÿ?³nÞ¬ l¨¬$cc™DDˆqãè#FÐÇùé ÔßÑЀ“'9’ÁÁ ‹SÜÝ©’‚CIǽqòâÑß >§ñ0}ÛË” Æû 6š8»Ÿkã-l6öœÂ©ËÈ)À4[œØ9þjZ_âÔm„c@O 6ÆY wLC21/”ƒÐH‹!£iù  …âJØõ [<'€¶22 @W5 •€¥ºé``WôÐí#a={}°Ç&ºÐSņY0ã£Íƒ$±Ï  w7XõÀžµáq®ªÆŒy†¶&Ö.Ãâyüžaf&9c;"‚4ˆ°° ¶m£Šv(]&7nÔ4\¹R@_Ÿ6t¨°­­È¨QtžÉÍ_‡ÔTÆ¢EÙUwí*bi)¶gO'EÅŸ ¼´kWƾ}Y£GËûù úxöða¾MØÀJÏž nÇ¡wï~¿iÓkWWó={ø³ajÖo‚ÿKXX¸¦¦F¨‘Ö/“É”hà¥ÏHDp0ÇÆ†edD$$|»ü RE¥°´”«hjúmcu5§S§øÚZNJŠ‘®î™¿ôô:=½WÔ‚‚þ¢¢Ü7f—wçϧ8ÐcéÒÎmœÆ A·ÃÂré¿t)æÍÀf4Äߺ¶ss}yƒ©WïhõoÏ•Ìgç'çÏ'?>pñbÞv±{wü¦MqNNÚ>>ø’†‡—÷ï%!AMNîÓ©SËëLáÇØÐÍks"Ô U‰ÊN±¬×&›ã§²Ôbl¢g9+’$yøïy¹Md#deE×mLí Áo3|ù¾y³þÎúÒR2.Ž @T”pt33£KÿEOóååpscŸ8ÁéÝ›Èχ‡‡ÀÃèXL…NJHÍàŒÛ0ºžÝDdÙ°}æZ›zöŽ« /&öÁ‚?Ó˪Úo,„$Ñ¿v¹ GŸ¾C"³ _–ÚdBJ r¨m€žzð~Y ¨ÉCZ z*ÐW‘:_æ‰ü ôv]ÀÓ÷ R°t*ö.æ­  ºë÷á„/¨Tì]‹5|P¥œ<,^øD”–áÚ má“i·n‘ÎÎ¬Š hj>>ÔÛ¸ª¨¨––®¨ ýýk÷ì©ÉÈ`S©èÚUhÌú’%bªªÿ=bTWsNœ(¾s§òÕ«ZEEÚÁƒ*ŽŽ²¼‡ñ¨¨*KËwJJÂݺwØ,ÈÅå—Wª››É¶m‚ÝH¿bþü§gÎÄŸ<9páÂö oŒ?ë7ÁoTäþ‹`c# ÜOLÌ&s‚ ‚ Ó)¦¦ï üü¾õÆÅűÙU‹Ëwë&êçWÞ¸À3'ç½³³j’”TTTÄÅÅ})<<|ôh ¹«W³âââ***¿Ôø÷5kzZ[«xyÅ—••sÍðý÷6fxõ6ÒÔÞI³ß®·V]Ïç oþ.úõëdi©œ–V)è Ó¦i øøñ—º:6ÿç`m-3¾’ŽeíÚÔæ»E½zìºòÒèAÙɺ²ëUÜôT–“xí¼‹Kö³gC‡ssܲ²º÷‘Ùüÿ¾ÿÞö»ÐР®X!þì™üíÛ47·jº©)íÓ'æ¢EúúEC†”:Tóøñ§ö}­ÃÇážžÔ¨(š¬,de+ììØ£F±’’Hþg¨© | YYtïÈÅ®(ÕXżÅzU¼¾ 1:d¥a=<áÇ×»î…8·&MW¥¡¡½úÆ®AfþOø?¼Œ×QÆè^øË}•ÃO,ÂÞYX7+ÇTL6o‰û[qilõÂ7L…5Ìôú¹×EãsHJ«œ¹×  ©Xz ‡V€.Ì{†”LôŠ·jŒtÙ·N|cWmŸÃ‡8X ÃÇÈJ—E>ýÆ®x^YUUprbOžÌêÒ¥fÒ$Jt4mà@¢Ý÷‡èèœõë«45 –-«PW§uîL;p@ÊÛ;Ý:ÎwvõÓ¯,ž3°Xäöí±;'ººæÓé”yód/\(ûή:x gÚ´wff’sçªtï.)è ,ùôia“&©·ïêëÙ––ÊõõÙß·ó3ömÛˆf€ þ5?ÿóøÿÁêHŠ$ÉíÛÙ÷ï“ýú‡»5¼zÅèÛ·DU•š•¥ô=ÊR5rdº¾¾ðçÏF¿¢Gf/[öyÌùû÷¹Ÿß Žºú½¢¢†¨¨={¶úÅázz—22ª‚ƒÇŽ)Xßïw<ݶñ½÷ñÆ[¬×mî³|mûfkŒ'O²‡½Û¯ŸJxø$AÇZZ>zû¶´íJÿæøò¥ÞÈèM]ûùs3këÿdž¾æwl®-iÙº§LLi²Emg²IÏ`:SÍüf€…•äÚW}_r±ddE×ÿ‚ JK9AAõ7o6²#"˜$% 33!{{Q[[ººúÏ|Üçppîgö‰ ñú5éæF]½š"Ì÷½Œ$±æÄÙb¯Æ»¨˜»Ž>ÑÆ(&k=àyýÌ¡¡ï]à¯*¼S·±é4jê .Š=‹0C>$¾nÜŜŨ®Á kܼ9þB3±±ä”)ìädRBÇSgÎlÿ>3“ý÷ß5¡¡ II,C‡Ò]]Ň¥ÿ\Ñ,AÁf“7nTlÙR ¢"ôüyuŸ>b‡«ZZþŒ¢ýÿ`óæ´]»2tuEcb,$$¾fƒƒóFznd$•ÐÎ *cãË e±±ö¦¦5"8‚µ§ƒleæ "Xÿ`bbÓxKll¬±1¿2QcÇRØl$$ß]­¬„­­… ©ÏžýH2*Ñ»·¨††PddÍå®]Å««ÙyyMÄ SæÌѱ¶V¼y3­ƒB!/îÚ·o§Ë—?óyÎÍ!¥ÆÝ¤T™ÛÖAù‡©©BŸ>ÊBí¸æÏ׳µU kAÉ¢ hhˆ¬Z¥an.µgO&›M(ˆýà7nxÐò…­±+DŸ!}Ãôœ¹6ëå,és¿¾ž3{v–R'n’W^V÷îíÏù/µ99ÊŒb·nÉ>z$ㆬH¯^Baa ÿ:cã¢#JΫ­ªú97 óæQ’’„ŒŒÁÁ++ÖË—üßL!£ùŠk£©ºUÛ£„„px3îžFl"r `>qüéÚÒ…±|>_ƒÓ($n=Cç©ðºö?âÿØq|øc6Œþô)Ã×÷‡â(•J (ñôi¯o“R'!##ñ°°ò Z˜99i‡‡;–\[Û–ÛŒ³³qU3=½*.Ž_á(.H©q³‡ªœŸCEÒÓ«>ÌúòE`—–Ñ£U‚‚òΜI«¨à%LÙ7j1KNNx²u½ï˜ÁyQ‘­í¬dbêp+hìé‹¶‹×ÆÜi«NZ˜ …‡×:ͪ"Á]Ðú(™Åú‡ÖsQQbòdÙ€¹«WeôõiffÂ1æÎ­Ð×/tt,¨g öjrr8uŠF+*‚„¬­Y..ìÖ›M ¦¡*­èׯè}ùáÖã†âÝT×âs:V¸ãÌ5~ÏVU>[r•µÈ.„‹¶âvØïåBÈ…×1v ÜÏ#>ÅåðÚwhðçWZޱ °å K°mî†4¯zžšZL™‰í{‘œŠ“qê„øè ¨®†£#{Ö,v~>9q"ñò%ÍÀ =T¨ €³bE¥AÑÞ½ÕjjÔ¾}…ãâ•êÕ«cí Cz:c×®" „ ²¿|aTW³/_Ö|óFêTéŸKø˜LrñâÏ”úõkÈg}=ÛË+5"¢xòävJÃTU1>ÌŠ‰)–“ã[@ö'âÐè¯Áÿ‚5þü—/_îÞ½»¬¬¬¬¬l×®]¯_¿ž7ï¾Àɉ"!Ç,´"T*’“Ù¥ºííe¨T">¾ákXå;æÍS"Þ¾­l¾$tí*ݧ¼””Ppp[ùJyy‘AƒÔbcKüüÚÄ’lF°*³3in]»ÊkhH&%UðÞµ)TUEû÷W”—§‡„äóÞ»DE©ž‡õÍÅžV±‰:{ŠlEL“.%=dû^§ 05 +;I½0ráÚG¦>Ï}܃M›”h4"è!÷RV^Vùæ§ý£ø„¸81mš¨··tPìµk²Ã†ÑŒ„üüê¦L)ïÕ«hóæÊ´4Ì[CÿþDt4mÀ‚FÃ… ''vTΗóšÓTþª¡ZᬗîìŨáCkÖ@/®b¥3^FaÏ)ÌZ‹ªšVwæ«ìבgqq+¬Lq÷9–þ‹úŽ÷Aÿa¼OÄw,?„ûÈ(ÀÁåˆõŰÞüM‚³+¾€‚,ŽoÇÒY¼EAsò0k!’>CRwü0§U+Î&ˆ'§Og‡†’ðó£îÞM¥ ^Ë_[KzxTÏž]qòd-“IN›&úè‘Ü¡CR¥¥‚™‚ÿD°XäƒUcƤϛ—XQR¶°suUJL4rpé ÆU‹ððÈLK«ËËcìÜÉÛû¡E„†HK ™›Ë\ÿ¹¹Õšš::íÞQÐÍÏÿ<~#‚Õ¸@«XORRòÉ“'‘‘‘ZZZZZZïÞ½  ”êèH!Iœ:ÅùÞ‡g`@W`; ©||†b¢8¸ç= )ŸÛpZ­<247 ¦P0sžÇÁe0ÕÇ›Opv‡Ù,øõßù|šàÕGØ®A¯9ø˜ &[œs +í!ÌwÇï.úNAa ¦Áû»Á‡cr\<¬†áæ=àíŒÁ{€›79}ú°8C†‘‘´éÓ¾“s8¸v­®sç"Wתú… Å?|Pôõ•Ñ×§¡fÏAttݪU¹êê »wV¥§3ŒŒD^½ÒóFút™_$ Rêæ–ÎáàêU~”ùZĽ{yYYµ³g·ßG3'§&+«ZA¡cŠð›á7"XdKøþª¶¶öíÛ·++++++oß¾­¥%˜‚¡ª*¬¬ˆúzܸñãñÝÖVÀWq—ï9Râ͛ڋ›¶YQˆ1cä\¾Ü‚gßĉjÒÒBUU¬¬¬Öçmm)Mƒ}üx\»µ1yšH“ËYWWWVÚŽ©šÃÀ@@rr9Ï=›ÃÖV•J%=*(-å®Qk5…ùË]®N]”À«úeÓîÓö<-¦Àíëa¬&ýÌp!×F‰ºÂò‡§ÍÌDOœP•WjÆD+êÿù ´´¨®®·oË8 9k–(NqÆ+µ´,Þ·¯º¬¬CÙ²ž= __jÏž› Ž£#;9¹… IsÞpmÛ·ïõ èÞEÅ8Áù:¢½-®Áð~xö}&ãÂMΖ.„%SpsޝA=ÑŸ1kì6b¿J¡þ°Øð ÇmX" !ŠÁæñÄŽùáÛo»mžp\š:tÑǹ½ÐäCîa(†ŽÃ—ô·‚÷ñá–Íáàða޽=»ª Ó§S¼½©FFu"#™åsæTèÝ[èÉyOOÉïš5ÿô(" IDAT0bbê¶lÉ4(mùòÜC‡Š XL&PŒì|ö¬zŸ>?³ÖŠ ÅÅÌÅ‹“8rÅ ^½Ú)RZSÃòõM×Õ•˜0-ÿVPTT@IéÁúWá7"X¿óæQzõ"._þA°¦M8P8<¼¡¤äÇÆ3dû÷—xø°ªªªI&ÅÉ©S¿~Ò÷î1ÜÉ,ii¡Å‹õËËÇób­_ßÓÚZÅÛ;¾¼œ‡‚W IUî øg•auí*gn®TXXÇ{×fPP ÏŸ¯§©)Öv¥?‹uæäÙ½âo\m­GDFvÈö½Žžªš[´6ϘÙ.ï)Ü¢ õwv‘ µââ”»ÈÉsß+Ÿü÷‚X\°´¾pA&7WiÁQ}}š¤$qéRŠJÁÌ™å ,Þã[ŽÃ‡©ÑŒŒˆâb²{w–§'÷5³äsym“ %•B5VíÕYσ ¯mMŒ±Ã¾<› tpÏ ³&¡w7ÌY…[P*?Áüñȼ/W ·@y Öƒú8¬8ŒÐw˜FwŸ³°ù4Ư…ý|LEf¶ÎEú-ìû ‚”âddcÐt<{ Ëî8¼g÷ð¥åy cì`ÔSðè_%íUU˜2…½r%{ÈâðaªŸŸÀî7%%œ«úô)ŽŠb(*R<=¥Þ¼Q8ðŸnìäpðúuݺuyzz‰K—溻R(da!{Ù2…ÈÈÎoßê¯Z¥Ðصìל¹dI’¦¦ˆƒƒòúõíl(2p ’ºzûéQE£[7y#£öTw´_óó??Á*ûÏMßÖ–’@>{F¦§[Ú;u¢èèP»tºqãÝÑÖ&² €uóf“§iq!ÑÀÀ‚FãÆ©%%U=›V_ßÖ*Þ£‡¢¨(­¤¤þÔ©Vƒ7m …,aÎÏ ÌèèH½_øúµ`uTßai)ŸšZ}åJ3KáFøò*Ügä€'n®ŒªVJé WN°5ÇÙšÒO:s±ÄëŠ+ƒŽ}ý}ü$#®W++®øñ ¿ÿ$dd(..âIIŠ®®}û 3ä¥Kuƒ•8:–/m†%^¿¦©ªuuX±‚íèÈn¤¶ÓB~P_ÉTLX€”$nûaÌHž…câ Tñ‘Ç¡Ãs \ ¦Œàç0§JwKø´:ƒ0æGð!¸:at_(ÊàØu [ íIØê…'ï~Iê0ù NÜ„ã6Nî HÌ„‰.MFÂUlŸ׸ëè6¯? ¿§Ü±|6ï!,–®Á Wp89—Ï€Ÿò©”XX°nßæÈËcíZêòå‚ݽ9\¼Xg`P´gOµ……ðäÉ¢Ÿ>)N™"Òb‰?Ÿ];PXȺu«bÆŒ,eåø+röï/JKc””°\\ä·nUþô©³§§j¯^ÿPgçÎŒk× jìÜO­Ë—333kÌÍ;IJ²ªccKhíðïü)øC°~ þÍëY8lvÿö§¸8æÍ£Nܺõ#v2z4ÅBhh“x’³³\¿~âOžp¯0_í«áÃ5tu%oßN;s¦U¶Ñ~]ŠB!ÊÊž=Ëi_–´´††XVVmpp“Ø×œà¹½ão\mm¬¸’òO©WßdhÍœ™ÐÐÀWrÈLK&TŸ»P¤¡¬úÁ‘¯¿·á¶ˆgNÊž2%S_?éäÉ⢢öçã~:ºt¡yyIûúÊØÚÒEE‰¼ --pÇ»†2Üæ"ù:yÂnºhC\g0 ì =#–cÝ1œ½‡gQHÏkYO‹ÍAQ9¢’pý <ýa¿§bø2LXOĤ@FÆ:Ø·8» zðnôkŽ è5ço ) §Ýqãdùx»9y0 w ó žaúT¾Žuð ÇÖ–U\Œ=ˆ—/iººœ.‹…½{«ÍÍ‹¯^­ÓÕ¥Þ¾-ûð¡œðB;>;.”•±®^-_·.OY9ÞÊ*åÔ©’ÈÈZ:¢¢B=yRíógÃèèΨôï/ΧjëODRRí´iããkþúKÍÆ¦Cªž·ne‡…ÉÊ ++wH^!1±ìÅ‹\íß¼"ÿâßÅSWYiÜ Ä¬é0d¡ªJˆŒ$-,""Ä”)"·o×Ö›˜|«h•’¢Ž+õìYÍÝ»•ýõãò“—²µ•/¿w¯xáBn®ãà ¹jUt^^]zzŽN["öö7n¤gÍ›gL§ þu)B²%%õ™™•ææÜuåüÀÁA3((ïñã|gço-~Yáa¡›×–$·*II¡ÑzÌš×oí&º¤”^ û’oQAãÀ¬µù9âDG§Û¼ûsšƽ}ä¨%„˜Œ¡‘¢¶®\FZ“|îÀþÕ•Uò™Y¬ ®\©PT¤Í+;l˜¤°ðo¡Ù¢ªJݶMrÑ"ñãÇk¢£™÷ï7ÔÕAI‰²s§¤žžÀ¹]]âÙ3š»;{çNν{œÙ¯hÝšpJiQyMùʪu´‚eëq÷vìCÌG¬]Æ›‚P(X6 }Í`¿?cÍnŒŽÅ3ÐŽ¤A §!zÂu&ÒrôaÑÈ.Ä«ÈÌGL2 ËÀº;>¦¢›>¬L¿©Ãk«`ù!TÖ@_ý[Ä«‹62@] ƒÌ0È CÌaeÚž³ú6ŸÁ“×HL…©!®zÂXŸ¯Ñ±Ø¼±Ÿ`Ø÷®@W›÷6°ïÞ%9¸»S7n¤ÄããY›6U=Îhh ,Û¿_JJê×~Õ?|¨»¿*9¹!.®>:ºNSS¨¤„­¯/™£™3E ;ƒ‚ªÛÛûYzE**:ÏœÉü¬œœ”(AAùT*»K8–ÀÅ+*ÖgE[+‡è[dÄŒŒúׯ9³mþ€¦¢Â‹çå]ÃǨhŽœÉä%ŸZî;Bàp Äá?þP*-¥„‡×ž8ÁVy™³ó¬‡–Ajô ´¥Tƈ()³±>‰) Pzxä˜1\ë׋¼x¡úúµª´‰Ÿ[RBóòªqp(Κ2¥`ûöªë×›ªªFÂGsL˜€ ð𠪪âH$ÄÚºÞÅ¥©¼œæ—^ÆšìªÕhkd«YU¢Â@_aß8áÍ®‡ ‘¼¶Â¡-@âƒÂR˜±~;%#ómýzhn…ßÁê]šJ²°m5œÝüìѸšZ°rÿ` 3Àc=lYÏÖ^¡¡¨…½²$$ "/+Ë.=jkCwìh[° ±±‘ieÅuáÙÎn$‹kÚׯ¯01)˜:µðÊ•Æ/:mmIÇŽIÞ¸!Ÿ ¼oŸ¸žÏ7´… ºlYöåË•MMôC‡ÇŒñÒòò΀€¢§Oëìì$¿ühô¸¸Šêj6üªF„Ñyüôøñ –‰!Lµ%ExúQÈÅcd„©©Ak>’EEì¼yÜ&&„;wzB/êê\³g“'Là‰Œlé}@MM^WW ¾¨¨~l›/V02¦ÓÑׯ‡(frrRZ²d,ƒœ?ÏA‹_êó:÷‘)Ã’‘ᛇ²2Ï•+ãÔÕyO*KHº lª†ØmEw– ŽÞÑyû¯Ïm§³¶v´S“Š>?”„~Ñ"Áðpùººq÷î)ìØ!fjÊ«¤Dˆ‹kò¤ÍÕµTY9WU5gÙ²RÿÆÜÜ‘ ²Y³¸ß¾qpàâãC**ææ gÏv°)È™þ™­ÚPK‹öè[\‰Ä7¯Âß!-Î_‡ÐÜ2ô^`0^FÀñ] $¹ > <æ`ø]!ä.Œµ¸gPU[WBzX½×¼ÍS[ÀãAF B/³ësâÓÃ!)‰lØ€ Â|3Šœº‘QÝ“'KK.ò‚BB#sy¯®¦=Z;sfÑäɯ^u>{Ö1mßÑ£’ï߫߻§¸y³¨‚Âw½–2èÒ¥ÙYYíbb„ÐPM]Ýa*¶³àæÍ233Q77E~þ(' Pff’B_~¨ÿãûÁO°¦O…ê¸Ô="&ªªÀÍ 7oö¬NÖÖ\P.]ê#ã4m_\\Û¥K}²„`n.ðøqãٳ埿ÎÐP8%¥þÔ©!D„0dÎ¥¸¸ò?ÿ|ÖÒÂnÒ‡ôY#aë5’É„/j<(íè`7KXððÞ¥)úIÿx ”¦Äâ º+Ü—Ç¥jÌ]Èþ™88ˆ8: v.Z”VY94qžçpÃjÆK½m(%!eÖ Vܓ®®ß&óîÛ'ž œ–¦«äê*¸p¡ ïÞQïÝk]º´T]=WB"ËÅ¥äôéú7oº¾Ž¶€xxðeg‹JJbDD0ëÖ5›™Õçä ñyuÑ:ÞU³¶ PªŒêêÀÎŽþÏ?lq4 <ÖAhTUÃÝû°h¼B¤G'‡…K!î*HKBŽø€Ëopó+ɵ©0ÅÎBe `0áy/Û˜ÑÀÔÄD€J…Ô'0Akè] X·Ž±iCJ ¶oÇœ8eß}/4´KO¯îí[z{;óäIþÕ«¿4Bóá³KNîØ¼¹BV6{Û¶Ê»w[ôõ‰3fðge©Ý¿¯´e‹¨ŒÌwQ§88(¦«kÖË—­ùù‘‘ã'Mv—/¿ò¤fúô_À“'å •²²£“áþ?¾~|‚3l ¨Þ—@ÇGúäà€¼z…ÆÇ÷,Šóæq‰HC³¢‚ÙkP€HÄ44Ð+*ú䆜ÅI$lK ½  Ÿˆîºuªx<æÝ»¶úú!h“ƒƒ‚‰‰$//žýJ¬Qm$TU%«ª ÔÕ m˜ÓP¶ÈéæÒ-eÒ;ekÛåq/,÷ÁsbËý(/X ÆÏOܼ9Èæ¾éã%nɯaö ba”®Èî –MA¬Ä¶Ü©‰DÌ”)|ë× ûûË66j¼|©zà€ä¼yd))<‰„ nZ¿¾|óæraá,;»÷^^5©©£M¶dd°ÁÁ‚{öðÉÈ`“’¨-ÿÝ>ˆitfÅs:³Ï˜Ä-8ÎË ËdÂÝ»Lw÷Áü¡{ÃÆžÇ€™1¼| k6Adô`“Yêxd$Áÿ/ˆÇ©õöŸÝ™p/ŽÝ„ãWCn!¸ï‚­^÷ŠËáòQˆm6D?Eáð?pèhn9Yˆ¹ âbCïÕÞ‹3¢£Qnnض ãîÎî•™BAÝÝ›mÓÒÂ-^Ì“œ,¢®þ¥â;T*Z]­e`ðnÛ¶Š'ꤤðÖÖ|×®É'&*ÿþ»èرÿ™žþ†Úüùocc)Æ£G FŒ]½߯`€€ÞÖVbD(&Æ++Ë÷ͺñ£óà)))+W®TTT$RRRÖÖÖáá}ŒN‘ÏÐ{kIIÉœ9søùùùùùçÌ™SZú-h ‚¥ª æ&÷nFv88`xx (ˆ™“Óý…ÀÌŸÏ“šJ»|¹‡3 açÏ'¿xÑyùrŸ ‰„]²DòÕ«V_ß~JÝUTø¥ããk/]ê௿Œ+*Úÿøãy}ý€mw½ÑŸÖˆ, ÉÏoüLhIÇû[=Pƒ²/Ù0Ùk¶Y^axg‚Ã!'NŒÆ_»V³lYökðÂ9¶·0F,ƒ”GÞh})(( ©ŒaÙ[ØÙÉYM‹èêò¬\)xýº|yùØû÷ýüd\]%% ÍÍŒèèÖ“'ëôõ߉‰e9;—øú6s\Î>¦OçÊÈÙ¶¯ºš¹uk‹™Y}^^ÿ¡¬ÏóƒZ2F fûv̵k¸¬,ÔLJieE¯îÇǼ(+ÂÝë°p.ÄăãBØwèœôE˜êÁ3pT »Vï‚ p!ˆ_ Ee°fhÚAZäÀî_!# –Ìæ@†´« –¸CX< ǽàêàf£w²¾é¯^¡¼¼ðàÎɉÝËrI Ã̬Þǧ£´”¹v-1 @`qvvÐÔÄ8r¤VQ1gÙ²²ììN õôKJR~øPiÞ<2ÿ]X €ììvSÓW·oש©oݯ¯?bì BCË^¿ntr’áæ媮.Zii[{û·©òìè<8dž ttt¢££ÛÚÚÞ¾}»mÛ¶üñǽç }ñi¼­­ÍÒÒRWW·¸¸¸¸¸XWW×Êʪ£ã•µÀOB°ÀÉ üv÷Ÿ\\àà€€k×z>ž ¸ 4´«÷r¾`„…5³¬ñ Š@XXm¿÷nn \2$306–°²’in¦z{¿eçŒ^й ±q€¬ŠæÞ¹uÑ\/é/­ê€çáQqýí@É®ÀDí‹îÆÄÄgϪ‘ɸë׫ÿú«dðÉŽ:R7åÖБ>¿i,ƒÚyëЇç6Ÿ »wvÒãÙ b %%ÂòåBW®ÈÊVU»vMnùraBC#3³kÕª2…œùó‹7n¬¸¿•Bù{SÌ‘#¤ƒI22ØädªƒCùsŸåÞ–¥°ŒŒ—é&£óæ!·oãdd„táBÆ«Wì–d;ǽ€‡®ß÷ß Š=rö ,r„›çÀ{?0žK¶ÂÒípþt²u—1òHy î»Ám+œ¿ èjÂËØ·‰Ýbö(*7w¸õ ÝÙbf¹¹èÂ…ŒÇQ Åš™±Kbbb¨ 6µ¶‚¬,6"BÐÍí‹Ò‚uuô;«fÏ.Ú±£²¢‚¦¨ˆ÷ñ‘W9xPBJê? dApp•½}º¤$aüx¾+WÆiipêíÎ pp`•›6xyñÐÞþÙK|<þ|ݺujjjAHHhÚ´iaaa'Oždgß .Lš4iç΂‚‚‚‚‚;wî400ðõõís? ÁrvcˆzåCN+Wb´´__æ§ûï©S¹ìí¹rséññ=ìaêT’‰@@ž?ïC„Éóæ‰VVRîÞí§Ô}útÉE‹äét4:ºŸ ˜di)sï^Iqñ.Ƚ0ÚZ£²²|ýj23‚ì"×,i­è§òì”­m—Æ>Ÿudï¬9J ÔLJiý i!!šææ‚QQµÇÆ#Ͷ ǘ°ŒÓb}™µï@^QPUU¡>þIagÇÈÜ2Š‹ãœÏÏW/(Pß¾]Ôɉ, €mkcœ’šŠ›1SZÊ41¡²uzÝááM…€k kñ¬}ŠÐÜÜÜß®Ýà"À²¹P gþ„É“ kv¬)8¹CG~G]ŒáÏ0 IDAT×ßÀh.øµ.ûÎí)qÎõè ØÎ¨0Õî߀6líõìjjJõŠioܾSSc—]?ÞncS_]͘4 ÿúµˆÁð9PCãèÑZ…œC‡j˜LXºTðÁ¥øxqnîÿRÈêÚÚ«W縸d‘HXIIBJÊD9¹V`ËÏo}þ¼ÞÂBÌÆfdòƒ ¨H–“#±™Çø©€ÇãÙ¬FŒŒŒtssë=âææ1:çÅ~‚%(R’@¡ÀÕëÝ#††ƒååhtt÷];ÚÚøÎNôÊ•ž"$ tuyž=ë¸x±å˜“&‘ÛÛ~~ýôc±ˆ¶¶@zzÓñãCûåNœ(*'GJL¬Ü´éé“G5‚ÕÕÅ(-mkjêÁ¢´4ÇìÙ~Åμü9k¦é•Tæ†Ïö!ËÊÀøñäövúµkC„†„©©©Ð/¿H'$4oÞœ0[«'.½‚%ˆ…aÒ)7~x>Í–U««‹þôË‚XýBI‰°x±`x¸|mí¸½{ÅwïŸ0GFÜ4gN±²rîŠe·o·P©#ÓÀøû lÝÊ+*ŠyøbaÑpÿ~÷MÂçùAE‘±ü<‚½GÄÅáÆ ¬¹9¦« ÜÜÿÍd³üÜx„\‚)¦PY{Âqï>uë%%C¸¹à—Eð(þömÀbaÿiPŸ¦ÎpjYs#&âžÃÞ e ‹= -ɰÂÃÙ} À¡(7“ ÇNƒpsõ¸~ÔXúGd$jaA×ÔDLL0!!816Jµ « ݱ£ÕÓ³•Á€ xüüÈÃîìè`ž9S¯¬œ³cG•¸8nÆ þ¿þ’¼xQvêT>v>»ïññM&<ÏÊjçæÆ,[&¨ÁÃ3òæ3Å S^žwŽÇ#%%­ìÔ¿Ž ¸FçñehnnŽwvv^»¶c‡„„—””\´hQNNÎvff¦¶¶vï™ãÇÏÊâØówñã¬øÝO–/sSxô¤gÓš5ss$"¢gMX¼˜ÇÌŒ™IïêêYü\]MMyÓÒºÚÛû,;nn’ffÌòò~n;V­R65©­¥de ÝÑ~èÐ$]]Ñ÷ï›>‚-…EðÄ>¹ZgggC?Q´a@Y™ßÜ\ŠÉüøÞQ43,ØÏlâ+?ot€<‘h¼Ùséã$E ëOƒ ÈOž,š›ÛÖÕ5•5óæ‰:5fìXÞÍ›ß ˜‹BX<Ë"cÎ2N‹»Ì¬ÌyA5uÖ VB\aDZ>‡ðîÛ'ž–¦$wô¨¤QI‰—Gqt,RVÎÙ´©üõ뻤Μɞ.:}:—’væÌ†5kš©Tôs‚õ)?Øøúb}|°""ðàÓÅ…ÑÉÞy‰ŠÀ½08vÒ3áßÓ`í5•Ô´´Øè<:À³p¸ç‹g?W€û i–®pú ¼ú>eh´uÀØý/ȘÂH|Í ?6¸AÙS8´$Ù£8½Qß3À‰s (¶Öp#ØsI>uйp!]YQWGnÜÀÙËïÕÕ1mlîÞ¥˜™á¯_>„‹ ¢¢úb1™è‹aa}R""øñãù=j¸p¡ŸÈŠ€^S“œ–Ö8¤è(HJUÞ¼©ß²%±‡ß Ò¨Iaµ¶Òââ*ê꺠:ãMã´{Ý;ê”U¶¶]—jì±Kès·¢ªÊ×ÞNOI©»ÿK³„°nÌâÅ’õõ´sçÊüýŒc9È\—XFíkaŽ  Ê­î –Ítu–²˜®.zBÜ×ÈH)(¶l}öL%0PvÁmmnYYü‰õ::ù¦¦—/7ŽHêPBs玽=7œ?ß1Õ¶"·ê Ëœ~ Ö¬^ Á={††„0­­é5ªÆö ›…0èì‚ØX±’ž óüu5Á÷0T&éÝ0ŰHÏ…ûAkzw´éo_ˆ5ìÝPtvAæ;ŽC°h3é‚Ãjˆx•5 "fz ÏoÀš…@d[¡7^¾} hk‡. „úƒ×^`“î<ÈÜ¿ŸÑÑnn˜sçØ•cxû–¦§WOmmeþóyîÜaf¾ÒÓ;ßÍŸ_Ó6y2ß½{Š(éé ë_ð€Baþýw‰ªjrnnfÁñØXMMŽ;—ÙÄ«WT¥¥5NžÌÚ7ó%áŠ-õªnÉ>Ð{ý<öº²»û^×þ0üóAQE«««ƒ‚‚233<øiSDD„™™77·ŒŒÌ¦M›öîÝëéé9üWeüÈËv2 ÷‡ƒu+ÁÄnGuO”„¹s1¦¦HTT§±µåÊÏgÐL!•1ó®EÌö!Iõ_æéì,'+KLHŽ.ü'ô.âñô”;}Z-)©åÒ¥Ê#GŠûÅ Ëf™bY½iOƒ˜åÙ #KV˦Hˆ{ßÞ6Ší~,PP ¬['üúõ™E„…±( ÖÈÊf{xTé-,‚ÀºuĤ$aee,d:ƒÙç­ñrñ+ŠŽdw $!''‡¼}‹º»Ó³³ÙÍcZšÃË8˜ïb`ç~ðÜ lJ?|"ÌšQ~Póüƒ«#H‰ÀØê[¼@ÜÈ`â,˜¹Öì‚CÞ°÷$ì= ¡÷`åp\³×‚´15Áe¸üÿ\„ÄT@Q0Ö…¹vðê6ä?†=ëÙõiî'½Ác¼/ÒâÁ‚=3::V¯fܺÅCüý±[·²{¾Ÿ²qc‹„ÆÈˆ’"¢¥5-†ÆFÆÆ6TR%%ñ>>2òææ£ÅEFŒ3gʦM{}ölyc#Lƽycàá!7ªÝŽÑÑUÊÊ| È î6Ë)ÔÔ9yI|7]„½!&&¶páÂÀÀÀA Õœœ>éí ²Ä«êëëYbZ_?2ÁúpWúì5\þ¨£á8ŸÁé @ùXedg‡~\ª¼|ܯ¿ ëë±±mJJÙE©©_š7œ8Ÿš**«ý’õEe&a!~õãÇ#ϟ㜜0¯^¡!ýömvCk²Òèd8rìçÕ )F:8È$p´ÿ£Pž±WÁï0¬]º@&AKÔÕCd œ¿àÏ“ðçIHH¿P¸ýR3 ¢xà冹¶°ox€†Wxö¬ÁæÐ¨«‡Y.qOaÿNxr¤¥ØÚ±­ é.0‹ŠÐcǰ‹³{ù½p¡ÃÞ¾!&†jnNˆçøº¢pýz³ªjÎÉ“u))Û¶‰åå©­^-4PÈíÓ¢õ}¢¬ŒrèP±¼|Ò¯¿æQ©Ì‰IÑÑ""´FÄg0™èÙ³ùm#›eeþªªŽû÷K¾M–ð»ÑÁúzzz5ÇÒ{Ë4hhh¼yÓ'`Ÿžž>nÜ—ýÚ¿ ?2Áú„;±Ýµ·ã5Ag<46AôG §yó0$¤¥¡ï>†„…1Ü \¿Þ“%äãÃÌ™CFQ écÞ‚ °d‰$„„ô_´j•\»VÂŽøäìÙJNNJ÷î=úziüŸZîìcU¯_#6.CºhþBqs¬ˆOÕ]¹ƒâZNŽ×ÈH˜›óàÁ𳄟‚,_.ªÉË‹MHhúå—¼º:Ö‹ƒ,µ7 ÀZ³ŒÓS®3‹ß€´ yì8Ö±§ñïÛÚ¾¶õÍpq!  øû˦¦ªZXðâpÈ;-NNEË–•%%}‘‚‹€BVxÅ28H~°7ÄÅáìYì¤IHk+,]Ê8s†]Ž…ÇƒçoððèëBÊK1g8ë;2R¢ª °|œý¼÷CSÔ¥Â-¸å gÿ„…ðÇøcÌ0‡óá–7„ž†¢8èx Iazvÿ ¶“4‘š‡±à²"¢ ¿"‚`×VÀ³·TWƒ»;£±„…áÖ-œ [Q…C‡ÚÖ¯o¡Óa×.>//~..ŽÃ3EEÔÕ«Ë]]K„…±|©©ª"||ƒ]ü1{þ†hog„†ÖÌûVE%9:º®®ŽfhÈ¿m›|Hˆ†Í×T$&ÖUWw))ñéëðËáp55&ÍÈø–5Cß!’’’ÔÕôX»~ýº‰Iw󸽽}@@@ï­3gÎÝó?>Ár´†œx˜ØýçúÕ &>—ºÿ$á×_1øû÷lÖ¬áQRž=ÛGRhõjaUU®sçX²K–HNšÄ^[XØOÔaÆ ÉE‹äóòZCB†Îâ!üñ‡‘‘ÄáéññšâòË|Áú¢FÂöšêÛ7^u°ÂÔæ 4GLs¼Ë­ûÓOøEÙ­vwW&°¾¾#š5K46VGTþ|ùĉ/^¼`í!Xj*"êÚ‰ômbAÑOA¬©vcXƒXTFü“oÄê‰yŽ“*(Pß´IDW—çòå“w66ï““‡éÛWÙTTÛÚ—y£­f"›»óð@p0vÿ~¬²2Ê\µŠAe;ja÷o€ã À`ÝX¹ŠGZQYXtÆ£5¬]«ÀÞ °wØL†UÎàh “&€¼4°o5Ã::a£'ì>é™`oÏc`&Ûe¼yy¨±1ýÚ5¦„’’‚31a‹$uu¡ 6íÜÙj`€÷ó#ïßOâÔJEáÒ¥-­<_ßú)SøŒ‰QÒÔaÙ‚ÑFQQ—¿¥½ý‘„S§JÃÃkôôHjj¼ññº))z³g‹b0_INâêÕb2¿v­òhxZÛÙÉ“É\©©ìU>þ °±±‰ˆˆ¨©©¡Ñhååå—.]Z±bÅáÇ?lµ²² «ªª¢Ñhïß¿?tèÐþýû?m]µjURRÒ¡C‡<øAþÛ½›Ÿ€`h~Õg@C<ˆÊ•iÓ0ÍÍpå ú©ÃÜÜœ‹FƒwïèII=Kо>‚^U•pï^Ÿ]@§¦ÆË` /öS|Á bÍÍ´ƒ³†¬^€±c§M“EQpwB¥ö6øŽš›Ó щoo¬Š [‹sCsæÌÆN~~d×.¾åË9N~Ríí‹V¬(SSãš7|õªì¼yìµ8~k (dg·ûùUìÜY¨¢’¬¨˜äë[q÷n=•ŠŠŠNž©}Ⴚ™™À×<+VZ_OµµÿA(+“››) ÞZ"¾›¡§§g@@À¸qãˆD¢¾¾þÝ»wÃÃÃíìì>lݹsgPP¦¦&‘H433ËÉÉyúô©®®î‡­$)&&æÅ‹òòòòòò©©©?æåܨm ÿÝk@¤¢]øÔ7“ Xç¯3`þlظEÁÑ‘QV†þý7ÖÒ²ûÚwèP[t4eüxüéÓ= gÏÖ‡„4KIႃåz¿JbbÓï¿R(ŒÄD=,–õêI¥2ííãkk)ŽgÇ”BaØÙE65QœU·o×ý|BSñ{_ã ½GxÅÄצqÜÈ^šüôñ®mu9™M@0˜±Nó§ì9Hf¿Ì/¿¼|ó¦ÉÅE~ݺá”?}útT•ʨYÆ}ÈNgÏÖ;PUÙúïÑx–/¿¹¥ò ¶=çFMM Ÿ†ƒ«µµyJJ¨öö¤½{%DEÙ­n>½ámyŸv>žÚE9Ñ‹ž?§-^Ìsú4™ÍܼyƒÎšÅaaÄÛ£¤ÄEÈÈÈÐÒÒª©…õÛàùK¨®†ùsà÷Í0æ JË¿>ZÛà÷}ðò5àqÐØ—ÎÂÄ Cïõ L†…‚Å"ÁÁìÊ1TV2çÌiäãCòòè7o êèp¼X……5¯XQ¦¥ÅUXHóö–ž9“3£˜Ÿ§/:l´¶2²³Û :Ÿ=kIOoÃb‘GÀÒR0&¦QH?{¶¨‘¿½½ˆ¸8aÈ£¢£+ÿøã­¬,1,ŒUÐxDPPмzõ&=šùù:„ƒ•At@‰Ã/b?6Á?~KR øˆÀE€ÈuWÖô.uÿ‰  « iiè¥K=!œ¹s¹Ÿ>¥úûw´µõöÒxö¬=4´¹´´Oé±±€˜¡¹™qï^?7øfÚ4‰×¯›þù'—æâÂþþûÄ–Zxxa^^ÓçHRÒHßÚÔöÚ:…ƒG[ueÔÆ5!óìaWÚ:.·N?á3lv––bIIuEÃÛ}ðB³c‡|h¨™ŒËÈhÛ¸1ßÃã]S¸p˜•3&úàìXv¡§Ýe¼K I’†k%VÒÓ¢¶ÖoÄúìöí¢……ê&pËÉáÏžmPUÍ=z´–"*ƒ’WÅZÉç±Ì|åJ"ŠÂùóŽŽ --ì^û´µ‘ÄDœ°0’žÎ44¤÷vIrrr & !—àä_ 9BoÂxØsÚ‡™öüÚˆzZFpú<ƒÝ4xÇ»:wŽ9g££dd8»ÊϧÕ%'S)49Y˜SvÕÚÊts+]¸°DA/-MÈÈPå”]ÁÇÏn4ÐÕÅÌÊj¿u«öܹò•+s,-ÓÒùùã SOœ(=q¢46¶±ºš"-Í5ož˜³³ø‹ú55¦¾¾ê+VH}CvOžÔææ¶jkVØLY™L$ââãËccGÌœãÿø¶øñ ¸:B}#Ä~L˜Ì˜2RÀÃo³»G–.Å AUúIkÌÜܹܓ'îÜé!.BBØY³ÈZZÜ}ÊÀŒŒø»ºÐÛ·ûÏ ¬Z¥,,ÌE¥2ÓÓû!LŸÃÚZÖÜ\ºªª}Ïžgt:kæ‹'EúB¡h[%[e&ö!'˜vm „ –—lù§×¢;1’:zìsLŸ.%%ÅÃ!EE£µ¢šš’ß¼1سG!%¥94´fìØ”3gÊÚÚk¦(^ZÐ ¬ñajèžOlìÔXœØiTÆ“˜‚Q:ÏaCDwê”´ŸŸì¼yäæfFpp“†FÞýûC¸*eW¼¤2úE^.’’¨¦«+OR’°¬,–FC§L©ÏÉa·ÇSJ nÜÀNš„©¯OO†ŸßÐeïdrOBÊÁî…Â9@¥Bx¸¬„à°ï:cXZnîpü—Â-¸s<7±[Ï( {ö0#"P¶oÇx{³+võò%mÑ¢¦æfÔÀㆠ¤$gudii&&ïÛ¹¸Ñ9aáá:ôþ솶6FZZkPPõEÛ·L™òJV6qÊ”WÏ<<òÏŸ/÷ó«ˆm,/§pqa´µùtuI‡+GEiß»7¡¬ÌäúuÍÕ«¥ôôH_Îtv2ÒÒxyq ÊÞ«è鉩© DDÞKôÌè<~züÿKhh†+· ¿€@€5Ë º¼/vOPP@¦NÅÐépëVϲ1cwTåÌ™>\+V¾~ÝyâDËÚ°|¹dCÕ×·<3³&A&ã—/WHH¨=vŒ­ üó >$äÝáì`ЯJ %‰ñþSMcþ𤶵õ;E°OÛU½îé®\‹ O"º/ˆD¬……ØÓ§u_n›3xy±þ©ôì™ÞÔ©Bµµ´ÿ-•–Nܾ¥`¾±ÖYÜ –ÉôŒ‡Œì8— iiV‰õ´¨¹ù{´3†ëúuùû÷……±ùù[Û÷®®¥••Ò£ô2Vk@ )C, ::ø¸8a<IK£™˜Ô?|ÈnÐŽÂñ‡c““Qæš5 Ž”®„…Àï4<C}¸s\V‚™¤Ö/ûmÐÖûÿ‚1áÊ5ÈÈŸãútµ‡Þñ(pueìßÏÈÉA¯^Åzy±K’?¦XXÔss#ÎÎÜ11œýÏŸo˜2¥JEÇãJMUuszŸ‘•Ê|ó¦íòåÊíÛ V­ÊQRJæç[¶,{Ñ¢ÌÝ» oݪ‹k*+£47ÓUTx¬­…íì„ÏS»BX˜f{»ùë×gϪyzÊÛÙ KK±ÍÊH#"¢üÁƒj99¢ŠÊûF÷Æš5-ÞÞo ‡öÿIFçñÓã§ X¼D˜c Ò­íŽ3 °bâ ëãb:}:òä ÑÛæÎåæçG22è¹¹=˘•I^žPYIú´‘À/^, W¯ö¯J°n*™Œ¯¬ì,+c«÷žL&œ9cŽÁ ¾¾™ii¬"[Ÿ7¶ ÚHØZYµqÍõùõyö ÊL2¹'´+¢Ù^RžsÇáì,hq3222ØŸ¬£CòóSôh‚„¡¥…~òdÙ3ÿN?̬F„õ‚H¹¾ëÓ©6cX‚Xt:3îû b}´i¤¨(ÅãÇ¥H$LYÕÅ¥Ø×·¡ß8PÆ 9ŠŠØÁY³¸˜;w¶^¼È® Û·c®]Ã>Ž^¸Àüõ×6al~§àÒY‡”°r=¸¬‚¬¿•_4œõçeð (˜7 žÇÀ꥜u#ÖÖš5Œ  &??x{c]\ؽÆ^»ÖµfMKk+ªªŠ;}šÌËËAئ¹™±vmùºuå--ŒÙ³ùÃÂÔÕG£ (äævTíÞ]¨¯ÿÂÈèåÂ…o—-Ëþë¯â»wëÞ¿ï$0$vÞ<±íÛå·m“{øpBa¡QF†a~¾‘Ú¡CÊîîÒÓ¦ ))ñ|1ªÁqï^%¸ºŽbø $$ˆ..ª óÌ.},¨­ýF††ÿÇgø)¬œ’¢p&>Ègjƒ¹³ ¯"£»'89aôôˆf^^÷zÅË‹lØÀG¥¢.ô,? lÜ(‚ÁÀùó¬j%ë×K+*òœq ’öÖ¶ƒ”¤âï3ˆõx<²q£HFÆ|^uÕª2;»÷%%}j[Ë«[úD4@´d&õ!‘7ÿøƒTSƒ®XѼkW+û ;ggLl,nútÌùóŒÅ‹99ýï9X%‚€ÛÈM¯½ &Á¡ e ›wBú€£ |`ö"X·’Ÿ‘ÏcàúeZ? ?51¡£³gcp¶¶ìò_ߎeËš¨Tt×.’¯/y(™¹>ÈÍ¥8:‡†6YYñ††Ê>,9 ­, "4š—×qútÙܹS¦¼RWOY²$ëÌ™ò—/[ùùq8ÆÙY|ß>¥S§Ôrs'µµ™'$L¼~]ÓËKyÅ )kk!EEî{çRŸ£¶–T¬®ÎÿávqT±k—¾¶¶È‰oÒÒ†cƒñòe­A(¼ÿuc`ÿGøY–±.ø ´|¼n˜M®|d||0a‚¢Ð»¸dæL®ÎNÔß¿“BéYBfÏæoogÞ½ÛÒÔÔGë\MWQ‘»½ÐkÑ"y …áçWX]Íîú½eË„©SeoÞ,Ü´©ÏõîsƒšÖþ´F Þ»h®ó‡'m€¢b ¯»Â}E|ªÆÜ…­môÚÚÎæfª˜ØHª! QSS‘à`޳„Ã.11!_¾<îêÕq¿Ïsjõ8uw´·3`ª‹ˆÎ|™õ'g IDATòx·¢oyyB` ÜñãR¢¢8 …©¥•ÒSøº4‘e¾¬°ª‘µYA`ï^>OO^lÛ°¡¥÷÷|p!gÏb¦OÇ$$0 èQQý”d Þ£ÀO‚-ë!ðÔÓ§¨¡!=?íꂳg±ãdzË$Žk[µªYG·aïþý|i,EEµêéåÇŵ™›óž9#3wîÈ1°|v ×xà@‘¢b’•UÚúõyááµIIÍŠŠ=ÝàÚ5Ý»æÌ3†ø_äRý"4´”NGUTøDDF=塞Ìoe%Ã` Û·'wtpfƒqùr¶‰IxQQ+pqqwÅÎã§ÇL° ËTv]ë&!8²ûÏ…sÁʲr¡êcòjÕ*Œ¹9…~ª,Ñ×ÇÏ›Ç--¹w¯§NEA°aƒˆ²2!  ‘å7l™ÃI“Ä##‹¼½ß~ﯫO«©¨ð†Ûü›K4 tp9c3· –ûŽH$((hš8Qtöì‘×Л9SƒÁýMc#ÍËKÅʪŸ Ó/ òóãKJÈdv[’BCßÍŸŸ››”4GGGªÒRí­zÏ!ðòYî?2Öi>“Îxqöøó3Çnà“2Û±GcîÂÞƒaagÎdhi <9™ÍccÆDåç·>ybin.:âÍ4µ-·ãšVK¡}²ºoÇX=>‡Ábx¸ËÝ:Yjú)4²ˆ¸Œ^F†KX/"B‘áâãûN—«W›~ù¥\G‡» €êE<¸x6•ÞçÓÿ}†·šÄ`1™¬,ú´i åå \T”œïôøq掌±ceeäÒ%,ßp‹€kë ä<UÕ€  ¤:ãaÉB°žÜ#§=þ¾Â#!0ˆDH~¶Ö°e=X˜ ‡WÛ¶1þý—© €¸¸ û÷cÙìa0`ãÆæÛ·)55Ìk×fÍâàMvu¡+W–^½ÚdaÁ7cÉÃc„VÙÙí~~•AAUÌÎN&…ÂTS#.Y"im-0q"ÿWSNÿPTÔ®¤t‡HÄUU9òñ}%Ö—×dmQZÚ¦«+9c¶TSÓyîÜÛ#G^uvÒED¸ƒ‚¦M*˱VöÐÓ†dìÏ®ƒõ#,@Ät ºs)ØN˜¾šZÀÝÜf܉†M;@_‚?¶;Æô÷gZYaþý·ûYYÉ40¨SUÅ^¿.("Ò=H§£yââØýû%ÌÍû¬'‡UOž,pö¬Z¿§deõ¤£ƒ¾p¡Ü† cØ#k×ÆÝ½[¤£#rñ¢½<'Ò}IS¡)>q h«Ðþ‹'h»-7Û¾ÿ™¾íþý©‘‘ïU<<8ÏŽ …Ý»ßFEUØÙI8ÀzáàB£ìc׬ú[Çþ¢_d¯˜”Ø6%/¯£½¥Œ‡«ðƒ—®ð46!ÆÆä¤¤fÀbŒˆ^NŽ›LÆIIqIKsÉÈpÉÊrÉÊrËËsssËxpQméÒÒ„„6S‡|‡¿zoâÁóžq}€Å ±6TT0fÌh¬®fއ;tˆd`ÀüRL sÎÆÒÐPì‡'Ãûøh4ˆˆ‚{ár0™0Ù ÞƒŽ6ØYƒÅdPW jmƒç/áþc¸÷øù¡¶ò AF œ`õÒ/>mh€E‹è”„?Ž]·ŽÝºº6•—3ÐÓ§ÉVVŸªªèsæÑéhVåʹY³8–¹]]ÌÈȺóç+^¾lhmEètTM¸r¥”°†Æ·TÄþ†8q"/(¨xÜ8þK—8³²øB””´NzEQ13“^·NküxáO[ÛÚh‰‰•¹ááZZB99MvvògÎLåaþŸ`~|‚“ÐY“áæ€ Û°h3jCJ8²ÐØIºõ««AF††Á@e%^è£›ç† -aa›7óõàÿùgõÞ½Õóç „„ô)Ä®«£ÉÉ%R(hNŽ¡ªj?ÅLVM›ga!iÆËËîýPg'cÙ²Ç!!ùÓ'RlZ ¤³08”­m-öy È+ö»U_?45µæþý™Ó¦±VÐ923›55£ ••Ž\\_›ˆÔ·QÕ·DÆ·ºË }ú11²Z¼^¯ÁÔ×µ=ü„%ƒ‰#5¶sscRS[«ª(t:ZTÔ22\ee'TWS?='ŒK”àÒÔä7ŽWCƒWIé«–ô2èéÓõÁÏþU³zÔ{\OÁb½•;GhnF=<š< 640ƒƒ8ˆ©äå¡nnŒgÏPÌúõ˜3¾ô—WBp¼Í‚€k€¢ÀÅD0Ôͱ ª Šò %ÂB‘ OŸL1ƒ‰ÐÐõ ð¾òÞAmÜ Y¹ ¡Þ]D// ÎN`dÓ§áËRj¹¹¨£#CB áÚ5¬±1»o¹­ =»ñÑ#Ѝ(&2RÈÐ.›™ÙµhQIs3“— –×Ò™à^]íôé²èèúgÏZ@@÷Ë/23gŠŽ{û/EAS3šŸwèÐx ‹‘l¯fÕÕ~~Ù;wvK8ÊÉ‘ÄÄxˆD\}}WNN£”oii‹¸»k¹»khjöøOsL°FLjQú?Áú¡ß?‚ xSTZR|A\:»@Úð8ˆ½ ãTƒãçÀ}9ìû½{wwÆÛ·èÊ•˜¥K»y@TeÆŒ†©S ÑÑŸ‚ÿåå4…99|R’Џxž´jUŽ¿åÎ üÑ?•qvNº{·òر kÖ(³ÿ^**ÚMCœ»cÙ6„ûyE‹}^ÊÖ¶M¨¯ïÒÔ nh 46®$G% ®§÷ /¯-(h’½½Ôhpl}[yê_úy–qž¡8ùôúå‹>wX,²u‡…pKnkcTWSkkiÕÕÔÒÒ®–znnGI ‡Cš(¦ª*1?¿””¸ »ll„)†¦&ßĉ$}}þ±c‰_!·²ñÊÜ&jŸ‚¼å¦¿›«±V¡ :ÜÝ›ýü:ÔÔpžž|K—ò°ÿÒÍÍðûï oo¦ŒLw²Œ£n¸PU Ñ!ý-\¿ å• -åü$hià%B{ÀÚ•pÎ@Y ŠT•!¿0Ò#°±CôBÁÍ›ÌãÇÑøx¦¾>ró&Nší~æ&ææÍ-ôÒRÆýûBÚÚœÍãÇm‡UÇÄ´;:òŸ?/#&6ÿß’’.ÿª˜˜†'Oš`Î1{{áùóňÄï4!þ5‘’R?cF<‘ˆ+*²ÿVZoÞÔy{gfg7ÆÅ•€€×‡¦rmm‘Å‹ÕfÍR”“#±ìÂ1Áz?²§üñÈŠÿ'X?ôûGdzá6üµ<\vÿ^>°q)ü½ 3,€F‡òàለ`º¹17oº/^L&X[×ÇÆR>²¶îQ—Y»¶üüùúC‡$·oïS‘™Ùfmýº½QZjB&÷sŒ­qvNBQxÿÞž£¤þý£g2Žÿ>ô¼^Àóð®÷Ðs_ãìN÷Ò¥ì+b–,Q¿tÉji_Ÿ‚ß~K³µ•¼qcTœ¼G]uÌ–»ñ-îòÐǬ#=Ž÷¯ @0õu{Å2}~†Frsægçø( UUÔ’’®œœöÌÌöæfúƒ $ƒAÞ¼iUUžº:𙙀•• …… –Ö¨ÈÖ¶Vl¹>›eðØü{E×qð`û™3í**Ø©S¹víâ ¯ E᯿˜W¯232PWWÌÁƒ9¹‘\–JË!3 ^¤AatQàuÔ7€ ,˜ 1–ºƒ ¨*77¨«‚æ8§ºÚÀ5r²Pt:ìÚÅxôˆ™—‹#ÇŽáØ/«©aÚÚ6¤¥Ñœœ¸áWQá€Ä\»Ö´dI)‹,[&tì˜$7÷—þcËÊ(]¼XI£1 ùEE [·Ê}eåïkÖ¤^¾üþÏ?5==¿±K)ƒµ46R:;邂ܪªäAúÿO°¾üøëV:k;ŒW7Wž¿Ã9 ! ¥ ðáöz’5• ²²´šxþ§¯ß} ;p m÷îÖ… y‚‚z®>÷îµNŸþ^U•+7We²²J‹‰iü÷_ÕM›úO·™š>NL¬;zT{ËuößNèÂYÅñ±ìÏW¶¶µbq„æfú›7m))Í©©­Ì;wê@Cƒ73³]NŽ{éR KKA33 k=Î H:Ú{¤©\Zºê”——??g‰ÀÀÎåË›h4غ•ïàAGQŸÄDÔÑ•ÅäâBüüp3gþ85Ñååè† Œ7PQQسûë¯ä»ËËsç6¥¤PÕÔppÖIpâDݦMS¦ð½¼$¿°Õ·¹™îí]~áBEy9…FC,ÿýw¹qãøzMh·œÿ4ºº’’MM´¬,»±cÿK©RŽ Vñ蜆üÏN°~d™†°3{hh…Ôlm˜?xy :¾{ºU`d±ذ£§‡\¼ØÓ¯¾l…W|<µwû´i|óæ‘%%ñ²VDyxÈ™™ \¸P10ÁŸjNž,zâD^{;J'u9YlÎD°¸9WÂfû‡°Ã®JJZ33ëmläfÏVbÿd8…„÷ŠŠS¦ˆ}ÐDf#È®`Ûô17¸­óÖ%5|/0è`m3‹íó‹`0ÐÇÙÕÔød2nòdmÛä¯_׌Œ_Rb0ÎÞ^DR’ÐÚʸ}»~Ê”4™Ä͛ߥ¤ŒŒ*`FY ËHG™vxx“…Eá»wlõ{‚«+Od¤ÐøñxŸö ;:8¸Pš˜ ÷ï㌌Ú451ŽŽô]»]ÿÕ‹¡‹Î˜ÁxûTT7p±«Š †MƒbhˆfŸ]¡(üö[…‡Gå¤IÄyóŽù"vÅd¢W¯V«ª&ïÜYˆÅ"îîÒ™™†ãz³+()Eo«ÿ nß®àqu•ÿo±«áàÿV9£ƒŸ`ð` ‚pùn÷ˆ®”À¥ðî?gÛCF&<Œ…‚aÒ¹s1©©hP³ã£„»´4–›ÊËW¯ö¸`±Èĉĸø¶S§X­llm…qÕ½”••8“‰–•uúøp`ÌÒÕȪ¼50Œ¢åT6'_¸UUÕ!*Ê#(8ºö“& ß¿_åë;:•CA‚̽ÔLé(v.Ë8³*Ÿ–‚‚ã ÙpݺòË— ÄÓSì—_„‡Þg`¤¤´èë§.]šE&ãLLÈÁÁÿþ«ª¦ÖO€VK‹ƒnßW®åä´|Ñÿüÿø™ñã,˜m-ð® (4€%N ,M-PSÀÇ ç‚‘ܸÝ=_M ±¶F&L@nßîYV¬ ŽOLìcY³b… ¢"¡½QXØ'<€Á ææÜܘððí~ÿ}œª*_bb]S»–¹Ü‚캷r = ) •ãÆ ­^=ŽÍ]†9sdUUI(гk~7²Ø>cÌm.ó\„•EQÃö VSUY‚XL&ûh„…Ý&N$mÝ*—Ÿoôò¥þ¬Y¢RR\yyaa5rrIéõï088r«Òºh}lȸp>ظih@/^ìY–-ãáâ‚“'Û[[{¼I“ˆÓ§ó'$´ß¸ñ?ö®:.Š­ ¿³Å.±,ÝÝ) ¢‚€€¨ è 1¹&b¢^¯¶×nìn1PÂEDº¥»wa‰Íùþ{‘5` >Ÿÿ0gæÌ™Ù™9ÏyãyyÍ-Ë—+‰‰á÷ï/ù Kù),-%-Ò|ó¦~Û¶E¯L™NQí>¢ªn8ez·»ÅÅUÍYW×v挑ÑwŠ3pp56}ø°">¾¡Ûû#DYBpº¥ò§F,´¾”ùìP(¤!¼™ÉïÊkú͈õ1ääþþj÷ïŸ>­ëâ"ÙÞΙ;7[W÷õ… •_w®5´Ô”Sy“­ºhOϘA¹sGeÈÁs眜 ««ùð÷‘ÉÈùó”Y³£¢ÎÎ ·ow¿$àÉQprÂddà/Ƥ¥¡»v¡ææìøøŸÔ”ÅfÃÁƒ\vj*ØÚ"aa¸³g±"|úÓdˆÈ©Sº›¨©õ”¨õm~É/‡ØØº›7Kètö˜1üé›üÆo|ŒL°Þæ,< ) VFÀæÀ¥Ø€ÎP÷ cE!8¤CºÆŒÁÒhpáúßR[[7h¾¹½v­K¤Ë‡ØˆS§xƒ’’€­-…ÅB-ƒ/`ÉM,9q"¿¨¨ûù‹'¸?Gøj±7–Hœ´Áuó9/™3çi{;ÇËKwút>Šö|#°XÄÎN._.ún'åÁÝœÅ;„·B óÞv”Ñ öŽZx|—õ—‹F>ê}:!¿ÀÌ›'÷®ÑâÅŠºº‚ùùm–::&GF~1ËáSó•ò’%B zìX˹s|ÒQ(pô(öêU,‚@r2jeÅÞ´‰[SÓýß11èĉìåË9­­0hrù2Îٙﴽ[·Ú&Mj”’ÂøøíÜIÆöx5_VÆru-LOo70 :$¯¬ÜGK{;wçÎâ R«ª˜¶¶bhÍŸ/ßçEÜ0Î+''Y<~ O‘¿ÑßÈO¨Àã$hnðž#Á‹ˆÌó›¡òL5˜7”•àú¿”køpä?0$„‡w®³}|„†'œ>Ýej™>2v¬‡ddð.ëW®T¶¶¦¼xA¥Ó?ï10õõÕÖÓ#ûûgôä¢dŒM¦Ü Sû¼ášA’‹“_?suÉàÁ7ŽM¯®þ̘“Cõðx4vìee‘¥KÙ“óö!¼¼T­­¥>¬`0~LÀ³†´Ð å¸OŒXÔJVdÉC,y#±’“*ª*›á;ƒA<<¤ÓÓ-.]ÒÅ·µ±GNš0!õýûÏü¬©e¼ËXÑê³Ýª«ž?×Àã,±´Ì{ù’I $9Bær‘yóh¾¾M½Æ··Çdfâüý1ÈÞ½ V@ÀO¡ãPV†zyq¬­Ùµµ ©‰DDàΟÇRø×Ý<~¼uêTêðá„qãˆ{÷’{ÎlJKYŽŽ…ââØáß?W—“ë »ÊÉi6ìm``¡½½ØZ‘‘ƒUUÿ¢ˆúÍÍìÇ«ll¤æÌù|)Žbÿüýßc ,-y€Ò:¸ñÀÞòË!9³Lô ¹ JáÞ“ŽýG€¬8s©³ $?=}º“¸¸¼ÏNH`ÅÆv.ý……1êê„'OšäMÑ27QQ!¾zE;uªâKãôñÑľySŸ’BíÉuɛ̎zå´÷ˆÎø‰Z:xI\S[ÇÅm̾£«R“]½••EP–.–—??tèíE‹¢ýýãwìH\°à¹Á5ˆ[·Þ“É„1cTñýë? Dinf˜ðð/Þ“è¿@ .:O°æ ¯éŽyÚÞ v£yX(ŠF}ƒ&V¯Å"žž²ááƒÆ—"“qlCÃø-[ ÛÚ:K—Y™ÈsàXŸBZ¡&'‡ohà,YRŸ ×’%B³g“°X8t¨eñbë Qïiii_êAP°¡¡ØQ£:¹“&±/]â~©«þFE,_Ι9“sé—D''$3çèÈ÷«¢°u+}Ïž…‰‰;wòáV,(`Z[çgeµÓéèƒj’’½)ƒRgf–œLWR"îÞ­åë«Ô;ÃÕW~»ë×KJK[ÑÒúeùß„L°>`ˆíðÍGæ) IDATæU§¶1»¸˜p$Y“¯t($„¹wOÅ×WŠÁà®YSñ©ƒûë˜=›..-)(àÚÚ~^"KY¹‘[MM$4÷ø1nâDLDzäWO}é—Ñ{-0¾Q\Œþý7GCƒ•€¦§£óæa²³q›7ó—*ø( +V4…‡38ôÂÑåËùÈûËËcŒSH¡`ÍÍI!!ªbb|G³Ùèºuù~~ï „ÝÝ¥ããÍMLz_Ž©ÛßnãéÓê¡C޽ûQuù7þO0ðKåˆNAi-ut!½Œf€¨0T<A"КAn0˜Pø”å–­…Ã'ÀgÚÕу»;çömîöíØõë;Èh~>GK«FD)-•&“;ª‹KÑÇM[·ÊnØÐ¥è:ŠÂ AñiiôÓ§uçÍû¼Bc#SK+´¾žyÿþW×—í­­ì´´ú·okêêÚÅʼnL&gøpY33éX@£±ääî3Ü¢¢ñJJ½,DóȬh2ú;ò!sãnç,"H:TˆRš›;·F±˜]|»Æ&rž³¾SÆå—ðêÍÇ'—DÂÆÄPÝÝ¥×yZp",õÒÇû˜(Xá°·'½íÙS»fM%‚Àöí²ëÖIwÀGHIaÛXQÁÑÓÃ…†Š«©õ2qˆË…à`ÔߟSQr¹@"ÁÂ…oo¬"¯`Y_"1Ý¿Ÿ{ã×Äy÷õöÆ,Y‚12êå’£½fϦ޸Ñ&(ˆÜ¹#îäćŽuNcôèee‚¨(æÆ ¾_ϲ²vŒW¯h˜3gtgÌøšÝK$'S~D¡àËË'üºå®ù.•Ã_•‡ƒð»TÎ@ÇV A†o ÕÁÒÈBö @T–΄á¦^Âù^€Á@zü2>‡7o:Ÿ ìŸ *)aîÞí²Ðöõ•Äb‘¸¸ž¤zõëUp8$<¼áK•sÄÄþþ†8rñbÑ— ]½€  ÎÂBfÉ#ÿ!>>F«V™XZþa›¢¢xy))ò5}yòDS¹-Øi<ÛÑV*+∈ ³RáiMKùaF¬ÿ0l˜èë׿..$æöíš¹s³^eóúR¾èäÁêÕRG* 5bјáû@Hˆð©+=µ²¢ü±>@KKðüy=3ÇB@º°T²’4™?ïš›åÔ)E süxýªU|)È“ÉȾ}"D:8±áÂ…Ž$Ç^ç(X[#{÷bSSñGŽ`=<0EEpã×Ó“£ªÊ;–³lçìYîë×hÃWÃÆJKÑÈHôôiîìÙ¶›kÑ"NDš›‹:;#×®að۶a••¿) 1+‹íâÒœÌÒÑÁ;G10à#2½ €9iR‘–aøp¡}ûäI$¾¿Æ'N”OšÑÖÆ]°@áàAm ‰>3ü ž;WØÖƱ±‘VWï½nþoüÆø1X(Šž|ÇÃ@]‚×üuîFäQ°m!À‘‹púèiÀµT¸{Á»THŒUe€ÊJ˜6žŽfdàed:z>t¨åܹ6UUìÝ»õ©TŽ—Wi[ºoŸœ‘Q—,U:3kVfnnëÚöö_,)èãó.4´ÂÆFúܹ¡}{+~BìÙ“}ñb‘¹¹øÙ³?ìb‹¨C6GÝfnsà¾ûx;B:¥[Z˜;·D1]r ŒdgÍ5ÿ¾#ý"ŽD­O(Œúx‹ƒÁOË•½èêÅ‹–«1”DÂܹ£J$òA>P¶l¡GE1i4ÎС„#GD{'þY¡wï¢))èµk\ $;­­ ‘@Z10SSäƒÐ”¦&²w/·¶(ÈÈ@@_ÉÌDõõ † CÆŽEÆÇHõQ˜ÈHÆP54°â☫W)’’|0¤‚¦­m>‘ˆÑÒ"\¿®,,ÌŸCŠÃA—-Ë=v¬|ôhqggñ•+ÿcÒû L&WK+LQ‘´y³¡½½L÷üÄà7‹‰ö‹?€°6Áèß‚®C!£ÆC `¬dÃÙ‡NC7'HÏ…{O€Ú@99hh„³—;—“11¤¾.^ì4bM›FÊÊb?xÐ^\ÜM¡`ÕÔðOŸ6ïÝËk•Æš™‰¤§·lÛVô•¡úújWV¶_¸PøüùO&¿Ø˜4I1#£éæÍÒ¦¦”`¦Jq4Ù‚›ŠB2¶Ó™¡{áƒk¯+3½ª´¤Gšý —“QžÀ³ñÅ=ÅÖÖÞDòY[ íÝ+›žÎovs+â«M›„—-ÌÎæœ<Ù:n\•Ú7ßVUUdÅ ÌùóX ¿cvófÌÔ©33DK ).FÃÂИ40È}û–›œŒ–—£ - ÖÖˆ½=räöêU\q1îÖ-ìœ9}Æ®®\iuvn R¹êêØ{÷ÄøbWEEL[Ûü’–´4îúu~ÙUSÛÕ5õرr ³h‘ÂovÕ'¸v­¤¤¤¥©‰õA ùÿ \ÀôÇß¾¬ÿ ÌÚ%µ0y8,`ï8 ¬œNC¦ùBe-Ìœó<^ÄßF%CØmø°2G·lሊ"aaØÿteæÏ§å糉~~ö䂦›[±¨(ææMYÙ.þ‚¦&öÈ‘ïÈdÜŽ#Fˆ~iÌéVˆ‰á#"F}‘ªï ¸úz¦§§ÊÔô{õ¾ÁjÛók¬]ã¸ñ]$áýï1ùÖæŽOŒXú2³çù®ýrª’·‡.øx ‡…£…(+áÞ¹cÜóÒ(#+‹ao_ ©) "‚\¿ÎwØõë×,7·]]<™ ;w’õôz£çÔC II(……(Œii’Bˆý¦sˆ¢Hù’ùîËË‹´?ÃÏ*-e]  €c2!<\ßÛ[SÜ3'‹ÍF›ïÝ31‚!Ô>BC“Je65±™LÎ%`±@$bÅÄbbáWš_Q\]_ÖÕ1-ÒðòRýÑÃùVðkÁjG{YŽéë "ŒM0ºÅÿ Áz®[@G²Ž‚@Ð]XºÆ€{»®†ÀŒ•0Äâït¨oY9ððŒsàrACƒ]T„>zÔ)?øü9ÓÖ¶^Q[T$ýq)ŒÉ“‹ïÜ¡ùûËð®„6m*ز¥hìX‰ÐÐA_s[ÇÀ ¼°°åøqó… x©Ñ+WŠ==_Ц¥ù´5&&æûÔD³ÿçeuæÛXæ* tyÎËfî€ðÐìgOy“|VŒPRþaÓÛÜ~{üAÊù·¨Š ðÌÈh‘À_½jàè(Þ‹nssãÆ c°XxüX]\œ?Ki)Ç×·)4´@Àœ9Cñð8¢Ît::{658¸]\s𠨧'—VVƲ±É/(`Ž)ôð¡*™Ìß-)iwtLÎÉiµµ;wNOE¥¿nìǯŠB~~sffsJJcvvsS31‘ZWÇ—'·€¼<©¢¢ TU…ŠŠZ@AD§³Húú¢bbxmm==²¾¾¨šÚOÛQéìüB^žTX8þ×¢†Ÿ¿« í—‰„´l‚Ñ-~ù'é+H,¼àl @ÀCBÀ¤Q€ÇAU}GíçIN A 2þÍ›3ÄÅ!"²ã_ ¼½1ââÖé4±±!¸ºõõqñê5H||k{;ï³åë«$,Œ­ªb&%}±è ‰„ݳÇDZZ "¢²¦æ'( ÒŸpwW’‘!"ÄÅ}&¿ò»UœÝ誛¨„`y3ï˜OƒÐ†2°¥N$òZbž>Êý>Ãû RË^ñl®7"&ÆÌÅE²¾žµo_ÉáÃ_Ì«ø ´µ?V£Ñ8yyÌyóÊêë?_èéKPRÂ^¾Lñð¤ÓÑèþþt6u¥^qfÎl|ú”A¡`®^¥ðË®ª«Ù>>¬¡C{Á®òòZ,È.(h°Ùù¢&;ù5s9 ï°˜8ç(< ωüD aéòÊ*?̈Em­]~Íí:à]Ü’UFQص«èÈ‘òòrÆÒ¥Šû÷káp|»›KKYþYA·¶ºuKEZšog_PPë¶mtPPÀÞ¼)&#ó Ï^/^0ÝݰÊʘþ!kków7¨TÎèÑD"FF{挅»ÊÊjqvN‘À <¨-*Ú/ŽW6}ñ¢æÞ½òwïccëA@Ton.N"aŒ(ššÂººdEE’Œ ñë\¤¾žYYÙVYÙž—ל›ÛÜÜÌÊÎnŽ‹«33OLl55aAA¬ƒƒŒ££ŒÌÔº}»ÔÝ=N_Ÿï $Ôíï~-XTô‹!+ß BÀ£'ø…¿wÝB_€Ú ÷“gŽœ8QÿéÓµ`‚™™HI #=ýkEvýý …„p7o–>yRÝ»ËÿU0k– )ÿàeøQøÛE7Q ÆòÚÌXQ§¸µ…`=JDâ͵y‘óÆ÷ ¸(÷ÀÓ5<ìJJD^VTÖ­SݵKƒHÄ9Ræã“ÛÜÌ·II ö¬’¥¥`U{Ö¬Òêj¾{X¸PðæM±ÖVôÅ ¦›[ãë×?,›á[ÀåÂ-ŽŽ 55\yyÌ… bü²«ÆFÎìÙ¥‰‰mœ'øfWIIÍ'¦·+(;¦Óì*/¯ù¯¿RÝÜbìíŸ>œj*6s¦êùó©©cž<2rÛ6£9sÔ† “PRìÖÒ#!A04upY¼XóÀÁgÎ µ/)q 4ðóÓµ±‘RVÌÈ 8ëç—*!qwþü„C‡róò¾k=u`±¸ÿü“ Ë–i võKãõë×óçÏWSS#òòò£Gþx‡’’’É“'“Éd2™ü]YßN99üýûª„øøV[ÛüÊJ>F€aÃðoßJ:844pW¬ 4ó%dúÃQWÇ?¾áþýö‘# 6‡„ˆ‹Šòg ¤R9Ïžµ8;“Ÿ>U“”ä]½}Ûlg—S§ÊܺeØ·–.}ð ÂËëŽNØŽY--ìQ£¤×¯×{ölØÛ·Ž/Zxy©öa1+%%Áqãäwíôü¹Ý“'6/^ØmÜh0x°ׯ—\¸P¤­fdžœü²t}Ÿ“Óìá¡ëÒ€Á íÎÄÈi··³wl‰lkíB2´u¤æ/´øïßúzf\\Æ|ÿžÖÖR¶¶2H_'ƒ¶³ZýnM¦µñr»{M”ypmÎÎ)¹¹­ªªÄˆ¾çËÚZ¶ƒCAJJ»ðùóJJJ=RÍIKK32êðƒ3™èÞ½-64£(8: œ=KQPøVw±±Ì)S¨ååYYÌÙ³gg¾ÃJš›9ÎÎEÕÕìgÏÔøŠo3&YOOHR󦡀@ŸÝ4&“{ï^Ù¦Mé99Í0x°ØàÁ”ùóÕ‡ “„®¿Ýw@}=óñãªÄóg ™¦¦bïÞ5jh{{kŒ+kdÔ_^øššv0*•j=v¬\?åûƒ_aÚ/ʲHõ·Œüü|ssóÆÆFØ¿bbâåË—ÿkõôô:tè²e˺mý!øË÷*šR vº°Ñh-06¸(\]j2Yî…§‡$-màà mCm€Çà^¨©À¹£=ʽu‹+'×®uÒsjM gêTâÂ…92MMGÇB8zTÁÌŒ7[þï¿ bbh²²øë× ¿2þädª¯oRuuûñãf¶¶üâýµ0~üK5KuêÔ)ê3t󳪂Ü$æRt±âGz]€§rGðÆ¶“Dä32ÛªªÚ1$&¦EÁÆF*:º/Ö Âü‡§O^^T€ÌœIòôìŠÄ÷“‰ÐcbX4—H„7ÄTUù6µ¶rÇ/b±¸ÕÕœ¨(uEEþ~îÄÄæ±cSôô„.\Ðë+Ñ. .[¿>•Áàr8(üù§º¯¯¶˜Xo~Ó¾‹Å}þ¼&&¦îäÉüªªv''ÙGªôõÉÓ¦©üñ‡¢®n_BQ˜9óM}=CPüòi¾Á*))155­««;;»uëÖ9::þ×úøñã]»vEFFvÛúCð ,"¿îæð<Ž=D…@S^çÀ¹§új @B^‘ÀÔbáÌ¿• gxÀë¸tŠÿõäΘyû½qÍÉé|n<<ˆÑÑÌC‡º˜"Éd¬µµÐ›7­{ö|¦ÌêÕÊ))Í7nÔÄÆÒ¾2xʨQR99M³g¿¡RÉø•ÂÝ])"¢rëÖÌ/ÕÃþ>øk¼N)"uc˳{…[žU\ÜZV‰CÞ·¦¨ "8¸,6¶.?Ÿ.$„³¶–²´”ð÷7ð÷700E RYõõÌØØºk×JîÜ)óöN°²z:dÈ]ݰùó®\)./çÃŽ]Û\ñ$ãÆ§ÛueM>Ë®@\ÿèÑ UU"€qpH~øð‹51¿ ìÕ«JT*÷ƒHfnnoRÀFHJ’Ò×Ç?~̘9“:iRcMÍÏè/LKc[XÔïØAOKcyy ÆÆJöŽ]¹¸={F/*b=~¬Æ/»JHh¶³Kª©aô%» «tv~1}ú«ü|º˜þðaÓ’—€ÃŸ]qp 4,/w޶³° df6…†Vèé…›™=Þ·/·´´oœ>[·f\¹R”’B=rĬO:üIPXøµèÞ_4íÅ‹S¦LY´hч-ƒuqægffö¤õ‡`à[°P5Ü8Øù8ÀË pÙ 6Fpç/Àbàtü}ÆZÁÙ ÉY0r ØXÀc@ÀL›ï’a‰7,[ØÑ§·7'* ýóOÌÚµ-‹NN °n°Mçwª¬Œ¥£“cfFºtIYE…÷óú÷ßgÎT¸¸Hž<©û•K`³Ñ‘##++ÛÜÝ•vï6é«;ó³Åâji…IH¸¸tdiÒh4QÑ~IoùPûGÖ—ä'±–  ]íËv»õù~©©T[¢ù`ÞéV[_]GWJNޤª*ôi¾•ʪ­m¯ªj/.n­«c¼}Û•ÕD"a?$j ,ÖØÈ'Lœ¨àæ¦hhØÍ%Ú_øôÓíÓ,|ÇNÿʺxqÎÉ“ööâóæÉM›Æ÷²µ¹™;~|a||«««h` Œ®n/3±oÝj_°€Æ` VVøéÓI³g ö¹µw`2ÑíÛéïÞ±´¾{·lâD…ž‚|áÝ[î/º< GŸß´Ÿ·ôŽ`|<$‡ððp, ¡¥¥ÿQ.‹%,,Ì`0ºmý!ø¿ X§žÃš[0JîùŠÂ eV¡þ0Öè­ : êiqôÕl¦›ë€‹=@Ô °wuUxŸ~ô„tèP¶´4”•uþ”;wÒׯo;V 4´‹.ß–:Õ°r¥ÔÞ½¼ïpc#{Ú´ô¬¬–sçôíì¾XÞ¿§[Z>­¯g„‡[3p¾<8}ºÀÛ;ÁÔTìí[Ç·ú;‚|À­„rcoö°OÿÉ ÿx;EffÆ«¶J¡5”°˜]|ˆªêâ‹}ø“™`³Ñ¤¤ÆØØº‚ú¹s…t:ûC»±1ÅËKuÆ YÙÏåפoy0Ÿ'yðvL¾!OQíö¼ÿüS²ví{ccáåËçÌ‘ïv´¶rýü*/_¦’HHTÔרÃ×ubKJ8´ìßß#GŽå«RràõkÖüùÔŒ ¶„Æ×WpÅ aaáÞð&us+ k60 «èèðÇ®²²ZllÞÕÖ²–-SÚ·OóÛmW,wß¾œr™L®¨(~Ù2­%K´¾ìøÝ4~{ƒVWêT>Ʋ´”HLltp™2EÙÙYNJŠ›|óféœ9ñ­­ìS§†ÌŸ?pbÛ ®£ãó/j¦65±DDzôB!R„òVë¨"ÅßB0jjj"##W¯^½`Á‚M›6Á/H°¾‹&˜B+žfBM L·¸þ@X<ì.ý›<8ÑâÞÁåûÿކz / 1q[† A<<0òòHhhç£ãí-((ˆDFòê5,Z$qq-4¯T£˜ÎÆF¬¤„±woÉ×BMMá¿þÒ“ ÊÿyÔùúžž*òò¤ädêÓ§Êߟ]ee5%߯åâöà&·!]>Ù½>3*8ØÊo­þhMž‹ ë}Ûð IDATòß×óu.2D|ùríC‡LëêÜÂíe$$©©Ô›7K55Cç̉ù²‹ôÊ›ýŸeW8,^ŽÒ£¯¤ŸŸòþýšÅÅí‹åž?_Áט@P³{·ÜС¤ª*ö¬Y%YY_| ¿>C++c÷í#‡„ˆ)*bcc™^^Ôuëš©Ôã1,)á,_Þäç×”‘ÁÖÐÀÞ¼)¶q£H¯ÙÕÊ•aaÍRR¸7”ùeWEEíóçgÕֲƓس§ØUj*mæÌ×ëÖ¥ÖÔ0.ÔLHp\¾\§ÛT’Ÿ]€€ÆÍMq÷îAåå®—.YS ,¬òäÉ|YÙû³gÇïÞœLýzŒAm-cåʤ©SãFŒôñÑHìŠÃA×®Myñ¢öCÖgÙÕÏ iiéiÓ¦]¾|ùôéÓ¶ˆ‰‰54tÉ쩯¯ïIëÁÿÁ’&Ãb;ÀÁ…8€Yö`©·b¡ª`¡ Ò‚S÷;ô±f¹Áp3¸÷J*>h¸Ï‚â28ÔÙá¸qHs3ìÚÕÉ™$$0«W Q(ȇù<˜äã#™•Å8zô3³ï²eŠ..’Ož4wSÚÙ×WÛÝ]ñÙ³/¯7?6J©ÿ@$býý TUÒ¿ó©++ÛöíË11ydcõÏ®lÁ|¤ ÄÎ`yvã$Þåä'Àpk5aaÞ‰óQXï5±0cÆÈmßn\Y9!$däàÁSS±óç ½½LMߺUú‚¿Îœ_óù›Ãæ°Þä?éáé–/W T|X1xð#ié{ÞÞ 7¦]¹R[›˜Ø˜•Õ”Ðpòdþœ9ñææOöïϵ³“qp9tÈôG_JŸEaÑ¢·!!å&(„†Zó{øÏ\ìÙÜܼ¦¦c~400HIIù¸555U__¿'­?™`q¸‘ïFëCC œ~( rb §–:pó%€±&àqPOƒ»ÑâPU& ÎÝîèÇà ªª!$Êþ]í»»cÑׯÑÄÄΙ`Æ Rm-÷Ò¥¶úú.«pWW2ÆÙ·¯–Nç] aÇ“`±Ðµkó™Ì¯­Ý±XdÃ}^¹{wv¯ïÉOŽéÓUh4VS+,ŒoËJ/ÐÞιu«dôèçC†<]³&%%…Ê墫VéœÛ4D[Fd/vºÆŒ£(óÎf °Ö¶¼kߢ†÷¹|óǸ¸È™_¾l±q£¢¢`RR£‡G܈‘ž”Ý~{ì+ÇÞH8Ìd÷”ëøú*Ξ-‹ ȵk5½(§C"aNŸVpq!ÇÆ¶ØØä¿}Û{‘X  ²{·È¨QXµªYM­&(¨•Nï_šÕØÈÝ»—®¦VÆd0PwwâÉ“”¿þ&{Ik8tîܲ«W ˜;vÈóÇ®jkYɹ¹­,¤C"}ÓÇ9?Ÿncµn]*•ÊüãŨ(Û‘#¥¾¥ÃŸooõãÇÍjkÝN29RRUU¨¾žYPвuk¦§çëµkSÍÍëë‡/^üvÁ‚·çÏš˜ˆŽ%}äˆéêÕ_‹|ýåàç—rêTAM ÃÏO×Ȉï¸U&úã¯O.-..NW·ãÇ?~üÅ‹?n½xñ¢««kOZ°?ðôýŠ,¸q,°Î$`Æ`І×ù€  #*@ @l&ä–Ã,{šZ ´Üí$Ä °r aödÀ`@X*«(Ít°¶À㡹0¨®gçŽï „¦ €C"!L&:lXç³¥®NHNn#‘°l6jaÁ+Adb"C#,15ùÊåÉx33±ÄÄÆ7oꇕèCõ¿ŸF^ž”“Ó|ï^¹——ZBBœ²r¿¨6ddÐöíË]µ*ùĉªª6ooõ  ‚‚Ìœä45„Eˆ¸kI "Ð: íBg¹U¹¸Ac0âŠò ¢ñ¯K™Ì.žßºú–¡}3`QQ‚­­ô”)ÊJJ‚ÉÉTEEÒÝ·Èê_ˈicµñ‚Ú²=Í„07'ki FF6>~ÜÈ`p­­ùSÂã‘1cDÒÓÛ1»w×*¨¦Ö哚––&#ÓÓ8z99ììÙ‚¦¦øÔTvq17>žyãF{RKS'%ÕÇëÀÜ\öÖ­ôÇ[Ÿ=cVVrq7oŠùø‰‰õþD:{vYBB«°0öî]SSþ^Ϧ&¶£c²°0V\ÿè‘ …ÒKýޏ¿|Ú´W²²$6›<|î\u~ååøúí~8ðxŒŽÙÎNfùríY³ÔÔÔ„45…ee‰ªªÂ(ŠŠŠ¬¬$utÈÞÞÞÞkÖèJJ¨2yþþ7o–ˆˆà/]²°µ•€ÀÀÀžÏìK$ûc`Gëù%NNNd2Y\\œ@ TUU/_¾üàÁƒZZZ`hh¸aÆ––CCÃööö}ûö=|øðÔ©S¡ÛÖ‚äÞÎ5hÒr0‘‡waë𲂠óÍ•¹PÑ1ÿÀp= ÑAÞÚ™w Ôå Æ@æ{¸s ܞǀíx“…â4øB÷þ=ª­Í&‘ ¬ /öo„zh(cüøuuln®4ö£<³û÷›&N,RTÄççë¼ëã7ª§MËpp¿wϸÛeëúõ©GŽäYYI^¾lÉW\篂ÿäU—.Õ:|¸mø4ëÂ…Âð𪈈Ê[¦MS3FÎÕUgJãpQ½¿žÔWW¦1‰@ó ÎØ‰´.¢Ÿå‡†ðj©{/´ÐÒécSƒÁ=u>õ{ŽØM/øûmQ’Ä×wû—.UÍžÅå¢;wj¬]Ëw¬+›Î›Wvñb£½½ˆŸŸ¤£cç"¡×I QQŒË—ÛÏk Ü܈NNnnDIÉobZµµÜ;wÚ_½b]¼ØŠ¢ .Ž9¿~½°…Å·~™LÔÓ³´´”™™ÉxòDmèPþØUk+gêÔŒììVxùÒTF¦÷ãa³Q?¿”ýûs`É­mÛŒz§µöýx£@Q L¿|¹ˆFcŸ>=dÂ„Ž´A~u°²Qþž.’Ã/ÁxöìÙ‘#G¢££i4š”””••Õš5k,,:•œ‹ŠŠV¬XñAÚÊÞÞþÀ***=lýþÈ 1؃z ‚M£¡¨ÌÁ\n-2 6\‚;±àfÛ½ÖƒÄp¶„ÓœƒƒÀÙŽ ([°üµ \œ;:wp`74À¢E˜ùó;¾û\.xx465¡K— ººv:PLLr0¾¾’3fðÚ ¸\túôÌœœV//Ù+”¾~EL&×ÓóuBBƒ¥¥Ä¥K–}’¿ý³!5•jañÔÒR"0ÐÐÚºoÈJr2õòå¢3g „„pååmÇKš›‹Ï«ö!Tö³8]ôçùw±¯¯ãÜâiÜÕµf³¹;·F5ѺxåTTÅ–øï“1Œó±;ŸeßíÉž¶ºn³‡¯ã«ó *çÎͶ³sv–X¹²›'ðSp¹°iSÕ®]µ#F­\)éâÒ7jII¬  Ö„VRKQ[]Íqv&ZYáLLð˜žq-’’XÏŸ332X7o¶“Hˆ„RZÊýãâÊ•B&&ßd(ú&9³$7—YZÊŒˆP37ç]±ÙèìÙ™II-‚††RQáϱø1˜¾¾I99´¤$êÖ­Fk×êõº«ßøùÁá  ¾ÍÈ %&6ÞºeåêÚ)ÊÀ/ÁJEû%ÈIØ£[ |‚kPqA¨øpà¸[À×<‡A~h-A¨¼"$x™ Ö‹@A Šï 4P°6 £AQàÈIðñƒ1£!üߨ¬û÷щÙzzHFî?ÙŽ  ÖE‹h––øW¯º]¯]£NŸ^blLLJÒþtnxù’jcóNP››k)/ß]ª²²ÍÆæY^^óÚµz;wû]ú ±{w¶Ÿ_ŠººPB‚c¯¥n€FcÝ»WvìØûøø02¢XXˆ#çâ"ßmµZ‡«½îqCm]k‘Jÿ¸ «;RpÓ x]ðà¯ÛnÞ ݾ4b•S 7ÞÁáò&¢~³Åí²¢˜_§¸~½jæÌ,=vLgáÂÉç| …­[k6mª"k×”'Mê3㕊޻×ÏŒŽfff²€@@H$ÄÀ§§‡“—Ç`0@¡`©T Bàpк:n}=7+‹“žÎÂáàÕ+¨¨`««¹sæZXàÿøƒ($Ô7+&uw/ iRT愨Ì·6ýŸfŸ:U¡¬,ðøñà^T1ú¹¹ÍãÇ¿ÌËkvv–߸QØ0>¬˜¿ñËÅâ.[ö.((_LŒpó¦ÕèÑ]ü¹ü¬d´_J±™ )›`t‹ƒfSŠ`°èI#QÀdÃtKg©_ ºJ0H ”eàú(­aF ¡$"К¡¸„ÁÊ@S€ú˜îdMM$2%“AUQSëø^ëëãNœh--åŽ- ¨Øé&ÔÓHOgäæ2µµ ::¼‹TbZ=%…ŽÇcFî&­TDobB¹t©(9™ª§'Ò·å#~ *ž˜HmllIK£ÛÙɉ|ëhÇÅÕmÚ”¾iSúÙ³… ‚Å"þ©±gñœ9êúúäžd¿c1‡¹›ZO@9Öh—Ü=´®§gƒ‘RSP}_Ê`tÑæ¨­¡µTéCåÌ“ÑU´ž–…G­¢ÐÇ×) …¥¤aaõ/_Ò””Œ…ù:AÀÆF¨­ûòeKm-‡Cø ñþˆDÄÄ?nÑÓSÐÔO¡`¤¥1iiìÒRNE7,ŒÍloG/\h‹ŽfR(ȪUÍ!!Œ¼<ÎóçÌŠ .Š"òòØI“ˆsç ž}óòZ==3›““‡ ñ6‚  üË—‹«ªÚ.]²«Õââ–¥KBC«Œ(Örr=š½²²h·n•]¾\œŸO——'©« áp˜Å‹5ÇŽ•#‘øfi 6WÃﵡ1•¹X ºHcµ­b æEaÈÝ žçxÕÓï›Ú‘©eq{­à÷¨UNûù>€ƒKOªÂúú*MŸÞ›ç£Gë‚‚22Ú÷î•2$»Ÿä”êë¹Éɬª*n^ Ó‚ef†?uªMR£¢‚•“Ãèëã qJ¿äJ·¶r'M*~ô¨yüx‘mÛdùfW.TΙ“enNÞ°Ae„ޛ<ÏŸ/\²$ÑÌLLMMøØ13!¡>@ú …Fã**ÚÆ{‘œL7Nnóf#SÓψTÿ¶`ý$ø‹Ú†Êo66d¯m)ð¹G"aÙh88Ú˜ ïôvH= zJPÝJE¡äÈIŠ‚žäÀ½ ˜0 ö5Œ’P’$"@c#()±Z[!#§§×Ašjj¸ªª5 šž.¥§×ù±c0PMÍì²2ÖÝ»ª'~f‰éã“{äH™››Ô;=òˆûø¼;r$OZšøæÍhUÕî9Ù/‡ÒÒÖ1c¢33›[³Fgòd¥Ïúõ84.®.1±áرüü|º„¡¶–¡ @ZµJwâD5µoº3Ÿ¼_~5u9çÞf6oqeÒºœ±›Íݵ-ŠF퉥 (ºlåÈo7bqQîÆ»žeùü(OQÝêv‹á›S—‹†„ 3¦7}‡×ùúV (ìÞ-·zõ@“ø€æfîôé%6ÉÈàž‚甎-k×rââPssdÿþÎÉlõê¦7oX¦¦¸ƒ»£œ<Ùpõj#› /_j|ú)¬©aΙ“••Õ¤ãèØýÜÆá “'ÇR©¬êêöW¯Fcj÷ω†æüù L&74´BNŽäé©¢©),-MDQ´ºšQZÚšœÜS×ÔIJ°ó¦ARR`Ñ"Mkk);;é>©³ÖÎâ¨û=¢R›’™KäÐ.2ÁX53Á­ € q/‹îÝáÕÿœ=ˆ¾AŸ%ºŸ~±åeÞCžKì¶ U]ZÚ:sæk6ÊË[W®ÔññÑúÆsmØPݘšJ 15êkEœ¾„+W¨[·Vãñ˜!CH'N( °T *•ãâR„ÇCQëÁU~ÕD 9™ng÷ÎÐPxÔ(ÊæÍ½GQؾ=óàÁ< ¼öâżÕ~c EáСÜÕ«“-,$LL(›7}%8õ7ÁúI0…Fÿƒ‹DÀ±8àpÁX è H.ûIã‡Bt:œy­ —‘ð*NÜ.`š ¼M…;à}qGWc >‚Îuv>k&6=}šKûȃ4w®`l,3*ŠI£uy¼fÍ{ÿžÛòðaÓ§ã”–&ØØP Û–.Íe0º¯‚Å"/ZÖ×3rs›W­JúºTé/ qq­[VÓ§+S*+Û?®Z°à­›[̆ i‹½Ý¾=³´´µ©‰¥­-âî®e[U5aófÃÑ£eúªŠ-]á¨Ù„ƒØ hps3gÍš÷IIôîø3fPöî•ËËk?{¶aêÔ’ööó‘­¬dÙØäÇÄ´¼ÏŒ‰Ñ軪¬dºº¦êê jh¿…]-^üöï¿ÓôõEvìô›] lÔÖ2-z»|y— 2š~KêÏo|7ü_¬j / Jx^0w¨KAT€±*Xé–<<ˆp ZJ +/S(dpwC-¸ÿ´£«©“AF…´£nôõ‘Q£mmäÎN~£¯óò@._nýx$Èš5R øààÏ,X¾\IWWLÆž8QÞ“K#“qŒ3FöíÛÆyóâ9œ3“@LL `±Èôé*))N11ösçªÍ›§îêªàì,;¾úæÍ†»w›”—»æäŒ]µJÇÖVúÛk·}ŠÅvêR"g±Nåo¬ãÆ@¹X,f”=ï W^NËL¯úö³£(÷bÜ?(Ú…=cŒ—•‹Å"[¶þóÏ QQ|BBØ1ѽ—V€Ã‡µ—.U¬¬d._ž›Ÿß›®ÆŽ%8@—Àfe1þü³¬±ñ›8ßO‚¼<¦—Wi][WW &FS^žo›qs3gþü,E ÌÉ“½”QàpPoï„ÔTš€æƒ¼wý|^½ßøQ9rdThhÅðá’aaÖþþ†}þ•c¶?þúv¿"²‹Í< ÎA'iîç°. Üá¦'PÛ@a´³ ¨JÂùH˜sFèÃË]».ºã0e4\ßðò-XOEY(Šîu_±‡…sáø¾ŽݾÍuwç"iiW3œê°ùùRïCk+wêÔÒøøÖ œ>#ÝÕhoŸ$"‚ÍÎî^²áÒÒ¨NN/*+ÛæÎU;}zèï8Œ>Çö‡9‚3¼9{Ù§xšHËoã†Næpж?klè§eåDV¬±F¾í÷x‘ûàÌË­<ô=<‡­útçÌ̦?ÿLÀá0¹¹ÍŒ43ëƒï˜Lî¼yÙ—/W©«“^¾4íá£Èƒôôö•++“’Z)lh¨š¶ö/,ûömÛ¸q…rr8--bP‚„ßó‹…º¸¤„ˆ°Ì˜l8õ@QL„Z*œ}€ 0Í’2`ÿÙŽnõuaÑ|hk+ÿê{ãñ0q"’’‚îÚÕI°üý…EE!0Îíµd‰„ƒƒðíÛ´Ï; wïÖœ8QêôéÊèhj/ÖÊJòÎáNNrþþésç4_ᙄ_æ ÁìÜdž&nYëÕ b¡,.Áû|Îw±ˆq7ñ$µ•·€´‡ùa/*yŠ‹=²Y¼X³¸¸eÕª¤Ó§ z}vaalxø 3dRRšSèôÞ¸ù””ð/_jΚ%öæM«Ÿ_åÅ‹½Ï¡Cu7V—–²—.• QêÍgsëÖ¢­[‹¤¥ ƒÔÕùÖt.7/~ß¾[[éƒM‡ éMŽçoüäàrÑ+WŠ'LˆñóK)+kuq‘¿uËjíZ½¾ *ýï‰L°>ø©Q€3ict€ÅSñ€¢0\ È$(m€Ç®C¡ "¡ 0~0Ypüp¸SÇ“ ^B^QGÏ£†CY%8ÿM3f`Øl E³²:gSWW¢&'‡ýà¯ËÕUüý«¸Ÿ L×Ð $\_ÏZ´(§'Ñîàè(»r¥Ž°0îÂ…¢eËÞ ŽõS‚,wÔ¤â/cíÞ#ò>ÒĉâiiM'N”·àã#oØ ‘”Tëå•‘Ñ2.KK™S§Køø¼:4¤¬Œñí}þGûX1\ST€z<$…Ä­ ɸ¹ ,…B:œ[†ª¸¨&öm‡s¡^gÇçEr-´Ô¡£`ÜþAfÍÒØ¼¹/‹Åyû¶jÅŠ·<ÏUji ?®K§³““ë6nÌlç^††Üz¹óçK8¡¬£Ãùrå Aï“’Ûܱ'×hf–VRÂäç'?¯2cå cÆÄêꊘšŠxxð((ê啼worm-{ùrm›ï¡Ýúù¹û]Nc#ûÎ|gçp#£‡6$deÕ©¨ýþ»fZÚ¨ùóûübêqÿ?ùõ¬¹†Ð‘Âó<˜`*ŵ(¯‡¼FÁD 7^À4¨Hƒ V³¡$‹â ”UÀ # 2†N/ÜyòqØPR½9yÍK´´H$CCÒ¥KŸRU„…I¶¶| |}¹$WWÉ ÄØl\¼Øv¢•••øŒ }úîßŸÓæ_ÂÜ\ÚËËH]]¸¨¨qèÐà””¶3½þGG‘á[d×› ònê$®UœÒ,fèy¦Tde¹Cú¤t¨ò€ÁnºòÊ›k¡Mh²Ù’ŽÚìì¬rçŽu||Ullå¢E¯y.€0@ôêÕ¾/_V?N?x°½åŸcc#âﯡ£Ã_RÂrrʾr¥½Y†ß“Ë—«\\rŠŠXL&^½Ò27çqކNg¹»'‹‰QååùöìáQªêÊ•œ»w (Ò©Sf#G~;xù?z8))Õ'N¤®®~gÿþÔÛ·óËÊš.Ô|øÐ&9yäĉª4Ú÷¾/wGøŠÀÿÄÿÖxm”ÖãbÞ–@]ý•ñ8¢`¶^fààcÄ„0b@³è(9Œ·A^ NÜnÇm2žGãÀ¹æee`oƒp>ñéXË–Q^¾$öï'˜-或.ÎÉaŸ:UÝjæˆJ%M™"^÷×_E mç¤ì߯¥¦&pìX¯oÇòxúöñ¾wo:ioÿìæÍ¼oïÓóè‰ ŒÔá§Þ"[Å“5¸V1¶ÙD&“ì†q±JKëbß´ÿ(÷ãüJk¸·w2ž+!ÄKÕØ°a wîX¿zUqüxzg ¤ýüôŸ>­X¹òýµk%¼ @U•ÒgÞ<©âbÖúõÅ“'gWTô•¬ÆFbÙ²‚£GË“’/–~þ\SU•Ç L&1iRÂÓ§•òò|/êó–¤?cF$›Mœ;7ÈÕUƒ7Kþp8DAACFFm\\U\\UrruFFmII#“ÙüA‡(*j|ù²üÂ…lOÏø1cÂeeôõ®Zõ6 ¿¤¤©wo‘}ûŒss¼½M~T&{ø»ãõCÞKâ×w°ø)Xj +e¤À<3J€QFP’@M"Ò`Þ0x–& FÆû<<‰ú¤ê.!†úÄ%7¼t‡¢®®yÉðá¤)SÈ ðéG(-M^°@ˆDÂùóÜA¬‰ÅMM++ÙçÏ·]Z%#C›2EžÍ&NœÈ/*êØdŸ¢¢ ¿¿ÕÈ‘Šùùõ«VÅüýwÂO—öž“Ó±ÐÝw@F„ÏÝFƒÒnÊgA¬²fð)&ý•eåD¸Ö>~˜ÚÎèQE]ñý¸ \ åÅTúNisûö`c#÷ð¡¨(5#£îÏ?ãxž+œ2E~×®>qìX~HÈ7ê¿R£ ,LÞ³GñÄ å²2æõët7·¼ððº/mü݈oœ93×Û»,!¡ñüyÕ]»x¿ámÞœYQÁTPà»|¹¯˜/ ˜_¼(ߺ5‘Í&FRœ1CgKx GÕ—|7X,âæÍ¼?ÿŒ75 üí·à©S#úô¹gdôhÁ‚×zzúô¹çìüÜÄ$F»fcóTM펞ރ™3_޾páë;’6mJØ´)ÁÑ1tðà'ÆÆôõ ¢¨x{̘°™3#wìHLN®.+k’“ãwwï}ò¤Ynî˜Ó§ÍV®ÔQPèp?€ÿñSð+ â£ÞÚ»rØ]“ƒüE ’0Ä‘9x±æj8ðk¯c²üÜ`ÌVÜ}…[bœ88¬@Ð+ÜÛ‡Q–°í(¶xcÖxœÜÑ<þ¢¸ˆ `þìæ%W¯rÜÝÙ¤ØXê)±{ûòÔTÖ»w²ºº­.µÁÁµ..9,‘‘¡+.Þ¶¸ÎâÅ)ÇŽŒ#Я£ŸA`ÿþ”³g3srêûMîàA“_²-ô÷¤ˆÞØ{Í£F+˜±Î”xßrIBQä@:ø£_ç_¹õ£ËtcÓßÎÂ9üt}TæS®…+‡ÿc¤jÙIËŸ=+Y³&þÕ«²å˵ÿùÇ„çq¶oÏÚ±#“ŸŸÚßÀ S_§÷ïžž…·oW÷îÍgm-¼w¯’¨èxêc2‰={J>¬ «›8Q|Ãù~ý:uÏÛ³'gÍš÷ýû‹=ª3p`Ý¿IZZ­¥eP}=kÅ mÛþ—Õ½45qL=t(-/¯ÞÂBæÅ‹2MMQ ¡ŒŒ:aaЦ¦hb"É$””Y,Ndd¹xB@ß¾âïÞÑØÚÊ…„”PRüÐGAGGLZšöþ}µµ •JÖÖ4Hºo_±î¾V88H75±ùøÚõS"‘Hw°.Á™tû×v0¾É¯ï`Õ0 *Ì/àe!.ŒÆt=¬»Ý!p„]Ž>kA%#odDqð_,?‰Ñf¸ó7ìöú£3ÿ,è?rà - WoÁe. ôîƒ>}XyyÄÇT‡O¿‹Ñ«Ÿ=[èìYn#;»ŒààÚÍ›åÿþ»í²¼¼&C×UU,ÿ~ÎμL…„”ìߟzçN¾˜íÈ‘þßùiø×cÉ…·GždŒà¼¾ÆÜɵŠæ?|#—s8ÄþÝÏJJZ5ò“–þc½í×g ^ï~°˜k¡‰šõòa{»ÄòGŠÆŽ kjâìÝk´j•.oƒ°Ù„‹Ë»7Jz÷ 5UVîÔ\“IøøT¬ZUÀb}û ìÛ§äàÀÿëV"#ë×­+|ö¬NLŒ2¾äæÍ BBròþý·lܸxW¯ö8‘[™¶=”—3œÃjkYJJ‚·o[ÿ/ß¹[‰­š9ó¥„5,¬LWWlÞ¼^ƒËê鉉‹·=;ÌdrjjX55̺:vU³¤¤1?¿žF#ð«ûö¡ÊÉñËÈð·ÓËé*rr z]Td}âD¾»;· L›H¤ëÄÄî0f鯝í`|“_ÙÁŠ*Ã@Y’k(qÞ~‰ð‰(MBZÜo £ïVA”‹|ñü=f[a¥Êkàâ…¤\¼Ø U”Vaê¼ËÄËÓP“€…ðü5\Çãw`±0~&âpâ †Û5÷ðaöÅ‹„ˆ?þ¬ÊÌd/^\Ífs×ÖnÄzñ¢nãÆb/ªÉË·=•pæLÁåË%MMì7 åäxÑ©ªb®]›”TýæM¥££Â®]F½{×ÛØ¯DnEƒÖÚGM,ÎS溜´–«Hb²Â2H"1Ñù—ý¸ƒXS¦÷7ûb‹Íao¼íš[Ñ**F%Ó¶¿¤ ÞeŠù{ö$3™WW%K¸ÓÅÚISgüøø¼¼&qqêƒFÂÂí;×èæ–'"BNLl24ä?p@‰‡>Ê¥¼œ½eKñÛ·õõìÊJ¶Ê°aýQDG×üö[Œ‰‰èèÑÒ«WórÖ˜LÎðáÏ úô¹vÍRD„—éEž©®fäç×=}šWZڜҠ©)..Îoa¡ #ó Îd=xP8eJ„žž8??yÃý¡C~ÞVcœÁƒß0™D\Ü 6›ÓÎŒ.‰t…à=ýà+¸®þÂF{ø•s°àZ&*§‰ø2<ÎBz´d@£@UwÀÁñy8Ò¢0épêÈJ@AEå8õoó˜cì†ã—›³¨TX˜!;‡Z¤º»ºR’’ˆ  "&æÓw«W/ŠŠ )0áåÅkba!,)I}ò¤öï¿¿˜É>gŽ’¨(%,Œ>wnoßX Úñã/Ö´³“»~=ÏÀàáöí‰õõ=%¹¸Mzl"ˆª”à¬Áê¶S\¸VÕ¥ÌÇG›()(rËØ¦~%îIÒ .ï ÀHÃé]è]pvV^¶L;>ž¾lYÌŋټ ÂÏO¾p¡¯¢"_NNãØ±qmÊáÆÇÇ·À~ý""ú̘!ÙÐÀ ª51IÛ´©¸ €—þ<í¡¾žóÏ?e½{'{{—ÅÆ68;‹'$ètÞ»*(h3&NSS°_?aÞ¼+Ñ!!%55¬'|ïŠ šZµ{wô„  ¸&.~R_ÿ’‡GØæÍQ^§N%:9Ý““;miysñâg·ogVWÿ"â/EÓ§GÖÔ° Ä?¶6ì'ö®,Y’úæM͇«úÿ”ß{¿²ƒ¥" dàŸ >LÕ……2n¦ÀL4°ð0`¨ ¼HÇÄë÷Í©î œ¡£Ž˜T°Ø0bŒô ¢€§[º¹BC µµHÿ($&†9sÈ’üüZÝuÖ®UU¥¤§³sr¸Ýš-[äååi©©Mññm+‘HðöÖ–•¥Õ×sNžÌçù3™2EíüùAÚMMœààb=½û¦66öP7kðàÁ?Ú„/â9Z‡J~B6~NÒçZŸãE4T“H$ûÏÊ ËËê£_·]ÑYÛD¿sšk¡¤ìh£Ù]dò'&OVÝ»×H@€røpÚÇ<ö+””¤9¢ÓÔÄih æÍKþÜïï¨N,•Jš;W2#C×ÃCFY™vÿ~¦fÊÒ¥ù™™]y;¯­åûÜòlÛ–¸aC¼ººð­[–¦¦<¶^yû¶vÈ755ìõëÕwìànwÍ3ïÞ5=ZáãSÆÏO% Ο/=nœXg²‘^¾¬?w®25µééÓZÇ‹þõ—œµu×ds8Ä„ ¥zzÂaa¦ÒÒ¼ˆ;„…•ÚÛ‡I¬]«;q¢j—ö9 ûöíÌ'##‹8Ô×3ÕÔD§MÓÖÕ•°²RÔÔl»Í%‹Å‰Š* ÎON®¸t)Í&(’“S¯E‹ † ë.S»úzöÀß½£/^¬uø°é6§³Ü¿_îäÇáÿþÛoôh™Õ]íÜ—D"#\»ÃªÙ$ß_ÛÁø&?·ÏÞdPÑ„·°VŽXžfC˜.FâíxX` 2 ñ¹¨¨€#@¥àþëæÆ FDþý8[5oøhHzÜBE àÕÔÔ4/ÑÐ ÍšEŽ%ΟoÄòô¡PÁÌÍåýõ—œ¤$%9¹)0°_`üx9ù†ÎÖ­Yê ÷9C†Èúúšÿû¯uÿþ’jj‚+VÄŒ¾råÛääšoïü?žct©dRY/”dÀµŠqo/QWI"µ!ì^YÙðúw+«<%4õ×B-y£A}†u­Í-ñôÔ_ºTÀÆï²³yTI06 è'(H~ù²úøqÞc«\ôí+päˆR\œöÊ•²ÕÕœ  ÚéÓsŒŒRçÏÏ{ø°¦±±½ZD,VçéY4~|–“Sæ±cåqq£F‰>~ÜûÑ£^]å]ؼ9«°°IJŠæïoÈ›w•“S¿sg“ɱµ•ë&ïŠÍ&ΜIrv¾?cFPPP.eåJ£/&de¹îÜi>k–î—¼+T*ÙÂBáÏ?ûûúËÌtݰaÀ!JþþnnOÇ»Ÿ“ó“]7¼¼’²³ëôõż¼Œ~´-%!¡nïÞ6›Ø¼¹÷èѼTA¤îyýç×`mŠ!6Ç`¡.ŽZÀç-–aŒ&üñ¶CŽŒ\OÒð»ÞåcÊ@ün‡êô_†ô"$¾*ªë`: H¸ý^°l+¼ÏcÝBì\Ý| EËqá:vnÄ’ùÍKbc ;;“‰¬,šT‹èÀŠÕÔ-^,tø0÷µìäÉŠ%Kò‡  ÐøÒ“zy9sö줻wËÖ®Ußµ« ‡ {ÿàA‘‰‰ä«WåƒIOŸ®î쬬ªÚ½3ß$>>¾‡·ì˜yâõ…9ƒ8)™r­â·Ò‚À½¡\A, IÁµ-‚Xˆ÷¦½m¹ ‰DÞèt¦—Œ^·ÚÏdr–,‰>q"ÝÐPüùó¡<‡0oÝ*[´(©¬ŒuùrßÉ“y©›û ee¬³g+£¢ê¯_§àç'‘ÉÐ×05ÔÕåïÝ›_Y™*-MÀá ©‰SPÀ*(`ÆÅ5¾~]ÏfÏŸ×PP ™™ êèðÏ™#©¯ßÅÉÚûöå¬^ý^GGèüyýAƒxe¨¯g[[?‰Ž®\° Ï‘#ý)”®¿9ç/Yš˜X`âÄ>jÓ¦i ñ´nh`:wÿ~Nll™¢¢Ð† fS§òX3ñ /µ± îÕK8 `°Á}ÊŸ‚¢"Æœ9I+Wªzyi~È!ëxkVwØ6›tþ×v0¾É¯ï`½«$úúC’¹SPÇ€ê1pd/€’BT.ü¦b† n¾ÁÄ#0VEÌfXtÇ`…3öÏ€E^8æå.øgD¾…ÅDÈJ!+Bpã¦C³7’^úñ’5r$ëáCbÇÊúõŸ"…‰‰,[ÛrÚ… âJJ­j¯ššˆ©Ssè'N¨¸¹}qÊ&,¬ÊÎ.†ÃA` ‘½=3;ŸSyëVÞ¡Cit:ÓÔT2:ºÒÌLÊÞ^ÎÚZ®Iyù.¸'UU1KKËÊ••  µµ,ÊÊêê"ÊÊmÌxÒétqñ}ùK.¬éëÄ!æV{NkI@Dø@IL6!®È÷ìk®«j¨4~!YY´t…K\ØéM˜e¹¦[ÿδ´ JL¬vuÕ8sf Ï·ö½{sþøã½åñccKKqááá]›Eßxó&=-­éÊ•*òòÔâbjQ €š_N@¯^|2·ä䨲²ÔáÃEF޳³¡t¶Ø± îÝ+wrŠpåJßI“xt.7lˆ;s&KHˆòòå0))^Ê„¿Baaýž=ÑÇŽ%ÈÊ ðôì?ožþ×OtûÏ]qqýæÍQ>> ¶o7ÿã“ïßé¥C0™œ³ÙÄœ9½V¬ÐùÑætŠêjÖ¤IñOžTÍš¥xäˆöÝÓ;ê`&æv‡yóHg~mã›üúAîÏ‘\ßu0µ7Vãn:æàOs\ŒÁÁ0ñ!d!˜lL8ŒÈ ,…¥&â²°è(2‹~ ‚|ˆOÇ"/¼ÏGÆfÊõ<{‰ Kà68Lš…Èר¿SÆ7=,ŒX·Ž•…÷ï©‚-ü‡U«ªïÞeØÚÒŽçöþý·ÚË«4%¥)%EGJê‹wƒ½{snÞ,IOoˆ¤¨Ø•—ã†öíÛùoÞTž8‘®£#ÊÏO/ðÛor4Y[[´o_199YY~YY~>>²„ЬVWǦÓ••ÌÚZVAACQQ“I$&Ò ddø=*jh`[[ˆ…•2D64´ú¤¥ù/Ö8PÊѱ]Ú-=‡)>¯®½Ê3&ÒŸ1Ö’Ðê×Ä7f-ÿÔ]ÝÛƒ+Ê[ÍÁÕÔ°_F7ÆÄ”ј“¼îP…ZÍ sü ¡Ëœ 5$%»½ãDff»{??Y[[´3¤«W¿ ­§<¨­¯ßjеµœ˜˜†ôtÆ›7õÙÙLôömUUZI KA¦­Í¯ªJ350@PV¶3 ß¼©vpˆÕÕvv–^½šGy¹'Ò=<¢íì¼¼úuy@% cîܧ,!//¸r¥ñ¼yz||]ïfúú¦>WæîÞ×ËËBP°çfsž8‘þ÷ß 2×®Yôp_ðë0œQ£bê …/]2•ý41ÝQë± ;,\H:þk;ßäÿ…ƒu13ža€ ¢Æ 0 ס&†Œùh`Bq ê˜HZ YxÞÂŽ»pµÄy7½uøÝ“¬Àj>"âqÆsFÀÅÛ˜± Úˆ»×ì^;ƒE+aeŽð‡Ÿ °°`EFÇŽQ,øôKNKcéë—’HHN–ëÝ›ûbçàX³t©Œ·÷] ‡9260°ÂÝ]éØ1î¨Èe±ˆÈÈòèè ÿüèèÊþý%ƒƒKXYÉ<^`ð`™¾—µµLX؇?š§ÿDmldŸ=û´DD„:|¸Baaƒ¤$Ÿ††pii6› )©¨`èêŠ&'ט™IíÛgbmÍ[&Áà]~u¿ O8q•¹s$§U¤ŠÄ/6"x㾬ʊšqc¸c² Òu ” º(·n{IÄЇg”èëKéèH,]jhc£Ü­u×åvvO›š8§N™Í›÷Å2‹¯Ãá«W¿?p WEEàùóþªª¿x3²ììFsó×’’Téþáqv,6¶ÊÂ"¨¡íë;hæL.4¯¦†±xqèåËiººêê¢ÇŽÙª¨t£ôÝË—Åýõ2((wØ0Õ;wùù»!ZØi ŽŽÎý¬¬ºk×,'Múùró[òûï)>>ù |/^ ÐÐh5Ãð?«‡ðë;X ÁæÀü.$øà=’°º þ´À0ulx„7y°ÔÀ_öÈ*è $ë¿CR'áL´”à».<Ä¡ëP•ÇÀ`bàxHˆaËr 1€ºz˜ÛCJûw ¿q³×®qvïæ¨¨üý)äKnnô”–‰ ÕÛ›û5>¾ÑÑ1SCƒïÄ ]Ý/Þ¢ nnI œ!C$6mêÕ•ŸÚg²²êé))5œ¨¨ò²²&UUá—/Ë++––2elldÓÒj%%iÆÆ’uu,99--Šªª‚‚€²² °ðŸk³³ë®\É=p ¥¢‚1fŒ’¦¦è®]?M±ñøÃ‘þo úÙϫȭƒX·ªGϾ7BJJ`ÎL%2©Ueƒ˜ÿ¿ïLg±[ɨHöq3=zÿ^®¿FS'*ªXHˆª¯/9s¦îœ9ºÝ~øÀùóY«VÅhhˆìÛglc#ËÛ ‡·µµl …ôè‘‘”’{>ÕÕ¬áÃßIPhÌ›`wm-käÈP:9dˆl×Ö²ÅÄ”Mœø@EEäÍ›ÒLJ̞ͣj‡HM­úí·mm 11¾›7GP©=.>äã“~íZNC;"Âþ§VŠZ¿>ýùszEÓ×WßÔ”[oïVáWv°ÞÐ1@‚4û-qÖ‘8”„¥zð6ÇÎHü†‰:¸î„W¹tÒBÈû TŒØG 84KìQÓåY¨i@ÂôUC#}& —¼–ÀÒ6yc³7Æ Ç­£ÍGücöÂôɸðQw”Å”)ì°0ÎÑ£”‰?]n23Ùºº¥l6/«§Çív,^œwôh…‹‹ÄåË_S ©:4† pë–áØ±?MÈç+Ô׳½½Sÿþ;Éä,\ØgêÔÆ!Cz®Ö¼Í¡›nzBðcîˉl¹ª‰C{ú[ Ó,ëÌô²³§¢¸vÓKM£\åZ¸ÞÑGW¡ù^[TTãFú¾}1**"áá…½z‰ýý·Ù¬YºÝ$‡¸~}Ü®]I½{‹<{f§¢Â£HUÓÞþmttµ5ùÁë΋¼÷@9ŽŽ±OŸVŠ„†šJHð2#F˜7ïUdd¹¨(íÙ3»ÿh:Ï•+iaÂÂT%%‘3g~ÓÑ‘ìè<çÏ%$TØÚú——7nÞ<ðï¿Íx¡û¨«cijÞ+*j¼}ÛÚÉé'KEhÉ–-™7fòñ‘ml$>ß £–7±¤K lƃtøv0ÚC{ÂèB$h\‹jÜ´A&!® lÌ6ŒŒJ×a *ú«@ˆw“Àmø©MQALµ”n½>¸Eln7¿p*øù™êA IDAT‹œÅéK€™ÙÈùX†O¥ÂÁD§ãæÍVß´^½(nn‚‚‚¤Ó§>·|ãF…Ñ£Åbcnß®þ|íØÚJìÞ݇Ã!||òÒÒêyÿ¤z BB”uëônܰ¤äß¾ýs4ó1Vwì§`Õ…Óº8™ŸÌtâ¿! @Ñë+¯ªÆ})¬JS$qZÝ›Íû ÿÏ»   ´d‰azúÌåËúö•Ê̬öö޳·xó¦´;Þȶm†..jäuëbÛgo´;wú *•“÷dI*ƒÁã8=6›X¹ò=™LRTä»s§oÞ€cÇÞ‡„””—3®\1ï*ïŠ °aCä®]Ñ¥¥ “'k†„8óà]¡¿Rwï:ÚÚ*_º”véR*oƒt—.e“H¤Aƒ¤jïêС¼«WK(ÒÅ‹úmzW<À¥;^]bÛOM—9Xµµ_ToúQô€ÈJ\ÊG?) W³"ÜÊ‚¢0C”—“`™òé8ôœŒÑ[±9x•KQß„ýþ¨k€ùΠQqè: Ê@AK]ñ6 G.6QM ç â%öúdƬYä~ýpå ' €[ËÔ”ÜÃÝDNŽ:y²øû÷ŒE‹òéô¯É¬¯Z¥¶l™jx8}Õª÷t:‹çϪGáä¤üàÁ ¾¸¸ªƒ{Ö5úKlrÖ'‘DR½E±âZÅ|z’Sš `˜ƒ6×*2KT°ò“;ÅG˜<€»Ó32™4aBŸ¸8— †)+ çt}ÅŠðÚÚ.î$C¡Ž鯤$xñbö¢EÜ•íGI‰ÿèQmeesç §OOüJw Ÿ‚À¢E)>>y¥¥Œ'OLÔÕy¬®ŠªX¾<¦´´éôi³^½ºæA¢©‰½råó]»b ëOžüm÷nË’Ämn®0¾~vvõÂ…!_{Düž45q6mzW^Þ´e ·jÝOÄ¡CyÞÞyõõl??ûˆÿïI‡~ååå£G±³³KMýtóåžî9\È€ñà—½ð,gâAã !̇ðL¤”ŠH-ÆÉg`¨SMTÕáúsP’½˜,œ¿×<òäQpîê>Æ¡ÜgƒDÂ…«(¯l^ÂÏÙ³)à´ b))QÌÌø¢£™^^mø¦Ó§K$TXÈܽû±Š-[zÙÛKÞ¹S¶lY“ù‹ÜÉllä¶m3 *Þ¼ù]JJO¹FcUñÞü¶S\X¤Ön,ãöNºúrjêÜááR+§9QÉÉxŽ´ˆÂ—A&“¦O×¾zuÄÆf 9*ªxôè»!!]¦íù))¾½{…„(gÏfúùñØ©€––ÐÑ£ÚÔ7J6lÈüe& ¼½óNž,¢9¢£§Çc¥$Î\²ä ƒÁqsë=zt×DSètÆÂ…!¼ýí7e?¿¡nnÜœ¾'S§j;;÷®©a®]û‚ÃéçþÆÜ‚‚==±aþøëá>œçᑚ‘ѰeKï©S»Ò»"@êŽWZø“ÒakÍš5êêê………#FŒˆŠâN+éi8È!¶±Õpé{E„#­½à¬…ìj„æB„+¬¡&“‘0ÝVZ¸…²ZXî„~8|·y´%1@Go6w*4ë‡Ùço5o` ‡…sÁÏãg>ÙàæF3†MܽÛ*ˆµnˆƒ¿¿Sh(w·52Ç+ÛØˆìÝ[úæMÓˆÿ!&FõöÖ6LúÚµâeË~ŽxO{˜0AÅÅEDR’oîܨrþ1wî“Lÿé$Åkdk® ˜ÏÎqŠÓ ñyKD°¢?91•Ó¾y,!!ê¦M_¾œ( @-)i°·¿íéÙµ!"##‰Ó§ZZÊìÞUÁó8ì»wFŒö÷/YºôWøfž>]pêT­­ÄÕ«}­¬x×Sذ!ž H“'«íÞÝ52âeeööׯ¿2Diß>«áÃ;[G§Ó;9ÂÑ£6jdŸ?ŸÜÉ¡º„={’Œ$Ö¯×ÿIÛ9ïÚ•½tiª¤¯¯ÞÌ™]ì#6¿;^]käÏH‡¬û÷ïoÚ´ITTÔÙÙùæÍ›“'Oމ‰é˸ }F;wÔB- gs!Jƒ™, $q2ŒdQÝ„ã±0ÎY•8÷,¨KCR58ÿaÒpŠ«@!#ú=ؘ ‰‰¼RÜ i”-JÊqØÿ=£OpBQ1¼£ñcãf~~ØÙ‘jk±}{+KF†liÉ×ÔDüñGõçøúú 2™ÄÞ½¥_¨« lßÞ‹ àã“î½{{ ÇojbGD”;–þ£mù«W?÷õM®ç˜*‰ØA™Â@ë¼6“á¿€¶®l¯ÞÜÚ°Â¥VdmÚ å4J{%ÍŒe=rš5K—B!æ8:Þ­¬lê‚wò5…ŒŒÚI“"ÊËy최““ce%¾j•Jffã‘#yÛ¶eu¡…ߟ۷Ë,HÉÈhpsSâµ! \»–{èPÚû÷5Û¶ðV{ÈEEE“›ÛÓÌÌj%%_ß¡††Ò3''§“#HJò»ºêÉ>_]Ý•íºyàÙ³ÒØØªÂÂFggåk 6lÈðñÉWQáŸ?_iúôŸ5×BCC§L™"+++..nnnÀµÁ×=œœœ &ˆ‰‰‰‰‰M˜0!77÷;ÚÞþyWUU 5wP1119{öì˜1c’“¿Ç3 Ñšvî5W ƒ$CGÔÁâàMšØpëyä× ¬ÆJ©3UÜK€…¿Á¼7ž$‚ ÀOÃÂQàÃùZE‹'ªþ kþ×yÌ!+…§«Çìm`o ]-\kñݘ?ŸR¸ rp4ƒ¼$®‡€¨f;"«WƒšÇwŸ)qÔ6 -«y‰Ë8ØAM-4º—/'KJ¢¼áá­â M˜ÀŸ“þt©Ÿ1nœØÄ‰âT*ví*ùæ;ݰ¡×ìÙŠõõìíÛ³ÒÓ{hȧý|HYµJ·¾žýî]uvvÏ’¢¨¬l:p – °r¥ñøñÍ·ÿ£ $sž<”k{fÄ•ÈgÿäT¤ÕÊ…r­j¨g½ç1£\UUäÙ³q“'kJJòïÚ}ñb—e;©ª ùù "“IEúñÌôéòÞÞ:oßÖ^ºTtäH'æw+¯^UoÙ’ÕØH,_®ÒÉöêG¾/(hPT<~|@ç3X,ΊaÉÉ•**"AAc•”º±7ÏØÛ«XX(ˆ‹óß¼ùÃfùoßÎ](%…µz5½ººñÐ!%IIêÑ£å7n|#ó”DÂÉ“ºóæ)½zU=gNb~~Wæå|>$‚hi‰.\¨Q¶ysÏ b-_vófº““Æ®]ÿ-n o¥% `/uBZçTÜÙ€!œõy+$8· aaÚ•+“&i绺9ÏÛ8Ÿ3b„¢——Ñ‹åÓ§G–•uìëÞòß9sNŸÖ‹Ž®]º4åÈ‘Ÿ#ŽõæMƒÃÛÇ+¦O—ß·O«3^QTTŪUo++™~~ƒde;›ÿK˜??äĉD ±  ±½z‰ur@.¸Î]gX³Æ$3“¾sç›RIÚØÈÞ³'åùó²5k¾‡–}W‘‘Ñ`eõ&  TOOèÐ!íé]¹»ç¸{÷W˜Äxð෬Ɨj>Ö|ɸ~%ÓŸf¸@Z ‘QxÞBÙÛÍ")‰ÐP""¢ÕÅÆÙYÀÒ’¯¸˜säH«–ÀPP ­Y#« @;{¶¢¤ä÷`*•´¿–¹¹XX}Þ¼äœ^ÚþKY¶L‹F#_¿ž›–VócMúgÏòãã+ôõ¥ví²àj ²ÞQ@$ÏR†síePT¬R[ V.˜kU}#",‹g{H$üùg//K‚ öï=qâÏCqáá¡5p T^^ý_Åwèù¹Xåœ9Їk SNž,8~¼ «,ì&bbjgÍJ¬ªbMš$·}{ŸÎtV©­e­Yó–ÁàÌœ©aoßi4‡Å;—$,L;thˆŽNרM¶„g¡ÑÏ=ZCYY$-ñêonß.(+k26–ÐÕíb´ûxú´rÙ²´÷ïLME/^ìkhØ™4?¿Ê7ªèèüôE|žžžh¹ð+ž@ee¥”T«8Ÿ´´tEEWf¦v”ö:X“&M*)អª¬¬œ:ujW›Ô6·oß¶¶¶PQQY¾|ù¦M›Ö­[÷õ]ú ÀICï°“2cwG—‘øÎ϶cˆc09˜¤ƒ~rðçdWPÁ T6`ÛõTãL!)„}÷L6H$ü1j²œ—›5«VOƒ†|ý¾K`s€Qï6© ÀÑ‹.,„ @Y«<+[Eww/VR"mÚÄF‹ÇD ‹—˜š’·n­ÍÍmµêÃßnnRcÇŠEFÖÏ›—ßrÕÇÇǘS¥œ=«?x0ùÅ úðá1Ì–›ÑéôoŽðùª;BŸ>"ü¡ÃÏOlÛ–ØÞ‹Å™??„Notv–ÔÒ’àÚÌÑHÁ@AÀ^Ê„:Rë&¬3ò0„sÂYhÍ“ ÔÆFVgÞÅ AµçÏUQ^° dùòû]ò9|HÆrpP8y2ÃÇç=#´\åî®äã£+"B]¸0yëÖ,Fàí]tt„S§Âìí£étÖœ9Jë×uuÕ¡å*7·§QQ“'«îÜÙ¯óïâÖ­ôåË쬯]s03“ëá¿îÈȈeËú)+ Ÿ;—üým8t(USSdôhÏ#tÕçÐÎV®|æàð6)©nÙ2ÕÿÕ,-Mùú›6mjQQ§íêúžÃI ¥Õkió篠MaMàkÏ+hSX›#´ß€Ï)..7nœµu«ê<H{;­Y³Æ××wïÞ½3fÌø°äñãÇ ,˜6mÚ¶mÛºÓ¶)..îÓ§Ï7åãI$^k”°[ ýÃMǵþ˜¤ðxõÇ5Œ¹…»é8`‡eýq& ó®ÃRÏ€á$äãæbŒïª:¨Ì†¼îm„® º.HÍAÀnŒ¡Q°™ Y)d‡BP**¡aˆšZ¼yÓ‘ËÊJL˜ÀÊÏÇùósóVÏÄS§V]¹Ò0{¶àÙ³m<’ææ2 R««ÙW®¨M™òígÖŠ ¦MtNN“ÄÙ³z?wÛÝìì:-­ûjj‚!!v**?8™÷ر„E‹žikK¼{7µÍ޶ÑãEØÂò[Îæ®4Þ;@?K\„¯AM2}×*‡‘:öõ:iÞ¥K©®®Al6áãc³pa×èVߺ•7aÂscc‰Ë—-: ¸p¡höì$6›Øºµ÷_it…]IddõˆoétÖøñ²W®ÐhJ˜zþ¼lȧT*éõëᆆ¼«g} :ºÄÆ&ÀÔTvâÄ>K—þ Ñ““+gÎ *(¨ËÎvýž «ûö} .NËÏwúJ§ùƒÁÙ¾={Ë–L kתoßÞ»CAÓº:ÎÈ‘™aauîîR'Oªv¨á:b'O&ƒ]¤õ¼ååçç;::îÛ·ÏÞÞþë[¶ôäååãââäå?Eˆ‹ŠŠLLL ˜tQ{¿ë^^^<øçŸF––æáá±mÛ¶{÷îýï @ûO›•(^Ö€I`l¤á_Ëô!/€kYàÞCTð \Œa¡~*Š`±=ltpý5Hcõ8¨Éâ\Hð˜“O³„CÌ0Úz}pùNó)I,v‡í`k!:*) [[²¢"öìá.ܾ]ÔÒ’ÃŒ‹k£âFU•¶g¢™™àÖ­%ÅÅßNÖ‘’¢šXXˆWW³íìÞ–—ÿ°*žiùĦ®.¼b…Žªªðñã?Ð$ ûÒ¥Tss…íÛ}én1ÖD©Ÿª8€Tçp§Ö:fæ°41ÕÒæ–S Éhhè왚6Mûôi;‘3g’®\Iëäh?^åÏ?õ¥¥ùçÎ}ÕÎö‚-ß¹˜1CáÒ¥¾êê~~Esç&±X=HHöÑ£ T¡I“ä:ï]ÕÕ±/~íà ¿u«a罫òòÆéÓƒ e45Żջúʹã]]Iyy!MMñW¯¾]©Ó…œ;—ic#»p¡fÏ÷®rsmmcþý·ÔÜ\ÜÏOçÎŽMIæÎÍ#‘0y²Ä?q§E#GŽÜ¿ÿ7½+´öúöíÛrm\\œ¾þliЇ “W¯^ÙÚÚÚÙÙ†„„èééuŸe_çÚµkVVÜMßÚ¤†g5¸W‰ÉJˆªÂ•|¤Öa¢¢Êp)ÙµÕéUx”…g¹¢a”."spì¸ Äë,\}…”"˜lg 8zÕõ0s$Þe¢¨ñëc¦Ah¼N‚ý1‹ýw7$¦ -陟Lòð ÇÅ·nq‚ƒ[ÝWz÷¦˜šòÅÆ²/nCw€»»”¸8åÝ»Æ-[ŠÚóÞùNŸÖÍÉiŒ‰©qpx[Yù“5+äJ™>6íë|ýÜñ€¶¶xhhÁýû]óUlµµ¬ãÇÓŸ=+>]ý»”7îß/71‰zñ‚^YÉòñÑáAhmß¾Òkתbc·n•êpŒrw¼:j€’’’#FìÚµËÎή=Û·ôFíëëÛr­¯¯¯““ftþH$’¸¸¸ŒŒLûµÔ;½½ý7ŠŠŠ˜LfffæŽ;¶nݺsg»¢šsd¡HC 4xô‚½ nA‚ãÕ¡)ŠY ’1¯TDq'Æ€¤–¡ºB˜:½dpó5è«Âº/Ôeq+Ä„á:9Ÿü¸ùX“FÁÑê*xü¼y‰ª2œ‘™s—>™$!U«(22ðõåŽlÙ""#Cnl$nßnC²D©S*#Fˆ¾~ÝxéRU{Þ¾²2Hˆ©¦¦`^^ÓäÉ yy?q]aÿþ’––2**B7oþ°4‚ÀÓ§ùââ|žžý¿þˆ9ÑLÙ@Y €7yl¸ÓT§5‰ HªkHjëpkÛ„…d4ÔwA¸qáBƒ9sôX,ÎqQQ]9¡^ºdA£‘_½*ü¸ø›Û‹‹#`3j”LP‰´4-6¶vÉ’Ô^±{wö™3L&áî®´g&…ÒÙKÜýû…IItAAŠŸŸ9•ÚÙѼ½cKK„®]sàããEd¨ý|óÜu”‘#Õåå…rr¾_‘Ê;jjBC†Èv>pØ}°XĦM™æÒhdGGéèh3cãwþ «{ð †D¹sªÚÚ¼ä¶3À×/,1bÄŸþ9jÔ¨6×~ÝpwwˆˆØ±cGeeeeeåöíÛ###ÝÜÜx0£«è€ƒ3hРwïÞ=yò$88ØÑÑ1=ý;I›xzz^ºtÉÀÀ@HHÈÚÚ:999<<ÜÔÔ´=ûºÊ¢†ƒãÅÈlÂ8•aO:,ÔEj5þyî†(©Ç¡hס¯<†ôÆãT\Œ€%vÈ(žGh`€Ç$ä`¯scœß' ¿ÿ\FqP)aƒÀPìôùdÀ(,†×Aä·˜öð “Îã­Ý¾]ÁÙù§©”ü111S§Nåj†SUÕMøº' **úôéÓ¨¨(uuuuuõׯ_?yòDXøGþXÚë`­]»ÖÉÉiÓ¦MgΜ‘——÷öö^±b…ƒƒÃƻվØÙÙݺu«¬¬ŒÉdæååùúúêè´7Þ.EÅti ƒJ ŸJxP+9èI  ó¡"†9 €«I0{\~ Fj˜2}äàN¡$…¤\„½€>Êp´B#çî5nöHˆ!"ÑËä5{cÜh08qî“U¢¢X²„ àŸ8\¾ÂÌ™‚FF´¬,öÉ“m+…º¸HŒ/N§³×­+lg—_ee~__ýÁƒ%rr]\Þ½~ÝSľÎç‰ cÇ*+) &%U×dŽÿ¸ví}ff‘‘t{Â.ƒTäD&)#q_ûš®m ¢*¡£+ǵ*üYF}W±H$lÛ6ÈÑQ]UUdÉ’°ºº.ó÷ß5§O×(+kÚ´©kdÉtt„в²ÏËkrvŽ»yó{ŸÙ’†»{òáÃyQQ5ÿþk8gŽb— »wo²šš¹¹ô‚’'PXX¿fM‡CL™¢eeÕ5æ}g„…iýû˲ÙÄ›7ßãü¾{GýºBP2ztMHºv­dÖ¬ÄÄÄ:UUÇMÜÝ•xðé‰åË ?®]°@ú?ºKçý{B´…„DsQ×7= ÿêêêêêjuõ<;Ü^+++ëíÛ·£Gz:thTTTjj—ÉFwÓePÊÂá"p€åè%Œ#Ù°¢/4Dq4]ó˜ IDAT&é ª¢Á!0Î#uñ*Ù0ÎUuøçШX3*28ø1“}õ4ôëƒý—ÑÈ!¬_9xødÀºåèoŒý‡QÞB’ã÷ßÉ&Ÿ?ç\½Új¢BÁbC‡ò]ºÔðA²ásŽWvv¿y³z÷îö^­$$¨ÆÓ¦ÉKKSííc®^ýöÏçóDì驯¢"èåÕ©æ-¼Á`°/_Në×OzÖ¬¯ù÷Ñ|B“ _i)¨# ¢p§°SŸ³â ÙV+¤krùi4òŋÕ•…sæÎ}ÚùÈ…BÚ¶ÍÀØXâÈ‘´ ¾–RÓ~±JÚãÇÆóç+«ª zx¤¹º&~·”¬°°ªI“.^,>\*4ÔtäHÞ»8·$0°hûöDìçgÞ-1kVP~~í¼yzk×¶+lßyºPhô?† SQUù>yî§NeÈÈð/_®#(ؽs©rë`§&™t<ÈÆŠhbÁç8›¢º¯³ñ¦ FQ%Þe#«Ÿ%•¸ò1kúX”UàÆC¤lHoÜr²¨­ƒ÷ñOæ aäHRm-þü“Ãh5·µå“•¥DF2–/o[WF†ºl™´¹¹—WYpð7´*þCP|þ¼¾žžpu5kÚ´ÄcÇzzÇ’6A\\Ô**ååŒÔÔï-Uüøq^EE#•JÖÔü¢L‡à ödsØ,ó‹}½åÄ+§Œ*!qïÅ¸æ ‚PQ×ÕçŸ ͬ«íšÉqq¾;,øù)×®½ß»7¦ójh»¸¨–.}“›ûÅç‰Uòñ‘×™?_©¢‚éçWdnþ:1±½_lÞ`±ˆÝ»³û-&=½ÁÁAúüyýþý»¦Srm-kþü×GGEMͧÔpqútbPP.FÙ¶­³¾ZûéB¡ÑÿÐÐËÍ­ïöVô çâÅìââF'§¾ ­3&ÎϯHP¼p¡òÁƒZ>ÒÖ­ ²²òfØ vÇ«3&ýP6mÚô£mè.ÊØ8²m3ÇcÓtPHhâ Ÿ”1ÁG‰Qò¨f€Ÿ‚JlÀ&ÐÄB~ œµ )ƒ×yȧc¼!ÄÐÈä”ÃÉ"‚hb¡¢ÅUj B(§#1 3G€˜Ê*ÀGCvF~¬õÑPÃû TTÀÁBËöûõ#ED€F€Z]:-,h!!Œ’ކUK«oª†_v6³®ŽsñbÕ”)""íò•ÉdÒ¨QÒ’’ÔwïêBC« ¶¶Oæýž RêëY……%%Æu¸Ü¦3œ9“D¥’'NìciùÅã>M¾ù þ¢„trQôËŒÇ$Òÿ±wqM¤_÷LI„Þ›4¦ Å®Ø{okï]ײ®½÷®»6l»¶µ·µ¢¢‚Š(DDz¯¡“™÷¸JD2q]ÞÿùÍLžÜ0çæÜsÏ“!Mɳ”€%¥©ã¨ü4¦EK†¾µŽŽ ðyÒ§I¥$ƒI|îãÐ0hiqµ_¿Î ͵±Q—²Š““ztt¡@Àþûï´Q£Ìèêxqr  ýä‰HK‹}òdFV–ÄÓS¨ˆßÏØØÒÉ“ßܺ•_YIopà@S¡¶ý`þüÂBIÓ¦ªû÷£⛈ŽÎŸ8ñ‡‡ÞÆžÎÎôü2ü[ (ÄÄäóù¬Áƒ-úB—.¥ÄÆ»ºjÌ™c­ÐªÊËÉeËÞO™£¥Åiß^íìYû=4ü‡sþ¼èС< æŽ:È&ñ«W¯®ûξzõê–«dE¢´ hõÍFœ`Ôÿ™Q9 @3¼¬À_%¥…gÅ8•ƒ41†À/‡’ ¡ÐÃÒq £lñ, §¢‘V Su4ׇ„ÄÑ—0¶5ž¾Å ¤À°6x‰ý7!*€AAR(,o`õKO§¯Šôt¸—;Lqã.¶îù!‹…)Sˆ/¨5kȲš‚+æ¨Q¼ˆˆÊ9s +*j¯ë¬X¡Ãd">^<~|r½J?sæoßnieÅß¾=©}ûàÿÜÈÂAƒL?Î>|ø}iéwíí?s&ÖÏ/µS'£/]P.)½ìà⫃×CŽU´Ð pE|XÝR Y¸âü P”¡‘°™,‰åÿ8¾¸˜¶[Óµ«ÉøñvÙÙeÆÝMK«e"S}±‹ììŠÜ\ÉÞ½têlm•Ÿ=kѱ£FddÉêÕñ­Zùûcg½PZ*]²$®yóÀÐÐb‹ºqÃqÓ& ‡¶OÂgÏrŠ ÎßµËYÎÎÁÊJr̘û))%Mš»w§Ù7áûÃÊJíñã´ë×HR±-*‡ÅätîLÃH"º êÑ#tÏždƒëøø4³´løäégÏJGN *–°×Â…èÕ ÙÅLIÁH½œ`gˆó/ÀÞíìae€‹ ÄF×VÈÈÅùGÕ/jk‰‰CQR†ã—>F2{*ÊCvÎÇ“ƒ1\\}};&›+Ìœ©lkË ‰ýûk¯Â0™ÄéÓ&ZZ¬ü|éÞ½9µ^ó% ¤³}»e“&¼7oJûö ¨“éÃwÆ—„ NNjîîšVV*ׯ¿*gl¬ÈÈH`m­æèøE"ájÈQQY€â Q™¤ú®1ÒÎ0@9Ø;™ýežB&W]àÝÍZæë¬X,}üNWÕyóœµö’%Ïäßä´´”Ö¯o^pófZTT-åÚëx”•™Ë—›=zäbmÍ‹+_¸ð·wHHˆ¼ÃÊJêèÑôAƒ".\È’H¨N4ž?oÙº5ûSy¹tË–7..êëÖ9Èï°sg(EÁÌLeËOZ«;¡ÁRQa»¸è88h¤§Óß ïß——“ÚÚJ#FüöWååä/¿ÄýüsìÇù}úh={ÖrÑ"y2ïøxñòå,1}ºæ¬YôšåPRÄAKlÿi4þ«ÄñB¼‘`¢BJ±3$0Å Ïó±;0Í/²±7&;!$ ;‚ ¥Ð­)T¹¸Ž{±0»3B’°í6*I˜Ý¯ã°ùâG¿†‚b¼ŒÐ¾ÙS†"<›@ô¡c¯¥3ºyãîìØÿ1<‚ÀÆÌèhêÚ5ÔLrØl8 ,.¦Îœ){ÿ¾vªÆÐ}æŒ1‡C,]šñøqý>¶œU[öê¥Åå2Úµ ^µ*^Ñß,닯A¦M³|ù2o×®ï×cñäIZ@@º³³ö—Xý좴{‘çj}ÈR/L•Wà8Ó;²=ƒçW€" …vö²•Ç€§ 4’X qâD'Š¢NžŒÙµ+ôÛOøúõ3œ6ÍòîÝÌ ?oh•SÇÓ¶­Zp°ëæÍæÅ÷ïçµhñrêÔ·ÏŸ7DxWVFž<™Þ¬Ùó ¢ƒ‚ŠÜÝ…ÏŸ·8|؆öùQëÖE]¹’J˜3G^w€ÐМeË^¼~}ò¤·ŠÊ÷žs¥ &“xñ"+%E ÖùóÉ…Â8Ø‹…½z…îÙ“T´y³…ü:¿¼<éÏ?§ùú ܽ›F…¡˜ãÿ;‚5DgŠÐYˆ&J(âq!†êƒÏÄó|¼/ÁHs(³ð<ï‹ÐÉöZ0QŃ$0Œw€³!о)ºØÁ\‡@ŸV0ÑF|&„€º Æö€c7ª_׎PT‚ŸX‹fÀÙ‹Èûdt—.D·nŒ;wÈýûe³¨6m8®®ì  ɦM_üúÞ¹³Š——rq1¹hQzzzýúðµ´ØGÚ´m«&•R«WÇÏ›[Pðßp{<ØX]RNgýè+ Éàê*›ýƒ¿^î—Hk—¥s˜Ô¼.MˆÁÚÎ ó(™Yùü/T·ÖøT‹¥~è$±tuùûöµ#ìÜAÜùÕ«íŒø/_æ=Jw×§àó™Ó¦ÅÇ{.^lêä$8x0ÅÃ#hèЈ={’ß¿¯ÝÄäSH¥T@€hÆŒoïà;’ß½+kÒ„·nùñãÍ\]éw ŠŒ,ôäÉ¿ïÞ^^N._þ¾GP_ßüÞ½µZ,Zdª¤$×oEi)9wnÚ•+…#GªíÝk ¿uíÿ h4þk²*š²ñ{!Ä‚ ìÍ€…9MÀ"p8Bf5“Àá· €Y.x›‡½¯`¼+ZáÏ×H.A`”â²±õ60øe04Øy­ú…æ…³5~¿ŒÔìê3K§ÁÒëC釽ÀÕÓ& +»Ôrùr†£#±v-/KlÛ¦êíÍ9|¸ôüùZ¼Ý«°v­îĉšå$~I°õ%°XĆ W®8x{køú滸¼|ô(ÿÛOû·Áã1þ¹)ŸÏüý÷wßç_¾Ì41¸¹Õ.ìˆËŠxïû¥çzÛý¥§«¾À)fÇBv‘Š +!­ÔÓW±w%±üŸÄоx뀞=M—-kI>üNE…¼"6¡}䈫ªO\l¬BüÕ45Ù›6Yܸá°d‰©““àùóÂ9sb-,ž5mú|̘¨Í›ÿú+ëáÃüW¯Š‹îÝË;y2cóæÄ>}Â45ŸLŸóÛo©.—qùróØX÷É“ ¡š'IjÒ¤ÀÊJé²e¶žžònŽ‹öñ‰25U]½Ú–ð~XXµµy99ßNކ‡³¢£ ûô1ðòú7‚‚Šúô Û¾=ÉÞ^yÑ"Ó'låOèÅbjàÀÄ?ÿÌï×Ouóf}UU:í'¤`*â 1Âÿ(‚ÕB xn”`€:ò¥¸–t zéBT‰ãÉPèm‘Çc!&1À"1n¾G‚:Xj¡’Ä¡0°%ÊÄx‹—ñ0¤5ŠÊQ€ØT0Ó‡µ ÄìþP&jïu!²rásþc<#C,ÿs|¼89NNDE–-“ž£«Ë4ˆ`ΑHT{òÄd6èji±ž?/]»¶!63}úh8ÐÔÜœ_Ö©SȦM‰uè«P|]Ò¿¿Q^žøÜ¹$‘Hás¬IÑÑùIIÅvvêŸ?J:õb'…ÚïŽ*O½¯óx.›9¯‹% ˜›Yƒe×O+ 8 K7k«²’ô£U‰à—_Zðù¬ˆˆ¼Õ«¿}õ·Ðµ«^ß¾yãÆÕ(ŠDt’‹úúJ6X<{Öò·ßšª«¡Á–J©“'3~ù%nîÜØŽƒ[¶|9xpx—.!cÆD8výzŽHTI’XºÔìÐ!›çÏ[öë§­¸†Ù#GÞçåI””˜?ÿ,ïÌÁìì²… ( C†Xhhpi ¯¾ ÷Þý™]–‘¡¨ëĉ‰„tqÑøŽƒÜj@"¡¶oOòðºw/¯W/­­[-7o¶àråÝgI?ÿœ~ûv‘¶6kÓ&}CïU?ÓÒêý­I¶"9Þq#Ac¶iÀ‡nU÷•ˆc’•`('1\á…Ðå ‹¢  Î….ZÈ-ä–£“)ôTŸ‹ð Œw—R1H )ùèå¾Ä¤ä > =[€™>bñ>C;A‰:šHÏBØŒLŒžäT¤¦¡sû¡º¸¯_Sð𠌌j|<¸¸°CB*™LÄÆJ»w¯]9¨¬Ìhß^9#£òÖ­"6›hÕŠ_ߟ•º:{ð`]eefppqf¦øðáÔ–-U þM¡â×'Îjk+ee•“$Åá0]\jÉ{hDbbá“'é­Zécóù£Ïãî~I}ÀÓ¢‡k“ŽœL„‡ýJÅÒ(Ât ‰|™Æñž&PåeegfÔx(-UÔ²•1—K››ÍpsÓ ÏõóK÷ôÔ36–׫©E dz %¥¥ÒÈƒØØX]]š;¹X,ÂÚš?h΂&;ª;9 ¬­•­­yKS“meÅ34ä¶n­Ö®ÚÔ©†»vY/^lÚ±£ºŽNCÆ¢ÕqqÅcÇêëóöîu‘*ÎÌ™¸»ë®]ÛŠŽèEÜ;ÑÑyÅÅ•vvêžžô×= %ë×GÙÚ —/·SWWì¯aaÅcÇFß¼™Ëå2FŒÐ=p ©™YÃ[ÿEaÖ¬ÔË—EööÜ3gLìí¿–sSF½}»ÙÂb±£cRœÕ«WÛ¯$œŸ#bõÅÆ`|™ÁJ `mú*#¸7J-F5<+Âï™Rh§‰×ø-Úéáv vEÀ([¤á@J$hme%ð9¸c¼à‹“È-€‘í Ÿ»ÈÈ€–Í`e‚з8òÁç½wGèë 2§¯} lâh¼ÂîßkL'41!Z·&¨M›d‡çÖ¯W ‰#GJïÞý¢äÙɉ7b„Zjªdþüô{÷ÒrÅb‹›Þ¸á(²^¿.öðZµ*þßšúW´m«ãïŸ{à€Â«„oÞdäåÕRª“HÅ‚~ûÊsCSžŠ+Ë(+±æv± c3ó3+3Nòä$€Î]­j!±Ð<÷ÓÍM·S'£ôô’qã|ËËå-ª©±×®µŒ-_]­CoÞ¼¹Üa~L&áà ˜2ÅpûvË}ûš>xàäzíšãƒÎüa»fùðáºFFßéëÁôé¯ÒÒÊ,-:É›”¼x‘yòdÌ«WÙë×»Ó[à°{G 52ŠÂìÙ©¿ý–›ŸOnܨïìüŒmëÖâë×Ë´k÷/¤˜ÿƒ s‚•MÀ )Ø  ¥.–À[ v<˜*ÁW„ÑF0䂤[ŒQ–0âƒÞŠÐB­ ÑL—c Ÿ2Šp;̵ѽ9ñ×K°6DïVpl‚Ó~Õ/Ú· ´Õá I%0èÑj*¸î òCÍ­…ú÷‚­ «ð’%Ì^½ùùÔ… ²å9;;VûöJ±kWé— …† Q[¶LWE…±n]æ»w ôoÕJåêU‡Å‹MI~~ÎÎÿÖÞo¢#sse€¢XÝXNNY«Vºµ4ÜŽ8Sœñ•çæ•dÝýÀoÍìd®¡Ìp‘Ù:‚ÕáŠ/­¤BWOÅÑY¶?èy@¢¨€N%€+\íí5MMUhé(ìØQw̘&ffÊ7þ SŒþEœ=›TQ!ÕÑánßî$çRR)µsgh‡†¿üâbmýÅiÿ]¨ªr\]uTU²÷?}šcm­2q¢¹"ÿ ’“ˇ ‹¼{7W"!'O6øã[OOÚZ(Ö­Ë|û¶‚Ã!Ο7i×î‰c` äöí >Ÿ`bRô®Er½óFÆœ`¹2à¦×$˜¤Š  ìABa´6žâPÔØk„´rI†*=Œà—Co`ŠÒ°ûŒt†¨ '_áU ÌèˆçqØz RæõEà[l½q%ôò‚P€«qþAuÃ{ÍÁ…Û¸t÷clk~Ep¶îAJÚÇ“$üü¨… e}G,^,hÞœuëVùâÅ_ëT_½Z·OÕ·o+¦OOÍËk 3Áã16m²¸sÇ@hh±»{ÐÊ•ñß[•õM!ˆ’£OC?¿,ú[Ø>Ettþ‹™šš²ŒHaYþÍГß|úõÐ㢲\ª<ölo $ˆ-Ÿ“X9I¿£ºt³–q¯¬$> ™¨SRb:ÔþÞ½äÕ«cci0BÛ¶ÍIKK)<\tü¸boǃü|ñܹÁ~~ÙÛ¶9ikËK˜?}î\lBBÑ’%ßiæàw†TJ½|™¥¬ðpÑŸ&dgWôïÿE`EàÚµgç—.d Ì;wœ´hwoÞœ½gOnRRåÅ‹¦={~#i+*¢.,|øPùãˆßÛ·×%IêÈš½ >E^^Ea¡D]½F èÌ‹]R²®´I‘§žï¨ú÷¼.–*\€¿®A ÙÝT|e=U^¬¥­ìÜBv·|ž”ŸG³I£¦&wøp+ øÓ:/YÒŒÇc^¹’zéRŠü«ý°H¨éÓ_‘$Õ³§¾¼Sq23K·l &IjâDÛËbà;@,& *hÿè¸};#+«\E…íì¬Ønâ*3eº¶Av~ kÅbthƒÛ¾ªó–-Œˆ«WÉ/d?Š8bûvU//ö… e×®}Mõlgǽ|Ù´_?áúõÙ›7gåʺ€Í&æÌ1 u30PjÚ”?rdd—.ÁÑÑŠrd®FŒ0éÞ]_I‰£(1¾®.ßÓSïÓ+,% <åy½‰J K  )àLíP-ÅÝÀüŒÄ*Ì–Üÿ@ç.Ÿ“XÔC_šÛ Œ߬s áºuAò¯fhÈ۾ݩ];]»brsØiñãcïÞ·ee•ÞÞzË–ÙÊ¿ÚÁƒ‘ŽŽš'Ú¶oÿ8˜L&ÃÃCÏÔT®q1ŸãÔ©D//­™3ÎüQ6oNìÒ%ÄÑQл·VP«œ£o>Ç/¿¤oÛ–chÈ^³FwĈogW%%Ôܹ…ŽŽìI“øcÆÐà ñ?ЈƟ`¹3Q@!—Ä] †(ãE|ŠQAÁC€è2ü–>M•[ŸdðYðÐF`6öG@K¼ÊÀþ× )t¶A@‡«‘0¾5^&àìs$çÀänyëyªÊp³Å£à$Ÿ‡®mñ> +wãŸ/pf&p°CF&¯¬³¥%áéIdeaòdiåg£kš5c ÂËÎ&'Nee}­þ×¾½`ð`aI‰tÉ’ôC‡h˜‹baÁ;Þ~Æ cŽD'§À¥Kß—•)Jü^G!ˆª*ÛÄ„'<é> IDATëVº¢H¬×¯³2x¼êo‡$Ež Ü÷õ§ÔŠ“[ªH¯E=¬J,÷Îþ„ì-¾¶™*/ÒÔâ»´”Uì¾|‘”—Ks^Ë`Ë–µ|ú4}çÎÐwïhp˜?ÞÜÚZ3gÎkùWû‘˜X²fMdLLѼyÖ\®¼¢æØØ‚uë‚‚ƒsæÏ—·‘.„‡‡+bÙììÒgÏ2 éL»33Ë/]Jyñ"·_?Åæ¦ååä!¿üGQèÖMóêUuu:¥r$‰Å‹36oή¨ 7nÔï×ïÛ´(Eaüø‚GÄFFŒ;èŸþô?ȉƟ`‘À,%˜1p¹ÎJhË…×J0^M”PN"±M`­Œ¨b”J1ÜfÄ!_Œ^pЂ‘¾‰  v@A9.G€†¸Áͧž€ººÂÍ>ª~ÝÙC`¢‡’²ãŸ§‡… T”q÷ÉÇð–-„¡>ÊËñ8 FØK—2-- uu>\Kú2s¦rûö æÆÅ_çÛGŒPÛ·ÏPI‰8~<ïêÕ† Ê•A`øp7oÜ”++©§O ÜÝ_Þ»—+ÿÊŸ£îB±c›ØÚªFFŠ*+R¹lÖLÍÃCOY¹ZfÁ ëœ>1áÅ—Ž£ãümôji“H%Uí„ZÎÄvfU'7±†È\FçJnïàÝՊɬñG*•RîÓ¯ÄrqÑ9ÒÚÑQsûvÔîÅ‹› …œ´´²Û·¿æañŦMo<<´ÆoÒ½; †™¿ÿáä¤5l˜U³fߣÂU|Ýã·Á`±ztª°/\HvsÓ8ÐX__üMf¦¸wï°ÌÌ æÅ‹ö‹›Ò[‹©aÃ_½*õòR¾xÑ´gÏ:cÛ¶•df’JJX¹RE hx@°q48žFƒÆœ`E€0Ò,D8.F<‰Q*x\Ž…ÐdÁS¾…8‘ U˜òQIâJ¬Ua© ßt} &aÍà—‚=¯`L $àÏ×Õ~ ÓÚ#àvÜAE%ÌíWï°÷:Òò@Sˆíñè56ÿQ‹é#ñèVïý¤–&¦MÀÃ'Ø´£Fð<vì`úùQ¿þ*ÍúLCÅ`àÔ)ub×®’¾ÁgL›¦¹f—Ë1"éÚ5r,êê¬={¬Ÿ=kAQPScwé:dHDvöw¿wwMŠÂß§ß¹óYkÈxö,£îâ\&ƒ5³ÓFmÙ¯Ô¥9»ï-¨ò]ÜÚÇaðc4LØË\)¾±*ÉW×à·p•%±^½L¦Ä°q£{ddÞÁƒ‘/^dÊ¿š……`Ù2Û‡³fÎ|UV¦ÀÏïë×Óx³t) ÅÁwïD{ö„…†æ.]ÚBþÕè‚P(¯ª¬V$%={–Aoj²ÿ;ÿœŸ~Ràt稨w÷ û÷ó˜L¢jæ½ë—–’}ú$œ?/ .[¿^ UxøPü믅‹OR³µ•+›‘‚¥ˆCžs‚U5P A`,à‚CPfàqŒ×€… Q†x”‹Ë0³ÜIIa¢¸,„g#½ÊŒw“Qí×àe…îÐâÒk0ÓEÄGÓÑyÃÀaãYâ?lúSF@[± xø‰zgÎ4ô(ܾ_#þÞ½‰=ˆ’ìÙSËþd`À˜4IÀáÃ¥ÑÑŸÕkbáBmgg^i)¹reæíÛ´ •ÜÜT3…ȪÄÁB´W…·Ù•ð-À`}8«âB:B ÑÓôq/·S¡ÍÇ,gä–aßk˜á CUìõGV1ôwAB6Þ¨–U-èUöß@YëbîP¤daû©ê”yX=¥e5H,2ú÷Ba!æý ÅÕîÝÌnÝ’OŸÖRù<˜»d‰ 2²räȱø¥±íÛõ—/×}ÿ^<`@âÇ´ý±XÄ‚¦áánC†èfdˆ‡ìÙ349™Ïñz AF631áùø¼Ï̤Ùñ¼Á0ѰšÒ~AÈþ•ÆûÞ=`q¦ÀsÂæÃQæ2Éß;¨Âluu^K7YëuPJv6ýn‹9{zê¿z•uçN²ü«±X„›ïÞ½Ìà`ÅZí7lØõ÷ßéC‡ϘAƒ¤:!¡hûöå_ýè+Å!#£”ÍfhkÓ–øøÄr,°a±Ò{yýzŽ·wˆTJMjèë묭Móㄱ—×»£Gó>ybáàP§ŸLI Õ·oþ;³g+¯YC³Êþ 9Áªé΂.t KП)p¬b =ÕUн™à1ÑV~Oƒ€·!ˆ€>–(–À'R4Ñ€³!**qè9ôq‚‡ðÜ‹€VMÑÓ9E8ê[ýꣻ@h,²?ì/?õCDÇá–ßÇ G ž.Þ¼ÅñÓ5‚·´$\\“ƒY³¤åµ¥ K–LL˜ÁÁ’õë¿=ÞkõjÝQ£Ôìì” Hxò„Γ¹9ïìY» ôÕÔXÿÛ­[ÈéÓYò7c×K¢§ÇurR—HÈ?þH÷…?Cw%×»ÔÕ´}牟Ÿ¿t 0þ¾±olëjk5s¤Œs U^,þ{€NÞV,V?U’¤Ü£ŸÄRUåŒÝ4<t¨±¯oæìÙ¯$ûžˆ‹+Þ±#† 0gNS&“†ÝÇ'ÒÊJ­ukƒ&M~,úJAF£™™e ù¹aoÃPV&ý믤°0Q÷îz´,(ƒË—³ /+#›7W޿ߚǣy»Œˆ(oßþý›7ŽŽÜ; ¬¬êäk@Q˜3G"±¶f­^-`Òá_%E4DöGãO°ºƒ‘‚š£w&ŽHЊ‹Q*pæàz Fh¢“/KPi¦h¯‰›™(`¼: $IÅhm„¶PáàL4ÌmÖMp*R÷€»v|ƒ3ÀÎæØy¹z¡9æ Aa)6}Pb øèÙ–&X²íãtB6›W¡­Vm@QÍLé×_™½z1 °eK-jwâÏ?ÕºuSÚºµäêÕo07}û [¶ä9:r»u{ïëKçÈU‚Àĉ‘‘­úöÕjÒ„?rdD÷î!©©_tœ¯ ê+™:Õ²M­'h7ÚiÙR§E 튊†h‰ú8÷°è*s’åód]rÞ»¥½ªI¬`†Å†,!¹³—eª©óZºË<ü*5;‹þ¡¹£GÛôèa’šZ|劼-™U= K–Øvíª—P²wï¾P8yr­­páBMùWKI)>t(JK‹»r¥«ü«Ñ òù,OO}]]>-«]¹’ª£Ã=º‰ ýéé_e áå%\¼Øtï^YÃùñàAñСIffœÎUüü, êÊ­[W|ùrE›6œ«WÕÕÔèÚÁ ÅÿßÑø,; ÔAÙ‘â¦ñ$:óp¯ ;DÐfCŸ 1e¡©L©å8™m.\4Q^YMbu1Å»|ì€væÐàAÀÁ¥åˆÜ Gx ôrE~1â2>¶þÔáq8xÙÆÌLŒŒl„Fãìqöï ŠDj6ÖT»s8X¼˜‘˜HmØ }û¶–Ä¡U+vçÎJeeÔØ±¢÷ï¿‘öï7²²Rª’Uþý7ÍÆQJW®8Œ¥§©É¾s'¯W¯ÐË—åµàª;:wÖXJJŒGäõV•A\œèÕ«ì’’ohÝjbB›eæÚv2çË%e»îý¬Æ¯é^<­c “%±*JÄ7¶èèmù9‰å«‹Ëeöèa–’R²fÍKZòTeeÖ¼yMSRÊV®ŒHM¥yÔÏ÷Ä©S‰d&$/\hCË‚»v…fe•*››+DQþ£$)ÿôgÏÒ è‘1>÷öm‘— É® þø#}øðH77ÕîÝ57m² }ý“'ó»wŠ*wrâÞ¸a&Ö•†ºp¡üܹ2€øåµuí*òÏ›¢þ‡ ?Áš† ˆTP Ó9èÊÆ™J À%¡bLÓ…¯K ¦0Ý-„x”}M ÏGP.*¤Ö ÚÐäáI*Ý›‚¤p1Ôø×­­púÃ,Â_ÁÉWžƒ¤ÀÑ ýÚ¡ESú0‹ÃƲp°Áé~’m[3<@|b·Ðº5ñÓO b÷îÚ§æÏW0€Û¤ sêTQEÅ7vE‡MŸ®éæÆ[²$íÄ úÅ1Æ鄇·êÕK‹$‰+ÞU\ü=úȘLÂÃC‹ËeÞ¸‘öí«ëWW//ý²²†$XØLΜÎ[4”udÎçgìñ]ôK ƒF4¹Îh%søî~*/UMçæ.[0 y–¥kâD[;; 55¥›7hY°kW½ŒÔV¬ˆ eÁïÂBÉáÃq66ª[¶8iiÑPû(,çØØ¨/Xà,ÿjÿ df–zxèuîl¬¤DCY+.®˜¢`o/6ŒfG‰óç³¶lI ™Ý»k.^Lss"EaçΜíÛ³Y,böl­; ê>ÙæÕ+Éš5EyyÔÏ?+÷èñÅ_Âyó¤Îœ©‡=! †"ŽºÐXÑøM@˜Àuƒ9¸%ÁÎr0tàÁ¯ EðT“À\ÎC=¤•ã])üóà©÷Rq.JLô³Â£$ìyã\‘"¹P^‡Â¿æ]] Ìpì™][ÍMMqö¬š··ÒéÓegÎ|»CX±BwÓ&}’ĶmÙ¿ÿ®§ÐÑ£õ^½ruvV‘J1wîÛsçêgâÐ!ˆ™™rûö:<ƒ^KM£ªÊ‰är 6Ól:¹íJâ3iÂÓØ›íš¾c€hÂø2ÓSæ±ïA2;AUUÉÍ]V‰œ–‘Nÿ€ I“l«„2~~ ÿ1~zûŒù'šç=ú¾¨¨Dà¿…èèÂ{÷2™Lbï^Z<œ*+ÉR óæÉ¶Žþ P„+)©H(T¢Å‚$©/r cÇÒ“ïVÁß_´jU¼››êŠfóæÉþ­É‰ÂBé¤I)çÏ‹x+00/,¬àÛW× ::|ò'X´˜âÖ¤³ÌIŠ"…|Ÿ*ëap!ËH%³Þ«ª*¹{È~3 IOO£Ç ÿSŒaÅç³=J}ýšž6ƒX¼¸“IìÛNÃÄÃïƒsç’üýs*+©éÓi;ÿùgLëÖC‡ZÑÞ›ö#ãÍ›|4(úK`±ƒÓe Ÿ™)6,2?¿²O­eËÌèYôJ:txófQŸ>ƒœëáRA’X° ðñc±¡!síZ¡ð‹oxÇid$:vd,[Vo‰›lEõ £ñ¡1'X¬Á:²)`x¸fs`ÍÀ1 Ðw„W`°¬¸8›ƒRsÌᩎ£ÉP˜fƒ6º¸’„¼ x`”¸,œŠ€ymàeŸ—(“À/=ÐÊ;îTkÛg÷†·î… <¡:žÉ}ÑÚ;Ï¢ðƒ©Ÿ7Fö¤{O~ ›ÇÅ–5hã3çQRÓ¬Ê̌غ•Ù±#±k™ÿmúÞ½ªýúqE"jÉ’"iÝ”åƒ oÞlâåÅ¿|Y4lXRa¡Bé“'<|è\XXyíZN«VAoÞ|Ûˆ«aB9w®µ­­ððaÚf?››«:9iÒ &µ[a¦%Û‰Æã¤XèVw7ld‘ æ§¤T"¾¼@ûN–Ÿ“XŠ0vWUå,ZäÒ¼¹æŽ! [A$’Í¢œÕýµYÓ¦*óç“äÀ«°P2o^°‡‡æöíNti}Þ¿/|ô(ÇcbIË‚ŠÀç÷N~äçW´l©#ÿ¼ÅÂBÉ­[éNNj}ûÒ3ݹ¬Œ80ÜÐÓ«—æ©Sv´8œýƒ‹ :v|¯­ÍêÑCåÐ!C3³ú)“V¬(:z´¬CÎßk1s  –/'­­±|9C½þ?`)˜Š8êG£CcN°ªð•Qª p€,à<ÈÞlÄðƒAÀƒ‹ ¿žÈ”à\.¼ÔQ*ER®fÀ\ÍÕ¡ÌÂÑXèf†¤Bì~ ð0…¹N¾€¾ÎÈ.Bt:n†€–*š£°[>PV­Ád +¿]¬>C3i™ØxyŸ°-CúƒÏÃõÛØ´SöíLžÌ`³q÷.9~íi—KìÞ­jdÄÆÌ``Õ˜šÀ×ïj²0 öìaêë ÔõëµML˜7 ÔÕ~~’C‡êº5¶lÉ»xÑÔɉGh×îýë× ±,22Rzò¤Å A:\.cèЈ;wèo``o/7®‰©)ÿúuzFššª´ic@K{y´z³:mf1k|ÕPÎ4T‹«ú÷&Ö ¢&eBJÅ—ÖèÐÙ’£TãÓ–¢pïý6ž&&*C†X¸»ëž<Ó€§7oÞü󓪪ìñãÍUTXÇÇgeý(CjET”(4´ÀȈ·o_ ºJQ ’ãà 9y2 ƒ¢‡Zï~\W:ÊȈý葹©)Ç̌ݶmÜ¥K Ê̳gíÜÜ„‰‰å}ú„?¯_<õG²||âhYÍÌL…$©ªQµtÁJ×a|ë%2'MýAPR­?e•œ!“Õ•9^²„JdxFJ2mš³0i’ÝãÇiÛ·ÓÅ2ÄØÆF3wn0]kÒŠÂÔ©¯Â &O¶tr¢A—]…k×âïÜI¢(¸»+dºË‹ðð¼ÇÓ¤Òz˜3ÕŠˆÑÙ³I11EýúÉèlnÞÌݸ11 @t½=mSœ³³+ÇOþóÏü·o+®]3›1C«¾+\¾\>~|Appå–-ª#F|M³µkùè%áüy§¡Æåà*âh`4?Áê ®*ˆ‰¨œ†ˆK G°¡J ‡D”Ó…àxXcµ!dáR.TY˜e)…3i €)6à³p3¦:ÃD|’ Ád`¶¸,\.ú:ãu"Î~h½úe¸¼MCÚ„•@ð}…¢ÔR+'´qEht %€+¡®†÷ ¸q[öM͘ÁèØ‘(-­}~NÆŒáÍ›§leÅܶ­$&¦®ñB!óâES++NI ¹ysÖ–- ñag2‰Ý»­æÍ3‹É;“Nœ¨g’G2j”ÇLK+OJ¢a(²¦&÷íÛ‚¨¨¼ü|z\|ªàeÙ£{ó‘5^Ha V­ÄÚÂ\&ã%C‘—ÖhßÑBé3Ë÷î;c«Bûö†;;;kݺ•@ã²{ö8++³Â <øAm§ÏžMJM-e³³gÓ0ÔùÜ¿ŸÂç³&Nü¡é+E .N¤«Ë·³“-‹×W®¤ª«sF2ãóåek¢£KvíJrvVپݪsgzúCÄÄTL˜rKË®]ë=ŒùΊãÇËTU‰U«T¦LùÚX¡çÏ©ó穤$jéR†i£hH}üøñСCµµµ…B¡»»û•+Wd.HJJ8p ªªªªªêÀ“““ëþè÷GãO°˜À,(+ƒ8†’`&€ÚRB`:Ñ$~c 2,X8W ÿrLÕE%…]È«ÄH#”H±ó= +1ÎjŽÁô”±Èa98 ãÝ`¨†cAJ€Y¡¡ŒßVOα1Â8oÜÁæ$–·wÄý@ì:û1ÈuóÁU–Cxùñ¤¶vl@jŸDiÍzƒãÇ™­[Û¶I}|¾˜cmݪکçúõòž=ó²²êúÝ‘Ã!2ÞµË &F¼kWöÔ©©ååôë‘ ºß. IDAT;vXmßn\<~ü›Zs,y„ jjìqãš„‡Ð¥õ14TNH(Š‹£™Õê:Óɤ†ÔÌѸZÚŸõãLo™ë+/‰!ÊÊÏÖf2EFd$'ÑObÕôÞ½”]»Âêûįô(˜™)oÞì]´aCTE…¼¬íÈËÏ™ó:%¥lß¾B!mÍP©©%‡GòùìQ£¬éZSA ÝhôÙ³ŒÌÌR9]UËË¥;wÆ”•I§L‘·£³¨H:p`ÄýûùíÚ©Í™CVÿROÏwׯ.<|ØÈÁ¡Þ,ŽŸŸxÀ€ü›7Ë/VY¹Rð•+sr0dˆôùsrÝ:fÿþd+o×®]vvö•+WÒÓÓ÷îÝ»jÕª#GŽüóhqqqÇŽ]\\]\\:uêTZZZ—Gÿ4’»R+bP`R»É5”€ôQœ9’ g%è/ŸBXr1LÍx8•[Z©¡°§S¡®„ÞÆ €C1ÐË$…cá(‘@ÀA;8ô4•1 ( ûT‡1­Žû"óÃÞ7s쿈¼ºdscŒê ’ÄÚ}5ÞÂOCÑ¡ ®ýûeß±1ñÓO K—JããkO€˜LlܨêêÊŽ‹“Θ!ªWž4gŽÖ±cFúúìƒsGNNJRˆ±ÂüùÆ«W7!IjÒ¤7gÏÊÚÊ):ÔÀ©S‰R) b•8÷í[š3‚`Lk¿ÖHýㆡ­šª§VYî`(#jÊ/(ªâÂ*í:˜ËX|ÐN8p ¹²2ëéÓô·oë§ñÿz¤IæÃ‡›øùeíÙóà ޺õMvv…——Ö€´m½nÜHÔÒâvè`(¿IÑ ÝhôÕ«lŽŽõ.–}Š;w2Œ•›76o.¯R~Ù²¸èè{{åÕ«i³*½xQÔ¿‚¡!»_?Õƒôôê­è ’ŒQPZJM˜À_¸ðk%K©?ÿ,MN¦<=‰… åÝÇ+ÁTÄÑ€H,XàëëëååÅçó]]]Ož<¹iÓ¦=|ø°»»ûÒ¥KÕÕÕÕÕÕ—.]êææöOöõGÿ4æK,wQ  Ÿ \Fùt0AiÏÄ6XÀ_bLVEk.Η Kн ùpbO<(`Ž-<´qü- Äh¥1v )œˆ€žhÝa騲Ԟ×m­ñG’ó ¹fô‚*Û>´¶qÂä~ l;õ1Úe3нî<ÆO2™Xù Úzbí„GAÇ3fÎdp¹ÄO?I¿äÈÀçׯktë¦äë+^¸°ˆ¬Yп¿ðØ1c¾¯o‘»û»/h¨µ}ŽE‹L7m²psSݵ+ùóK´i£=p q~¾øîÝ ùWkÕJׯFýý{ú›õ¸lþ\ïm*ÜE £ê!™„Ú!F7™ë+_]•Æò•9­ÛÊî Q‘™´“X{ölGŸ74.Ëá0fδrw×\¶,ü‡²Å 9ò¾m[íýûiÓ¶Wá·ßÂõõ•'LhFç¢ÿ”•Uæç—·j¥ko/×`æ½{c¥Rrölyù¿?ÿÌ8y2£S'K—š++Ó# ß¶-{ðàDKK¥=T/^4ãóë½·†„HæÎ-ÔÕeL˜Àûýwá×÷V¬Þ¾MöéCœ=Ëü’õhÝQ ¶"ŽD²uëVâ“wniiùi™ïúõë£GþôúÑ£G_½zµ.þ+hÌ –ØJ@^C¾'89 £´ Y "A‚jÏB&…£b˜²ÐŒþ(BW5äK[ŽÛè®\1¢‹á—‹fj°×€P Çb §²J±/`¦Žf:x‘Œ}þ`¦c ”бãNu$¼‘š‡ƒ·‘ÿÁÆ}r_dæaÏyd} „*èÚe8üW ÷–Îpl±“fËz»X³†)•Âߟڱ㋩“®.cËUÖ¾}%sæÔ/?ppàÞ¾ÝÄÓS¹iSN»vïÿøƒþÉÐ/68P;$¤x̘èû÷ië+$´h¡ž—'>vŒ†*¡ŽÿÍ›ü¨(…´=j«Ì괉ŨþHÒSKÒQM©ú÷NVÿbȪ\ÅWhÛÁœÇ“ý»w›~B¨gOÓ„„Â'ÞTVÒYÎsw×tvV‹ÉI“^þ ¶X$IMŸDQT·núÍšÑ0Ô儆愅å$%wè@{ÓááyÖÖj¦¦*\nó™ÄÄ’‡³ââŠ{õ2'˜èè’©Sc„BÖ”)úVV_S8Õ$‰õë³-J' ¤ºi“^Ý' þƒ°°ÊÎóüýÅìÔ¾¾ÂµkäÆd^æÏg5f_†[·nÙÛÛÿóßÈÈHGÇÓ¥¢¢¢êòè¿‚Æœ`U¡9ø(é ®3ت ¢ f[ç@fà (ý•A÷Ë@3ôÐFçsÁ$0Ím5p:zA‡;© )ô³‚‡´x¸›ãZÂÅOP"€EÝádŒwYÈ.Ç&à  ìÿ0‹°… w@Kl;ý1Ôi#1¸;róqüÒ§ïë–ÁÆ L&Nž… ÔÕqì³sgâÌÒßÿ‹[Tóæ¬ TÔÕÏž‰W®¬ßè:UUæ•+¦NN<.—±|yæÔ©©ôï…óæ™Ìšedb¢4}úÛààê傌cææ¦QVV™‘!¯#€½½F»v´TkES='Ëd•ƒq5‰••ß™=d.® ¹%}ó„Çc{µ1“yèMtVR"Íy°‡‡^§NFÍš©ß»WÑhxxø7¯Y·®¹*“Iœ8ñCØb=OÐÖæN›F³ è­[‰íÚŽgÃáüzéërïꎰ°¦¦õ–{Šsç’Û¶Õ;ÖLM­áŒME9iÒGGAûöêƒëÊOÄbjäȤ+W ;uœ>m2~CDf11•ýúå3zôPÚ±C•õÕÒâ»wÔ¢E¤ñì]g\ç×=3ÛXXzïUT,Ø»bÃnĈ-ön,±k,¨±÷£F {A± ö†¨€( ½÷º,ÛwgÞ DØ]ðÍ?&ç7`§ì33»ûœ¹÷Üs7mbTëzúê4üÌ!,?_ÊÖlSq÷²5Ûª=‚#¨EEE+V¬Øµk×ÇWŠ‹‹Œ*ÕI©²öoÁ·O° ŒÒwµû9d§! â èC „ú1¥ÄN)úh#[["‰0ѯ…ðÏG¼?Ø ¤Ws‘.F[äKp;×ÒÁ"1È3°ý%´·—…GI8 ¶håˆko°;¨bóáQîG¢è½Y1±i‹EÚ‡´›…¡½ñô5–oÿ¤§‹UK™…£'_Põ{ö$<=‰ðpzôhå—ìÝtèÀ>qÂàÍùÚµeü¡žîÁ vî´:pÀ:7Wþì™°OŸäììú—dmÙâÒ¹³A|¼hüø˜” êCbeŵ³Ó¹v-ûÈ‘ººº7jdøäIöåËÉRéWqº—+e1Y/?þke˜ò1ˆµ‡9¸Uå®ÒK~ºtwæjWoî|… V¯^¶d;¦F–ÐN…~³zz¬U«Üž?/8w.£¨è«ØÛªŽÂBÙ²e‘OŸ¬YÓ¤.³xµ8r$æáÃÌ!Cê¹ÉÝW‚*÷Nuܽ›ñðaV],F)ŠþõׄòFŒ¨S±ÜÒ¥‰OŸòóóåûöÕCAi©ÒÛ;ùÌ™’„éêÕæ#Fhbçñö­bÆŒÒìlÊÑ‘`ÈáÔ‘*+ÃÂ…Tl,íæFTÛsP$ÆÓ`ï!5Æ`D~¾°×,—­ÊÂ^³¼Ú#¨w!*#77wèСèܹs]Žó÷âÛ'Xadæ#”Ž‚6 D<”æÀP]A\5Š 8%ŠiLуW…0db¸1,Ù¸X+-Ìu—S™ Ìj }6®¥Àôæ0áB®Dd,ê -&î'¡<‹2±3˜$B“Q*€Nnð팄 ®˜‡ z¶BT~û$^å;ZÅÂþ?+…ï0x4ÁûxlØ^Í9®[ÇhÛ–‹é¥K•54lîߟsè~·nìÇŧN©í#:r¤ÁÓ§.,ñì™pìØôÐÐz®Î üö[C__3@¹pa|q±:`_ÆÔ©N\.ãåË¢:&¡´µ™M›9;ëEG•<é­w§ Ê*iÅšÚ„”ÿÁ‡Î¯ÌU¶W¾»«Œ~ ¥ÅìÔ¹ª+î}~rR=?·ÓÃaäæŠT勞¯Ò„êëk?fŒCDDñÖ­õ©ñÒ{öÄ3™DÏžæååõˆwµ™VV::ü3ì¯T¼w*¢¨HÂã±:uÒ<¤qï^žŽ£AÝ.]4¯C¼¿øùóR6›ß;ÀÑ8˜Ú ,‰È€$0±5þà2:£;} ± ڸ«øBüv³bgkŒê …²R9aóÆð™›V:;,~›ÀÿLªîà@lÛFvêDlØ@…„ÔÄK¦MÓY²„'—cêTþÓ§js,SSæo¿ÙÌžmlcÃ7.}ÍšÜz¡A¡§ÇÜ¿ßÕÒ’}ï^ñ¼y¡µïPÇÛ8s¦®íÕš77^ÿ$àRØA±¼š"Mw›çå ­ýäÀ*k•qO•´˜ºVM<ÅÇæ'%ÖsËÃÃ844÷Ê•úK¹ºêÍ™ãJÓðó{÷·Øb)ôš5Q99’+7jT×Ù÷sܹ“ÀÛû›ð‚TOŸfh×ÎBcn”—'¹s'‡Å"}}5¿€6¤¦¦JHÓ¦ÕI# :Z:ztzB‚ÌÓ“{ô¨­½½&êòŸ~*•JáíÍÙ¹S¯æÌ €+W¨;( û÷3\\ªÙ¸¨~›@ÓX0[íÁüïD°òòòúöí»iÓ¦=ªö±0`À€ãÇ+=ˆ?~|РAª¬ý[ð-¬LˆüŽÄa0áCqùÞÐêNäo _ÒÄo ú±0ˆ…÷J+0GüZ )1&È’cg6,rF#¶%渡•1Î&£P []Ìõ—‰½a0Ö#šA CP<ôj‚1í‘ÅDZZíõcàéŒçQð!­ž„î-ñÇu¼øÄbtý| ê‰SWü´ÒMŸˆF"9k6Vs¾’½{ÚÚ1BY³°oÃÝyót<=Yƒ•„„¨­¦b±ˆ½{­gÌ0îуçç—Û«WRaa}Ê’lmµ›uëfN=šU÷ŽïئÑÙ³iuòaoÓÆ¢aCƒÈÈ:i >GfIò£¸ÀjWÙÇêTð¹Ìþù¨š¸‘žYšîÒÕQ‡WõW>¸¾»úø8·lizõj²Š-ƒÔªQX²¤±MHHá¶mC¢pïÞ¸;w²ûô±˜9³>}ÛË‘‘Qöúu^§N–=zücêëÑhôÑ£,=ooͳ®þþ)óæ¹ZXh–¹u«pË–ÔnÝ üýÝÔí Xaaâ>}’‚öñÑ¿ßÙÌL“ö…¯^É{ô(ŠŠRüð÷Ò¥ZtWÂÂè;(bï^F·nÕo<}>"£0i,–ÌS{<*j­Ô]ÔзoßåË—÷ëWµ¬§S¦LyöìÙ† Š‹‹‹‹‹ùå—É“'«²öoÁ·L°¤ \Ef pE R!‚È ,è?!ò™:Tè6 ˆC2´àÀ‚„B 4D‘¡e-Ãs”)-À½¸è¡)ørü¾‘/ÂáHˆäÐb¢…5^¦aÓ‡´à–(“àÀý a–§ ,Œ ”`ço c´w‡’º£ÜÒ Z@$ÆÌÕ~"ü%I,ž‹6ž8|žUsÊK—2,,–FO˜P“ ÀöízDQÕ§Oah¨&ŠõI“Œ¶l±´³chÓ&>&¦>÷¶j¥;k–õóçe³fŽ|YWë)++®™™–X¬ë֭줤²Úw¨?dg‹ýü¢¤Rjòd'zk÷ûÁÁ‰ÒÔ”ËåÖÿÁ¿êÑhôñ㬔”Ò-4ÔNÑ4J|ö¬ÀËKâ¿’ÅÔ©±4~ýL5ª“/ÃË—"/¯¤Œ ¹­-ûÏ?ítu5™@_¾”÷ìYX\LµiÃÚ¾½öÌ`FT>zD÷îML›Vý;ž8ƒó—àçE`üªT¿ˆððð‘#G•QRRáí§««{ïÞ½—/_ÚÛÛÛÛÛ¿zõêîÝ»:::ª¬ý[@Ð5ÏÃÿp1~ÕÖi _@à­Ñ°˜…bøÆ‹@%‚î r4M~'E#@7Ëà/€ —,°:Jш‹ŽØšˆy°çâæ¸Ÿåa`Á}Áa`HŠ$ד<À— ÏaÐö Fk[P4ÆFZ!¦tØöð"?‚•ŽÍ‡!Š˜°E|,ïö#—ÉÑmt´Ñ§3V¦àk6áÎ]ˆ%x| ¼Ï><éétJ]]ŒGÌ[ÓWM©Äøñ%ÑÑŠôtåõ놭[kòÀ‘•%÷ñI%IDFJŽ·2¤>­ƒfÏŽ ÊžÉpl©µ.tðª¢Ç]…e• ñfÎéP/ã,Ǿ}o/\HlÞÜd×®zvú.ÇÔ©¯’’ÊX,òÆ.õkòYÆŽ INÚØhŸ9Ó¾ö­ÕÇ´iRSãÇ7òõ­ÿðØÿ8òòÄÆÝd³·n d±4¡#ÁÁ¹~~ïØlFPPWÍl‹%ÆÆ Epp CóOÕË—¢þýSÙöö¬“'íX,Mõø±lút>GØÛ3Nž4¬Õ#T,F·n .4;w˜N5Û$§¢ç`Î4Œõ‚Pcf'B‹V»æIHî·M0jÅ·Á*G$ø—>¯! @‘.h¯ €Øä#п‚2%Њ ‘c”.¢dⵓLñD€#yÈ”aœ žã~!’Eèn %…'y8#áq¶¾„’†¾º» 4 ïI g<ЇߕРVÛ†pµÂ•пºê¢Ks<~ƒ%ûñ±Ù<›…uóük÷"«²¨zň%ˆx‹e~Õœ¯­-±oÃÀ€X°€º~½¦7ƒ?þ0h҄Ѩ³oßb r…¬¬XÁÁNŽŽ€Z¸0{ãÆ¼züBíØáB’ˆ‹ù®Ž5€ýúYòx¬øxÁýûu’ºki1?Îzñ¢¬áP4u6´¢;Ra™Å·#k`W$`íd ­ò¢29,"pÙ«ô`k·ªu)ÉEõÄòö¶{ø0Óßÿ½\þU”R7z¼}Ë¿u+û÷ßëj«¡"îÝËŠ*ˆ(Ù¶­Yí[«¹œ:s&þöí´Žëj ôOĽ{Ožd³X¤fì À¡C‰Ožxy™iÆ®îß/Þ¾=5(¨hß¾†uaW¯_‹½½“4à4lÈ9}ZCvu玴oߢèhEÛ¶ìÓ§kgW…¹s•¡¡tv6ªgW f/BR2\œ*Ø•P€ù5 Gó áÛ'X`3A”AÚº6`ßEéhh|iO @˜÷@e!–Â+%XÆéÁ‰KBØq0ÄŽ\,‚óÁ!q* f7†·³`xCôw‚½n%ÀüÎ౑W†è\Ó Ì¡ÃÁÅWCš?l&^Ç#óÃÜ7Ë–`0p:译{uÀ^02Àî?*‹ÿßÀf#"÷UsÊ}ú½z½{•qqµp¬cÇ íì|>µre©fK[›<~ÜvÓ& ‚ÀÅ‹ü‘#S…Âú™}CCŸ]¸àno¯Åb;vÔ©/:“I´nm¤PÐ7oÖ‰µooá⢟P? sH‚üå»Sþ“^÷<6k–\Y)ˆH‚6£ÿê{ä•þ${dUºéÞü"Gttª†!o߈­—¡–ÃÙYßÃÃØÑQ/4´vžªŽÇؘ½woK‹¼|9#;û«eÀ¬öà²ÉGyÏŸÖh`Žä|„UŒjñ00¸ø)ÒC»¢mdâÐ'½)í­ÐÉ|6„¼²ïæÌÉh× 7ïà—êú6mb4mJÄÅÑkÖP5÷xf0°e‹Þ˜1Ü-X'òïÝÓôë§䨍‡Ç#ÇOó¦~dï]ºþô“BA¯X‘XR¢¹û¨vïÞ2uþ¼æ~ Íš™ˆÅŠÀÀ”ÜÜúôY½ð*³Ú×72G ¥ž…Êæ.Sœ{n²î½ÁT“éó•±FløÅ,à®î¸ò-—ÉÏ …W²ÂÏB–wnÖg«wo[ÕCuç—°vmS//óû÷ó®_ÿŠïÉ?v,™É$6on¦q«V”‡úºt©«5À?‰‰|33®­-¯Y3Mz(`” âÅØ’ `¯-  hLo„vfˆ)A\&~n-üòì 1¯3RH»x IDAT^f`÷`’X;V†øå*Ê¥D ­±p(dJ¬ûÐ^ °k:¸ãêd}qX<>Þ~‚í¿W:/&»7£['lÛ[Q?R<ýú;v(—/¯ÅF¡<ŽÕ¤ ³¬Œîß¿HÒr4hÀyúÔÅÌŒùꕸK—Äààú)[¿ÞiÌ‹ÒéÓëÄfÍr±·×Ù³GsN‹>Ü…ÍfÔ/Ãx›Qy*ϰÔ×Ò"¨T˜½%`½ÙUš€,X^5Ûzžµ”â™¶O9Çr¡³†QOå4ýò³N>©)Åq±õæÝÕ©“eË–¦¯^ååç­ž½½ÎÈ‘vZZŒ Bëè¬ñ%Ð4fÌxÅ``Õª&žž5éÞê…‚zò$ÛÕÕ .&æÿ\ܹ“SìëÛ@3ùÔÇù|¾¢«Þ½Õ¶¿§i̘× wåJ‡ví4¬¼IHõ,oÚTëÔ)[ÍüMž\âìÌØ¾]ÏÏO%võâ½v­²Ab÷nÆðáÕÏÑJ%fÌGb2¦ŽÇ⹌«2d_gù×ã[&X™(ðÂ[Â(‚ Hëý2(BÀe R úăAðP\n$(ఠݹà°c"H„ï ¤ð¨¯…ð6Ä q;†l´7ÅëBì€Ñ!”ãN ÞäÀèÉp0噟Vðt@V Îh77¥Lt—‰ø3u»¦°1Ãý×Xù‰Å(‡é#¡PbÝ~¤dT:A'Œøf.@nuîâ..Äܹ  ›7S§NÕ¢‹"IìÛ§?hG"¡}|Н]Ó0þddÄ8q®o_ÝÒRåôé™gΔԾÏðQÂbkÖ8êè0rs¥§Ni.¢êÕËB.§bbJ=Òœp8;ë‹Dòû÷«9ÕŠOÕúÿ.Ê”çµ PÈ/ó—m¾-_ÑŠŠÿȮʑ“O£T9Ö2åY&­ —ReŸ±n]__Ål6£M³Æ <¨…bòùš§t'NtrpÐÉÏ—.\øU…‡'00`Ï›×ðk¿áᥥ2’$ÌÌ4Épý¨Ë½ûˆk×RÊÊäMšhXo{èPb|¼ GMäígÎä>xP'ž;×V³wÏÌ”÷ê•”“£hÙRk÷n+ÍbW7–ýø#¿cGöŒ:?ý¤’,&†î×ON÷éCΞýÅ zÍ&¼ G»6Xÿ3ª6M¾éô×Yþõ`¬Y³æïÃׂÒ~›¯ùnÆB(í= 6ˆ2PÝÁ˕Ŗ°ÒÆ»bÄ•Â× †d`H ¿ÌxH.—…œ2ôpI@$EV ž'aB' yHÎA.a‰ö¡”¾¹+B£—†î°ú ev²EZt¸ˆJÀ ÊÍ<›#<º¤ ¡å-+°B  m0‚ õi@0’x w”0$1š‡Flœ)ƒ‹ú¢±Î˜iö*q"¹Ã˜ƒçy*ál€)Í VâØ[hm‹^ àd„aÀb`ùXè# ¬B‰ee„¹ƒ`kŠ#wþðÊ °4A à K3 î =Ž]@qåiÝÆ Ó'ÍÆ•›ˆŒBµØ±ƒaa‘³gSÅ*À-[ÆÛ¿_Ÿ  Ù´ICŽ`Ò$£K—ìµµÉèhɈiI]9Öþý YB¡òرlÍŽ`g§Ý¶­QQ‘ììY ¥î Ñ·¯]‹¦Ïž©‘¬,gWåǽÏ_¹ôVtT…ÓÁãTS¹¼R•™ JPCÄR)½b……÷ycìè¼»òe+å¾TUb¥§•ÄDÕµÝu9Zµ2µ·×34Ô*.þ*©X° á°a6‰‰ÂåËßÖ×1K–J)KKîîÝ-ëë˜_‚TªtvÖoÛVm Ñ7€—/ó768P{Š¢CC Í͵¦OwQwߨ¨²ˆˆ2.—J(Ì·@„›³ £1Õï˰= 2xY¢®¥ãD"LõÀÛ|lzb ,ïˆ,ø¿‚Hã:BŸ‹s/ÿRb-‰ G‚QñŠž~™ŠÐhø_‡ô“çöi#ѹ®?¨x@ùÃaÞ ßǨIW'b±pú4³Iúömê»ï2>ú3gjÿù§@@/[V:}:_©i³Áõ‚ƒd/ò HÔx®ù\baÁ>|¸Ñ³gü]»Ò““5YÏšåQ²uë{ƒjݺY‡‡ç_¾\ûCbvVé«1‡~ ©9€ôQGõ)ÄÏJ‘À¦kÃåÂ0žÝªü MèÔùÊ€Á¢?ŸEù‚nÇÕ‹‹ÍfØØèö©©‚Ú)Z·ÎC|Ük(¤7íÏiýN«K·ï3mŸ¼1¹,µ3,9ÖOÂm¤²jz7øV|½±Úµ3××çÔìç^_f•ãÆ9ÌšÕ 6V°hÑ›º ~ãÆ˜#G’Ú¶5^¶Ì­^V3Þ¾-d2‰6m¾ðlŽ ý‚þ¸W/ÂߟѲ%±t©2 @%¶äáÁ 4lܘ©T¢S§Âäd ¿:ÖÖ¬‡›5ã2DŸ>ÉÙÙšs¬±c-||Ì\]µúI×Pccöôé.íÛ;VK)Ü—0hc6éé*9©*•ÔÛ UùêÂI6œ¿¤•EÊ%1ƒnÕƒËÍͰ{wkCC-‘Hó›¨:,-¹Ó¦9»¹éíÚwçŽÚQ"¡&N|Ù¾½ñ‚ {ô¨“û€ê(*’˜šr41(ùG#.®ÄÊJgà@ ìUårêÚµ,ggÕÛ73Szøpvçλv¹ª›“-*RœÚ¾½Î¸q†Ë—«qè©SùééTƒÌ»w=¼X(¤mm껸¨úéZ·Žzø0c9p`Moºc?²²¡§‹ÀÓ0®.ÛüÓ/(,Ƥáøy–Zc¯ É×Yþõø– V9R‘w=à˜þmÄ7O|·MBAoöAÙÂaá§‘x‰Ÿ"퓈'¶‚ÅÂö#Õ$ [·Ä˜á¸ÿÓæ!ê}Õµ±y3cêTòéSjð`ELŒJÓ-GMšÄ WŒS y;  'CCæýûe¦”•i¨ëš5ËÖÒ’X°u«&¦V½zY<}š¯±Ô½wo»/rÏœ©=GÙÍ˹߀ƪS‡*q\q*»æ%ðï ºÐJ|Ã]rßUúÂP™Ã¡ET!ƒ®%%—Äny^9E0˜PÞQ¬ iE4Qõkž“-ˆ|S× –µµNHHnxø $õõë9xC’Ä´qw78z4yÔ¨…¢öíÕ«Y~~QOŸ\¸ÐÑÝýÿ/˜”œ\úøq¶D¢d2ÿ‘¿±ß»ÈÈÂs犋¥=z¨]§YòÇÉYYâ±cíUß‹¦±paü½{Å Ø:8¨—!;wŽð`AX˜80ÐÁÚZ=S†²2z„’—/å ýà±³³ªìê·ß¨U«”OžÐçÏ3Fªéãq3‡Ž!% §ŽTãØàÀIüq 9øy6˜ÿOÏÿA ü#¿üjÁe ¨,)СÈìKï#O!°é ­æ`Ý„tÈLàhq,ÀI9ZrÐA "„hÅæ0f! Ælü`þ0× $—È—€I`~+8ïÜ!SâtdJèça­£‚X-ÐÑ O¢±ë“2Àž­1¼ÊÄØ~²Òyµò@‡–(æcïÕx_|!a¹ø_1¶ne FÚÚ R©©*q, ;vè/Zij±aÌž]z膕ó¦¦Ì‹í\]9E/X%•jPa2‰íÛ]'Ndk`‹5j”½®.óÍþû÷‚Ú·þ ÞÞvL&ùæMAIIíÁ¼O9–k#ÓK»²ÙÕü" IƒGÜ?+:›‹Ÿz ü½K áïQ²~vÁ”…ù£~Ìß­ìäç{U•"–¤•¬©]ˆµ­ôMªÚaߎ¯c«aCµfHëÖÖÚ‹720`d¬^ý®æ3 )\¿>Ц±aƒGÏžÿOÒ«rdf–ptüG†¯ê‚k×RH’6ÌYfyêT*A`Ü8]]5¸Î•+ùoß --Ùóç«u‹Œ¯^ãàÀ>tȦU+õìæËÊè9søçÏKš6e^¿nää¤*»9z”Ú°jÝš8p€1thM—(<Ë×!.3&¡ïj6x‡Ýþp`¾ºëÈÐß>Áêf 0ám4Ðç:â¼aeÈ49††`ÞßÚ±Pü†²ö |@¾}Ôl83°O†BK aHbS1h`ˆ!ŠåX— ˜ïˆÚØ•„<)êcŽ¢Š+‚Xã›ÂË—ãq'¾kŠáxœŒ#ZåÌí #¬¾Œ¢¥l¿Œ§ vâÙ'ÅR»æ£ƒ;öœGP(>…ß\Œèk÷±¢:¹Õó=îÜÇŠu ¾!b0pâ£U+"(ˆòòRfe©4ã¶lÑ5JK[Ó¦ñW¬øÜÒR%X[³nÜp01a:T4ztÚç¶ŸªAºt1X²Ä!#C:k–Ú(]]æ¼y ¥Rå êî ÀÈHkôh×¢"éÕ«)ªl_α\™ŽŸÔÚÜ\wѲnZZÕ(6¬™ä ã•VˈJ¬¨œ3Ùˆ½¨ÖLöºOu-;]þ7ò•ßµ¶öêÕ Êf¹9‚7ášäF?ÂÅÅÀØX« ÖWBË–†·owëØÑdÆèùóÿ”+¼r%ÓËë~ttéš5M-ªîñÿk"%EÀå2ÿ‰MrêšÆáÃQÚ4ËöîwrâýøcÕÏj J© x>úcǪç[VF{{;&2DëØ1ÕÙÕï¿S“'+¹\LšDN™RÓ䛕ƒA¾HL‚ÙX<·š Db,܈Ì,ŸŸ¾•V‰5Ðn(¾Îò¯Ç·O°šÃEEÒ, ÅY q1M¡ßúAÈiÝW(óG¾Øy(d½APÀAP p% ¢ñ» ý¸°bÂ’‰ B‡X1®Õ7=H(ìO_GÈ(üú|¸Lô²€!@ðmšÆú»žXÀÕ|1¶~è0ho†~ž i,8‚å_V&Ü\\‚äv‹§‚ÉÀn>6b±Òß?Y(Ôä÷ ];s…‚:}”}A IDATZÕJÆn^Χ´)¸×7à.ù¹‡ƒc5 ¶DÑÕÈž=íÔçnͶt¾©èùKYÅå¦ä9‹óG¸J+¨w+á¥ìª³©ëã=¸-[Ù˜šU5¶¾s+®V£Ôàè¨[X(©!‚U/F£Õ¢M£åËÝúöµØ»7¾OŸ‡qqU'N¤ öT$RúúÚ­Xᦖ §^“#‹ÿ~_šÝ»‡3SR,Ù¶­ÚñBÿ”Æõ»v5mÐ@°ßñã9FFL33Έj¼#McæÌÌÄD™«+gÅ õ†*‘Ðóç—FG+ììÛ·ë©Î®._¦§MSÒ4fÍ"§M«iæаd52²ÐÂVUãØ`ñf< …wW,ŸYuÕÊCpýéç;}ÿ¬¯Æ7ÜìšµÖoí˜5£yÐc©å Kd¹vƒ}$Jb ˜ LjK@5×,1ÅÇ“OžÐ††Ä¡CÔ A¤®j?q-Z°Z·f½|) ’…„ȇ Ñb2ÕžÊÌ͙ݺñ""Ä4°0qïÞ½·Ö—:rU†¶6C[›-¼x1Ê+K1˜›k%&–Éd—ËôôT»¥‰ƒƒÞ«WyÂQ£\¹\• ˆˆO~/ÙlFóVü‚ª™V¡P«Ó¸…'éA¥ÝÞTدÊV<éj³w9ÝHúü1«s´œ~,Á8*øÓí™P0H‚åÑ[K‹õ¶’ÁH$75ãYZé©uÊÁå2=Ê62Òòñq©V<^ï"÷OáâÂsrâÝ»—Ëá06lˆÉÉ‘Ð4(оq#{üøÁÁ¹ŽŽ¼±cöìi©ACººãáÃ,™ŒêÖÍÚÓS½j¸ÿhvï6oc³™cǺvꤞEѳf…éé1'LpjØPU‚UR¢ðõ²²â¬YãäêªFOèC‡ ¯\)urâœ?oob¢†%©LFûø‡„È›5c;g¨:»ºpš0AÙ¦ 1mcášØEaäD„E Wÿ ºÕõûñ¿„GáÑ[—¦r3¡{¯°â ĉ~‹–®±P­´ÆÏϳרx"êaŸß7L0TÁ·ÁJ@€`»Ã1é÷ÑVñ(|Ž4{p KFÙ+5v $çPèîÈ!)²)ˆdÐ{AõbAè×ä©‹® !ÅhD ÄÇ+!:‘‹DަÀ.ˆ(ÂŽw(“CöVσßS ŒóDd6.½«bµr€ Ù%ðû »Òæ`Lw¤åãÜcˆ>{Ù,Ì÷El*¶DDåpÉâ©+pç f¬ªæ"ôì†þ½QZŠ 3k¼ €YTD‡…ѽ{+òUöìÛWkóf=…—/Kú÷/‹5‰ˆ´m«½q£åÍ›‚mÛò÷îU; `âDK>_™ Ú°!EÝ}½½-ß¼)9qB혘h±XdLLÑ•+úi±ØŒ “[»7«Æõ§¸X|$¹CaÓ±U^׆ôœbã¾°øacZ-îrÅbÌ÷Œ%—„Êgå+²Áu²u•íe·÷ÑE™-<­Í> bÝ®S+-MðüyN~¾†M!ëˆLÂÂúØÙi;8èìÙ׿ÿ£Ö­ƒÆ{Q"(~ûÍsÓ¦¿­l=1‘ÿôi6›ý-ÿÀVX¬¸t)ùÙ³ì!CœÔÝ÷æÍìððâäd‘··öWëÖ¥ddH( }ûªáæ*š3'«´T¹f¹ƒƒý(år V|íšT$¢wìP#vuþ<5r¤²´^^ä²eµ|$æ/GÀ5óá·¬ú²Áwq˜¹º¢r°©k¥UB1¦lB!š«‘hý_ ßò÷¿ЃRG˜›Á ­aí£HëÐ}‚a0²» &èà6û2$3@ÚÈø²PL㢆$&é¢N•ÇÀd3´áát 0‡5·ò¡ ÑÃÍáf€“I0×öz €'0 1FµMÿ¥ÄZÿ<”wêýÇtG¯à‹*©ÝÛ¸aúP4v€ßï•4U,&ý#ääÃÿR5×añ\Œôµ%¦üˆ‚Â/^.SS\¿Îtw'ƒ)ŠT–ÖtêÄ~òÄØÚšÐ:fei’,ìÙ“çïoËå’çΕ\¹¢¶nšÁ hhfÆzöŒŸ˜¨Þ|ïãc;t¨ ›MÞ»§‰UÕ÷ß7hÕʬ.m rô-Û´«&f H•Ê4÷ªòº·[°uöñ0Oƒè ½º¸™üD¬cŒ¢P9f#—È®m!I«wÕÝ‚|aøëZl&j@¯^6ýúÙþ= €ëìÙþÙîÇxy™{y™jsútûÔÔ-[þ꺺¬öí-LMÕ“Nÿ£qýzª»»Ñ¤I\]ÕvBÈlÙÒpÖ,ÕCàÉÉ∹9gÇ5ü ø|åÒ¥9¶¶¬aà ¼½ÕÈER-*‹abB7n¬jÜëÊzófJK ‹“«VÕ2áî?ŒèhsqÞ «cH"16€­%&ø`‚OÕµKÀ­UªW® Ù×Yþõø– @ R^á•'$ ë1Þv‡Ó{\G\X¤AtÙ4 ¡в+(íWB™%ˆ ²ã &°I㸠¯•øQ¯$ØËG¾³,ðZˆ«ÅÈ–a¨%@àZ.ÎeÀ¦xœ‹mï  ¡ÏÁ£7Ú\œ> K <{Ujº\ff¸vÉfãñczþ|%Ÿ¯êu¶µe·lÉŠUÌž]§‰ÄqÁ“… M““e?ÿœ““£P·ãìÚµNööZ%%Ê'OT7`êTg--Æ›7%ÉÉj·&45åZ[ë0D``Šºû~ ‚À€ÁnÕÚeÉäôÝ1œU^_¢¼pëØÌb±­w\Ç¿`ëÿ½³ êêÚð}FãîB„àî^ÜÝ¡¸») P h)P¤@[¼Å­ÅÝ‚OH âîãß %!afúµ}ßÒ÷¹æG®³×ž9ûœÌìuÖzÖ³$}ÕBÁ_s•Bqt‰H$´h]ºÐ›¤$çÞùcçìäd* Å©TüYÍžÿ‰P*5À?—änì½‹Í N“ÉÄ={–4ö³vHDýû{ÛÙš° ʹr%].Í›g„²èþýégÏf[Zжo÷”ÉŒ`æ-[–½{wž‰‰°|¹U­Z†:Í¿ü¢›7O›‘A§NÂçŸëñ®nÜÂÿ+bãÔ—^]‹¶ùþ¿^ÆTάј¤œeæðõO\}È´O)k„ˆØÿð×âãw°jP#ô‚S9“œ«u ŒÍIÂ:áaŽx?Ñ50o€e6š[d Àì>ÊMä´Bh‰è"Ú_ÐŽ“á.b‚DŸYc&byj±óÕ+²5 ðà;Ås& zy›Çâ‡èÀÖ„¹õÉP0ÿmeÇÒ6XÈ™wšŒ| –t'[Ág?ñ[%ÝWƒ¨âÃÚ㜹ÿûrº5¡]}ÎÝaÔW…Wºq!Íë±m? Þë x¸qxåʰt5›¾ÿÐssãøqq×®¢;µmÚ¨³ –ˆrt]¸`?t¨iF†®^½”Û·n§#|ù¥K6¿þšÙµëËü|ã"+®®²iÓJܼ™1n\Èû¢€££|âÄR±±yëÖý‘Ά#FT”HD7þ aš4/Ù¥{Eá½Â!–C¶3š¶x÷ €neÎ7_n> ÌîXö· ÖsÁí ¨A¡wP]ܦM ¯RÕÕŵðÿÙÓaÍyÞ´±‘k4ºÄÄÿXŠð¿¯Ã™›püÛ¶¿z•3ztE;;ã¤>ÓÓ•«W‡89ɧL)ìúŸþB,fÁÕEÃÂC‡Æ˜š [¶xúùA½úþû¼Ù³³œœD?ýdÛ¬™¡OŸÖuﮎŒÔ-X Z´HÏ¿Á³P:õ%8„ÙSùbjÑ639;VQá½ìḕœ `P;&÷6ð ⬿¿ƒUšÒ:t÷¹_-º‚kà¦CH¬#bWLÝ1½Er,‚ÈÛMJ{L¤€2Uk`ZÕÄ(`³’Ʀ4’ã(æ`µÍ)mBªš“‰hç °ú@W/ld~Ëײ”Õ¢ȯI)w"‰oKé’ØŸ#¼+ÀA¢Ûc[Ë rÓP¢2ÒÈŒ¨%ÂStÑM‘ÑHÂ%jèj‰Àšt€ÏÝidɺÔ:F• ½3j¸“Ž\̼ªÔwbÉ#;z”Xð–Û°¸ -Jq3ЏLS_õà“2ì»MÞÛÍ)éû ·CYþéÊÙŽo¦Ð¸W[°ä®qmL¢~uúL&©¨½¾{':¶å“úôÂí{Eüá±µ5AAºfÍÔÉ×ö™š ‡ÛöìiR¦Œ¤wï´‹þž9:JŽõþä‹{÷V¯6¸ ÑŠ~Ÿ|b3g΋ôt#6þªUmöqu5Ù¾Ýèz@¹\<~|¥jÕwí*¾PÓT¯é>pHÍ÷µ°u:áŒÅðó–ƒÞ=XJËÖ!‰ùs:–•¼uË—½¢Æ…¦«®lׯ…T®âö¾4Ãù3$ˆåädV»¶sqšÝ†'˜?:T«æP¥ŠÃ߯¿õgÁ¨{wòd¤L&îÖÍ·ysOýÖï@£Ñ}ÿ}„¬GC'êtL›ö¼n]ëùó½ ÍÖÍŸŸ’ߪ•ņ FHž_¹¢ìÛ7í“Od=z˜öïoh½ÂºŽ5~~´l)|ýµ'#“ö½ ¥oö~_D/g@©¢ÛX£ÓŸeŸIdóa>©ÆÚÏ(ýê¢ü³ƒOp‰½>ø(QÞâV9J„s‰µñ#ùX’—ÙÜNâô+€Ux–ÂÉnÅÔóÂÙœÓ!,|«[Ô·.V&¹Ïê3oŽH%ŒlCdKöúN±W¿ÖXš‘’É’í…W=sb©éÌýºh÷©ã)[š¼|:JDä‡. ——°w¯X,æÁ]óæjÃ5He2aï^ÛŠ¥r¹Ð¾}êéÓFK W®l2}ºã­[’Ï??>Û¨¹Ý»;ŠDB\œrÁã\¥ŽÝž=Ë:|8æ¾Û¶õº?içÎP£R“@ùŠÎÃFÕ‘Ë‹Ü0ëqÊr¤îRÁ–ª[§—M-édÞ»ŽÇo¿÷RRpºV£<ü¥ Ðâý VZÞÝÛF±”JõíÛ ÉÉE§£¢þHƒÈ¦<|˜ügý3üý0êÞmÙôâEFýú®Æ:”ÇÇ>{–—ײ¥¡jŸ?ÿœpûvfTTþèцºJyË—'%$hæÎu¶¶64¨ìÒ%-?_W±¢têTsg]½ªkÓFŸŸ°j•žÏÊϧcofË kàa‘Õ5kfh¿B@X³Æjôhóõ´iY‡ícÍ›ç\­ši``nŸ>QJ¥Á€*U,úôqK"êÕ³¿x1qÍšýÖï¡}{¯Ë—_íÛ÷GÚÏ6cÆ×³².âÙö±iÓÖ³Ô›,‰ßá1ÎÊW=jýþd¿\Ü#‚þ™V£8è/´lS˜Sœž–w÷v´Q§—™©¼z565õ4?ûÈñìYúÕ«±*Õj õ¦MONžŒªVÍÑÉÉ8ѯ{÷Òöì‰ Î4ÈÐJÀ½{SSU*•vð`CÅ fÎŒ¿v-'6VõÅNNÉÌÔµi“zïžJ.°)2m÷>îÞÕµm«~öLר‘°gøÃ³t:FOaýÌL9yE›Ýbãn‚^°v.µÞÍ}ÆœÍ\}È–Y8¿#ú¦üžÍÿ¬¿³ƒõB/jPˆ"ªåˆ"±n&H’ÈÑ ¬…Ñu{a'‚d7ǤO$WP´A…î<:1 •!‡}*Å °ÄTà§LE´±æNöÑÑ©¾H‡¥”–nap7úw.<šÇ²(ÕŒîJÛ‚y뎜ú Åöø{ðñ;Xn”Œâ™ˆ<|^ð"“¤j”Š$ñ ám(DöIžwÇC‰îg¢šcí‡IyOÈùm›ÉiƒÐá ÚchÇɰ±^A”–Ïl0±5“d ]ð”³!ǹø˜1Á‡§Y¬z­ä^ò6l {Äš\“v¾œäJ €·-3›šÄÜ·¼«²®|Ñ‘à8û}ãÛÓº?]aá;|-³¨T’oòýñ Ÿ7žQ}¹ÈçËPUÌçîÊÉT©È{˜»˜×ë98pþ¼dÐ QZš®^=uPñ¤ùó-Ç3 Ñôí›vì˜>VTT”øÇ=ccU‹%i’¡ê 7¾:y2¥cG‡îÝ j£2$:"B¹b…k•*†ª9,\˜½o_~:Ò'쬭 ò®ÂÂtŸ~ª‰ˆ`Ò$ñŽú½«o6â¿ Kí¢QaIà7P(é6–cçÚƒ¥Ó‹0½ŒÜŽ• |Á¬Ö†¦Cÿ‡¿¿ƒåE „›¥) Üã^U|€Ô(ÊÝDÄX¸HÄ—ŸQ±4»±p]ѧ|Y–/¤|Y–®fÕz=WÒÎŽuëÄ@l¬®[7ͳgFøX3gZŒo®R1mZæ¹s†f”^AªW78ÑA§c̘WááFd£†wupÞº•y䈥ˆz ‚°sçËÄD£3_¯»°mÝüÿiðW$¬¬ä£Ç×/áUD’Xié]6_æˆÞŸ;Ylyî7ºq‚`³UÔºÐõÝ#šwÊWt.*ˆfxbëµAq²éÿf¡Ñ×¼´´´jòÔÀ{·qãS G#šÕ¼ÆúõÏSSýúyyzÔ¤93S³lY0r¤»„­+’$*˜ŒcXÓcøñÇÜE‹²…¯¾²òñ1(.®ëÒE¤«ZUX¾\$ÕŒÛñ³P§KæÒº0Cò t:f®àF ^î,Žì½÷Üs†Ý§‘Kù| f︎J5“¶ RÔ+kÈé¿Eþ_óúC ;v¬Íûr€€ðÞŠŠêÞ½»•••••U÷îÝ££ã<üéøø¬²Ôñ L!~xûâM´vñÊ"OE^3J–Æþ:‘}ð#:LLGlkb~…Lš‘˜—B²œþˆZ!º.Ýgrê‹Ù®"zYRMÎútruLs£‰‡Ry© ’%SK’¦âëp€‰åiZz÷” IDATãÎõD®%|V“v¾ÜOàøsW+Ú”ÆÉ‚ÉÇÞ„‘-éX•ªžŒÝñ{N°Nfö¤´#Öóîöݯ5µÊ!ô›O¡B{[¾™Kóú,ÿŽG( ê2ÿsš4äóù|»EÏÅ´´ä×_%;ŠÄbš6U?}j„ñÕW–sæX¸¸ˆ;vL;sƸgâD‡áÃíÄ}ûF+†~¨¹¹xɿڵ­–/4œn\º´å¸q~nn¦ë×-:Ú¶m‰îÝKfd(~ùåƒõ™ffÒ‘cêú•rx(^ê»ÝnY†øÍû9ÿiÞq¿®wͦ ?F§SZ¼/ìž™©¸`įR•*ÎÎí‘ÿ*”/oW¹²}fæÇ¬tþ|LxxFÇŽ>½zç`¥§«¶m ¯]Û¾Cu³V¯Ž’J…]Ú·7È[ºp!{Ù²DssÑîÝžR©AÙÙ³Š#27–úû[Ö«gPÖ2&F×¢…F­¦KÑöíb™>ÒŸ1d,µk2|P±ríÀ¢õlý™VŸptSÄöà—ŒXJ£*lšI™‚º ÷C§:†œû/ àäätýúõâ tñÛñìììfÍšU¯^=22222²zõêÍ›7ÏÍ5¢ÎéOÇÇì`å DpÆGG<"yè‚‹#ŽxP5š+<®„óCâOÖÇrHV ²C’‰æ©]0 C}€<º ëÐVSNŒ¶+id‚â´ü‰§Œr25|ÐË•ð\¾}Iº kuÉP²è!€¹”6>¤æ3ûêWi\Rr¹ÅžoN~Dc´:"’Yqê÷ÍìAZ!l*(úÕ8rò¸ù„¥ï©6Ô¬ô¦…Ψ9<*<úÚ0¤?:“frø½Tc!˜™±¿ØÇ‡R¥„ÆÕwïác-\hYµª4?_×¥KÚåËÆí=«V¹ÚØHòò´3fÄé·~‹þý}}M=Ê^·Î ‚Þ½KÄÅå?x–Ÿo‡F$ê×wILÌû曇FM42¹dÈðZeËA×M»ÿh»}ÒÕj6”÷ík[?1‘~ý4b1¶¶ìØ!6Õ7éÜ%ŽF«¥]K†,Öl÷Qü×’§`Bª¼GÏÊS0s¹ùøºÓ¯U¡;aÜxFf.3ºrúÿ½xúô©¿¿… F³ú¶lÙR·nÝÙ³gÛÚÚÚÚÚΞ=»víÚ[·ný+NÒ@|Ì–‚L ‘àRTÓ zEhYʪQÇ[ o,ÒÈ*‡½öÖÈcIkkelΓРûJ˜Ý'ÇqkL*#=BþXDU^¡‹ƒöÜŽªÐÀtê˜p, Ls¥Š9ÏóISSˆ..T·fk4À¤ Ôr GÍÝ€‘U¨îŒ½)B̤,lE w¾ _ X݇rn@äÛ"AKSÖŽ¤¬;ߟ#æåOk vùãå¡KÜzZø:ŒèͰžT*ÍЙE«ûð•?-›2c>'Nmóär”ØØÎÎB—.š‹¨+ü櫱cÍ\]E“'géí¥ó.ÄÊJ¼n[r²æÖ­Ü'2?0ë]H$ A®¾¾¦‡%¥¥JˆiÐÀ¡eK§Œ ÕÏ?­¹0lXùªUT*mp°Áú÷Æ@*V³JÕ"všL±ãvÛ¯â%¾€‰2ýˆhµé[5å5â.&e(÷Ï£˜ VÀMƒ.—‹7vsu-:‚õøñŸÐ;èŠ2el7þË4è½wOž¤*ÚªUF®hÔ;+•ÚsçâkÖ´6ÍÐ$Öºu1õêYìÒ°¡AÙܹ îîÒZµÌ¦M3ˆ­••¥ëÛ7­zuIçÎ& Ô::#ƒvíÔ œ:%±Ô7éæmFNÂÇ‹ñ#™1©X³€,úoÖÌ¡C³" &}MJ½[°~Zã S¶’“Ϭž4(†5ÿ!|­rŽ?>p`×uàÀGý»Ïã|Ì–¾@"OÕ$*QD¢&M@'<Ž([,Ÿw‡ª¸‘t–pHúa¢+cšöÙçÈè†éM”›È.ð Â]tÑt–’ªãŒš£*:›“¢áL.Gs¨dF N¦³.`œ7—RXñ‚< ¶2šºr=ÿûr1£«r9šu¼#X\‰`ÝÛÈh£ÒTõäîK¾óÒµ彸ƸMÛ¨*=›“È’íä¼WĶa!2÷ƒè3©ˆVЯ1c5«ñ<œ^ƒ¹\ltö är׫'¼z¥ëÞ]}ë–>ÖúõÖ:™¦§kÚ¶M}üøCNO!"H¦S§:ܺ•;|xLR’¡ÞR›6ö®®ò72–-3"m×µ«ç•+I+W†Û«ÇÚZV§Žó•+±›7¿çêþI‹E}T«S¯Ùæ‘ÍN»%ÑÒr€_~Ø7ê7ÿ%˜o´/d¬~|V|¹l9'o_»BC—Î?7$ˆuÿ~òå˱VVE§FJ”ø÷ K[ZÊ._Ž}ðÀ¸>ÿ=Ð{ï–- ¼|ùÕTЊÞ=‘.$*Ú- ŠÊ_¹2êìÙÔñã‹3(ˆÀÀܵk“¯_ÏݼÙÃä VK¿~骄Ý®]¶¯zÜ\ÚµSß»§KIaß>‰>¯ïáÚö "’ÖÍX»¬X³è8æCÔ+:·`ü€" öœaËQC˜=‹‚³YÛ¹DN>Ÿÿ±ðÕ?ªUŽ‹‹‹T*uuuíׯ߳g¿7Ïxúôi•*UÞµ¬\¹rPP1‰›¿³ƒõb¤ñ<*O} ²H‚jRS‚$œð†T# '¶)>b„²”ÅÊÉMRzc/G¸NVLÊ õDtƒüˆráäÃ$9&pL…&Yc"ðk.@?{¸šEŽ–Ô²A*°7`zE,¥Ddq; `pEº—&>ûMK$°¤-–r®¿$ý­‡´¼ÍËq?š«¡¿¯hÝ(¬ÍyÃÁ‚nЗ£(çÍÇE¨6Ȥü¼W'‚Ÿ3oM±×jáŒJ^>KWsïA±f¯!‘°y³xèP‘ŸŸðÅšk׌ð±V¬°¬ZUššª3'3<܈4Ü”)ŽM›ZäæêfÏ6B téÒ’‚ÀÕ«i11†r¿úö-áæfšŸ¯¹pÁ8y`ìØJÍ›{ï±.ž{®Tè Þ¸ÿ~²ƒƒ¡5ðÿøøXee)¯_ÕoúÄòå‰&T*Q „Úoøå—ØädEýú}úÝ É]¶,R*-Zä«ß¾þ:yïÞt++Ñôé%ÏœQΜ™•“£Û·ÏÖ×W?“L«eð`Í÷ßk+TΞ{zêñ!"£>€;ŒÂÎÍS©é9ž}¿Ð® ßÌ)ÜÈÈfþV.ÞcÖ@FÔÄÊÎgþn†³l0Õ‹xà2 GtE¼úø:½ÑïðàèÑ£5211ñðð˜û†¨÷¸àuª°t:ë0f>n}¹D"–ÎÇÒœÄ$ú !TŸ,¹HÄ‚â¡CE99ôï¯>}ÚÐ/•\.|ýµu£F2‰D1"#3³ˆ‰EA<=¥Ó§;^¼˜ãïŸ`¸jÃäÉž^^&áá¹Ê;îßßËÚZzéRâ;F? Vغ5H¡øk¥&›4/ÙµG¥÷ë™5‚ä°Íôû&-¥h¶«WºéR âIŽL(öÏ¥(&VNŽòæõ±rsÕ©©ù2™ØÑÑ8 ïL,-¥ÊôôªRCqˆ‹ËÙ½;T$FŽ4Ž}¬]véRbçÎîr¹A[ÏŠ‘jµ®GG__ýÿcʯ¾JfÎt45Õÿþááš#ÒëԑΜiÞ¬™A‘Ÿ%K4{öh­¬X¿^\º´ï*6ž£¸|¦Xµ˜âj u:æ¯áÌ5\Y3Û÷B‡:ŸoààEú´`îУþ{¸D¿&Œ/L0ÿ¨á»èÖ­ÛoT][[ÛBñª”””B1­¿¿ƒåGK{JEr¹íD‹ú”+I÷q<+¦‹ŒTÊþíôêJN.-»­¯üN,fëVñäÉ¢%„NÔG޲´öï·uu]º¤èÞ=íýf8ÅAºw·ž4ÉÁÌL4hPŒýt}|LGŽtMHPM™b¨ø‚••tÖ¬ò¥JY._þL¿uA´háùé§¥ÓÓ•»w‡ê·þÿ¡^¯>ý«ŠÅ…~±ž`ÞÕY—¾CµR†:ù7âšК°›ê'K•vð-Y¸"üÒ…ŠâƒX‘‘Yžž–­[{—õø7 :ù¸»›?zdhœõ¿ ¸w«W?´¶–MœX¹Lƒ(çï¼gòÉmÛºŽaP8êáÃì_~ImÑÂnÎoCìÇŒyei)š2Å¡U+ýqµÜ\]×®i"*H¦N5 5ß~«õ÷×6k&>,©^]w•œB«.„>§c¶®Ã¼x%ÿµ¬ÚFÛO8¶ï¢hf«ö°ímê²x4¦ o?]aÍQšTdVÏ"â^FàKrW¦¡B… (ß~ôèQùòåÿŽó(³ƒ¥&Èá©©)ö ^iÑ™a™E¬ &N8EòÂ'¬®ò¤ŽOI8Á³Æ8%žStöHòÐî#µf1h“—޶B|‹ÆE ¦„{V)pSVJ¾ŽeéÐÉŽT5+cQëèàŒZGL>[£†•ÂÝ‚ç™o„Ý[xc!#%Õoû NiDz§B8õVK¼M%\¬ÉÊ/ íîíLÇÚh´Œþ–ø‚õjKÆ`mÁÞ3Ì.H„Ùcñó"=“ΣI+¦O.çÇxºãáF‹.Äéã; _-þäA©¤gO̓ƒÃÎ΢­ÍÌ„sç£Feb”€2¾³Z­»v-gåÊäâl a„ééêK—Ò~ùÅÐ=oÀ¯%ÌRž?7ºÞ¾];¯ÔÔüåËÿtÑÑ÷Q­ºûÀ!5¥ÒÂ9ÂY‹¡ç-ÕÖ…,Qÿ|'i+~¤SN÷~wœåk/‹ûÐÐÐôèè¬8¸ÿf¡QÀÌL¢VëBCÓõ›þ÷¡¸{—˜˜wï^bjjþhí¼|ypNŽºvm;ssƒ|/¾x‘­nÖÌÖÝ]?þÀô§Oó³²´3gÔspܸŒGTr¹°j•µ!l°ÔN˜ ©[W5JÔ¬™ž YYLšÉ‹íùq#ÖœǾ?ÀÂuhµŒXD·Aàr ³6¢Ñ2º+¾î†"³–ž )çùûñëaúÒû öíÛ× Aƒ×wèÐaÇŽïŽîر£S§Â¼ˆ¿³ƒ•I(Ï™R´•bÅ­ª4“bF`uªÁW§”Iñup/…ƒE \Êcušø~8TÁì69ΈºcZé~ò†#ªÂ¯è¾A[N„«ˆ[6*ñ–PVÊmë2 ´±áRKcÑAW²Õ\OåÇ€Éx–Ή(N½hàN +NGàÿ6Ù7¡¶&ì~Àw·Þñv a)î¾dÂn²ß’:cyÎá›(XQX§{ò4œa‹ UøÊ˜šp`=©éìû•a3‹íBhmÅ©C¤¦úœÖÝH5@×iáBñ A" W/õ†Æˆ+U’ìÜi}æŒrá¬]» í”Ü¢…EÖ'Ofjh¢pÔ(÷ˆˆü³gSwï6´qòäÒ×®%oÚô<6Ö¸ÎR©¨[·’QQYûöé#²ýIð-i?rl]S³"¸wÌÚ±þl…f[uíóD­b„ÂrðŠ}sÐi[·+–ÈÍQ^¿ú²È»~=îÒ¥Wîî¥Wþ…([ÖîÒ¥W¿þúçkúÿ§›³~ý£+Wb'N¬¢ßº –/vçNJ­ZvŽŽÉ:Ì›qûvf‡úEÕgÎŒü8_.õé£?k¤92#5U·x±E… ú½±Û·u½{«_½Ò $š4IÏŽ©VÓk0§Ïó"‚ «q-þéãq“¢RÓ«cûa§ Ëç¿No¼ç$¬8H@(‚ˆÍã _p”;c›ê]Ù;øoj•ónœBýpfÏž½gÏžŠ+š™™5jÔèÙ³g×®]«^½úëQKKË .ܹsÇËËËËËëîÝ»çÏŸ77ÿO6eü˜,)V©Üö¡±«xî—¡––‘<®JU3ÌBiHEd¡¼jAI ¢Wd”ÅÒ s3Ä·Hé½¢[d7@Þy$ȆHÁè’á32ÐSl {¶¨W/A­fÃí‘#†úX͚ɿùÆZ§ã‡ò®^}CÔKâ™:Õ¡D ijªæÛo ÊúÉd¢ùó}ärщÉjµA>YÉ’ݺy88˜ìØñÒûw1bDyA=z”rú´Ñ‚¥ ž6ã&Ö—™±'=1irÜzúvÍKòV‰»ÕF?Qß>èíc÷~+žË^äåçÌÉQÛÚÊ«V-¢uÏküË9XUªØÛÚÊ%Ñ?‘ç^ä½Û°á±µµ¬wo¿Ê• íî÷/_æ„…eK¥¢Ï>3¨µóÕ«IIJÉ”)žzoßν?O&6mr×›ìËÉÑùûg©ÕÔ©#ýôSýÄù°0ÝÂ…šZµ„‘#E³gëÙ.µZæ~ÉÃ'ØÛqú0ÞÅJ¾Œá‹U<¥}S£;:kqI”tgÙ8 5¾Ư÷HÌ`jÞÉ?Fr5”×ä5ûùo„®(¼jÖ¬Ù¡C‡’““U*ULLÌŽ;Ê”)ðLèíí}øðáÌÌÌÌÌÌÇ{yÚ‹é/ÂÇí`èPÇpÌ“jjòB9U†êùäÞçb*)QPWSd· Ñ¢¨ŒËS¯Ñ¯hr÷Õ[KDÏÈ{F^'L/ ø–œ2=]A·m $œT±SIM9C¬¸˜Ï·™Èæyð4y1Ý]èîÆÉD~Œ[o v½àH$@9{¦Öäú+f½-ìV‘Þ•9œ·ºêb[“‘Ç‚£Üg¿Ñšzå8ÀеbQ‚Às)ïÃÞ³L][Ä•©ZŽCˆKbÎjöß!Çѳ‡±³åð Zv1ÈÇZ´H¼l™èÒ%ÝøñÚ“' ÍŽg¶h‘å… Š1c2^¼Ð`‰ÇÊJ¼}{‰˜åŒqOžôÄÔ¯Ÿs÷%mÞü^d¯|ñEù¤¤ü%K‚RS+Œ15•|ñEõ'ORæÎ½¥ßúO‚“³ÅÔi”ïñ±€Pyí+Öã·j¾Ý#núR(,ó¨8àVÓºmá V^žêý VV–êäÉÈÜ\uùòÅéüË9X2™¸J‡G’¯\ùç‰5¼ïž=K[¶ì~n®záB£{Ý-^týzÒĉ¥|} ŠwΚõüáÃl=&µZ7zô«[·r.t)_^¿\Èĉ™û÷ç7n,Û´I¿H[RíÚi~ùEW¾¼ðí·úE&Ìà«5øùpê ‹—SOM§Ý0N\`@gÖÍ/Z»aÍO|³©”c+°/x¦9ôYΕ',êGëê¿W¨™´‡kaø®cùþcøø,{êêЦs×™JZT鄹â«"?‘0_|5h‚ ®ŽÀ³&øWyÙG $I(^‘ÓûPò’Ò kDP>@5 °m —lW¡ƒžæ¨uüEžŽ¸H¹—͹ DÈÕ°é%*¦bÆ–ø&è’û”šXÈ8ÁÍ·¿Æ³›#³+Goª–`ø'ëÎýÞïYXÜ+βóbµÛX°z&26æ`Á¡×hÑ€eÓi\‡±ó9w£ƒ×pseÛzJ•äÞFO&=£XËß0c†xöl±LÆàÁê3g õ±fͲ:Ô,9Y;n\FzºAѯ&M̶S(t³gÇ«Tú?H,zõrV«ukׯddD­ZÕ¦Y3ç¬,õÖ­†Êhý†AƒÊº¸˜Ý»—ô·±[;³ñ“¤•ú})«aýéÚÃ+Ä= i_©nþäåc[ªLazÍ•‹/òr ±îÞMÔju•*ÙK¥ÿoÈFãÆnÀÅ‹ÿ<ë}¬Zõ@­Ö~úii??ãôc£¢r÷í‹‹…Q£ ’i:}:Y§Ó¹ºÊ† ÓϾڽ;]£ÁÇG6a‚þ ÚáÃù{÷æ™™ «VY™™é våå1i’æùs]͚Šb‰¾\⊵l܆‰ ³§S³Z±f¹yÌZɳp*•aÍ\äEi7\¼Çö_)áÂòñ”÷)<ºð'Âã©áÇ´‚aè5g‰§SU¦¶ÑsªE@ý×¼þõøø=ébo Güha…G§ªÒÄç\¬C'œhH…8\»ê¸/Hꇷ_€FP IDATÍÏDuÁ®2æGHËD= Ä›Èù¡¢Dt;ÑöÒWJ®ŽSjZ˜2À’X5[311ßo9 czºÒËg9l^šn^$±ã9€³9 âjÎÒ€7yÃòÎÌmŽ)K/þšZÐ…n5Øy£‡ÑÕŽïÆSÙ‡± +øc^³¦SÁ‡A‹xR”{0ª/MëàâH×ÑÜ+^ÓÝ•‹'èІÈhÚö0(޵p¡¨GÁÁAèÜY}ö¬A>–XÌš5V Ê®]Söé“®1LCjÅ ×^½l‚ƒË–Ô™¤sg‡aÃ\ãã•_}e(?fîÜ Mš8?Ÿ•eÜφ©©äË/ëúøX~ñE€±]wþ?ðs·ª×©BlQiÐXi)¹uµÈÈå¢nS$ŠH}°KC'CHC; “0g„îb᪆•Ä´”sKLÀD ¶ J^©¸ŸMÊ[p+©±@uk*Øp;S1Yj8!£Ð”ÇÅ(UD*ÂDŠRMj.gBX™ ¬+á‰X™rüêýÞܪieF•Dt2Í Vù´®Ã‘+‡/ói«7,Èß thÆ­8;°m=ÛbZ ™ÁÊ’Níøå r9{öÓ»²R)¶mEééH$¬X¡­WOä奿(ÚÚZT¿¾ìÊ¥Lf%‘•*é¯ôññ‘%&ª­¬ÄGŽd d§—ëêî.ŠÊ73‡†æµooc×ÍÍ4**÷Þ½Ô}ŒÊ‹I$"ss™J¥ LêÓ§”Hd€êΟ„Æegœ°ÔèìÞ“!Uæb¹‡½2ÔA[ ì§| k9ÖÉÕúv@¸‹Z­•HD%K9yyê­[ƒüül>ÿ¼º™Y±w',,ÌÙÙ †¾ÿO¤¤(ŒÞ²%üÌ™ø={¢T*¯¯ÅCîR$ââr¤R‘©©´fMƒô™þKðî½ûá‡à;wK–´Þ¸±‰±WÕßÿ©X,´iã2xð{¹®÷ TjÇŒ õó3>½D•*z|¦K—²·lIõò’ÿðƒ‡­­žX׌™QQñþý¶r¹ž/àöíÚµkuNN·ߊëÖÕc|üã¦áçç=1èC–+¶pô<–æì_OÕ¢Z-W¡PâbÇáe…Z3rh=ŸRnt®[¸£óä½dæáãÈ÷C‹,X`øÎ¾`Á:jlNq%þó¿A,© ärß!‹ÐD®Ùâ–LðK®¹áË‹PnûàO|A¶È3É '.’8O¬ÂI½À‹8?"ý0¯Êa¢D÷”¼“¤÷Á4å.rÐá:ºUh,šŠ Ô°Lý- ÈgY:ZãÂÃ\ަs- ‘ÀÒØõ ¥‘À”òÜHdÉCR+«âakî¾YÅ š¨4 „¾‹ï¾ W«™8±t¹rÅk™¿E^žöĉdssñ‚¾z£¼[¶¤Z[‹K•’O›¦Gï4+K·tiv:² ,kÖÔ#]ðò¥nñbMýú”)¢!CôlŽŸ°d%•*0r0ó>ÿåSìû­–>hߤh›ïŽrë)R1ÓúáíZxtë"©W¶0õ*-‡•§xäTþÿ|uÍë_ÛÁÐ’›Â~gêæÅ?šeÂñŠ|’Nb çkP=´›Ü¬ŽŸÕ5žZ øb÷ˆ¸«DvÃóÙˆn ’DTd·B~å²Í` âÛèV u%円 $Í9›Ç¢T€É®¨ulNàV6"î<Êdv0¹€%5ÈPñK4 yÍJУ §_²àmtª¦“rñ+.ý¾®þõhàÇñŒÙY`½sûТ*Çn±`OáKѲ6ßNGüy\È͉Ó? —qö:Ó¾*V€(U’“07çÀQ:÷Õïc‰ÅìÜ)9RN«VšÈHƒ¾|_}Eóæ²'òûôI×àÒôèa=nœÃ±ccÆ$Á0w®wv¶fÍš¨À@ƒ(2:¹W­jsôè«íÛ#ô[ÿ{ç^EÕµá{NO¯¤‘„ÞkB¯Ò‹ ‚ EŠ€(ETªÔ H/J•¦" H¨Az ½…„HHHï½ç”™ï‡ ’s‚ïëûù\ù‘kf}öÞsfÏšµžý¬§Ñ·o•ŽÝŠüæ›[/úÙ¿A`ãpoKµbw¡yF~ W]'hvÙι¯nþç)#^{æ{w›ZµŸMðùŸÌËÕúùE¹»[öìYñµöÜ8BB²'O¾íë—–V¸o_«S§ÚOZ³wïò&Ô¸r¥ówß5ÊÍÕ<׸ñ±û÷ÿ“ü';;uëÖ.‰‰ù‡ÿóGCBÒ÷ì 7¤Õ«Û”¥žLqDEå-Z•7zt™*._šªíÕËñwLøLññºéÓýýóÖ­s×hLtküø¬C‡Šlm…É“MäsrèÕËpäˆT±¢°d‰‰œcD$Ýúrô$Í›ðÝ2c–ç®2t§/³z6 ,ÙæÄ5Æ/åJ;æÐ¶á³go<à“ œ bz?ª<í{û‘ƒt©Ëäb;Ï„äü@ú/Àÿ¾ƒeCGuYSË@®DŠ î…dC–=®ä’êŽ{EÑD4¢ªW¸ßÊÀE¢Úád…¢1šÜØÜ o?1«ˆ<ý)Š>B¦†“ˆ‘0Nˆb‰³œ@-§ ±W0ÚàÛD€Î4µ%Iûh;a³r´wát"kSºg¶ ;§£ ~œìšÖžNUùé¿Ûè7ÿlÌ8Ⱦ›OÊe,IÛº¬ócç9žÁèÞTr#=›I«I-i'`õJü¸ ;Öî`aé¤@­ìÙŽ› iéLI‘©ûY©ä›o䎎ÄÄH,&&š°’“cÖ¯·­XQ®ÓI+W–)‘7uª£üر__Ó k77õG¹I«W›ªh € ðé§ÕË•SŸ<™ü¢A,`æÌÆ‚ÀŽ÷bc_¸²á_AEGó}뛵湄ç^-õ‚r¯í´`M›?h}¿–Šò;w¯þ|kßÞ«W“ïÜIkÒÄDçõ >|˜7nÜŸ~ŠìÛ×ãüù޽{?[#·S'çS§Ú7oî —Ë>üðZ`à’n?|xÍðð¬]»þIYBƒAòñ¹výzr·nž½0ì»ï‰xÔ¬i:|•ž®Û¶-áê՜ѣM‹….]ššmxûmëŽMìîÛ¿¿h÷îB aùrk¥Ñè•$1k–$Õ®-¬\)—õ¯“?…Ä$:·gɼgU@‹ãf03–SÞ™1ï1~hÉ6!Y¹ K3¦ ¡ÇgϦç0u+…ZFw£×Ódûnâ{+ Ë<¢^ù:¾:°é…¤÷þ`½üï;X PS!•Ÿ=è­Â1†ßjÐSƒM~ éhŽU gZÒÒëK\jGìÏè…KC\ 1D> Iî%¶õ0;@fÚϰtD¾š\Wø9°C%5ˆ¬Òb&0Ç;sÒ&ºÒËŽÐB®ä"À¢ZT5gV(Ùz/;°(»™5íéR‘ä|>>þèWê`Έ&¸Û0î72§<X3„òv|¸ÄbOjnŒéNeg>\Íݘg'dãtwå|ýKÉ6®ÇšÙ´òfÆr–l26·5ªqê å]X»™wßGg*/gnÎÁƒŠd'OŠÝ»ë3Mi=Ô«WÏÕU¶u«mn.S¦d;fú¥ÌÕU¹j•«››b̘¸ÌLÓ2Ó¦UèÐÁ~ûö„³gËT3®o_÷Ž}}c·n}á V³fΓ&yV­ |ÑÏþEŒïT¹MuG`λZŽïó>–…¯Íä›fªšI™ º“ëË—·©]çÙÍNqööª1cê*&V×$4‘ۮݩë×Óß¿Ò?4ss+yS˜‡‡ù™3:tp ÎêÚõÌK”ë~UèÑ£bûöå‹(kaòÿ8Z·n½zuàž=áo½Ué믛›þÀÓˆŒÌ[±"ÔÛÛnΜºe±_¸0*>^;vlù7Þ0QëÆß?oåʔ֭-V®4¡’/Ž™éæ&[»Ö¦F ì¤Õ« Û¶ºtöï—[usóøh÷ÃÔß~DU:,<šî# ¤g¾[²Mr='sé¼ÅüÑÏž%&oáâ=†´gå‡OŠIgýÜíX;„ÊÅB~sŽñ‡*ð'­ŒâYüËÁz=øÇ8XÑÑÑ}ûöµ¶¶¶¶¶îÛ·oLÌsŽÃsùc9»%C¨1ˆfsÏ–r: ’qÆEKaaN80ä“/RàŽƒ· ¯…S8i~Üo‡sú“$Iˆ•шH?‘Ú ³"¤ho €~HY0HAžÄz-C-ÑÃùBÎà  Ž9WrYÐÞW iZVDT·¡i9 3Ç¢Æ{#8î{Ž jˆ»-I¹|yôɇ4§š3i¹,:òÔØ¶¡yMò‹¸„ü§èߌÇÞšËwX¸½ä©ëÔŠ‡"“1k»›äÕøz.Ž<Êã1©\emÍÚµòªU33ÞyG_P^J»vª^½Ô¢ÈàÁ™qq¦}¦!Cì=ß>WgÉH)EDÙÒ¶4PèÉ)Gm‘SÚùäg’Yê±$'ñ6–EQk<òÕÈrÐ÷À9ŒÂ´oa+ ˆðÃpÌ2!² ¯LÑ@6tT"nëhI .å’ ¥‰%åUT2'²€4í±TàíÀÅâòðrÀÃG3Ò 9ÉûuQÊšyp-†d¼Êãi ´«ID W"°· ^±§^§†œ D&—NǧU¬ÌiÝ€±œº‰\F³:%Ì^Ýê8Ú¢7°ùW<\©÷l•'p*G׎øG£áôyÞêVòjò'ÌÍyë-Ùúõ¢\ÎÑ£Rÿþ2ãö@›6ª7ôÖÖÂÞ½…C†˜à Íš™_¿ž_P V©¢öð0ÁlmÔÈ*,¬ðáÃ|UÍš¦+ƒÖ¬i}íZºB!©qccBPÏÃÖV›«öï>¼–É Ð+„ƒ¥J¥N.@,ÚN.Üô@Ó\ž™Jᡪ¡^¦ª¬½6_0³¶iÜ1!>;9é©ð«‹zÐ{uÕš—Þ³ô’EiР˱±ù-Z8þúk+++ÓP(„~ý<ΟOqvVŸ8‘Ü£‡›FóxòT¨`uçNzhhæÀÕÌÌþîy{ Œ{ÖÚZõÆnS§z›¶~äþòK´««fÉ’†¦K;Ožü@­–uîl?ztyã–Û·gDFjÝÜ”ß}W^©4æ mÞœäHQa¡ôË/öVVÆ,##¥·ß6Ô¯/ôïošØ>á ®ÜÀÞŽÝÛñ(ý#+‡ç¢VQΞC›1+i$‰©k‰LÄÎ ¿Ø>':z<€/wPÑ™ýiô´ºÕb?.>ÀÍ–-#±xÜxŽvãiK¿ú\Øù‚2 Êjüb8ñ¯LÃ?›6mjÞ¼ùŒ3ììììììf̘ѴiÓÍ›7ÿ”Š€–›* gsÚÏ n&pÄ:É=àTjÆq?ÿjT"*€€Ê8&’yŸØdÒËaEæï„uÁ%ÌýÄT@¥B¸GÁ>Òav]ú( =‘ù#­À ¨¸``Y¹£­ÉIÐqµG­- .`V,À”Ss0‰a®ætv#$‹Eò7Ãë¡5”Ê7W¨¶3]j›Å·Ð=å¸ÛÑ«!÷÷ÑÅ ,4lþµ‚¯eC± ×hV‡á=ˆJ`âJ–B•ùx(m›šÁûS8pÒØT7¨ËîíܼͶ|ø)& éìÛ' “'L(5(õ'‰G&cÛ6›ìl©°Pš3Çt¢vmM×®VÇŽåŽg0˜àXXÈßxÃ& wúôð²T€–É„#*]¹’6o^HAAÙÄæ‹aÒ¤† ù·n¥.^|Ó´õ+ŤnÕZVu…J«Ä¦ƒ2樥˜mÍû±'!h,–ò3»v6ˆ%“qîŒi­Š   “6/„™3ƒŽˆÈ[¾¼aY¼«?`n.?z´mNŽþСøáïüG´jÕ²ÓhäiëÖ•^-á¿7ïßaa¡üæ›–¦­ŸÃÌ™A~~ ÞÞöÕ«›–n Í?q"ýòåìéÓMÔåÍÈ0L™’àç—óé§ÆuÛãâ S¦äë§O·tu5f™›Ë[oâã%''áË/M< —­eÝ÷DF±õ[ª—®çY¤¥÷~=‚\ÎáÍX–¢Ì:ý;Výн?ÏÃù¹×´ XL|:ýZÒ­ÑS§nD2Ç—» ,èK¹b<ï7b±Ö0·³ñq”Ýëùû†ƒuðàÁaÆ?2lذýû÷—å³r£ËY³›ÀR¸ÓÇðåXD‰ÕÛ8{µd›?ÐÄ›}?aaNÈ}ÆM2ícÕ©#ì߯Ðh–,)Ùº8‰ÇÑQ¶fu@€îÒ%mYÈXÓ§;U¨ R*…ÓMôQùjÕÌml;v”{ýúyx{Û¹ºj¶m{a&–J%_·î F~þ|Bhh™ˆ_¯ 2Aø~¤·F)vÉß8)º MŸa.–@¿aÞ}ŸÍd}~®îèjg«ºõŸeb]ôÌÎ2±wÔÓÓóUõر#Òß?U©”ýúkKÓ77WìÜÙÂÎN•PèãóŸqq¦LñrpÐøû'üW× Ëܽû$1dHugç›gàÚµô„„kkå”)5Ëb¿fM¬™™lÊ*UL$òV®LuqQ´kgÙ·¯1ž–(2}zŽÐ·¯fà@cmJ& êÔ¶m“'×oØÊ¡£4ñâ—m´,½Úµ(2f&éY¸9±a>v%›­ßÇ•;(ä|>ˆºÏUhÌ)`Á¯¨•¼Ó’/û?u*«€ǰÑ0¡3=ê?9~-†ËÑèù¢=f&Bö%ÁðzþþßãŸá`7hðT–«~ýú!!eÒlIËg§-­ ‰HáWºçÍîjtJ'ü>GêÓ.™è[œhF³D/p¡%µ³È=O òJØxŽÈwð¼GÎ.¢Ú`ݳDtÇÉ„Ùôß‘—Ž8ùM¤¯‘ô0WÍ «µÀ綤XŸÍÍ"ìLrå|sbêX1¤<§R™yÀRIÿJø'1ù:DFZ•§uyü2áqåA‚¯»s3Ž™GŸÈb‡#Iüt‰oO=5üAm™Ô›“·°˜ì碳F2¦ÙyôŸAl)ErLbÖÇHðæ\¸alª[7Ço/÷îsù¿4¦òðÚ´vï–_º$M›føñGÓ|¦6mTK–XŸ9£2$36ÖÄíkn.[¿¾üÕ«ùÓ§'ÆÆšx™R*…e˪^½šýÅáe©-,ZT?7×°{wÌ‹V'Ú¶uûè£:AAi_}u]ÿÖˆJMW«o=J÷NQŒz(*ßϘn-–@¾Ö´Ým÷ežß)7½K·êϱôzñìi•ll^¬*°ܼ™±uëÃ[·2¶nmÚ®ÝËH¢WªdáëÛêæÍ Ÿà}ûÊ´iôÕ¢cG÷ºu’“ó·o¿gÚú?N|ï½ã'NÄŽU{Р¾¦M»}î\ÊĉÕË—7]‘æÆœo¿Š*?Þ„ˆSHHáÂ…É÷ïQC” IDAT­Yc‚§µeK¾¿¿V’X·ÎÄÏoéRñûïÅ´4É×Wne4Öväã§pöã?â-£¥”¿ú–m¿‘˜ÂÑ­T(%áéw‰O–qî6;fÓ¹é³g%‰÷W°ííë±}"Åo;Ibä~ºL,,V«=_ÇÐ]œ gFš½Ê—šñWñÏp°222ì퟊¢:88¤§›ŽLf¼ ‚Ä- ¼E´JrÕ8’b… «âì°5Ç:‹4'œ (H$Ö›ª\#´3UëľA9WÌ,Q„Ùë»%³ŠN¨µH{(èP!é b%ƒ”$Šü¢£œœÑÖH°1`œ ]m‰/âL6ÀUÑÈ8žBPÀ Êx;XÀ÷¡ú?§V*NEsò±ŒN늌jJ‘ž¯O>‰W9Y±z0-«òý9BžΜ3¯Êħ3oW NÏ7£Vp?šéëÈ/%$1k<åÉ/`êb>Ú´À÷gbذ•Fåaþ@Ïž²+ä’Äœ9âéÓ¦]O>±èÖM’"úøäèM96ݺY½óŽMv¶aÅ ÓE ßz˱MÛ´4ÝæÍ ¦û ;»8;«ÏŸOٲ充Ý9sšØÙ©÷î ß²¥Lõ_!¦÷¨Ñ¨¢- Cþ¾b²Ö?<}𽡵Õ0U“ªIÙW•ĺt!*ËTë• 7W?gÎ3g’Gªƒ±|z¬Û.p4[sf¿ºX†|ͤQÏ…©íŒuï_üýøg8Xm¼×ÄFébÒ2h_zJÁñ›“WL¼¤-Ò¥n­IO "8æ’PI ät+Z©Pýžý{;Úay’€ü˽p)B %µGã}CÖ.¢ß®1–§É¾NÞ8,‘¯Ôg¦feÎ@f ýýý)Q |UÈÙ ¦ØÒDÍÆlüÓr£C‚zÙ’¬cJçýý=͘Y‘Ï®fgeeÉV5ÃÝ‚iW 莖·dtù ±Ç)2••´¤=jñã-&þðäé^QÔ²rуdÞÛ@‘þ I£bj§ë­ë°l‹ö|ò‰ìƒbsr¤Ñ£ !!RPPП…fƒ‚‚ŠÊßß_&ã‡l{÷Öܹ£4)¼ÄÆ‹·°f[‹º³góüürŒôáSË–UkÔÈêСÔS§n/vûLþüÿË/«89)fϾ“šZd¤%¶`o¯Y¶¬•³³füø³÷ïg…‘>ãëõ♓^®/4ŠáÃ/>?xp…… ëÿÅy3¦JåÊEÑÑùýú]ÌÎÖýÅ™|Ñ>tíê9rd­[·RÆßÿr-üõ>iáСȵkƒZ·vþê«*î,{ ¢(Mz[©”Íž]-&æ^‰fÅ[8~<}Û¶„¶mmÿ`_ÅâÅWîÜ)èØÑrÞ<#}8ÞÔ¨ÌÈHøq­[™‡ððì ùù,X ³·¿X¢Ù}ˆO¤ß0,-Ô7nδ'-<߇M¿0q.åòÆ¥}óFáïï•HÏÉ\¹C‡ú)ß-a~7˜¸‰Ê.ìœL5·§Zˆfô6ÑÕ–m£¨äø¤£f?}ÓECüÕ o¼4Jáð¢(|=ÿï!Hÿ õºLÁÙÙ900°xáØÄÄD//¯„cÁ‰;2¡ž^“A¬HºS"Xa ³ßÞä+òÝ1f È;ñõ/,•1{=›(†0ä0·³ÈkFdd¿؈òÒì=.h·Ðì0¹ëIj‡õ**ö õº%Øôü'†$äêäpOd›齃”ÆòLz[°Ï…‘ªÄkñ­ÁÛv$1äA9üêM€Þ'Ù͘š¬k ñÚNp*‹Ú2íqúÿÈ=¦A‚Ãéð8º—[„×$óÅ›|Ýï©Ùð»AOc_Ñ¡>Ï 4š¢Õ1u³F–<ŸZ}?&'—¨xÎýŒÇsõŠã·ƒ Aµ*Œû€ñ³$‰±c ŠffÂåË GÇGdz²²JL3?^ÔµkºBÁÅ‹Ž&Ë_|óMÊ´i 5j¨oß®¦V›x£80ø—_’F.¿~}™^Áß|óœŸ_¤I5—.m`Úú9ŒqrÛ¶{-[ºž;×Gþ\=æ×ŠÙûB¾:ðè)ø‘Áo©~s¡`ñ³ÝœXe uhËiò8¤¯à.¯õô.K…B6mFÛ’ƒ þþþ] kÍš°O?½ie¥¸~½KYHÓ&QP`hÙòD@@æ Až?ýÔâ%F—.%¶jµW£Q„„ ªXÑ´ç߆²š4Ù™Y´dI«É“¾Äµûé§HŸà*U,}}Û˜¼Ñ$‰&M®Ý¸‘³xq•©SE%‹ŠÄ:uBÃõ[¶xŒQ § €M›ò>ú(ÛÉI\ÎѱÔˆ"ƒ’“%QääI…¢ôÍyù´ïɵ›´oÃѽÆ$¯üÎòÖG l˜_ª\{VmÇFÇÆYþl-g 4Ž‘«¸Ãç}˜ñ4õ*¯ˆ÷6p €;°vÈ“ã¹E4ZEh*>]˜ÝéÑÁ-Öêx² ‚Àô×ã,úg8¯ÿ ™??¿jÕªU©ò„ xñâÅÐÐÐ÷ß7Z¾œlŸ5³æjåŒ1k ÄŒþ ÉRSOЩñT #·ÀC­5 )Ì £&5¢I‰!¥/Í’žL^SÊ ÈH£h åƒ)ˆCÛ+”iˆ·Ñ Æ<"n Af/ | ¢šÛEd¨£¢’K9¹Nfñ3– b ÉÒs"…žÐРt®¦ÒÁ3ä5ˆËÅ?žî•°ÓTsäV¹…c°×£T½JAÓJ„Äsæ>^¨TL€®š2™Àº#ôm…ÝÓò464¯KDÜ\­6ölÚÔüòå‚¢")+KlÛÖ„ Cýú–·oçÞ¸‘Ó­›ƒ££i²h:6!!Ù—.¥öéãnkûÂrAíÛ»Ÿ;Ÿ•¥Õj -Z<›ƒ{­hUÍaÿ­øäì"à†¬š;©Äк…çãÕ2ÏúÎùz¥‡›B+ªíl„â ¦(JƒX³vɤ¨¿Nr¿v-}É’ûžž ÖoÛÖD•2B©”uêäréRÚýûÙææòÚø‹ðð°LJ*Éÿ„^†äô:›«ëÒå@… –-Z¸,[ÖZ^øÚ†½âæf6lX%oocnÐøå—¤¼ªUÍW¬¨n\paéÒ”°0­··Ù¢E.FjÆÆ† ÉjØP9ož‰šƒ ˆ‡K2{ö(lK§Ë‹"G’†»~ÆIëÌú}L³ŒèˤJ¶Ñêøl9éÙ”wäà²j9§çÐafjÚÕç›á<ã÷´{‰t©ÇšÁ(ŠÉŒ|v€ä\ê8³î'bîSÎpu‡×¹5ËöÓöññ¡õÜ2™¾(üÿ•iø' gÏž;vì(~dÇŽ½zõ2þ)ª€Ä] z‚ 9g{.72ØïD“,Bâ8èFÃdî…r´uˆÄ¿5¢‰¾ÍíÊ”K!+‚Ä’]±J ç0÷ºáLÖa”HQGQ´ƒ”!Ë…ß),é8Ò¤*âD®øM‡«œF.1/`D9¢Š¸–Ç®T€‰•ÏÃ?ƒÝñ5mðr &ñ—I6tðÄÉœ»©Œ;ñd€_w',£¡l.¶¿¯yºÖÅ΂ɿ’ðôþ°ШPÊ™¸‰Âçjà¾áÅè>$¤ñÅ:~-E”Á\þudçI·‘¤å±ôïèadd2y&?ýjüZ¡Ñ°s§"6iüxÓûO¾úÊ2-M Õþy¶qK¥R˜9Ó)0°`Á‚䈥«W7¯SÇ"*ªð‹/L0¸ÿ@ƶ*˜GEå/[jÚú9ØØ¨¾úª™µµzÚ´KgÎü­Ò£*…lû¨ÆÊÇ«ò$ÅG7…ªJ©p@ÖW5Š.?o¯ÖÈ«TT¸º=t¹z9:3óµ”1ÎÎÖ xéÒ¥ÔV­Þ}÷U–®ZÕrÞ¼º..š?¾yþ¼i~Þ«ÅÌ™ƒ‚ÒnÞL=t(òoþê!ŠÒ”)‚‚ÒRR 7nlÿr!½+BCB²ÓÓµï½gÚ3ÓjÅ™3#NžÌ4ÈÉÌÌØ3(1Q¿paJ@@Á§Ÿ:ñŽU©’¼bEy¿~ÆHZgÎHs碢¤ äåªn-ZÁ‰³ÄÅóó÷8:”jxÞcÈÎ¥amæ|Z²(2ü+¾?ˆ£ ¿,Àö9íU½þ‹ ‹G«gå¨g½«gÙ~ðd¦wGSÌu<ʆ+„$³ü-T½®ÓѬ½ àþBÑÞw¾ü3"XuëÖ1cF^^^ݺu —/_~èСM›6©Œmðññ™=·ª€(ÑVB+G-b+ÃBƒk¹*ll©šN¢[g*§jŽ¥5¶zäJ”‚3®ÙäëÐw¦Þe¢•ÈßÀóù–ÈåȺâø;YæÈ[a©E¸BQRo4ùéÐ ™Zà®H–D_%ÔlÏÁFN-X+¸•O‘ÈÛö¨eX)È&EG_äÍØŽ£K%ulÚ¸³=; f ê:X¨¨`ˉ0Ò hW›Ç Këê 3ÀXúx?¹]îØs|-·Âyë¹ÍƵ+aeÎù¢¨á‰gI!š¾Ý8|;~ñ£w'ÌJ_Ð5ÄΖ“gÉÌÂÚŠšÕ],++ÞxCøñGÑÜœøxÚ´1¶ž*B›6ªŸ.47ÇÂBV»¶1U¤ TaaEEERD„öí·Mäe7¶Þ¾=ÁÊJQ¹²¦BÓ;¡5² ÌJJ*lÐÀÖÕÕ´ý3¨TÉ:""ëîÝŒ»w3ºtñ´²z‰=Ö/ W[Mn‘þBX G~Bæ5@»}\4ˆ9ÙÏ dˆ¢¤Ó‰µê<[ú¯cܸ›™™Z77³Ÿ~jñÊó§ÕªYEFæ?xsûvfnŸø§••ÊÍÍâÌ™ø{÷2ºuó´´üû®x‰˜2åR@@Jݺ[·v,_Þ´ÐîóHJ*\¾<43S»ys“*ULK·oØ÷ða¡­­rݺF‚RÀ´i 99bëÖ_~ilëèO?\¾¬»{W¿oŸ½¥e© ¦¤0a‚˜“#Mœ(ûðCcŽÝ÷?à{¥‚íëiô\õå?—Ĩ/ÉÎ¥G{6.xÖ1úS×r?šŒ¶Ï¦VÅ fýȃxô"'çãðôúÍÒßIÉaý0:Ö~rÄ”ÁXšÑc7ï—<¡åì9¾œÎ]¡Ç(ròŒÍþ§cøÆ‡ûôÁÑÆ,F__ù¹sÒÌ™__Ñxµà:u‹[8¡=:+!Á„ÊÃòån66òóçs÷î5Q÷×ÅE5i’çٳ˗ǖEC¡B‹æÍΜIþüó“Æ%bÞ¼f-[ºœ>7hÐïzý —ßù+˜×§víÇA©XÁq„âs½ —!öÌ^Ó,¯L:sÀµ+Ñéi%–þ•bÏß~¶eKDDDî/¿´T©^Ë25gN ìΞM4è’I5ÚW‹¡Ckx{;œ>7t艿Y§ã,[°lÙ­«W“§OoT£Æ“„Ù ]»Ù³ï?žØ¡ƒsÇŽ¦ýìôtݬY/\Èú曪Æýfÿ¼ßÏ +Z¾Ü˜4CR’øÙgÙgÏjW­²vq1F½úàCn®Ô¬™lÎcjþ§Ï3ösΜçËÉ´+‡–™ÍÈéDDÓ´>Û—”Z¾bý>–îäò,Á»$b窬<€BÁþ™¸;>u*#Ÿœ¹Ç˜ö iQl,Cw±;Þµù¼í“ã3Îs$‚JÿEÔ¾ÿïøg8X@ÅŠ÷íÛ—½oß¾ ʺ[[Æ “qUM+@A† WYVØ(°È'Î…J ̲ˆsÅMƒeifŽ8jÑ&Ó„ê2„ë<èNU d/ìZQÎÕeR»b£CºHˆ#±À—ø™ÛÕÐMA¬ÈN-|f‹µŒÛZ®¢èk^bW…"r¯jb&çLÚ£ ÐÃªÐØ‘ÔB6?Î> «KËò¤²º˜Õ7=h[™=l/vÐÕ–MöøsýéÍau<Ù>™À?ΔTtxöHlÈÎcÆz–°yÀÍ™ý©äÎå&Î'ßhŽè³± èƒVËœ…\2ªV tî,[¸P.Š,Z$ÚØ˜(X:j”ù›oª32Äyó²“)œC‡Ú†…i7oNËÏ7áÄ|ú©{ÏžŽþþûö•©:ï”)5Õwîdùù•IâáÈåÂúõíÜÜ,®_OY¼Ø¨ÔØ«†Z!û~¤·üqᬬÞ\Ù`@@ê’»¹cN)µ*Ÿ†Á >Y‚RíK3܃ƒ³ŽMtqѬ]Û¨,‘—ƒR)Û¸±‰³³æÊ•´ï¾+Ei÷õ@&¾ý¶““Ù•+Ik×¾b½û²c×®°5ke2aûöŽmÚ`Þbt:¦Mà½~¥š1eÇý©äÁ–ŨKI¥ì=Íò´ªÏ–™¼áU‚Áï7Y{ˆ-c»ÓäiJž(1kn1¸9óûJb¹R)Š¢‹ä”CÙëSAÛ M{gr¡ B¹pÁÀ=^r¼¨ŽäóPÏ+ê˜s·€ƒØ+haE Kæós¾¾ÒéÓÒÀ2³Ò—MA Cõõëº={ŠììdÍ›K{y™…†j}}³år¡}{cm¥R&—sð`ê¹s™ãÆ•7™ŸÒhäNNšC‡â.\H3¦ÊKä³,-•-Z¸Ü¸‘òã¡–ÞÞ¯†Ð]¸Û›¥çé®D¾~}ÇÊ•ÿî°ÃÞ½á“'_°µUÏ™Ódøð¶Ž–’Dÿþ/\H6­fïÞ¦ë?|X0eJ¸¹¹|Û¶ZÎÎÆîÖï¿O_´(¥sg«%K\°à)š??·F Å?ØÚØ”/¸rE0ÀP®œ°}»¢AƒR[ËÉå­HÐç-–|UjÊO2‰|éÑŽ-‹q)åf=@ïiˆãûñAI„áûqt›C^!_ á£çôKçâ?ÚÕdÍ`Š-W·è» ¶ô§áãÐ^¡žn{JeAzWÃÇçkzÏ}-¬kÿ¦ÿ‡¡? P0[ •@s%q2Ì Ä[à b6gì©/¡OäDy‰"ñ¯L=)œ›•©(GžM¶Cm<ì°ºÂýê”»GêQBÛQÎY8¹7Èè„ ð©VÈÚ¢–`-y®Ðá4ÒJD5ôV,(aM 5t\(@€åÆ‘mWA`õC"òš—ÃÓ‚ëi|qýјê:ÒÀ‰\c£{ˆéU›ÎÕÉÓòÑ Å¢3“»â`É™û|¶óÙ¹™Ú…œÄtú/&빟JɲOiPs Ãæ‘WJ€ª’;Ë¿ >…'?Cé¬FAàëÙô=úo*Ð3ož¼cG™Nǘ1ãUw\]e&Xû÷ݽkL{T.>ùÄQX²$9<ÜÛýÝw<<Ì"# 7l(%ˆ÷4öts3 ÍY¿¾LìøçѲ¥Ëرu€±cÏž=[¦/}Uøº_ªNO–ðqŠñ·…Jü߸àÐÛÙ+d’ ªÁ :ñj‚@3gݾY±¢ÅäÉeªµòÑ¡ƒS÷4t蕤$Ó%˜^!:urÿä“zZ­8`Àï!!e’M~Uðõ8ðXLLî€ÕÆŒ©kú¥`×®èóçSlmUãÆ•iG¤ÏȈ‚ÊÕ«gì ';[œ93>ÜÎ >;[3&«°±c-<=K}½ËÈ`Ø0ƒNGÿþBçÎ¥zW¢È˜‰Ü¼M~>_Ï2V±~ÅöÅÖšESKU« Š ÏtŠt¼×•ñ%É“¦ç2};…Z:{1©Ï³gOßÅg?2/{âYŒb_ cÆQ´zÕ¦k±·ù—¸ŸN%Æ”Î3†×AÀú[Éÿ¥øŸŽ` ö>>‹çN—åHI¸ —å|,’!«â dˆJ<åXh°a¯À\Z…½ˆ^*ç“EVuªÇ“Nâš?$3•¼ê8:aQ€!‚œ‘xÞ§0 ƒ ª®XÜC¯/”ÍßEºŒÔY™pÃ@ŒDe $ˆ7p¶÷­¨ªáA!…"©z:Øàª!C‡.e0À  i9Ò¹šŠ—•­Z–çZ")ùäéhóø¥±}®Ä™Ž-§Oå2ÚÕàfW#0WѤR±¹x«)—îQ ÅïƒÚ>» ¨•ôjÃÞÓħrä":— r°£SK®p+„à0ÞîTêkŸLF÷Î8‚\ÎÖŸÔÏ;^¡ Má×_³ÂÂT99´kgìM fM…VKh¨ÁϯhØ0s#+£‡‡2-Í Š\¼˜?p ±Šf‚ xzª´‡¥Žá¦Ñ˜x‘Ë…Š-²³õ/¦¾óŽ»¹ù˦½¼Êd2aåÊÛ={VtrzaÊüËA)—Õ÷°Þqñ‘*¬ùIYÆsfhg}¤³þá}usQ0Æ\IˆÏnà]ÞÂâIX"++«4¡Ò°{wÌܹwš6µß´©iÅŠS<©m[§ÀÀLNôõ2¤âß)HÖ¬™s@@š¹¹|ÕªÀwÞ©bk«þ¾ô‡îr¢M·þý«Î›÷\­ l×.'Gß·ï…† í¦N­Ù¬YéíãÖ­ŸÈ¦M­çÍ«bkkì™=;11Qß¶­åܹÎFv5Nš””$y{+.´6böÉ'…‚êÕe7KÎþš½û©S“ÝÛq.R¿ùW¦C—Ö¬œE³RÄïb“ùp!.4­ÍÆ/xžÇ¯ÓÓë+bSy£.[>{V+2•/öânÇÈ6 :Uû±/·ãy³&«ÞFùx,W˜xŠ&®¬íDkàÅ#XËjüb¸þoë‚-€øPÐÞ‚‰;J4Z 8dEƒíDR6ŸïâÚÓ5]¬ÍÙ6‘Ä üC˜·«„ùsuäG²ò8yá_•Z¿¹~MVÏ&+‡«L]l삘›±gyùܹKï÷È/ýžžÂŠv‰‰Ì›'îÙcâmhêT‹øxÃùóÚ%Kr[Θádf&»z5oß>l÷=˜˜¢yóÊTѹgO7ƒAº~=}öì—/'üõ×-ÜÜ,êÖµó̓˜èá+D»šåF·{â€G N#” ׇEWfú(%cÚÌ¢(>ñà5mÄþyDFæmÚ.IRÿþž™ÖRzUP(„ï¾k””TG=Ó IDATxãFƪUaÛ÷2™°ys{ƒAŠ‹ËëÕëP\œÑ #¢(͘qyìØ³5jضkW~ñâ¥Y–åÚÍŸ•——§2¤LŒØ©SÓ’´^^V+sÝ<ÐîØ‘yçNá´i匸MW¯ê֯Ͽ{W7gŽ•‘wª;Äï¿/^”V¬Ùt~ø —“šÎüYT®Xª™ßYÆÎ"¿¾Ýɵ?ìû‰<ÕŸ$>XÍé@ÒsøfOOF^}Öòû*•ãËžOÚȦ+a‚±Ú&¯Ý;YÛ·Gææê~ú©…»»éïߟrñb¶Á ýüs]ãñà â$‰÷ß·<¸T'[«•ƌɖË9Ò|ÈR½‘‘ÒÌ™’V+-]*ïØ±Ô;ý~¿¤r&ŒePéÄö›Á|¾­ŽÉ2aDÉ6:=ýg ŠXšsp)V%MÌr_nG’šÍ‰ùTN‹kÜä¡Q²{fÅ<Âð4¦A+²øMz£ÌÍ8Ol.Í\YÕáÑš_``Á¼Œ`Õ{=¬€#XÿóГé4Ò£º5´\Ïc½-=󏑯ÏÎtÈ$ Žýž´L&$ŒãµhσN5¦q 1¹Ø„ê™ä^ã~Yuq&ù(a}ð%ç")ùèÚau™œM$WDÞ ÕŠÖ‘W¡-Â)¤åˆè¦ä¸žYEˆð± é"{òØ—°À›y¬NàVÀ„ÊT±`K4[bT2Ö4'OÏÖ<Ìy4¬µ°R³)•ןŒuQw2އñ…ßSs°| ÎVø‡2xãS$- yMfàT ŸoæÈužGýªì[DL2_ogîæR§¹cK¶-Æÿ:‹Ö³xƒ± RÞ•ß÷q3€ß2~Š1K`Ò$Ù¨Q²‹ž} 99Æ,»tQjvîœvܸLÑZºcÆ88;+ŽÏ7/Éø·7h`Ù°¡åÉ“S§–‰`T«–õûïW:{6ùÓOo¾t‰µZîëûfÕª6AAi:ìÿÛâXjÅÆá^ÅcËe}’„'‰T7]è°Œ/¬ÄRÙB¢(mÙp-$8éÌÉð#‡^¬ˆõœ9wŽOO×-_^Òn«×æÍF®êïŸúÁWÃÂŒþÔ^5lmÕû÷¿©Pdµk·ïĉ˜Wþ—/'öî}äðáÈààôS§Þ1â%Yí@¥1c®?ž8th¥&MLë…ëtÒôéágÎdLŸ^Ñxrpÿþì~ȼw¯è“O˜-[–——' ³g—Êå26Ìàï/vê$>¼Ô']f½qå:5jðé˜R¿1"†ÞcP*è߃9Ÿ”l#IÌXße¢“8º»’¤>wcÖääóë4TzöìºÓ|ž[Qø~‚m1çLk`Êa.FÑ­£‹EÎND±ä*b™Þ Íãy}àÀ‹…ÿÅkÁÿK5dèýe¼ æ •ÔÁµkéöT—¡È#¦<õe(²‰ó¤º³\2¬Q•£œC-©­@~“Ý©< ÍyoÜ3О é=-Ç ½GÁx,¸†6 q*2ÜAJ†Q*¾‰è%º”håÌﱈ¡¡5mªÙ‘§c÷}‚ÓZçÑNz7kìÌLàL8}êbþøiemFÓJ¼Í¾›4¯LÕ§ïÿ¶uÈÌ'&•í'é×Ëç²Rµ*RÍC8xžÚ©õܻרWƒ nüîÏÎÔ¨DÝÒwÙ{”§^%ü!övÔ)iÇXXX˜³³³RIÇŽÂéÓ’¯¯hg'4o^ê’ªR îî²~(8p °W/‹K© «››Ò``Ϟ̨(í AÆè>VVrkkÅîÝÉ7oæ~ø¡›ÉJõÜÝÝ<44çüù”~ý<5cÄp#P©äýúU Nÿé§°;C½¼«U3ÆÊÿë¸|9±ÓØãZ·§ü›Ô§ä^à 'þ¶FÊ­UtùºqÌD-òa†No¨VÝ„äDllþ´i·cbò-jзï«,‰ó¢ºww½{7çâÅÔää®]_šÒò2P(dýúUµ´T;}øpÔ‘#QmÚ¸•+÷—6:\¸0fÌ™­[ïé?ý´þÒ¥­ËÔ ¿¿iåSRŠzö’lp5㣚“®’ûXŽ`Z3Ì8Åöb¼ê±-°·àj Ÿ x¢ê|ÜæUóQiOM• °pE:îÆ2|ù%mWÔ…/ß§fEÍáÌÍRg}x_>ù?öÎ3.ª«‰ÃÏÝJïUi*VìŠØ»±ÅØcì±5¶Ø{1ÑØ¢ÆS,1&Š-±+6ì ¢  ((¥.ÛîûAI,»HS^ÃóÛxÏìîݳî½sæÌü§/ý&r¤H9èNí˜3•ˆÛ A¨1}ÍjÕžJ–//̘!vî/_.jï­Ie÷îæZ-£GgéŠm`ìX§-¬BCÕÁÁ¯èf8xp©R¥”×®eoÛf2ró,={z‰¢xñbúÂ…·^mm++ùŠú÷¯”“£íÕë— þÔ«͉ íÚ«Ý^Ì3S ›¢Û)<Ÿ°j£Oé›1M)¾ºáãÄ좕ÊõzqĈËÇŽ%5nì2|¸ï8ó׋µµlÑ¢j‰ðÙgQ[·Þÿ›ß]˜8±ÆŽmË”±¹r%eèÐóç_JJ*²Äׯ§Œs¦aÃ=‡Ç¿óNÙo¿m½hQ RY\w¿¡ÑiÓÂÓÓ5AAN;Ù̯… ïgfê4°mݺ¨JÃÄDígŸ¥cÇ:Éd&]¢¯¿Î;sFãâ"?Þd‘©ZÍðázŽwß‚‚L¾Ô©³ŒŸŽƒ=s§áeZÃkÉ\‹ÄÃåÓ°6ñž?Ÿçƒå³ÑÒXcûÔ,&nFg m-¦õxq4OCÿM$gѬ“Ú=7ô(‹÷@HÝgVûïr=™*ŽÌjÀ¯e¯ŸE–ÁQsÓý5ÿß_¢_ƒß }¹”Žu ":‘‹Qtoh$^ÏØDøl;­êRÊDl¢am 4°ù{êùãeú:\«:IÉ«7ðNGLÇ’*W !*JܼYìß¿(õÑÆ×®iïÜш›Üo27—äç<ÐîÙ£:Ô±ˆkº\.”.m–ž®‹ŠÊïØÑI©|ŲD¨[×ñöí¬}ûZ´p-N °)¤R¡sç²ææÒå˯‡…¥µjåinþ:ç‰"Ÿ~£oߣ͛{=|ÿþÄÀ@§/¿¬ceõ÷5,gg¥››YF†æ‹/îµlù§¾¾?†··õ AUÔj}t´jçλ«W‡«TZkky©R–¯  æähwï¾7jÔéY³BÕjVk3ÆÙ²•+¿žªÌ#G¯Ys·n]‡Õ«kg37,,gìØè  ÛÏ?¯àäTT™È˜1‰YY†^½ìFŽ4釥¥:wΨSG>s¦UíÚ&ß}Ò$ý•+4j$ùâ ©ÜÄ{>H egªûÓµƒÞ3yV«¶1gÍëóÅ*šÛ_ФÛtWç½¶ŒíiÄ@­á­9Ä%Ó¤*[?Dùü)‰"wq>š:eØ9‹gjHtFý„*Ÿ–åù¤ÃoäÄÚý€‡5ƒªÑ¶ð¬"2ùâÞV,«Ã¶å¿3ɽjq7K"Xo2€.Õ mšÈ‘SJÊj Ïã{Kjfs>•¯ì H#ô!{\ñ{LxÊÎãpNW¡rI7¹é„…}:Ù—ˆòÇ-…Ü`n×ÁQ…ö!y§IîŒC4ùwÈOAÛe,ºµäæ D‰¸C:ôQà,pVÏ-`M¬–¤0—ÐÆŽD SâÉ5L,‡›9Û NLõ§´_Fsµ0Õ³frn§3à ¿ <íÓô<&îNµA"aÍ{hu\ãý­/Η›=F“£æ—«Ì7&Ü,§ Ùy´Ï-Óò‹&PÓ s: åZ‘‘—‹±³%%•νIÏ(ÊrâD pÿ¾øþûEåÇXY “&Y=~¬?y²àÖ­¢–Qƒ9ääèïÞÕ,Y’\ÔC·nÎR)¤.^|¿hË'T«f[¿¾cNŽnÈK2™F˜7¯nŸ>mm?þS«Ö÷G޼¶$h•ª GÃãÆ…èõ†5œôÏ{8:A"1™dciPL7 ïõ¯%“u…Ù·/aéÒÈôtÍŒ~..S±dqx÷]o;µZߥKȃ$€ô'±¶–úiÐÖ­-:w.£VëNžL üÁÓó«)SÎoß}õjJjªúÉÿ«ü|ÝíÛ‡Å/]z­e˽..›ÇŒ9sæL¢……¬wï ½—, ´±y=im™™ÚAƒ.ݽ›Ýºµ[1[­Réüý­*U*ÊO½|9Û¶Œèè‚Ñ£‹ŠrMžœíë+uv–ôìiruú´aýzÃãÇâܹ&—aZ-½“’ŠRÁô‰&ßîÐ)>\ˆZÍ»¨ågÜæîCÚ'%gf+-EúÆÙHÔZ–6’}±`?ëŽS¹«ÞÃþùàÓGÙyrŽ|Öé71-ƒHÿƒ¤äa.ûMVÔ 2ä,¿$PÓ‰æëÎöëçêÕ«#GŽ´³³3ºœˆïÚµ«M×®]VL¿Â¯}¿h…— ¬ºöÛçîR•!õ¨êÆ´Cd?³ågcÎà`E|:ëN¼8[•<øaåKóË5–ë-‘ðÕ,º6£nzÌ0Ù¬PX>†µqvའÜ6-o.“±s P® ÝPðÌ©¾ÐqV.gÇ©›©©âŠEy-Í›+>üÐ*;›‰³ŠÐ——ɄիK{zÊˉ‰)JÛ]˜?¿¬ù©S™11¯ÞfÎô«\ÙÆÉI¹fÍk8ïÑÃ7,¬W£F¥|}m<Þ±ãøø?[é|? `GjªÚÚZ¾{w»yóê9X¾x'ÞhÑýb­çnA©>Ö‰‰¹G>øä“kµjíjÖìG…b ¬ñ÷ßQ¹òwo½¼wo̱c ôݺù®_ß4!aÀäÉ5\]ÿ`ø-<ÜH‡ÄI“®—)cÙ¨‘óرÅja´cG’L&T©b9k–‰àsç&Õ¬i>q¢sùò&E@ΞÕDFê>4,^l¬<•ŠI“ uêH–,‘Ô¬i2Ú7Žöx{²c3¦¤GoF1u^¥˜3†^ŒÛ¤fÒk¥y«k&O~_ú©Y8X< ÷—Ò¼~ºJð5¬Íø å‹‰í߇qî>¶fLl‚ë3ÞìªkˆPÚš­í~ë`µ*…„²VÌøc 'ÍãÑ·o_—³gϾ<”““Ó¼yóš5kÆÅÅÅÅÅÕ¬Y³E‹y…‚ŠEþ#ü,³@òO‘{ñ1º½}5‘sÖšÓQËù\ÖÛÑ:—Kìv¤fa‰ìó n2·¢8X‘z D_ãH=êÅwžó~xå£ çþâ}‹”½D¶ÂM‰$…ü+¤wÁñ*¹_“’n–çѬ"[8É9ÄÓ’à="?ëØª˜cÏ- Góy¬G{q*‹ OuGGú …ci,+ôQæ×$MÍáVF†œÌY׊“ñL;MÔ3A UQÈ8ŰçKÿ*º±i1ßrè¥ i³jLíÎ…ÛLÚÂöÓFfT*áëÙˆ"1´Ã# ‘ ¨Ä­hÞÌ#ÓA"+Kv}ÅÕ?Åð;þr"ˆ——°~½ìÌq×.ñÂ…¢’{fδJHÐ:Tðé§EU6lhÙ¼¹eHHî”)¯hßS·®MÓ¦¶çΩÆ/–¥¹¹tÅŠê‚ ÌŸ3*ê5”ý{yY?Þ¹GßÌÌ‚ýûï7múÓGûcnÖ¥KI­[ïëÔé@\\ŽƒƒYhh÷wÞ) Tóx1o=§@×êfàlÙÓM”c’êÕ•kIjé.ÛQJã:àOx” Þ¶ù²Ñ,µZß­ÛÙãÇ“6t?þ%ùµR©ðÝwééšãÇ“†½ô‡E7þ<+Ú-YÛïÊ•ýûW®YÓÙÏÏÁÉÉL.—žžVåËÛµháѵ«ï®]m’’}ñE“¡Cý¬¬þT_È—3Ü÷îMøò˘«W3¶l©k*ýYrrô'Þ=v,}üx/{û¢67oNß¿?ëñcÝÔ©&Ô5qØ0Õùóš-|}M¾Ú¨QúÐPÑ`ÇŒ1™m¶{/ –rÝ_ãd"^–šA×QX˜Ó´3G·ÉÍgȦ`¦dç|ã.Öfú6ï?ÂßçÅÑ› ôÝÈ¥ûÌ~›Ï«’E§òþn.Ä3¿-žñNo$³ç¡‰¬o[a¸+*‹iW8õ˜Õ °ýcÁÊ“ÐhDDÄœ9süüŒÄ 7nÜX¿~ýéÓ§ÛÛÛÛÛÛOŸ>½nݺ_~ùeqFÿþ V' ¾Ž|‚• ½!ÐXÀZ‰ZŠ›ˆÖO¥–$Hòˆ÷¦Žy)”1ÃRC^räw¸Ý9Òî·Æ× …Ã#²ëáxÜ$U¬16æH‚ÉlŽÒ¹a/ê:}·`Â<3$°O‡˜Ñœk¬U4¶¦«rÉSÉ™ÀʪGSy`)cM À¾øßd±Þ*Ë€ªDœÿ-²¥”±µ;ÖJ.?dÛó‰4oפiEtV%ò%×¢{Ë!Šl8Ìé#“j®dçêT&>‰q+È0q——Ëøz9ëâî̸dšÎ&wufß,-8sÕLš: óçKCC lÈ4­œ`c#|ù¥­ °oŸ:*ª¨ÂÅ‹ÝÛ¶µ¾wO{àÀ+²Ý-òµ±‘EEå?^,Ɇ֭Ý=<Ìóò K—Fë]Ld2É!UnÝêÝ¥KÙ²em>þøÚûïŸèßÿØñ㋈ýŠVkøá‡{M›þ8f̵Zgo¯\±¢á®]m*Uzš Ó­¶ñt¹Ï¤]fËÞ;&©Þ[>% ó¾òI¼š–«èöÊwôô¶3z3ž=ûæƒyåÊY­\YãUiEÿŠ={‚¬­eçϧýÍ ïF©YÓùƒªmÜØìæÍÞ'NtÑhFˆâ¨ãÇߎŠêsôhç ºw÷urz=;­¶¶¶Ïþ3%¥`ýú{‚À’%þÅÜ\·.A§ëÖµ8°¨ÿ'*•þ‡T‚À²eî––&ïG6äefÊ——Mj2…{ß>ñÊÑÊŠ-[L¶Ä‰¾Ç†­ˆ"³>¢¶‰¶}êÆ/$>`í\ãq)½ Ÿsü2¾ü¸+cÂàP¶A„>Miþ’ªkróöômÀØ–Ï åhXpŒ|-=ñŒêU®–E9›Àð´/ûô AdÙM "ÊÓ®XUÿÇ÷ë×ïÙ#ýúõÛ»woqFÿñ\šýÕ¨Žv­Å[­°7GƒÝ(Ä©ˆ¹¢Í—:a¸€o#²˜oF‡|Ê¥ò32Ð?æPd ‹æçJtÔâx‘ý¨ãMàNvÚcÿ>C³Ã ‹÷hBÒ„7Âgµ‡sé!y+© ŠAÄ(Sù<ÚA¤WD~§;ˆMÐéàrWè˜Ç-Ëͯ$ZCP"ézÂ<©¢ :ŸÑqÜÊc%,>ˆ`u,C¼ØPÊg ©È†BÙtU~äôæ1û-õÝaôÛ‰—ÇRù™%¢(2~'+~¡’;g`óR¾ÂÜ휹Åõ{„|L%cU6i*Þ_LJÀÏ+°4‘ñžÉ )ì=JÓzÞ‚Òôkÿϼ7„òå˜7v­Lšiµôí«ß¹Óн»d×®¢ £>ú(ëãs[·V>ìPÄ|Ó¦ôáÃJ•’EFV´°(jÕ±nÝÃÉ“ï¶mëøÝwUåòW»™™Ú¶mO]¼˜¶jUÍÑ£‹Õ·˜\º”üùç7~àçgêT¢½½²{wßòåm«Vu¬XÑÎÎNif&•É$æçsr ØÄ­ IDATt‡7iÙòwhÓ¿Itî²o_ÂÀe6mª[‡866¿J•‹r¹äøñµk›ÜÑ>ü0ñðáìfͬ׬)eê•ccõµj¥j4âöMšßCLMÅÏO›‘ÁÆÒþýÿ„ lŵ0Æä³E&O©ÿ$¶ýHË|·gÚ ,gõnjWfû<|]C£h6 Žeƒ×é¥3ÑÑbg£éÄú~˜=mìý;®Ó»:ë»býÌÇq„/®Ó±»:ý&+º,œO"hâÊÆ §á«¸||,~Ç]:ý5nÀ¾?å`‹Owuu {¶ÍÀãÇkÔ¨ñèÑ£WŽþ#¼Ñ,Ë:ªc(› ¹IÖ6äï k h’ÜDR”x€\ÍÏ642øÉFÀ#zшå¤/5$÷¹é›nÖX?$¾&¾q$&¼ÞR$çˆÏCÝW`7ªbQ ó,ô{Ho޲=f1èöW¡9’|X^€‘ 8ª#Ê+èa…d”7§Š95LgX–Ö.lyÀ©ÂÜö©þ´pgãvfšÛ*™Ó‰À¢ \yFO ›?Ýýq³föϨŸ å ß!À“ô\füø¢Â;0½ærÒ²éý1‰i/Ž޶¬ž@b gÃø`9Zq";>ŸEiWN^dì<“= mX0ƒkaôAd”ñD@.gñb‰­-ßoøöÛ¢"7S¦Xµh¡ŒŒÔ}ýuQ‰SؘÅÇ?-/‚ÁƒKÕ¬i½{wʺu E[>ÁÎN>eJe`Μ›¯7]ºN—¯¿nuéR÷ÎËT©â‘Q­š4é\»vÁ}úqpøÒÂb}PÐeË~ݤÉÛ·ßý駘ìlmåÊvŸÞè—_:O›Vëï PÈ$;FÔµ63¾óÄ»²6“íQW©TM[”{«°mG…JÎó—´­â÷ôêfÊ»ºr%cáÂ[ÕªÙΚå÷ï÷®€öíݧL©\§Žcß¾ïÜyEŒódÛ¶ûûö%ØÙÉçέZÌpã¬Y±jµ¡K§¢½«¨¨‚uëÒ¢£5Ƶþ™:5ËÆF6Ì”wÌœ©«VMhÙRè×ÏäMméJòóñ-ËÜ©&ßkëlÆÊ‚O§›ô®6ïgõn̬gÜ»ºŸÄä-¸ØÒ«1c;1˜¶›³Ñx9òq÷½«¡ì¸Ž³[=ç]ŠaýuÌd,lô›w™Éœë¤ä3 üo›ƒE,¾óì+Ðü5×MFF†ƒÃsߊ££czzzqFÿÞèÖøzEìÚ ¸‡ún‹ÑoC|¤·ž$²YÀ;-W4U‘®%ÕŽ·¹¡!Ûƒö÷‰Ì&¥ AÈŒå†/µe¸_áŠå[¼ýÇH›Á»ûˆ¾BBuÜߦê"î úœÚ0|AR6ºï¨xœ‚uä¤b8Ë-Ä èo †!w‡ùìÓ1ZÁT%õ H&DÍÏÒón4ç²Y]æ©>ÖʾID¥åFcÌ¥ßŰæ6w2¹Ù·ÂèÑÌöǯåZ~-çÏ.`à.NÅЩ ›º?7E±)ŒÛÎñÛ mÂò—jŒó è¹”ˆxl,8½c‘ð;ñŒø˜Ð[tnÄ׳Mö »Í„Å RÖ‹õ L~e¢È1„^%/£?eùx›T³Ü¾Ý°v­Á`6o–¡%¸{·zåÊÜðpíÍ›Î&Ã].äM™òèÊ•üë×+”+WT"Ñ#éóæÅ†…åܺU¿ti“Wüg9òÊ… i5kÚmÜX¬Ààî]Õ•+)§O'DFf89™=ú ?_ײ¥ç©ÞÞÖ­Zy–.mÙ¦—‡Ç«÷w®ÜÏìýEht’‘8VyW«íÃëÖòyN^òú•Č̼ÆMËI¥‚Á †œŠµw4¯æï~çΊŸË¯R©´3f„ÛØÈ«VµíÝÛ¸Žå¿QäË/c¢£³u:Ü9UmlþTzÓÿ¿~w‰‰ù3f„—)cÙ²¥[``Q%~¿rãFÎîÝɶ¶²ÁƒÝí틚«¥KSÒÒtµj™÷ìiR°ôÂÍÆy+ʆ·´±1þã¹tI\»ÖP±"ƒKœÛ„^aÍ—Tª@Ÿî&U¯"ï²ø ªøÒ¼uMd‹_½Ãg;¨èMóZ4¨fÄ ¯€¹ÛÑé)_Š!mŒ4{>ÎŽ‹Tpã½@¼žŸÑ¨§¼­+<'¯“–Ϧpòµ4ð Uagm­úûÑhSŠe…Éß&0,œÜvÂcµèZ¬‹&µ?|gã;§X/qwwçy½,…B‘››+F{C«ÕZYY¼rôá?à`© eú£Z…u_Ì/cˆÄâK­|è |—Î( Nræ=d¶9-xï+m©âD¯ ¬²Å££w󉽘¹Š5 cØ~®]'¦ µ¨ô‡ÈVÓq ÷÷ò°-<•ø“dý;Ž-I¹îlßÅ¢'ú1ŒD²é)Ms±¸k“Àœtæfð¶%?ºlMaà=ÜäÜ©ŽH3\ÏbzyÞ¶ÚáàC:x\¸‹_ §ö6n¦23yÏäˆßxDƒÕäiYÿCŸïM‹ehtlLÿ ç0-›†“‘x¹ðÓôE\žp9’àSеùÔtaÙÙË´H^>sÆ0Û´™ZMã·¸t•ÖÍ9ø½É2`ÊÃÇëkÔΟ—)L;Eݺeüðƒú­·”Õ7màÀ[·fôèa»s§wf@×®á{ö¤ôéãöÍ7Åj’”¤nÑâDDDÖÊ•5ÆŒ)VÖ?KÎðíùøÃáI7²âRó¼-ü=mÛVsíSßSQ¤òB %”ð÷0ó* nPÆš±–¤jð;Ertü[„mÿ7àpÉá}¬jaðF€6ù ¤ Зð®@œ» ʨ`†Á‚ª–6xXã+ ³ÅÞ‘r lr¼ðsÄ#Žð:ÔñÆû:×[PÃç»$ºaQr8œá~w<Ëa¥B›JAKlËav•q,VÕ‘ï%_ sTB¸‡˜ˆØDF'95¤|Z0ÑŽw,IÖ³; ¿3­©dÁÊG2õþøXðs2‘…Á…AøX¡Ò°«p£P)e[{Þ*Ë‘8ö?#ŽàÎÆnø8°êWžï’×°<úãíÈâ\x)°ìhÍÏóÐêÑè±ÔÈN"P»2û?!5ƒÌÚhò«ªÍ®Ïq²gÏ/¬þÚ¤™™{¿ÃÇ µš¦c]ÀŒ’J•ssfÍ*ª~õj[iv¶¸kWQ/voÓÆ:!Awøð+Jó–//_¡‚Ellþ‰E*wâêj¶p¡Ù²V›6Å„‡ÿMÍ›ÿ J™dP#Ÿ]#ëÝZØ*w}çÈE­vލ;°¡w‰wUB E£×ÜÜùMðð››ÔYéë¶¥iÝàaýoîüF¯}{fj=çRðµaKçÞða•­hõ4O´ÍãuãççwãÆg„……U©R¥8£ÿÿË¥c/T'HÞÌõiÔn¢ýNb9­gµ94œËçkKêäq5ƒÝÔÊ$,‘ŸJQ+…[QªLý¢®q¤5㉿Ä%G,äHï‘xÛ-(w‹äƒD9cV Ûó¤~σfØæc%ç™1W#žA³‡üÊu~F\ˆX ä´Žåİ’ÐÊ‚sj&§¡`±)ZöeWP׎ÖN\Vññ½§¹Y¥,˜@jŸET˜eTÃ…æ^\HäýŸIy&íçÝt¬ŒD`ÔO¤=ŸÔ?ˆuðr¤óçÜ{IOÁË™§q9š}™¼Åø47ªÎ†)\»ÃüͬúÞä·Ñ¾˦v›Ï¿â°1 ˆ'¸»ñõzÎ_bé ö›4³²bóféÅ‹â²e†“'M.•ÜÜ$3gZ9£yR‹dÚLÖºµõÙ³¹cÆ$µðòñ1ëÛ×íÚµìétÅZ¢uî\ºuk·°0U¿~ ^OßJ(á_ERØõ­Íu'øÇô»QÚüü´è;wöÿtxü¨­Íê'…]]oô8Ÿã‰ô,C“ÂÍCÉÜÎ%>ŸÆ6._þ¯y¼n:tè°mÛ¶glÛ¶­S§NÅýGx£¬ìp€ôhdvèÒQ¶C£Eþ.‚ƒ ‰¨$ Pb%`m Ý–Ú ÷]i$ É%ÁƒÚ乤ºPÊ ;1‡”JT2Ã,‚ˆT— ¹Å?\àe…ü2:QZ€;¨rÐÂEŠpˆ£±’ÁQÔZø‰ ®!ÞC¬&¥—sÍ€!6ø+(Ù”ÐÀš nçóiaŒsQ%Z;q:…9Öƒ*àcID&‹žÉÿ°6ͼÈÓ2#ä99’eí±”s+™é‡yA7`q7$¹LÙꥌp?oöLC)g(kŸïöAlœŠ °õÛ1ùµ x‡¥“IIcù&Ân›4kȈ1¢Èš/ 7­_¿¾0}ºX³F_D:ãÀ˜ß¸¡]¾¼(Y¬>p¬RÅ,7W¿~ý+²Ý'Mòª^Ý*$$sÓ¦âÆŸ?ù$ |yëGÔË—›þØ%”PB±ù¤´í'¥m‹ý¤´mòͰ_&G„ÿzüõžLRØõÝÛgÄWUΈ½·³{û¤ðFG/‘f*MdéXÇUãÊàýw÷vúû2dȹsç-Z”‘‘‘‘‘±pá .¼ÿþûÅýGx£,A »÷IH”¤ŸCé:±ä£Y.ˆ#EâEÖY2HG´–½ötÎ#"—“n´Éæv'|i‘I\ ¿Ô •Š´k "Hƒæ,g+ãYr™ä\ãn]<âQ}OD9,[ãŽj7ÚaëùQ²~FÕóN˜§àò* ŒArq>`žþRöëˆÐ#…•ÎdꙚÎc=À2/\|þ˜C™Ž †x“ æƒR4¬¢´ŸGðMáO["ðÕ[”µcà Ö=³jRÊØÞ_GÖ_`Á±çfK*aÇpÚû³û2ÝÖ }iýÑ´{¦£½žÍGŒOù€öl™Î£4úÎå'ÓªICÖ›£giÿ> I&ÍV~\vêxŽŸâ½!¤+c|ŒҡC%¿ü"frÑ$Lžl%“ ‹åœ9c2V/— ë×—V© S§&Ý¿_TH_©”Ì›W65U3iRôƒEí<þŠ¥¥ì‡‚¼¼,¦Oÿþû¸‡C %üwˆ:¸ï׿£™‰ÿ ôZMðˆšã'OÐääðZö ø¦1ŠÂøø['ÑÃQ>þµÿa„B^ø°¶¶>~üø¥K—¼½½½½½/_¾|ìØ1KKËâŒþ#ü’܃Áïc’¦ µÀw&³±|«4(@Þ[«˜:Ø™Ê +KÖÇ2V»+‹®1É ×ŠÌ=ÊL3lZ°ô;æ[ãÔ†Ág¸CLš`þ-ÇËâ>†·?ä` ¹“hdÕh.Û!ÿŠú?“=‡X|…ïOä"Óù!œýÐ ¹ŒÊg­†> ¾1èü˜}¹Lµg‘À§˜GmKBüxÒh¸íE~Na”««>ý¤[£‚§%ç;Pºp³ï.Ÿ^&,…£=¨ùŒ‚ÏÏQ¼µ ™„CïÓ¼Üs3v?•À…D†7eîÛF¦ô‹CŒX‹…’Ÿ¦Óª†ñi_°…™°³&x _RØ{B†Öý9}‰öÍØ¾Âd›zµš¹y‹ z|õ…ÉÅû÷Å€]V;wJ{ô0¹l˜;7gΜì ÇŽ9˜™™,çëÓ'þ»ï2û÷·ß²Å³è¢¿nÝÂø!eà@÷Í›+e÷ k×Þ5êJéÒæ§N5/¦fc %”`”'Q¨‰ Æó?)m«°²‰•›ûÀ“¡OnmÑ çQ‚^«Ñæå™zâœypîL1Ï$)ìú½£‡‹cY®e[W"§ÏãÙ ‘gà‹Ý,ž¡Á¾°¬çx*­.¢¸Ú˜ÊV`,=¼A þ_ã\xÃŒWò†~AÄS<¶·!§P_¢ÔJt«Á`°z×Àf98븥¤M:ñzRìé’H˜†d7Ú=$&»eh– œóÆÏ'9™OþHFnæH ƒiŒáwäHÑú3îœ#¥¥{á3øëäOŽ ¶£È8IÁlza±ýWˆ~{¦ˆôÍㄎ–´”©å£4niØïN%9:‘^ÑÏbj)&•ˆÉcD8ÇS ®KÛ”Æaç8ø€ö^¬ ü­GÕŒ~¸ƒNäJ?žmùºôâ9Ë©ø=¯žxå>sör0Œy]˜n¬ לï%*㋨cB;sâç¹DR:¿¬Äß׸Mz&ý'“©ÂÚŠ}Œ÷š3t,GŽ3e|Q6ß~kX¹Ò%†…ɼ¼Œ»EاOæÑ£š>°˜7ϤBÏ£GÚÁƒNœÈÞ´ÉóÝwM‰‰Fž<™¹gOµöí‹UÄŒuåàÁG¶¶òóç[š›%”ZB %Á+,©\Q¶U›èƒÁO†:–¯˜ûeƒê;¼}x¿A§+ÚÁ:·|ñ¹O—ü%ç]<ŒŸÒ`‚éK*].“¦aˆ'£ËèDä’ë_Á½Eø„‚G¨®!õAûˆäo–BÌ#ïb*úpAï!rßÀv3jh8ŸÇ+ªgs!…¯ì HçÚv¹Q=“¸(”Å?‡ŒÛ\ðÀ]‹6“Ì(¢|q/@s”kAxç ‰!ã[⚎æ(I: µ°JFóÉh‹Yârr4ˆï#-QˆšÉÐÀØ|tPYNi)÷´| ꊗ‚íi$hÊZÐÊ [9«cÉ.”÷œ[ƒr6¬¿ÍÚg2|fb!çn#žßԛ܉@Zïl#óù ®Z> i‚ 0óGv\42£³{S«þeh7›H;]¦F\h3ŽXIJv¬˜ÁXâc**Oš=—rcÜô,㉭I O‰·· RñþûzS?j…B?ÞR.çäIMD„Éþ9îîò®]mÔjqüøÄÌÌ¢r5K•R¾õ–£‹‹|åÊøœœâfu.^ì¯PH"#³æÎ½Y̧”PB ½VS¶Y+ úà> ÷}š¶0èŠjŸõĸN§Qˆ>O¬x pìÿ XùÍç?à`yı)ªl›¡(…´fAä‡ ¬‰ 9%¡‡@m9‰ ‚¤¸X`mAu…¶T• ´DéB œryP:.øDr¾ ¼ñ#,?\´è“ÖŠ•q9ɽjØu¤´#ÊÃ$¾ƒCæHN’Õ ó†(<‘n'ßZ"ñ„¥€qJêÉp“ðµ`¾JÔœ ÐÚ–J8ʘ÷ôc}X–@{ L+lUâfÎ8?üìX}‹¨BÅi¥”)cË­T¾~&U\ø¦7uþøvttQÅG%”PŸ¡ü[S fŠC…vƺþ27 ƒH{Æø<=òm ·-áàÎA ‚D*n†úK¸7‹²”í@î5욡ۂ.R_ †ÄÝ`ý‘ž ­ò¨•Ë—– R!Ï` ïgRÈ!ÞÍÅú{|hìHýŸÙì„GGƬfµ=öïðÎQÂÏÑÿVÔ™ÈÏ9¨—ÒöÚÙ„¹böûɘÍÃjXlÃ7„‚>¤Û!9‹!]âv¤]‘œÐÑ:+hkœN¨š„‹Œ®xÈЉt¼Ía3J3ß@m }(ÇS™W™…-XNãd8íëðã4äÆ~ÛwÒm*7î2°›¦aª.oòR–mÄǃ »quP©T¶¶ÏiÕ\¼L»ndªØ½wL\'srh×N"Ξ-™3Çd ùèÑYkÖävëfþý÷&×z™™úþý«6nô<¸¨6;jµ¡]»ë'OfΟ_vÆ Ÿ",ŸÅ`ÇŒ¹zî\š pèPc—»/—PB EðÊ$÷'£ª¸û<­gvé–u©ÒE?ñ QaÙmÝþla¶ŽÚg°•³½å,5ô½Ç©,v•§«ãïLr¯þ׸×ßh£¼áŸ_q3øtC¼F^ þ‹Iœ‚Y¼û‘µË.˜ ”c´òQ ø>…Áœ­Xw J»±ð*Íq«Ê'‡˜ À²5KƒÙ¨@Q—·¸ŽsV¥ÖbvXb>Þ{¸}˜¨–”L­Á„Æ“;…*qD\y3)ÝÛ·I E3›¡XnÄ0 }„ÈÐ.—Ã:¦)YhÐë1;saËZ'€ 9LŽã¡†}©jp>ƒi·¹•ÃÏõ¨^ØyÜEVÞ¢‰Á-k¤p;º_“«eK[úU}n¢úïdÛ•á‡~8?¯˜ðHEÐBÌ´®Ê'=Œô.|@“©¤¨˜ÒE}ûO¡·h>š<5ŸŽeÜK-¥Ÿ . Y.\§W¶,ÅLIxxxµj/ʶ–ñÓ¨U›ñ-kü¥Îœ[¶Ô5m*Y¼XR³¦q‡.)Éðî»™·néÖ®µéÒŤg³cGfïÞñ¾¾Šr®®Eu®=}:sΜ˜èhõÕüýM–(¾@n®¾U«“çϧöìéµys] ‹’¢ÂJ(.¦ÄBŸxNÏzQ_µ J¹uÓ- Æ{Oò*Ïì ×j¶4­—yÿ¥”Õç±ó);ðÄ©¢x}˜M—Ï16ø3¤°gú°6$3•µe~¿LC•¿Æ ¸õ†;¯äÞ"|‚[#â÷â1 ñ'š´VÈJ‘½Åˆ©¬’0ì[0PŠ'Ür ‹w‘¸Rtc“Å•ò´1Äp¤ 9d†²¿&5KS:”Pkñ7`8ÉõŽT¬ˆã b“ÈHY,w/…6ØY#]E’¦bí‡üS²31 Dò.’cˆ0Ÿ˜Ó@ÊÇD>q¢…9ëUͨoES´"ƒbžfYÚÓÌ ¥„×ùu{jimz•ár*£/ü6•ØÒŽæ^ ù…³ ÏMÒ†®¼[ƒ< wRð|y»-‡'PÎ…•Gi¬`eOÍ¡eu~:ÏŒoŒ u«°s>AþlÚÇæýÆmÌ”ì]ÏÛ­ˆ{Èi/{WÀ¸Œ΃DzÆT—ôF„yó$‘‘†~ýôj T®®’Ííí…‘#U&÷õzõ²:Ô1=]?iÒcS6OhÜØ®aC{Aûõ‹,þF¡¥¥tÏž ·ß.½gÏÃîÝÏjµ%]tJ(áõS¡}g |»¿ªqŠT®è¸n‹Âª(e;…•UÇu[þ¼wèE†yó~¡wµ3É´±cZé?ôr†¿æñŸç?à`Y—à%3‰‚dRŽ¢¬‚!—äH0ä’—˜þ‚DïɾQR[ËÕ\6ZQ+‡Ë)l³§zQñìô ¶†ÜhŽøò€ IDATR]ƒ:‘{Z²ì°Ó£?ÏùºTÈ£à47Í‘–ÂV!˜ÛA8ùb™Œú·ÆV‡ƒú™õP8!ÉB\K® º#äÃ"ô*ð“ E Ô2ZZ`€±©<éz7¹K9¬)ÌžX3 7²XýôˆRÊœÛî²3ö·ÉèZ4zzî#ù™v„JË;­áÀm†ïá…UGW¦¶Ç\ΆS,6Ö'§–/3z’¢bÑ.>Ùcü{hİ·‰IdØž3nãâÈܱ„GñÍ^–iÜF˜3+ ._cò,ã6À˜1RKK!"Bœ9Ód–UŸ>æ..’Ç &ÕÝù£œóóÅo¾É8uê™RS¦x™™IoÜÈY¸ð~Ñ–Ïâæf¶dI€<$$uÒ¤zýzÍWB Ågb‚ÊèãÙÑ'Ž›<1AUïƒñ/½.\ý«÷üþ€}™g´›Ÿ‰žÛ—)×óûÅ”-³Ê?}ùd£c¡«ŠW<«„¿éœ9sþésø ™;wîœñCÑg“ƒOg¤Jd.(dˆìº ¨ÑÜÁº‚D0ä#/f2ÊéAnN= *ìi˜O†™-¾ZD) R;¼)µi–Lr:éAÔK#G\ƒ¶1bÉÐ!úá,G–LÁm²ßÂÝi†ëävƾò;è²14DYÉ 0‡GˆÍÔ•q×Àm=e¤øJ¨£ä”@=3Ê›WÀñl:Úc/C.¡¦-aÙ„fRÏs'3\ÌI+`O<=±/\55÷â\"¶J~Œæ=?$…—+%-|9ÍãlÒòhòüî›§Õ½¸Ë¥Xœ­©æñâTû¸P¾Wïq&¹Œz|þ¾hu¨rØv <]ظ:QÅ—°;œ¾D*”1bcfFÓ†œ !:WgüŒ‰¨Ëå ¡¡bX‚‘BA (H¢}ðÀP©’¬LãÛsööRA "#5:ØÈd&ÅÝårIÍšÖׯç\¹’ݰ¡»{q—ªNNÊfÍ\ÂÃ3#"²NŸNy牤H ù ¢Hdd–³ókX”—PÂÿ;V®nï °õò–)"bT[Kµ«wPã:Ã?hµô3ëR,¾d¹€c¡/5$ ¦%˼@|rã+ö}îܹ8×ø÷‘ö;NãäŽ`ÝÝpe#5’R¤&~3Õɹ„*]<ê3èË¢;ƒv“ 69g`’¦Z®ä³Õ’:y„§³Ã‰z*n%ð£7A©Ü¹Cpe<æþ.™#S xÄ£+\i@å{$žá¦#^Ø^#q/·›á’ƒö6ªc<î€ýc47È;„*¹Òc|F6ð’óˆ+0<@th(%ÜÀ‡ùhA)0Ñ–LÛ³IÖt°§´’{ù,K|úYƒhîH¶Ž¥÷È/ Ù¼_RÄeÓç4ºÂ€­L¶öÜÉàÔ>¿òÜ„Uqee'î¤0çÁ‘¼@{>z K%ý¿ä——J.LêBB:s·sè²ñïdÎûÔ­BJ&ïÎ"6Á¸ÍÛ­x¯31fn^T¬q›€ª DÔ]–¯æa¢q›Zµ„Î…»wÅ yyÆmÊ——uëfvó¦vժ܂“¡£ \”JÉΙ¯”Å ² ²MO×-^§ý=Z4µk;,Y—»k׃!C. ÿq,­ÖðÞ{bbJJ K(á)R…²Z¯¾×å½vrfE‹2ë¦tübkÕžïIå¯3¸dUXNt0“ðõ•(ò°<¥ëRÑ ó«D·¡‚éC²T¨{ám‰ì<©Š«Ò3dëÇb¥@ˆFw}„nHœ¾ÀŒVRA‚œ§’ ,ñ•“¨ç㌧îsšÚp%—àÂ#ó*RÁŠ[Ù,¾ûÛlÂË’, ËžÑ /eÉw¨éÊOÑx>)³]%>iO7Ÿ‡põ%hP#:Õøø 7Œi¸iËâþ8XóéO„š\X5^­p²åƒOIÏ2n3u8£ûb-&/%ËÄíûƒaŒJâ#¦ÌÁ”dèôéÒ^½$ âÒ¥&7 'N´|糨(ÝÊ•&e±”JaÆ ™L8{6ïÖ­W´v^¸°œÙ­[¹Ë–Åmùõë;8ÐØÒRvõjƘ1×tºµ•‘¡4(ôòå ™ì¾Œ”PÂïG­ÍÛ{m°çêÆ|Í_µÉб6‰5C\ðR$êØ›p·D†ê_À}e”*_æñD÷¾Á¹Ya<Ø…ý[ˆz´Ö²ÉZ‡¤7†H –K)r¾´¤§–+ü`GÛ\®e\жO‚XéAìmö× y6iáœö tE*>âQ8áÕ)GÒABݱ Ä3‚¤D5õæ§I9JRì`ý ™{É(ì=,Ρù„l`>ÒRÁˆ7°Êœ›¦¨IV9¡2𩊓ùnrú;šÃÈXTz¥„ÕUIP³ð.Ç EíloÂÝlf^åÔ3YÚͽXÓ鳟;ÏˬkD£2¦ÓV^ÎRXÐ…1­8I»O‰O32ëSºÑ½!GoÐaw5É‘IÙ87'œ£ËG»K&S¡,{Òoâ‹9a¿ÚÌšŒ-ßîbîR#€\Δ)’¸8qÁCHˆqE¡&M²ŒŽÖÍœ™só¦ÉAA–&8Ÿ8‘3lX‚¡ÈüMkkéªUîÞÍŸ5+æôéÌ¢L_¢Q#çC‡šÈåš5Ñï¼’Ÿÿ/•CŽ‰É :öÍ7qåË[· c %üGØ{}³*?ÈVgßøê/z—‘±È ­-c åuƤr( {Iùo´ƒõ‰ŒûGñê JAn‡ê*d"õGlF"/ú>’ò˜8mN  øÅ6@ÇÝhB çKS]‰½€¾ A:tQ„–¥¬ Õu®WÅÛ û rnÓŽ Àyä£}Oà‰@ lôˆ?^€8K î - µá6âJ @kmedŠ|¦(#g¼",ÉD#ôs&К‡šß6 «Û0ŃȜ(2 —®L¬J€ nðø9õáÕéY UO’õ¼LèÜÖ4+G‚ŠñÁÏ “òÄõéFÛj”qfÔ7¤[›Í}—öuHQ1f=IF ¬ÌYÿ.œ¾Îì Æý'KsÖÍÃÁŽý'X¹ÕøwëìĪeH¥¬ÞÀ™óÆm„ $særM„¨ê×W b¡ÑˆóçgÑ?gêTgwwùÅ‹y;v¼Âm ´4ÉK¯gÍŠÍÌü}]Ï5rZ½º–££"88qذK©©Æ$\ÿQBBRúõ»™åïo·n]-[Û¢Ô+Jx­^ÓS½þ›êý™ùó¯ð—ò7œÞ¿vR²DìüõŸ?ßÜžœeºÃ×åÇ ~ÊÀZÊ2Ÿ§7òCyÌÃúÜÕK”ÜÿþVQè КáàÏÍxDjAjØÿØ;Ïø(Ê®ÿg[vÓ{-Z TéHk (ˆˆRPˆ i‚é t¥JïÐ!„Héu7›mó~Á”M•Wåáúí‡ìÜgÎÜsOvæÌ)×Á¡=Y硤/E11–œ5RÆ‚B`ÃL\v¢‹®–¡› Ý~¯B§L¢CØV‘Ú*¬¯p¨*¾>øDJh{í±ÞÏ¥rØ¿MÅ ´¿s¿%n-p{DÖQâ߯¾ö÷ÈÞN²'ÒqXË`>YÀd¤-Öa:Œ,VÑYΚ‚íéeÅÑl¤H`UyY3+æÖžŸUd°'ÁéÌÊ( ªE GÎ'ÐïÄ-tXÕ–¾U¸ϸcä¯]“KÙ>ˆþ܉gÄŽÂ åR6¿O9gÞ¦ãÔEbí2)[&Ò¿)j-oIš9³¦´ ûÒª.ço3cùK§I¿õË"jWcË~ö3/Ó¬1³§aeÉ'“I.¦ãáÔ©Òþý%§N™Æ/Özš3ǶS'åöíÚåË‹ ÚÙI—//]¿¾å’%I±±Ï¹L›æ=p Û¥Ké3f“GV<êÕs:}ºe—.¥oßΨWïð•+æ¬Ô¢È’%÷[¶ ±ûªhï@)sbÉ4ȦV¢¶óÃØž” ÌÀVÁ‰'̼ñÇÚXÉ™Õ'%«o1½`;BGKæ´#SÇ/ט¸¿ð¢Ú©˜ß›Ò\cÈ*ôE~KVJ–Œ .•›áôŸÖœ¦zE& âìM¦ÿÄ6s]½¼¼Þ~‹wzpñ:ƒ&𸘗ÀOFÓ²)÷2êSó S¦HÜÜ„+WLÇŽ™ÚØÇ«ìì$»vi££‹½7tëfëì,½tI3zt1©õyÉ„/¿ô®SÇö›o¢6lx‡VQøúÚ®Xàì¬|ô(«Y³c{÷SðÿˆääœAƒ.|üñ5ƒAlÝÚmݺz66ÿpWŽàðÏþ¾q¢X¹×ë†]\7ìâ?=‹ÿW\‰8™ÿë¿sÂn_~\øvvñÑáûñ7ÌÊÿ9Äë9”Fk{çµUü,™ë:Z¨j[âžoðÿˆ×šhõÁ¡rkqekœ¬ÈN r!ê)í‹:×6莣OÄk4ÙÛ85ÀpY£2E$LB¿t‚ÄZóa ¤¸2,Š3Ù$xÒ1žÔd8PÖ†w8­Gו7³9‹¬v´‹%û2÷ ?¡ÇZ®<&Õ÷T›ÊÍDrzQæm<>%â ºØ ÃuYGÉ1Ào8é  ÆÄQH†#Éé¬!ÞÄ$ †(F%r[‡RàP)ƒH¯ûÄêñ³dU·Â‘lŽ!4‹ ñR=Ýxò ã/•ÍÆ·hUêu:͇G‰W3§ C 2¼_ŽbØ6’5Œ{‹ñM /pX—âj‹i–0s¢’h? ”sgçd3,ðÀÒ­ür˜ÐöC?3¢Hß±$¥’”ÊùmXªÌÈDDÑ{iéŒÿˆ÷†˜æÎ58`ЉáÚ5™••y™÷ßϸ}[ïà ìÙSlcœØX}÷îÉɆ  ÷þýŸÓRuݺ¸U«âîÝÓœø øÆ´¨(Í{>ÝO.ÿg^Š~2zôUwwåýû™kÖ¶kçñü}þrÅ=>‡¬ª§”[ ‚ÄÁÒyv§±˜);û§j FCŽ!»„çnÉšc¡;÷ÝXŸ–\Ö±Òà†çø(+'}Õ;§eRpéñÑ}7ÖŦGØ[:w­5¬QÅöÏv|œ²-ø»°Ä[&Qôvöí0ÒǽֳÑ¡¿í¹±6=;¹¬“OßÀfî}/ÿ4ŠS«ÎÉØyõ‡ë‘gÒ²S,]šùtéPc°€PôD®GžÙyõÇØ´ÇNÖî-|{¼]­@a¦4MÒ¶àwb.eæ¤Û*ík—mÚ«Î(¥Üò¹J*næ…¦gV,Ç=b]3'k÷1-ç|âËTuâCN7ÉB¾«uÃ.:Dqë¯3hß[×ÔÉÚ}ZçÕëÏÍ¿sQ@,ßj`ýO²’šS…Æ]½w¥¢OÝß“ªN(:ä`åÚ¤r§¢¥øzTñ¨mv("‡>Ù]W9Àñl†$PZÆj|/ÏäîþjÌ€'¯µñx­Ï_Ÿ-(,Å Ða ×Qºâ=r’¨7û“°,WC’6RúsLë1Äà±ý»V&›Â :&¤3UA}èÃl+¬p‡Y–”©Ê×/AÑ‘¥ÛY”NR;†G“qœã©Ø‡¾ß±OMv'ê+°þ‚#–È—ÑéÉsqG¹Žú×ÐŒäq}¬æQV†¤1‰±W`ßÕL£0"lDfõ Òà&jƒ½@Љ*‘$ÙäFk€ûZjÞ$ÛÄïUþh¢Þù2{âiâÈñ]͸Îþh’s8ÑŽRù÷?ÜàýCXɹ0¿‚æ·ß¤Ï&¤v ¡]•Âkü˜ö‹IÌdF7¦škx+‚&“¨\šÕ™]Œé3f!ßn§‚'Ç¿5OŽ•©¦^wî†1  šW²c7=ceÉÕST®hFÀ` ~}Õ+â˜1’¥KÍS^=ybªZ515Õ´e‹CïÞÅÞ|W¯N6,ÚÙYRÙÅå9^œAƒB6n|R»¶Íùó ÅŸ1–.½¿ysÔùóIŽ7Ö¯TéEûðü-HO×OštãÇÃD‘þýËΞ]ÝËë•„óã¹–L"¯éÕ88üøì[JÙ—KȈž°­G wË+'Œ&ãŸ6°nEŸ_pðãg_í-3²SL¢ií° ÂØKóÿHäé=S@ø¬ýŠÜG`dʃ»‡éŒÄËeù”Ž?”w©Üо°ààØgC6J‡Lmê³i” vÉ‘ W#NåŸa÷Ú#ºÔVèDî=¹>{ÿ¢øG,¿ýqmªõ-tvsöºÝhúÃAÛ¤r§aoM-YC C%Ì<ÿôŠ3šŒï®ihmaçhå™ò W¾¸I–l`•°þ&Ñ4tuK…›]™Ç‰!ÏÚøõë_ïcŠÇ¯WWþv­¾ãÿt­5¼[í÷Ì=ÐrSCG€‘šQ„ê™éÈàå ,ûWc¤½ÖÆ àµÊU.>dª‘[bÐRq(6åI‰ÅÚ w”u‘» ¹‰Í0äÑ\CÖIe‰!SÀœ•¸Hp£ d8ˆmðPâ.ÇÆ@¼5mpä\ š[aÁºÔµÇ^DL$¡*e4è®ñ°Nþ¸¹`}‚G-qóÂÊÅqêbÝÛ$ [IV"LÀÚÉn´:ÄîHê#‰†¥rÞ’á"ð­ÀQÂ\'ì$¬Ï ÅPYÉtOe,{ò´¢ø©:®ä˜ø>WÀäXËÑ›øäÒÌXÀȼëO-7>9NbAʨžÕ™ÛÚ¥™{‚ËE¨êxóÓP¤ßaµ¹¾¨þeÙ5•›áœ½Ërs,ðÀ¢éÓ g;>˜:ÛŒ€[—akMr*«¶™WÒ£3ý{áèÀWsћ˒ÉXµJªTrë–X\E¡»»dî\;;Éš5š””bk‡ulÑÂÚÅEúÍ7IÅÉ<Ê>*¨D‘—emx†>ª¼xq­ ¬oÞLïÓçܼy¡/ÞŠç/bÏžØZµ=š “I¦M«¶~}½ÿëêE`0é«{6‚Ñ<òó¬ŸÿÁü'p8d+P»l“¥ý÷/î·×Ó¡‚I4¹Ž‡ßom?n½`Õ;§?j5OD<”—˼ûúj1' l³%ýö};à@ wKƒI¿ïæÓÞR¹bÞ-¿ppI¿}å] pã– 6$6˜ÝcËê¡ç>j5W¥°~˜p›"øýÖFQ4µ®Öç‡Á'>l1[&‘Ÿ;XTì³ö+V=·nØÅµïžÿ²ójàZä™çj(q¨Ø™¿È J%R +'ÝV尤߾‡œ(a’Ïlb³‘ÁÖ_"H.S@˜ÝcËò‡šút.?.&¯ó¿[éSë ˜“ŠR‚Ÿ‚‰öÿº¢˜ÿa¼ÖV.’pî{ʵ%ú4© ¤ßçÞrJ½CÚ%bö£¬„> Si ‘d¬@6ãU´ %Œ¹hâG}u\Ö°Þ‘®®'³± ]Ó ‰dk:¥Ê®J(±N%!ƒx?üÂ;ÙÆTÓ¡¿@h±=ñ‹ u'!Z ïP>”ŒýÄ0 ÅåÚ•$$a艥7²hW¡`&’ûˆs0ÝE`± +r¸cxdžæ*fóU^Z÷'Ôµb³óru\-Ø€…”qw8›'&ØØ¹„-ùòZuZÞ { GÐí7r >¤Æ7¡yyN>¢ã¡fè\“5ïrê>“¶±Ï\šA?6|™ÆþȯæjýdR¾›ˆûÎ2p:ÏHΜ9óLƯ2«fsàc‚¸bF °|5ý9~ºXÖ†5„éÓ¥'Nˆ³fK=:|¸e³fŠr&N,¶Ž ð㥽¼óç'îÞ] —Wll¤[¶øY[K¦N}´yósxJ‹C` ã•+oO˜PÅÚZ>iÒ ?¿‡½t^×KáÂ…äÆvî|úñã¬zõ¯^}{út?©ô_Ä/_£L#árøqàJÄ AÔ*óVqÂ…òß‹K‡L~ô k§rr°tÔ`|þÑG‰w€Å‡Ç[ûÖÒ#\¿ ð8ñ.Ð7pŒ½¥³Ò¡wÝÑÀ³üÈ”û@¯:£l”öö–Îêú‚jÝmËó|ôËÅÅ ,í·ïÓ6‹Šž]®ÕÕ¡ú ¥\U׻Ū¡g¦w6S9¢ÕkÖ›7ö—CW7üj÷»@®#­d % •0ó<Á\ô koél!S•<ÉPòúçbh£ÏJÙ—³¶°ë0HÕ$>Wí¿.y•»´Í&ÊÀ:WäÀì€ß_®vù ^ þ ,Ÿ¶˜ È="ÏàÕ Q$[Ä‚ô`l:’u–”ýØŽBáGv<’ N½7XŠ[Ñä:Î:ÐZ@–Å%'dXÑXbåEc9–O¸VŽªq„ÝåB R¤D¨ÉjŠ?p–œ«áªEœGMpnŽ[(Gˆ÷ò¶ZL[H’Âx¬­‚ÉÉÀä0‰ajKñ•'2'°À‰Ö*6eq8@&°¸ÍmY™À¡<&Ž4°Gg⫤çýÞÜTüÔ™„U÷9/m\)ceÊÚr>¶pÂ;0£-í«Å„}$)³ÔÙ=±·bÂVΚ¹ÁÒ³3b41u#î™p°aý4mÙžo6?ÝØ¸qãJÚ1¢/ÙZ¦.$Õ\1{;&~L|"«7p¶˜Ѹq’þý%‡›.4ïê.´mÒDqò¤îÈ‘bÙˆ+T°èÐÁÆhçÏOLN~Ž×$ À¦_?wàë¯ÃoÞü“¬ƒvvò¯¾ò ò«RÅöÁƒÌ1c®õìyöÂs\d W¯¦öés®uëz½ÉÃCõÃuÖ¯¯ççg÷·è/ÂÞÒ¹‚«_dòýðä{nWv«a«rø‹:3µi€“õÓ@µ‹MÞ&ÙºÂÿúéÙO×?÷iíhåšûÕÁÒHU?}„giÓÇ<µNybÏU;ì­©¥ʧ¨ã‡l]zdâø­Ýî=¹^tÚ]&`«|Îéÿ|aѱ»;Ò4I"b¡d 4”0TÂÌ_JÌÃÎëÙß%L²”¼þ¹(íð´K Ê ÈôüÏ!÷É-òu§µŒ¶¥¶@¨‰õ:€—ó3¿©"|5ø0°*µÇÊ™k;©Ò›ä;(}Qypw9åÆ`ÔƒmSRv!©‚1‰´%(>ÅŠn¹„A[­&’Ã>gHOggYúgñ(œ e¨¯C}‡5hêŠ×ÎêÈ|‹·tèNp¢5ÊSê÷ÛG,¯«Fÿ6vÈW–q,Þ(W“AN3,z :LÎ"²€iH› Y‹i/&`¶’626êY¥¨ §‡5 O ÓPEE?'dï„‘”gNͨ OŽ&ñþÍ?–¤‰;KëQÛ™¾'¹“ÑÉÝŠ=ÝiäÉÂË|Wп%“°u ýk“F¯hŠÄà>kO¯â3è¼”»æøE'÷泞¨µt™A˜9JeØ>‹ªÞüz’MfâK¿dPWžaðóìYë3g:9:¾G†9”BÁĉ’êÕ…iÓLGšV¨ íß_•žn6,=3³Ø‚Ñ£‡w¼pAóá‡Ï/ñûàƒÒ“&• ×öèqëe™±ò£ys×7Ú|ýµ¿¿¿ÝŽÑ éØñôîÝ1ö]§3mÝÕ²å‰ÎOoÝÕ°¡s·nž¡¡íFŒ¨ð¯mŒX§\s`Ë¥e¢hÊý»8䯕 …™ŠFš¬,lgIÊ ™*W-6À÷ƒ=Û}å“y;ÚIYOÝŠ‰YqÏ6ÖJ»üjãÒ#_P­—SåYÝùºûÏëRÞ¥ZzvÊÊS_=;;•#Å7ùqéñQ`l«ù«†žù~pY J*aæ/%–[@ðÜI–€’×?¹É× SRا¦¯5“D‘Í éKø¾áÁz5x­ ¬[Nn@¦$-UDa‡Q:“Ñc6ѱ®|©3ÆxtÐc8&1€ÖÄF ™HÏf½-EtÉìt¡¾ }§œ(%G•Å“DîxPÄ«®IM¦ÛÜÖé‹'ð;Á•p®„ómp?G7”iè~%ªµ°4 .'€¥ V£‰Àè]d°Q¶CŸkI†Ûâ-#ÒÀ—yôanøªˆÓ3.üé¹À—•°”²9–MùÌ€÷«`'']G¿‚,£þ.|R?Æå`Aþ&+ ;’¢áD£¥h¯¼ÝiâCŠšNÿŒLu IDAT‹‰77ûjU>–ññúÉ“ý{H¡Lž\õûï¦M«æà Ðh ]ºœñòÚóÍ7÷îÝ+v¶ÅÁh‹ÿê«;Õ«èÓçܱcñÕ«Û_eÆzŸ}ækkû¯&­S®{ùÙßž€Í—–ed§¦i’6ž_ÔÛ¥*°÷Æ:¡p»¤j¥ê[/›©MMÓ$m¹´ ðq¯_í–ËßfjSSÔñ?_\ü‚j—›üᦶ‰™±­ªöÞä Š‰—•uòöÝ\¯Õg_~|ìÝ5¾øu`qçh§rÌÖem¼ð´Z$·‘K J*aæ/x‚/5É\„%ÞÉŸÌž‹’×ÿÏÁ×# k­á/òiáÛS"¼èKˆ€Ð·Nj¨õõ(AÏ™l–¤!˜`…°ZÇioXþ=x­“üuÁÂJœT‘&}ˆ8µ3Ê,ÒSgO" ”ò"ã^ÐìGIÙqh¶‚ˆsSôG‘Ö4¨D¸*¡W Ü·d`2´Ü·§CYéܶÅONµÇ7a¬Ï'GYŸFbWÆ^âZQÎ8·¦íjjÑvã-=²­ÜŠ'k.mÃÈZKø4?RO‹ø9QÑèR¶*ªid\Aïd%zŽ!†!ù 0@Ã]e,UÜÖñA÷tìr§ "‡y¬å›rôÉcœ[ÍÚhn¤s¾>y-Ô:!QKe[¶·(à‹Ÿyãá\Iàt?ü †Ä3x O2è\Ý /y¶Ž.˰žÈ™ÉØ¡TÈ̦c鬔ý¥¹Ç÷Gßò˜;YñÁånêØ‚9ßsý.ÖÐÐÜ-ôÞFŒE§ããQôénFÀ` kWcT”Ø´©P\EáíÛ†Q£ÒïÞ5ìÚåаa±Z¿û.ù·ß2ÔjÓ®]圜žóŠ¡ýðÃû!!Y]º¸|óM¥’…_iiúÍ›#—,¹Ÿ˜¨õ÷·?q"ÁÛÛª{wO[??»*Ul Ï\yò$;44388åÂ…äðpÍÕ«)îîʪUmãâ´C†”{ï½ ŽŽgcÚ?âø$s}NùËǾøu`dÊogßé]Öò, % ‡_vô³g_,]rcO¹ò·c.Î?ðѳQ¹TQÓ«ñ‡-fñÑSwöÏÿàWÈ”Ó:¯Î5­®DœÌÍ=Ê…£•kŠ:È-N,AíÖËß>Ë”ÏE½ò­G5ŸYèDîÇߘµwä³2= oàGíü S§,<8îfô¹§Ó“Z¸Û—L¾oea³bà‘4”0TÂÌóOïÅž;É~n—Û†"U„%¯Ñ£<÷ÿ䥰ààØ[Ñ^\¾j©:“Ú-ÿ+G4AÇ84"­UO+£M Ñ"Š|  ·â%«•¯Æ оÖÆ àµö`),KÔEîìÆ¥yrŸ´»$œEU•ŒD¬Cî‚öšDô÷ОÁTã%ôë¥b+‘ë&–+i­'DÍJ;Zfs7™Mî¼Á½8ö—Æ?‹¸d±Á1‹Ôë©Cb’HÒ£õÂõ1 öÁY@HB³Ÿ{ÕqB<9Û‰rF^U,º…Ä£° E¿í%tr„ôâ×ciJœVæpÆà§ ¹½ÈÂtrD€²¼ã‚§_D•çšâI%©zz^áYw;++­æ×~*ؘyJ}î5?y{‘BjŒú’Õöø CõÁNÖî2‰ÜÉÚ½uÕÞC}FTv«1ªÅÌÒöÞ2©ÂîlÿúãÚú÷/*6¨Á§>î5R O‡ ¿½ OÝ­Ü,]KÖPÂP 3Áu{©Iö üÈNå(“*Ê9ùÚ«äõ¥¸}+ $6ø™ùçdäOéÓÊA`d6ÇôT“ÒëO8ß„_ ^sSq\)JWÃÕŽ´Hª´âþ*\ü©P„³8ù+ª²”íNüBTUqõGý;ªV¨î"¦ `P¬k)£“X"ÁٚѬbã°Gì5íN‹ Äιâ[žŽ¿²ÈrÍéwœ31ÄT¢R=Ìàwì;ÓPl§Ëá0†QdÁ-¬ÇSU†´÷Êbñ® °YHæN²`1;za|ŒØá¤@PkuT—°Í hEZÆ"B[K¾ÌËCíJD5­ØPñ©k*Ë@3ØÉ¨ïÀ’j,ÑÞ(fßD˜Y›fîl×h¾ƒ KvvAY0¢¿õ&Ÿýާ-ãÞ¢[vÐG‰4øšÊnTtcõPŠúÎïDÒp5¼iQƒéýÌ\¸” šÂÓ/w¾ŸhF@o i?ÔÙÔôeí<3‡E:ö!<’ZþløÑŒ0uªqãFÑÏOؾ]ª4Gz¥Õн{§&%™Ú¶U~ùe±ÝSÃÃuµj=¨QC9t¨Ã!Å2”>ÃÊ•±ãÆ=ðó³š7¯b“&Ï¡*})˜LâÕ«©7n¤:•xçNº‹‹ÅO€–-ÝŽZ·v;|8ÞÍMÙ¹s)¹\R¿¾SãÆ.ÞÞÅð®þÏ#13füÖî ©ÅÊwN=_ú þ÷`M_ü:0:5ìew,e_nf·ŸÿtZX´ªQ\(MUÀ&=+uÜ6rËáåy°xEfÀkn`<âk @\ÐJЏe´8qF)qGGqâé ≸N%Þ›!öoÖï4Ãdb˜BÌÙ$¦!f”1Š?èD¹^lš%þ+z$‰=ÅM7ÄêÅw’ÅËGÅgÄÞ1y§8ü°8-MŒ>.þò­8ú¬øk¼$Ígfˆ{Å‹£Åo¿w‹¢8O<ÝGܼI¼!ŠâLñv ñè1TÅbbuñF/ñžQÕ¢i ˜ì!Æn5¢(>E[Q§uçE“(ŠZQ¬ž)’&ÎÐ>=Í ZQúP”…‰—ò¶ÄåˆÁ"çÅeq¬Æ­ Ñr¿Èñ—˜«4û¦ÈjÑùg1,£Àö8µXå'‘ybï]¢ÑTxm—™ ª&‹§›Yù+á¢õûbíéâôßÌ_š£7DYQè$®=b^àæѦ…H}qÙ6ó±¢Ok±n7qÑjóqOD÷J"vâ·?šÐjÅ€=èÆ7˜—Å r¤ÒX™,öÒ%]q2¢(þòK*ܰµ½žS‚Ø3̘ñ¸Aƒ`—Sׯg¾ˆüŸ†ZmˆˆPߺ•œ’¥ÉÎ.ödß`Éባ6´>²-Ç MU'.=2iðOA»ßý§çõoP÷uâÒô§?1‰Né"i⦼{ÏK=Ùs WóyÍ Œçâµæ¢bs€¨‡¸ú¢SãX ö*žmt¢‘ÔK8ö'㠩ǰƒ¼<š8dõT–èíÀ4*|lMdÚPEŽ›€L‰Ê•¦rl3¸Vž&)Ü çx5QܵÃÊ_ñ:×›S]‰"†¤Hâ{PU…,š´T´ƒ('A¸BJ,Ù=qò@‹þi–ÝQÛÐd"–ƒ‘Hà;L°€%Jج㞠 žŸØc™—ú4Pè®`…7ÀO ÜÉ£îô³aI5š9±è1wò%COô£S’´L½Š:_}›»%Û»`gÁïY\x]?lĨdëùò¡Eej—eÇhBãøákÏZTgÙHD‘;9g.ŸÝ¿"ËÆiåÛ9e¦2/æM"ø?måªòEÜÝøvR)¿æž9ò ¾ûN*“±s§lþM«^=Å'ŸX Ì›WR °o_û=ì4ÓÌ™ Fc±bÏ0eJ¹²e•‰‰ú)SÂbbŠ%ƒøë°´”zyYúùÙ8øúÚzzª”Ê×­–êoDy—ªY9éëÏÍom“±¿t?. tªñÎ?=¯7xƒP ŒÎËf_˜CšH[ý^•;ê ^ÒéÓ§ÿÓsxe¸q,èûõÓâ¨Tƒ{'h0ˆ˜Kè xT â(Õ†’|™ÔÛTèOòa¬k#Ó’~—dïF{ûÉèVbzŒb”Èfd =´ì­SÙm$ÅžöqÊâ¡/£b¹ÇõªtÐcˆà® y †FX=UXÜ!"™Ì·©™AÎi"s04§¬ñÉÉèZàêü,™Y›`ë"ã!rLЋ@$7a'&;„úå$`L‘ÎrxKEˆŽjdÐLPE…QäBw³éâø”ƒ®¶¡j~{‘$†x’Û¸EèX†{éœM "‹eþHxwµ¤®;g¢ÙyŸJö…»è´õ!5›$ ßœ¢Wuì FÙ*¸âéÀÑ6_¢vY*»Su*!‘pø[Îн!ŽEÀHsBËz¹í9ÃÉktk‚m‘@–Oy »rè ïôÀ¢HîPUŒFÖý¹‹ €´ˆiQº´`a!ìÛgŠŠ¢{w‰Ì\mó[o)BBô;wjE‘-,ÌHТ…õÚ­[ÓårI“&Ï º :9ÇÆælÛ–pøpjÿþnJåÿÀÛο•ÝkÚ(íSÔñZC¶\*¯àê?¸á„š^Ÿ¿ç¼Áÿ#T2`—žïuT—ò£ {ôÆ4Ãsúµ_,Ç:((>5DX3_gãðZßÓýšDÝÅÃ+GÂC$„À±&@øy”ŽdE +ƒh"r56MRŽ#+‡1‰œl Œç¥Æò ˜Ø£¤6ˆZ~µ§.·¥´5‘jB]ð1Ýg¿ Þ䤶xèÑ_âR|Ká¤&'‚øVTà8Qw¢´ á$ñÉl–ÇÉØD’ïbü„: £Œ@ÌÀ˜›Jý‰ e¬Ö³A ˜`OK%óÒÎsˆ|VšR v¥òE¾7_V¢²w³˜Ïod#gVm”R¾¿Çâ;V±eY>­K5g†üÎé‚iÜR sÛ“­#&þ?“Q¤{H#†7Á`bØj®™ë3¥7ª’”Aï9$!:ð÷÷ߟîMÉÒ0l:sY““Fà[‡ŒŸmfÿž¥¾Æ‚eæ>úHÒ©“dÏÓìÙæ‰•JaÂë€ù/¿hoÜ(6uÓÙY6~¼‹DBPP|p°¹Ž?aa!Y° ’¯¯UJŠ~ôèûYYoˆùþhUµ××Ý^9ääƒOLîð}2þé½Á 9Óš3}¾»ä;ù°ÕÈ]U§î½ââš3º¢%?¹/̉"db¢›œ²€µ˜Î =yã¨þçñZ{°$’   é1ŠØÙu“FC0ZáàJüª¿‡1Mn蓱oDú"nãSÐcûb¦Häm@- †@­œº&Ôâh£'=»•šAt"wýé–MV6jSUê$“œAFuüõžúˆø–TÏFŸ!–Œ¦”5!j1Ý'£îî(bÐ'£öå‘§#ªbh‡²B<¨á"bo$*•@¢È&=CX ”‘ñЀZäçL†Ù"PZs7›=©T³¤Š @.¡…3·28œDi5òüÌÎJ*Ú­aÝCü¨’¸»¶aiK®Ð¹".ùH‚åRºúq1ŠètŽ>¤_M qR6«BRKŽÐ½6Ž=;Îõ~Hbûƒéß ©¤°À[59q•ÛˆŒ§}ÃÂY&¥EB˜ŠÑDíj…,Ôâq8[vк9¥= Èå”-+„†Š¿þjjÖLR¦Œ™|ø2e¤‘‘Æ'OŒ;vä fYÔ–‹ò僘“#®_Ÿú Ås¨qT*I§NΗ/g^¹’yð`JïÞnrù¿”Òó Þà_aèΠ]w§wõ}¾èÿ ®„§µœwzÍéˆ;1IY:½QLÊÔ…ÄfåRtÊN¥ì‹m!ÿ'04›,‘–2æ( ±7Æ:ƒfÌyá'{PPLýg•oû(ßû­üăƒW_KyþžÿA\ Ok>÷Ôƒxó÷‡ñYÍ瞺aŽWæOaŸmzÂEf)Ÿ&uŒÃ”N/Ü_(ÞôÊy%x­=X4ýXÚááƒ. TE¬œpö!ù "Tì‚Ü …¦'X¸ãÒœˆzÚ#j0å ª –V¢L!à$ÅÍ€A‚£* V Wâk"GOFY:Æs_Z«É0a0"–£ÊcëÑûQMDÈ&'¬TI!H!»žqdÇ¢CÛת¨’!_,Ë¢ˆÇŽñ1†N(íd‘È ¡ŒMzTÎ*K ÔQ²SVÄG— К‹YXHÑÐÑñéÏß–KiÄë8—B'w¬ò\2܈R#ØA/¬òr’Î9…µœýaôòA–Ï8·WÑ¢"KÏ`!%"¦å \‰@§š¸……ŒÃ!ôªƒ¬ ÈFE?foÃZEV6•Ÿn?s挗—àá„—'®¡ÑâW·"Lþ><ŠD«ãÜUz·7“kÕ¤!ÃÈTó ŒÖæ(“5’lß.ººMóæfîPr¹P½º|ïÞœŒ 1 @îînÞ‹%• [=x ‹‰ÑëõbíÚE¸V‹ÀÑQÞ©“óöí ¶¶²Ó§SÛµs–ÉÞø±Þàu@Ю?Œ&1M£¿•¾út¸L"4ñqþ»ôÿ„ôÑ”^Cvg“í÷Fú xXÊHå­XþÁ2œÊ³ñ£¬)W…Onñ{§üéc‰÷^~°Æ~ A?óó#5£Y ¦±^CÎXº9á0ŸÓ"Œ N)ìßáB"Ú)TkÛb7Ô‡¹”ÑÃÛ$ÞÃ0ÛQXå@W G§"ù)°<‡…:ÊHøÕG (…YxÉØåŽµ AO«»ÜÒ0« Ÿçµ¯Õ™h{‘ãÉ´vá÷@¤y?ù,=s2ž&înó4>‰êoâQ}ªðK§Â/JîÑq &‘µ½\¤ÇCl gQÁ7[6Ž,Ivž£ç¤Ѳ†™ë9m%s6àåÆå5Ø!¥ÊÌ¢Nwî?âÓa,øÜÌî×o؃C¿Òª™‹Å!CŒ «VIëÖ5üôÓÌe˲ºwW®[goaQì]òçŸS ˆR*…óç+Ö¬ù| ¸};ë½÷î]¸Þ²¥Ã®]Õ­¬Þ¤P¼ÁÂЀ¸¦;œ¥ Ë\v$lË¥hàÀ§Úø=í~}ùqêäíw.„¥˜D±Ž·ÃŒnUó›_ßsµZìÙ3õüyý¤IVŸ^,õ(ðþû1?üܳ§ÝêÕell^(玺uëkIIú޽ݾý¶²½ýKõk}ƒ7ø×¡”‹q¿Ü\|èaûêîûÆ5nD¥7˜y"[÷GDI!“œþ¼i`yàÀ­øvßœ}6TÊ^Ÿ‘c4‰¦ÕÝ¡€þ#! o/8óì&›øV®R²’â0ý·»ù=pÿÿ˜ÖÅ·8çÜcµ²¸eM @ÆÅ˜üN “ð'ˆFÿE–Pä’äW9nܸÇ­[·^¼xq™2eþâ,_^ë¬ÀÖQ³=š ÞÅÅ›s¨9€Ì'D…àìGèJu áî*¼†“‚:K?’6"õÔMÚBdÑ_F;[§MÌRÒUÇåLØÓJOb?xÒUŽM$Ûìp)C½xî„q<t—ØW†25¨IäyÎ7£†?åB‰¼GTª–ÆöawHx÷z8Ÿ'i71vHÛ`—ˆa.±ĦX Áê2ºEd>Gzq4F$𽊲ææ°ß XíBi)_§±;/_ª­=³½ɦßCRòÈ®<•l®MK> ao¾”¡R–ìn‰§% ïî¢ãçÌήXË™‰uë Q ˜×u]Öq«Èëœ_ivŒÆRÁ”¬:mæŠ}5Oºq5Œ®3É*âkW*Ø9‡Z>|»9ÌìXƒy“8y‰AŸoîÍsÒÇôëÁîß™4ÍÌ($mß^²e‹iæLó VVÂŒ6¶¶ÂÔ©™§NéÌÊäbñâR½zÙíØ‘þÕW/”ŒT«fuêT@Û¶Nׯg¶n}=*êE;ã¾Áü‡0¶uEàÒ£§™X3w‡fëŒÝJÅ.jŸ°´C¯º¥uÓÜý÷rG— ºÔòˆ[Ü>ú›v~žvF“fz3,øý(²ë£Ú•]S_Yz$ìe•üW`‚ïTO­«ˆ³0¹"¬D*íŸáÁÒ½šÏŸD!ºÎgÛ³²²Z´hQ»v툈ˆˆˆˆÚµk·lÙR£Ñ” êŸÅkm`=ûõ<|€hâÚ1ü;Pª*‰ RBöRª@ÜMö¤ÞDY z=vm’aQSÙ H\0…H `'¬¤”€­žëÈä¸ëˆËá–#"Æ(¶—£ p=eñ±Á!ƒ¤D FoÜRÉÚË%Kä ñvpG‚ЉRH®’ªÆÐ‡Ò(ÂÉÙJ 0˦Xl&;=0‰+œAÜ„ ¨ á=9ÀØl2D€ª FÛ¼ŸD\ž©0΃ºÖ¤ø*æŸ`s'zx`rù²×k91½6>v|pž#±Öµ…Óá¤bø…^õñM©Uš -=7W„y¡UU¦vøz§ï•L닳 ·#ó7nÞ*$à寗ï"‘pðgo˜¹æïõá­:$$3v†™F‡R)Ó>£ZNŸç¸9 O¥â³Ï$ s昊£­SG>t¨ÊdbäÈôŒŒbïeJ¥0c†û[oY-X¸vmjqb…P±¢jÅ {{YppFëÖ×oÝ*)¡þ Þ࿈ÜJºôì§ïyÁá©ÀüÞþöJ‹9½ü€k‘O«lnD¥ úú»Û)K;¨– 0—=À¥Ç)@—¥ç•ïýÖmÙàÆË+ù¯@ýäj˜‹Q„wø ËQx©×³W‘€õ÷×ë¬\¹²~ýúS¦Lqppppp˜2eJ``àO?¼J±ª IDATýô·èïÂkm`å¢n+î]§ù¼ª‘¦ÆÆ…ÛG|² Ð+ñjAø1*Ä%èSxôB!)] Òc= ec2Vb1i}rVHøT ®ÈwÖŒ–SKÍ® ·¤fë½ècOÍxŽ;ã]†dᜪK{*ÜàdiJ˜FZ0ÁM©^²©d^ça*×Â#šŒ«ÄÖǹ·)C˜€G¬~$>C9d Qø!ŸHšìá¤m~”ÀX zÉ1Áܼ"¸1v ´Æ]FPÊÓÿt¹À/•hnˆDæç³™&Tà2x[Ò5˜Ì|Lî½ËÑÍ‹†.t?ÆÍ‚u?ƒ«1°*JÓý7.ôT «{Ó¡ r ÖQ¤(oØ[Ì莗]—q¿ˆ—Ë֒ߦÒÔ]Øp©ráah×€Ù`0ÑoIEÛ‚Àšy´lÈá³,]gæßÁ§ï ÀÑžÁ#I5çoÜXøüsi­ZÂÂ…&µÚŒ0uªM×®JNœ1£HUdþcùXŒéÔ¼¹ÕD_¸ð¢¯Yžž{öÔhÖÌÁÆFÖ¸ñÕ½{_4 ä Þà?ð$ àdý4“ª<Ÿ¦*–vP1©OK£3s/ǧÜ0å]‹¥ðÍÈ6Úò,åüÅ•üWàš÷èþãˆd<à.úÉ\^G¬={ö <8ÿ–Áƒïڵ럚Ïsñ?``9¹“ò„Ì"nqz;‚@j FOsõ}°ñ$3ƒ”Dü†µšÇDmBêˆ>žôûÐÝEï„é6†ƒRc€È-»•Ô3pWË!k*è‰ÑpÛD¬+=iQì,Cý,âïñ{yjXb›NÂ.W£Z )ç8g@ïwê=\´@R÷ ´G3!¶¥T,ÙÛˆŒGÛ[ÒÔ<ʆ‘X¥b Åðj ' œCœˆB’2fçpÐ À|g$&~È`qž%á¥`„©¦Dq:Ï6`Y5rLh |‚)ŸSfZ-ÊX“©§ÓžäΜÖo;Ôz:î ¶ ŸE)c]_ &¬äô\‡®ð}Ép´"EMÇ%¤1b*•bJ2³¹øÀb³¹»ŸôC€¨x…©ÈkR)W>DZûŽs3ÔÜJ‰Žeôx3£ÀÔ©aófÓäÉæ…r9³fÙx{Ë-Rÿö[IoŠýûÛW¯®ÒjÅnÝÂcb^´¿¼ƒƒìÀ>>–Ö;ßœ>ý±ÉôúæJ¾Áÿ¾ü5h\éi~¨ƒ•ˆHzúž¤,å¹_­@tž½–P¬O×ÞR¤¯è$®éžûQÿÐåe•üW›žyq¦XÄÈÁ“ÈÈD¿Œ¾WÕ‹ðÏÁÝÝ].—{xx 0 4ô›ø;wjÔ(à}¬^½zHHÈŸ>ЫÆkE µ£R b£ño"nþdgF…fˆ"rw ZB¨2†ô;¨µXWEj‰]{´¡dÇã=ÔÛQÄö]ŒWÑï–Hû‹Ü‡=–ôÕsWËv'ep0ßË2PMdáUéëEƒ2£8ï:‰÷¹Ú‘‘©¨G™Ëh|šÛ–Xó 5•BIÈ@’ðæx7Ç-í/D|ŒÏD~ôhê¹sé6Tus3—xÿoð_€Fg Ëœ»ÿþÖKÑ‚À¸6s··®æºé|Ô¤m·|§–Á(NÜzhšW=çWÚöIºvâÖÛ+Õ4˜Ä1ÍeP×ÛáÀ­ø9ûîOí\Ųà åÅ•äG³*Îð¢/SEèPÎþ…'P,40cU„u€µhdPYÜ‹h/€"üËÃÇ/¶ûbXüÒÇ,;w?~|ݺu“’’¶oßÞ´iÓƒÖ¬YHMMut,@Òãää”’òï¥U{­«o\jÖœð/KV&MÛrpÞÕQfNǸ°Ï:Ø‹Ä_¡ù×Üš‚ž€ ›Eé(“0fáÒõ$dep‡¶ ‚³h³É ´ð€=‰tRÎõ#Å¥4ã#8Ço†€×E–ÛàÞ–ù¿0+ÄV ²Æó'~’#ËØ;Ĭçp%‹Þü6Ue3ãl]¿Æ`æ­ÞÌï[u~Ò èøuÜô`éä&ð¥oøê7< ÿ §ªÒ½'é?ƒ.͘ÿ ÝZT•–iý(—bxi‹jJiÿaϽLŸü¸¸zwàÝw¥7ß´Õ­+œ?¯Ô×T/(Ë œ·c‡©_?Íή·H˜MMµŒ•VòÔS.?ýtw5/ÇŽŽY·®6.Îøí·õ‡ «¹lû¿…èèÒâb[«VÕI>ÄC\¯"¬zPàãÇš¼ÒÿeSL–¡é›û+VÚ«'ßêêçl<“6bñ‰?E~.våÑÃòÊÁŠU„{¢2û}z£TP«R jæýë”v·UrO`¶J_ßs;ßX°§>ê½Þ·à†¸s¼‚mRS„ßQj Ût Žc^Žk_A{—U„ ÿùxjBÿÜÀøæ›o¶lÙ²k×.@­V—””¨T7œs‹E¯×›nFý߯"lÖ@kOƒd%““fM‡ ¶ÇP†½¦bú£Ô’u¯Î(uÈÎ P|§NPx§iXS1G=A#˜ÏŠ<v"aöŒ—)4³Ó‰~F.å³Ý‹ž p¡­ð¶aK#¢5ýEÄ8"}ði@%ʳœmMH ‚s('ºµëá.# Ö»‘ÔV!î$ ˜Œ—ª<¬»ÈæáÐõ ÌG0S[#” (`©z36v\G}àJc5Y6>½(T ¬A'r¨O+$cõrgAC$™E \ª\ä¡ek/œÕœÊæÝs•î±^Å–aøè¸Í««:…[ø²n,J‘ÍQ¬:[u~|Ù<•Ó‰½Æç»k˜ÀŽwh@N¯­ÀV-ا ^äÈ9>[KFnU©–UŸ¡Qsø»kÊgŸ<ŽÉã8Æ»×Ìš%¶l)ÉŸ~Zs PX²ÄÙÃCŒŽ¶-]z«æƒ~~ªE‹|u:ñȑ҅ ï.§ªsg§ˆˆ6¾¾š¬,ó¼yñ'^ÎͽÓPã}EV–yÖ¬˜_¼’žþ7}»=Äß ¢ x:j†·ò=2§ÛŸÖì©?4«kφöj…N£ìÓØóÈœnåÖ0¼•ïG…z;iµ*E§·MS«qÃ\GßP¯Ÿ_hÛÈ×Q¥]uê1íý¿Ðân•ü¿¡VŠ?¿ÐÖA{« ƒVùó mï‰uU1à…ð ȰÃY,Ï¢ëÃMÒÿ/bøðáÇŽ+ßwqq©â¯ÊÍÍ­âÓú{A~ È!¢<´•<¼®ÜùÛ—å ¾ò§cäi^ò$QÞ4M~ùçqò÷òGÈç?•—*å åóÏÈۯ̑Ï7‘ÃsWÈqŽr¬F6í” ´r¡›MÚe–uf¹¶Y>‘.fÈ Ìrò%¹÷y¹Y™s^~s¿Ü3IÞ ÿ¾N½S~E’­åÏËS®È'2åÌOäO–ËË‹åâ‹r¿ä¯çÈ?™dó59g¼¼~¼¼>_.5ÈÖ×åó½äýåLY–÷É­ä =ä‹E²U–åU²¡–œÖAÎ,“%Y–ÏËÒ@Ù¢—Í'e©ü¯þÁ,·+–›ËÏ™äv)21òFÛs¨Hv —Å0yW~¥›6ó²Üå¸Üà œmªt|šì½V¶[.¯Ž­zŸÏdÈ ~”þ ¿{¼†YXyZv|KVÏ–U»P–åíçe—)²8IÞx¦iZ®Üy¦Üó5ùõ5H­6yâÛ2íåÞSe›­†¾Y-+ëɽÆÉÙy5H32åfdœäï—Õ •e92RêÛ×âæfÞ»Wªù YÞºÕØ½{Ž¿æ… –›SŽmÛŠœ£Dñüöí…·>³:$I^´(¹~ý°¶mý¼Ž._ž.ÝtD÷yy–7ÞˆÕëÁþÞ½ÏFFnÍC<Ľ@l–‰ìžÝü_WR#NÇç‡ÌÚÍÄ Õ·Y»OÇçß^Å!^–4²ùKù·Þ:¹ÔGNë)gåÈ6¹ü߀˜û³Ý#==]§Ó•ï÷èÑc÷îÝ¥»wïîÙ³çþ-÷ ´«N®D¡Q;€´ ò2ÛB›Q¶¡ÔŠ ¹‘€~i±÷¦à2ÚÆI?á: {v½MN¢hŽœ+šCº‚K*ZHšÙéHOsXãK …Mµhi‡K!)éœkDà<‡=ð¨KÝxâs¼þxQz„¨`Üšámº…+:q—aqF¤ž85Å>ë*²ÇÑÕC•€í;J€¦ÍLð ¶râ‘I*ôçl̾îUi¦fŒà¥’¯§œws`º<O|ÄÜz”Z¹b`Z¶ ®ž>|ЊºL>ÆÑÊÔN-½ø¢'i%¼qŒŸ«1ómųm1Û»–èìªÒM™=IfÖ¯\H®*õqåýñ¹È¿²;¢ªT!òÁ‹x¹²/œÏÖÖ0ùÏ>ÁÄ‘cæ‡5H½<™3`Î|’Sk8!4TèÞ]ÌÍeêT[ÁM¨øÖ(’“mS§šL·ò‡ä0k–GÇŽºÉ“SÏŸ¿;Ž+AॗjmÝÚ´V-mf¦y„KO=uùÌ™[Õ0Þdd˜çÍ‹¯WïøŠƒmð`÷Ï? ýŸ¯Ézˆ¿-†/>á>uû×âÊ̶´cy†V3ÿj÷_É UçÈw{ÿ8©å¨6~ }ìÕŠ>µ­õÓäVQïö¾ÃÔ«;š!<äbû€bàônˆÿ/vëýÙî~ùå—N:•ï4hÅŠ¥+V¬2dÈ=ù¢û@/¿BQ>¼<‰:AßÇ)̯!¥ĆÑñITj\ I:H«i˜ò0æãÝc2ÎÝQØ0ÇkRe{q™‡”Œí yK&I抹V’Ìvež‘¸Nøñ‚‰¼RRÕ8»Ð¬Œ¼®¶al>™9¤èqj@ól²£‰nB“ÚxgQxøN4 Â=ÒdŠàÞ÷dÊR(3!µÀ¥v™XPÔ w”¡(“°mÂØ­bGÄKpÙ=è¡$ÊÆnž-mµ$Yɰ±³”ñ4ÆéìH’¥ÈŽ|†»Qž~­èïÉ%ûrÉ1ÓßóÆýlîFZ%V¾¹Â°Ü*¸¢ƒœqÑRlæËÚûTùMÒ;„øûlûöíK–,Qרvão€Úƒuú$À杻¹ÄÁ(”æbÈLàØf¬&òÓ°iˆ9DøJ\ëáBq!…—I݃¾%eÉ$þ€¦.ÖBòŽ‚„-ƒÒ,ä¤+‚E†™«*Š ÔFªÄ®6 9¬t§“™¼d~  £GÅœ ‘ÃIv¸à⌳ó!ã«AY‚qçüptÅ>ž¼Õ\†Q+Ó:3(«ªl¬sI‘ êz(-ÈK0H …#æÃ'H§‘ç4”ȼl$Z‚rÖ7L2aF¾üƒ~>$ÓÂÞBž»qçjÛñV‰oY^Ù«ôv |ìÈ51x¹•sožkF{_,oãRåÂQ໸ëpÒ2teÕ’ˆÞ½šøF,æÏl×?Cï3Åו‚Æ~Jqµd§ÞmèÓ†}ጟ_3Vm_ž{‚’2^~‡k 5<&o¿Fý6laÑw5H Þ_,(W¯–Ö­«yq¨× óçë‹‹åÅ‹K6n¼kêóÏ}]]•©©–âsrîz‘'Œï}æLëœt:ž}y“&]îßÿÜž=¹÷ƒÊ!/ϲlYz»v§;t8½tizË–#Gz.ZTïÛotèpïñU0g`ýEc›…ú9Ú«z²k}÷mÓ:iQcÕÛýUò·‚=Bc`/¦+Xµ/£Ò±,&È»G¤¿¯¿þúš5kBCCííí»téråÊ•cÇŽµlÙ²\êààpàÀððð€€€€€€Ó§Oïß¿_§ûûzÐè*Âì,ÁÓKîß…:n”–T—äó88£2 Pи a8y¡ÈChÔ›Äm¨õ·#;϶”îGíŽÿH²¿@éL­É/Bá†ë#˜×"Hö]%Ö‚·…Q%,q²çdÞRãåËüh¾2SàËÀL)„©qèÌ+ù\DYŸ6¾4Zà š! )E^Í~=öãé-¢œÇ~=šQ4n‚÷‡\Τ¬6ºéÔ/Áö$1®(‡àú(.ägÉ/C†Ýxì×°B®ËQ–sö)%^"PÁr»?Ö2Ǽ™G¶Üè½Ìðj=/SGÓî¼èuãþ­NåÛD -,hÈ€ ~¬2Ý~ÃA… °£7š ^&üF‰«¹ì}ŒÚ•½MÅtüŠ 7œµ¬[µßsF!Þ#À@÷Š FF¼RZÅÆ9U]M’DŸiX­8;°yA ލ1Ó‰IÀ×›õ‹QVsíÜËÔ™èu¬üž&ª=HðÝwÒ¢E’Ë—+|}k^‰~ùeÉwß• ‚°u«Kݺ·rMÙºu‹sqQ8;+V¬ð×ëÿŸëœ¬,ó'Ÿ$çXD¯²Ó8“ÎùfôLãÚ)vèÑÕ¡N )9€§/nѤl%ÌMwêF“³’sòÓÔÕ î%#‚|Šð:CÉç¤`Ó#ŒÃþ$æ÷(JÃÌG¡„ÍÈsùÃô½=f™µfæ]÷ªtÔÒמH3ã²H¹¾Â©oÇÂ:/fF"'+T?éGow"‹yòl¥.:v ¶ôâZûÓ˜t¬Rå KúQl&:ŸA)¬ìâòv`Ç$N§°>’™;ªN—·¦O|_î­*ÕkùêŽ_fsW+ýE–½AT[òå/5< _¿‡GOñö¢¤úЫ磘øæš:h=û¬*ìÛ'Ošd»ÙcêT]ãÆª‹-£Få·z­8:*vï4™¤M› ‡ K¸uæÖ-àé©þè£àÍ››¼ýv ¿¿xÿý„-Nõí{nêÔèõë³²³ï¢Xn®eë֜ٳc 8ïí}lüøK©©F›Mö÷×ΜY'9¹Ó‡=´®lŠÇXjöÂþ!ý;áo8$À´a^Ùǃþ¸VsÙçÃMkgß/šCÑ,ŽO¡öR¸“‚Kܪ¢ù&ø{>0x  ¬rh4äS+;íA¥¦Ä†VGq͇áàA©„Ö SA¢Ö“} Ÿîhݱ8¢°Ç”¶¦$ŠŽ { Ó9Jw£yÛ,›FËDÉlÐÐÛF²‰®<* (%Ê“ÎZ¼eäNÕg°»d‚iî¿Õ5Nw¥«~,d ¦½ Eù)d ž':+ÒI’ÝÑ4ÅäßH³!÷ù=z%¬#€vZÂb € ¢PBr2 ‡/ìPÀ!+G¯›S¯:3À³ÌkyX¯ÿF¹ò/oÚØóAéâwoÕc˜7e6f_¦ Âq{¶÷ÆQED.oW&nÐ(Ø8”Fn¤3ý ÖÊQµ†žlZÁX–œª:W-XýG¢Yš}Õèyƒ}X1A`Û)^¨*õ÷âÇ×Ev†q¦»³³ž£ÐÀ0ŽWK–>} @ò Xô} RA`áB…»;IIüðCÍBA`ɧ  Ev¶ôöÛ7i²sžžÊ+jûø¨._6½ðBŠÕúÿ¹¸(Ÿ}ÖïÚµöo¿]÷…ü¼¼ÔV«¼xqʨQQcÆ\ò÷ÿ½_¿s¯½;{vììÙ±Ÿ|’4o^ü¼yñ_}•òÃiï½—0gNlß¾çêÔ9>bDäС,H,+³©ÕB¿~®/¾X+%¥ÓÎ͆ qÓhþ=Êí‰?¶ Ú’iuߌ·Åœ¸ý•ÿ%üÏ ø?‡iÃ<ó†ùÖ »Ë>}”²¢²…#­ÛÌÛÜskÆkXí>ÅY„Bl»(P ¼Œ÷í/~ˆ¿tˆAûw!ì(“'²ez’v†R§rv ZséW$‰Gžçø´OÁa éû)ÿÆ1ˆúýIXLà¿O`8EðR ¯aKÇw–QÈ…8ün‡Až‚“9L±ïÆ/él*dŸ7/I\bŽÀV,ÞÃkŤueŽå¾õ!xSÂ8±Ÿýu©;Žq; ßÁ©ø¿Ä0’¿ád(ž/ÓI@x…³)|‰zèq‘–Ô»,¤¡ä&býç!ØŸa›Œpey ðSÿ6 rN³cc`gMÌwaŽË÷Ê*31–Õ9tvà@#T×—…+Ož%¡Œ?·DYa¹¸?¾êÀ˜º•î|RÃ6£QГ¯úT—ŸÏ3ágdØ5™žÁU¥ŸîæßëpÓ³ÿåâfu«f¡~º‰ÿD³@v¿Wµ¢œù?2ïBü‰XŽÞ®ªô£%ÌZ@pç¶£«&=~’g¦¡ÕðÍg´mUU ìØ! fS©ˆˆPÖ¯_óºùÜ9K¿~¹YYòºuÎ=Ví;*#2ÒøÄ‰))Öqã\¾øÂG¡¸kq›M>}ºhÿþü°°"£Ñºo_н»Ë¡Cù@·n.‡çÍ›;œ;W téâ|ôh0h»Ù,µmëØ³§K»vŽöö`/³ÿuÔì­ͨwÔ¾~¯ô;,/CUƒ«òéš»ø—ñ øn†t_Qn]ýùQpô‹nN«ÏÒŒ®©žùî!ÁhraþçÑØóHÙJþ0\^§–B¸‹ÿì‚ @M‹Î{€–¶q[<ø–4óeá»…tïElfæÈfF<Çáïpp£÷PÒ/Ѱ'?F­£ûD"ÑtE0$Ðù+®NAíN“×HœcO<›R¸ÇgÐK˜D3ݦµI|#òl!Å,Ð0@Íóq<­Â+˜ áYD—ìÞTµÁN9&L°­^-M˜ ~÷By“´Š¯¿.]¾¼,'Ƕm›k£F·É½8uªtêÔ´S§J§Owÿè#¥ò^Æ;$IŽ7FE•[SSM€^¯Èζf³”™iööÖÔ¯oïWÏ>0P{O,¼‡¸¨hFn©Ý IDATOȆ\)íŠy÷"kØ:Ànö.eÓ~å§ÙbÃMë^“bN Kb`kÍcï(t­®¡ú‘ò}ÝçŒ+§ÛbN:õÀWǪ̂ñZëÉ_Í[?”Ò®Î>êáo©ºTkYu/ Xö}kÞ¶@*HW4×<õUÙýdC®Ãr#*ÍéJnv·m—Y/ºý¬üyþåC¶K‡o}Ž¢^'E“Þw¨PÙ°»¢Q÷E¹HMÉ|ûOp!‚Ò§‰UÂ/Ô«ƒF¸kë>ùÛ?ØÆmñ XÒîÝŠþý-¡•!~„㩱ßCëŽä_#-‘þ ßAïÑ$ýNa:]‡‘z– Îä#û=Þ$v)öµð s Á¯b9Dáaê/¥dÆ3øoÇôR¤ìpØ&Ì9+r²yfN¸±9“ Eñ`¢¯$6ˆ¨[ðùI¾ÎçZsž²awŠ Ç2ï,çNsZ…êiž>BÔQ"Ýq~ŽWÉ]ÃùDò?a€ºÏ¸|œÜxN¡^)Òë$…a˜†ÏhÜd˜Aá~LÝP/Â8ü¶ýÈ[QöE®I¼jd»…¥öŒ»^º»¸eÅ\³p¦Áמ4ðf2‹ø©.ã*4e9žÏÜ«ìÏáËP^ªSé>¿Á–$RJù} *–mŒfQ‡“Y3˜'Tž™§å`,öj޽ˆKe_OQ$&‹:îlžZ->Ÿg³'‚Ù#™ÿdÕy¿’È´ÏÙβ7Û¿ª4ò*¯FB2ïý›Á=«JFÆ>ËþÃŒ}œEU•……L™bÛ¸Qš1C|÷Ý›úx¦N-Ú¹Ó¤Pîîèx«åĉҷÞÊ8p äÑG×®­­R=´r¢fÔè°1­œnÞ¹PÙü»™;)ñ|Éܘ+$â(Õös*‚ÚÖ¨¡º%zI™±ž`7c“²õ£UδEí+ý ï‚`ÿúêÖÀ>`ëù]e ü)\|åÂL$›Ãj A¸Ã!ÝZÉÍîvwÔ_õˆ¹šójÅcCч8ÖAiBÉ5Â0\ÆáaCV âCëï€9¯BìÙ£.Ê.î4iF¾”ü†ÍFA …Y„ý†ÕL~*¢ ¿¾ÏæèkQ”OI2Q8¶ÀœMü"t-‘JÈX…¹”¢.ÈÅ‚y›€”Â2eL9ÑßJ~>›<é¤ÅÓBQg¸é»cÁ½^ˆŽ¶>õTÁmß0íÛÛ¿û®·££xèPÉ”)iÿïœ÷‡øgBÕ`‹ý#¥Ñ´ù]ÌeÊ6Ãô_§é¿ÍR¶…ÕlÞºàΊ^AúÅÉúo³”í,û¾­~Žyû'ȲÝ+[–íflB–Í»¿¼¶ì^([ Õ®_œ¢ðE²Õ £[ éΕü¡/š:(oÈLÂ$¸H"Èÿ/ï!l • ºu“ŠÊEbbé6€Ö¨ßŽ]IH I7œ½©ß›z]H¸LH_Ü‚Pº£u"ù(_Á±™Wqï…]0£kƒlÄnš¶ÃPMAÑË‘Ú@„Ž1jšÉ˜ìpsåQn…ìt£­÷d¶ÑÝz Ô)œêÀPOj'pÁб;ÝkQë W”(Zˆ×a"˜Ÿ¤Ymœr)‹$3]ëãð-16ä.8öù!v?’ ÔA1 ‡¦¨Þ¥¨ ˜Ø ¡¼p½¢p’šq*š‰Œ-¹aNýäAS z‘ù~Œã<èåD3{&ÄUbxÒyõéçÁøóœ¯`{‰kºÓÁƒöRR™~ezkf·£¹'Olãjer,½š_Æ’W‚ÉÊsªÎ^°ëž'ȃeGÙv®ª´wsÞGh>ÙLR5vøÉƒ™ö’Äøw°T£ƒye2ƒ{Ò0˜I³kèBؼ óçЮ5ßþHnMmÚ»vÞzKѺµð ¶ÌÌNìí…Í›]‚‚” ¶… o“ð´mk¿Ýà`UddÙ€ñEE5w?|ˆ‡¨ÑÅKÿ`·“âNš1 Î>‚£GyÒ”P­èÍ¡yê+Áµ–àè¡yâÀ–Yýœró¨ìÓ¡Å´eŸ ¤Ä;-õ¿«Û’Κ±ŸÎÞ‚«ŸfBMeÀ·Ò+ù_a":à*eW0£™O-BÆò&¶6îŠÑÝr¶:h ùÄ iÓVÌÂOâèÉ„Ÿ&þ§öâÛˆKG‰½JêEÎnÆ·ñG¹¸ÉFÊ1$-™‡‰þ·žä$éœûP°—œ]hša¹JéeÄ`äDÁ|F ¹DlPÒÆÄ~_9е„3™üäCŸ22ò9Ë©:tÉ%úë|¨c‡CÉgØÛŒfŽ8Fu†3­!™ì}œuÅ®µcÈ=@œŒ<–À Œ‘l!˜‰ ~!g'ÀÓèÔÑX¿Àˆð-Š³È›~¾þKûÊŽl™³]/Þ׋¬ò"_bA>ßU°™Þ÷ÇCE¼‘QÑ”Uø¾‚«šÔ2"µ‚³ÊNÁæ^$—žÃØÃT!¼|· v*’ЏìÒJ"g~Ï™–žæ“jÙ vùÇžéε,æ¬çjFUé¬tmÌï—xlæjVÔܧ¹–Ìñ ¼Y­*Pøö¢®òÛ!¾ÿ¹ª˜9:µÙ´ƒjÊÓ^]´³#:Zž?ÿ¦¬ uê(-rtv_}µè¶ì£@‹v?þèŸ`>xÐЫW\zúÿ$OàCüõ²ÁÁíy©€èZ«ü£èâHù5µ‚l5y/& áSÖ"'!?ÛÓRÁ ¯¯.š¨˜ãŒë „_÷W)V¢¥ÀÊ´Ä|&,iJWWJ%f\¤¬Â/ÈSËŽ>¸jˆ-fNå’…Àª´ñÆ`fÚÁDíåhåÇÊш»£ù­2½BçÎgögjo &f¯§¸²•"̃ …Þ©ÖˆÐÅ5o£Tp"ŠÕˆ¾^|ý6vZ¶ìãj\U©(òÁ\HLâçõÕŸ) V®Tôë'œ:%/Yrӕ‚þý5²Ì÷ß—ž?ûõ\ãÆÚ°°àÕ*?ñDRdäÝõ+|ˆ&Lëßõ;—t.€”“XþQÊIøó € rÁ–‡T“wJÊŽÿc'7 =«Ÿ#Ø;ú ÖÈå›~éí=µÿ zW@Êû#Ø/eÅrÜbHw®äåI³«È±BmÔ“ñ‘U€ÅáÎ:ä<Ä_€ÙÀ²^¹-9:Ú¶}7nnlÙ@Ǿœ?E|Éר´„>OQZ„YM^ û¿¢ùX’N’JÇ¥Õxö¦(š‹ŸSû9òO‘ò .Ã(:Ha4ê&”lÅ”ØË&Á’#ÐAâ7ÝvŒ6qÒÀb/^4“É7>ôVá”ɾxÃgy9†ªÒÇáù1ì<ÌØWj#Ö©Íw 9Á ¯ÔÜÚß_xé%ñìYùå—mQQ7ÍšzõUÝôéºÝ»MÆåçæÞÞi_§ŽúÈ‘ F´GŽ:uŠÙ±£ê¢ü!¢²©ÔQöåãÖ°u‚zÀôòãÊ&}ÓÚYrQ¶\nZ3P4ìV.œ½Óú¹ri”~ÕøãóÕ5›VÎ 2䢬rê&Ej5À j˜·~(›J«Kïá€ÅZ¡€iÍL¹(KÎO3-›z3ý·Ò+©eÃîêsï|»“ò@ÅÝèT6ì~ UW1.&#Ó»øk‹°l$ù*E/QïNþº‡ø ð WZ¯\Q5l˜áááæé)gg+õ6¬fØHŽoÂ^O÷œØÅ“ÓØý^uèÐÌk4éÍïï¡ÖÓc2§?#t"æsä£Ó×\›†¨¦õ2bG¡ ¤îdOFÛ§({EI?ÝÆ&ðs6=EìÝÙË4#1µx¯s4_¹ÐªïŸà«4N·åEG‚×ò®ÕãÌ,Âô?éÑ?Ïó¥XÖp0Ã3<â‹Û;¼DÖp?Fh*e_på*ÅÒ¬!N ˜F- |O`st #7óóèÞÂÈVX2à Ï_·§G”²ÑÂkíÿXì˜eº¥‘k£·–/=n]í)ä‘+¨Ö…0Ä寽½b ëqrÌ|ÔUºíëâ™r‹Äúô©ÜzùB6WSfeQ/^¬üÒ–e_ͯèÂ/cq®\Tx-“¶ïPXÆ×cy¾GÕ‰þ| 3~ C}~žEmJ"«g>`åN¦Œä‹éU/,2Ðl )|:‡ÕšóÃDzi;ŸäÇEˆ5-Fž}Ö¶d‰Ô¯Ÿ¸q£ÂÞ¾†£QîÖ-7&Æöøãv :¨Õ·Ï«5åI“’×®-ÐéÄwÞñ~ùe÷ÿåd܇¸g¸)­Ô˜Õ_)ÿ$eÆ”ÌjZ±(OÐØÛ¿}RôL˦š÷,þS¤n/¥\”Åkd$[ñX% 8ûÈéžcÿÚ>Eh/*—Z/ì)û°ß1¨´Ê–ƒì¦ýzÏl ßXöùˆ"W?9/•Êe·Ò­•ÜCT!­Âƒ¥1O=bî=ù"þEŠFã6?à[b6’ÜŸ4a×=U5ô€ Œ;ân›]ÿAtwŸ?þ+*•²kWeF†,‹¢¿/Ç3z,ñÑ„¶3Ñè6„Øu%ã"qát™ˆ!÷ú(EÒŽÑòe 1\&èIŠ£PºàLIº>¨a7…ëAAù$¢E椂fdåŠD±žÇŒD—Y›™FÒŠˆ±Ç[G@‰éœm£2ä‘VHNKº1fQJisšæcH$+žôö4 Â5‰ü0’ÚR«ú,qN‘7_WTvˆÙXâ0õÀI…Ðõ5¬›06E„Ò#F#¯Dzäz÷õ~J®Hì±"ÊtU(è7³Ö@t£Ma%ñ&~Ì⼯ûžÝÕ4q$ÙÈ’$üµ´¬ÀÎê‚U&¾˜£X ¯ ¦’—ކn$±ä Ýh\þJx¤×r8Ë©dF7GˆŒŒôòòÜô„ú›ÅÅTܨ[ÙŠj_Ÿ¼"FòûeÆõ¨d ‰"M‚¸œÀÚ½Ôö¢Eå¥FM«Æ\‰eù&tÃÏ‹*èÙ•˜8ÖoÁNK§ö5$áyìSçr^FÛ ÷Ág£ì*éž¶1Y >üšMo5-ù>… œðãõ¬WùBG¶,ÙÃk$´`b-:¬d¾ËcÌÐn`ƒŒ<‚zœÞfu1¥éÛš¥DìæZ7_ ­éN¥P:‰ºORÇ‚<‰¸ ”<çT¼%”¬¥L@^‡›;"ð2¶È^° eyà6¦”qÖÆF^çÂè/qRâ}{F˜ /e©#m,d”q¡ˆ]^ô,âJË}h!!tÍè¡@™Â•T¢»Ò5“Ìh¢¯q­ ,ØÒÈ9À9=êæxÇ‘·‚³%Xšã€.²u$ÊÐûVèR0¿A² Y„q¼Œå ¦Õ”vð5ŠóÈ¿ ­¼ÎÚð/5A"©O”Þ`Æï@+ õT<žIÖõr?•Àúz$›8[¤ØJ‰íóê¡Sebh8ÙæÇÕ"«»oàbªÚòùÃn”YH)fÐ M•Dë0§q¹LÝ̱„J"Q`ùÓ$ær2žÕèÚ×gtWâ3ùp=™U¥‹^ÁQÇá³¼ñ]U‘Vìç8ÅO¿òóö¡瑚΅‹¼ù^ R`̱uk!5U~üq[ÑͳÒ ÐLŸ®kÜX9qbÁ¯¿Þi… ¿¿êС Nt …ðý÷ymÛÆ=Z-cÿ!â…¢nÙk\:¥x¢½aŠŸõÔA=tÎ_¯äî PÖ¼`Cž‚7p‰Âk¥Qö}nºniÝZg;|Øœ-ûû+﨡²R)të¦:ÔéĉRwwå޽Ň•tê¤ÓéüÒCüáhÐEpp—s“1•FÜ^ûÔWÊ–ƒÿz%wI’…ë/ Šû÷ j;D3Ò·ÄDcJ­žxYVrÞ€)bþºOç}p‡ªæÏŸOÜþ¼ÿ~~€ Œ;Áƒü‚Öuëä¯_¯èÚA°Ô­+GDØ~§´„ŸWѹg~'%ƒ+løŽ.OP˜E™@æ5ö.¦éh~'þ ¢7âØ’‚+D}Œÿó„û^ÏStŒÌŸpKÙa —¢zëaLŸ‹¼,fcž—-\5ð¥Tx±¯€]uWÄ¥d6xÒЇ橜¹ÌÖfôP¢ºÆékœnK[{ì/qéçêáˆ÷E¶&ÀdÚ¤R¼…K‰8¡z¿‹.&&³áüQ|Gæ%Ê€!Ø=Ž]æ…—ûÆ#N@¸ ¯!•;›6ØcøÈÈ·×ýOjØäFä3+P 6´ck}’MÌLb]…ãv 6·A¯$ÍÄ‹‘•ü[lïCL3Xx©Òì8kØ>“Dš·~¯:w=ÂèæœŠ7>¶ªoV–Ldß%ž[NdåN8¢ÀÜÑÈ2+² UûP>|CŒ›œj.®çÇ0¼»0ûãèÝ›4bÜheÒK¤Õħ¨Õòë¯ >úHZ¼øVt sçêßxCð iذ¼ˆˆ»Xä5k¦ <ØéÌãÊ•ù:Å|ùeŽÙüßOq0îŠ3ú!âî îû’nA¤~i‰þ§bû·+[ üo)¹CìÝýÓ’SV«ØlÒŠŸNÿ¶ýò½ý "°Š„£dû`7†`—N“âɦx>Äýƃl`‰vd,›•Jó¡C¥x{Ë11tí`S#œ‰ÌÚ8ö!XBÞI´ Ýðlƒ[1–µ$¡Ø×î é2ÍÈÀlPl¤lÒ¶ -¼N³ÛXÁk€wM„_§ƒòQ°ÌµÀ÷Ŭ¯êêÈ«¾È0'‰ˆ ´‚ÞÖ¶âJ1ËSø"¾Ò,´vcUWâŠyû;*ÛCuœXõG’Yx†õ•y³"ïôC©ÖOäÝ}UgöÉö<Õ™R3³ª±z»ðÍD…[ «öNû×ãtmNj6ïüTU|2›Ýغå›jNË€>ääòÆ»H5Y!!ÂÓO‹‚ÀH'OÞÊî™;×aâD»À@åŒEW¯Þc»V+LŸîU¯‡ZµTÓ¦¥™øÃ¹ÿ3«´TZ³¦à‰'z²|ˆ0súö™Ó·[­ÿ,û{ï®è½»££¯d/û1Üd²®\zæÒÅÌCûc﹇a'©‹«Ó(Š!W0Žæw¯Ì|¶:ä!0þüM›Ÿ8á2p åÔ)í!Br2n¢NËñc<>†¨Úô $˜‹tÀåã4ëEZ$1at–ŒHœÑj(N&t2…É8BèL OcÌÂg8†pPáØÓI=v±…#›Õ0™SpUÉl+§l$;3/i IDATÃLf)*<íiPÈÅ|"B˜hÁ˜C´…²& *$;™«*4MiW@Á%.ÉÈi B™Df éhT÷T ÃHvCˆK(Î1‘ÙG?ì[¡KÀt„b+r;ôZ”‘X7bìÆ…š#DÁ*¤Vˆ!@’Ài+¬ŒWc=áÝ_IŒ•%Eô±£Öõb;=F™SÖåò¸Ž×c\žjš:r­”Ÿ’ÒÑÔñÆ,ÔwÂNId>Ëcà‡O…J¸G¼t\Ìai½¨U¡tQ¯¦k ÑÙ¬ˆÀKO›ÊÑÀ¾‰ÍfÇyb³Ùº’(ȵ’ðk\Jf@+ì+DEÞmHÌ`ç œô´jPéB½=:áX³ýp¯\¨(ôéÁåh~ÝŒkbmhÜXNŸ–ýU;VÔéj~,µ‘‘æ}û,kׇ Ѹ¹ÝÅRÇÅE1v¬‹››2.Î|ñ¢).ÎÄ_I’í]»êìoÛ®œ>•\Th¬èªPˆÀÌéÛ÷îŽ.ßî ?•œ’\èè¤qr®V= €,s&ÆÅB*

tÈœœlûåóèÑN^^¿O7ŠˆP?õ”w“&ÊÌL˹sÆÃ‡õqqº‹M‚ 4o®úÒôzqçÎêÕ«+<{ùòr›MÊɱöì©yùe¿aÃÜþw¾ ~ìßsuÏ®4“É&I’Ñhͼ^a4Z[µ Vã©(JF£µ ¿úÌ©™LmÑ@Ltlؘ̥KåF‹Å.IØlbU•éRj±J%iî}{ýzø«+XéeçNç^K/»ËßþÝWΞÉý•3¯W\½RRYaºËoYtX¿"£žÏ¦@vk{¸ê‚òotW!ÿý Öøßyoîÿë ֽ̃eÌÈЄ…]=ZUU%iµžîîbq±W‡deÉ[6JsÑiiî‡ÕBǤ'àì‚ÆBeÆq5I¤YSJÓi3‚¢ éùY›‘¬„£x®-ñðDw÷p.Çrç!8k±DÑ[tòÙ#àiç%-Ÿ‰ú›Å<¥^Œ Êág ]ù:™å\s# ;Àº ‚hÑ›1;ÙYD‘ã—ĵÃ$O3LƒÓ§œ(Ç€ë,zØ‘’RŒ¹³>¥ð2F'ø‚iå¤A¨_Á `"v#’+µ[\ò$Æé0À%ÔÒ#X%F¢—Љk|ø”Ûv›D’í7ákðVÉUœªâh/ÂL8f;c¢·¢³qtÝÅ&òd,eFr´ÄOƽÖrìØ±>}ú¼\*äô‹4v`4¶œå“½¤;›Î!uDÙ%L\L¹–9c˜9¬þØxöCÒs(®àôw8Õ5¾hõŒ˜NU5CûñÑÜú yç\"W®ræ> }e ˜1Ã~ýº4hðÙg¿Æn0H#G–k4Bzº=&Æ«eËq·ÑÁƒº%KJ++m2™p䈾o_—ÈHõðánƒ»¹¹ýë6-›M:Þxü¸áðaÝîÝZ“IzðA×;u‘‘ê™3}†w‹ˆPÿv/÷ñ‹%).Ò=:9ªMÛÀ«i%«VœquU¿ó÷!Àk³w. ô–âbÝñ£™Içó§gv¬o\yçÝ&“íñ';E´òW©äz½åôÉ죇¯…¶ðyò©.õ:¬cIÍñìWûmÿùbvV¥³FÙ/:´_ôD˃uï®´K‹´Z³»‡S÷žM£† ‹ý­×wi\T3žë±mË…ÜœJ‹Ê±auµy׎KéWJõz‹‹«ªM»ÀáFªÕ7ÞK‹öîºRT¤õòrîÑ;¤O¿æ7ãË“ â¤ëÜÝÕƒïÜÕaßMCp4GýW0dhøa ç½)ÀøRŸ¡E{<Ë1¾Å>\†Ñà òÄÆFÉìÄ]Ù•A€õÿÑ ¿‰I÷°‚q7¸—c°$Q ÷î5ge/]’ÜÝm/š,éøqÛîýäçqþþMˆãâ%ÒH8„ 2S¸z‘ât®Å;‚œSœY‹kåW(ÎB{¢ÈC¨ˆ'g-.½Ðž¤h)š‘Qùò±ØO`ùR&•H‰Qâ ’kzVy1Ú@j1ßùÒ]Äj ;—­áŒK¹VEN¢‹ÉJáP¥ýèWHá.d‘ÕPò+äýÂI`2²¨:JV;Â)„^G÷3y)TϠŇv)…€áïxKÐíÇ ðòLØŠøVm0VcO5¤‰|hæçÚØk¥ÀþäÙЊÌ.½Àî­`]Yfb+y-»Îm7¥Œb3£ÎPéí–³º/yʘ~¬N,¼BƲ!äé¸TÆÔØ[¢>}ú¯E#È×2á¶€÷q]èÔŒb-|M•±Ž¨©¯Žåj>/}Krfý±ñɋ䓒Á‚õEn.,™‡RÉÆì;ÖÀ¸Zø:=׳yæÅ¤@PóæÉÒÓ¥Ï?W¬øµFؾÝÛj%-Í6`@ùïŠÇrÄÀ®11!ëÖ59Ò-2R-—óí·åcÇfq½k׫/¼·aCåÙ³†ÒÒßè¿ Àzò¤aõêŠY³òúôÉhßþJ·né³gçÙ,©gOÍÈ‘©©—.E¼ô’ï}íêωٯö{ÿã¢)²¦!^€Íf¿½šÆEÒÜûñ';õíß8väúíudr —Ëœœ2™àæ¦ô@Ë‹†ÖhWw‰ïWÍH/³ZíÕU¦¿¤^L¹±Iä§ I'ŽeVTm6±¼Ì°kÇåû® … 0›¬ß}{:óz¹Í&Ök¸amÂùsyUU&›M¬ª48š¹ýç‹5¢ë×ÊW¯<›—We³‰%%ú˜moþ_W¯”®ûþ\^n•Õb/+5lÚ˜‘^VÿZÿ:‘"qk'°š„rŒn8u'ØŽ¸‘ÃÀQ.üžþîÇ`ý!¸—]„JŸ… ÎjßÞ-*J$Y@€¼°oo'Á×WèÒEÐVØ„’l<¼è7 ›ÿf”\ÁÙÎCÑ£ Ä^†‹#)ŒG®¦åt×@ŽWH¨!7!wCÕY9r7dÍP˜ÔÎÈ[C!è•õYPQÅáSdå3"ç:t§Èd ìÇšõh4X,tíÔÀØ ‚‚„ØX©ªŠ°0¡iÓ;ºHT*aìX§“'-YYâ‰ÖΕwÅÝp;<<ä½{»<ÿ¼o§NÎMš¨ÌfI&#>Þpú´±´Ôöõ×åo½Utê”aÉ’Ò¸8ýÅ‹¦C‡ô‡é¿ÿ¾âí·‹-*þñÇÊ—_.8}Úœlúùçêœk›6ÎÎÎÂèÑS¦x}þyã_ôíÒEãç÷Ÿ'õ¹?Û¶\ÈÏ«nÕ¨mû@j}võŒ"þþ®ÇŽ\7­Ñ[Ôk®Óš³2+’ó/¤TôVW•“Ó­p{‡Ž%5ÇMšx>û|¯ƒÃ*+ŒE…Z£ÑÚ©K0°eS²Ý.¾27zÔ˜6‚=Ò. ‚бscAöí¹"I„†ù<;«gô ee†â"Ý͆]º5<4|ȰðÁC[F¶ 8Ÿ]Ueª¹ø_¶^()Öõé×|Æs={\L)Òë-Ý{6~ÞœRVj˜:½ëÄIQÁM<Ïç›M¶ë¾ùuq-½ìZÆS kæÓ"¬a:+ö^ø*&7r ÊYôpFyˆä"*ö/üiå‚eò»3 ,\¸þ^øMl»‡Œ»Á½?Wj$Î9;Ûœ’Ô»·d2Ù¢¢äk×Úe‚¢¤„õßóÄDb¤Y—Ï’y‰Ç¦sx=M#)Ï%~-½ÈÁ÷pr' #×wÑ|0–J®¬`Ð:ò7’žM×å\}”¼E´\BÑl‹h´ ÃL9rå9«°Lâk%3Tt5qPÏw<ŸÉK2v6g©7]‹9œÍ¦ÖLÈâXƒéÙƒ‘ëy/™Ã-éÜ‹^¹ä&ЈFé<„N;9½™#¯0þ!"S(Š'§îiû!‰Tœ d#YShÞÍ,?¥ €œŸwF6—$¬¿`|ÊxË 'ÂgÈžCLÄ~ !xYM–Èy‘‰Žºà!´V±ÊŸœ4¡bl­ã¯¿;߇1/›g2V2¨Öç"'¦+ƒã)µ2=™ï£¸©_´öäçA ݃ÞJ¸“Bo=©p/6bèf$ˆôaŒÝ”Ÿ Û¦Ðÿ+<œø!É:ZÁ–Y [Â…\>ÝÇìê<ýÏf`´°ùÎj–Ϫ#êÉ‹™ó9Éé$­Å§®óñ•g8yží˜ö:Û¾¦‹MHSÖ­à­¿³èc¢Úѳ[oútY~¾´i“ôôÓö;äaawÔ±\\„;¼_x¡*5Õ>`@ù† žÃ†ý[Æ¡öíÛ·w~óMN]¶k—Ý$ʃ›²i#ã'³c#ýây™Øõ œÂáuØU¸xqp£çpäc2Î9})šVxF’ý =¡¿ÊÕ÷é°ˆ¬9ä-¢ùBJŸ§ü]‚–`œ†å+™r3Ây‰d%ÏhxÂÀßx3Ö@R!K#ÙÌØ|¶gò}8Ï•p)s™éÄàRr®p¶mZÓ¥IŒ#n8Ã'Òw ǸЊ¦áøŽ¥õÒ¾áì|†ãÖïud-æÒ×tU"ûM’»œâ–8ÁÃÙx.E÷Õ­QvC,G>ûZDû ä€6kxÖÈR3þoÕNVs<)9gbD§ß"nXÔÈwÅŒJãd|jwF¹ñc'޸ĜTüÕ<î°çnjK®ëXšÊÃ9õ!ÄxÏF‘^Éò$þ™5óúv¾eYz² —Jøâc¿çì‹8n-Å»óÏ=L\F¼‚ëÛ‡°ì9ÞúiŸÕ‚ÿ["¹Œµó™úw>û‘aL»ª д«>àÃoøä;:¶¦C«úìÃw©¨bÝ&¦>Ƕõõçz@.çûïå3g²q£¨ÕÚbcŠ;¿p*•°zµgãÆ²~0M›VYXèöÒKw yø7àí-ïÖMÓ­Ûý¤Ñ÷,$‰Më“ó5.ªggõ rûõú{w¥!¡¿¶+P㢊låÙÊ¿g¯f¼w0ãê Ç™ ’$iµf775PPЀM¨¼Ìàçï TVqÐ~5vŸózÿÂmúÕÒóçòr²+\Ÿ8÷­µÿ…TYaðòÖådžɉùÀ”é]"[ùÛlâÛso%*vuSWUš´Z“çmÄNÎJƒÞòîûÃ]œ¿ŽÐ0Ÿ!4cÞ j6 þfŸ-Ú°y§Ê¿"=G~ —[â3ƒ®œ&-“Â„Ž¡Ï¯´ºî+Cîe VáÞ½@n\œh2•:$÷ô´UTˆîîH’!;[*(wí%<’vQ¨Ü±ÛˆÛÆ•‚LܱÛ8²¿æ«1X±™Hþ Ÿ(râH^Cðt™œÃ«25=šv `uBÝÉ‚©ùìWËè$qDä]g&‚MÏ·.D¨²Q^†ƌ”óØi¦¸)½Èã´ ¡Q àg+æîtÎr¶˜âö„ºàtÂmœFáŒârmþ©‡iâƒ*ýz28=„ðy¥Ø€¾¨£PÙà*+wx™¾wHS*ãe5rX`b¯Ã«·Ð +äÛ˜TŒ¡v±*ƒ›ÒFƒ‚)×0;Duðç™fHðr*§êšyÞ‰¢‡?Å&&ÄQ]×;ñ^Zûp½Š²[Ûë.‰ç!Ü—Œ2fl¡ÞjùµáD‘UƬêS±OL÷p*õ<ÿÖº3I³@ž…‡ «vr-¿þ5˜ö­HIcêkŒõ¥* ßÀÃí»øòÛúÒ¸¹ñþû2ââ¤wß}K ð¸¿ø¢K÷îÊÙ³«_|±Ú`øŸÞƒsÿNÌ:Ÿ<2)êW´+«Åž—[µnMBÒù|A _ÿÐz6¬=¿ð­½»v^./3Øl¢(JÕU¦”¤ÀÙùÆ*ÊÍ] ìÝ•f4ZKŠu[7¥Ü~¢˜m©Z­Y§3×0m6 ¾A‘÷Ús ßÞ[^fèÝ7dâcpðôÕà—Ÿ/ê´fμkÇedž7Ní¦6m¿l½Þn2Ù€Æ=€C2,f[JRÁ¯ì\òÑ‘š MšxqÒ­–BþD‹0Ÿ!ÃÂïþ÷ÌsÝGŒ¼mæ€!ßÕóî;¼SPC7 ô¢i®zŒ[9žOy{B]ù5ƒå}ü_â^¦iDQ&—ǶnÔ²%ƒ‹··¬ @f±x¸¸Ø32¼zõâòey§öBþ5t:Âa2Ò¡- ¨ðq¢ ƒApõúr:õ#ç4-£K 2þ ÈX‰>›îóÉù[5áOQö‚Œ&O¢]d"`!æsqÛocºÄu[«Ym岚Þ2†ñ•™¼p~ºÎU\t"°5óΰ¼œôfôiÅèݬ¨¢´mz0j?ûsÈñÂëa.£z-ЍœÊàšÄ“s˜ÌRtséïƒ&•êo¹zÃûth…»¯“•ƒÅÅ4ÀOQ^ˆ„|5^5f— ˆß"¦ íGÑ¡6bê3GìÄÙˆs¡S­C¿ÌΨB*íDªØx+¸ªÐ¨4ÊmtqeCK­9s/‘\Å™jNö&ÌÁ(Smeä>Ð(Ù1¸×C®–GcPÊhëÇÒAukf“×#“10ŒCꈲËxl9ZÏôã…ÁuDåZ¦,!- }XôDý¡òÒ'œ¹ŒÉÂÉoQ)ëˆ FFÏ$·ˆ¾]ø¦¡dÏ1»X²Œ¤T¶ý@ßž TN’Þ_î æí1êT9ò&Ôƒ ðà¨Ö7In"1!oãºÄ½~c'´ëÑ«°më…G3o–7mæUT¨5›m.)ŠÒÜ9;wwuuõ-gÜŒçz„…û±1—Ìpì¶CÇF?Ù©æ:e2A£Qét 4üî›Ó—/×*•r?—ü¼jgrᢡ™×Ê¿úâ„ã7íÁQ­úh\I+Yñõ©›å …¬U›€'¦v¾ý¿û7q“´=<Ò7¬=Ÿz±2,|ÈÐßaûuTbú€#-ñyŠNÂ÷ìϧ<© µ`vœîþË.|ýŸº°ºxöV0î÷²«†ä±:5U[QQ¾o_Ñþýæ‹ugÎHJ¥-3ÓbµJ ö}qäd“”@P3NàÂE®&‘žBP9©$G[LÞ4È=Ë©oðmKå5.ï@¦B{ÊBLyT'"`ºLõaĬ™˜Î`‘ôˆéXb:AŽÈû¦[IÖ³Ú™æ ·RPÊ÷M/CYÍ%!ô«"7•_LTuäRò‰ÓRÞ›Þ I$]ä¢î­i¦Å°‘ÃVì=h"GÈ¡zgÖ¸·ÂSƒ|YVD^£Q>–ch·R(à}ÐÃÓI.ärÁÝ]ݺmÀô™Ýk´+`ă‘]º5Q©jµ¢mûÀ©Ow©1nY­öš 9 …lÚ3Ýš6óT(dž^Îc'´«Q’€aFFjáéå,—Ë<½œ{÷ 7±ýͳK’4í™®MšzÊå2oÍøGÚßl8zlÛæ¡ÞJ¥<0ÈmêÓ]G<ÔÊÓÓÙÃà  õžôd§€@7…BæçïúÐÃmúEߨá÷ø“ÝärA£QvìÜxÜ„vÿÚþuDj1bd«ðH¿©Ó»ªÕŠ'¦unÝ&à?«]&¬T?H„€p…Ü3¤Q1’ä DÃqrwìïùý¯ã^¶`‚ üÒ¨‘[D„¦¼\áêêݬ™˜Ÿ¯ –ÇÅ)Ú¶uÏÎÆÇGÞº…|–ÎÝHØMó:¶åb<zq~3Á‘tìÉù-„öÀ|I"j<‰‹ñmCÔ“$½ƒOÍ£ÉúÏ.øµ¤|®½ðޤúœºã5ÓóÈ;¢ùÒJVr–Tð‘D©šd Èä%'›ð÷,¶•rÒƒÖ­xõ(© ¤m{&íeu…Á´ì͸y曎 IDAT∠$pä(ó£U{B†Ð¹ã«ìÆs¡}hfA|ž³jäðžFs`?U?Q&"½Nã0œ€XL+Ñ‹ïáÖ%`†þØl‰ð=òÕÛ}tX!LÆš[!{±zf–Ò\É«<ä`”ÚYɘ4¢Ý˜È8‡ Žj½#sáÇN(ŒU‡ ¶—ž~LnÁôºSÐ[¯.ÍnÙ9£éXG´`_¤Më#¨Žë€Y?°#‰ð@¶ü ÷º‘ó×±r­›°i.žuœN¤0äEº¶bþtܶ¬]¾ùŸÒ:œÕ‹izÛÎn«•A£(¯ e›V¡TÖ¯Pƒo¾_|ÑÞ¥‹ðÖ[òaÃ~›Ûº²Rœ1£zëVcT”²woÕǻߩçû¸{ ·ó—þå ŠÒMþzÇãÿŠÑ'7Œp ¶uH§píÓ)¼ýìŸ*L-’ŠüñÿíŽnX°>ýÏ^^-^º·ŒßĽlÁªg×®ÅqqBãÆUÇW^¹¢?r¤lËYp°¤ÕÚ;u’޳_¾Æõk¬_Cל:DqWγu9}#õ(Y™T“HäÃdäØW4Nvy‰¨<ÉŽAtÇZJÞ:Ô1gS¼ywÄ2´k±y"øaÁ²GÆd‰#" ]yÕÊU §œhäF/ñÅ,oÆ$+ì.ç\“+ɺÌÎ*r{2Ê —TNp­#}ñM'=Ž89²I à)…”{â<•N—(^CB&²Wiu™êõd^ ŒG(N§ÑÏ%»fkàœ:¢<…ù*«‘5lBQ„´ qQm0–ls¡Lâ¤w$#\x̓£F&“è`^yГå¡\639x‡Àî vv£ÜJ••çëZ¤¢YÕ‡C…|r‘£u7¾?¶åó8’ÔXŠôuDo¢Oq<±‘zÉdÿùͼÙ‘gÖÔÆzûQ"›°/‘n³ˆ÷jÇüéOfÉFŠ+êKg>Æ}‰;ɤÙÜÎÚ¨T²i5#Ûv°èãúÒ›˜1CöÞ{2™Œ‰m‡ýö¼ãé)Û¸Ñó³ÏÜ­ûö™{ö,IL¼+ãÄ}ÜÇ}üwá¨Qý™‚ȆÒˆ!>‘k‘4H”ˆCL&™À]jW÷ñ‡â^&Í?|ø“Õ« 3]½*÷ôTêõ6ƒÁ«cG[~¾&:ÚCp°ª¨HÐédC‘q…î}¸t›NÝÈË }_ÒŽa6ý8ç·Ð'®~„"k6=f’ 2š¢ì 7¼{¡‹Gî‚G4ÆÃ®ObÝ‚`•)ß“Ø. Ú©0sPÀÅÇËùÉNµ'ƒx–sNÄ̃ªÊÉBèUMi—l˜[HP  ¡„6Æ?‹’tò,ØÚÚÏ«”çR-"v ȵ)‰Ê*,=ðU"ëŒË~ªò°HÐW ;ªƒ˜¯aÓ# @-€´Cö#âuh Íwž ¶X9#(о6¨›×lœ5“mc€ó­L…]È0qRG¶™~îxÖZ½<”ôõæÝ+dðPÒÅwªJ;s¹ZÍ€ ·™¸\]éÞ…¬lví£Q íÚ4<&{õ’=+?.¥§Ó¶­Ð¸ño̼‚@·nªèhu|¼5>Þš”d-+»wWÉÿ AY111·vŒKW®ØbcÍGZÖ¬1mßnÚ¹Ó\\,VVŠÞÞr'§?iººÂBñøqËñã–åË 11æK—ì{ö˜ãã­&“äì,ssûs]¶É$ÅÆšccÍ«W/_¶_¿n U¨Tw{‘F#k׊˗‹è»wW9;ß±á–í¬XCú5Ú´ª¶Øì¬ÙÊ×ëÉ- K»ú¯RNK6²q!ð÷ª+*aÉv¬y ¢îHâóýœ¾Nï°Z;Ù|zœ‰{èÓo´ñm+RÐYhçH”Øp½ù-¤§?7• ~*à‹LªèîuËÊ.J¬+cY!Éz¸Ýš‚*DViÙg ÏN[Ž‹+K-¶Ó]Žº¶ò~Ä¥ˆé À†´ãZ yˆPÖT<Šv¥É: Q HH(þ…Ü̸9TÆqý%ÍñrFy¢Ýœ5aÌ@\H¸ÈEðÇ${Þs+wƒ{Ù‚åÓ¾=0t¨¹²Òã¬ååVwwÁÙ¹lß>eÏžÆ]»xä »¨ÀÛ‡µßóÐ㤧âÝ w¶~ç)È@oÃ/”Ki3–¬“œYG§ç©Ì ¼ˆq˜KQFàÙÝE\Gà…á"êpŒõö`TO`=‚e§À“‡DÞuåEþ:>U òã) ù…, fŒ7]Š9\ľ6ŒoD—k,à|'†4¥ÕUR9H`4ÑÕT縄4šáÇsù©À3t‰Ào'WŽ“A`¿ZKƒÕSÎj˜näx­ýF€oýxÆsM¾B3Ò§!<À*J£ÚÁÞÓÕ“µQ8Ë™•Blq‡5·=O¶àP!£÷£¯Ýè·páB¥Œ/áÅÊd^;T§‰¿+ŸF”xk›êÆ4óáýñäU2k-çëc…2çatFžûŠóu ºä2Ï¢o–må³M· 'O6|F#Þü˜ØCõ¥@®LŒÓ_àô¹*Ô`éRùœ9²sçÄaÃl‰‰we?ï×Oµc‡÷sϹääˆk×»u+=vì/†bÔ¨Q5W®Ø,ÐvíZÚ®]É”)• êÊËí-ZÈçÍs}ê)Í€j?—šâˆÀ@ÙСê)S4ï½çÖ·¯*'Ç~ê”õÍ7µ ê7.jÑ¢xÞ¼êýûÍËÙRX(.X mÞ¼xúôª?Ö——‹=¤ž<ÙÙÕõnïmY3fاO·KŸ~ÚÎËëŽ ?úœñOrâ4ýzãÒãÇÜyj.ùÅ<öP}íJodÈ‹,^K#_ÚÖ ýÒ›ò6‹77Ðal2£>'.1Q:Ð,T›ô ¤‘;Q¾{ ¦íb]*z cë¼yŽÇ³'—iáu6Ö|”Á#縠eRcœ>Œïå1ó™žð«ÕƒÀ(ñ@>/”eeœC°ÁZ £ ³1N‰{måíˆbß‹ÔÁ·vÿÏëT¿DU)ö‡¹±¶ØGÕd`ˆ»ð#ÙsI‡µ?þ@%¦w9ÃeOœ¼p¶a_ÇÆÑô Ư’Êd’U¨â¡îàoà~ªœ?K¸ ¿ÙDíå I6¹\wõjqZv{ÑÁƒ ??k^ž ¥Ü\ñçítíI‡N¨\‘$öî$°•¥¨<‘DâÖÓ¼+¢Â\NdÄ£Vç—áÛ¢ã\þ ïhÊŽ‘½·ÞT¤pN½0¡r1ŠQ`ÀüœGA)²CŽAE7 ‹žÏ}˜  ¨d¯™Œ@ EQ ö§•ˆ-‰dÈZÑ 8ÅN3†îtoB“$’RHqFÝ›6ÀvNVcðEÓ` ‰U˜OÒ ÷õdÅS ´ÂyÞpùyXä³píˆò-ªO×¾Ï"÷A¨‚'±ßôò=®b’ þX?jTE»v¥ êγª~ûm×cÇ|6lðzí5×&Mþ †¸ZøøÈ&Ov^ºÔý矽¶móêÓGåï/»vÍ~ü¸uÈrŸ¢Ù³µË–®_¿[€ÿD‘={̯¼¢mÑ¢xáB]a¡8~¼ÓO?yþô“Wdäï 9,*bìXÛ?ˆcÇÊ–,‘CÖj8Ì ‘ɘ;›v­¨°çñI¸»òÖ,<ÝëKç}MZ6-›ðÚm›yßYOZ-ñî⑎Xezf¬A’˜Ö›Më4™K/ZðZtòå‰üx™Ô2þÞµÃ(ۓLJ)(d¼…¿›ÁÑrÞ¼Œ¯µ¨³Óy})ós sb~0MÌT¯”rÖL¨’|oi]§mÌ2ÑWÁËjºÕžô <ƒ]‚§‘ ¨Õ®6cÚ€Á áeÜ<9˜’«ÅÞ ×Vh€4´«¸fCJ#”¬á¼sÞÑ„û8WH…7îýiìeo6ÙíhBHO寃ìììqãÆ¹»»»»»7.''ç¿}Eÿ:þ2Aî5ŒvÿB«Ÿû÷×fd4mݺ:5µY·n˜Í//22ä’ä®ÑØSS}–e½»É2¯PQA— z:Fqñf#í"I;Í Id¦8ƒ3IÁ=_ …gh?Š8Ê“èõ9yËЦÐu=… O¢Í>*^Ç’HÐvìcO@ýŠ]U%~ði¯ÛHö!¦œÕ‘ãÂgi|RAR ƒB˜|Œ%Ud‡ñ@$#÷³¦˜œf´ê͸‹\<ÙRJg1Ëç8˜EQÁãé |É©ëTá6‡Þ@ y(ÎA¿‚n^¨€wȹ„Ñùw„Ê€ÐÇœ‰}~~ÈLÀ~ ©†ڔ vxÜ€N"[º•EH³òL1,Ìòàïí™f&§“fd¢_6¿U.ÁßRHª"ßÌé>ø;°._©fú1\•ô àÍöuúWçÙt½…ï†ÓÖ·ÎS~ú'Îçã¤dÿ38;x+LVÆ}Éå¢#Y9­N“…qïs9—ÁQõSè¯,åh!¬œ‡kÝ0yIbú\Î]ÄÅ™Ãê,¦k`µ2a*Ù9´mÅÊ/îðn±0eŠ=3SJO—ââmÛÞ½GZ¼X·|¹±U+ÙéÓ¶çŸwyýu/¯?ÑJ©¤Dܺմ}»96V ʾ}•*•¬Y3ùÔ©Î}ú¨îbeô—(o9rļaƒ99Ù:|¸Ó®]&`äHu³fòèhuÿþ*?¿?êÑ$$X·n5mÚdºzÕ&oÜXîæ&¼ñ†k¯^w›Äæ&²³¥!Cì’„[·*‚‚î8ß^¸Äì7°Zy` oÎi «ë¹tM»p&>ȬÉõ¥[âøúgì"Ÿ¿\ß|µ'w7"—±ì9Ú6«#zx)ÙeD²n&ŽáLkxaQX1ž0‡9átÑéÈ쮌»Už©¥s m¼Ý„9m®Ù@磴w'Ú—ºNëˆN¥›+Óü˜âàdüºš×Êè¤æK_ÚÔÞì‰.:BzÉù¨vÒÐÁ4ìÅо­µ—]À:š²(”¢™€3`Az‚t„ã´&€û N{¡ŠÂk:¡@××“Ø ÏYôðÂ9‹â_8!G6‚nÍ ¼À…]ì `ã\ЂìwÒ4|p—•'æþÞ¯¶N§‹ŠŠš6mÚßþö7`Ù²ekÖ¬ILLÔhþ’ÜÈ¢yù‚Ýl®Î͵!7W_]]ºsgɉæK—´§NI2™½°Ð"ŠÒ… âþÃæ“v7_Žîáô) 2‘Éð ¥ #[D*r1 $“ºÀ”§q~~Ý0æ“¶×–XJÈÞ€*[)_áÔ{1‹P>‚x óûr¦H\–ˆ•Sª D¤JË><*ÇÓH¢ž³n$?‹Í”‡1DOq*?[Ðvd°÷Ëœ.#¯ mäÈõè÷±AWW4‡HN!x”veÎ{‚`$5È*±,&µf¤¿B#-öóè—sÃK77'dň£¢fõí K‘•#íBüš+r9,s&["ÅÎFnO"”¼ãVâ«j6;¥BÔ|‚AdYŸ9ððY”2²ŒŒ9[‡˜4ÜÙ›ÇÛ üR×µ÷\Gº‘T˜mTÖe-X2 _r*™S§ÜIÉÇ 8suñuE*>z 7g¥ðÓ±úcæ½™4ñcÓ^ZR_$üóMªuœ<Ï[ŸÔ—J%_‚»kä…רP•Š5kä¾¾”–2x°-5õn§!ggaÁ·#G¼CB”z½´x±®oß²ùóu%%ÿekVU•´~½qÌ˜Š¦M‹Ÿ}¶*6Ö‰ãÆ9½úªkLŒ×Ê•}ûÞSÚ “Ñ«—jî\·¤$ßìlÿI“œ'Lpòô”ét|ù¥aÂ„Š±c+""J¦L©\µÊpú´U¯ÿwW³YYöÍ›MÏ>[ÕªUIçÎ¥‹éüü„æÍåÓ¦i~øÁ+&Æû_Ю._–fί_—Ü݉‰QݱfA!#'²ÿ¢xãå*˜-LxžŠ*<ÜøÛã·5/eæböŸá±!õµ«r-O}ÆÉËLŽ®¯]}}ˆ_Îs½”&ÔÑ®r*ù¿PebJ—:ÚU•™Gc0ÚèXG»2Ûyô0í¼ðPò²ƒve™pŽ +n æ;hWe6¹ŠQ¤½¦Žvµ×Àó%D©˜íqK»²Â#òEd‹jµ+ žÁþ ¢3|V«]U#~ŒN-QÔhWÀW]ƨÃþ7ܜߒ^€ÑŠ8… ýI² Øê…³û:^!¯ þÍ 4cÞË^†v´sÁå2§€¢;Û ‚õùýn|ûí·=zô˜7ož—————×¼yóºuë¶bÅmô9üe‚Ü.\ø{/µ"#cñçŸ?Ö¹³J©Tzz*EQpwwqqQyôè¡ ”ùø(¬V»“““Fƒ¿¿Ð½›€„›'VnôHi.J7$^A´Œ¶“žð^ÈUhü‘ªÐ<ˆÊó(ÝFåÑl6Õûü^Æ‹ÌçG‘Î!øƒ òP0C®šyÎ *ÚÚ-äYÉõçq™rœ,”5ãÁ2®ªp6PÞœÞ%ä˜0”‘FÇ`‚/pAŽÜï@üM˜‹¨,¢²=¡î8¹¡ªÆ”EEG‚œPDᵟ"7v¤–¸©‘Eâ|jb0êÆ¨è‡z+FodUH]PÞ­‘%#¥?B8à,0\Áz+npMd`­ý&TI‚‹N›i­¢imy#áNì¨DgÇ_EËZ›¼\`„?› ðR_Áh †P7T2ʸ\Eî‘­ ^~Ocb¯á¬$.›ñ·f[µ‚v,G.ÃYA[‡ÞüÜpR°#‰Œb¢#ê¤ÐñóÀbãp —sy #î $…œ¶-ذ…W mÌo€³ÝÚ³y6+î®´£\]iß– ›Qª¨¬¢G׆ǧ\Îøñ²óç%¥’5k¤®]…àà»U@||d£G; îTXh—ËeW®XçÎÕ‹AA²ÀÀÿS¿[A¸nñw´¯¼¢ÍζïÝkîÜY¥˜7ÏmÛ¶>©© #"Jå½¥X5YûöŠ œ_yŵMyóæŠg­II6³™¹sµ| KL´­[g<ÞšŸoÏÍu:I©4šú÷Çl–JK¥ë×mgÎØöï·lÝjüàýœ9Õ[¶˜RSm[¶˜ÂÃåv»0y²óœ9®}äÞ¯ŸÊÝý_¹É'OJDLAª‚Mȃ ^¦*1å<äÀaªwR„j>M£S|š2_Ô¯ÓÊ µ„´œ3å;ÓèaZ{I¨B¯@>äÈö±Ï†ÍÏa 3cŒgû w?½`’/éÉ Bÿ?&ÈýÐïýjÏ›7oÖ¬Y-ZÜÚäêêºråÊ)S¦ü®~þ$ø+¹ÊÊÊ|}}øöÛoGFþZŠx üêUŸðð÷œƒÜÜŒÅÅá=z”ÇÇ·>¼z×.Ÿ~ý„£Ge..aa2·fÍ„õë…†(RN`40íq¶ÿÀÓ8³›…©³ÙþO:DcÀn¥ËCì?F¼Nܻв—>§åT4ò×Óüÿ¡.£ôŸÇÍ™Êp‡Ï$ ãPtÃåg;“%Šä¬ÐqHÇR5ý=YÆ(+…Mù@M»x¦ƒØ6gYn ¼¯9㿞÷ôT`RkzåèŽD1†12dŸñK:y½ióÑ|ÌÑsäw#øezÇ)ÝJNÕ_Ð%`%E'Ñçaþž0?”@<æyT§a[×°Úd ÿD|»CQ@pÄÆ`=*5NŒsX0Ï-cq%¾rN4¦¥ÃüûE!ÿÈC+r¬ ô˜¤jz'Êñx©®ñÙ|“¹Ê_oëåpЬjº|O©‘½™ß«Îãþî4Ó7ã¦æô DÖÝ¡<õ;Ö£KÇßDåàÔ“$&.fóqú¶áà"u5“•1<ý<\9¿†æ·q_}¹–WàéÎúOiÕ¢¾ض“±“~^Ǩá T¨ÑÈÌ™öµkEww¶mS ð»?“'NXV­2~÷¡o_ÕáÖN”Ó§kÆs ø£ìÓ6ÇŽYöî5ïßoNK³UWK@¯^ª  Ù!ê œ¼½eü«ný{ 6))Ö“'­……âöí¦K—lÝ»+µ}ûªj† Q§¤X;uRv쨬IUyø°åÐ! ¥HL´ݺ©NŸ¶#Gªýýe‘‘Ê!CT:(ÿM‹à¦MÒ“OÚÌf¦M“}ñ…ÜÑ SïÙÙí<ý«×Ó:‚ñø6”Áeí6>^AI»WÑþ¶¹ùŸëye)Þ$­% nÚÃ{yf).$-¥™ƒ­Èb£Ç{œÏæÙh¾z²N“÷{™¬Jο„Ãe¯¹ÀÔ]¸(IžJ¨ç­òuL>‚“œ#éèpöuyLOB&pªív ÎÉâ“Z8q¨Áµ1 z‘^y$[˜äÊÚ€[ÞŸÏ-ü?#}ä,×к¶tÒlÀ/(†ÖΜKÐ}„Ö Ù|ƒ‘Ù˜#]‡}'âbœÁ=¶Wh5œ †ËëHòÆy1CÝPçPò1›E¤—ÛœÀL2÷±Oþ žðÁç ?\"þyáKIá®Æ‡ °ànjþ~,ø½3@@@@rrr@@ÀÍ’ÂÂÂŽ;4ôúç‡ôÁ¨Q£Ž9b4srr–,Yâïïþüùßlõß¾»÷q÷q÷qÿ׸ûok``ðŸá2j T*-‹c‰ÅbQ©T¿·Ÿ? þ2 V=,[¶lèС¿Y­2+Ëj0ËÊŒ%%’(V¥¦J’¤KM•DÑ|ýº]¯ [F†$Ibjª$ŠRQ¡TV*I’tõ¢$IRiTQ"I’”}QEÉlŠÒ%I’Ê2$C…$IRÙ%I´I’$U¤Ü8¨J¼qn㕦Ӓd“$I²_‘Dƒ$I’T%JWk„)E’¬’$‰’Ý ]¨-¬4Hù5ÇfIW)åÜüò¤+7‹¤"¤»ùçU)ÏVs"I’$é²Tb”¬7ÿ4J¶sR¹ãÍ)•¬ Íkð‹d´×-ÑKÒv©^™$IÒ&‹CïµÐÙ¥Íõ»”$I2Ù¥ŸÊ(—$ikd°5Pž¥“N—4Üd÷5ÉÔP­YÚ{¥rI’³¥ÌÒ†Eg®H¹wUh¥ÃwVã«uÒž£w”Öà‡%ëí·é6ØíÒçŸÛ †ß®ùë0™Ä4>ûlåæ·¯_ÅÓOWΙSµ{·É`ÿÐý/àÚ5ÛæÍÆÕ« óçWÏŸ_ýG?;‡óŠ«W7ðj7ˆ´«Rü™_«`³I?ï½£Ôh–öžjX$ŠÒŽÓ ‹Šª¤äœÿßÞÝ„TµîqÞl)•qª‘„4QIjbé¤eô!:ÐÃ4­a lHäà¯Á©‹J©¥Fâ…S«{C(¥´èK×Äz;»|˵}žQ¼{+[ü–¿ýîµ—+¬üý6¹Ò·Š¢þ¾ÂúÂbô©Ö?/F¿¾Xa}öSôÛì ë£ï£\ºø!Š~]¶¸E=Ñâ’l¼ÿ½_òÌ{Ñ›ùoO°cÑì\ÚÉu!Z¾™ò÷è?égß?¢?þ÷>GŸÿ­ô_YV°Öã~ú-þßxÓÓÓÅÅÅóóó+> $K–½E¸?E˜^¿óœµ ø[•––Ž}sÛèñññ’’•î·–ë±`eâæÍ›UUUqO„QWW×ÙÙ™¾ÒÙÙùõoB$Îz|‹p¹ÚÚÚ–––ƒ>þüÆíííwîÜ©¬¬Œ{4 €¹¹¹òòò¦¦¦–––T*ÕÑÑqíÚµ±±±¼¼¼¿üÚu(;X.\èêê*++Û¼ysuuõäääàà vY#??```hh¨¨¨¨¨¨hxx¸¿¿?¡í*•”,€IÆ@‚(X)X)X)X)XeyÁÊY&î‰øOŸ>mhh((((((hhhxöìYÜñ¤/Yîß¿ßÚÚºuëÖ”0®gß?v’—,/X©oÿ²¡›~%Èüü|MMMeeåÔÔÏjÕ¤KIDATÔÔÔTeeemmí»wïâž‹ } ræÌ™_~ùåÞ½{ËÆuî;Çî IŒE–ßh4''ËÀ,ÖÞÞ>22rýúõ¯+§OŸ>pà@[[[ŒS‘9éK¨åN“bÅÐIb\²‹„êíímllL_illìéé‰kذ„~Bö¬]»våææîÞ½ûÔ©S“““qC¦=zT^^ž¾²oß¾‰‰‰¸æá'H_vƤ“ÄXdyÁª¯¯ïîîž››Ú¿ÿ¡C‡FGG㊌ÌÎÎnß¾=}¥°°pff&®yøQÒ—5„1Ñ$1.ë­Ù«W¯öôôܾ};îAøk›6mzûömnnîוOŸ>mÙ²åÇ1NÅO“¾¤X~ÉŽ0&E&—[IâšÉž¬L>ƒzìØ±ÁÁÁµœŠŸ¶mÛ¶%/‘_½zµäe4 "}É%ŒÙD×Lö¬L>ƒº¡¶ë’®´´tll,}e||¼¤¤$®yX%éK.aÌ&’¸f²§`eâæÍ›UUUqOAFêêê:;;ÓW:;;ëëë㚇U’¾äÆl"‰k'Ê^555ÝÝÝ/^¼øøñã“'O.]º´cÇŽ‘‘‘¸ç"#oÞ¼Ù³gÏ¥K—ffffff.^¼X\\zôhSSÓèèh___ÜÄÌkJ`Ufgg÷ïßçÎâââT*511QWW722²mÛ¶ô§ÙÁ6;XÀª´¶¶ž:uêK»J¥R%%%'Ožlmmw*€xyM ¬;XÀ†b 0 0›öÀßëë}°¾pÎ6 0o¦`¦`¦`¦`¦`¦`¦`¦`¦`¦`¦`¦`¦`¦`¦`¦`¦`¦`¦`¦`ö'h`ô"U³çIEND®B`‚gsl-2.7.1/doc/images/ntuple.png0000644016036000116100000002147113373111455013265 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœíÝoP\ÕÇñ»mÀ„Ш-:u€²Í6‰Ñˆ»‚ÿ2R&ºª%Ù7¥­X›Ú™ê8“™ºíèÔj éÄà´Qw2IM¦#G'£ ÄØ:1»S^ÄZ 2!*bB_ÐÁËBv!Ü»ÏÝs¾ŸWáÞÍîsva÷œ{î¹®ññq$Ö7¤ @G0`À €@ €@ €0`À €`q8pà¸âŠ+/^¼víÚººº¨¸¦1ïíééñûý~¿¿··×Úòp‹Øëõž8q¢®®®¯¯oûöíÁ`ðå—_ŽzÌøT“ÛGFFJJJ<Owwwww·Çã)--µ¶BœÀeíý€üñçž{n²_‰Dî¿ÿþ#GŽ|ýz® ¾buuu{{û®]»&·lܸqÍš5›7o¶°BœÀâðóÏ?oU¾þúëg?ŒÜÐÐÌ[@}}½•õà öNÂzûí· £6.[¶,%%eùòå]]]“Û;::Ün·ù‘EEE¶V€xhhhË–-Û¶m3o,//ß·oßððpkkëêÕ«½^ïáÇ'v:u*++Ëüàììì¡¡!û*@̸=úûûo»í¶¦¦¦Ø«©©¹ûî»'þ’’266fÞ;66–šš÷µ,X ý.”uÑQ›Å“°&;vìÞ{ï}á…JKKc?r`` //oddÄ0ŒœœœH$’““3¹·¿¿åÊ•}}}±Ÿ$ÆÄ.çp~‘Th Š´ZÂùE:¿BÃÎ"­‚>~üøúõë·nÝ7} Ã0·ª   ›÷F"‘üü|Ë+@œÅ<88xÏ=÷<ûì³%%%³yüÞ½{×­[7ñï²²²P(dÞ …ÊËË­­'°¸gíñxžxâ‰|pƽ¥¥¥UUU·ÞzkvvöÑ£G÷ìÙS]]½ÿ~ÇcÆðð°Ûí®¬¬¬ªª2 £¦¦¦¶¶6§¥¥ÅiƒÞƒV¡BKP¤%¨ÐÎ/ÒùI4ýñÇ?ôÐCQ‹M~öÙg{·lÙ²{÷îÂÂÂE‹wuuŸËÄçóIWøš ÷ânH3Šz[x—à"p7$”B €@ €0`À €@ €@ €0`À €@ €@ €0`À €@+Âçó¹¦òz½ÒE.È5>>.]Ã|¹\*´bžâ¾ ¼Kpìûò¤ €0`À €@ €@ €0f6}qiŸÏ']¨C…õY娰a-èéç} !Ö‚@)0þ/jÌ™»€­TTdhÔ°bšÀt A p²â”-$5Îêéynrþ—YþPç€P ¬/±@ ƒŠz&~e+=ßgš³ï«oO òz½.—+j‹T1ú4zöÌßj=ßgšcJ!€@ Àâ>pàÀ~ãÆkÖ¬Ù¼ysܽ±Ú åì\ñYÐó¿°œ/ifA?ÿüóæ‹M¯¿þzó0rCCC 0?>Ô××Ïf/*±wÖÛo¿]XX8ùcGG‡Ûí6? ¨¨¨³³s6{P‰c†CCC·ÜrËÎ;‹‹‹'¶¤¦¦ž>}:%%eò1gÏž½ì²ËΜ9wo zŽ|2 4CГî»ï¾—^zi2}måšI0LÀK gŒû^Ñ–`?vìØ½÷Þû /”––š·çääD"‘œœœÉ-ýýý+W®ìëë‹»7=;^ô€ ’©|üøñõë×oݺ5*} Ã(((‡Ãæ-‘H$??6{P‰Å<88xÏ=÷<ûì³%%%Ó÷–••…B!ó–P(T^^>›½¨ÄâžµÇãyâ‰'|ðÁ÷»ÝîÊÊʪª*Ã0jjjjkkÃápZZZܽ±Ú åÈ'CÐI3ýñÇ?ôÐCQg°?û쳉½éééMMM­­­¹¹¹¹¹¹mmm“ù{/*Q¡Ë¢gÇ‹0$@Òô€ÀlÀ €@ €†]|>_Ô|xŸÏ']8… ÓVõœ|ëüYÐL“ fA 0`À €@ €@ €0`À €@ €@ €0`À €@ €@ € ¤ @Òðz½.—Ëü£`1ì\ãããÒ5Ì—Ë¥B+æÊ­Ž*iz…¬b³ï‹‹!hÀ €@ÃA|>ŸËÄçóIWvQaRŒžS{ØêùOŠû `LÂ@)0Xˆ–a¥˜=αéy¦0[Í9`I‡sÀ(…@ €0`ÀHœ‰ …Yê ®N^ ´:îbÑ ´@²³ï‹ˆ•° &jå,ƒÅ³èD…†žý$Z­C8+a 0`À €@ €@ €0’†ÏçsMÅý”$/ÖÚÕsÅ`Z÷æH:¼ d±4Jáv„p®¨ûr³B*QaOÏqH=[…7€Ý‚@)0`À°>€:ôÈ#dffšç¯NrMcÞÛÓÓã÷û322222ü~oo¯ååàÖð¦M›–.]úÁ\èãSMn)))ñx<ÝÝÝÝÝݧ´´tttÔò gãU3NÝŽ1Ÿ»ººº½½}×®]“[6nܸf͚͛7_Ä )OÏVGáM`7-.Cjhhæ-@ ¾¾^ªì#ÀË–-KIIY¾|yEEEWW×äöŽŽ·Ûm~dQQQggg Àv‰àòòò}ûö ·¶¶®^½Úëõ>|xbשS§²²²ÌÎÎÎJp…$@¢¸¾¾¾¸¸xáÂ…W_}õc= Ÿ|òÉù?íôÉÕ.—+ Îÿ™:ƒ3F‰}¯˜èIXQòòòFFF ÃÈÉɉD"999“{ûûûW®\Ù××7ÿRž­ŽÂ›ÀnÊNÂ2·ª   ›÷F"‘üüü„€í„xïÞ½ëÖ­›øwYYY(2ï …Båååu`¯„A—––VUUÝzë­ÙÙÙGݳgOuuõþýû=aÃÃÃn·»²²²ªªÊ0ŒšššÚÚÚp8œ––6×Òž­ŽÂ›ÀnÉ4m>qu{Ë–-»wï.,,\´hQqqqWW×Áƒ'Ò×0Œôôô¦¦¦ÖÖÖÜÜÜÜÜܶ¶¶ÆÆÆ¸é @2R¡¡g7HÏVGáM`·dêR|>_Ôõ>ŸOº(˜™ =»Az¶:JÔ›0ý=á]0Oô€P  €0`À €@ €@ €0`À €@ €†Ê¼^¯ËÄçóIWÿç—®a¾\.Z1Wz¶:JÔ›÷=áM0Wö}oÐ@ €0`À €@ €†F¢Æbm,‚TXHÏåôlu”¹®„÷ +a 0H\¼‰IUæ‹€9QaŠžóhôlµåxÄÆ$,”B €†Ö¢–æ`] £Â 0=OãéÙj»ñ®ˆÂ9`”B €@ €00>Ÿ; °„ ]èy鈞­¶[Üwuúø µqJ!€@ €@ €0`À €@ €@ €0ð5¯×Ëí~$† ·2Õó†¬z¶:ñ¢Þgî èÆ¾¿ñv<) Œ‰>±ùGÁb¨D…ƒw=» z¶Úø µÙ÷7Î9`À€|>³ºÌH…Ñ3=ÇõlµÅþ ˜´$;† P  €0¬àC‡=òÈ#™™™æå &õôôøýþŒŒŒŒŒ ¿ßßÛÛ;û½€óEM{ž¾pGÔj—LŠ´e}oÚ´iéÒ¥|ðÁô]###%%%§»»»»»Ûãñ”––ŽŽŽÎf/àLQjƸIsssÔã›››Íhii(€ØxEÄô©ÛÕÕÕííí»víšÜ²qãÆ5kÖlÞ¼9îÞ9½ôlµzø‡Sä2¤†††@ `Þêëëg³•$4€;::Ün·yKQQQggçlö ’„A§¦¦ž>}:%%erËÙ³g/»ì²3gÎÄÝ;§Òž­VŸ#àpŠ AÛÇ5“`0(] 9ƒÁ£Ä¾WLh8'''‰äääLnéïï_¹re___ܽsz!èÙjõð9§H¸   ›·D"‘üüüÙì@% ಲ²P(dÞ …ÊËËg³•$tzxxØívWVVVUU†QSSS[[‡ÓÒÒâîÓ é@ÏV«‡Ïp¸d‚6Ÿ¸Ž:‰žžÞÔÔÔÚÚš›››››ÛÖÖÖØØ8™¯±÷zŠZÛ’Õ+e¨pô­gBÏV«'îç8ý|ô@"%SÄE €@ HŠº›!s¬}¨0›CÏ9)z¶ZQŸ,“°YLÂ@)0`À €@ €@ € ¤ 0ÅÄâ”æ‹`Ö´Óse>=[ ƒH,–¢@)0`À €@ €@ €H2KeMòù|Ò¸0dš››ÇM ÃpME$IA…5íô\™OÏVc6øÝ,ÄR”(…@ €0`@w>Ÿ«˜€ÄSár=/ºÐ³Õ˜¹þnD=ž_-ÀŒËP  €0 ¸¨9VL³B…ÙzÎѳ՘¸“ªb?€_-ÀŒIX(…@ €0`ÀX ]‹y½^—ËeþQ°¢Â÷z® g«a âf…8P CЀv£œ@…±&=GÌôl5€_-ÀŒ!h 2Ñ?Žq÷$n¯XB…C]=Øõl5DÌõöJ€Jè 0`À,Æ4i`6T˜»¨ç L=[ sÍ4i¨Ä¾ß^VÂ+gvPá°Tσk=[ g¢ …q0J!€@ €@ €.C0_\§\® Ðó =[$ů+’—! 0`¶›˜¥ÅÍ‘³D°kóÞžž¿ßŸ‘‘‘‘‘á÷û{{{\;477›´´´HWÈèO5¹}dd¤¤¤Äãñtwwwww{<žÒÒÒÑÑÑÄW€Ý4½sçεk×nÙ²eÉ’%K–,Ù²eËš5k^~ùeéºXŒiÀpT744ó–@ P__/U›0" "¼lÙ²”””åË—WTTtuuMnïèèp»ÝæGuvv&¼@l—è.//ß·oßððpkkëêÕ«½^ïáÇ'v:u*++Ëüàììì¡¡¡W@$:€ëëë‹‹‹.\xõÕW?öØcÁ`ðÉ'ŸœÿÓNŸ\ír¹‚ÁàüŸ ƒ`08c”Ø÷ŠÂ ´ äå匌†‘““‰Drrr&÷ö÷÷¯\¹²¯¯/ö“è¹Ì¬ž­†’øe†“)»´¹Uápؼ7‰äçç'¼(l'À{÷î]·nÝÄ¿ËÊÊB¡yo(*//—¨ {%tä§´´´ªªêÖ[oÍÎÎ>zôèž={ª««÷ïßïñx Ãv»Ý•••UUU†aÔÔÔÔÖÖ†Ãá´´´ØO«çø•ž­†’øe†“)2½eË–Ý»w.Z´¨¸¸¸««ëàÁƒékFzzzSSSkkknnnnnn[[[cccÜô ©pà©ç᳞­†’.â—Ùçó™—ïðz½ÍÍÍ—†aç—­ _âzF‘ž­†’.â—9ê¿ðçû(2 &À €‹º9Òôû#ù|¾¨x½^¡b˨pâDÏÓ?z¶š˜ë)^þ`û~»Øñ¤0}bó‚Å6Qá°Qσ_=[ ̈?؇YÐ(…@ €0`À0ƒ¨å·â.Îõ ..žÓó@=[ ÌÈŽ?‡Ø«qMEþ$UÅuÀ0±û¯³y@”¨«Yœ ó§Â!›žžz¶˜QÜþèüp5@ ô€P 7cô¢nÞ`pÿ$ÆLôùѳÕÀÅa!h”B€õ¸Pq©0f¢çÈž­.N⇠¹PXö}pL >fiÁT8"Óó¸RÏV6¡Œ aJ!€@ €@ €\ \( *\—¦çÕuz¶p,®V×âˆZ€šÕ§N…#2=+õl5àXNèÇ­0(…Û%A…ã#=òôl5àXsíÛÑE¦lzÀàhó¨'MŸD=×Ð!Vž ÇGzåéÙj@ÓÿÆ}>_KKËä^¯·¹¹9Æá[Âö½*|/ª Ft™NÏV°cÔ à:`”B €ÆLKÌuù?ƒV˜„0Œ™&mM,}5ùcÜyÔÓŸ!êJe˜©pÂ\ÉÓþqéÙjÉEo*&a_Ô‚ÕqÇÀçúx %ý±‰¡ÄÖEгՒKâ¿©æ¹þW"Wû¢ q·Wšk‡ÕÉóÂTèEéÙÔ³Õ’Kìoª‹ènοÃ:×{F±4pÎÙ0À¡|>_KK‹yËüóÒ9«U«0Œ©ç`¬ž­\æ9ø;$2  ‚¨9P–O€š>Ç*‰îº¨B/JϾ ž­Ôæ:ãIü*&[kà0 Aœ3êBžzê©„½– ½(=û‚z¶€Ú¢f]y½^ñ9Sö}Ùªð%®géÙjH0&a 0à ƒÒ%ÄA…– HKP¡%œ_¤ó+´•³&òôôôüêW¿zçw øóÎ;·mÛ¶bÅŠ¸ÿ+)¦#Y^¤óŸÐrίРH‹P¡%œ_¤ó+44™„522RRRâñxº»»»»»=Oiiéèè¨t]XÏAGÕÕÕííí»víšÜ²qãÆ5kÖlÞ¼9öÔóÊùOh9çWhP¤E¨ÐÎ/Òùšô€€yK ¨¯¯—ªû8(€;::Ün·yKQQQgg§T=ØÇAÝÿÔÔÔÓ§O§¤¤Ln9{öìe—]væÌ™ØÿQÏA ç?¡åœ_¡A‘¡BK8¿HçWhp3†¸Ì«{;–åE:ÿ -çü Š´ZÂùE:¿Bû8(€—,Y244”““3¹åäÉ“YYYqÿcÔ±ÉW_}µ`A¬v;wî›ßüfÔ3˜ Ο?ÿoLœŸ¾%JÜ={ö¬¹s?×ÿ·@rqÐwzAAA86o‰D"ùùùs}žØIfFTúÓÁ¦G]Üð‹û¢1Òw6ÿôÅ8èk½¬¬, ™·„B¡òòr©z°ƒN€»ÝîÊÊʪª*Ã0jjjjkkÃápZZštiXÌA=àôôô¦¦¦ÖÖÖÜÜÜÜÜܶ¶¶ÆÆFÒ $õ€ЇƒzÀèƒ@ €0`¨À===~¿?#####Ãï÷÷ööJWíСC<òHff¦c—?pàÀ}Zº®)òóóŸzê©ýë_Ž}à øýöÛúÈívïܹSº¨)V¯^ýâ‹/vuu9sæäÉ“û÷ïÿîw¿û›ßüFº®™?þ®»îÚ½{·?q–4ÝÏ~ö³ÊÊÊ#GŽœ9s¦­­mýúõÒÅQ]]ý£ýHºŠ)}ôÑ›nº©¥¥å‹/¾øüóÏ›››W­Zõè£J×õµwß}7++ëÕW_|å•Wn¾ùæÿþ÷¿ÒuÅúƶ6q’àO1¶­[·VTT˜·TTTüéO’ª'6Ç~÷ýú׿>þüäáp8//O°žÙ8räHff¦t3{á…6mÚ4îÈOÜ%Eijj*++“®bÎ;÷­o}ë£>’.dŠôôôO?ýÔ¼åÓO?MOO*g·Ýv[mm­yË+¯¼²cÇ¡rf0ýÅÚÄIú!膆†@ `Þêëë¥êIRÏ?ÿ¼y°åúë¯wàH~””””é7¶r‚ÇïܹsÇŽÒ…$«¿üå/>ú¨tsðæ›oæää¬^½Zº).\8}㥗^šøJ.¤µµµ¬¬Ì¼åûßÿþo¼!UÏlX›8IÀn·Û¼¥¨¨¨³³Sª5¼ýöÛ………ÒU\ÐçŸ>qÒz⾎òå—_ÚÚÚôôtéZ.hÙ²e)))Ë—/¯¨¨èêê’.'Ú?ÿùÏ‘‘¯×»hÑ¢ôôô;î¸ãƒ>.*–mÛ¶ýò—¿”®"ÚÏþó|ðý÷ß>pàÀøÃ_üâÒuÅ11ðëX'ÎEöÌ#%%ell̼ell,55UªžØ’â ?yòä·¿ýíH2ó¯îwÞùÕW_IWíá‡þÝï~7ù£?ñòòò|ùå—½½½ÕÕÕK—.ýøã¥‹šâ’K.ÉÎÎ6ŸÌÎÎ~ÿý÷¥ëšY$Y±bÅÙ³g¥ ‰vþüù 6˜ÿd6lØ`>Ó$®¸¸øµ×^3oyõÕWõí=ýï×ÚÄqÜ·Ã\ÀÖêïï¿í¶Ûššš¤ ‰e```÷îÝW^yåoû[éZ¦¨««+..68ÿ¯©©¹û«˜"%%eú©AŸÏ'TN?þñÿûßKW1ƒ?üá×\sÍo¼11]è7Þ¸æškþøÇ?J×õµÆÆÆË/¿üµ×^;qâĉ'jkk³³³.\(]××à8–.]ÚßßoÞÒ××·lÙ2©zbsø×ñÑ£GÝn÷»ï¾+]Ȭ455­X±BºŠ)òòòþóŸÿ˜·8üïïïOKK“®bŠeË–8q¼epppÑ¢ERõÄpâĉ¬¬¬“'OJ2ƒk¯½ö½÷Þ3oyï½÷®»î:¡rfÖÜÜ|“<£âIDATûí·§¥¥]zé¥ëÖ­{ýõ×Uáô¿_k'éÏ„Ãaó–H$’ŸŸ/UOò:~üøúõë·nÝZZZ*]ˬ¬ZµjppPºŠ)>ùä“k¯½6ê[Ç^k;aÜy7$-((.a¶þüç?ÿà?ÈÊÊ’.dÇŽ[µj•y˪U«Ž;&UÏŒ¼^oSSÓÈÈÈèèèÁƒ/^|óÍ7K‹µ‰“ô\VV …Ì[B¡Pyy¹T=Ijppðž{îyöÙgKJJ¤k™­üã7Þx£tSÄ8‚–.í‚öîÝ»nÝ:é*¦¸ï¾ûÞzë-ó–7ß|ÓisŒ Ã8{öìK/½äÀéW®¹æšöövó–>úhÅŠRõÌFMMÍO~òé*b±8q.®ãì_|ñÅu×]÷Ì3ÏL^——722"]×Ìû†¯\¹rÏž=ÒUÄr×]wÕÕÕ Œ=zôÕW_½êª«Þzë-éºâpÚ'^RR²oß¾¾¾¾±±±ÿûßÏ<óÌå—_ÞÞÞ.]×_~ùå-·ÜujÐóvïÞ}çwJWqAÛ·oÏÍÍýûßÿ~êÔ©‰sÀW_}õ‹/¾(]×÷Þ{ï¡C‡ÆÆÆ>ù䓟þô§?ü°tESLÿûµ6qœõípq>ýôÓ 6¤§§§§§oذ!ê$œ8ÿÐgÆ O:%]×ךššî¿ÿþììì ,_¾Üï÷øá‡ÒEÅç´º±±ñ¾ûî›x¯ºêªM›6uuuI5ƒãÇWTT,Y²ä’K.¹ùæ›9/ᦛnzóÍ7¥«ˆeïÞ½k×®ÍÌÌÌÌ̼馛^ýu銢ýõ¯ÍÏÏOMM½ñÆ·mÛvîÜ9éŠÆÇã}c[˜8® ½°OÒŸ À €@ €@ €0`À €@ à^… áëhGIEND®B`‚gsl-2.7.1/doc/images/ode-vdp.png0000644016036000116100000004422713373111455013320 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœíÝy@TÕÿ>ð3ì « Òbˆ’š¨ˆˆh©âBŠŠš©™ke–fe®fXæšš{.¹a‰hî ¢&B‚û’¥âЏ°/3¿?î÷ÇgÄaæÎœ÷ž×_8è½ïNwîsιçÞ«P©T Ë„wU€0`À €8@p€à À€0`À €8@p€à À€0f¼ ø?ÖÖÖyyy¼«(M¥Réc³ =m·² *•¼”(¥¢NÙ¡TÙ¡NÙ‰Rª(u2}–Š)hÀ €8@p€à À¸Ò¦OŸÎ» NÙ¡TÙ¡NÙ‰Rª(uê•;±º' ªÜ `TÀ €8@p€à À€0`À €8@p€à À€0`À €8@p€à À€0`Àè1€ÓÓÓß|óM…B¡¿]J_¬R©† ¡§íM_6zúôé+V$%%écãF@þpnnîàÁƒ×¬Ycgg'ûÆŒƒü<~üø¾}û¶jÕJö- ™xÇŽ.\˜4i’ÿVQžððpy+(+<<¼ÜÒß*•JÆÍyxxÄÅŹ¹¹ýo v¡á_0$ýÅ“ÌÛ­ ³PñŽÀ@þâIæUÐe«D²”…GQp€à@ïŒùg€²0à À€0`À €8@p€à À€0`À €8@p€à À€0`À €8@p€à À€0`À €8@p€à À€0`À €8@p€à À€0`À €8@p€à À€0`À €8@p€à À€0`À €8@p€à À€0`À €8@p s'$$ôëׯF­ZµŠ‰‰‘wûÆÁLÞÍùûûÄÄÄx{{_¸paĈ=>|¸¼{B¥Rɸ¹/¿üòûï¿W(ÒÏž=Û»wïþùçåu(d®@wú‹'ýÆ^NNŽ““S~~þËë@=ú‹'ý.ÂÚ³gOãÆõº à+77—w BÒcgddLž>>»víâ]‹²³³sss{÷îݽ{÷””Þåh)<<¼ÜÒßõÀwîÜéܹó´iÓ4ÿWªòÐàçϟ׫W/ àƒ>¸qãïrÄ“••õñÇçää4lØpêÔ©™™™¼+LVV–··÷Î;<èáá±xñbÄpeegg=ztúôé“'OnÕªÕþýûyW$˜¬¬¬ÐÐЫW¯vêÔ©G={ö<}ú4ï¢*-<<¼ÜÒßåà»wïÏ;·C‡²oœ ¬¬¬o¾ùæï¿ÿvww÷õõ3f̽{÷x%’ìììúõëÿôÓO)))ééé 4ˆŒŒÌÊÊâ]—0²³³mmm½½½wìØ³wïÞúõë¯X±¢¸¸˜wiÂÈÊʲµµíÑ£Gjjêøñã?ÿüsÿ'Nð®KÙÙÙÕªU³´´3fÌÕ«W»víÚ¯_?Mn©ÊdàtéÒ%***00PÞ-Ó¤R©rrrlmmííí§OŸ~ùòe›&MšL:õùó缫CVVVµjÕco¼ñÆŠ+Nœ8ñ÷ßׯ_Ù²eEEE¼«@I2Æ|||vîܹmÛ¶M›6yyyíÙ³‡omB(***..¶²²bŒ™˜˜„……;wnèСýû÷ïÝ»÷åË—y()€¥Ÿ­¬¬ÆŽ{õêU//¯Ö­[3æþýû|Ë#KæîҥˤI“Þ}÷]y7KVvv¶•••‰Éÿ5£³³ó÷ßæÌ™xxxÌž=“/% >JþX¯^½õë×8p`çÎ7ŽŽŽÆÒ˜Š•j@Ƙ¯¯o||üüùó¿þúë   ÔÔT^µ A½#155ýàƒ®^½Ú¥K—öíÛ‡……a­eÅÊ„666“&Mºr劭­­§§çĉŸ>}Ê«<²dàÔÔÔ”º‚ýäÉy÷B‡z¿¯Äk¯½¶lÙ²ýû÷ÇÇÇ{yymß¾Km¢fPK}èéé¹k×®ùóçGFFúûû'%%q©M儌±   ”””>}útíÚõƒ>¸sçŽák‹ÐÂÂbäÈ‘—.]rww÷ññ™6mZvv¶áËBNNŽMÙÏ«W¯õ×_ݹsç­·ÞZµj•R©4|ydÉÀå^Ávtt”w/t”í÷•ðòòÚ·oßÂ… g̘áïï/â’Ã(;þ(Ñ¥K—Ó§O:´wïÞC† ÁÅõr•Ûƒ‘˜™™=úÊ•+¯¾úª——WTT¦dʪ cNNN³gÏNMM½víZÆ 7lØ€)™²*ø3ÆêÔ©³~ýú;wþòË/¾¾¾G5dm”ámH:yþü¹]¡S§N)))Æ }z—.]®\¹b€Ú„ É·Xâëë{ìØ±O?ý´_¿~ƒÆÚ¢š·aHHÈ… |}}[¶lQPP ïÚ(C뤂)èRœœœ.\Ó¼yóÄÄD}×& MúÎ’7ß|sçÎ ,øâ‹/zöìy÷î]}×&Mz0%:uêtæÌ™Î;·mÛvÆŒUüô'ÑüdŒ)ŠÁƒ_¾|ùÕW_mÚ´éš5k0#Í*ÀŒ1kkëiÓ¦¥¤¤¤¦¦6kÖ¬*ÏH#€u¢yK7n|ðàÁ)S¦ôîÝû‹/¾ÈÉÉÑ_m¢¨T~0Æ‚ƒƒÏž=Û¬Y³fÍš­X±§¿JåcÌÜÜ|ܸqÒéÏÛÛ³©• ‰­­mTTÔþýû—.]„»]µhÃÚµkoß¾}Ö¬Y1bDÕ|X'• `‰t£áƒ¼¼¼Ž9¢ÂDQXXXr ¦æ,,,ÂÃÃãããW­ZXÅO•íÁH^ýõ˜˜˜ˆˆˆ~ýú}òÉ'Ïž=ÓGmBЮc^^^'Nœ iݺuTTTaa¡ìµ ¡°°P¥RYXXhño{öìyáÂOOÏ7Ê^q`hÀŒ1ggçõë×Ï›7oРAüq•}jGeGoê7n|üøñ=z´nÝú‡~¨²~Ò¥ CCCÏŸ?_TTäéé¹{÷ny …. hjjúùçŸ'''9rÄÏÏïÂ… òÖ&­{0;;» ìØ±ãûï¿ ­RÏ„GëDë–tëÖíܹsEEEM›6­š3:~u¥Ó_RRÒ¾}ûnÞ¼)cm¢Ð± —-[¶aÆO>ùd̘1Uð½rZLŸ–R§N={ö|òÉ' ,¨j—Eto@Ƙ¯¯ïÉ“'=<<š5kVužà†Ö‰ŽÌsppX¾|ù²eËú÷ï?qâĪ6‹Uñ=Hrww?pà@hhh‹-~ýõWY ˆî!cÌßßÿÌ™3………>>>â¾ÍF;²4 clذaIII¿ÿþ{ÇŽoß¾­ûE¡Ë‚:KKËÙ³gGGG;vÔ¨QUá±'`ÈõÕíÔ©Srrrjjjûöí«Ô+•dé;3Æ ÅgŸ}¶gÏžˆˆˆ?ü°J½ËA®6´··_¶lÙÔ©SƒƒƒçÌ™SužX$W2ÆêÔ©ТE‹­[·Ê²Múdl@ÆXëÖ­ÿúë¯ÜÜ\£Á0X'r0cÌÕÕuïÞ½¡¡¡~~~Ug1‚ŽÓ§¥H£7“æÍ›ýW·„\ãÉ€’’’vîÜÙ±cÇ*rŸ«¼ùajj:yòä]»vMŸ>}äÈ‘Uá¹1ò6 cÌÁÁaݺu‘‘‘]»v]±b…Œ[¦¬˜1¦P(Æ¿wïÞÈÈÈ>ú¨*LGËÛ€Œ±jÕª­\¹rÖ¬Y]»v]·nŒ[&KÞN cÌÍÍ->>¾M›6-[¶¬ ÓѲ7 c¬E‹ÉÉÉFÿUÙXÒ·oߣGΟ?ôèÑÆzÃ:X'²çcÌÛÛ;99ùÞ½{:t0ú²\.«OŸ>ÇŽûî»ïFeôÏ“w,1551cÆâÅ‹ƒƒƒ¾£dŒÙÚÚFGG÷èÑ£eË–Æýà}œ%õë×?yòäãÇß~ûm£\b‰Ö‰žòÃÖÖvûöí­[·6îבêcð!yóÍ7ÿüóÏk×®uëÖ͈ßÇ•ŸŸobbbnn®wëÖíàÁƒ3fÌøì³ÏŒø./ý„ …â믿^¾|yÏž=W®\©]P §°ÄÖÖvëÖ­}ûöõóó;tèžö X'zýꆇ‡Oœ81 Àø»zýê:99íÙ³§~ýúo¿ýöÕ«Wõ´¾ôÚ€Œ±&Mš$%%;w®GÆú>W}·appð‘#G~üñÇ1cÆe?Fß (õcV¯^=`À#›AëDs/’aÆmÚ´é½÷Þ3Öî³¾ÐÌÌláÂ…ãÆkÛ¶mBB‚þvÄ‹þº€%œ÷ïßïîîÞ®]»‡êu_\èi Z]ƒ Nž<ù÷ß4Èø2Xß,‘ú1S¦LY¶l™¾÷e0`è;?cíÛ·?zôèìÙ³.\¨×qa€sclĈ7nìÛ·¯ñ=íÄ0 hff¶hÑ¢îÝ»wìØÑøÖ%&?ìííccc333hdë Ó€Œ± >|xöìÙóçÏ7Àî ¬“—¾X‡š?¾ñ­È7@Føë¯¿öîÝ;))É»3ƒ5 c,222$$$((èñãdž٣a¬ ­¬¬vìØ‘››;`ÀcºÇÁaݺu9²dÉ’ˆˆÃìQ¯À:1X×ïõ×_ß¿DDÄæÍ› °;ƒ1À j‰   õë×wïÞݘn6d2Æ"##»uëfdlÈ6´°°ˆŽŽ.,,4¦ 6ØiPR»ví£GnÛ¶mâĉÛ©ž €µ———gjjª§¨eyxxìÞ½{ܸq»ví2Ì À}gÆX§N–-[röìYƒíT¯ |îcŒÍœ9³S§N;w6Ž÷Ç©TªÜÜ\ƒíÑÂÂbëÖ­ýû÷7Ž ÎÎÎ6d2ÆjÕª·oß¾¯¾úÊû•X{ÆX“&Mbcc‡ oÈýêa.aªëѣǢE‹ºtérñâECîWO ߀Œ±Ù³gtêÔÉîïÊÍ͵°°0555äN-,,¶mÛV\\}úÌ™3§S§NFð¨E. Èûá‡|}}Geø]ËËðS ‹-[¶\ºtÉnpàÕ†NNNÑÑÑ“'O>wîœá÷. °ö¸0c¬mÛ¶kÖ¬ 3‚·ójÃ÷Þ{oÈ!Ÿ|ò‰áw-/.ƒÉܹs/^¼(úsË96 ¥¥åÆ'Mš$úÃvx0c¬AƒsçÎíׯŸ ¯NBkÏ0K Ëõî»ïvîÜyÊ”)\ö.#^Ì›6mÚåË—£££¹ì].ÏŸ?çÕ€VVVëׯ7nœÐÏä5… yë­·"##ÃÂÂòòòxÕ ;ŽßbÆØûï¿ßªU«1cÆð*@`íñ=ìæÌ™óû￟8q‚W²à؆–––«V­úôÓOdÈŸ°Há[Ìk×®ÝСCÌÏÉÉ1ð}Àå>|xÓ¦MÅšÌGkû˜1æîî>aÂAWór½IÚµk×£G/¾ø‚w!Ú ’}ô‘££cTTïB*BF~ÿþ}á&còóóMMMÍÌÌxÂc3fÌkY%X{˜16nܸ۷ooÙ²…w!•F¤cQQQñññû÷ïç]H¥iC…B±jÕªï¾û.??Ÿw-•C¤Ã377ïÝ»·pË*‰t£%Œ±þù‡w!šBkȹÏÜÜ|ùòåãÇn•ÎàÃÖÖvÖ¬Y"¾b…Îéïµ×^{õÕWÓÒÒxR9t1æí횚ʻŠÊ¡Óƒ‘´oßþÈ‘#¼«ÐX{D˜1æççççç'Ü3¢IûêÕ«'âËnétbcîîîׯ_ç]Eåj@ooïÓ§Oó®¢rH5 c¬}ûö‡æ]…¦ÀÚ£ÀŒ1WWWጕ••ÅëI&e¹¸¸ˆø¦[R¡ˆLªèêêjnn.ÖƒM¨€ýýýÀU©sŸ­­mVVï**‡TŠÀtN"0µœp³Ð¤Ž@Ƙ‡‡‡‰‰É¿ÿþË» €µG*?lmmEÓùêÚÛÛ ÷D@Rùáîî~íÚ5ÞUTµœpLê”´k×N”A0X{¤ØÎÎ#`9;;‹5.,,T©T¼ ù?uëÖnLªÈ¼ L­Ãó÷÷eX{¤òÃÎÎN¸0µ¾³p³ÐÔÂCÐ0©ƒPÄ0©ƒ1Ö¾}ûC‡ñ®B#`í‘ `\ÖpL-<\\\Š‹‹ÅºŽZ'¦nݺOŸ>è8¤Ö€L¨ËÀ`í‘ÊAGÀ¤¾ºÂ0ÁsŸpë°¨„ …ÂËËëÌ™3¼ ѵ”ˆr¬=RŒEXº1€é’ºuëŠ5 Mm‰6 M3€E¹ ŒÖRaaaqq±••ïBþaéÎÙÙùñãǼ«¨‚á!ܘZ/ ÀÔB&Îe`°–H=D‚ ;Mê«+\ á˜ÚAÈ `j!ç20XKÔFoX„¥;ᦠ †‡XSÐEEEEEE–––¼ ùFݼy3;;›w!¡ÀLËÀ`-Q GÀÔpÂ0µd¢Ý‰D°Ã333kРÁ¹sçx¢‚¡DˆËÀ`-Q àjÕªåææ*•JÞ…Tµ6.€ 懻»ûÍ›7E9ÉŽÞš…&xJ„¸ ŒÖµðP(ÖÖÖ¢L[I¨}u… `‚ƒ++«êÕ«ß½{—w!!Ø€±˜f q¬%jÌ\M­ ]\\Äz#!ÍsŸ@³ÐÔº€%À² ¬%jáÁ¼ LmüQ­Z5…B!Ð,Íüè‰ÐÔŽÀ^^^/^,,,ä]ÈË‘mC&Âe`°–°X ¡U*UNNµ¯®X³Ð4Ï}݉DvôV­ZµÚµk_¾|™w!/G¶ ™—ÀZzþü9µkœ››kiiijjÊ»ÿ.€©„ SÐ2ešrÒ¿ ŒÖÁ~ŸXLsôæââ"г8„L¨[i6 DˆV©T¹¹¹ÖÖÖ¼ y!??¿äädÞU¼XKbMAl@&Ú:,šm(Ð4Í”ñbàÜÜ\ jóXêªW¯þôéSÞU¼XK¿ºÂ€©5 m šæìßk¯½–‘‘‘››Ë»—£<nÞ¼yjjªJ¥â]HE(7 „øY¬%‚ù!Ö˜fxˆõ8hšÓø&&&o¼ñFZZïB^Žr~8;;ÛÙÙݸqƒw!¡ù-V‡6N˜ø¡V Íðî0µƒP"Ê:,ša ú—)÷`$ÄÏŠ`- `±FÀ‰6M6?D¹˜lFB?€É%ÀƉ`~?ÔJ!Ø€Œ1ggg˜l~ˆ²‹øŽ~o@Fþ¬ˆÖÁükL3<K¯Ò³²²â]H90-‹fÍšÑ`‚ßbu¶¶¶`#Dðȳ³³{öìï*4E³ï,PgggÛØØð®¢|¢Ü Ló ,áææöðá‚Þ…¼åƒPboo6BŸ„%Ö˜`2ÆjÔ¨ñèÑ#â÷~HÎÁ”%€)·!cL¡PØÛÛSîU‡”‚°q"øÕëmH4–––”¿±%(ŸûMMMé¯'§yª#>­E|Ÿ‘?+"€µ¡T*óóó©Í½_nP ÁŒD”Yhâç>!BSîÄHè€)„ŒüY¬¬¬,…BÁ»ÿk šì¹O”&Û€!ÖaïÄ0ò—0À:Bkƒæèø¡V ÙsŸ(L¶%¢Œ€)·!aLðL¨ÎÆÆ¦   ¨¨ˆw!åCkƒf‹5¦Ù†Lœ&~î£+0Í7R—B?€‰7 c¬ZµjÙÙÙ¼«(X4ÃÃÌÌÌÌÌLˆ‡à3ªmÈÄ `â#`úSÐyyyÄßäÃÈ0ñƒPByj¬ ²áA|ÉŸ:²8QÞÇ@¶%ô§ …½`!Úll(0ÙC­²m(ИfJÜÜÜnݺU\\Ì»ÂèMwÄ{ÊmˆÖÙsŸ@—ÉžþDy!ñÁ‡¥¥e5n߾ͻ"<0ÖØØdeeÙÙÙñ®¢”µRÈvb?÷Ÿ…¦ß€ ,ÊgE°6Ȇñ箕 ù$‰(/D¢?€#¾Kˆð ÀBtbÀƆl‹²+;;ÛÚÚšÚ“L$Ë…øHô{0Œ| щ©Z|óæÍÐÐP{{{{{ûÐÐÐ[·nɾ îÈv”5u”Ï}...ôßÇ@ö ,áîî~ãÆ ÞU¼ýdä˜þÔŒöYQæÎÊÊ lÞ¼yZZZZZZóæÍ;tè““#ï^¸#;eÙdŒ™››ÛØØ+ÊÀ;wî K”Œ¥¥¥J¥*((à]H9Ìdßb:u¶oß.ûfé ¢LAÏú,JxP`âa ²Ã%€ÙÿB‘†Ë ‰ÐmH¢ ÀVVVJ¥²°°w!/A¹ cÕ«WòäIqq1ïB^H”ð | X”ü ;-J2ÂSƒàJ#B<’øÎÔÔÔÞÞžlr0òa GGǧOŸò®¢|ÄÂdÃC”d„§À•FüÜGöPSG¼ ùYhQÎ}d§ ‹‹‹ ­¬¬xòrëŽl'\iÄÃCˆ…ÐôgP‰0ý” `Q`Úl<è0ÍCMñ6däX 0Í™|FodX 6${VDWñðb š~~Ð`!Î}d練 À¢´!ÙyAp¥`²‡š:âmÈȰ(³˜‚Öå¥ 16ÄÃþ¸¨¨¨¨¨ˆøúâïceðA6€ ²,P'l<ˆu选7 #`Y` ZwdXˆ/²l<ˆ€Éj%ˆ7 „øûDÉ SSÓœœÞ…”&J†!€å@ö¬ˆ®4âùAÿABœû0– Í…Ð…‡………‰‰I^^ïBJ¥ÈÀÆ$++ËÎÎŽw/Dÿ0ñŒ„~ÓoC ÍYhƒ‘ ô$†6&ÄÏ}B\¦Ü€â,DJh®Ãh ‘ àììlÞUh l<è0ÍC­ñ”899eee‘}­…@ùA3€š‚fTX ${VDWñüb šþWW¡P8::fddð.¤|ëH dTX ${VDWñ¦?M¼KPž…¢#¡¹K d$X¬ÄØxϲ}½Ä°ÙV©Tyyy¢\#»K ü Àb5 Øxïú‘=ÔJäääPnÀdoÎÉɱ´´41ãËëàà€ÖXGdçÅø“Bü6$²‡Z QFÀµjÕºÿ>ï*Ê!JJh^« i°@ hnnNó^jpåäç盘˜˜››ó.ä…„˜‚¢ïüÊ+¯¤§§ó®¢b…ÍnGíK-V2’mÈÀ•EÿÜW­Zµ¼¼<¥RÉ»¢ß†WW×{÷îñ®¢bûÈ^â ”‹Ò.Asj\9ôÃC¡PØØØdggó.ä…è·¡#`YЋ•öööÔFobõFÀÆAˆsñYhQ”GÀB4 „f‹•vvvÔFÀb5 C!˜ædK !ÚÑ tî£y°X‚SÐ`Y €+Gˆð y¨•%?jÕªõðáC‚WÓÅ GGÇgÏž©T*Þ…ü‡X2¦À„ŒêY\9B0ñ)h!Ú1fnnnooOðV`Qz0333+++Rdnn®¹¹¹™™ïB4E0€Å:Ø8ħ ê;Ó¼ ,PJ¨-„nú”` ׆`c Dc,š—…|P[‡%\¬;°1xþü9ý¯.ñ°@ùñÊ+¯Ð‹Ò€j,Ð(©V­Z~~~QQïBþG¸ƒæ°\9=rppà]ÅKÐìëI c¼ ш««+Á°p8j,\x( jù!\¼—š!€+kçÎ;wæ]ÅKPû®ª#þ$íRh^nçääDêN$áz0ŒÞ,´@’$4ÏŠàJHIIÉÏÏ÷õõå]ÈKØÚÚ’‚+úÈÊÊŠw!•fooŸ]\\Ì»ñõ×_ ô"Âtxâĉ"¶!Á¯ O õÏ333 ‹ÜÜ\kkkÞµ0öÿ—_ýöÛo¼ ц««ëßÿÍ» –‘‘}ñâEÞ…hÃÄÄÄÖÖöÙ³gNNNËHMM=þüöíÛ9Ö 5"›••Æ»m `Œ€_"33óÈ‘#Ý»wç]Håš…Þ¿¿‹‹KóæÍy¢ "#à%K–ôêÕ«V­Z¼ Ñ…ËÀ‘‘‘_~ù¥¥¥%ß2´CáQ”J¥rúôé³fÍî º„ÔYQ"d;Ò¶mÛ:uêDÿ H¥Z‡µ|ùr—_I(<º°°pÙ²ecÇŽå[†.¸ß‰tñâÅÄÄÄáÇs¬AFÀ›7o¶°°èÚµ+ß2´†°x„›–Ðé륧§>|X”[¨Ë¢°kÓ¦M5jÚ´)ß2tÁ}9nÜ8"e´À=€‹‹‹#""¢¢¢„[„_,˜Ë—/Ÿ9s&88˜w!•FaÂJ²zõê¾}ûЏüJR£F'Ožð}úüùó?ÿüsŽèŽoÿý÷ßñññ}ô¯tÇýe «W¯vss àXƒŽèœK`Ö =þ<444**JÄu§DFÀ7oÞüé§ŸvïÞÍ»환˜¸¸¸Ü¿Ÿ×ã—ãââòóó»téÂeïrá{'Òwß}7fÌžZ–tQI¥Rq€æååEFF ºŽ²Á0¸|*•êƒ>hӦ͈#x×¢ ×€srrzöì9a„fÍšñ­DGÒ:,.|ïÞ½?üpÁ‚âÎûI8Ž€SSSwíÚuõêU.{—‹™™™¥¥eNN—g@.]ºÔ××—þ«Ð+†Æwß}w÷îÝ7ò.DKÜGÀ*•jèСM›6?~<Ç2dÁë2pnnn=FŒѳgOÃï]^¼øÖ­[Ý»w_ºt©£££á÷./é2°á8%%%**êСCÞ¯ìlmm)ÜÑ ×€ËqàÀ%K–lÛ¶MÐ;gqÌœ9óÖ­[Ë–-ãXƒ\¸Ü‰¤R©† æîî>yòdïZ¸ðóçÏCBB>ÿüscW;;;ïú~ýzHHÈÒ¥K5jdà]ˎ¼`)—vãÆÁƒoÙ²E¬W®–Âw²eÇŽË–-;yò¤¸=u\FÀS§NMKK‹}òYbø.,,ìÓ§ŸŸß_|aÈýêáB?~ü888xâĉ½{÷6ä~õSÐÔåææ†††N›6­]»v¼kщôà!.»¾téÒ¨Q£bcc…îÁ¨{å•W.\¸`È=nÙ²eãÆ‰‰‰ÆÑƒa<xìØ±fff‹/6äNõÊÀœ››Û½{÷>}ú÷Þ…!À˜‚þŸ¢¢¢Aƒyyy }»‚„סöøñãü±eË–†ß»žx|üøñ±cÇîܹS Ç¿”“““!Ä1sæÌäää­[·ŠøÈâ1d÷ïßßÃÃ#22Ò0{4.sø3ž£SGyyyýúõ+..Þ°aïZdÀ%€ÓÓÓƒƒƒû÷ï?pà@ïZ¯ y øÜ¹s}ûö]»v­§§§aöh†¯_¿~ÕªU'Nœî¥ñ3äm¬Ÿ|òI~~þÊ•+ã ˆ„à5`º#`C¾;%++«k×®666Û·oñ®ß² ¨]»v­mÛ¶½{÷ž9s¦!÷k'$$tìØqÞ¼y¢ßõ[–ÁøçŸž8qâüáêêj€Ý’aFÀ*•êË/¿LNNŽŽŽ677×÷î SК:uê”Á®Âfddyxxüúë¯FsÀø6¤sçÎùûûñÅS§N5ØN ÆÕÕÕ#àíÛ·÷íÛ÷×_ñ­É/e€V©T“'Ož7oÞÑ£G`ÉnYàüüü&&&8p@ܧ׽XSMš49þ|FF†¾wtÿþýÀÀ@??¿ŸþYÐW|”Ë·!%%%uîÜyΜ9£G6Ì ÌÚÚÚÊÊJ¯—0׬Yóé§ŸîÙ³§C‡úÛ G¶¶¶yyyzÚ~QQÑÈ‘#|øÎ;;vì¨ï}ñ¥§ËÀùùù#FŒØµk×ñãÇuÜVBO³ÐwîÜñ÷÷÷ððøí·ßllldß>ú›‚NIIiÓ¦ÍG}ôÃ?ÓD`) …ÂÆÆ†Ô:,ºm­¿V*•3fÌ9rä¶mÛF¥]p§ïÉ–çÏŸ‡……mذ!11јî8z}¼øúõëmÚ´yúôé¡C‡ŒéŽ£ÑGÇÅÅùúúöïßÉ’%¦¦¦ònœ=ðÆƒƒƒúé§1cÆÈ¾qj¨]¦{R“&M²²²nܸQ§N7›‘‘ñþûïggg'''ß:Éz_¸p!444 `ýúõF󤈊ɾ+66väÈ‘“&M;v¬Œ›¥LÞ")•Êo¿ývéÒ¥6l ”k³”ÉÀ999cÇŽ=~üø„~Û´æ¨0ݰB¡èСÃdÜfJJJ‹-5jgÄé˳´´|ýõ×SRRdßò¯¿þ8eÊ”¥K—V‘ôe²Ž€‹ŠŠ¾üòËÏ>û,66¶ê¤/“uüèÑ£wß}÷àÁƒýõWI_&÷}À/^ôóó+((HNN®"éËèÝ L7€™¬³ÐJ¥Rº½röìÙsæÌ1¦çã¼È AƒÖ®]+ã³³³G÷þûï˸eúäZ„uûö퀀€K—.:uª*LÝ«“+€ÿüóOŸfÍšÅÅŽú꫺oP2ހ׬YÓ¾}ûñãǯ[·Nè×$WFÀ•¯û¢µëׯnß¾=11±oß¾²ÔFß Aƒ6oÞ\XX(ËÖŽ?Þ¬Y³¼¼¼äääÆ˲MȲë—_~ñññéÖ­ÛÎ;ò6ŠéÀÓ§OïÝ»÷âÅ‹£¢¢ªB7Z,ORÌÌÌ8pàܹs>pàÀ_|aÄËë_dРAëׯ×e gÏžmÕªÕõë×Ïž=Û£G¹ Ž.#àèèhoooOOÏÄÄÄ&MšÈ[˜@µ»µ°°pöìÙÁÁÁŸ|òIlll•švVgmm­T*µ{˜É“'OF5nܸ 6,X°À¸ïת÷¥—B=“:vì¨E+•Ê%K–4mÚ´E‹§NòòòÒGmô………}ú½÷ÞÓGmbQ(µjÕÒ|º¨¨hîܹ͚5óòòJNNöööÖkyB¨ì5à§OŸŽ;6$$dâĉ111¯¼òŠþjEeBߺu«OŸ>'Nܺuë¼yóªìÀ·„SЉ‰‰z*†Ñ`{{û¦M›;vL“¿œ••5~üø.]ºŒ=úðáÃUó"G)ƒ^·næ?--­gÏž&LX±bÅÆqÖ+¡ùeàãÇûøøìÛ·ïÏ?ÿ ¯âß• à76jÔ¨  àÂ… è–Ðü2pAAATTTóæÍ›4iræÌ™wÞyGßµ ¡RüèÑ£áÇ÷éÓGõP`¦Ù,´J¥ŠŽŽöôô|òäÉùóç‡Z5×¹”Õ±cÇ›7o^¹rå¥SúƶhÑÂ××÷ìÙ³ÆúV­irøÑ£GÆ ëß¿ÿäÉ“÷íÛ÷æ›o¦6!hÀW®\éСÜ9s~ÿý÷Ÿþ¹ .¯€†|ðàÁ¦M›þùçŸ'Ožœ>}ºq¼bUÞ¬T*þùgOOO{{û‹/ê¯8((¨âÇq$''·k×.**jÆ «W¯®âW+K155}ï½÷^:þý÷ß5j”˜˜˜””4yòd Úʪx\XX8þ|OOO‡‹/†……²6!¼4€Ÿ>}úõ×_·mÛ¶gÏžÉÉÉ~~~«M/½„yãÆ°°°Q£Fýðñ±±Uê¾Mh2>yò¤ŸŸß¦M›<8wî\½Þ÷!s'$$ôëׯF­ZµŠ‰‰Ñ}›-[¶¼víÚÇËþêöíÛƒîիׇ~˜œœÜ¶m[Ýwg|¼aÆÝNššÚ¾}ûˆˆˆåË—ÇÄĸ»»¸òìÙ³AAA“'O^´hÑüñÖ[oq©M666J¥²ìJòØØØ&MšìÚµëÀË—/7îgÄê¨Ü.,,\¼xqƒ 222Î;7uêTc}Ÿ î^ÀOŸ>8q¢Oýúõ¯\¹2hÐ ]ÄTÉj„ J¥²ägΜ©W¯ž&ÿ°âJ.\8lØ0éç‚‚‚Å‹¿òÊ+¼yó¦.ÕVóçÏ2dHÉ333¿ùæggç‰'>{öŒ_]"‰íÖ­[ÉÓÒÒ†êêêºtéÒÂÂBŽ… ¤V­Z÷îÝ+ùcbbbûöí7n¼wï^ŽU d„ ßÿ½ú'111 6ìÔ©Ó™3gxU%”””fÍš©"Š««ë°aÃîܹSî¿’=(ÿ·e=mW’maa¡Qþ^¼xÑÍÍM©TnÙ²ÅÃãsçΩ©©2ÕX%Ü¿ßÉÉ)+++''göìÙ5kÖ>|ø­[·x×%’ääd•JõðáÃqãÆ9;;O™2åéÓ§¼ëIƒ .]º¤R©Îž=Û½{w77·U«Vñ®KS§N•~Ž‹‹kÕª•——מ={øV%«W¯–Œ ‹ŠŠÖ­[çááñÒî‹þX¿÷ÈîÙ³G–ç¿õÖ[ÅÅÅ^^^–––?ÿü3èVVÍš5Û´i#ÝÕªU«„„„ ð.J0®®®·oߎˆˆX´hÑ€.\¸P«V-ÞE ÆÑÑ199922òСCÒÍ©Uç…Z²°··¿~ýzbbâ”)Snß¾=cÆŒ¾}ûâê›æ¤)h¥R¹mÛ¶ððp—U«Vµk׎[Az v•Jõøñã $$$hò—_ZÉŒ36oÞ¬>¿ •”œœÌ»Q˜™™ 4èÚµk¼kUçΜœfÍš•••Å»!­^½ÚÁÁAš9À…-H“²M›6õóóÛ¿¿†ÿJA©¶.»û÷……‡‡køä3…B_•€D¥RáÞh]¹r3ºØ½{÷Ûo¿íèèÈ»QÅÇÇŸ?~Ô¨Q˜9ÐZË–-§M›V©÷yè/žtÚ®ú ]};wîÜéÚµë?þ¨ù\ñ‹²aúôéáááZW ‰ððð3f”û+Š\®»wïvéÒeþüù•º­#` Hñ$óÕûtéÒ%** 7•T@æ`oÞ¼ùW_}Õ¿ÿJ×0ÐCôp9›+ïRnffæK—] €€ ýÅ“Ì÷#D4;¸8@p€à À€0`À €8@p€à À€0`À €8@p€à À€0`À €8@p€à À€0`À €8@p€à À€0`À €8@p€à À€0`À €8@p€à À€0`À €8@p€à À€0`À €8@p€à À€0`Àè1€ÓÓÓß|óM…B¡¿]J_¬R©† ¡§íM_6zúôé+V$%%écãF@þpnnîàÁƒ×¬Ycgg'ûÆŒƒü<~üø¾}û¶jÕJö- ™xÇŽ.\˜4i’ÿVQžððpy+(+<<¼ÜÒß*•Jû¬V™´¸¸8777õ¿£É.4ük†¤¿x’y»t*ÞÒ_<ɼ ºl•HV€²ð(JÀè=€1ÿ PFÀ €8@p€à À€0`À €8@p€à À€0`À €8@p€à À€0`À €8@p€à\iááá¼KÐê”J•ê”(¥ŠR§^)T*ïcL¡ RÉK‰R*ê”J•ê”(¥ŠR'Óg©p€à À€0TÖ¡) Þ%”COAI%€ªLAp€à À€0`À €8@p€à À•¾yófhh¨½½½½½}hhè­[9#í4IDAT·xWôRRR>þøcGGÇr_A§ì„„„~ýúÕ¨QÃÁÁ¡U«V111¥þ‘R‡îîînaañꫯýöÛoë,%==ýÍ7ß,u Ð)UQÍ:cJ¥rÑ¢EžžžVVV7Þ²e‹úo‰”Z¶= ………µ:cÅÅÅ‹/öññqtttpphÞ¼ùâÅ‹‹‹‹ –zàÀ·ß~ÛÚÚºzõêƒ ºÿ¾úoùÖ©Ëy^—ÊIpVVV```óæÍÓÒÒÒÒÒš7oÞ¡C‡œœÞu1ÆØ AƒjÖ¬yüøñ²¿"U¶¿¿ÿÇcbbîÝ»·hÑ¢ððð•+W,uìØ±ÞÞÞ{÷îÍÊÊ:þüW_}5sæÌéÓ§S«SJ¥2dHDD„ú‡ÔJUýÙ:?þøã³gÏÆÆÆ>{ölíÚµk×®%XªªŒyóæõíÛ—ZŒ±Ï?ÿ|ýúõóæÍ»uëÖ­[·æÍ›÷Ë/¿|þùçÔJ‹‹ëß¿ÿˆ#nÞ¼yåÊ•€€€^½zåçç©Së󼮕—=Ô oîܹTÿdàÀ ,àUO¹Ê¶©²'L˜ T*KþxæÌ™zõê•ü‘T©¥üóÏ?ŽŽŽÒÏ4ëüñÇ ¤úï1@ªÔ ¾È¤êŒïÖ­Û‹~KªTuÅÅÅuëÖMJJ’þHªN;;»ëׯ«rýúu;;;ég:¥¶k×nÍš5꟬ZµjñâÅÒÏtê¬ìy^ÇÊIp@@À¾}ûÔ?Ù·o_`` ¯zÊUö å²³³³-,,JþH¹Ô´´4gggég‚u¦¦¦6lØðÙ³gªÿ¤J­ €IÕÙ¿ÿ½{÷¾è·¤JU·cÇŽÖ­[—ü‘T5jÔ(À5kÖ”~¦SªµµõÇÕ?yðàAPPô3:+{ž×±r\³fÍôôtõOîÝ»çêêÊ«žr•ýC¹ìmÛ¶5oÞ¼ä4K}òäÉ‘#GZµj5eÊéjuæää4iÒäĉÒÕR¥2ÆjÕªeffæêêúÞ{ï]ºt©äW¤êtssÛ¶m[»ví¬­­mmm;tèpìØ±’ß’*U]@@ÀæÍ›KþHªÎððp??¿„„„gÏž={öìÈ‘#¾¾¾‘‘‘Òoé”Zn—TB§ÎÊžçu¬œD›››¨RPP >€£ ìÿ²e?~ü¸Aƒ %ŸP+Uý"HÇŽ‹ŠŠ¤Ï©Õ9zô興ˆ’?ª¤JíÞ½{BBBnn®t°fÍš©©©Ò¯HÕiiiéìì¼zõêP­Z5kkëwÞygË–-ë4ð4‰Û<==Ïœ9£þÉÙ³g5jÄ« Q+ûîÝ»ÁÁÁsçÎíСC©_Q+U]‹-}ªW¯®þ!©:ïܹӢE õOZ´hqçÎégR¥úûûÇÇÇgeeåää;vÌÁÁ¡uëÖÒ¯HÕYJŵéX9‰îÖ­ÛºuëÔ?Y·n]÷îÝyÕ£!Re?xð K—.QQQeKªÔRþüóφ J?“ª³‚Þ1µRKÙºuë;ï¼#ýLªÎ^½zíÞ½[ý“]»vùúúJ?“*•1VXX¸téÒÏ>û¬Ôç¤ê|ã7N:¥þIRRRíÚµ¥ŸI•ZÊ’%KFŒ!ýL¹ÎŠkÓµr GÊzõìÙ3ww÷o¿ýVºŒ1sæÌzõêeeeñ®ë?ʶ©²½½½7mÚô¢ßÒ)µS§N111÷ïß/((¸}ûöêÕ«_{íµÝ»wS«³\êÇR£££ïÝ»WPPpíÚµo¿ýÖÅÅåÔ©SÔêT©T¹¹¹o¿ýv© %ëH•ªR©6nÜØ±cDzŸ“ªsÑ¢Ennn±±±™™™Ò5à×_ý§Ÿ~"Xj×®]SRR þý÷ß‘#GŽ=ºäWtê¬ìy^ÇÊI°J¥º~ýzÏž=íìììììzöìYêÚG÷Zè”]n™™™ÔJïÝ»·³³³™™Ù+¯¼š˜˜¨þˆÔY®R_N"¥ÆÅÅõêÕKjÒ×^{mРA—/_&X§äîÝ»trr²´´lݺu©õ ¤JõóóÛµkW¹¿"UçÖ­[[µjåèèèèèèçç·eËõßÒ)uóæÍ5²°°hذáüùó‹‹‹éÔ©Ëy^—Ê/Ú7è‰kÀU €0`À €8@p€à À€0`þéžÓH‚IEND®B`‚gsl-2.7.1/doc/images/qrng.png0000644016036000116100000006446113373111455012733 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœí}Œ]ÅyÿÏ]öîâ8 f_x³µ‚ ˆBAƉ Ù%F‰Ð²ô%ecõ!KÔ䨥ݼ¬•FŠ»¼TU‹]§¶ $J#¶ÅÒD4€@©B¥$ë5]l±¤ûÍûüþ8ùî9gî¼<3ósŸÏ\®ï™}¾3ßç™9sæÔâ8ކa†qK—ï0 Ã0L' ˜a†a<À ˜a†a<À ˜a†a<À ˜a†a<À ˜a†a<À ˜a†a<À ˜a†a<À ˜a†a<À ˜a†a<À ˜a†a<À ˜a†a<À ˜a†a<€•€Ÿyæ™ÉÉÉ 6Ôj5ßma†a‹`%àmÛ¶õ÷÷ÿèG?ò݆a†±K ó}ÀµhÆa†¬0S1öïß?44ÔÓÓ344´ÿ~ßÍa†‚0c‹o}ë[Ÿþô§9òæ›o9räÓŸþô|7Šù\aºt1$J Û·oߦM›êõú¦M›öíÛg¯UŒÃÃÃ-í÷~ï÷|7ªÉ¬_¿>Õeýúõû÷ï÷ÝÌŽƒua‚OÀ<©b†a¬b)Ó¿ý×ý×-Ÿ`N³"‡‹ zKæ-l©ß»ºZ{×ðð°Éﻌ¡6h,\‡È£ÞÞ^ß-}haÌcØÂB]z{{iu :Œ^–6 ! È7•*ò #ï²JÈwg¡Ö^Å2oaÞS²9xýúõ0ù}ØîšEÐH/†R8@ò>`X‘ãLkmQ [X¨K¾6ª|ÍZÖB_«ñe«¥ËÊ#ÿ“wYy”ºˆ³‘ }çÕ¼…yOI|*åà»IŒg(…$i@¶1†µ‘29ÏÖ&¢¶°P—ýû÷Óê"ßH_;iÊZèkIYÁjér Ž&ÿ·¬¸´¥.â,yh/ ˜·Ðv1E‘¤GxÜ—‡f(…žEaˆ”~J2ç¹/&¢¶°,×Òv]ÉFzÜüUÖB_K›e«¥Ëa%ਙEë¶’c@©‹¸1”Ø š·¼~ÏÒ²ÛNà~·’¢J\ÔŸ {£j´%sž›ñb"Šy ­–‰É'ÞØöÇ=>°PF_K›e«¥Ëa%`=h£#o(J]Ä¡ÄY¤…öþDb(¶gð„½Q5Ú’9ÏÍxÑpùTš(Š`zT­ŠÓébµ6Š8 Јþ µ-æFPö ~·zÚ–Æž§ /*R£w0yuŸ›+àc„ºØ[ ˆ8 Јþ Õ#~÷gÙ–†ÄS ‡t%->! £·zkI€—²µ>†¯ '`Ñ b†Jõ#ªøÝŸe[sO i|+Ñ#£÷"/ek(>FþSòè X„FtüÎP%;"Ôñý®›àq‰óœ.ÔucßF/oÜCä¥l h¥Í—›‘è X„ :¾Ö£ÈwD¨ãû\7ü9Q_+W&!oõz]cHûÝþÛZ­Öòç l²S%/JWW—†EBÝp©À¨Éëº(q%t!)Œx4 ö¢ãm0¡Åô<Å/-%| ÞïVjÐ"J6ûªZ¤ßUßìÕëõzè£F0X¥¥ ¨YI #U"NÀlD'í²y+ñ»ˆdˆàï ¢ΗðÙá²ÉN• ¤®–Â(_F„XU#oU¬f¥*Œ”ˆ8 Ž Ë†xL|!Îì  R £´ý®’ä £–…tLT”5+ÈZ‹³Â(â,€<:ù.«w¯Tü›JÅyÔSÈ›V¡Ý5”„j+Y ê*JyÍj" ­931NÀ"È£ccvhò›6l(PO!o6ZaDû›Îf*–¬POpQC.ö!÷1g&Æ Xytl¸‰ÉoZÚ»¨§Ð6­0"Äeó,Y¡†:à¢$¸zäÒh>ææ¬@NÀ"È£cÃML~ü~m ‰<°0¢¢móðÏÓP\”ØG‰²ð îcq¹4'`Ùè Ÿó¢ý›È÷k%Ý6IW¸07/ˆ™¢†:à¢ÄÎ #r´‡ ²%”Ià XDO!?È÷ke& º”QÉÂ(n×<ü™b‚ª:à¢ÄáF‚Èë dK(“†°ˆ4:žbiü”õxïŲ̄A—ÚpЏy 3ÅŽªV‚(ŒûeÒœ€çççÇÇÇF£Ñ?zô¨àËÿþïÿ¾uëÖÓO?ý¬³Îúä'?¹¸¸(s‰4:žârü Ë2]b;á7AófŠ^\Þ»dAFîëïºÄåÒ„š€WVV†‡‡§§§—–––––¦§§7oÞ¼¶¶VøåG}ôì³ÏÞ½{÷±cÇŽ;vß}÷mݺõÿþïÿÚ^%‚§¸?ŽIá‘™p è; ‚•´a¦èÞåjÖ¾0Š×ŽuQ]]MÀ333ÙO&&&víÚUøåk®¹fÏž=ÙOî»ï¾{î¹§íUÒè xŠËñãrFHÛ|ƒ Kì*\íqõ^(¸Ÿí!Ô¬b@‹ã:|á0 4ŒŒÌÎÎf?™-üòºuëŽ?žý䨱cþð‡Û^%’ØíÌk\Ž—ƒÄÞ¡Ñ‚c‹™Òéá~¶R³ŠA,Žëð…Ã(ÐÜßßßrwaaapp°ðË… ¸ìËYÚFg}ƒ—ƒÄÒ©Àa-8žÕq¸AÙoºŸíT³æ©ªÅð ‡Q  ¸^¯7›Íì'Íf³§§§ðËW_}õÞ½{³ŸìÞ½»ìËYÚF§Â'I…>}tœ?„Ëñ¬Ž<ßÛpy“û´]³‚l¶øÂaÔ øàÁƒçœsÎÞ½{?~üøñ={ölܸñôÓOo{•¨„©©©ä 6&%A/ýi€sÖ ﺈ…ÿR .•9œÝ¥"—Ɔ!Ì"·D0B§¦¦¢,5h :ŽãÇ|dddýúõëÖ­ûÀ>ðÀ µ½JÛèØ˜”@yJ¨“¼‘?T) T/Õ@{‰‚¦ò¯+ÃÍÏBMÀJ›°ò<òÈ#7ß|sÛ¯µŽÙ²§Ž«Î<)ÞæÅA¡4 'ý:þMZ‚¸K…ö*07ØØË¦J¨ xÇŽùÇvîÜ)ùÏo¸á†Ç{¬í×d¢C¾î„ì)&ã* §h AÖŰ8p# Ú›HÜ -ã%\ÚË!W«)znF;XBMÀËËËCCCÛ·oOâ^]]=uù·ÿaûØÇžyæ™f³ùË_þò¶Ûn»ýöÛe®¢‘=Åd\Q @ÖŰ89HD/àÜk,DO¨%\#W«)znF;X¢@pÇssscccÉQ”cccGŽyÛåßþ‡Ýÿý]tQOOÏ…^¸sçÎ'NÈ\B;:€/c'Ád\!ņ%Ôj Aœ”ƒ Nµª§ rµš¢çf´ƒE;Å´ÿeK¿ëíè 8Z v½÷¢ÇâÑÎŽö.M “r@¤1Ø@ïû›Ú¢çf´ƒ…°íè 8Z‹•ôöööõõy|Ÿ±÷¢Äâ [R¯×=.ux—&†I9yiÜ7Á@@tÁy‡í`á,B;:Ž–·òߥu+)l‰GQ¼ßõI9…Ò¸×Á@@tÉ»Y­VóÕWy´#L¢ãÝÑ ­$ÅK]ï+)l‰wOñHÊ)”ÆËú„wIÑ¥ÌÍ`Ÿ0–„°{ѱ;}ûêõº G>êz¿€XI¾%ómRÎþýûY”¼ë"v³°¦h°ˆ@pËý’Jv\=R+éëë#¹#nÒ€ÓN;¥"Q§V«±(8´u3À'Œåá,"М¿_RèõAw\|m‡Îo‹+[XëXibó­j= ^¤ìeI|ÂXNÀ" £ãËJ w T©ãšàk;táÛÂ)WÇJãñQ1(£÷¾ê›Ç—4â½,˜OËq`VR¸ÛÈïP(Cñµºìº¥Ò%öú¨ŽÑã<°žÅ—4y7«ÕjÝÝÝÝÝݾî^7â,À$:­¤ÌÐ}ä„f(¾¶C ®ë%¢é{}T,¯N²>á¾:Áy`=‹/i”§2£ÏÒ`á,Â$:~Ÿ:µjèª}ÍP|Í8A¬$M—Øë£b8êà<°žEIZÿAp3Kƒ…°“èhX Úz`ª}ÐPTCM% ‚•¤êRá%òêà<°žE^À•’nfi°paU+ ¨×ªöELC‘'iT #ºR| ¥`MWçõ$¸²"@ÒÍ, –ˆ°¥èä{gèëe¨öÅÐ7…"jaäK’‚&”ª(EI_µÉuWVHº™¥Á X„|tÌí  ^«ÑƒÞdŠ4„w=¬êERЄR¥PM¡ìIC5^ÂZñ’w3Þíùè˜ÛAX½–¤/ÚÎÊT (Ma訊tÛ“K’‚&”ª(…D«ÒPØ%ô2<º'`òÑ1·ƒàz­!–©<MAè‚Xr')h«¢’ÛÛeX•†°¦Á¼=¸xÀ X„|tHì­×â¯CŠ!ôh/KµeØíÉ%IA#þó,1Ê€­iHÀ\<ˆ8 ŽíI’{C ÚJl‹‚s8mè±ÕE?¨ó,ÊÀyÚ˜‹'`-Ñ÷Àõ ‚¶’”Ð'ñ…ØÚ’»*PçY.ÄžVtün\Ç\<ˆ8 ÈF§Âeu!~­Ä×AJtøá|n~D¨ó,|Y™ß똋œ€Ed£SᲺV¢j¾ ó Ð^FâæÒAœäåËÊün\÷u—P, '`ÙèT»¬ÎãÑJT —¡„2õÒÀ—‘bu«³ò/+ó¾É p' '`ÙèT»¬.ìš¡,!z¬*|Ḭ̈=ü2ÇÈW<¾¬¬z;UÛÒVNÀ"²Ñ bqI4CQ5ï•už žÇµÚ@QÀÆÕF¾â=ÖD4Kh+JÄ X@¤² Z ¨M.h†¢jh»v«z¦R{ÐDI ‘M—¯ $ÁP4Kh+JÄ X€¥è Fh(Aì‚.£ªG`ª¶‡\É+š. °óZI ¥4±XB”ˆ°KÑA;Œÿ˜xgü U=Óo{p&¯hº¤x€ ë=޽³ñkœ€EXŠÚaôøÇÄ»ðm0T^€ö;@M^¡n!ùd½'”7‘´À X„¥èä»ÚÀÀ€êP¤]YÜóKUßSÚ(.ª8kµšjÅ‘¦¢ÄDºÄÒ ¬„«pžŸŸo4Fc||üèÑ£eß|ë­·î¾ûîË/¿üÌ3Ï<ãŒ3.»ì²»ï¾û­·Þj{ KÑiéj½½½ÙN,9q¬$óŒTVƒMn*PÅE§^ö‘¦¢ÄtºÄ^¥I/]«Õ\úXh^YYžžž^ZZZZZšžžÞ¼yóÚÚZá—?ûÙÏnÙ²å‰'žX^^þßÿýßÇüŠ+®øìg?Ûö*ö¢“íjzCÁJÒ6Ôëõ–¿agŠ„V‚€/O±DKÅböÊØüx Q”¸º´¬F¸ô±(Ð<33311‘ýdbbb×®]…_n4sssÙOæææFÛ«Ø‹N–p玂Žë}F®A¬$ņ§x/ø‚.)Zéêê¢2zÖÅüj„3‹MÀ###³³³ÙOfggGGG ¿Ü××—OÀýýým¯b/:Y0Ÿj!ßq“©p¸;}B·’rOºgâÉ+’ÍÁ¡l¢.1é½§I‹MÀýýý‹‹‹ÙO ¿ü¥/}iË–-‡^^^^^^~â‰'®¼òʯ~õ«m¯b/:YÐîæÊccî®m(´i;P+I!÷“{–äUˆC&¯HºíqÓ­4!ê[ìò&j®×ëÍf3ûI³Ùìéé)üòÉ“'ÇÆÆ²ñ;yòdÛ«FÇÆüÌû"’6²”ž¡Ïµ’ri´‹-KS´à†Œ¥’Τ¶! Úq2vy+L1$%à¯ýëçŸþC=”ìØz衇Î?ÿüo|ãm¯µsoN¸7Ö5{Jƒ®´È¥ÑÎàÛ}ÃU$Á$¯#Kãxi¶äM¬»»;*¤ýy€– 7mÚôØce?yì±Ç†††Ú^%ä.›Ð¶ãº<çE=C b#[О¢?¥ Z‘“¼Ž,ŒÓ®‚È›X¨ XiV½^_YYÉ~²²²R6]Î’r—Mw\¨-…èJ·lÅÒÀºIŠ^ ‘¥‘¬§Á¥Ñn²4mÙÊäM, 4ïØ±#ÿÒÎ; ¿<<<üøãg?9xð LWËG¹Ë&ˆ;.þ >Ö2” nÙ ¤Áq“ŽÚ0%SO³4^hë´8VV¨KÅwA/// mß¾==ˆcxxxuuõÔå3Ø]wÝuÁ|ï{ß{íµ×’{ÀïyÏ{î¾ûî¶WÉG¹Ë&ˆ;.È >èÛ«Ú¤qǦ¼K&SOw¦4Þië´ Vf¨K>ÅPaýž¹¹¹±±±ä(ʱ±±#G޼íòoÿþýío_uÕU6lذaÖ-[xà™KFGÜe½whqÇE˜Á»ŸRx%A ˆ›¸L63K™zº¥/âf XYl¬KaŠ!¡_Æ€à)±°ã"ÌàO) ò}Ùÿq—ÉÆq7О…wš4 &Ö+‹uá,B5: žbã_âxJD¾»‰3É\&—ÝÀ$©€½3i‚01óK…¡.'`ªÑ ÅSüâxJJ¾/s—B»L6.»¥ã¢\&gÒTÃÄBy¼;â,@5:yJg£O)BÏ÷ÍH”pÙ  ÎLÕÆ4A›X‚ã¾Lt‰8 PN¸žb£Ë ~³’S‡œ3  ¬Ý¹lΙ©2øU'\K!—Æ^±q g«U´žbÃM@žßˆÏ÷OН 8g¦¶AK³½<€çcbÏÊ"NÀ¨¢ccPÑzŠ 7y~CŒl g@–S•Äcâ–’²:¡¼ò$ˆU¨NÀ"¨¢ciPzŠ 7y~C€ž¡„~ó¼02 oè÷°‘Õ±±— í|ìBìY'`TÑÑTA» Èóô jŽ¢ÑCÀ #“ð‚¼\ÁdØ"«ƒöêCà«P)œ€EPEGoPAuÙ@Ÿ9£g(8sÏ{Ç$¼µ‘á°EV'ôW>sÌ XUtôB—M@ØÃÜÆÃ™£?sŒ€Ixj#óa «NЯ>1±øíúFœ€ËØ·o_Eß›ë½Ë¦ ”8Ùpæ(8=„0g˜„¡6ª¤(æ¿é]‹s>E‘¥: ìŒP.yï²)žµ‘ dŽÒCòžÒ××gíð"ÔF˜¢ÔjµîînÝÕ»4&;¬ÂNÀå’÷.›‚à)ùñS«Õ¼§@¿€ôü`IÔ™œœtßïµ²(ÌÒ«{iL,vX„€óaŠ¢È}¿ñî& ž’?žâ„R8X¢(êêêêL]E‰¢h``ÀK“ü‚`b±Ã: ì\f÷ëõÞ=eÿþý]]]ež‚sXAG‘ôŠZ­Æº@±oß¾z½^&Jdí¾#8ÞM,ŽãÉÉÉ–ñb©;·”Kì)±¿î›^W`ô8‡tù[¿¬ 2ºt¬‰ù%c>â]Ðe$» ÙS|íJ“q“é°÷ø*ŒÊî2².YÜ«#£KgšX Ô±t­àpÇQy¼u°`’âkWšŒ›@VàÛõówO;í´ì*E'ë’àEÂ튾L,ó±lÈDœ€DQäëÖ=ÂsPY|mâ/ÛüÜ×××××çeTCŠÇíú…µ©÷û¢¤xQ'¯ËÀÀ€¯ýGh>ƒ ™ˆ°€$:^Æ6ÂsPY|­8¸®’¾h†âñéFµ©¤4h¢¤xQ§Pr“üA4‹Á† '`´ÑQ §øZ °}]UïF3¿O7Z­Må¥A%E^ÚHÚž3ÈKƒæc1Øá,‚0:ªFòØxÕQMåVÝDÕ»Ñ E£@Á\­Í#/ š()’êÀÎàË—ÐÇ”†ŒíÁ XatTÞãcã$}.OQõn@C z ]€¼4€¢¤È¨;ƒ/C^LùµÁ Xat4Št/3ª>Ч¨z·ßótÌ»D(ºÄ*Ò`º¼<°3ø2”FM¸>æ`°Dœ€F‡°H‡Z’-#O h —ÄSBÑ%&]*´$UµŠ<ƒ/„ªâ±7”H|ÌÁ`á,B/:…½ŠªËÚ^¡êsy ‰ 8ÈÊ$ž.1üݪjä˜b%Ì¥±je$>æ`°p¡A¯"qÛ«"T}ÍS@öëš@â)hº$±¨“‡p†„¹3.P]b"s0X8‹ÐˆŽíi{U„°Ï•^÷^c;Aº¹±JU¡y}(‹:yÂZNP%\]b'‹ä$㈰èØNhS¨âenèUQÎÁ´±¨cõ¾’êuÝ„.‚𱈰èØîUf¨Vñ² 7¬ªÈvÑ]†¯'”ðulßWÒ¸®ðuñ•Eá&àùùùñññF£Ñh4ÆÇÇ=ZÚ”"êõzÛKhD'”¢¸ªn[ˆßª(”çt}=¡äqQü3†ÿÈ»Çj•ÊÇ¢@ðÌÌÌÄÄDö“‰‰‰]»vÉüÛ'N¼÷½ï}ê©§Ú~S¨Í,ª}±ÓÜÖ—XuÙioÞÄ?OÑÍu}Ýò éf«U*‹MÀ###³³³ÙOfggGGGeþíw¿ûÝ­[·Ê|S´#ýTû" ÛŽvœÚ( £.­ÖF8Š¤àŸ§èàºh>– éf~W:ztÿââbö“………ÁÁA™;22rÿý÷Ë|S´#ýTû"ÚB#€ò”N;ê²(ERðÏS”¹®aÃÐ|,AÒÍ`“%Ô\¯×›Ífö“f³ÙÓÓÓö>ÿüóçwÞ›o¾)sAtÐŽôÓè‹P“B#€ò¿G]‚ò¥HJjóÊÍÇ$Ý m‘ $JÇ%à[n¹åk_ûšäU¢¦¦¦ÐŠ/>ÞÆO‘~#ÍÁ )’´41Eeƒæc ònF® ¥rsjj**Á¼Í… .A?~üì³Ï~õÕW%¯"ˆ`ñåÅMÏ£·wðBXÌ;Ñ ®€.1Ò+O},!\7S% 4ëmšžž¾í¶Ûä¯"ŽU ÚSÏ£·zðB@ä V«©v3¨¨«¡K öÊû¸/7CMÀ;vìÈ?†´sçNÁ?i6›çž{îÿ÷Ë_Å^tRB÷Ìóè+¹3E•¼ht3¨¨«¡K\Õz½®ùkè&–’w³D%i”D‰MÀËËËCCCÛ·oOâ^]]=uùÜvàÀë®»Né*ö¢“º§PY i’¨Õj-È=K%ZŒ@¯›!X|Åt‰…Ò¨f/„©gè&–’w³®®. iª¿ :Žã¹¹¹±±±ä(ʱ±±#G޼íò¹?lË–-ßÿþ÷•.a):YyêõzОBh%~i©â[@Ø™¢Iêòkñ•Ô%ÎD5ï¡d¯ÊFÙìkIš(ÜìÑi1”¼ÆÁ½c®VUñ)Á½ñ"æfW,ïÑ#ò IDATé‚ìq1– #ïãÅñì(â,ÀFtò†Ò²Ê¡á)Ú÷`h»{ V’@²e©œ{c+ÉzØÐÅ»Ëg ´6²Q጗ÒDœ€؈É}þôîÁw÷@­$ÁFã¡îAeyÈu1ïö´‘ ´6²Q™ŒÝÛ4'`6¢cÃèõ¦žäé!P+I°Ñxí%üd鬅äºv{³4œýÿòàøXlsêl;žœ€EØˆŽ £× 6VŒ¦ñx-=]Ðâò8n!Ô¨U\ê‚ãc1¶( e}˜°KÑ!7z½Á€¿bÜÖPÀgŠzºà»‰L a¥1ìöÈ${ì BÚIY”Xècœ€E$ѱq34‰¿b,6ü™b¬¥ ¸›Ä-D–ưÛ#—­2=YšX×l‘E‰…>Æ XDE ýÕR3@j‹2Ć‚?SÔÜMb‰âHSØÃMº=rÙ*Ós@¤é¨l‹8 Hz0Buß „Ü,6™"ÎBœ3Ú¶DšN+[ez‚4.7²!ˆ%ð1NÀ"’Þ齿ÆÎ‡ ȼ_l(3E/à)â6 H»-[D‘i‚4ÎtÁ÷1NÀ"’žá½¿ÆÎ‡ã ·À5ÿ a¦è~e"ˆÈÒÄËV£—Agºà,ò.h¢(÷×pŸ†ãrÂmb^Þ§îH\zJÐÒÄËVœ‚ÕÁ?7Ç™.ø ‡œ€EDÂ]ÐAÌEôp9á¶a^AG Æ¥§XÊ+Õ+[C)XÅTOü…Ȱqt@ögÙÀ儛ܼ\Þ—u¿ çÒSläÇ'I¹I*¡¬qE§ø ‡'`âèq’~KÈ͈C ìɱd.=%ˆó±¼Qei¶újB4ÆKÄ X€8:€ÇÄ»ü>µÚáì‰ ¨ó±Ë‘ÆÙ*K³íPV;Ñ/'`âè ï¯>¤ÍPÇÄ;#”g^ÉÕ—&”Wž±ÚAˆ¥™±êÏFœ€´N‹K´€¼úPÔ1ñÎÐ6»Ð—ÐÁ¥1Ôä'y•Äj8¯¤ä,Â$: [IȫűK‹ž.^ ÁoaÐb2¨A6Fiëkh8¯¤ä,B;:z [IΫµÑ3ïÛIÄè邳Hh^Bi J7uL’ ¬¡á¼’’°íè@­"L8pja! FRˆ‚vAÃdƒY¶â¼’’°íè ŒœÇ]–S Î*¢(êëë3·§pïz ˆ‚ÓŒu@¬ a‘B¨KÄ X€vtFNާ€Ô†’%‚|€Õ¢6#Š"ÝA+k)XkµZww·¡.&vD¨ '`ÚÑA9 õzÊS¼ƒ`(…F=ÀêQ ›‘Ž__°zWÁÊ Ö’¥# x´ L¢ã}ä$&`¿žâC)3úZ­Ö™…‚(ùfd©×ë)MìÛÊöíÛW«ÕÊpèVÆ X„½è8 6‚Ž‹óP¼c¼×F“““ež´›˜à]”l3Xò»%*feœ€E„›€e:.ÈCñ¾ðåøm¥ ×MÌñ%JËuË–(:Y/Ÿ«aeœ€EDÇ‹§Èt\‡â½àñ¹—¶Ò„ë&†ø%Ý;°HêXi|Fe»%*ce'`æÑñå)…7»ì‰óP¼÷‚ ÈÙY|‰‚S­& I£Q.z¢êNäÒ„š€gff&&&²ŸLLLìÚµ«ðˇúøÇ?®qóèÈmÌ™bòÍMRä="7I”äì‹TCM% BI”‚&j•©º¹4¡&à‘‘‘ÙÙÙì'³³³£££…_þÄ'>ñÈ#h\…$:’cs¦X†|Çõë&æÆ›$HJS5€P¤QÚ€Ò(é•©º¹4¡&àþþþÅÅÅì' ƒƒƒ…_¾à‚ |ðÁk®¹fݺuï|ç;¯½öÚ'Ÿ|Ræ*’Ñ!qØ™b!ò×£›t@n’ / È“ÐÚ‰3i4†6ù«y%!‘& +Óp'ÞÇq\¯×›Ífö“f³ÙÓÓSøåÞÞÞ7îÞ½ûرcÇŽ»ï¾û6nÜøÃþ°íUd¢Cå&hëNb”:®¸ËÚóƒÈM¨*p]âp¤¡Úfü$Ò„ee~o0E€ëõúž={²ŸÜwß}úЇÚ^%*ajj*ý•›€‡+þ*"‰Aú‰ þà ïT‰PšÂÈS m3~i‚³2sÚŽ¸©©©¨KMZ‚<~üxö“cÇŽ½ãïh{™è–ᘛ}¬¶Êª§4¦›Øž áëãI#%”»TTÒ YÔ&»,¡&`¥MX×^{­½ X†bÛè­zŠƒÅX_Fc{2„.±¿{¥…ØÅÕ =‘ErµjÞ±cGþ1¤;w~ùî»ïÞ»woö“Ý»wðƒl{•–èX]_౜ ÝS`+_ClO†X l‹âfÆ_=i«ÕPðòòòÐÐÐöíÛÓƒ8†‡‡WWWO]>ó‡½ñÆïÿû÷îÝ{üøñãÇïÙ³gãÆ‡j{•ìØ^_*Ãï³AxJU§¡l'Hü\ Î¥½DÏ= ð" rµš€ã8ž››KŽ¢;räÈÛ.ÿö?ì׿þõÄÄÄYgÕÛÛ»uëÖG}TæÙ:)ÞÁu.R$‘C£ÇB•#¨Yó>¦ÑÙ@KŠK]"NÀìE§¥ÏéuÜ{¥-ˆ÷»/zxJŒáõ°ø¸H‘®®.íñ‚CjV)u6„Á’¶¡V«9Ó%â,À^tâŒÞõz=D—l™]õööf Å{« •§xĆ•x´ÈE²Ù7 QR?ÄšÕKÞ"§ÅÍœéq`/:Y-„ó³«ïe, A{Š +ñ¾”Mÿù¼…/JŠ@üCbpö=hw3s]b i"NÀìE'K ×RÝ`â&äN¢46¬Äd)›EÉ’¤ÞæïµQ Ú­\%Hv~´ #MÄ X@Yth=%ÐŽkÃMÜĆ…( +Ñ.¶X”ÈËVíÚÈÆ¼d.® 7“‘&â, 0:6<ê`Ilø ÉLËÒ†£à<ņ•hÿ&‹Ò¹:zgÞ,À¥Ê6ÜLFšˆ°€Âè ï,u<®ÈGˆÉüüVzÐ…‘öo‚‹’®:zÙÄd¬ üè=i8‹(Œ²§ÈŒ+äÙƒÉüùÖ da„|.’Þo"‹’tÙª—Ñ‘M,¡­•áOâe¤á,¢0:ÈžÒv\÷Z“ùò­A™ÂD„ôà±: « -D6±„¶V†?‰y´!…ÑAö”¶ã ª×öN¨]ÐTÈL8¤ßß` : Uy3M,¡­•Lâ »7'`eÑõ”¶ã ¤×Æn­Í»^2iÜÞ¥‰…ê TE–š!޼w]ÚZÂ$ÞÜÄ"NÀ”¢ã½ËÊ4¡×&8³6„;|2i óK:U‘ûf€è"¶2„I¼¹‰Eœ€ÈG¤Ë¶¡×&8ó—“A7h[Ÿ!Hã¸p<¿Ô¸ŠP¹oF( !Þç<æ&q +±úo qæ).g†Ý Lšp’ãR½YÖ…„Pf/yÌMŒ°ùèà[‰$Õó—³Ýa Ý.¥!?1Šu¡‚|ö‰q! ¬¤-Ž7Áº'.g¾´Óa!Ä¥48g@âô„ÛRadiuаùè¸\ª²7Û&÷Å¥€*â<˜U p& Èbª"÷-¡•ÆFado¼p¡gKUöfÛ6KÀ91J@@³jZÀ!×§*`cÈÐJc£0²7^"NÀH¢C.ž½¢ f TúϪ­¢­Ž³[äºàWEöJBil¬öÆKÄ XIt Å#?.Jþ,¿ }². zê­ ~UõêÃ2l¬öÆKÄ XItLÄs¿*>K ÄÄï@&+Úb!ë’ §ˆ.q§žÏ\š‰iHco¼œ€çççÇÇÇF£Ñ?zô¨¨59d.Añ Å0%ftÚâÀÄï&+¡,¡ë¡§‚.±gލÀ«mÜÚ0$Åÿ²¥ßMXYYžžž^ZZZZZšžžÞ¼yóÚÚZik´þNªèh‹çÝPp6†@G0Yñ5¨»!ºÄHKµ ZÞM, Ú¨‰¢ÈRùk7ÏÌÌLLLd?™˜˜ØµkWikÔSé¾}û¢(‚=&Þ ýÕRK‚^ÂEð5´3at‰1¤‰sêÔjµÉÉIÃß }iA7³» xdddvv6ûÉìììèèhik0ÈÌÏ»¡ ôײ–DQä±6ò¾„‹àkùª¨V«!¿ŒÄ ÒÄEêtuu¹÷1ï&–A7³» ¸¿¿qq1ûÉÂÂÂàà`ik¢h`` »»{ppðæ›oþùÏ.þý|Œêõº—ñì×PúkYKRúúúïbÚÁ× «¢õVg H—¨ãÅǪ¢iÜÌjì&àz½Þl6³Ÿ4›Ížžž²ïßpà ‡~ã7^|ñÅ;ï¼³¿¿ÿÙgŸü~aßí@[Aè¯qïÛ·¯¯¯¯,w¦41€¯ ª"_+Þ¥‰ËÕéÌÁ’â]7³¬ܽ÷Þû‘|Dð³DQ455¥ÝòàðÞ_[n”vjAå᪱:NlT¾Þ-Þ}3ÐŽ,dà,a¡¯B"Ž•Ë“¼¦¦¦¢ ¯[Ðôððð‘#G²ŸHþÙâ¯Ùpç7q=yFGp“¶à¿ZÃÒŒªlm_”„ª®B•ÅŠ|D뙘d&ÒhVTŽø*â/Øpç7q=yFq&†úÍ?زÕÐå]®v± Eˆáˆ.”¦ƒvAïØ±#ÿÒÎ;%ÿ¹äŸ-þš 7y~C€ö¸r¼„K{9p7‰ dÃZ%!4qyǺà¯BÑb2¢ ¥‰MÀËËËCCCÛ·oOâ^]]=uyá&ùg·ýš“¤@î5–¡7® –p;ðÜl“{Ãî[¶š¸¼{]ÀW¡h1Ñ„ÒD&à8ŽçææÆÆÆ’£(ÇÆÆ”îòJþÙ&ÑI9 g®"¸|‚ž.àn Âäðeì$˜¸<‚.±Y` Eñ±BiLRL›_¶ô».1‰BÊÁ9sÄMb]È-dÂ0¹éP.  È,ÇÇ¥á\ʾ}û¢(Òž’O6õzÝËüÁMt‰‘Þ¡„0¹Gè-Šôöööõõy|Ÿ1‚.³ˆÂfÔj5K„Òp.ÆÜ<%Ÿl¨¼^7I@Ð%óïë·Ý#¯ˆß!èR­ú˜G]b:i"NÀ…˜—~ž’O6z ÞÝ$A—8Žëõ:š§øÅ{÷(sù_KG~©VË|,ò=6‡p1$¥ŸwOiI6Y7qßüê’\]àõhOwQ¢Ž¬@ªÕ2«€4œ€‹)ýLHŒ¾»»»V«µü-]]]ö×Ði¹µQÚÆÀÄ3à„¬¼Ï"’œvÚi…Vº4œ€‹!,ý¼ôà¶Fh%Ä‹.‚)Á•z ð–|^šN®|¬···¬N TNÀ¥î‚N𵿭ѻì¯Þ‹è<¾ti;Í|ÂØ%¾ºJ^—z½ž¿Oß±µŽ lÚ´)_*MÄ X€yt|íãokôÎú+È£„-øÒ%k£V«õõõ‘<ñ¢ Za䱫Þrò{JKf¾¤!%â,À<:¾öñç ¥««Ë‹•€Û%â,@2:$ïD ÅJä äQÂ<’G›‹ˆ‘÷ÀÂHµ«T©z7 :A/¡—¡4ºmˆq ’®JMQ2_µÉuÑæ"bä=Â{aT¨Ž’dÕFªÞúÊY(Ò(n¢p!’®JM¡*íåfªšp."@É#<.º¨Pmäq W ªQŠ4ª£»Lm±8‹‰IW ¥¿¦ƒVçýT5÷™¢*AÜ{#Q'¬Úˆ$ž¶³2Õ¨”¦0tÞ}Œ°™èt5Àþš ðæ^`uÞOXÓ`ÞžÇÙœ¢‰:ÁÕF†8¸QE5jФ„ίq!’®&þ_ .¶¦!Á¶4¶ï‰àßÂÐÙ@ ᨒ¶Ö8 ŒŽÕÅ%û³BqáB ž $Ƕ4¶ï‰TR  Ö„Jê×úœ€EØ‹Ž<÷g…âÂä;#dð»qݶ4f¨ÕS'è‚5¥zºÄÀµ>'`Ùèàïl–ƒoUœcâ]n\·-÷Í)†xQÇoÁª:”@ÞæfÔØžÙó.h+¤ÑA;&ÞÍ¥ƒ8Œí˜x7x\*ô{tŸ$^ÔñX°ªÎÛÀœ¨{Ò)œ€E¤Ñ<&ž_ë„ä ð˜x7à?'ZíÅ›< VUƒÂyà¢šËÆDœ€¤Ñácâ#o|L¼K¼Ý'‰/uB¹QUÕ·A¹™Lc"NÀÒèxŸî”þ0®6ò{hŸ¡4P~¨o IDATV’âýè>y:ªlU5(†fuË$”›É4&â, Úså >ÏÏãëI0—ÊJR¨ŽîÓê$)4uT ÍÐ*y¦Lc"NÀ"Ë»  ³ÂçùÁÎk%1—ÊJR|é‚öÊ@u‚Ø]F%À”iLÄ X€½èÄvPíóüð7 0—öL¢p_!œ¶Võ$/ Hþ„J)ÓNÀ"¬&`s;€r XIŒT‰SY ÚÝJ=Ð^yúsÒT¾sŒÊˆÜ¸"'`VpÞjµš’Þ8å^¬$Á\”i@ÃÈt½^W íúdU÷?*QÕwŽ93´€ðüüüøøx£Ñh4ãããG-ûæüã[n¹%-ïz×»®½öÚ|PæVpÞ4ô™wVÀJHDIð+MzõZ­Öò‡x¿[©A‹Aë邿ò€7’U¡*Xcßã¥g†š€WVV†‡‡§§§—–––––¦§§7oÞ¼¶¶Vøå+¯¼òî»ï~á…~ûÛß¾úꫳ³³ðð7ó7m¯b/:±ÐS‚K`°’„jˆÒR¿·€°ÉNƒÔ ëõº¶.Þ]>ۀХ!,X½“•&ßÇ,Zhž™™™˜˜È~211±k×.Éþ‹_übÆ m¿f/: ¡OSžèýŽ6¡‹ÕïY[Ùd§M¸Õ^KaÔÛÛ›ý[B”¦kœ“¦««ËÜÐd¬, 4ŒŒÌÎÎf?™•üçóóó7nlû5{Ñij÷¼$‚iV5v …(JáÂ`Š÷Â(%\]ò…ÑÀÀÎŽ!ÃK‡[°ÆEÒds°†¡IZYhîïï_\\Ì~²°°088Øöþæ7¿yâ‰'®ºêª/~ñ‹m¿\òîŽvwJ†|—ÕØÓö7•ŠhZ]B%)/½y¹4º$8»B«Ž¥jgöî-°ÞD XUt‚x†/ Y5 FO. ².±Ë£UÇÒjÈÓ5bÈ÷²Y=Ò|Z,œ€EDÇÐMÂ-EclC1Wyi,‰E. ².qwC,­v€<]#@ÏÍ‚ÞÄ`u°pA7鸕<ŸÙp\H£².±4AW«ö~–=7ÃYqÑè!VKÄ XItLŒ¡ã†þÌq†ã Aí|ƒ¬K¬+ TI¤- Âæ8zn²âbã™cC"NÀH¢cbô×Ò3ÇÞ1WÞ¥Á¹µò^ „’(›6zn²âBþ̱9'`$Ñ11z„Žë=Ó$ mdó. H¾iI6Qõõõ™ ¤! HGQ¥ñ¸— dŧ‡¤Ý;Š"KÓ’Š$`Óz©Ð{¦‰sVR«Õº»»ýN©½Kâ&ùdCåõª tÔXi<îeCX é!nH‚OÀÈJU«Õ&''Ý7Ã{Çõžiâ—÷eô)~¥q“|²!ôz%:j¬4µZ ðf3@zˆ›’àp>L]]]Kˆ÷" Ìå£(pß@Ü$ŸlRÜ÷ï5_š°ŽÂ&¡‡¸Y >š>ÔyÃÀÀ@™•DQÔ™Vc¸Éääd­Vc£oAšýû÷wuu•IÃV枤WäÇ‹’àpaýu^A‡pàÀÁ ˜­Ä#ùX¬N/i8{ÑÓN;­L¶2Ç” K $Á'àýû÷çƒu^{¼JÙ `¶’_ó­¶Òt²:^Fj¹¨`ÜáVæžü`I¦Â¼ º”4Fé‚:¯À1¾žnO[ ÂÒb Ÿ:-ÜæãK4i¼<ŒT¸s%?d:ÙÊ|õ“Â[¿?, Š"_j¡¹IìïéÆü½€¬§¸´œ²x|ê4/ÍÀÀ€—ýG€Òxy)ÑÄCêõz_____ŸKÁq3ý¤po<'`äё숀nû{º1¿§ôŽ;î Ï’º€°Ð‚ǧN ·û‚ܧð.—‡‘Ü\TIb(7óØO  '`´Ñ‘n+ŽmZ¶êéòº€°Ð‚ß§NíI£ôË€ÒxyÉÁEU*”›ùí'ù.Í Xmtä;" ›Ä*cªæm‹¼. ,´ ä¹8‹bT»¦4ªÑ&QǶĪ ÊÍ4ú‰ÕxFœ€ÐFG¾#bºIøRmòºø=`Aü om¢Ú…`¥‘'uT*”›©öÛ¢Dœ€ÐFG¾#zt+ªyÛâqi]#¨0ÒèBAK‡£ŽjBEs3¥~b[”ˆ°Úè.Zò*+ªyÛBeV‰Tv!´%Ù2BQGc¼x©HÜ̶(œ€EG|©ŠÊJ@ΕÇ\ÛKU$F€YŸª 9X×¥òhLu ©ä½êBl‹Â X„vtð'C…–{€›}%Ä #A‚$ÑËÁº.•G£©òè6$nf[NÀ"ô¢Äd¨€jpUÂ%ÁÁ:y%Ÿßu°®KèÑe¸—Æöx ¨0â]ÐÞЋN“¡BÔà8§‡"JJè3’Bl'HÀƒ)Tñ" F2˜ëq  &C^jm¨S‹EñÎ9£´ ’V—J.PaäkQ‡ÄÍNÀóóóãããF£ÑhŒ=z´ì›O<ñÄŸþ韞sÎ9gœqÆ–-[zè!ÉKèE2ä+BZŒ& áh€sÎ(à4%¡ª‹…ø-Œä%óXÓ“¸Y¨ xeeexxxzzziiiiiizzzóæÍkkkÅM‰¢‘‘‘'Ÿ|rmmí©§žºôÒKÿñÿQæ*zÑA{î-¯Dˆvj±›KÇ!”áñö(ï;©ê"A! #¥Q౦'q3½#õË–~7afffbb"ûÉÄÄÄ®]» ¿ü…/|áäÉ“é>÷Üs’=X;:àϽùJ„~§¡ø5 O{ ¨ñµN… b»†ÇšžÄÍBMÀ###³³³ÙOfggGGGeþíÚÚZOOÌ7Ñr“ü3m[ æa~¡œŽÃŒZm‘€P/(7SE!q³(ÐÜßß¿¸¸˜ýdaaappPæß>øàƒ—_~¹Ì7Ë¢ƒæ& Aœilõ„/ÌÃü:ç phÒhÔ:Pûì-ÍÍ”FA·–D&àz½Þl6³Ÿ4›M™yí«¯¾ú¾÷½ïðáÃ2W)‹š›$„þº@s#À<Ì/ˆ3Àq¤Ÿ*zµÎL‘ЂÐÜLu ­(ýHÔQ xqqñšk®9tèäU¢º»»¡Ü$Á—}ãF9ƒôûº@É+š4¡Ïœ ´Ú(†ßC£ñ#SSSQ þ”8\‚~饗.½ôÒG}Tþ*eÑ=)>èçÍs‡°ÿK@Gúi´(„ĉQ ñ1Õ‰MÀª›°^~ùåK.¹äàÁƒJW)‹N@'Å;ê0ú Æ%jòJÕÐÕ!…° !ù© XYÞÇ’>¦ÔÓTÍ0Ô¼cÇŽücH;wî,üò+¯¼rÉ%—üÛ¿ý›êUÑ å¤xä º^¯kDd’T+IÉÛA­VS•D—„ ¨CU°BÝû¬€•å}¬««Kµ§©V«¡&àååå¡¡¡íÛ·§q ¯®®žº|æ»ì²Ë¾õ­oi\ÅFt²}½^¯“ E¿´tUD˜ÜTÀJRòv ' ‚. P‡ª`E íµZ-t+kñ±lö•ïiªÕjhŽãxnnnll,9ŠrllìÈ‘#o»|æ+4 ×^{­í%È£ÓR¿ç5FØ4¤A:ó%E(þX%+IÔFIWK‚Õ/-nV+#™uÄ.h7G'_¿·¬rxß™bàŽJ,Y Âı©Ë†:~¥©@Á¹Y•¬Ì;ýˆ°òèÜçoÁåSО6‘Ć• Ý­ TšØ‚:&Òз@ Ö’y@ ÍÍÖ‡ˆ°òè› ¹ËÓvw¨ ;òذû•ä6¨4±u´¥!/ªÂ­Šb;‡*[”œ€EG‡Ü ]ÞFw‡Úœ)‰ +1™ÜX²!¹…*äêhKC¾,ܪ(¶Óx½ѱ É X„è@-a!ï)uY Û°“´¬KìÜïÈÕÑ–ÆÆŠ1àÙg¯¥a¨Iseä,"l…e89@¾%™„`w0IȺxñ;%ø+Æbu`},E#ÂàÕjBY##NÀ’è WX†“dC‘IBÈÒÄ~‡¬‹Œß½ z-Ä_1¨>X4"Œ\­¦”52â, ‰T…•7³C6™$" ÔìÙ6mýÄè;ó>º@ÁS¿“¹ZM)kdÄ X@œ |Ï-2IAÇFï]¯¶~bôî›á]šX¨Â`‰-Œäj5¥¬‘'`Itp*,gž‚`%2Í@Æ¥Ñ#L.ÛúˆÑ;n‚4±P„ÁÛ/´SjKð.he’èàTXn<ÄJd@Æ¥Ñ;žÕéÍÂAŒÞq3@¤ü/„Áw@aÄGQ’í‚vã)8VâàŸ›ãÒè]š—¶s‰Þ™^ŽóMÒx,qÕ #Ui8‹‰ŽË>íÆS‚°’¶TÒè]š—‰s•ßñtÄåØ EšBªgb)Ž'ܪÒpÑ6:îwE9*A[IBUÞ¥yÙp.ýY6W÷EpU £X]NÀ"ÚF‡ÜPk%)–Œa¯cç,AÇ-¡•¦EpŽ'ܪÒDœ€´¹¡€LÈO0(ÃR}jÃèA ÅhÇsŠ( 'yV¬Ë‰¸ª4œ€E´Î1ñnå>yÇP ±á&øŒ€‹’`cÏ¡4Á„€ì>á,¢mtpމwƒWì!Ô¡2 Š¡›„{|?²()z£ÆÙä> "˜{ 5à,B&:È‹Kä¾b¯ òu'dC1qœU\ iEIÑ5.'÷¡Á„h[íxá,B;:&šv0àܲEX-4<ȆbR!èëJƒ,JŠÞ¨šÜëÙÎþ¸<ÚVF;^"NÀô¢ƒ3¥€ºe‹`(6–Ð0)Œt‰ ¤!äÎ7ÎäÄÐ@ÖiÇKÄ X€^t@¦…-©×ë†}7è%\dbñ ºÄ0Òà¼C gr`h-ºÔjµÉÉIÃßÔ†´ã%â,@/: VRØBOQÁP’M‹•ôöööõõ™'cí¤Ž KŒ!M\”lÜ7#dÅÁÐòºtuuUÀÇ8‹Ð‹ˆ•¶$íó™3ϳác†)FôË–~7aeeexxxzzziiiiiizzzóæÍkkke߿袋¦¦¦~ö³Ÿ)ýÁ†Ññ5ãÄq“„ù³h¸ तU@«”¤A>5½ù´Š¦H‚ß'‘@¤±ác†)FôË–~7afffbb"ûÉÄÄÄ®]»ÚþC¥?Ø<:¾ÖAºlƒüYTÝsRRˆªG ÕFòÒ$J¬’VÑI‘·”PªÕyilø˜yŠ)ýeK¿›0222;;›ýdvvvtt´í?Túƒå¿LÒçBñÕ"°|VÒ sRRˆªG ÕF±×õ@{ȧU¿Š˜ûX(&–"/ ‹MÀýýý‹‹‹ÙOÛþC¥?XòËT}.OÑ(ÒÉßÎ+ ‰4°“’<ªá¥6"= Qb•´ê±Z%,¡˜XŠÇ»q¸ ¸^¯7›Íì'Íf³§§§í?Túƒ%¿LÕçBñª"ÝA±L" à4Qø.h*ÑÃE)­Š±§É` ÅÄR¨*=]"NÀâ/255•ýUŸô”Â^EÕeË$Ò œ…ë«)™JôàDÁ¿KE2XM,A ïSSSQ FU9´MÕçÐRÂn^^^Ú¾}{zÇðððêêê©Ë—üaJpþË•œ‰–á`²ÄsÏÜKk%-ؾ¡q]T£fµ„Ç Ò¶­L[—(ÐÇñÜÜÜØØXråØØØ‘#GÞvù·ÿaQm/ÑòªÎDËe´W¸²ÎãÝJÀŸÓõûŒÇšÿ  ¤a×]dÒ|C…g¢eq}…+ë<~­Äï¹}2ø} ÿ}'P¯ 댗æ,¢%:ž‰Bm(UõˆN«¬ƒ¸Ç ø&7€ß¥|!P>– v3NÀ"Z¢8ŸPU¨pe&ßsûdèL——×…_æ±›qÑ´{¢U=SÕ#Ðt‰éŒM¿çöIbõ$)L——×Åû Aæ½m°$ˆÝ,â, ¨â·ªG`ú}] ÔyôhÒx¬u@{0]^^Àj5®ô™íb7‹8 °¨“¤ÐŠb>>MšØS гØ{’—Ç]Ð “WÀÁ·s³ˆ°KÑA;ÞÁI^¾~G´óèI¤Z¶Ñg±' 7‘¸gòŠ9¹y´6–¢x=ÈúžwòFP«ÕTÃB[‰Wòž¥*8‹=½‰Ä P“WsY°Fœ€XЉË'@Mn*à)y#ÐH]P•xD‰‹tÐèù8+ ˜7,5Èÿ!Id”âƒ3d¬'`–¢Câò€TÀSZŒ@;uy/ŒÒÔjµÐE‰sºôööf;›Ò¨ñ+Mzõz½Þ¢  K ònÖÕÕ¥!÷!“à¸`8 °*—G ;l*à)H]-U|D‰Ûõ´ F@œ–ª´¸Y6û$Q/SRDœ€Ø‹N\>ÎJ~^Bþ:3—`nª”!_Å“=ˆ.q°k-y]’©°÷x’íù™=¾46 Vɥ숰€ÂèÐÚP¸.ŠÞ¹,8›†pîK©B¸É G—8ØQc£nÀ©ŠB”ÆFÁ*¹”q¹ …ëò±CѾcÉÐÜM&hxoŒ6’Žr] íÈF÷Q«¤7r‘Ž[ôº|lÇèõ’:Ôü¬ gBÛ0A“bˆ:PgŸIB®‹‰Ù2Áš “üMNÀ"òÑ âæS¸†ëü‡mÚú¯s‘$11)du—n´º˜Ø²(±Û,nÃÇ$“°ˆ|tðïpm(±î`À/ŒÄ~‡?ƒ71)dudòì”ÎÄŽE‘ÈGïñ.hSòÑÁ¿Ã!6+´D£‘ø…‘ØïÀ§# ÚY¶y¹62±#dQ$‡ˆ4&¦qPœVˆÀP@ú«–àFb¿™ŽXêÛÈê´ÍC8µQ¡:Ú’!‹"9¤1´²ˆ°Õè äf¡ ôW{-ß»4b¿C˜ŽX­Ï¼Ç¿Œ¶y¤6r¹‘Í»X’ÃAC+‹8 PŠÈüR`(ýÕKK@¤øÂtÄq}æÝå%[‚PÅÕAØD"9¤1´²ˆ°¥èàøWÙÿBè¯^Z‚# ù¿"ÄeURÉ€PÅÕq9XÝ@f8 Hche'`JÑÁ÷/q }ß¿|ipY¹¿bÒ½½×F±Cu\ónà}ÝÐÊ8‹PŠNþUÖ/ݧ —¦„4e„b%JTæDõÔq9X,u„UtI8‹PŠNÐþ…³?ËáJcÉJ¼ÏªqÂñ _nÔq9X,uKrÛˆ?'`ªÑ ׿,•¢kwŽ[B+ +AX$oëò8'F WAš8üi½ ¹-Ià XatÀ£·QŠ‚¸‰“¼Ê€zÝ-‚È“÷K3-^ˆ2ÇF²|I'`TÑÑ6gëQ6JQ|7q¼À«Îë.\BÞs,Í´BYˆ¢Â°c=±¶$ '`TÑÑ3”€¶î&1Ø« ÁyÝ…K {í‰Q‚Xˆ¢ÂÐŽBw3KÒpA=C‘LSSS$ ×›‘Ý$!ˆW¦Áß°aÉ _VwÙôF“žÓVÚñ‚¿E…ᲄûõ°B¡ÑNîì”>Þh4ÆøøøÑ£GeþUtô Åû+´ó ²›$„õêüÐ6nm7R“žÓVÛã%6~æ8Š"À÷.K¸_#/ ¼ Z“•••áááéé饥¥¥¥¥éééÍ›7¯­­µý‡TÑÑ3ï¯tN0É7I—¢ˆªË"L8|-­ç…¹Ëž…ª7j ÝVÛãÅ|„¤…hÙܯ‡uÔxÉ”€gff&&&²ŸLLLìÚµ«í?$ŒŽ½¥BÛ†bžo¨ZØâ)µZmrrÒð75J_Këù0"Üeo%Š¢îînä£ls—'i¡ílQ)-h¹_ e¼Xº”€GFFfgg³ŸÌÎÎŽŽŽ¶ý‡¶Çj[dÒ¶íFšçªæ=¥««ËýÓx¾–ÖóD¸Ëž% ÚËHl‚5ߌÈx!ÊpêæøT€PÆ‹¥Y8Pîïï_\\Ì~²°°088ØöÚ«$Øn¤y¾¡ja¡§xyÏË#ùF"Üe/Ū³´E¬ŽíñR°æ›‘vð$¨e¼Xš…ÉS¯×›Ífö“f³ÙÓÓÓöâw²~SIls/U÷ Whïg•½=g1Ä¶Ö k~ض0Â2¡ŒK³p yL0Ã0 ÃXÂÒ,¼Ë÷ßuгÎ:kii)ûÉ«¯¾zöÙg·ý‡6â˜099Y«ÕRmê@’YÅi§ÆÒ‚pã“ÉÒ2 ÿó?ÿs³üŸ½´7a1€x_DbÊ`iA¸ñɸ§Ã,áÎÌÌ<óÌ3Éî Ÿüä'¯¼òÊÏ}îs[Å0 ã€ýû÷ñ‹_|ùå—Ï=÷Üéé鉉 ß-b¬”€WVV.½ôÒ[o½õ3ŸùLE÷Þ{ïž={ž{î¹²M Ã0 .@÷€Æ¡C‡þë¿þë‚ .¸à‚ ~úÓŸzôÕæu¶ÂIDATèM7ÝtÆgœqÆ7ÝtÓ‹/¾Jcžyæ™ÉÉÉ 6dçÅiááÇÿìÏþ¬¯¯ïÌ3ϼꪫ~øaÀFþä'?¹õÖ[‡††zzzÞýîwøÃþ×ýW¨fY\\ܼy³3¹•YËÖ“'OÞu×]_|ñé§Ÿþû¿ÿû<ð€ƒ*52ÃZ­ÖÓÓƒÓÂ'NÜsÏ=ø‡¸aÆ3Ï<óòË/¿çž{Nœ8a»…JŒ¢è?þã?Þÿþ÷¯[·îì³ÏÞ¶mÛ+¯¼â …eØ3êàðêêêèèèå—_>?????ùå—_{íµ¯¿þzÙ¶m[ÿ~ô#Ì~ðƒ<~üøÃ?¼°°p×]w}éK_ú§ú'´Fþå_þåe—]öÈ#¬®®þìg?û«¿ú«ééé©©)œ¦Äqüñ_ùÊW¬¶Í¤‘-Õ¢µprròùçŸÿÞ÷¾·¼¼¼wïÞ½{÷Ún¡j#ó‡ýÞyçò'‚ÓÂÏþóÿò/ÿrçw¾øâ‹/¾øâwÞùÏÿüÏŸÿüç­¶Pµ‘üÄ'>ñ©O}êèÑ£ÿó?ÿ322rã7þö·¿µÝÈ2,µõÓ¦-333311‘ýdbbb×®]a5Æ™J-ü¾pòäÉô?Ÿ{î97oh1Ôô¿øÅ† ,´ëz-ܱcǶmÛbWr«6Ò½(µðСCÿøÇ´ëm˜ôÆ'N¼÷½ï}ê©§ì4íw(µ°ÑhÌÍÍe?™››k4öš— ÔÈk®¹fÏž=ÙOî»ï¾{î¹Ç^ó$!#Á'`¨w(i7Æ™÷™„kmmMæõÌæj:??¿qãF í:…F Ÿ}öÙ /¼pyy9v%·j#Ý'`¥~âŸxä‘Gœ´ëm˜ôÆï~÷»[·nµÓ®S(µ°¯¯/Ÿ€ûûûí5/A©‘ëÖ­;~üxö“cÇŽ}øÃ¶Ø>98·Òßß¿¸¸˜ýdaaapp0¬Æ8ó>“p=øàƒ—_~¹v½ íFþæ7¿yâ‰'®ºêª/~ñ‹ÖZÇê-|ýõ×/¹ä’ÿøÇɺ‘[µ‘Q twwÞ|óÍ?ÿùÏ¡ZxÁ<øàƒ×\sͺuëÞùÎw^{íµO>ù¤íª6²…‘‘‘ûï¿ßN»N¡ÔÂ/}éK[¶l9|øðòòòòòòOû,N {{{7nܸ{÷îcÇŽ;vì¾ûîÛ¸qãøC«-Tmd–çŸþ¼óÎ{óÍ7­5íw(µðäÉ“cccÙñ266–½Ó„ÐÈ«¯¾zïÞ½ÙOvïÞíËÕ³pn…°z-\\\¼æšk:d³i§Ðã+¯¼ràÀw¿ûÝ_þò—­µ.Ž[øðÃ_}õÕÙš3·pï½÷~ä#±Ð®S(µ°^¯çï ~èC²×¼ôºza¼å–[¾öµ¯Yk×)”Zøõ¯ýüóÏ衇––––––zè¡óÏ?ÿßøT#j¹i§0ÔôСCçwž…vB©…ÃÃÃGŽÉ~‚¹ÝÂâââúõë-´ëJ-Ì/K¾ãï°Ø¾8ŽuÃxüøñ³Ï>ûÕW_µÙ´ß¡ÔÂM›6=öØcÙO{챡¡!{ÍKP ãã?>22²~ýúuëÖ}àxà4²-ä#7øÇ.¾øâçž{.ûÉóÏ?ÑEqc Qmá¯ýë~ô£333×^{­ýÖýÃ0^qÅÇŽ³Ð®S(µð—¿üå¦M›Zž¯uð ­acû!)µðâ‹/¶Ýž²ëj„ñþáþøÿøì³Ï¶Ù´ß¡Ô—_~ùŠ+®È~rÅW¼üòËÛE‘z?øÁ:thuuõõ×_òÉ'Ï<óÌ­[·Ún¤{‚OÀÿøÇ¿ùÍof?ùæ7¿yà 7pc Qjá±cÇþèþèoÿöoGGG´îw†ñ?ÿó?/¼ðB í:…R u4N#ó|ûÛßþÀ>`¡]§Pjá7Þøƒü ûÉ÷¿ÿý+¯¼Òbû¢(Ò ã›o¾ù÷ÿ÷ŸûÜç,7íw(µðüóÏúé§³Ÿ<õÔSçwžÅöEQdÜï½÷ÞO}êSÚåÚ µ{–——‡††¶oßžÜÒ˜žž^]]ÅlLYÀ ¡ÔÂË.»ì[ßú–›†i7òúë¯øá‡_yå•f³ùÒK/íÞ½ûÜsÏýÁ~€ÓÂpàÀu×]g»az-¼ë®».¸à‚ï}ï{¯½öZrø=ïyÏÝwß ÕÈ8Ž?ö±=óÌ3Ífó—¿üåm·Ývûí·Ûn¡ ä#7øÇñÜÜÜØØX£Ñh4ccc-÷Û Ó¢Ÿ—’H¾……Í{íµ×l·P©‘‡߸qcww÷»Þõ®›nºé'?ù T ó8«·äyðàÁo¼1 ã¹çž»mÛ¶^xª…qÿú׿ž˜˜8묳z{{·nÝêl_‚ªÖ[¶lùþ÷¿ï¦m J-üö·¿}ÕUWmذaÆ [¶lyàyÿý÷_tÑE===^xáÎ;Oœ8ᦑ…Ø3êZÙ¯3 Ã0 càï3 Ã0Lˆpf†apf†apf†apf†apf†apf†apf†apf†apf†apf†apf†aü?Í îÑ<“@DIEND®B`‚gsl-2.7.1/doc/images/rand-bernoulli.png0000644016036000116100000001520313373111455014667 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“8IDATxœíÝ{lÕõýøñsÀr±ÐnTI–:Ý`ÒØ¥ˆètҹȬÍFÝp*$8*J–-KˆÌtÙ4†¢N¦YãlcÈÔqq^ÇÂÅ2u@Å¡T‘›X ¿?úý5~ ùôUÇ_í§§ç¼ )OÞïónO¶±±1´¯NÑÀñH€ €@€ 0` À@€ €@€ 0` À@€ €@€ âe[èÔ©Sß¾}Ï;'zèÀÑ£,›Íêƒnv(­Þs[rÀ Ñ™L&ÓØØØôÆêëë—/_>qâÄU«Výæ7¿‰ìÈ49™L&›Í¶|hââ%&jýúõÅÅÅ~øaÈH‡ÒíC@Ç'Àб8p`Û¶m .9räˆ#š.þûßÿ¾âŠ+&L˜°uëÖÙ³gßqÇûÛßš?å†n:tèo¼Ñru8nܸ={ö,\¸°¾¾þ¡‡ª®®ž5kVÓ‡–,Yríµ×Ž?~Æ ëׯ¿ñÆGµtéÒvü*“gnvþùçík_Û²eËsÏ=WWW7yòäöœ ÚI#-ñ{sàÀÛ·ooºÁ¨Q£î¾ûîæÛÿéOúö·¿Ýü¹÷ÜsÏ'ïðÖ[omyeþüùçž{nÓÛßùÎwî»ï¾–6mÚˆ#š?7qÂVß8ÌW÷É+‰3'~z}}ýi§ÖÆÇ‚cˆ0t-¿-ß{ソüå/ûöí»ë®»š>úÊ+¯TTT4ßøÂ /¬­­m~÷»ßýî'ïðÚk¯mùîyç÷úë¯7½½bÅŠË/¿¼åG+**–/_~”¾”6Iœ¹ÉG}tûí·ùË_>ñijÙlŸ>}êêêÚs6hN4@¼Ä³EK–,¹êª«Ö­[—ÉdºvíúñÇ·üh§Nöïßßô¹üq^^ÞAw¸ÿþN:t±éQºuë¶}ûö®]»6hïÞ½ŸûÜçšžjýä0èܹsãÿž½jûi¬OÞàP37Ýì–[nY»ví/ùË3Ï<3??ÿ£>êÞ½{ Ž!VÀÐA}öÙo½õVÓÛo¿ývËUrS}›T²&Õ·¥Â­[·¶¼²uëÖ“O>¹éí^½z}ðÁ-?º~ýú#þ*%qæ&O>ùäŒ3Î9çœüüüL&Óô_È= ÔªU«N9唦·/¾øâ¹sç­{.))™7o^Ë+þóŸKJJšÞ>óÌ3ÿþ÷¿·üèÃ?|´º-öìÙÓ­[·æwyä‘ö|th7~t8õõõÿøÇ?&L˜póÍ77]¹í¶Û.¹ä’îÝ»———wëÖmÉ’%÷ÜsOËŸúT~ò“Ÿ”——÷êÕë’K.Éd2 ,øùÏþôÓO7}t„ ãÇøá‡›Î!Ϙ1£¾¾þ¨|]m4|øð[n¹åî»ïîÔ©SMM͆ ÚóÑ¡ý¤Î hÅAß•½{÷2dÈÌ™3[ÞæÕW_>|xÏž=»wï~ñÅ/\¸°ùsïððÿøÇ?–––vïÞ½{÷¥sçÎmyËiÓ¦õïß?//ï‹_üâäÉ“÷íÛ—9Ú§ s³mÛ¶]}õÕ}úôéÕ«×èÑ£wìØÑöÇ‚cˆ ÀsÀ@€ €@€ 0` À@€ €@€ 0`#^±bŸqãzõê•Íf£g€ÖåH€GÕ·oß—_~9zh“lcccô GS6›k_9)GVÀpl` À¡1·|ª¯è¶ÛnKü3éÖ­[ûþ%Ðq¥¬\;²tTa9É@“ôŠ` 0`pBôGGËß@Ùü¶çqè°r$ÀZ À±Å4` À@€ €ï6nÜXYYYPPPPPPYY¹iÓ¦CÝ2›¤K—.í9mÎ`€ãÚÎ;‡ VRRRWWWWWWRRRVV¶{÷îÄòWWWï{ßkç™sƒ_zœÀÕÕÕË—/ôÑG›¯\sÍ5ƒ?~|«Ÿ{àÀþýûÏœ9³´´4Í#ù]Ð,›ÍîÞ½ûúë¯ÿüç?ŸŸŸ?|øðÕ«WÚ;™7o^UUUË+UUUsçÎmËç>õÔS………9\ßT 0À1l̘1 ø×¿þõŸÿüçÒK/-++[·nݧº‡Õ«W·¼2hР5kÖ´ås§L™róÍ7ª‡£™½Ö¶ cB6›½ýöÛo½õÖæ+·ß~û›o¾YSSÓ|ƒÃ|zÓ?t]ºtÙµkW^^^óõ†††=zìÝ»÷ð¾jÕªË.»lݺu'œ#¿T1‘-h\}õÕ½»páÂæwÿ‚ðŸñ¡§N:nܸ6ÖwÒ¤I‰'¨ÛǤI“>ã›K½VÀÀ1!›ÍîÙ³§[·nÍWöìÙSPPÐÐÐÐö;),,\¹reaaaó•wÞyçœsÎÙ²eËa>ë½÷Þ;묳Þxã>}úÁäÇ+`¼ýöÛ½û…/|¡ùÝï ›n3pàÀÚÚÚ–w²råÊþq|ðÁ+®¸"çë›*8†=þøã½ûÍo~³ùݶlA———7?gܤ¦¦¦¢¢â0ÚÐÐpÿý÷;~õåò3ç9ïµ×^›6mÚ÷¿ÿýL&3{öìûî»ï¥—^úT÷pÝu×ßyçcÇŽÍd2Ó§O_²dɃ>Ø|ƒOîÁΙ3gÀ€­®’9<+`€cØoûÛÚÚÚ¯|å+§vÚüùó,XpÆg|ª{èÙ³çâÅ‹—.]ZTTTTT´lÙ²E‹åççæS¦NjùûÙ9m”À!,à˜à«vàä€ p¬²ÿ|L` À@€ €@€ 0` À@€ €@€ 0` À@€ €@€ 0` À@€ €@€ 0` À@€ €@€ 0` À@€ €@€ 0` À@€ €@€ 0` À@€ €@€ 0` À@€ €@€ 0` À@€ €@€ œ=ÐquêÔ©±±1z ÈM $Û·o_ç΢HÙl6¥{¶ $Û¿çΣ§€œ%À@²}ûöp‚M2H‹ÉR%À@2[Ð*’YCªH¶ÿ~†ô0¬éÇ¢§€œ%À@2[Ð*’9„©` ™0¤J€daAªHæ¤J€d¶ !U $s R%À@2+`H•É‚T 0Ì!,H•ÉlACªHæ¤J€dVÀ*’9„©` ™CX*’Ù‚†T 0Ì!,H•ɬ€!U $`H•ÉlACªHf ©` ™0¤J€dVÀ*’ 0¤J€d¶ !U $³†T 0Ì‹1@ªHf R%À@2¯†©` ™ç€!U $³ ©` ™0¤J€dNACªHæ¤J€d¶ !U $s R%À@2+`H•É‚T 0Ì!,H•ÉlACªHæ¤J€dVÀ*’9„©` ™CX*’Ù‚†T 0Ì!,H•ɬ€!U $`HU+ß]õõõO<ñÄâÅ‹W¬X±uëÖL&Ó·oß’’’aÆýà?èÓ§O» ° ©:ä xóæÍ×]w]¿~ýüño|ãóçÏß²eË–-[æÏŸÑE=öØcýúõ3fÌæÍ›Ûs\ ÝXCª²‰èÞ½û—¾ô¥{î¹çÒK/M¼ÁÓO?ýãÿxýúõ{öìIsÂÙì!ÿXàøñÕ¯~uÖ¬YŒ"¥W„C®€G޹lÙ²CÕ7“É >|Ù²e#GŽLc, œ0¤ÊR/0d2™3Î8ãÙgŸ=ýôÓ£H+àf<ð@âõêêê£= Ð8„©j=À“&Mzá…º8gΜ)S¦¤3Ð!Ø‚†Tµà?üáUUUuuuÍW^z饛o¾ùé§ŸNs0 ˜c€Tµà¡C‡Þ{u••»víÊd2k×®½òÊ+çÌ™3`À€T'Û¸qceeeAAAAAAeeå¦M›sãì'¤:¼¤ªM¿ «¼¼ü¦›n=zô–-[.¿üòxà¼óÎKu¬;w6¬¤¤¤®®®®®®¤¤¤¬¬l÷î݇ù”Æÿ•êxp<° ©j믢üáXZZ:hР‰'–——§:S&“y衇† 2qâÄÞ½{÷îÝ{âĉƒž1cFÚ 4s RõéNW·Ûÿˆ‡ ö³Ÿýì[ßúVó•¿þõ¯¿úÕ¯-Z”xû£{LÜ!A&“ÉÏÏ÷ÝwO<ñÄèA RÀ!}òYÕl6›——×>ϳ®^½º¸¸¸å•Aƒ­Y³æ0ŸròÉ'çåårÊ)W_}õÚµkÓ› ŽaAªàÆ6Ho¬÷ßÿ Wz8餓êëëuûŠŠŠ'Ÿ|rÇŽK—.---½è¢‹þùϦ7‚TuнÖ.]ºìÚµ+//¯ùJCCC=öîÝÛ–O¿ÿþûçÎûÌ3Ïþf“&Mš}ú׿þõË/¿|È!¯¿þzc•——×ÔÔ´¼RSSSQQÑÆOŸ={öù矟Â\p¼°†´µ²µýî»ï>þøãÏ=÷Ü«¯¾úî»ïf2™¾}û6ýZŒ+¯¼ò¤“NJi¬;v3fìØ±™Lfúôé<òHmmm~~þÿÍÝbS¾¬¬lìØ±\pÁI'´yóæ'žx¢ººúÙgŸ-))9²G÷cH°}ûö¢¢¢>ø z–^:ni6lØ0a„¦ü-++›2eJQQQóG[þ‰,^¼øÞ{ï}á…¶oß^XX8lذ‰'žuÖYGüÐ õõõýû÷ß¶m[ô ìx p †­[·ž}öÙÿýï£`‘¯œÉdÞ|óͪªª~ýúåååõëׯªªjݺuiLtaAÚZðªU«.¸à‚þýû¿øâ‹~øá‹/¾xÆg :tõêÕí0Â!,H[ë+ëK/½ô²Ë.»é¦›Z^œ:uê3Ï<“«/ l Ö¯__VVf¯ "ŸÎÏÏ_·n]aaaË‹ï¼óÎé§ŸÞô Á¹G€áÍ7ß>|øo¼=‹|¸k×®‰×»wï~´‡: / ik=À#FŒ˜={öAgÍšUYY™ÎH@<†´µþ 6uêÔýèGÛ·o¿êª«úõë÷öÛo?öØc¯½öÚŒ3Úa> Äþýû‚Tµ¾µÝ–×ýͱgL= Ë—/¿þúë—-[=K¯­¯€¥ŽCVÀ¶6ý"àxã9`H› Ò&À@[Ð6XCÚHàÅ m $ðb 6Ø‚†´ 0À!,H› ¬€!m $p Ò&À@‡° m $° i` CX6XCÚHà¤M€aAÚH` Ò&À@‡° m $°†´ 0À!,H› lACÚHà4¤M€ž†´ 0À4¤M€VÀ60¤M€¶ !m $°†´ 0À Ò&À@+`H› Ò&À@[Ð6XCÚHàÕ m $ðb 6Ø‚†´ 0À!,H› ¬€!m $p Ò&À@‡° m $° i` CX6XCÚHà¤M€aAÚH` Ò&À@‡° m $°†´ 0À!,H› ‚´ 0À4¤M€aAÚH` i` CÚH` Òæ¸Ûºuk&“Éf³Ñƒ@¤l6+Àªlcccô N6ë€L&Í"Ø‚€ 0` À@€ €@€ 0` À@€ €@€ 0` À@€ €@€ 0` À@€ €@€ 0` À@€ €@€ 0` À@€ €@€ 0` À@€ €@€ 0` À@€ €@€ 0` À@€ €@€ 0` À@€ €@€ 0` À@€ €@€ 0` À@€ €@€ äH€7nÜXYYYPPPPPPYY¹iÓ¦è‰àpr!À;wî6lXIII]]]]]]IIIYYÙîÝ»£ç€CÊ666FÏðYUWW/_¾üÑGm¾rÍ5× }¢æHÓ 8°¶¶¶å••+W0 j€ô0HyyyMMMË+555Qó¤ÇÓût ;vì(..3fÌØ±c3™ÌôéÓyä‘ÚÚÚüüüèÑ †CX9Ì ˜¤gÏž‹/^ºtiQQQQQѲeË-Z¤¾‡²ÿßAo“Küß X@€ 0` À@€ €@€ 0` À@€ €ÿ#›ÍFÇ€ 8œW^yåä“O~à¢\sBô@ÇõÔSOÝpà ³gϾð £g\#À@²ßÿþ÷Ó¦M{á…ŠŠŠ¢g$À@‚»îºkéÒ¥Ï?ÿ|~~~ô,›²Ñ3H6›ýøãûõë·råÊSN9%zÈYaËËËûõ¯}á…®]»6zÈYVÀÀÿÈfÿ§žzjìØ±O<ñÄ\=ä +` Yyyù¬Y³FŽ9gΜèY 9„ÒСC,X0|øðÍ›7ßrË-Ñã@N± lA@€ 0`ðÿáEø¯«œ<IEND®B`‚gsl-2.7.1/doc/images/rand-beta.png0000644016036000116100000005224513373111455013616 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœìÝw\Ùâ6ð„"MY°º¨X  ‚(ØWE «‹eY ö]÷*ˆºvT°7\T\Å‚Aì"EE°!UŠÔPBòþ‘ûæÇEIÎdò|ÿ¸&$3\–'çœÉ “Ëå2@¼dHF(`PÀ €@€  @ €0(`PÀ €@€  @ €0(`PÀ €@€hf222:t°°°8vì‡ÃÏq:vìhmm½qãÆ/_¾Ô{Ž'ô} }o’ ÐZÜÿÍf§¤¤x{{9rÄÓӳɶ²~x­¨¨xýúõßÿ]ZZjbb,ÐNÄY¨[€º˜\.—t Æd6ðч PRRÒ‚×¶æ¸ñññööö÷îÝëÛ·okö#Äç ëµôƒ0€ð1™LYYYþfttô!CµµµOœ8Á£ÎL2ÿÉ™™™‹/VUUÕÑÑY³fMeeeó;pàÀåË—ûúúÖ=ƒÁ(--]³f²²r»víìííoܸñ£ L&“Åb-Y²¤cÇŽ Î}ú$%%¥§§;88ØÙÙ½ÿ¾É`?:Ï“'O~ùå—¥K—~üøñÇ‹/ž={öóçÏùOððð`±X………ÇŽÛ³gÏùóç›ûC &.´BƒÿYõíÛ·¸¸˜÷„Ù³gïÚµ‹ÿü±cÇò_ÛøÎ uuutÜg±XJJJõžÓ¶m[~ž&÷Ã`0|}}ô4ƒáããS÷[7nœ={v#©ê¾öGßšmN$ …ß`€V©÷޶}ûöæææÿþûoÝçÄÅÅ9::ªªª*))92""‚÷ø­[· xŸæ=RPP0sæL uuõ¹sç–––6RÀõÛ²„­éo€¤¤¤1cÆdee‰¨M¨²üýØœÿ éh 6lذfÍÑíŸ*,")))¤#€ä)..ÎÉÉY¸p¡èAÝyÚVÎ!3™Ì²²²±cdž……)** 1HÑ-hR·€[ kÀÐz¢kšOAP €©(à%K–ÄÅÅ‘Nðh»PZwÖ>>>ÞÐÐPYY™l$8Xn•¢}€~bbbœµ´´ÚµkgnnÒÈ“¹Þ‘ˆŽ(‰ÒÒÒÄv,©(`Z²¶¶þúõkHHHvv¶¿¿¿··÷ñãÇivDq urrÛá¤b š'33³¨¨ÈØØ˜T$áZ½zõŽ;øCÛW¯^M™2åGc8¡L¥ tDÉÂårÍÌ̼½½'NœX÷qLA ÁóçÏ=zD:ÀÿÉÌÌ\¼x±ªªªŽŽÎš5k*++zùÎ;ëN,ëëëgdd4òüŠŠŠ… jjjª¨¨8::&'' XÐ#J .ÈÉÉM˜0AlG”¢žÉçîîÞ§OŸ¤¤¤ôôt;;»÷ïß‹ôˆ’¢¶¶vãÆÛ¶mÊJy3IÑ4• 4(==·Ùx|ÿ÷­°°ÐÒÒòرcVVV ¾„Édúøø¬_¿žÿˆOZZZ`` ˆŽ(Aª««¯\¹âììüý·DØ&"¸Ç0%4òOãp8âLÐ ‹µqãÆ^½z)))ñþ ËÊʶlW999#FŒˆŒŒlä9 #==½î#iii;wÝëòòòI‡5——WËþ™ÜFÛ¤•h;LüÑ{–ÌÌL''§‡Šsžà{žžžoÞ¼Ùºu«¡¡¡ŠŠJee¥’’R þ&gffŽ7n÷îÝvvv<Éd²X¬º7§a±Xjjj555":"=ˆn,'ŠRY×®]/\¸€ö₃ƒŸ>}Ú­[7Þf½åØfNgee9::îÝ»×ÖÖ¶É#feeéêêÖÝÔÒÒé¡Rtÿ×€ zãÑ€€€ºßmr^”Á`äåå988lÛ¶­™]TosÔ¨Q"="4B € ===srròòòvíÚõñãGA÷ààà°nݺ±cÇþè õµ¯_¿ö÷÷ÏÍÍÍÍÍõ÷÷?pàÀ† „{Dh>©[æ;yòä´iÓÔÔÔÄ  ®ÂÂÂ¥K—Þºu‹ÃáüüóÏ~~~ªªªýMnpÒ¸¨¨H]]·ƒ‚‚þ“ËÊÊ–-[vùò媪*++«;wöë×O Ì‘–D·,½¼gÏž©S§öèÑCl‘ÄÉßß?55ÕßߟtŠÊÎÎÞºu«ŸŸ_ãOC Ÿ)gbbròäIÒA(jñâÅJJJ;wîlüi(`¡€àG>~ü8hР”””:4þL\ ZT¸\nYYé VÿùÏ<==›l_‘’ö>pàÀîÝ»I§ñ)..Ž÷ôô$ƒ¶ó´Íœ4¨®®–——Çu9¤ —Ëmæ_~¬ kÀÐzX€Æäää42ªÖT_ll¬‡‡‡ºº:æ[ Ì`0ùùù+V¬  …¸\®›››Ž5{öì:<|øP Ç¢7©»Cƒ444ÌápddðŽ$Ïž={:vìèâââêê*êc%''‹úR}Ã`0222...h_³ÌÌÌÅ‹«ªªêèè¬Y³¦²²²;‰?vìØš|fEEÅÂ… 555UTTQ¥d¡rˆ6l˜™™YvvvTTÔ§OŸ6nÜ(èX,Öœ9sTUU›|²»»{Ÿ>}’’’ÒÓÓìììêÝ‘ÆX,ÖçÏŸI§ø´=U¸eç­½}û¶GJJJ¢ˆЈ¢¢¢Aƒ¥§§ó6›ywÞß~û­K—.ëׯç¿êGú˜L¦ÿ™ ÃÇÇ'---00P #ÖÝ¡5ÈÖ­[“’’Ξ=+è q´˜ìÙ³'11‘t •••>>>FFFÊÊÊL&SCCãÓ§Oüï6çî¼W¯^MNN^·n]38sæÌz›±Å¼½½™ux{{‹óikÖ¬ñõõmÁƒHIÒûHÖ[3BžžžoÞ¼Ùºu«¡¡¡ŠŠJee¥’’’@¸ôõõïÞ½Û³gOþ#€Y,–¢¢"ÿ‹¥¦¦VSSÓ²üôgÖÓÓ“ËåîÛ·¯¯Ý?gAüôéÓnݺñ6ë-Ç6gB8==][[»Þ·x/l°3²²²tuuënjii tDIôþýû³gϦ¤¤R¦ Ȩ7 ¨ûÝæL7øx#3ÆAAAõ6G%Ð%‘¦¦æÅ‹ë¾Õ p¢¢¢-ZD:М£££§§gNNN^^Þ®]»>~ü(ôCÔÔ¾~ýÚßß?77777×ßßÿÀ6lúA©FMMÍÚÚštŠ €0tèPiø¥²üýý Fß¾}{õê•’’RoÜz………u9zôhBBBïÞ½uuuCCCÃÃÃõõõÝ-ÿÔ§z_ƒ $f ]Ptv€(øûû§¦¦òjZ CÁœ}’’’ÒÓÓìììêݱ9X,Öœ9sTUUERzÐvê@“÷îݳ±±î>xŠŠŠ ”žžÎÛôî¼Í™‚öññY¿~=ÿŸ´´´ÀÀ@ŽøÛo¿uéÒ…¿LA·|ÏtýÁÑþw$]eeåŽ;‚‚‚>þÌb± †¬¬l‹/ÛœNOO×ÕÕå?’žžnee•••Õü£\½zu÷îÝQQQüSS›ùÇÖÛÛ›ÿ¿7[,00Pœ§§ç›7o¶nÝjhh¨¢¢RYY©¤¤Ôâ?\Í)`‹¥¨¨È„Åb©©© ´²¦¯¯÷îÝž={6ÿ¸’'aQÈ‹/RSSI§‰|üøqƒQo9–Ù¨–±Þ`7++KKKK #¦§§kkk×{œø-9RVVF0@Ë €–œœüéÓ'Ò)@âÕÔý.·Q-;bPPP½ÍQ£F tÄoM¤Ö‹ŒŒÜ¹s§¼¼<©-FÛ©ÚÏŠ€¤›9s&“Éܵk—ŒŒL``àÓ§O/^¼(Ü)èº2™LWWWsssÞ- .\¸°eË–èëë·æ_Aömmm­‰‰É¦M›&Mš$¢C` €nüýý Fß¾}{õê•’’RoÜLßOógƒ 544ê>ùèÑ£ ½{÷ÖÕÕ oeûwôèQ---ѵ¯HÑv˜(†7e¥¥¥øP–¿¿jj*¯æi©¶¶ÖÈÈèÒ¥Kýû÷ÝQp´ÀD]Àyyy£FŠ—‘Á,P‘‰‰ÉÉ“'MLLH¡²²²¶mÛŠô(`‰a\UU¥   ÒCY(`á$,h=œ„@+(àÖò÷÷¿víé aäHx666:t $ mJ± @?µµµâö` €±víÚ={öN!˜‚‹uëÖ­)S¦@[/_¾¼yóæ›7oHŒ€…ƒÃáܽ{·¶¶–tzâr¹Ë—/ß¼y³ššé,ÂAÛ…R¬ÐɹsçvïÞýìÙ31_â €NòóóóóóŒŒÄ|\°ÀHpUUUuu5nÒ@8 ZblÛ¶íÌ™3¤SÕa,dl6[Nç–ÐFÀí Í ,,kôèÑeee¤ƒH°ŠŠ ÒD,JJJÛ·ooÛ¶-é ’*--­oß¾UUU¤ƒˆ NÂ*7nÜÈ‘#W­ZE6NÂ)råÊ•?.[¶Œt¢J?yòÄÝÝ]GG§M›6]ºt5jÔ¥K—H‡‚¸¸¸›7o’N IX,ÖÊ•+ýýýåååIg!ªðÒ¥KMLLnß¾]VV–””´f͚͛7{yy‘ÎÕZ§ººšt IÂf³½¼¼lmmI-ê.”¦§§4¨¨¨¨e/Ç0´ž4®ËËËËÊÊ’N T,àââ☘ggçß~ût¡IJJâp8¤SUP«€™L&“ÉTWW·¶¶VUUõöö&Hh|||ÒÒÒH§ª Vs¹\.—›››”œœ¼eË–&_âííÍlˆÒ äÂ… †††¤SUP÷L¥¨¨(77·ÏŸ?·ìå8 @‚p8j y¤ñ$¬Aƒååå‘N!|øT@=µµµ#FŒHLL$D¬¨[À=222"BÈÞ¼ycooO:µ:tHFFÆØØ˜t±¢Ê<í˜1c<<<,,,Ú·oŸ——wçÎõë×;vÌÑѱe;¤ìtqqq»víH§ Šœœœþýûß»w¯OŸ>¤³4@tmB•–ŠŠŠÚ¿tttqq±–––¥¥åêÕ«‡ÚâR¶€ .ggg}}ýæœuKý XèPÀÔÇápvìØáé驨¨H:KÃPÀ£xŸ8qB^^~Μ9¤ƒ@cD×&r¢Ø)4ÉÚÚZEE…t †ÒÃÄÖ ø$‚4~€ÆPÀ$q¹ÜÝ»wWTTâ†&‰Éd*(( €@ªàÖp<´](Å05?~íÚµVVV¤ƒ4 Ö€€Μ9“‘‘annN:y(`J¨©©yöìé¢UXX¸zõê#GŽÈËË“ÎB ˜>þ|ðàAÒ)DkÅŠ...þòÐv¡kÀTãëë»páBɺ .E)00´NÂ’l6»¤¤„t 90µìÝ»÷ðáäS€ÈÑvžVB§ kjjpr u` X`ZÀ@)X–:x÷4P]]M:u¡€)jêÔ©/_¾$ åjkkmll?~L:EÉ‘ óóóëÚµ+é-·gÏeee\vãGh»PŠ5`‚RSS‡ öäÉ===ÒYZkÀ 18Îüùóׯ_/éí+R(`J+//wuu­¬¬$@0 ,X¼x1é”FÛyZÚLAGDDØÙÙ1™LÒA¤>,0Ú0„5`ZAK†?:tˆt °dPUUUPP „†¶ ¥X§ÌÌLZ^>kÀ@]ïÞ½355ÍÏÏ'D’ €%ÌÛ·oŸ?N:Àÿáp8¿þúëúõë555Ig‘$(` “žžþîÝ;Ò)þÏÎ;åååÿýwÒA$ mJ± éééÏž=ÓÖÖ&E$p!¡€Ä€Ëå¾yó¦wïÞ¤ƒˆ X`´/àÔÔÔ:¨««“@g8 ê;uêÔ‹/H§€¢í0‘ö#`Œ€h,ñ2220Ö8(`‰·hÑ¢””Ò)@Z]¿~t : íB©ô¬s¹\&“I:H WW×:ìÝ»—t1]›È‰b§ Nh_›K—.ÅÇÇ¿|ù’t: í0QzFÀ|%%%jjj¤Sm}ùòeРA¡¡¡fff¤³ˆ΂†&ÔÔÔ 6¬°°t ­€€€%K–HUûŠm‡‰R8®ªªRPP èŒÃáÈÈH×È —¢˜0¦ A555¤#@PÀtSXXhff† 8ÚÎÓJótaa¡††ét€5`Is€°` Z‚Ã᎒ŠË庸¸$&&’B[(`Úúô铵µ5¦ eöìÙ“žžnddD:mÑvžSÐ #++«K—.¤S€äILL´··üø±ŽŽé,„a Zí -PQQ1}út___´¯H¡€à°ÙìeË–¹ºº’Bs(`úKLLœ2e é 1ÔÔÔ-ZD:ýÑv¡kÀ|çÇzzz¤ƒH|X`(`h=œ„@+(`)òòåK777Ò)€ÁÀ´Ta³Ùïß¿744$¨%;;›Åbéêê’BE˜‚!““Cû@=µµµ®®®.\ Dê €¤š···¼¼üš5kH‘:(`iôòåË_~ù…t /**êäÉ“22¨q£íB)Ö€Å`à±²²Ú´i“ é Ô…Ï  Ð$6›-''G:¥á$,>´/A(`©öâÅ‹9sæN šYž;w.222666//Á`tèÐÁÔÔÔÖÖÖÅÅECCC\9†)èæ`³Ùééé½zõ"€¢LAùòeþüù]ºt ²±± ÍÎÎÎÎÎ µ¶¶>{öl—.]ÜÝÝ¿|ù"ŠX rrrh_"~XìJJJ:::¾¾¾ >áÖ­[+W®üðá‹ÅeÂÂà{µµµ²²²¤SH#`ggç/^ü¨} †££ã‹/œE Ä ÷ ÁÁÁ...¤SÀÑv˜ˆ°@pÏ`Ú{ûö­••ÕíÛ·MMMIg‘$ø°ÀPÀ|,ËÒÒÒÃÃcþüù¤³H’Ÿvrrâÿ\WQQæ1è o\ègñâÅýû÷GûRJÓ¬££Ó¿ÿ3gÎð 733Ãt%-¥§§5Št ²%K–:tˆt øÍYÇÅŹ»»wîÜyÏž=þþþ ‡îÝ»·sÄÄÄ8p 22²ºººwïÞüñÇäÉ“[³CLA·XFFF÷îÝI§ —¢411yöì™­­m¿~ýîÝ»'Üöe0ÖÖÖ_¿~ ÉÎÎö÷÷÷öö>~ü¸pÍ„ö.EÉd2Ûµk§©©Éd2…žcÕªUwïÞ6l˜²²òàÁƒ·mÛ&ô£€@ª««IG ­fp\\ÜСC“““ïÞ½5nܸôôtáæØ¹sgÝ^×××ÏÈÈî!@ ………ƒFˆHÓ÷ÁX»vmPPСC‡ÆÏ`0üüü"""ÆŒ3sæÌ7Š(Ö­[·ŒE´sh èèè6mÚ@OM€?~üÏk_žQ£F=þ<55UDºÞÞß IDAT™ ÿú믽{÷ŠhÿÐLêêê¤#@KÄÆÆþõ×_¤S@š.àóçÏÿôÓOõlß¾ý¹sçD(77÷çŸ>tè••UsžïííÍlˆ(²I­’’Ò ¹ œœœ @:4ZŸÕÉÌÌ7nÜîÝ»íììZ¹+| IXªªª tÿþ} ˆ¨¯¦¦f̘1[¶l!…&| iîܹ¿¸¢¢bîܹŠ’••åèèèëëÛúö!RPPxþü9Ú@"xzz*((øøøMûaÿûᅢŽˆˆøÑÂÃÃüï¿ÿ %G^^žƒƒÃ¶mÛlmm…²C"EEEÒ Y† rþüyÜpP"ü°€SSS‡:nÜ8kkëC‡½yó¦´´´´´ôõë×´²²š0a‚¹¹¹°NÅrppX·nÝØ±c…²7‘>`b€ÊÜÜÜÔÔÔH§€fibjûëׯAAAQQQqqq_¿~e0:t055µ³³›1cÆ÷'gµéÒ…Ë庺º®_¿žth•¦GÖååå ,èÝ»·««k—.]²²²Îž=ûúõëãÇ+++‹'e ` ZäpsníGÁªC@ë‘\æ6ƒ(’dùðáÚ5kH§¸GçÎGŒA:€Ä í<-¦  õp-h$xë D•••sçÎåÝè BÆf³‡ž——G:p¹Ü_~ù¥ªªJSS“t2ÚÎÓb š OŸ>õìÙ“t :X·n݃ÂÃÃtM$5ѵ‰œ(v Rí §NºxñâãÇѾ´DÛa"FÀTPXX¨¦¦&'‡÷y-‘’’"//o``@:ˆT#y! …¦‚Å‹ÛÙÙýüóϤƒ´ X`(`*¨­­•••% åð1$Hh_€Aƒ8ÅÄÄN@!(`‡>DGG“N@il6 gR…¶ ¥X Â»à†©©é²eËHgÿ5`:ûóÏ?ß½{7þ|ÒA@|PÀ VUUU .,..&€B|}}¯]»výúueeeÒY@|p…+…±cǪªª’@IIIþþþ÷ïßÿé§ŸHg±¢íB)Ö€@R”––â])eáBCS_uuµœœœŒ ÖA€ºpÐω'H§ ƒ¶ÃDŒ€©¯¼¼\QQWË*ôÀPÀÐz˜‚:c³Ù÷ïß'@òóó£¢¢H§J@y_¾|  @䊋‹îÝ»G:Pmçi1 ”R^^îàà`bbâççG: kÀCu°X¬ñãÇëèè;vŒÉd’ŽÀ0H‹?ÿüóùóç¤S›Í=zôÑ£GѾÀGÛa"FÀêéÓ§}ûömÛ¶-é ¦ [ ðíÛ·’’6›­  Ð©S§æ|äšÃáäçç—••1 555UUUÑ' .ѵ nÆÔ•——סCÒ)¨…Åbåççùò%;;;??¿¤¤$//¯¨¨¨¸¸¸°°0//¯¼¼¼¦¦¦¤¤¤¸¸¸]»vjjjòòò•••¹¹¹µµµMîŸÉdjjjò®K\RRRRRÂd2yM,++«¥¥¥©©©¦¦Ö¾}{MMÍŸ~úIUUµsçÎݺuã}Kô?ú í0#`I÷òåK//¯7nB@yyùçÏŸ?~ü˜–––‘‘‘™™ùùóçÌÌ̼¼¼ÚÚZMMÍ®]»véÒEKKKUU•W„êêêíÚµëÔ©SÛ¶måääÔÔÔÔÕÕ…¦²²²¤¤¤¬¬¬¦¦&??ÿëׯ¥¥¥EEE_¿~-,,,--ÍÊÊÊÌÌÌÍÍ-))ÑÒÒêØ±c÷îÝ»wïÞµkW]]]]]Ý=ztêÔ kŸ ¡0-00 °Ùl99šOÒ¿~ý:555===---=====½¢¢¢G=zôÐ××ïÙ³g×®]{ôèѹsçŽ;Rùž9¼†ÎÍÍÍÈÈà½cHOOÿþý—/_ŠŠŠ´µµõôôôÿ?###mmmº¶2—Ë---USS#„,00PзoßâââRRRÞ¼y“––VZZÚ»wo}}}^?éééuìØ‘tR!«¬¬|ÿþ=ïïß¼yóõëW===ƒ>}úôë×oàÀúúú4¸;—Ëýý÷ß9ÎáÇIg!@ L'‡rppÐÑÑ!D0\.÷ýû÷±±±±±±qqq)))ß¾}0`À€úõë׫W/==½nݺÑuؤ²²²´´´wïÞ¥¤¤¼zõ*...//¯wïÞýû÷755555íß¿¿ŠŠ é˜[¾|ù“'OîܹCåé h>°ÀPÀtröìÙ‘#GvéÒ…t¦¥¥¥=yò$..ŽWºíÚµ311áÕ‰±±qÏž=¥¶n›£´´4%%%..Ž÷LIIéÙ³§©©©‰‰É!CÌÌÌ”••IglŠ+îß¿.¬5x ,00ˆGyyù‹/=zôøñã'Ož(**ZXXð×ÄÄ'·FMMMJJ ï­ÌóçÏ_½zÕ§O sssKKKmmmÒëKKKsww¿råJûöíIg¡A LWeeeÄ/Ó‘››ûèÑ£èè蘘˜ÔÔÔ˜››[XXXXXtíÚ•l6«¬¬|ùòåÓ§Oyow8Ž¥¥¥••U¿~ýpci°ÀPÀ´ôîÝ»¹sç>xð@ü‡þúõë;w"##cbb ,,,¬­­­¬¬ÌÌÌÚ´i#þ<ðùóçDGG?xð ##ÃÂÂÂÆÆÆÞÞÞÔÔ”gru €†¦+‹¥¤¤$žc•——ß»w/<<üÞ½{Ÿ?9r¤MïÞ½±”K)EEE<ˆŠŠºsçNnnîˆ#lmmÇŒ£¯¯O:H<°ÀPÀÐ2\.÷Õ«WaaaaaaÏŸ?yòdÈ!“&M¼%ýTTTܹs'444,,¬M›6'Nüù矇 ÖâÕ⊊ŠI“&yxxüüóÏ Tƒ ‘––rõêÕׯ_?~Ò¤I£GÆ`WJ¼zõêÚµk—/_ÎÉÉ™4iÒĉíìì:“®¤¤d„ zzzÇŽÃÙ×´‡ Xªäææ6çòiiiÁÁÁÁÁÁ999“'Ož4iÒÈ‘#q³ÔJOOç½KII™0a‚““Ó¨Q£šü}(((ptt|øŠ+†.”Ýæçç£}AÌ >|ðàAccãåË—3†Éd’C ,qâââ|}}oÞ¼9kÖ¬¥K—âÓ@ÕÕÕÿþûïž={ª««—/_>kÖ,\F²` h‹Ë円†ÚÚÚNš4©ÿþéééûöí]û~ùòå?þÑξצM›9sæÄÅÅùûû_½zU[[ÛÛÛ;??Ÿt.  ÄÔÖÖž;wnàÀÿùÏæÏŸŸžž¾zõjuuu‘´}ûöæææ"=H–ðððÊÊJ1ÈÖÖöúõëÑÑÑYYY½zõZ¾|yFF†Ž ”…*++>lhhxèС­[·ÆÆÆº¸¸ˆçc***“'OÃ@"ìÚµkÞ¼yâ,Â^½z=z411QVVvàÀóæÍ{ûö­ØŽ”‚±*--ݱc‡®®nhhh```LLÌØ±cI™’™™ùêÕ+"‡âjjj-ZtæÌ™Çˆùè]ºtÙµkWZZšŽŽÎˆ#¦M›öâÅ 1gâPÀ &%%%[¶lÑ××OHH¸}ûöõëׇ F6Rbbâ½{÷ÈfR&Ožœ™™yÿþýnݺ‘Êо}ûõë׿ÿÞÊÊjêÔ©ãÇǵۤ mOÆYÐÔQRRâççççççàà°~ýzñ6¾÷òåKê\R­ººúäÉ“[·n566öòò2déDð_8 $oÔk``ššúàÁƒÀÀ@ʶoAA›Í&ÄÇÌÌŒ:íË`0Ú´i³hÑ¢wïÞ?ÞÉÉ £ai@¡ß? “²²2Þ„óÛ·oyÕkhhH:TcvìØqþüyÒ)@ÚµiÓæ·ß~ãÕðÔ©SÇ÷òåKÒ¡@Th;O‹)hRª««>¼uëV;;» 6P¼wù8¥ÆCÕÕÕ'NœØ²e‹……ŦM›ŒŒŒH'’R˜‚ P[[{êÔ)CCȈˆ°°°3gÎHJû2Œºí[÷þ¯@âù˜¯ÐñGÃC† ±¶¶vwwÇç†i†Bëáá¡®®ŽË¥J.—{åÊ•þýû]»v­ÿþ¤CµÜ´iÓž={F:Gjjª©©é£GHi!%%¥Õ«W§¦¦vêÔÉÄÄdÅŠ¸ŠmP¨€gϞݡC‡‡’‚‰‰‰177ß´iÓ®]»¢££---I'j­#GŽ <˜t ‚ððð#F¬\¹RÒ-Ûµk·yóæäääšš##£M›6•——“­EÅ…R¡L¸c X ’““ÿúë¯W¯^ýý÷ßÎÎΘºJÙ·oßöíÛ/\¸ ¬{jQÄÇ×­[wÿþý 6Ì;WNNŽt"šÃ0PË—/_æÎkgggmmýúõë3fв}¹\îÔ©S?þL:´Dyyù£GhÖ¾ C[[;((èòåË.\èÛ·ïåË—I'‚¢â0#`*«¨¨Ø¶mÛÁƒ-Z´víZUUUÒ‰D+..nàÀ´|{4±zõê¶mÛîÛ·ÏÔÔ”tzÂÈãr¹AAAFFFïÞ½‹ß¼y3íÛ—Á`˜˜˜ }²FõòåK77·qãÆÍŸ??''‡t"€Ä°··7³!¤sÑÍLJ âççtîÜ9‚—Ï%¥¦¦ÆÝݽ°°t€ÿ!##ãîîþæÍ›öíÛoÞ¼™Åb‘ÍBÅyZLASJffæÚµk£££·oßîââ"Íonnܸ1nÜ8iþ P®£ÂóñãÇU«VÅÆÆîÚµkÊ”)¤ãЦ €ÊÊÊ­[·8P[[ûÍ›7®®®RÞ=ãÇ—òŸ5ÅÆÆ0³¯ C[[ûâÅ‹Ç÷öö5jTrr2éDÐ04ìêÕ«}ûö}öìÙÓ§O7oÞ¬¢¢B:…TUU­\¹Ĥ‚ãÇ;88xyyuêÔ‰tª°µµ2eŠ­­íÒ¥K‹ŠŠH'‚†¡€¡¾·oߎ=zݺu‡¾r劮®.éD”#''7pà@eeeÒA¤ZyyùìÙ³ýüübbb¦M›F:µÈÉÉyxx¤¤¤°ÙìÞ½{=z”ÃáõQ¨€ëž?…s©ˆ`±Xëׯ·²²;vl||¼½½=éD%++;{ölü~§««ûôéSÜ¥àG~ú駃†……>}ÚÒÒ2..Žt"ø*`nCH‡’"¡¡¡ÆÆÆiiiñññžžžòòò¤I†êêêuëÖá¼SñSQQÙ¸q£’’é T7`À€˜˜˜… Ž;vÙ²eÅÅŤÁQ¨€”ŒŒŒ)S¦¬X±âÈ‘#çÎëÒ¥ éD’„Ëåêéé)**’ðCL&sîܹÉÉÉ•••}ûö=wîéDÀ`PócHB!5‡ÃÙ¿ÿ¦M›–.]ºfÍÒ‰@´ž\¿~=Ú·õjjj<==ËÊÊH¡!܃OXÌÍÍ_¼xamm=xðà;vÔÔÔN$½PÀÒ¨¬¬ÌÓÓsüøñ¿ÿþ{TT”¡¡!éD4!##3dÈ|dK¸ &Ož¼lÙ2ÒAèCNNî?þxúôitt´©©éãÇI'’R(`©sóæMccãâââääd777œÊ+D²²²¸\‰pEFF8ÐÐÐ0 €tºÑÕÕ ]¿~ý´iÓ–.]ZZZJ:‘ÔAK‘‚‚‚Y³f-]ºôĉ¤Ñ›ÍvssÃÄikCaAÓMnnîĉ}}}ü¼¼pIg š={vtt4éTqãÆ~ýúq8ü9¢–!C†¼|ùRGGgÀ€—/_&‡†h;O+SÐ!!!¿þúë† P½”UVV¦¢¢‚é袢"OOÏG}|8}útÒq€r ¤¯¯Ïûº¶¶6++‹HŒ‡åææ&&&®^½ºM›6DbeuêÔ),,lĈƒ ŠŒŒ$‡ŠPÀÔ’””4xð` GñÿÈüH\\Ü’%KˆZOOïòå˧NêÔ©‘@}²²²^^^³gÏþûï¿ip^ŽpÑáL¥IâIXgΜY±bÅîÝ»gÏžM: H .—K§|-eff:;;khhœ:uJCCƒtÁà$,šc±Xîîîÿýwdd$ÚÂo_.—ëææFjF ]»vŠŠ244433{úô)é8T&ïýû÷–––•••Ïž=ÃÙÎÐbL&ÓÍÍ­sçÎÂÝmEEÅ£G„»OB¼³£÷íÛ7qâÄŽC (`Ânܸaiiù믿ž9s¦mÛ¶¤ã€d³µµåˆÓÒÒ>þÜš½ÕÖÖ:uJጉ'>zôèøñã³gÏ®¨¨ ‡001ÇËËËÃÃãÊ•+‹/&èæéÓ§wïÞmñËCBBúõë÷Ï?ÿ\¸páèÑ£B RNOOïÑ£G²²²ééé¤ã$yg*5ÅOÂ*))™5kVqqqppp‡HÇú«©©‘——oþówïÞmll: X`b.àÊÊÊ_~ùåË—/W®\ÑÒÒÛqHILL466æßý@Ô:´iÓ¦K—.µfa¥°LiyyyvvvL&3""í bÀår###oܸA*@mm­§§ç·oßH)ôÛo¿8qbòäÉçÏŸ'E8PÀ­õêÕ«¡C‡ÚÛÛá”+µ’’’ýû÷÷íÛwùòå,‹T YYÙ»wï¶oßž·YPPG* HGGLjˆˆ?ÿü“WËB·ÊíÛ·yW¹òööÆ\ˆZQQ‘®®îÇ9’àääD:Ñ¥¦¦†„„NR¡_¿~Ož<‰ˆˆ˜9sfUUé8­‚5à–;zô¨···ø$@šñÇ”jhhh``@:Ðï´›ÌÌÌ«W¯Šú&†X¦Þ Ï»víºÿ>ÚĉúíË`0rss%}h§¨¨xîÜ9 ‹áÇúô‰tœÂX`ÕÕÕîîî©©©×¯_Ç)W tŸ?þçŸZy+ꨭ­õðððóóÅ'£üüüvìØ"º+þbLß¾}3fLyyydd$Ú„¨´´ôĉ666fffyyyC† !H8jkkíííùíK×wü@ÊÒ¥K80nܸk×®‘Î"09Ò$IFFÆØ±cGµ{÷nÜX„+//ïöíÛË—/wttlÓ¦ é8BÓ¦M›iÓ¦ñ7oÞ¼yéÒ¥“'OŒ43iÒ¤®]»Nš4);;{áÂ…¤ãSÐÍ•˜˜8nÜ8OOÏ+Vq·R…ËåþôÓO¼Í7oÞüôÓO˜L‚ÖKOOwtttvvöññîgR0Mؽ{÷Fµ}ûv´/´ÒóçÏ¿~ýJ:1L&“ß¾ ãæÍ›="˜hCOOïÉ“'QQQ¿üòKMM é8Í‚pÓ.]ºôÛo¿9sfôèÑBÙ!H.—ûüùóààà‹/*))yò¤´´týúõ¤ã€˜ÄÇǯ\¹òîÝ»¤ƒ,ËÉÉINNîüùóͼE&Ö€Eåܹs , EûJ‚‚‚aÆihhxxx¼{÷ÎÈȈt"ŸÖmßààà Ìb¦¤¤tåÊEEÅñãÇ———“ #Õ#àcÇŽùøøÜ¾}»oß¾âITÀårcbb ¤¢¢B: WRR¿hð¡C‡X,î¹B{µµµ‹-JNN¾yóf“{À´Àšü‘íÞ½ûÀááázzzbK¢V\\Ñ©S'Ò¡@b”––VTTtìØ‘·¹yóf}}ý3fM¢ÀårW®\Ö¡C‡Fž‰Xã?2//¯ .„‡‡×½¶ÐÀˆ#jkkMMMMLLLMMûõë'++K:HªÜÜ\þíŠûí· &Œ;–l*"ooïóçÏ7Þ(`ýèGÆårW¬X}ûöíÆßõ•––¾~ý:))iĈúúú¤ã€t),,”——WUUåmŽ3ÆËËËÒÒ’·YPPP÷VÇ )|}}÷ïßßÈl(NÂŽÚÚÚùóç?{ö,22í+Y¶oß®­­Ý¹sgèèè’’Ò‰@êhhhðÛ—Á`\¿~}ðàÁüÍ©S§&''ó7>|Èb±ÄšZdÅŠþù§µµuÝÿûÄCŠFÀ555³gÏ.(( ÁÙ7TSUUõáÇôôônݺ 0àû'¤§§3™Lmmméz×ÊÉÉéÈ‘#¼ÍÝ»wÿþûŠdSÁüûï¿Ë—/¿~ýú÷·N¸µªªª¦NZYYyãÆ ´/¥œ>}Z[[»]»v'NÜ¿ÿ»wï|šžžž®®.Ú$Epp0¿} FYYY›6mx_s8KKK6›Íÿî§OŸÄþ׌3Ž=:nܸ‡Ší þüyùòåááá ÃÞÞ~ï޽ݻwoñÞê¾ga±XS¦LQSS;sæ î‹.6¥¥¥ïÞ½ûüùszzúÇ.\øýÓrssËËË{ôè[ ”àp8 &&&¼Íòòò¡C‡&%%ñ6Y,Ö®]»pq"ÂÃÃgÍšuáÂkkkþƒô—••ÙÚÚššš~úôéÓ§O¦¦¦vvv­ßsyyù„ 455ƒ‚‚оÂUUUõþýûÔÔÔ¿ãîî™™ihh8pàÀŸÖ±cG]]]´/H~û2 ~û2ŒÚÚÚvíÚñ7322LMMù›%%%AAAâÉ)…ìííÏŸ??}útÞPPä¸Ôàëë;sæÌºÌœ9sß¾}-Þ!ïŸVZZ:bĈyóæÕÖÖ¶6¢ô©®®nðñ‡öîÝ[SS³M›6:::+V¬s0©’ŸŸÏÿ:''gÆ üÍׯ_ÛÙÙñ7¿~ýzîÜ9þ&›Íæp8â I'<èСÃÍ›7y›¢+JªðÈ‘#ÃÂÂê>fkkÛâ2ŒÒÒR+++www´o]_¿~ÍÌÌlð[‰‰‰VVV½{÷ÖÒÒRPPøÑÏ¿´´499977W”1 i555ÙÙÙüÍOŸ>mß¾¿ùâÅ‹!C†ð7ß½{çååÅßÌÏÏðàXbJž'OžtìØ‘×Á¢+`ª¬wìØñÕ«Wü Ð0Œœœ“ììì–íÉdZYYõêÕëÈ‘#4>s§¢¢âñãÇ%%%l6»¬¬¬mÛ¶NNNß?-11q„ %%%ß¾}SWW·¶¶¾råÊ÷O+..Ž×ÔÔÔÒÒRSSÛt’———`ooÏÛLII ܶmoóÞ½{[·n ãm&$$\¼xqÓ¦M¼ÍÏŸ??|øÐÅÅ…·YTTôåË—~ýúñ6y'”Ñl!ééÓ§'N|ø0kÖ¬ªªªÒÒÒÒÒR]]Ý|ÿ´´´´… ª©©ÉËË«¨¨èÿ¿öî.¤©?ŽãøÆ?½Ê§VYt!¥ÝLIFAæ$2¡i …BƒvQ7Q‘P»H$³%ª]äEš£P Y7©å&‰EO&)+Ý(-h²ö¿Èrÿ¿¹‡³ßñœ÷ëîü<¿ç÷Ýñs¶•“ÓÐоšÏ盜œLKKKOO×jµñß%+ŸÏç[x«öÌÌÌëׯ¾fäÍ›7‡ãÈ‘#ÁÅÁÁÁöööæææàâ“'OšššÿZ­699y‰²*õâÅ ‹Å’žž.Ý<+*€çææŒFcaaáøøøøøxaaaIIÉÏŸ?E×¥LÍvQQÑׯ_;;;§¦¦®]»fµZoܸ±hÀŸ¤ßå‹âˆ  ñQ a._¾|àÀ%ÖIÈN¨TMMÍúõëŸ={&áïoùÊÕÜÜl6›CGÌfó•+WDÕ£lÍöÉ“'ÿþ½°èt:³³³CWPØKQ&"="èBÜÅòGÉï÷oÙ²åùóç #4Hé¦]QWÀÝÝݵµµ¡#µµµ]]]¢êQ¶ˆf»©©)ô6NNNO€#B¸XZ`·Û333 ƒ4¥A|˜——·hpÆ III7n4›Ícccq+TÅ¢è]ˆ¯X“–––'N,¤AJ¢¨öz½kÖ¬ ÑétGT=Êõl{<ž†††–––ÐA“ÉÔÑÑ1;;;00`0ŠŠŠ†‡‡ã\±úDÚ#ºwQ&###oß¾­¬¬ ¤A £ (è1~rrò?’’’FæççW¯^ýë×/U)Ut³ív»:rêÔ©ªª*Qõª¥ ¢k8333ÝÝÝæåË—¥¥¥.—+33Sti€ºp ¨‹N§kmm­¯¯÷ûý~¿¿¾¾þÒ¥K¤/x\jtøðá¼¼¼@ ðôéS»Ý.º@`@ÜnwIIÉ·oßúúú¶nÝ*º@`@Ž?^\\<===22rõêUÑåjÄ3`@uzzzÞ½{WQQQWW7<<ÜÓÓ#º"@¸ÔÅëõ †Çgggk4šÑÑѲ²²¡¡¡ŒŒ Ñ¥êÂ0 .‹Ål6ÓW£ÑèõúC‡Y,±U*Ä0p €0À@  €0ü ÜUh>‰ÍçIEND®B`‚gsl-2.7.1/doc/images/rand-binomial.png0000644016036000116100000002725013373111455014473 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœíÝ}\Ôe¾ÿña¸AnT=†·ÕBAr¼A[³@KÎÇbYšìº©mnií©¶GžM܇X»ž£Zíêê‰-¼«£,šíäoòäÍñÈ»ÄRîr€™ßô›†˜q`®ëúÎëù\ó™ƒ\ïù\ßk¾è-‹x×Ñà‹` €€@` €€@` €€@` €€@` €€@`À=z :tèäÉ“7nÜh6›­x¿¤>Æúo ŒŽŽž6mÚŠ+.\¸àîã»ÈúP}û*yÿ5 ×ëýüü¬_[¿èìì\¹råˆ#o¾ùæõë×ÛÞ«¨¨(%%Åh4Æ”””½{÷Ú>`kkë¢E‹"##üë_ÿÚb±´µµ=ñÄQQQáááO=õTGG‡Ý3êtº‹/>ùä“¡¡¡#GŽ|þùç¿ýöÛøçÜqÇÏ<óÌš5kì¿©©éùçŸ;vlHHÈ Aƒf̘±gÏëÖÕlë½ÚÚÚžzê©èèh‡+Ï­­­?þøàÁƒFczzzyy¹í?¿{UÖgqø\.¾ª=ÿD¯²p‡íoMggç?þñýû÷Oœ8ñç?ÿ¹Ý:nÑ¢E/¾øâ©S§š››?þøãQ£FmÛ¶­ëÖO>ù$22òwÞ©««»|ùòŸÿü爈ˆO?ýÔzߟýìg[¶lihh8uêTJJÊêÕ«ö³ŸmÞ¼¹¾¾¾käÕW_í^R\\ÜæÍ››ššÎ;÷ÐC½ð ÝqöϱUQQ1zôh»cxàgžyæë¯¿6™LõõõEEE÷Þ{¯³ÇÑétóçÏ/((¸zõj÷§Óét<òȺuëjjjjjjÖ­[}æÌ™ª²½¯³›z}U{ø‰^FîqøF6!!Á3¶9ñ›ßüÆö¾{÷î4iR×׳fÍÚ°aƒí­yyy>ø õ¾Ö|µX,‡6¶#‡ºãŽ;ìžÑNCCèQ£z>ÆÙx[[[pp°Ý1´MÓžG§Ó­Y³ÆÙa:î·¿ý­íM+V¬˜7o^U¹À½¾ª=üD/#€÷ØÍþÿøÇ?Þÿý[n¹å?ÿó?íÐétÖ–®KCCCDDD××7ÝtÓùóçmo­ªªŠ‹‹³Þ·ººÚzÓÕ«W»„……Ù=c[[ÛŠ+n¹å–ààà®w~~~Ëvöϱjii ±;fâĉ .¼pá‚+£ÓéÎ;çì°î/ÎéÓ§‡ ÖCU®p¯¯j?ÀËØË¸Çá £GΙ3çìÙ³¶tq0`€Ã»]½z500ÐzÓõë× ÔuÖV¯×›ÍfÛS›G¬OÔõÅÓO?]YYùòË/ß|óÍF£ñÛo¿íêb•ÝÃxEEÅ¿ÿû¿Ÿ:uÊö˜sçÎýêW¿úàƒFŒ‘’’2kÖ¬ÌÌLëIY»ÇÑëõ&“É`08|º®3ÄAAAÖ›ÚÚÚÂÂÂÚÛÛ>šÙlîz3áì¹\|U{ø‰^Æ&, Ü~ûí/^ì>n7×ÛŠŽŽ®««³©««‹‰‰±~Û}#R¯¿Ù¹sç¦M›Æg4u:]ׂ³{÷î»ï¾ÛnpäÈ‘»víúæ›o¶mÛ6yòäÜÜÜ ôð vékçÒ¥Kvß2¤ëëðððo¾ùÆöÖsçιRv¯¯j?ÀËø¿ôÏ?ÿ|ذanÝ%99¹¨¨Èvä/ùKrr²'eØõ”[¶l¹±Ç)--]·nݯ~õ+‡·&%%-Z´hß¾}Û·oï 2™Ln=KAAÝ·Ó§Oïúúæ›oþä“Oloݼy³õëž«?^U ¿x}ÑP›ÝoM}}}×9`ë†#óS•¶ƒ‡ŽˆˆèÚ¯[WW÷Î;ïDFFþßÿýŸ³ûö0býbΜ9sçέ©©¹|ùòêÕ«ò“Ÿô\ŒíxGGGCCáC‡ž}öÙ!C†¼ûî»Ý™:uêŸÿüçêêêöööššš_|1==½ë¦„„„]»vuttôP°]ÍsæÌyíµ×jkkkkk_{íµèèèS§NuݺuëÖ1cÆ”””´´´œ>}ú…^X´h‘õ¾=<—»¯j¯ ÐßøŸ¸Çî-lDDDJJŠíGY\ `‹Å²k×® &O˜0¡°°Ðáa½ŽX¿¨¯¯Ÿ;wndddxxøüù󛚚\ à.C† ™:ujNNŽÝ6+ë}?ú裬¬¬¨¨¨   1cÆüú׿þæ›oºnÚ·oߨ±c»> íÊ?_§Ó577?öØc!!!÷Ýw_YY™í‘yyycÇŽ5 Ç_±bEׇž]y.·^Õ^ ¿±û8 €0À@  €0À@  €0À@  €0À@ €¼|þüù¬¬¬°°°°°°¬¬¬êêjgG=ztÁ‚#GŽ ˆ>}ú{ï½çÍRp—¤ÜÜÜœšššœœ\UUUUU•œœœ––ÖÚÚêðà%K–Œ7îƒ>hnnþâ‹/žþù•+W._¾ÜË5à:½Åb]ƒk×®=qâÄÛo¿myôÑG'Nœ¸dÉWî~æÌ™ñãÇ766ö[xDÒ¸¨¨(;;Ûv$;;»°°ÐÅ» ??¿~¨ €¾!i———'%%ÙŽ$&&VTTôzÇ«W¯–””Ìž=û‰'žè·êð”¤KÐ---ƒÁ:ÒÞÞ>pàÀëׯ;»‹^¯·~=cÆŒ}ûöÑäe‘’Á`0™L¶#&“)  ×;^¾|¹   66vÅŠ½ìl£VPP— iÝx˜õHÒ8::º¬¬,::Ú:R[[;nܸššWîþÑGýô§?=þü=»^/éËð²þKIÏ'$$”––ÚŽ”••ÅÇÇ»x÷ñãÇ×ÕÕõC]ô I8###??ßv$???33ÓÅ»9räÖ[o퇺è’ðÂ… 9²jÕªÆÆÆÆÆÆÜÜÜ®Ë]Y°Ýruß}÷ÖÕÕµ··_¼xqË–-=öØË/¿,¢p\"i‡††;v,.....îøñã0~á…òóóãããCBB&L˜°wïÞ÷Þ{/==ÝË5à:v9À&,@ŸÛ„€¶À@  €0xÛùóç³²²Â²²²ª««{8XßM—wòäÉÅ‹‡‡‡;|.·ŠG`ðªæææÔÔÔää䪪ªªªªäää´´´ÖÖÖîbw áþ®pÞ¼yC‡=|øp÷›n x8ÃçmàcHúÏÚµkOœ8ñöÛo[G}ôщ'.Y²Äáñg¤îOínñÀÇ@<½^ßÚÚúøã<Øh4¦§§———»û EEEÙÙÙ¶#ÙÙÙ………}R^ggçÊ•+GŒxóÍ7¯_¿Þó‡µÕÅû ܰ`Á‚øøø/¾øâÌ™33gÎLKK;{ö¬[P^^ž””d;’˜˜XQQÑÃ]bbb ðaÃæÎ[YYÙÑ‹/nkkûðÃ6nܸvíÚíÛ·»U^Ïn x8C€~øÃ.]º4&&&&&féÒ¥‹/ÎÉɱÞÚ}ÃT÷ÍS‘‘‘¶ÕÐÐàì333wîÜÙÔÔtìØ± &L›6í³Ï>svptttnnî˜1cŒFã´iÓòòòÖ®]ëVy=s·xô€“p€Cz½þÌ™3£F²Žœ9sfêÔ©—.]rýAZZZ ƒu¤½½}àÀׯ_wåîo¼ñFaaá|àJy£G¾á€ì>Þpñ999+V¬¸±2<·|ùrÛ÷Iné¿D i €8¤×ëÛÚÚ‚‚‚¬#mmmaaaííí®?HtttYYYtt´u¤¶¶vܸq555®ÜýòåË£GnnnvX^ggç€ìoxBë~_‹W›°@ vÍî¥K—† býÖ•5Þ„„„ÒÒRÛ)++‹w±€žÃÀ.}íx¾íañ°E€ ì¾>}ºõ[KºŽÉÈÈÈÏÏ·}üüüÌÌL رcÇwÞycÅ»R^Ï<,ßÓóÏÃ7ñ²pH§ÓÍ™3çµ×^«­­­­­}íµ×¢££O:åÖƒ\»vmäÈ‘¹¹¹ +W®ìZR¶}ëש©©;w©1™LgÏžÍÍÍD  €0À@  €0À@  €0À@  €0À@  €0À@  €0À@  €0À@  €0À@  €0À@ €¿èô±X,ÑU|G¯×wvvêõzÑ…Ò!€Mioo÷÷÷7™L¢ ùŽÑhlkk ] – M1™L¢«ø§––ÑU2"€Mioo7 ¢«ø'£ÑØÚÚ*º @F0 )00à h KЀ*`@S$ì€Y‚"€M‘0€é€‡`@SX‚TAš"aÌ4à hJ{{»T0KЀ30 )&“Iª˜%hÀЖ UÀ€¦È¶M 8Cš"Û40à  hŠ„KÐtÀ€C0 ),Aª €Ma P h KЀ*`@SX‚TAšÂ4  Ж UÀ€¦° ¨‚4…%h@0 )²-A‡„„|ûí·‹Et!€t`@Sd `½^ØÖÖ&º@:0 )²Öqp‚4E¶sÀ:NNÀ€¦È¶­ã“H€0 ),Aª €Ma P h KЀ*`@SX‚TAšÂ4  Ж UÀ€¦° ¨‚4…%h@0 ).AÓÀ€¦H¸M 8Dš"ç40Ð h KЀ*`@SL&KЀ`@S$ì€Y‚"€M‘0€Y‚"€Ma P hŠ„0KЀC0 )0KЀC0 ),Aª7€ÏŸ?Ÿ••–••U]]íìÈ’’’Ù³g2dРA)))»wïöf€N§ÓK£³³Óßß_ôëñ=!!!­­­¢_˜ïX,ѯðI¸¹¹955599¹ªªªªª*999--ÍÙ›èiÓ¦]¹re÷îÝ555yyy999›6mòrÁðe~~~9˜Ífѯ‡=½^o6›E¿0‹ÅâïïßÙÙ)úõ¾#éûÁµkמ8qâí·ß¶Ž<úè£'N\²dI÷ƒŸ{î¹ßÿþ÷z½¾ëÛ²²²|ðôéÓ7üì¼M†[ÚÛÛF£Éd]zR__,º¨¤ÿAÒ¸¨¨(;;Ûv$;;»°°ÐáÁ«W¯¶¦¯N§3fLëÕ@Ÿëê€EWÞ †öövÑUß‘4€ËËË“’’lG+**\¹ï¾}ûn»í¶þ© pÀl6 é¯lÀŠ\›5¬###mG¢¢¢z½cCCòeË6nÜØo¥öè€UAC*šzÛ~ùòåxà7Þ˜:uª+Ççää8Ü'ÙßuBcè€UAC*’Îvýn}}½]OlçâÅ‹÷ÝwßK/½tÏ=÷¸ø,999·JÞxÝðI°üýý `ÈCÒY#!!¡´´Ôv¤¬¬,>>ÞÙñ—.]JOO_³fMZZZÿW|Ùlf Z tÀФœ‘‘‘ŸŸo;’ŸŸŸ™™éð຺º™3g¾òÊ+©©©^©ø:`UÀФ³ÆÂ… 9²jÕªÆÆÆÆÆÆÜÜÜ£G.X°Àz€í™Ú™3g¾øâ‹ÿöoÿ&¢R€X0¤"i‡††;v,.....îøñã0þûßÿþÈ#Øm¤úæ›o¼\3|°*`HEÒ!étº#FìÚµËÙ­¶[¥Ø6±è€UAC*¼m<ÅÇTa0:::DW|‡YðâP0¤Bž¢V ©0kž¢V ©À€§è€UAC*Ì€§è€UAC*0à):`Up-hH…YðâP0¤Â¬xŠ q¨‚†T`ÀStÀª €!f ÀStÀª €!ð°*`H…Yð°*¸4¤BžâcHª †T˜5Oq!UÀ  xŠX0¤Â¬xŠX0¤Bž¢V—¢„T˜5OÑ«‚R!€OÑ«‚†T˜5Oq!UÀ ³à).Ä¡ R!€OÑ«‚†T˜5OÑ«‚†T`ÀSlÂRׂ†T˜5Oñ1$UÐC*0à):`UÀ ³à):`UÀ  xŠX0¤Â¬xŠX0¤Bž¢VŒRaÖ<Å…8TA ©0kžâBª €!ð°*`H…Yð°*`H…>>>>~É’%ûöíûÿø±cǶµµõ€¼Ìf³Á`]z§×ëýüü:;;ýý{Yü¼ÀéÛöÙ³g?~Ü.}m¥§§?~|öìÙýS  – Â*4äáômàÿüÏÿôzçW´%h…tppp°èBvA¿ùæ›Ç×®]Û×ÅJâsÀ áï1@½Ï999%%%vƒï¾ûîºuëú§$@1|X!,AC½ðÿþïÿfggWUUYG:´téÒ}ûöõga€2è€BC½ÏS¦LY¿~}VVVKK‹N§«¬¬|øá‡ß}÷Ýøøøþ/P°B`ÈÃ¥½øõõõóçÏõÕWï¿ÿþ7ß|sòäÉý]  :`…À‡«†ûéOZWW—˜˜¸zõꌌŒ~­ P °B`ÈÃO£?÷ÜsÏ<ó `ìð1$…ð÷ §iª×ë{½3Wtt\ˆC)tÀ‡Ó&\Ñ+„†<˜5OÑ+„†<œðüùó[[[{¾skkëüùóûº$@1tÀ !€!§³Æ¶mÛ&L˜ðá‡:;`ÿþý&Lضm[ÿ(ƒX!0äá4€¿úê«I“&ýøÇ?ž6mÚo¼QYYÙÔÔÔÔÔôå—_¾þúëS§N½ÿþûSRR¾úê+o– HˆX!\ òpº køðá›7oþÝï~WPPð׿þõ•W^¹råŠN§:thrròÃ?¼{÷(/– HŠ q(„òèåC½C† YºtéÒ¥K½S  ".Ä¡òàm;à):`…À‡K³ÆéÓ§³³³ccc ClllvvöÙ³gû»2@tÀ !€!ÞøóÏ?ÿÑ~4vìØƒ^»víàÁƒcÆŒ™2eJyy¹êäÇ&,…ÀGïv~î¹ç–-[öÔSOu};zôè—^ziРAÏ>û,Ðñ1$¥ÀGïoÛ<øÐC٠Ξ=»¤¤¤JC¬þäÑû¬èp<88¸¯‹”D¬:`È£÷~ðÁwìØa7¸}ûö¬¬¬þ) P °B`È£÷sÀ¯¾úê¢E‹®^½:gÎœØØØK—.½óÎ;_~ùå¦M›¼P ?:`…ÀGï>¾oŸ%''ÇâHß> ú ›° 46aAÒÎÈÈÈÏÏ·ÉÏÏÏÌÌU$D ¥ÑCÒ^¸pá‘#GV­ZÕØØØØØ˜››{ôèÑ X`¡0”FCÒ -..>vìX\\\\\ÜñãÇ8`4o{ú–S¹>‚†Ò`Hz%,N7bĈ]»v9»ÕîL-'n} ¥À´zÅ&,(MX €¡*:`(0TECi0`¨Š†Ò`ÀP ¥À €¡*J#€ACU0”Fƒ†ª`( UÀP ªâBPâ UÑCitÀ €¡*J#€ACU0”Fƒ†ª`( UÀP ª"€¡40TECi0`(©³³S¯×À`¨ÊÏÏÏb±˜ÍfÑ…@æ/(‰ö@ìã`(‰†À>ކ’`hìã`(‰†À>ކ’`hìã`(‰†À>ކ’`hìã`(‰? àOû8J¢†Ðû8J"€¡°#€¡$@û8J"€¡°#€¡$@û8J"€¡°#€¡$@û8J"€¡°#€¡$.Ä àB>ކ’耡tÀ>ކ’`hìã`(‰†À>ކ’`hìã`(‰MXÐ6aù8J¢†Ðû8J"€¡°#€¡$@û8J"€¡°#€¡$6aAØ„åã`(‰@ìã`(‰†À>ކ’`hìã`(‰†À>ކ’`hìã`(‰†À>ކ’`hìã`(‰†À>ކ’¸4€ qø8J¢†Ðû8J"€¡°#€¡$ï:QCQIDAT@û8J"€¡°#€¡$@û8J"€¡°Ó[,Ñ5HG¯çeqÌl6ûûûËðâèõúÎÎN½^/ºàÆY,???~¡$׉àß ­jii8pàµk×Dh^¯7›Í¢«ÐétºÀÀÀöövV•¼Œ%h¸¡©©iàÀ¢«ÐÇX ‚†šššBCCEW \¿~]t>‡†`@“逽†š›› `@{X‚‚†è€M d Úû`¸MX€&Ñ Aà tÀ€&± Kn €Mb–0ÜÀ&,@“X‚‚†8 h›°„ €á– M¢‚†`@“Ø„% 7pÐ$6a Aà tÀ€&±- 7° Ð$6a Aà tÀ€&Ñ Aà 0 Il‚†Ø„h›°„ €á*³ÙÜÖÖ"º}Œ%h!`¸ª¥¥%$$dÀþÏZC Ád W±Ð*Î AÃUìÀ´ŠsÀBÀp hKÐBÀp[ ­âBBÀp0 UtÀBÀp›°­b–0\E h›°„ €á*Ð*– … €á*6aZÅ&,!`¸ŠsÀ€VÑ AÃU,AZÅ&,!`¸Š´ŠMXBÀp瀭b Z®¢´ŠMXBÀp›°­¢‚†«è€­b–0\EZÅ&,!`¸ŠMX€V±-„Þb±ˆ®A:z½D/Ëõë×CCCÛÛÛE¢Óëõð¦ ЋÅâçç'üg0šššEòOý—L¦²+//¿õÖ[-0›Í¤/ Iz½Þl6‹žc,‹å–[n©¨¨ýzx ó©ìÊÊÊ’’’DWÞ””TVV&º /!€eWVV–˜˜(º ð†ÄÄD²(--%€øˆÄÄÄÒÒRÑUx ,»Ï?ÿœ%h>"))‰VÌùóç³²²Â²²²ª««EWÔ7.]º¤ÓébbbDÞ0lذÔÔÔˆ.Ä´ÀÍÍÍ©©©ÉÉÉUUUUUUÉÉÉiii­­­¢ëꥥ¥´¿|Êí·ßî#M°xãÆ)))Ë–-‹ˆˆˆˆˆX¶lÙĉ7mÚ$º®>Àh¾Æw6Bk!€‹ŠŠ²³³mG²³³ EÕÓ‡Ø À×øÎFh-pyy¹]›˜˜˜¨r—••Ý~ûí¢«ïñÐ]sñ†´´´ ëH{{ûÀoì{Ô××<¸ïªóˆ„We€~%Ïõw—/_ž““Ó'}ݱ>`0L&“íˆÉd èõŽË—/ï—× !ý^Z耣££ËÊÊ¢££­#µµµãÆ»áì}ò~§¯Þ4QŒïÓWC1JÓWC1JãÎ'$$Ø0(++‹U½ÒBgddäççÛŽäççgffŠª€^i!€.\xäÈ‘U«V566666æææ=ztÁ‚7ü€R¦g(ÆŠqFªbt’ÕC1Îô_1Z8¬Óé¾þúëgžyæÀ:.--mݺuqqqbKêÇsî£g¤*F'Y=ã Å8C1n‘½>uIõ³§g¤*F'Y=ã Å8C1nñËÉÉ]ƒfÝ}÷Ý¢Kø'ŠqFªbt’ÕC1ÎPŒ3ã:Ùß  IZØ„€r` €€@` €€@` €€î{çÏŸÏÊÊ ËÊʪ®®XÌÉ“'/^®×ë–¡ÓéJJJfÏž=dÈAƒ¥¤¤ìÞ½[`1]1zäÈ‘±±±Ó§Oï½÷ÖcU[[;vìX±?,}7‹1›Íyyy AAA·ÝvÛöíÛEUÒýeÑëõ¢êéììܰaÿþ뿆‡‡4(99yÆ ¢êÙ¿ÿ”)S‚ƒƒ###çÍ›wùòeo>{ÏTsò÷XЧšššF½råʆ†††††•+WŽ;¶¥¥ET=ñññË—/ÿâ‹/„ÿ¬u:Ý=÷ÜsèС–––O?ý4))iãÆ¢Š™0aÂúõë+++¯_¿^__ÿ׿þõŽ;îx饗DÕÓÅl6ß{ï½bXÂÿ«ØzüñÇ,Xpúôéëׯ?~<==]tEÿ´víÚ9sæˆzö'Ÿ|rÒ¤IûÛß®]»võêÕ?þxüøñO>ù¤b>üðÃÈÈÈÍ›7×ÕÕÕÕÕýéOšVTT”m;’]XX(ªy¬^½Úvuh̘1-étƒÁÏÏO`Ÿ}öÙÆ7lØ °Ùüñ|òÉ'EWáØž={¢££'L˜ ª€   îƒÁÁÁÞ¯D§Ó;v,##Ãväþûïßµk—bìÈ<'À}¬¼¼<))Év$11±¢¢BT=ÒÚ·oßm·Ý&º N§»zõj×ùé'žxBT mmmÙÙÙ[¶l Uƒ­˜˜ƒÁ0lذ¹sçVVVŠ*ã“O>innž6mZHHHhhèôéÓ>,ª;ëÖ­[ºt©À~ùË_>üðÃljjjjj*))y衇žzê)%ÙéZNê9Yt ®5ƒÁd2ÙŽ˜L¦€€QõXIõ³®¯¯¿å–[JJJÄ–aû‹0cÆŒŽŽQ•üâ¿øíok[˜¨J,KfffIII[[[uuõÚµk‡ú÷¿ÿ]H%QQQ¶g£¢¢<(¤[eeeÇoooXƒÙlž5k–íÿáY³fÙžåñ¦©S§¾õÖ[¶#›7o2ïuÿÝ‘vN¶p¸ÏIûÖ'€kkkïºë®ââbÑ…|çòå˱±±+V¬RÀîÝ»§Njÿòü°,Ë믿~ß}÷ yjƒÁÐýÌâÝwß-¤[=öØË/¿,¶†ßýîw7ÝtÓ®]»ºöíڵ릛nú¯ÿú/!Å8p`ðàÁo½õÖ•+W®\¹²eË–¨¨¨   ïWBû´¡C‡ÖÖÖÚŽÔÔÔÄÄĈªÇJ’9ýÂ… III~ø¡èBì>\ÈS=ú믿¶‘ä‡Õ¥¶¶Öh4 yꘘ˜+W®ØŽÔÕÕ…„„)ÆêÊ•+‘‘‘õõõbË1bÄG}d;òÑG9RP9–?þøž{î1ÁÁÁwÞyçöíÛ…ÓýwGÚ9ÙÂ&¬>—PZZj;RVV/ª©\ºt)==}Íš5iii¢k±7~üøºº:!O}æÌ™#FØ}îVøp­,ß_«÷¦„„QO݃?üá?ùÉO"##Å–qñâÅñãÇÛŽŒ?þâÅ‹¢ê™6mZqqqssskkë¡C‡ 4yòdQÅØ’yN&€ûXFFF~~¾íH~~~ff¦¨zäQWW7sæÌW^y%55Ut-9räÖ[oòÔÝß[…ÔcgÇŽwÞy§§~àÞÿ}Û‘={öÜx¬ÓéÚÛÛßxã ±Û¯ºÜtÓM'Nœ°ùôÓO‡.ª;¯¿þúÂ… EW¡ÓI>'{µßö×®]9rdnn®õCߣGnnn]—øUÍqãÆmݺUl V÷Þ{ïîÝ»/_¾l2™.\¸°yóæüàï¿ÿ¾èº¾#ð‡•ššºsçΚš“ÉtöìÙÜÜÜÁƒŸ8qBH1mmmS¦L±;³(v÷@AAÁŒ3`•——÷—¿ü¥±±±ëð¿üË¿¬_¿^T=?þñOž{ÏTs²-½EŽe.| 瀀@` €€@` €€@` €€@` €|^¯]à` €€Г#GŽÄÄļù曢 ´Æ_täµgÏž_þò—;vì¸ë®»D×h  À±·Þz+//¯¤¤$..Nt-€ÀX½zõ±cÇþö·¿Fѵڤ·X,¢k ½^o2™bccËÊʆ &º@³Ø„ÀžÁ`øýï×]wUVVŠ®Ð,:`ߣ×7-ìÙ³ç‰'žØºuë~ô#ÑED À±ŒŒŒíÛ·Ïž=ûÝwß]  AlÂàÔ”)Söïߟžž~áÂ…§Ÿ~Zt9€¦° €,A  €0À@  €ÿÏdë#¥¼·IEND®B`‚gsl-2.7.1/doc/images/rand-bivariate-gaussian.png0000644016036000116100000005475613373111455016472 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœìÝy@L{Ü?ðÁm·TTèZŠ,‰´ª,ݲT–D$’¢$ne ·k+dÍZÊ‘ŠRYZ%*mZHDI«´ïÍüþèùõô¸¤8gÎÔy¿þb–ïçsf8ïùžµ‹Åb{õ¦º:BP @0À@P @0À@P @0À@P @0À@P @0À@P @0À@P @0À@P @0À@P @0À@P @0À@P @0À@P @0À@®^íôîÝ[TTTUUÕÝÝÉd¶½€Œ¢„ù_YYY–––£Gæããããã;vìš5kž>}ʆÒÿEø"·}k<<õÓEn}MKK‹££ãÈ‘#yxxÆŒsæÌ™-ãwMž™Úëà©N.òîÝ»Û?4eÊ”. XWWÇÇÇ×ùž¿Š|e cß¾}íŸÚ»w¯±±q]u&€õôô\]]Û?åââ²xñâ¶—uþ“ ÈõÍ:±´´ôÁƒcǎݵk×7/˜9sæ©S§Ú^yòäI99¹Ö?×ÕÕíÝ»wìØ±|||­Þ§OŸ¶·çääü¨hÇoüæ]£Fj?¯-++ÿîBñòòÖÕÕ}Sñ›­J]*ÝþAeeåµk×~úô鿯éà©NÖm›J¶-£Ðw—ñG\SSÃÏÏßùž¿Š|eÿm2;;{È!tÕ™>|xnnnû§>~ü8bĈíà“ ÈõÝ5fll¬„„Ä7/xô葈ˆHUU‹Åª¬¬¹uëVëS7nÔÒÒJLL¬®®f±Xuuuí×¹?*Úñ¿y77÷73õÞ½{w¡Fýúõ뎗·K¥[ZZÚ|ÿþ½žž//ï¸qãLMM˜LæOŸêdÝ–––5ÜÉÇÓÓÓGýÍk:ÓXû‘;øÊ Æ7?njkkÿøãÖþ£ë €yxx¾ÙhQ__ÏÃÃÓö²Î2DÁ¿0 ×w×bÕÕÕÜÜÜÿ}¢¢¢ƒƒ‹Å²··?~|ÛJ|èСyyym/k=*§ƒñÛìÒ ôùóçÎ,ÔÚµkœœ¾ûTgJ ~ýúµý»²³³¿é§¾¾>99ùüùóJJJmûË;xê×ùGvðøÌÍÍ¿ûšŽëxäN΀;þèº4ÎÍÍm?î %’à_ëG3àï®ûüüüúõë—‘‘ѯ_?//¯¶Ç…„„JJJÚþºuëÖN†Joäååm¿Ë™Åb-]ºôìÙ³Y¨ôôô!C†|“/­¬¬üàÁƒöïÚ±cÇV÷¥¥¥?}ª3u?€“““EDD222:~oûÆþû9ÿ4€÷ïßßþ©}ûöµíîø£ë Ö÷Ÿ9sfÑ¢Ei €$øäúf-öåË—Ö}Àm‡á´AKK˘1c $))ÙÜÜÜöøŠ+ŒŒŒ ŠŠŠœœœ–,YÒÉPéà&Lð÷÷o_%--mÈ!W®\)--­®®~üøñÂb±XW®\Õ™Eîj·âææ™>}ºƒƒÃ7‡Yu¦çÿ~Î? àêêj333!!!~~~--­¶ô§]ǵüýý•””Z¯ª¤¤Øñ‡€²áÂ1À•°(€ €` €(€ €` €(€ €` €(€ €ÀQQQË–-0`€ŠŠJ@@Õïªø–ººº††F@@€œœ\zzúÚµkKKKÍÍÍ©î €H½X,Õ=üÛ¶m;zôh¯^½Zÿšššºxñâììlj» Çð7jkk…„„¨n€H·øÁÁÁ222Tw@0Žž—••©©©¹»»OŸ>ê^ÅâT………3fÌ û…÷ÚÛÛw¼Ô#FŒ`ÏÇ ?¥®®Nt†t:ÎÏÏŸ7oÞñãÇgΜIÆø½zqè‚Ð=×ÉwƒÁøüù³ŽŽÎ©S§455©î€wVqq±¶¶öáÇ‘¾Ðƒqܬ_^^~ûö톆†¤V¡çæÎDÏu2Ç-sÛ%8Úûúõ«   ±U8mÁh‹žëdŽÛLÃïhˆãöЀ` €(€€NILLܰaƒ  àwOU  ±]±gÑrssõõõû÷ïß¿}}ý¼¼¼^üèÑ#555>>>aaacc㢢"6tì€N166‰‰¡º‘ÿƒ3»ê@uuµ¦¦¦¼¼üÇ?~ü(//?sæÌÚÚÚï¾øÉ“'†††k×®ÍÍÍ}óæ††Æ¢E‹p{ÖƒŽ§^1èzÎ!8ó¿!]±aÑNž<ùòåKooï¶GV®\©¬¬lccóß«««¯^½ÚÔÔ´íúúú 6Ú$ûqæ?*²a УܻwOUUU@@ ×ÿ…®¾Ñ«W¯ºº:kkk11±ö´´´8::Ž9’‡‡g̘1gΜiÿ®{÷¨¨¨¨uµî½{÷V­ZÕþ‘U«V~÷ÅñññóçÏoÿÈ‚ üýý»Z8 çˆŒŒ444422zÿþ}aa¡««+//ïÕ«W©[pfW ãï¿ÿVSS{ûömûN6lØPWW÷øñã²²2ww÷“'OÞ¸q£õ©çÏŸ›ššÚØØ|øð!''ÇÊÊÊØØ8>>¾KEÓÓÓeeeÛ?2iÒ¤ŒŒŒÎ––Ö¥ŠÀ¹Ø|ûCAÛ‡žMGGgÿþýíqpp˜6mZÇïêê*¢«ÿ}8³+ƒqâĉÿ>¸{÷îöM™2¥õÏzzz®®®íŸuqqY¼xq—zæââjlll?Hcc#77÷w›œ>}º§§gûG<<<~ôânžëd:.3‹®_6ôxBBBïÞ½kÿHvvö Aƒˆ­ÒÕÿ>œÙƒÁÈÉÉùïƒß´ZVV&$$ÔúçáÃ‡çææ¶öãÇ#FŒèRÝ.ð“'O äééYRRRRRrùòåòòòv\ÂÞÞ¾“/ÙÛÛwé3aÑuLÇýÞ ºîð‡‹‹«ªªŠ——·í‘ºº:AAAb›íêÎìªW¯^\\\ß<ØÒÒÒ»wïol™——·¢¢‚‡‡§í©†††Ô××w¾®˜˜Xjjª˜˜XÛ#………rrrß}}ddäÞ½{ãââ˜L¦¼¼¼Ýû÷ï;_±[ ç:û€z‘OŸ>µ$//O\\¼ãwõêPOíŠÁ`|“¾­¾IßöÄÄÄŠ‹‹Û?R\\>>ÅÅÅÅÅÅ>>>ÂÂÂ/^¼èRŸ•••(+++++stt5jTuuõz˜7o^bbbccã»wï,,,,--»T®» ç:™ŽËÌ¢ë— tðòåËÙ³g·ž¨ª­­ýêÕ«¶§ %$$ììì$$$ »:r¿à¿|ù",,ük])))ùøø°X¬¬¬¬?ÿü³¦¦†=]ýB³X,%%%>>>>>>%%¥ÀÀÀ.uÛ*''GOO¯_¿~ýúõÓÓÓký-ò£|}}¥¥¥¹¹¹ÇwêÔ©¶+= =×ÉtÜïÍ ë{{û}ûö;vÌÖÖ–Àa]\\²²²\\\~á½ÿüóOzzº±±±ªªªµµ5'tlFÏu2—™A×/h.%%eþüùÎÎÎÖÖÖ£G&jd99999¹_x/‹Å’••ÕÖÖöóó{óæ 777'tlFÏuòT7ìPSScllìãã3cÆŒ?þøÃÀÀ &&†Á“’’~ù½½zõÚ¹s§¡¡áÅ‹ Lßßì € p4-lذÁÚÚzÆŒ cÁ‚ÆÆÆÿý7ÕMý>}úHII™˜˜PÝ[ÑqÖÏ ëæΤ««»|ùòåË—SÝP†žëdl‚Ê0™Ì‹/~øðaÙ²eT÷Àn` LŸ>}FŽéçç×Áõ§z*0P††[ÚàW'À@P @0À@P @0p%,ê1™ÌòòòòòrAƒõéÓ‡Á`|þü¹¨¨HDDDDD„‡‡‡ê``öijjÊÉÉÉÌÌ|ýúuvvvaaa^^^nnnyy¹   PuuuIIÉŒ3"##õõõß½{WZZZRR"(((!!1~üxEEE ñãÇS½(ð»èx(]o}ì×ÐМœœœœ÷âÅ‹÷ïß‹‹‹?~ܸqRRRC† >|øÀ;§  àýû÷™™™±±±áááÍÍͺºº«V­RVVfÏ‚Šžëd:.3ƒ®_6°GIIɳgÏÂÃß?þêÕ«qãÆÉÉÉ)((¨ªªJKKsssÿ~‰¬¬¬›7ozzz 8p`öìÙ¿?&…è¹N¦ã23èúeyêêꢣ£#""=z”­ªªª®®>uêT>>>’Š2™ÌÀÀ@ ‹ÄÄÄaÆ‘T… è¹N¦ã23èúeá222ž]¿~½»»ûÔ©S©nŠ\¡¡¡#GŽ”‘‘¡ºè,0ô(999îîîW¯^_·n]Ï8ºª3|||V®\IuÐt<õŠA×sÎz°–––û÷ïŸ;wîåË—ÆÆÆfff´ÚZSSó矾}ûvРAT÷ò+è¹NÆ º·¯_¿^¾|ÙÕÕULLlýúõþþþ=ï誟º}ûöôéÓ»iúÒº«ÌÌLggç7nÌ›7Ï××WII‰êŽ(sëÖ-CCCª»€®¡ã¬ŸA×Í=ÆóçÏ>üâÅ‹õëׯ[·NLLŒêލTWW7xðàœœaaaª{ùEô\'c ݋Š=|øpnnîÖ­[¯_¿ÎÇÇGuSÔ —““ë¾éK[`èZZZüüüŽ9Âd2ÿùçƒ?þÀêëÍ›7ê. Ëð/8Zmm­——×éÓ§………8 ££Ó«W/ª›â •••=¢ºè2:nvgÐu@÷’““sáÂUUÕ7jhhPÝ'Z³f ×ùóç©nä·ÐsŒ0pœÈÈÈÓ§O?}úÔØØøéÓ§RRRTwÄ¡£¢¢’’’¨n~t0èúk €Ã544øúúž>}º¾¾~ãÆÆÆÆüüüT7ŹJJJ&Mšäïﯢ¢Bu/¿‹žëd:.3ƒ®_6Ǫ¬¬<{öìéÓ§eee7mÚ4gÎìèý©¥K—Ž5êðáÃT7Bz®“± ¨T\\|êÔ© .Ì;÷áǸ—@'ݾ};==ÝËË‹êFà×õ¦º ©ÜÜÜ7Ž?¾²²2!!áêÕ«HßNªªªÚ´iÓÙ³gixÑÍž ìöáǵk×ÊËËóòò¦§§Ÿ9sfäÈ‘T7ÕìÞ½[[[[]]êFà·pb'&&nذAPP;z˜ÂÂBkkk%%¥¡C‡¾}ûöÈ‘#ƒ¦º©n&--íúõë=c×/Íqb‹ŠŠÆÄÄPÝæË—/¶¶¶222ÜÜÜ™™™{÷©niëÖ­»ví8p ÕÀïâă°ÒÓÓ©nÓÜÜìæææèè¸téÒ´´4LyGHHȇ,--©nÀ‰ =CUUÕåË—G9~üxª;êÞ¾~ýºqãF'''...ª{pâ&hè‹wîÜ)))ùìÙ3ooïÐÐP¤ïojjjZºtéܹsuuu©îˆ"}úôÉÊÊjüøñåååqqq¾¾¾=à:MœÀÚÚšŸŸÿرcT7„é™ìààЫCT7н{÷ÎÒÒròäÉýúõËÌÌtuu• º©âÔ©SÏŸ?¿víZŸ>}¨îÃÑWÿ"ïâdô¼ìIÞ¾}ëèèliiicc3hÐ ª;êQBCC׬Y;|øpª{! =×É=s ì‘››kff6uêÔ1cƼ{÷nß¾}H_beee™˜˜Ü¼y³§/m!€àW”””lÞ¼Y^^~èСYYY;wîìׯÕMõ4555‹/Þ¿ÿÔ©S©îˆ‡€®©­­utt?~|KKKFFÆþýû©nªg277Ÿ2eÊÚµk©nHÁ‰ç·?HªíÏ4Ü=ÀiX,–··÷Î;UUUãããqŒ©Îœ9óæÍ›gÏžQÝ…Y Àâãã­¬¬zõêåë뫦¦Fu;=\\\ÜþýûŸ={†ûõ`œÀÀQŠŠŠvïÞtèÐ!ccc<‘///ïÕ«W¯_¿ÎÏÏ/...(((,,,))ijjb0üüü<<<”3fÌĉgÍš%,,Lu×?TQQ±|ùòsçÎ5Šê^€Dt<ò›A×CÞºª´´ôÈ‘#¦¦¦öööýû÷§º£ÿUUUþäÉ“¢¢"999iiéaÆ‰ŠŠ2dðàÁ"""­—l¬­­mhh())ÉÉÉÉÊÊŠóæMtt´˜˜Õ ñõõõóçÏŸ8qâÉ“'©î…}è¹N¦ã23èúet^iiéñãÇÝÝÝ wìØ1tèPª;b0 ‹•’’òòåKUUÕ™3gjhh(((ôîÝ…CJ7nÜÈb±œÉkõ×455-Y²D@@ÀÛÛ»KKÔÝÑsLÇefÐõËèŒöÑkgg÷çŸRÝ£¦¦&"""((èîÝ»ÚÚÚ­·£çççÿµ‹ŠŠ¤¥¥ÓÓÓ9êÖLL&sÕªUwîÜ¡Ûíè¹NÆ>`øÇŽ;{ö¬¡¡arr2åÑûåË—û÷ïûûû‡‡‡+**jkk‡‡‡KIIýþÈbbb+W®<##ƒÍéËb±"##W¯^=|øp??¿•+Wæçç_»vmÁ‚lN_ƒ!''—˜˜Èæ¢íEGG¯_¿>((h̘1¶TÁ €Fâââ,,,ÄÄÄbccGÍÎÒŸ>}òðððôô055=|ø0å[\[gÀTUÏÈÈXºt©ÏäÉ“©ê¨… …¯_¿:88ܺuËÉÉiÅŠì,zöìÙèèèåË—ûùùÉË˳³zFŒÑØØXXXÈþ³?}ú4wîÜcÇŽÍš5‹Í¥s €z¸ªªª'Nœ9sF__?--MHHˆLÏ IDAT=u[ZZnß¾}äÈ‘¦¦¦M›6ùøø°§t'EDDpss³ÿ‚Syyy3gδ±±Y¹r%›KGAôXMMMçÎ;pà€––V\\Û÷­©©ñôô}ú¸»»ÿõ×_ì)š‘‘qüøqCCÃçÏŸKJJ²§î¯ñòòÊÎξ~ý:;‹~øðASSsÛ¶mH_h…è9²³³ÿù矗/_:tÈÐÐ=~£¢¢Ž?gmmýöíÛ²¡èï(//ß¾}{PP{.÷Ñ s_ø/œ ÐTTTØÚÚªªª*))½~ýzùòåd§/“É PSS[»v­ŽŽÎû÷ïwìØÁùéË`0,XÀ΃±ß¾}û×_ýóÏ?H_h3`€îÅbyyyÙÙÙÍŸ??-- '×ÖÕÕyxxœ}é ß…0@÷óáÃ33³††6\QòãǸ}ûöªU«’’’† Fj9R>}zåÊ•ìÙQ»hÑ¢ .èê겡tG˜t'ÇŽSRRÒÒÒŠŒŒ$5}óóóÍÍÍDEE³²²Nž<Ù­Ó·¤¤äâÅ‹[¶laC­ˆˆ===OOO¤/t3`€îÅbݾ}ûßÿ;v,ÙßÊÊÊãÇ»ººZZZ¾yó¦[Ûܱ’’’ÖëO±á®!!!&&&7nÜ`ÛIØÐM!€ºÈÈÈmÛ¶1™Ì³gÏ’zùþúúú .²k¹ºº>|øáÇ“&M"»ô`U[[{ôèQWW×Í›7ûøøðòò’TˆÉdz{{ÛÛÛOœ81((HVV–¤Bì×ÔÔ´dÉ’±cÇ?~œìZ{÷î½víZttôÈ‘#É®=€Ý»wÏÚÚZEE%11‘¼CŸX,–¿¿ÿž={„……½½½9ùÞ ¿€Åb™››sqq]¸pÔë‚1™ÌÍ›7GEEEGG³ùÞJЭ!€8K~~¾MZZš‡‡‡¦¦&y…=z´cÇ&“yôèѹsç’Wˆ*oÞ¼ ÿãWt¦¦¦ùùùááá‚‚‚䂞§!p &“yæÌ™É“'ËÈȤ¤¤—¾qqq³fͲ¶¶Þ¾}{BBBL____ooï»wïòññ‘W¥¢¢BGG§¡¡!44é ]…0GHOO733ããã{úô騱cIªòúõë]»vÅÅÅíÞ½{õêÕ¤N )ôúõë7“ºA8??_[[{Ö¬YÇïFWÃÎ4kii9x𠦦¦™™YXXIé›——gnn®®®®¢¢òæÍ›µk×öÔô­­­ÕÓÓ;vì©÷;zýúõ´iÓV­ZuòäI¤/üšžù? »øøñãŠ+øùùH:ت¼¼üàÁƒ–––YYY £ ç°µµUQQ166&¯Dtt´ÁÑ£GI­=~¸P£¥¥åÌ™3S¦LÑ××øð!éËb±®\¹2nܸòòò´´4GGÇŸ¾—.] qvv&¯D@@À’%K|||¾ð›0 @TTÔ¦M›„„„?~,##CF‰ääd++«æææàà`9992Jp‹åààpíÚµþýû“TÅÍÍíàÁƒlhhHF‰ÂÂÂ={öÜ»woÿþýkÖ¬¡ÃÊææfKKË´´´gÏž‰ˆˆQ‚ÅbÙÙÙݽ{7::ZBB‚Œ@7=ÿ&‡¨¯¯wttTPP••}ýú5éÛÔÔtüøñ‰'0 33ÓÜÜœé[__¿dÉ’üüü'Ož”¾+W®Œ‰‰AúQ0`‡GmذAVV6!!¤;ܽ{wûöí’’’Ïž=“’’"£ª®®^¸p¡¨¨¨ŸŸ%ÊËË—.]Ú·oßÐÐPRÏ*ºA«¨¨ÈÖÖ666ÖÕÕU[[›Œ)))[¶l),,{ölEEÅóçÏ“”¾ÑÑÑÓ¦M³¶¶>}ú4Ò‡0)ŠŠŠÌÌÌ >|HÆý…X,ÖåË—wîܹxñ⌌ !!!ÂKp²Ö[üNŸ>¼Û]¼xq×®]^^^³gÏ&©Ð€xwïÞ]¿~½™™Ùž={ȸàTBB‚••UïÞ½ƒ‚‚H½Þgª¬¬ÔÖÖž:u*IéÛÔÔ´wïÞ»wïFEE3†Œ 0±jkkmll"""üüüÔÔÔ¿´´tçÎ÷îÝ;tèЪU«H½Ëgª««›7ož¢¢â‰'È¿´´´õ«§OŸ’w>1û€”žž®¬¬ÜÜÜœœœLxú¶´´¸¹¹M˜0ŸŸ?33ÓÄÄ„†éËd2ŒŒ$$$\\\ÈXü””eee55µÀÀ@¤/ 3`4448999;;;99™˜˜>~BB‚………  `XXØ„ ¿[¨©©Y½zuUU•¯¯/éûðáÕ+Wž9sÆÀÀ€ðÁþ 3`€ß,##“˜˜˜@xúÖÖÖnß¾}Á‚¶¶¶tNß>L›6­_¿~÷ïßçææ&||www“;wî }m0øu›6mJJJruu3gá㇆†®_¿^UU5%%…Ô[Ûr¸ˆˆˆ+VØÙÙÙØØ>8‹ÅÚ¹sçíÛ·Ÿ>}:jÔ(ÂÇøÌ€~“Étss“••3fLjj*áé[RRbbb²aÆóçÏûøøÐ9}¯^½º|ùrooo2Ò·¶¶ÖÀÀ ::úÙ³gH_`3Ì€ºìÍ›7æææ,+""BZZšØÁ[ï!øï¿ÿ½zõŠŸŸŸØñ»‘Öy{{‡‡‡7Žðñóòòôôô&NœøøñcÂÇè  ZEÞ¿¿½½ýúõë ¿Ó›7oÖ­[W[[K“{v ®®nõêÕ¹¹¹±±±dlˆˆˆ022Ú²e‹­­-áƒt6AtVvvöŒ3^¼x÷÷ß›¾õõõÓ§O_²dIll,ÍÓ·°°PCC£OŸ>aaa„§/‹Å:~üøòåË===‘¾@!0ÀϱX¬sçΩ©©zyy9’ØñÃÃÃeee_½z•œœleeEóËgffª©©Í›7ÏÛÛ›———ØÁ«ªª nܸñâÅ‹Y³f;8@—`4ÀO”””¬Y³¦¨¨(::zìØ±„¾mÛ¶ˆˆ— ;xwôìÙ3}}}''§•+W>xJJІ††··7vúå0èHDD„¼¼¼ŒŒLLL áéëåå5qâĦ§§#} ÆÃ‡-ZtõêU2Ò÷Ê•+³gÏvpp8wîÒ8fÀßÇb±:äêêêééIø¶ÊÏŸ?oذ!''[µ \·n]@@€ªª*±#×ÕÕmܸ1:::22rüøñÄðË0øŽ¬¬¬¿þú+$$$>>žðô½s玼¼¼¬¬l||<Ò—Á`0™Ìýû÷oذáÁƒ„§oqq±¦¦fuuu\\Ò8 fÀÿGssó±cÇŽ?¾gÏÂu®¨¨°±±‰ œ2e #w__¾|Y±bEcccBBÂ!Cˆ¼uÛþÊ•+÷îÝKÃ{W‡Ã ०¦ªªªFDD$$$X[[›¾Ož<‘••íÛ·oRRÒ·Uë݇äää?~LxúúùùihhìÛ·oß¾}H_àD,Z¢í‚Ã444ØÛÛ‹ŠŠzxx0™Lb¯¬¬´´´>|xhh(±#wkçÏŸõõõ%|䦦¦þùgøðáqqq„d ç:› ‰‰‰¦¦¦IIIC‡%vðˆˆˆÕ«WÏž=;55uÀ€ÄÞMÕÕÕYZZ&''GGG3†ØÁ‹ŠŠ–-[ÆÏÏŸ””$,,LìàÂ&h µ––GGG;;»ÀÀ@bÓ·ººÚÆÆÆØØØÍÍíÂ… HßVïß¿WSSc2™±±±„§oLLŒ¢¢â_ýuÿþ}¤/p8Ì€¾>~ü¸råJ^^ÞÄÄDqqqbŒŒ\³fººú«W¯‰¼û 233Û½{÷ßÿMìÈ,ËÉÉéäÉ“—.]š;w.±ƒ 4ÕzÖ©­­­­­-áWuÞ¹sç7Ο??oÞ<GîÖ˜Læ¾}û<<<üýý ?ר°°pÕªUuuuqqqÆ #vp’ €vš››wìØáççw÷î]eeebþüùš5k&Mš”ššŠM mªªªŒ¿~ý/&&Fìà>455µ°°Ø½{7Í/£ Ý 襸¸ØÐЛ›;!!aàÀŽÜÐаk×®k×®>}zÉ’%ŽÜ%¹¹¹555L&SLLläÈ‘”gR^^Þ¼yó¦NêççÇÅÅEàÈ»víº~ýúõë×ÕÕÕ € 8ñ ¬ÜÜ\}}ýþýû÷ïß___?//ꎠ‡WTTœ6mÚƒˆMßÄÄDEEÅ?¦¤¤°?}ãââttt† 2lذ+VlÚ´iÛ¶m³fÍ·¶¶ÎÏÏgsKmbbbÔÔÔLLLΞ=Klú¦§§«¨¨dee%%%!}¡["éô¦¦¦¦_{cUUÕ¨Q£ËÊÊÊÊÊ¥¤¤jjjˆm¼ÎTWW·yóæ?ÿü388˜ðÁ=<}ú”ðÁFµqãFÊaáè¹NfÇ2777ß¾}û¯¿þÛ½{wÇ?]¹¸¸¾ùßÕØØÈÍÍMlKôü²iåÊ•+"""çÏŸ'|ä/_¾,[¶LFF†òÍΜ&%%EZZÚÈȨ¢¢‚Ø‘[ZZœœœDEEoݺEìÈÀ!è¹Nfß2766þûï¿ ƒ——×ÂÂâGÿE `{{{ªŽ>ʵä„ ÒÒÒüÑ£Gþùç–-[êêê¼ûjii9v예ˆÈÕ«W yò„’~Ú|úôiúôéÚÚÚÅÅÅÄŽ\[[ÛzÉ2.ß‹žëd²fÀÏŸ?_¾|ùtùZÓýúõ ‹1bĈ#žz®“q7$è–ÒÓÓ äää’““û÷ïOàÈ,ËÑÑÑÃÃãÉ“'ÄGÝ%222×®]«®®NII)..nnnîÛ·ïˆ#FMìD¿ó¢££ÍÍÍ•””RRR„„„¹®®nýúõIII111£G&pdN††îçÂ… »vírrr211!väêêêÕ«Wþü966vðàÁÄþ úöí;uêTª»`Ô××ïØ±ãæÍ›®®® .$vð·oßL˜0!66–ŸŸŸØÁ8'ÞŽàGÊËËõõõÏ;Exú¾yófÊ”)BBBaaaœ¾">>^AAáóçÏ©©©„§¯··÷Ô©S-,,¼½½‘¾@7`è6âããååå‡;nÜ8b¿sçÎôéÓ·lÙráÂbï¦vîÜ©««»gÏ__ß®^§c•••ÆÆÆ‡züøñúõë  »À&hè.\¸°{÷îsçÎ-Z´ˆØ‘[ZZZ·¯+((;x÷•`bb"--œœ,&&FìàaaafffsçÎÇÄh  œ®¾¾~Æ ñññÑÑÑcÆŒ!vðÂÂÂ+Vpqq%$$P{‘ ÎÑØØxðàÁsçÎ>}zÙ²eÄ^YY¹}ûöàà`ww÷9sæ;8@÷‚MÐÀÑòòòÔÕÕëëëŸ?NxúFDD(**Θ1ãÁƒHßVIIIJJJIIIIII„§oHHÈĉY,Ö«W¯¾t<õŠE×sκ‡Љ‰>}šŒÁO:5xðàÇ“1xwÔÔÔ´ÿ~QQQoooÂ/++311‘””¤ü^À™è¹NÆ&hàPgϞݷoŸŸŸßôéÓ‰¹²²ríÚµÙÙÙ±±±¸ÁN«·oß0 11Q\\œØÁoݺµqãÆ%K–¤¦¦âªvmÀÀqšššìììþ¼mÛ¶˜˜77·¹sç>~hh¨™™ÙÂ… 322h~\Àïà ØÄÕÕuùòåׯ_'#} ƶmÛ CBB虾G••••””ÌÈÈ <}›››wîܹvíZWWW¤/Àïà H×ÐÐð÷ßÇÇÇ?{öLBB‚ŒŽŽŽ>ŒŠŠ¢çU=zdmm-%%EÆ•­ ÆëׯMLL ôòåKÂÇ 'Ì€\………šššååå111$¥ïÑ£G}||?~LÃiÙÇõõõׯ_ìØ±{÷îž¾,ëìÙ³3fÌX½zõýû÷‘¾B‰•••µµµýüüúöíKF‰£G^¼xññãÇbbbdŒÏ±åääÒÓÓçÏŸOx‰ÜÜ\Ë—/?}úÔÒÒ’Ø;Èâïﯭ­}êÔ©Ý»w“´î>|øðÅ‹ÃÃà ¿‡<‡ œ0aBRRRBB®]»ßðÞÒÒrúôiEEEuuõgÏž3†Øñ€}À@’£Gž9s&88XAA¤ööö·nÝŠŒŒ2dI%8PRR’­­miié¹sçfÍšEF‰ÄÄÄuëÖõë×/::zìØ±d”fÀ@¸––KKË7nÄÆÆ’”¾,kÓ¦MwïÞ §Oú›››Ï;wÙ²eIIId¤ïׯ_­­­çÍ›gmmýäɤ/©À@¤ººº¥K—¾ÿ>22’¤ÍÂMMM&&&/_¾ %£§ill|8UÊËËmllâââBCC±Í€*˜Ãoñöö655  5}}:yU(3cÆ ;;»ýû÷·þ™Œ*L&óüùó“&M9rdjj*Ò€` ]ÖÐаbÅŠÊÊʨ¨¨~ýú‘W¨¥¥ÅÈÈHYYÙÊÊŠ¼*TILLܳgOzzúÞ½{W®\Ù»7Y¿†_½zeiiÉ`0ž]]ÝI“&±­âï`2™÷îÝ;vìXAA­­­··7???ŠzyyíÚµkÚ´iIIIþù'Ù€T`ø?nݺemm"++˶¢YYYW¯^MKKc[Å_ÖÐÐpíÚµ£Göë×oëÖ­úúú}úôaCÝÈÈH[[[???6T²!€áݾ}›ýéÛÒÒ²fÍš={öˆ‰‰±­è/(++ssssss›`ø”¤/ƒÁ8vì'ßï(;;ÛÆÆf̘1999Ož>>ooïÞ½9eãÇúõëHÔ‚¯_¿=|øPRRrñâÅ .¤äïöªªªœ,X`oo?lØ0jûà4ô\'Óq™´ü²Y,–™™ÙçÏŸïÞ½ËÍÍMu;ÿ+77WAAáíÛ·‚‚‚¿6‹ÅJII ILLÔÔÔœ;w®ŽŽ'Ü/¨²²ÒÅÅÅÙÙY[[{×®]RRRTwÀ‰h¸Nf €écÓ¦M/_¾ eÃóºjõêÕ#FŒpppèÒ»>}úÒ¿mmmmmmuuuYÀêêêÓ§OŸ>}Z[[{÷î݈^€ÐpÌÀ>`š8xð`tttXX‡„Ó7ìíí§M›öõëW™±cÇJHH 8°}«eee………EEEŸ?.((ÈÌÌLHHøüù³†††¦¦æž={$$$(ìÿMMMÎÎÎNNN³fÍzúôé˜1c¨î8t0hök+""ÂÈÈèåË—ƒ¦º—úøñã£Gž?þæÍ›¼¼¼’’’ÚÚZ..®êêjaaáÁƒ‹‰‰ :tðàÁcÇŽ8q¢²²2çìÉnóøñcIII'''ªÎqèvhµNnɘ˜˜xñâÅk×®UTTÔ}¾ìÂÂB…+W®Ìž=›ê^º¬¡¡¡©©©oß¾T7Ò)YYYÿüóÏ«W¯Nž<¹`ÁªÛèNè³Nnã& ÃØØXTT4&&†êFº½–––åË—¯]»¶;¦/ƒÁàááéé[VV¶iÓ¦©S§ªªª¦¥¥!} 38qpzz:Õ-ô;vìàææÞ³gÕôXµµµÎÎÎ'NœX²dIFF†ˆˆÕ@·Á‰ „ð÷÷¿yófBBî(í/]ºtàÀiÓ¦ÅÄÄà gè*pÏ”––fii4pà@ª{éiššš¼¼¼ÇŽ{÷î]yyyª;€n Ü•––.\¸ðÔ©SŠŠŠT÷Ò£Ô××_¾|ÙÉÉIRRòêÕ«Ó¦M£º#èÆzæÆI‡^¢ºA566.^¼xÙ²eË—/§º—ž£u_ïèÑ£CBB|||?~Œô€ßDñ‘ßí³ð¿w`z>äÝÔÔ´ªªÊÏÏ»~ ñõëWWW×3gÎL:uÏž=²²²TwÐõàur(ÞMÃOœT‡JKK‹ŠŠBúþ¾÷ïß»¸¸xyyéêêFDDP~Gèa°šî9"""Ξ={÷î]μÞd7RXX¸zõj^^Þ””¤/ÜC0™L[[ÛcÇŽ :”ê^º±šššÈÈȈ‰‰½{÷îСCâââT7='Ý~ÇpÛŸ±±ºcžžžÜÜÜK—.¥º‘®ÎÍÍíØ±cqqq’’’Tw='0²¶«ª««÷ìÙãçç׳ð&Icc£‡‡ÇÁƒ•••ŸN. á(èîÍÉÉ©oß¾fffT7Ò ¤¦¦š››ËÈÈÔ××'&&^¹ré  ¸KÿíÝLUõÇñþá˜!?$¢´¤•”ùƒeü˜ñã^&˜ÄO²eƒXØœ¶Í\òW›AV4²… -]Ó]e¨QÌȹ‰ˆRä7È4ƒûý£ï_¿~Kàrß÷œó|üçÙä¾>ŸsöyÝóãÞÛÔ”——wêÔ)ž½úãããGŽÉÏÏ¿xñ↠.^¼ÈT°°ZýñÇ)))ï½÷ž···t;500PTTTXXèáá±iÓ¦ÄÄDGGGéPð°Zmß¾}Á‚\|¾£æææ]»víß¿?&&¦´´4 @:ÜŽV¥¶¶¶Ï?ÿüܹsÒAìNCCûï¾ûÝwß½öÚkÍÍÍ^^^Ò‰àÎ(`U:|øpLLŒ§§§t;RSS“››{îܹ͛7ó…Øì¬JGŽÙ°aƒt »0>>~èСœœœáááÌÌ̲²²Y³fI‡€¦ÇŸ`TTþÛ“###óçÏ¿råÊœ9s¤³Húý÷ßKKKóòòæÌ™³eË–¸¸8~„P)U¯ÉSưú;v,00PÏí{éÒ¥‚‚‚={ö}üñÇáááÒ‰`Ò8cPŸýû÷'&&J§`±XªªªÖ¬Y³|ùr‹Åòý÷ß—••ѾTJgýŠš/w\»vmÁ‚mmmºú6‰ÞÞÞ½{÷Ξ=;===%%ÅÙÙY:«Qïš<\‚V™ƒ†‡‡ë¤}ÇÇÇ+++?ýôÓššš¸¸¸âââ   éP`°Ê|ñÅéééÒ)f\{{{QQQqq±——WzzúÞ½{9å 1z<ëWT{¹£­­-((¨££ÃÉÉI:ËŒ9pà@qqqSSSrròúõëŸ~úiéPfœJ×äiâ XM>øàƒ´´4íµ¯ÅbùöÛo‹ŠŠÊÊÊV¬XñÆoDGGóq^ÚF«I}}}nn®t kسgOaa¡““Ó+¯¼’““×GÐ >†¤&ÁÁÁõõõÒ)¬`||üøñãÉÉÉ .4›ÍÅÅÅf³ùÍ7ߤ}è¬&!!!µµµÒ)¦¥½½=;;ûÑGݺukPPP[[Ï6Ð'=Þ÷VT{ÿ¿¿ßÇǧ¯¯ïž{Tvï »»û«¯¾Ú·o_kkëK/½ôꫯ.^¼X:{¡Ò5yšT¶ŽëÜ}÷Ý·hÑ¢ªªªÈÈHé,wåÊ•+0™L/¼ð¶mÛ"""¥s€<=¾éPÔünë£>úá‡JJJ¤ƒüöööƒ–••577ÇÆÆÆÇÇGDDhïámÖ¢Þ5y:ô8fEÍ;{``ÀÇǧ££ÃÞ¾˜b||¼¡¡¡¼¼Üd2uwwÇÆÆÆÅÅ >Mà©wMž=ŽYQùÎŽ‰‰yñÅ×­['DQexx¸¢¢âèÑ£•••«W¯Ž æ—Ü=U¯ÉS¦Ç1+*ßÙ‡Ú¶mÛ™3g¤ÅúóÏ?ëëë+++¿þúk³Ùéíí-’€Ú©zMž2=ŽYQÿÎ~þùçW®\¹iÓ&[¾hkkkuuuuuõñãÇyä‘ÈÈH£Ñ4{öl[Æ =j_“§FcVÔ¿³[ZZV¬XQ^^0£/ÔÚÚzòäÉšššo¾ùæúõëaaa‘‘‘>øàŒ¾.]Qûš<5z³¢‰ýå—_nݺ5444$$$!!ÁÍÍÍ*¶··÷äÉ“?þøãÙ³gëë뜜ÃÂÂBBBüüü¬òp ¬ÉS Ç1+ZÙÙcccG-**ªªªòóó3 ¾¾¾?üðÝÜîéééìì¼zõjKKKKKË… š››ÇÆÆžyæ™eË–Ì›7Ï sÚX“'KcV4·³¯_¿^WWWSSsêÔ© .tww{yyÍŸ?ßÝÝÝÅÅeß¾}¡¡¡uuuÞÞÞžžž×®]tvv~衇æÍ›·páÂ'Ÿ|ò‰'žX´hÑ< =º£±5ù.éqÌŠÖwöÍ›7»ºººººüqŸ¿6þüóÏ}}}nnn®®®sçÎåá)vBÛkòÿ£Ç1+zÝÙ`Ÿô¹&óm  €@ €@ € 0(`PÀ €@ €@ € 0(`PÀ €@ €@ € 0(`PÀ €@ €@ € 0(`Ø]×ÖÖ&%%yzzºººšL&éDXß=Ònn2™–-[ÖÔÔ”––Ößߟšš* kr°X,ÒþKffæŽ;þú§ÙlNHHhmmµî«88ØÝÀ@·ô¹&Ûû˜GGGÝÝÝoܸaÝ?«Ï öIŸk²ÝݾMEE…ŸŸŸt ¬ÌîîO488øöÛoïÞ½[:Öf±WÝÝÝ!!!ÕÕÕSø¿Û·oÿûQ»ººÚfzÿÈÛÛÛÚ¢—Ýo=l¥(ÊÄ$«W¯Þ¹s§Ñhœ¡×•¸0É6À$Û“lúœdáKÐwœñ®®®U«Våçç ÛGÀìî!¬ÞÞÞ¨¨¨œœÚ avwÖïï•µvíÚ}}^î°1&Ù˜d`’m@Ÿ“lwcžxWø–¡¡!777뾊½ \{˜d`’m€I¶}N²Ý} I‡û Cvw= €@ €@À¿²³³¥3È “Ž }L² 0É6À$Û€'YO~ ŽKР€@ €@ € 0(`PÀ €@ €@ € 0(`PÀ € Ç®­­MJJòôôtuu 4™LÒ‰´éÌ™3nnnÒY´¦££#11ÑÅÅÅÅÅ%11ñ—_~‘N¤MÃ3M竱 844´¯¯Ïd2]½zõÃ?ÌÎÎþì³Ï¤CiPJJÊý÷ß_WW'DkFFF ƒ¿¿ÿåË—/_¾ìïïo4GGG¥siÇðLÓùjì`±X¤3ØZffæŽ;n½¥5›Í ­­­²©4ÌÁA‡ÙÌÉËË;}útiié­-ëÖ­{öÙg7nÜ(˜JÛ8†gˆÎWcŽ*ettÔÝÝýÆÒA4‹Å˺ Ã[o½µråÊ[[Ž;–››[UU%˜JÛ8†mCo«±/Aߦ¢¢ÂÏÏO:p·ššš–,Y2qËâŋϟ?/•°½­Æz[788¼{÷îçž{N:‹fqö`]³fÍúí·ßom¹y󦳳³~ÎlcØt¸ëú ¸§§'>>þ“O>ÑÏþ;¤ÏÕXûì0ÁÄí‘‘‘ï¼óNxx¸T6Íø“Œ™àîî>888qËÀÀÀܹs¥òÓ¤ÛÕXûl™àÖÆ®®®U«V½ÿþûF£Q0›fÜq’1Cžzê©ÆÆÆ‰[Ìf³¯¯¯T`:ô¼k¿€ÿWoooTTTNNŽÁ`ÎLZtttIIÉÄ-%%%111Ry€)Óùj¬Ç' üýý³²²Ö®]+D/x€Åº~ýõ×%K–¤¦¦¾þú늢566Þ{ï½ÒÑ4‹cx†è|5ÖãQuÇû”CCCnnn¶£awœgo3áÒ¥K›7oþ냿F£1??ßÛÛ[:”q Ï4¯Æz,`Äéñ0â(`PÀ €@ €@ € 0(`PÀ €@ €@ € 0(`PÀ €•IJJÚ²eËÄ-YYYkÖ¬‘Ê`j,‹t“000°téÒÇ/]ºTQ”†††¨¨(³Ùìåå% À$p ¨Œ‡‡GAAAZZÚØØØØØXZZÚÎ;i_@u8Tiýúõ~~~‹¥¦¦¦¼¼\:€I£€Uêéé1ÃÃÃÕÕÕ>>>ÒqL ¨ÒÆÃÃÃûûûúé§]»vIÇ0iÜÔçĉmmmñññ©©©gÏž=qâ„t"“Æ0 2CCCË—/¯¬¬|ì±ÇE9þ|ttôéÓ§ÝÝÝ¥£˜΀•ÉÈÈHNNþ«}Eñõõ}ùå—322dS˜,΀À0(`PÀ €@ €@ € 0(`ü§»3ÅàIEND®B`‚gsl-2.7.1/doc/images/rand-cauchy.png0000644016036000116100000005006113373111455014151 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœìÝy@Ìùã?ð™E‡¤¤i+W”.R¢]Š„±Ê¶,awYË.ec-6÷µ,»­+– è *t¨t8*Ý¥¨èšÎùý1ûëÓ7S:fæõž™çã¯zÏ{ÞïgSÍsÞ¯÷Eg2™4à-Ò„ €0(`PÀ €@€  @ €0(`PÀ €@€  @ €0(`PÀ €ú$..nþüùJJJâââC‡urr çÞêèt:§–Ã"!!¡¤¤4cÆ ooïÂÂBn¬«ý¢8¸LŽ/ €ÇPÀ½÷Ǭ\¹rÉ’%™™™?~ hii™5ké\ÝÂd2™Lf]]]ffæž={ª««uuu¯]»Ö£…ð²Q· `èL&“t¾”––foo¯  Ð~ú®]»vìØÁ¥•ÒéœùŸe»œäääY³fÝ¿_KK‹Kyú’ŸS?;E`  —>üý÷ßwh_Ö¾}‹ŠŠÖ­['##£¦¦¶e˃ÁšÎvc®ýļ¼¼+V(++KHHèèèøûû·=ÔÒÒâãã3jÔ( ‰Ñ£G;vŒ5ÝÈÈ(88¸Ã2SRR†ÞÜÜÜŸhÒ¤I›6mòõõí§ººzË–-ššš 8pà¬Y³nß¾Ý6CÛhvÛ³êëëׯ_¯¤¤Ävä¹®®ÎÃÃCAAAJJÊÆÆ&==í+Ðabgëj›íÖ­[FFFRRRRRR^ :ÞÙ‹@  —¢¢¢¬¬¬ºžÇÄÄD__¿¤¤$***//ÏÛÛ»;KÎÏÏ766VWWýøñã©S§®\¹ÒöèÚµkëëëÃÃÃ+**Μ9sðàAV=oذáСCuôèѯ¿þZLL¬›?”££ãƒ:L\±bEsssxxø‡Þ¼y³aÆ£GÒh4Öö(óÿk›ÿ›o¾166~ýú5Û Vww÷ñãǧ¥¥egg[[[[ZZæää|6XgëbyüøñÊ•+===sssß¼y³nݺåË—ÇÇÇ·ÍÐÙ‹@zERR’Á`tþŠŠŠ/¾ø‚õ5Û½¶‰+W®Ü¶mÛ…Ðh´Ÿþ¹ý”ààà)S¦0™ÌÆÆÆaÆ¥¥¥µ=ôîÝ;99¹·oßv±®êëëû÷ïßaiié>t–çÓ)¾¾¾ÍF£ÑvíÚÕþ!ooïåË—w‘ªýs;{hÞ¼yÇoÿÐÑ£GçÏŸß6[g/A(`€^úl×××{{{3¦ÿþ¬Ï»¢¢¢¬‡ºneeåW¯^±]&FËÎÎn?¥¢¢bРA¬¯wïÞíîîÞöÐÞ½{Ûº­³uuP[[;`À€óLžbÄoooÖ©ºm¾yóÆÅÅEQQQ\\|Ò¤Iþþþ¬éÝé’›7oÒh´Ÿ~ú©‹ØmÁûõ맨¨hjjêååÕá0«¶ÅFEE999 ncX¸×ݬ¥¥•’’Ò~JjjêøñãÙΜ=jÔ(z;4­í ¢hÏ™3ÇÏϯý???¶3º]ß6‘YzŽ¢c­ÕÕÕ:::îîîkÖ¬¡Ñh'Nœ8þ|JJŠ””k†®Ç0 !tCÐ222‘‘‘ñññªªªªªª mí ÀﰩǶ€€Eè¶€ €0(`PÀÐIIIk×®•““ÃÅŽú =°|ùò!C†ÄÄÄÂ÷p¾ 8 ೄä­§!­[·NFFFMMmË–- ƒt"á…"&&&úúú%%%QQQyyyÞÞÞ¤ /¡@è)!W!WYYi``Íú¶ëƒª>}W’·J A@_1Œ]»v;vÀ€t:]^^>//¯íÑ®ïßÇU{yyÑÉñòòêc~nŠÏ/=%$ë@ØlܸñÅ‹¿þúëèÑ£¥¤¤ Fÿþý{ýv'$o•Üû1Ÿ±P  k×®=yòdøðá¬osrrÚ?ÚÓ!hè#0€°¨¯¯—””lûöüùóíEÅòö ›7––––••8p 77—t"¡†G¥ÑhZZZcÆŒÉÈÈè°ÜMmG6uøzJ(v¡÷”YŸÅ½FÀ0(`PÀ €@€  Ýíì쬨¨8pà@##£ÀÀ@Ò‰ø.E Ý5cÆ ssóÀÀ@]]ÝôôôÕ«W¿{÷ÎÝÝt.¾„+N° q°µyóæ}ûöµ]ú*55uþüùYYYdSq.ÄPTT´nÝ:55µ-[¶0Œ=}ÿþýí/<©¡¡QPPÀéŒÂ DLLLôõõKJJ¢¢¢òòò¼½½û²´ÐÐÐ &p*›°ÁX+‚aPYYi``Íú¶§÷®¨¨066>s挩©)·"R†  ¯ Æ®]»ÆŽ;`À:.//Ÿ——×ö(³Kõöí[GGÇ“'Ov³}½¼¼èíxyyñr¶Îf ›zl` ÒÆ_¼xñ믿Ž=ZJJŠÁ`ôïß¿owEEEvvv¿ÿþ»¥¥%7rR ÷Mà ҰaÞtè……WÓR÷ç‹úúzIIɶoÏŸ?ßþÑîÔLYY™µµõÞ½{…¤}¹ û€„…ÍÆKKKËÊÊ8››ÛÓ%X[[oÛ¶ÍÖÖ– 鄯ZÙÀ4¤ŠŠ OOÏÐÐÐÖÖVGGÇ#GŽÈÈÈôèíŽí0uee¥œœçbR öó Xp€@A€  @ €0(`PÀ €@€  @ €0(`PÀ €@€  @ €0(`PÀ €@€  @ €0üõõõÞÞÞRRRt:]ZZúÚµk¤&0üOll¬––Vfffff&“É|ôèÑ?ü°y󿦦&ÒÑ þsôèQ''§#GŽ\¹reäÈ‘4mÒ¤Iñññ¯^½255}ÿþ=逅Îd2Ig :/ S§Níß¿?**ŠU½í1™ÌmÛ¶…‡‡GDDÈÊʉ@ ÷Mà „M`` §§çýû÷¿øâ‹ÎæY¿~}zzú½{÷DEEy™ €,0O¡€A¨ܺuËÐа‹ÙZ[[­¬¬f̘ñÓO?ñ,q(`žBƒðhmm9sæ¬Y³~üñÇÏÎ\\\¬¯¯8eÊd î5Âj~~~ ã‡~èÎÌ***‡öððhiiáv0‡^uuu;wî~üxìØ±^/áõë×Ó¦MËÎΖ––æ`0ªº!è[·n¹ºº¶ŸâêêÔͧ‹‹‹ãb=©««;{öì·ß~Û—…hjjNŸ>‡CôE 8==]GG§ýmm파ŒÏ>ñÇÑÑÑÎÎÎkÖ¬áZ:þvîܹéÓ§wqÕÉnÚ´i“¯¯/Π芎µöëׯ¶¶V\\¼mJSS“´´tCCCgO¡Óém_Ïš5+44´×Á‚Æd2Ç÷矚˜˜ô}iS§Nݺuëܹsû¾(jº!è^`2™L&óíÛ·—.]JOOß½{÷gŸâååEg‡iH •••åHûÒh´79r„#‹6ÝÔSRRJMMURRj›RZZª««[RRÒ§GEE­X±"??¿wkÇ00GGG{{ûU«Vqdi#GŽ|ô葆†G@5B·¬¥¥•’’Ò~Jjjêøñã»ùtƒ²²2.äàoeee|PSSËÉÉ‘““ãøÂȺƒ°€³ššš®^½ºtéRn,|àÀ¸ @ €„BHHÈøñãÕÔÔ¸´üåË—÷ô¾ÂB .\¸°lÙ2î-ßÖÖ6###77—{«0(`ÁW]]}ïÞ½ùóçsoâââ ,¸rå ÷V `PÀ‚/ ÀÌÌL^^ž«kqvvö÷÷çê* @ðùûû;;;s{-¦¦¦åååݹkÐPÀ¯²²266ÖÞÞžÛ+Y´hѵk׸½"Á€pׯ_Ÿ5k–´´4Ö…Qh€îC¸7npðî ]›>¾²²’÷«à#(`ÁÔÚÚzëÖ-"Ü¿ssóàà`Þ¯€ €ÓãÇ¿øâ "kŸ;wnPP‘Uð 0€` "²ùËbooÎ`0H >0€` š;w.©µpàÀ„„²1(  h***RSSÍÍÍI¡988ܺu‹t ŠBšàà` IIIÒAhööö(`€Î €Mppðœ9sH§ Ñh´©S§âÆ l¡€JKKKxx8ÏnÜ5QQQ++«°°0ÒA¨ PâââTUUUTTHùMhh(éT„(¡¡¡666¤Sü••UTTTcc#é ”ƒ(T+`…1cÆÄÄÄ@9(`ÁQZZš——7eÊÒAþŒB°…aaa3gÎ#äÿ@°…!!!”f100(//ÏËË#€ZPÀ¢¹¹9<<ÜÊÊŠtŽDDDfÏž`€PÀ"&&F]]]YY™t60 ð)0€€ µµµ%‚=kkë0 ÒA( ¨¹˜eРA&LˆŽŽ&€BPÀ‚    ´´ÔÐÐtNÙÚÚ†„„N@!(`A6{ölQQQÒA:eccƒ‹B´‡T»Ö§&MšT]]M:U €ø^SSÓýû÷gÍšE:HWètúìÙ³ïܹC:U €ø^LLŒ¦¦æ!CHù œŒÐ €ï………Q|ü™eÖ¬YÑÑÑ ¤ƒP €ï………Y[[“Nñyƒ š8q"NF`Að·ÒÒÒ‚‚*Ÿ€Ôžµµ5v° €ø[hh(ÅO@jÏÊÊ  À‚àowîÜ¡à :£¯¯_VVVPP@:y(`>ÖÒÒ1{ölÒAºKDDÄÒÒòÞ½{¤ƒ‡àc ******¤ƒôF¡XPÀ|Œ¿ÆŸY¬¬¬"""ZZZH  ÀÇÂÂÂø®€‡:bĈ'Ož@ €_UTTdddL›6t³¶¶ÆPÀüêÎ;fff¤ƒô®I @Cð/~¹å§Œ³³³ËÊÊH  À—˜Læ;wøè¤öÄÄÄ,,,îÞ½K:I(`¾”””$//¯¦¦F:H/a À—BCCùtü™ÅÚÚúîÝ»8 „ €/…„„ðu6LEE%>>žtbPÀü§²²2##ÃÔÔ”t>Á(490ÿ ãÓÚCƒCð~ßÌbbb’••õöí[ÒAÈ@ð™ÖÖÖ»wïZ[[“ÒWbbb–––¸1-0ŸILLTPPPUU%„0   Àgø÷XŸ²±±¹wïNFá„à3aaa0þÌ¢¬¬_ÀjjjÚÚÚ.\h›rïÞ=}}}uuun€ÿihhˆŒŒà±µµ½}û6é ¼óùÞ·o_hhèÁƒçÌ™óúõkOOOŸàà`®&ËÏÏwrr’•••••urr*((èlÎèèhgggEEÅr5ïEEEM˜0AAAt.š3g „J·öëêê>}úÔÌÌÌÂÂbâĉ÷ïß7nWcÕÔÔXXXèééååååååéééYZZÖÕÕ±yÆŒååå%%%Gõòò:{ö,WãðØíÛ·çÌ™C:wÍž=ûñãÇÕÕÕ¤ƒðH¢ÓéTPP ÓéÜ ÄræÌ##£íÛ·4hРAÛ·oŸ_À¹¹¹ÉÉÉíÿÿgΜÿêÕ+îŪ¬¬”——o?eðàÁݹýCEEÅöíÛ:ĵh¼&< IDATÇ»»»·ÍÐ~O­µµõ¶mÛø*} ´¼  @FF†t.6š† 0P„ššZHH·¯üJA¶¶¶_~ùåÂ… IÀý€„Obb¢¸¸¸¶/F›;wngW¾Ý*ବ,WWWqqqWWלœn'rAAAóçÏ'‚Œyóæ…„„466’ÀEŸ/àçÏŸO›6MSSóáÇ?~|øð¡†††±±qzz:ò­ÀÀÀÎŽüxJJJcÇŽ}ðàé \ôù¡mkkk;;»õë×·Ÿxøðá°°°ÐÐPnf#û€¸¬¬,SSÓ¢¢"!ÝO´oß¾ÜÜÜ'NÂŽäAXRRR999JJJí'–––ª««×ÖÖr#q(` õƒ @$Âêìxýû÷çtøO@@€££#é$ihh(**>~ü˜tnù|ÏŸ?ÿêÕ«&úûû;99q'€°+..~ùò¥ðÜ€¡3ŽŽŽ¤SpËç·¬kkk¿úê«qãÆ-]ºTEE¥¸¸øâÅ‹™™™gÏž0`oRò† ¬“'OÆÅÅu¸«JNN^°`AVVé ÔHîîÎíù¬®PÀ@ÖÌ™3×­[7oÞ<ÒAÈÓÐи~ýºŽŽé ¼Hîf{Ã>Ü¿€KÞ¿?{ölÒA(£Ð Àpx!µÜ¼ysöìÙ‚º§§oܸA:W €¨Ç?·gddôþýû—/_’Ày(` ©©©yðàî­ÙFDDdÞ¼y¤ƒp €Bnß¾=mÚ´^ßIS 999]¿~t ÎCPÈÕ«WI§ –3fäççggg“Àa(`ª¨®®ŽŒŒ´··'„ZDEEœœþý÷_ÒA8  @7oÞœ1cÆ AƒH¡œ… ^»vt CPÅÕ«W.\H:MŸ>½¤¤äõëפƒp €ªªªàââ‚C±@`àÎólpïöËŸÚ¹sgMMÍï¿ÿN:(**š4iRaa¡„„é, ,¸×Ø ìòåËË–-#‚? 6lâĉ¡¡¡¤ƒp €¤ØØXqqq]]]ÒAøÆ²eË.\¸@: €Hºpá6{ÄÉÉ)""¢ªªŠt€¾ÂÎN6°x£©©iذaOž}šýìÙ3???GGGÞ$l5rðôéÓQ£Fñ~í l¸×h6PÀÀ?~9rdNN޼¼j_&))§¯¯¯§§×ÙE§»OYYÙÜÜüòåËÉÀKüô Àï®_¿®£££®®N:aâââÞÞÞß}÷]DDD—¶zõê“'Or$/a¬• A—˜™™­[·nÁ‚¤ƒPEMM””T/ÎÅd2555ýýýõõõ9   † øÞË—/_¾|9wîÜÞ=½¬¬,>>ž³‘ˆ“––îû¥1étúªU«p>ð0œ|xïÞ½çÏŸ·¶¶æF6Áàââb``°iÓ&ÒA@Ð`€¿ýý÷ß–––½hß}ûöýý÷ßqqqÂÓ¾aaa½¸¤×úõë?ÞÚÚÊHÜ€à:&“yüøñõë×÷â¹nnn111£Fât(êb2™ŽŽŽ=ݧkdd4xðà.¥à80×ݹsGRRrÚ´i½xîàÁƒû÷ïÏñHTfccóðáÃ#GŽ|óÍ7ÍÍÍÝâúõë9½`œ…à:__ßo¿ý–t ~¢©©—ŸŸÿË/¿tÿYÎÎÎ/^¼HIIá^0ÂÑFlà ,à ´´4++«7oÞôë×t>ÓÒÒÒÐÐ0`À€î?eÏž=ÙÙÙþù'÷R°Áµ y  äî¦¶}ûöÏÎYSSÃ`0xJP½ÿ~ôèÑJJJ¤³€€ÀQÐ|éíÛ·7nÜèÎÍ MMMÏŸ?σTlðàÁÎÎÎÇ'àó°©Ç¶€S~ú駪ªªcÇŽu=[RRÒܹs7nÜøÝwßñ&˜ËÉÉ122zóæ””é, 0ÍS(`àˆºº:55µ˜˜ .f ^µjÕéÓ§ç͛dzlü«¤¤DNN®ë#ÃçÏŸoiiùÍ7ßð,0 AðŸóçÏ›˜˜tݾ4mРAÁÁÁhßn:}ú´¹¹yYYYó|÷Ýw‡jiiáY*€^À¦Ø†¾kjj3fÌåË—§L™B:‹@a2™^^^—.] ÑÔÔìl6SSÓuëÖ9;;ó2$lð™K—.©««£}9ŽN§{{{oݺuúôéOž<él¶mÛ¶ýúë¯ø$ T†à¼ÖÖÖýû÷wçÔ#è77·sçÎIJJv6ƒ¸¸xpp0/SôÆZÙÀ4ôѵk×<K:ˆP»~ýúþýû?~L:ð7 Að &“éããóÓO?}úPbbâîÝ»yI89::ÖÖÖÞ½{—töPÀ &&fccÓazxx¸­­í„ ˆ¤B"""?þø£——é ì¡€8‰µù»sçN:Þ~ú?ÿü³lÙ²ÿýwîܹ¤² !ggçÊÊʈˆÒAØ@pRPPN···o?166vçÎQQQ¦¦¦¤‚ Ÿ‚‚‚¶oEEEúé'l5¡€8†uŠª··w‡Í_ccãgÏž7ŽT0á!--mllœ””Ô6eñâÅïß¿¿wïÁTl¡€8æßÿ³³³ûô¡ò>Ú¸qã‘#Glll¢¢¢XSDEEwìØ±sçN²Á>…àŒ––///Ÿ›¿ÀcŽŽŽW¯^]²dINNkÊ¢E‹ª««oß¾M6@8á• œ ½pöìÙþùçÁƒ¤ƒF£••• 2¤íÛ›7onß¾=99YTT”`*àG¸O¡€¡§ ÆèÑ£ýýý§NZ]]-##C:tdnn¾råÊ+V|â ´#GŽN:õêÕ«“&Mb0¤AG»wïÞ¹s'~5@ØÔc[ÀÐ#ãÇŽŽ¾}ûö¡C‡nß¾­­­M:°áää4yòä~øtà'‚æ)0ôˆ§§'F  1béDÀ^ffæôéÓÓÒÒ”””Hg¾!hŠzõêÕ•+W¾û††‡¢})«¼¼ÜÆÆÆÌÌÌÇLJt [Àla ºoÞ¼yÓ¦MûþûïIÏ»wïž‹‹KCCÓ'OÆŽK:ðaÜÎÏÏwrr’•••••urrjy¹O%%%­]»VNN§`/EEE=þ|ýúõ¤ƒ@·Ìš5+**J\\|îܹø ÄQ´€kjj,,,ôôôòòòòòòôôô,--ëêê:›ùòåC† ‰‰‰áeHr---›6mÚ¿¿„„é,Ð]ZZZÉÉÉeee!!!¤³€°£èXëÁƒ/\¸Ð6eÙ²e“'OfíÒŽŒ`ºãðá÷nÝ 'z,$$dãÆ©©©’’’¤³Õ Ýô­[·\]]ÛOquu "• Mssóž={^¿~½gÏžcÇŽ‘޽akk;qâÄß~ûtjÝÔSRRJMMmª@ii©®®nIII×OÄ0pÕÇ-ZD§Ó%%%'Nœ¸k×.Ò‰ — uuuccc555IgJºó€ûõëW[[+..Þ6¥©©IZZº¡¡¡ë'¢€{rssíííÍÍÍ­­­7lØššÚ¿Ò¡ ÷|}}oÞ¼…ƒ7¡ B7Í^^^tvHç*jjj²²²òððØ»wïúõëOœ8öåw6l¨®®fkR^^¾cÇŽ¦¦&Ò¡@ˆPtSCÐ@AUUUrrr›7o.))i„ 𯄄{{ûçÏŸKHH¸¸¸|üøñêÕ«ío£ t[ÀZZZ)))í§¤¦¦Ž?žT&''—’’ráÂ___ÒY€3 –,Yòí·ßÊÈÈNŸ>ÝÐÐ0))‰t. -à9sæøùùµŸâçççàà@*Fknn^¹rå¾}û°…$H~ùå—˜˜˜°°0‘]»v:thÙ²e¤sà£èXkuuµŽŽŽ»»ûš5kh4Ú‰'Ο?Ÿ’’"%%Åš¡³1 A÷øøøÄÆÆâ‚'""ÂÍÍ-55UVV–F£566öë×t(  ¡‚–‘‘‰ŒŒŒWUUUUUMHHˆˆˆhkßOµ?~ ÇRAßEFFv˜’’’räȑӧOÉ\eiiikkûí·ß²¾Eûo`S l 3ƒñÍ7ß<}úôÁƒòòò¬‰S¦LÙ´iS‡ëÀÀ¨©©ÑÑÑ9räˆé,@-B· @DAA©©i]]ÝãÇÛÚ—F£mß¾ý‹/¾@û 0iié¿ÿþû«¯¾zûö-é, ,PÀÿ)//Ÿ2eÊâÅ‹/_¾Ü~Gxx¸¿¿ÿ™3gf˜6mš››ÛªU«>ÝÜimm=zô(ƒÁ  ÆZÙÀ´ÐÊÎÎVWWo?¥¼¼\WW×ÏÏÏ‚T*à™ææfSSÓÅ‹oذ¡ýtƒ±jÕª/^øûûãÒ•ÂFè.EI X˜Læ¼yó´´´öìÙC: ðHNNŽ‘‘Ñ;wtuu;ÔÜÜ,&&ÆûH@ Ž‚à¤ÂÂÂÀÀÀ.f(//_´hÑÙ³gѾÂéèÑ£/_¾|øÇÄí„¡G°©Ç¶€“Éìú"á vvv‘‘‘ZZZ??¿û÷ïwÿ/'44tíÚµ3fÌØ¿¿¢¢"Wãga0ÀçIHHt¿}Oœ8qêÔ©{÷î¡}¡§¶lÙ2wî\kk몪ªn>ÅÆÆ&--MAAa„ gΜáj<àØÔc[Àïĉûö틊ŠÂ½ ×6mÚôèÑ£{÷îÉÉÉuÿYéé鉉‰®®®Ü œ…Ûò ˜â˜LfBB‚¡¡aïž~üøñýû÷£}¡ïX|çÎyyyÒY€[0 ðŸ'Ožoذ¡w×Ýõõõ=xðàýû÷ѾÐw477·´´,//'ø øFiié—_~¹`Á‚5kÖÄÄĈ‹‹÷t »víúã?îß¿?jÔ(.a´oß>{{û3fõe9œŠü |ãÚµkJJJ™™™®®®]_ÕùS­­­›6mºqãÆƒ†Î¥„ œvíÚµjÕªéÓ§¿~ýº× ùý÷ßÍÌÌž>}ÊÁ`@qØÙÉö ˜†††+V”””4ˆtLþùçÏ?ÿ|ãÆ ##£^<½¥¥å¯¿þòòòš:uêž={4448žzû€zéýû÷³fÍb2™wïÞEû÷¸¹¹={vîܹ7nÜèÅÓEEEÝÜÜ^¾|©««;sæÌn^Hø6õØÀ0q CRR²ïËyýúµ““Óž={z:j Ð ÉÉÉëׯ߼ys¯ÒØØˆK³Q¶€AXDGG›ššúøøpdQÓ§Oߺu믿þŠöÞ˜4iR\\ÜåË—¿úê«Þ¨O£ÑоB Tgkkûå—_zxxìÚµ«K;uêÔ¢E‹.^¼¸jÕ*ŽÄè¦aÆEGG¿}ûvÖ¬Yeee\rkk+—Ä¡€êêêÖ­[7wîÜÌÌÌeË–õåÆD ÃÝÝýøñã=µïii退€éÓ§rêÀ溺º±cÇîÝ»·ººš# âPÀ@  HLLôððèãà[NNމ‰I]]]\\Ž#‚DDDvíÚuôèQ‡'Nô}  LOOÿâ‹/~þùg\úCàh#6pŸ ôððøùçŸ×­[G: À²³³,X0nܸ?þøCZZš# Ü¿¿œœÜÞ½{û¾4ø,\ š§PÀÜSUUõäÉ+++Î.–Á`lÙ²åÖ­[þþþ“'OæìÂú¨¾¾ÞÓÓ3::úÒ¥Kúúú¤ã@Ïà(hà{999›6mÒÐÐ äì’“““ ËËË“““Ѿ@Aýû÷?sæŒÝž={ZZZH'J@/|ùå—S¦L‘HII9yò$§ÛÜܼ{÷n++«­[·^¾|yàÀœZ2Ç-\¸0!!áþýû¦¦¦¯^½âÆ*ªªª~ÿý÷ÊÊJn,8 ¼ðõ×_çååíÝ»wذaœZfFF†±±ñÇ]\\8µXî>|ø;w\\\LLL>ÌñÓŠêêêRRRÔÕÕ¿þúëÌÌLÎ.8 ¼0eÊ”pjiMMM»wï633[½zuhh(n®|„N§óÍ7?¾qãÆôéÓ_¼xÁÁ…«¨¨øùùeff*++[XXpp´ ¸G±ƒ°z§¡¡!99yÊ”)\]K\\œ‡‡ÇÈ‘#Ož<9bÄ®® €{˜LæÉ“'½¼¼¾ùæ›­[·JHHpvù uuu¸þyßá , ´ôôô 6 >|Ïž=Ü[Keeå×_½páŸþùöíÛh_àkt:}íڵϞ=KIIÑÑщŒŒäìò%$$¾²³³³²²8p`BBBPP7VÑÜÜ|üøñqãÆ‰‹‹§§§/\¸kà½aÆݸqcÿþýnnn ,ÈÉÉáö«ªªÖ¯_ÿøñcn¯> c­l`ºG^¼x¡©©)**Ê¥åß½{÷Ûo¿UVVöõõ8q"—Ö@ƒÁðõõ=xð ››Û¶mÛdee¹´¢ªªªcÇŽ]¼x±©©iÙ²e+V¬PSSãÒº.ÄÁS(`ŠHOOß¼y3ëº?¤ãp]IIÉöíÛÃÂÂvîÜéææ&&&ƽu%%%ýý÷߃Þ±c÷Ö"PÀ<…n¯µµõÑ£Gþþþ¾¾¾¼Yéëׯ½½½ÃÃ÷mÛ¶fÍqqqÞ¬€ ’““7oÞœ››»sçÎ%K–pox ºa6l9r¤§§çˆ#Ö¯_σ•¾yóÆÍÍÍÄÄdܸqYYYžžžh_6“&MºwïÞÙ³gOŸ>­­­}õêUÞ߈0<<üÝ»w<^©°AC§¤¤¤”””ÂÃÓ““·nÝÊíEÙÙÙîî†Ã† {õêÕöíÛ9råz>5cÆŒ‡þþûï¾¾¾ÚÚÚþþþ¼¬á‹/jjjš››>|877—gë*keCÐ<–ššºÿþ;wî¬]»vÆ 8w ƒ°°0ŸwïÞmÞ¼yÙ²e?i˜-ƒûüùó¾Ü¥›¯a0O O¿|ù288844tûöífff¼pÿþýß~û---ÍÓÓÓÃÃ{G~€û÷ïïß¿?99yÆ _ý5þ_xû€Ãüüü444fÍšõêÕ«õë×òrí ãüùózzzkÖ¬Y¸pavvöæÍ›ñnÐ5333Ö'æ””555OOO.ÝÔ¡›bbbŽ?΃s—•°lêõˆ0l§§§·´´hkkóx½999gΜ9w§çìÙ³ét:3€¢¢¢“'Ož={VWWwÍš5¶¶¶\=g‰­„„„“'O†††JIIYZZzxxèêêò8`𧦀³³³ g̘A:­©©)88øÔ©SÏž=[¾|¹‡‡‡¦¦&éP|¯¡¡Áßßÿ?þÈÍÍýꫯÜÜÜ8xñnb2™iiiáááFFFS§NåñÚyÌS|]Àõõõ7n܈ŒŒŒŒŒllltqqÙ·oÁ<ÉÉÉÿý÷åË—Gíáá±`ÁÞ? TÒÒÒN:uåÊ}}}WWWGGGÞ¬^½z5jÔ¨~ýú‘ÒK(`žâ뮩©Y¹r¥¹¹¹……ŸqãHÅ(++»|ùòùóç?|øàêêêêꪮ®N* €`0AAA~~~qqq ,X±b…±±1ñ½<–––OŸ>Õ×ן9sæŒ3ŒùëÒ"(`ž¢~755%%%éêêRíCeeee@@€¿¿ÿÓ§OíííW®\iff&´g/R\\ìççwáÂ…šššE‹-^¼XOO`žššš‡†‡‡'$$DDDð~wu_ €yв|ëÖ­¨¨¨„„„gÏž©««©ªª’E£Ñh>| ñ÷÷¿ÿþ¬Y³œíììú÷ïO:€°{þüùÕ«W¯\¹"""²téÒùóçSóŽ&µµµÏŸ?×××§à•ïPÀ»=ÎIDAT.]ºôõë×ZZZzzz³gÏvtt$ê?(`ž"UÀååå ÏŸ?711111á}€î`2™IIIaaa!!!™™™¶¶¶ŽŽŽÖÖÖRRR¤£À祤¤”••ÙÙÙY[[Ïš5kàÀ¤sÑh4Z]]ݳgÏ àîîN:ÎPÀ<Åûþûï¿wìØQ]]m`` ­­½hѢɓ'ó2Àg½{÷.***$$$44T^^ÞÆÆÆÆÆfúôéTÛ Ý”£««kkk;{ölmmmêl* 22râĉ::::::’’’þ<--MRRr„ cÇŽ3f̸qã´´´†J:fWPÀ|ĈÜDóT_n&“YRRòîÝ»ââbV׿ååü²²²Ã‡>|¸ªªêˆÿOMMMEE…ƒ?€à©­­}óæMûwÔ¼¼¼Â¢¢¢Aƒ±ú˜ÕÍ#FŒPQQ2dȰaÃúxÒ ˜§>ûr·¶¶–————————çåå•”””–––––ÊËË+***++>¼ícëÏçÿp“É,--e)æææ—••ËÈÈ 2DII‰õ>¬¨¨8lذaÆ)++2ä³ïÉ(`ž¢ÓéoÞ¼)---+++///--eÕmII ë‹wïÞ±*¶í·¨¤¤¤ªª:tèP%%%@oß¾-+++---,,,,,ì°í$&&¦¤¤4dÈEEÅ!C† :TQQQAAµ­   ¤¤„æ‘––111UUUeeeÖ¯aèС¬ß’’’’’’‚‚‚¢¢"îL ª««Y; Y›[¬í®_£€y‡:§!YÜk\€0(`¤€óóóœœdeeeeeœœ H'èŠ pMM………žžëR)zzz–––uuu¤stJ÷=xð`bbâ… Ú¦,[¶lòäÉžžž½[ Ž‚Ý•[·n¹ºº¶ŸâêêD*Àg B§§§ëèè´Ÿ¢­­‘‘A*Àg ÂXk¿~ýjkkÛß5¨©©IZZº¡¡¡w Ä4°p¯„úzŠ^^^ÞÞÞlâý-'@¨¦ž’’Rjjª’’RÛ”ÒÒR]]Ý’’’Þ-²[À” FC¶ÞB¶Þ¡l6Ê£![oá ¬®hii¥¤¤´Ÿ’šš:~üxRy>K xΜ9~~~í§øùù988ÊðYÔÝêï¾êêjww÷5kÖÐh´'Nœ?>%%EJJªw ¤ì`eƒÑ­·­w(›²ÁhÈÖ[‚ŒLddd||¼ªªªªªjBBBDDD¯Û€¨û¡ƒ Ê~£l0²õ²õe³Q6 Ùz‹{ÙD½¼¼¸±\~gffF:{” FC¶ÞB¶Þ¡l6Ê£![oq)u?t0AØ ÀwPÀ €@€  @ €0(`PÀ €@³AÿéDl”––jjjR'ÛãÇÝÝÝÕÔÔúõë§¢¢2sæÌëׯ“õŸèèhgggEEÅ’Nô?IIIk×®•““£Î¯2??ßÉÉIVVVVVÖÉÉ©  €t¢ÿ¡àËÅBå¿1*ÿo¶Gµ÷4^>Aý—¥µµuöìÙ—.]¢NTCCÃcÇŽ½xñ¢¡¡áýû÷wîÜ™4iÒŽ;Hçb2™LfnnþèÑ£ÚÚÚ§OŸêèèœ9s†t¨ÿŒ?~çÎiiiùUVWW«««ûøøTTTTTTøøøhjjÖÖÖ’Îõª½\m¨ü7FåÿÍ6|OãAªü¨”B¿€ÎüþûïË—/gR;jVV–œœéL&“ùý÷ß·¶¶¶}›’’¢®®N0[ùUúúúº¸¸´ŸââârøðaRy:C‘—« _üµ¡Îÿf ¾§ñ nGÈ•o M£Ñ’““—,YòôéS*GÍÏÏ×ÓÓ{÷îé ÕÕÕ 4¨¡¡tÿƒ"¿J ‹­[·Îž=»mÊÝ»wûí·ˆˆ‚©>E‘—«3ÔükCµÿMj¾§ñ ö³7tèPqqqeee—/^Žó?õõõ®®®çÏŸ—‘‘!¥S>|`í[³f é,l„††N˜0t ŠJOO×ÑÑi?E[[;##ƒT>EÙ¿1 þoRù=ëEÀíMl~äàà]___PPpðàÁ!C†<{öŒt¨ÿ|ýõ×»víjû–j¿ÁöZ³fÍjnn&¨£÷ïß3&::štŽ(ò«olll?¥±±±_¿~¤òt†"/[Ôü£ìÿ&eßÓxPTùQ©ìĉVVV¤S0™Lf`` ©©iûÿêü±¶÷öíÛK—.©¨¨x{{“Îò”––NŸ>=22’t6(ò«D÷•ÿƘÔûßä—÷4&wŠ€¢?*Ïtg0 ´´TJJŠ—©X>ͦ®®ž››ÛaÞcvïu‹ŒŒ1b/S±t–­°°PGG'<<œ÷‘ºÖö(ï#}jÈ!¥¥¥í§””” :”TžÎPäåúíÜ¿KrQÇñó@«CD¸„5ÔÔ”BHhAÑäâÐXÐRCCcƒKPKPJS´He-Ö…RHÑ$ÈyÒçjå¢ßãõý/ŸÎûñp¹Zˆ¯±IíÍZæÜÓ~ÕŒ"èôgÀÕcñÃß´2RõçZ²e³Ùþþ~Ë{i"o*72ncccù|¾•©Êêf{~~žžžÞÞÞöûý­ôC0Ó ßÜÜT_Éd2G*O1a5HjoÖ2çžö«flÛN/àFLLLH§PêÇc“t´:...†††¤S(¥T>Ÿ›››>ŸO:‹é‚Á`<¯¾Çgff¤ò´‹öZcæìÍ6º§5¥;(wŸÏwxxøòòR,b±XOOO:–ÎUŸ93855utt”ËåŠÅâÓÓÓÞÞžËå:==•Î¥µÖ£££ûûûÒ)~aÈT~|| Äb±¯âp»ÝŸŸŸÒ¹¬ ®/&¯1“÷f-Cf¶5E`Ä¿j”d2‡NgWW—ËåZ^^¾¿¿—õ-C«Ö:•JÍÎΖǭ¯¯onnîòòR:Ô?u¿z é\Z“M6Òããc(r8‡# YÑÉ2p¸ÊL^c&ïÍZ†LhkŠÀ”Wžè(<@ € 0(`PÀ €@ €@ € 0(`PÀ €@ €@ € 0€Š………ê+ëëëóóóRyû£µ–ÎÀooo^¯÷øøØëõ*¥®®®@&“éí핎Ø '`N§sww7‰”J¥R©‰D¶¶¶h_ 8°ZYYÑZŸŸŸŸœœHÇì‰`•Ëåü~ÿûû{*•”ŽØ ÀjmmmrròõõõöövggG:`O<ðŸD"‘ÍfÃáðêêêõõu"‘NØ'`…Ba||üììÌív+¥îîî‚Á`:îîî–ŽØ '`Ñhtii©Ü¾J)dz¸¸FeS¶Ä œ€@ €@ € 0þ¨·Í¾IEND®B`‚gsl-2.7.1/doc/images/rand-chisq.png0000644016036000116100000004553013373111455014011 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœíÝw\gâðYAé, ˆR¤±ƒ 5DDb4Š1±\Œz?cb>~þüù\.W^^^WW×ÇÇ'22’~ˆÃáôò½?*‰^õqþcРA\.wòäÉ;vì(..îË÷ö'†pßaéûó … (Š:räȇ~¸hÑ¢¬¬¬úúúË—/wvvNŸ>t.±Ãçóù|~SSSVVÖwß}×ÐÐ`ggüF;a³Q· ¶8|>ŸtÂ222Þy礤$---Áíß|óͶmÛ(Šâpdë_Ê«~Þ·?xð`úôé·oß¶´´ìçþ…õ|a}/€Ha @íß¿ÿóÏ?ïÖ¾EÑíKëììܹsçÈ‘# 4zôè_~ù…y¨—9VCCæM›LMM¬ªª:}úôëׯ3fddxzz*++kii}òÉ'MMM½/º n,))Y»ví!CŒŒŒ6mÚÔÒÒÂ<§¹¹yݺu\.WðùwîÜqvvVTT9rä±cÇwûrŒW¿U=°µµÝ°aÞ={º…|ÕÏN?YÍî%¶`þ¦¦¦Õ«Wkii)++{zzffföø¶tÛøª×bžvíÚ5WWWeeeeeeWW×7nî¡—?t!àÈhnnVRRêöœ^~öKñ娂ïF·;vìXºti/©úRÀóæÍ |èàÁƒóçÏgžÖË:@ÿ¡€úTÀÌ|‹VSS£®®Î<úªotvv^¹reqqñË Îáh999},àæææ;v˜™™)))ÑKYrrrÌsòòòº}£±±ñÓ§OÃ6¬/1^ ›ÆÆÆÁƒw{N/?{¥ørlÁwãåzzz½¤êK1¢°°Pð¡‚‚CCÃW½¨à:@ÿá05lذ¢¢¢ÞŸ3räHÁ¡ººzmmm·çpÐ[Ο?_UUebb2f̘åË—‡„„ðÿsBÐóçÏõõõ¿½Û°›®®.æëÍ›7ÇÅÅ;w®ªªŠÏç777wvv þ8ݾ·¨¨hôèÑL6 ²²²·‹Ñ£üüü—¿«—Ÿ½G/Çî%•¾¾~UUÕ«ž,ø^õ¢¢¢BGGGp —Ë-//g†}ùCxk(`jêÔ©ááá½?gÀ€×ÿcüÝ–Þbddtùòå/^œ?~ܸq»víZ±bý––Vii©à· ÕÔÔ^¼x!øh^^óuppðÑ£Gíì씕•)Šzöì™à3ååå»:thii©`<¦°{ÑGW®\™2eJ·½üì=z9v/©JKKµµµé¯{¯zÁår+++·TVVêêê2þü¡¼5üõ Ö¯_ÿÓO?UWWwÛþí·ß eÿƒ ²±±YµjUhhhPP½qúôégÏž|ÚéÓ§™¯G/øèñãÇ™¯›››™á‰'z0uêÔê=F_¤¥¥íÛ·ï³Ï>ëñÑvEEŶ¶¶7z•n!Ïž=;mÚ4úëÞß«^^ËÞÞþÚµk‚[®^½jooÿFÁÞ‹ËÝâë×_577®©©ijjŠ÷Ýw©¾‘íåßÑĉO:UTTÔÞÞ^VV¶eËOOOú¡ììl.—{àÀòòòòòòýû÷/^¼˜ÙÕ¹sçLLLîÞ½ÛØØ˜““³yóæU«V1.^¼øƒ>(++«¨¨øñÇ,XÐ{˜ŒŒ ==½ýë_ÏŸ?çñx‘‘‘ÌIX½ÇxÕÜÑÑQSSóçŸ~þùçÚÚÚ/^|ù9½üì–––—/_îèèxù»^õ/^¼˜ yàÀ.—Ëœ¸Þû{ÕËkÅÆÆª««ÓgAWVVž9sFCCãÞ½{}‰ÐøËð—ØØØyóæikk8ËåΟ??22’~è­ øÖ­[>>>šššŠŠŠ&&&_~ùå‹/˜GÓÒÒf̘1xð` •+W666 îêàÁƒ¦¦¦òòò;vìèèè`­®®þàƒ444ÔÔÔ–/_ÞÐÐðÚ0©©©žžžC† QRRš:u*ó£½6F·™¦   ­­=qâDÿn§Y1ßÛËÏjjj*''×÷_qx<ÞǬ®®>xðà™3g¦§§ >³—÷ª÷׺|ù²“““’’’’’’““} º/‘ú׈#¸l€ìÀ1`PÀ`½ €Ì€@€  @ €0(`PÀ €@€  @ €))àû÷ï¯Y³FMMÃáÎðzRRÀK—.ÕÑщ% O¤í~ÀŽ´ýD •¤d YPÀ €HàK—7ú‰¶oßÞã{¢¨¨Èîˆ/–´²$”“°„²“C‡=|øððáÃýÜ$ºs{±-*FFFyyy¤S€˜B‹ÊÈ‘#óóóI§1…%hQí¤¹¹YSS³±±ç\X‚~ Îtûš %%¥!C†TTTâIJ ¸ÇÌH‡Â*4¼’”°xBÀ« €E ¯‚!CC‚Ò)@¡€E3`x°¡€@ú͚ܿ5jjjÄ?l"éPÀ"4räÈ‚‚q8@X–.]ª££K:ˆÄ“¶ q…?v­££óðáC.—+”½ˆÑ]¡B¬àB’ «Ð &,--ãââ˜ass³¹¹y`` ÁH2,Z(`¾¾¾ÁÁÁÌPIIiûöíAAA#É8°h¡€@Løúú^¼xQp5uæÌ™÷îÝc†œ^‘ˆ,åPÀ¢eddôìÙ3Ò)(KKË¡C‡ÆÇÇ3[ÚÚÚx<3ìýîñý|uÿÞ ^¤üýýû™_PÀ¢ebb’M:E½´ }üøqKKKv^Úßß¿÷‚)°,255ÍÉÉ!€¢þw:%%e×®]ëÖ­cí}I.µÔ’‰“ÈßGx'wuu©¨¨TWW+)) e‡ýaiiùûï¿«¨¨xzzŽ7.88ø­ËUˆÿ«g¢û11­â00ˆ __ßM›6¹¹¹5êôéÓ˜Ú„9¬B€˜ðõõõööWTT|‹=.Jcº?’ ýPÀ >,--û¹ * ËÎìÀ XäŒsssI§ñ‚9Ì€àe(`‘ÃGàe2qù›îIç***uuuƒ Ö>€ø’8pàˆ#òòòH1‚fƒ©©)V¡@ ˜ æææOžÿü󨨨ñãÇ<ØÉÉ)00p÷îݤCI*0° ÄYZZÆÅÅ1ÃææfssóÀÀÀ7ÚÉ?þ(xáI“¢¢"¡E”1(`6p¹ÜŽŽŽêêjÒA@vu»°’’ÒöíÛƒ‚‚ú³ÏÐÐP++«~G“Q(`–à00%x3`ÚÌ™3ïÝ»Ç ßô~À555[·nÝ·oé¥ ˜%æææ8 YZZ:4>>žÙÒÖÖÆãñ˜!¿WÝöVQQáíí}øðá‰'öåÕýýýëÜßߟͧ½ê dáJX=ÅuOvïÞ][[ûÏþS¸»è;ÿººº½{÷ÒÃï¾ûîÒ¥K)))oºŸ’’’9sæüüóÏÂÎ(vp%,‰‡%h Np:%%e×®]ëÖ­cíãtii©§§çž={d¡}E ÷f – €8fZEEÅËËËÓÓsÙ²eÌ£}™çUVVΚ5k÷îÝîîî¢L*°ÝQ,8´µµ©©©½xñBAAA¸{è;ÿÈÈÈØÙÙEDD(**¾Ñ·ÛÛÛoÚ´éý÷ßQ<1$º%hpDôv3æâÅ‹–––Bß3@effZYY-Y²äÈ‘#JJJoúí=ž][[«¦¦&ŒtâHtŒ%höXXX__ßàà`f¨¤¤´}ûö   ·Þa]]ÝÝ»w.\øÉ'Ÿ# ÌA³ÍÆÆKÐÀ>Á›ÓfΜyïÞ=fØÇû3ÏTSS›Ÿ_^^®««K: ÈfZEEÅËËËÓÓsÙ²eÌ£oW3qqqæææÂË(Cp ˜R|}}7mÚäææ6jÔ¨Ó§O÷>ë}ÙÌ™3CBB*++ÛÛÛKJJNœ8ññÇÿý÷"J+ÝPÀØØØé Z(`±3}úôððpÒ)@´PÀbgÆŒ8 õp ¸SÕØØ¨§§W\\f̘ÊÊJyyyÒYd– e‘®®®‰‰Ill,é |(`±öî»ï^¹r…t >±Xk7b²MQÔ£GfΜYXXˆKb%heaa1dȤ¤$ÒA@ÈPÀânþüù—/_&„ ,î¼½½/]ºD: XÜÙÛÛwtt<|øt&°¸ãp8¾¾¾.\ „ ,Þ{ï=0€”AK‡®®®Bƒ– ¾¾¾ÁÁÁ¤S€Ð €%ƒ¯¯oPP˜\ú,ììì „+rH °Äðõõ=þ<é ârÑc±">ׂôäÉ“©S§ÉÉɑΠ+p-h ÌÌÌtuucbbH!@K’E‹9s†t q\k%N<— )Š*--µ²²*..}štxK(`IµråÊßÿt xK(`I5yòäÎÎ΄„ÒAàm €%ØòåË9B:¼ q?Ûˆñ? ‹öüùsSSÓ'OžèèèÎ pô@KKËÛÛûøñ㤃À“Œ©Ë$eLQÔƒÞ}÷ÝÜÜÜ’Î …0†žÙÚÚŽ1"$$„tx3(`‰·~ýúýû÷“No,ñæÏŸ_RR’˜˜H:¼°Ä“““ûôÓO1 ,s¶›$è$,Z]]±±ñƒ†N: €TÁIXÐUUU??¿ƒ’}%aS=vHÜ ˜¢¨‚‚{{û¼¼¼¡C‡’Î =0†×044œ6mÚ¿þõ/ÒA O$oªÇIœSuïÞ½E‹=}úåÌ€áõ\\\ ƒ‚‚H€×“È©ž¨Iè ˜¢¨ÈÈÈõë×gdd €_­„3`è“iÓ¦©©©]½z•tx °´Ù¼yó·ß~+¡3xÙñ𮩩 ðññ122RVVVVV622òññ ¨©©a'"¼///99¹k×®‘½ye¯\¹R__ÿìÙ³S¦L¹qãFYYYYYÙ7&Ož|æÌ}}ý+V³úbëÖ­þþþ˜ˆ³W[VRR222Ú³gϬY³z|BhhèÆóòòš››E™É= ‹Æçó·oßîååE: €d#pÖÂ… “““_Õ¾Eyzz&''/\¸P± ?8ζmÛ0 g’=ÕIŸÓœ¿úê+L‚úC‚7öÕW_íØ±C ~“J¯/`__ßÊÊÊnkkk-Z$šH ï¼ó΀.^¼H:ôàõldd4vìØÓ§O3["""ŒE ú‹Ãáüøã[·nmoo'ºëÓÒvjjêŠ+ôôôöîÝ{ðàÁ´´´_ýu̘1"MVXX¸aƈˆŠ¢¦OŸ¾oß>ƒW=™ÃátÛÒŸ¥Wé8L›1c†··÷'Ÿ|B:€D"| ØÎÎ.11qÊ”)îîîÖÖÖ·oßuûòx|8aÂSSÓ˜˜˜úúú˜˜77·ÌÌLò‰³ñãLJ……]½zuøðᤳ¼±Ÿþ9(((11‘tõú¥íY³fÍ™3gݺu‚÷ïß&5Ÿ‘íFºOÂbœ;wn÷îÝÉÉÉ‚WA$OÂRVV~öì—ËÜX^^nll,­—t‘¦(ÊËËËÕÕuË–-¤ƒˆ)’'a 4¨ÇíJJJÂ#U¼½½7nÜX^^N:Ho~ùå—½{÷>yò„t™óúž?þ… ºm òññM$)ñË/¿ðù|++«¿ÿýïùùù¤ãôlĈþþþË—/ïìì$@¶¼~fÝØØ¸jÕª1cÆ,^¼X__¿´´ôÌ™3YYYG•²û1„¸àP^^~àÀ{÷îÑWC|>ßÓÓsêÔ©_~ù%é,b‡ä1à¾Ü½NÊŽ˜ÊÎ1·ø¡ IDAT`ZAA““STT”µµ5é,â…ä1à¾\ÐRÉ€5†††?þøã¢E‹ZZZHg¸I7nÜhoo'‚¢(jÙ²eæææ¸4kPÀÄ455íÛ·ÏÄÄdïÞ½ ¤ãP¿ýöÛ¹sçîܹC:€L@3xðàˆˆˆË—/'%%5* €lMMÍ'N,]º´¶¶–lY [gõû'a”——»¸¸°ù¢=úôÓOëëëO:E:€XÀíY%kgA jiiquuݸqãÒ¥KIg Ì*±*à®®®X=R‘‘ááá3zôh6_@ á~À2*++kôèÑ¿üò ›÷îµ²²Ú¹sç‚ šššX{QYƒkcÆŒ9sæÌ;wFŽùÙgŸ±vIË•+WÚÚÚ®]»–—A(`qçââœššª  ÀÚë>|811ñرc¬½"€L£ƒâC¬Ž”=a„›7o:88Î@ަ¦¦¾¾¾ÕÕÕ¤³H°ÄKMM]¹rezzº(v¾`Á__ß… vttˆbÿ2 ,ñFŒadd4gÎww÷«W¯vuu wÿß}÷Ý€þñw·2;{ ‰Ç€ÛÛÛ/^¼¸oß¾uëÖ-Y²D¸;¯­­uvvþÇ?þñÑG wÏbâ`•$0CDîÈÌÌtww¿~ýº“““Ðw ¶pô•ˆ.›eiiù¯ýkþüùÅÅÅ¢Ø?€¬AË„lݺµŸÝééé¹nݺyóæ566 +€ÌBË gccãëëýÖË)›6mrvv~ï½÷pR4@?IðÁNÑ‘ècÀ½hhh8sæÌ¡C‡¶lÙòþûï¿ÝN:::ÞyçCCÃ_ýU¸ñÄNÂb•´0£³³SNNî­¿½¡¡aêÔ©^^^Û¶mb*1$ºF(Š‚˜ëOûR5dÈ7nŒ?~ذaü±°RȆ¿¤¦¦~úé§}y2—Ëýã?¶mÛöLj:€TBÃ_† Æår==='L˜ØÜÜÜû󃂂üüüRRRØI M¤ü`çÛ‘úcÀ½èèè¸qãÆ‘#G.\èçç÷Úç_½zuõêÕ‘‘‘–––,Ä`NÂb•,ð[8wîܦM›nß¾mllL: €á$,_‹-âñxÓ§O¿{÷îðáÃIÇ 8 o 55ÕÊÊêÀµµµ‚ÛW®\¹víÚiÓ¦•——“Ê YPÀðlmmFµpá„„æ¡Ï>ûléÒ¥Ó¦M«ªª"˜@Rà`gp øµ^¼x4lذ¹sç nß¶mÛåË—£££µµµIe"œ„Å*pÐ¥££C: @¡€Y…î§Õ«WÇÄÄDEEééé‘ÎÐ/¸0HŒêêê?ÿü³²²ÒÚÚúÞ½{¤ãˆ)0™¦¦ffffXX˜……ÅøñãW®\I:€8ÂZk°-,ؽ{wtt´¹¹9é,o≴~ýzuuuww÷k×®988Ž F° ¢µtéÒÇÏž=;::Zpû²eË:TSSC*Y(`¹wß}788xñâÅ/^d6.^¼866vÔ¨Qô£ãƒ=À1`QHKK›3gΖ-[Ö¬YÃl¬¯¯¿råJJJÊþýû fx|˜U(`ÉËË›={öœ9s~øá‡°úŸi`dd—ššêããÓÔÔôÚçß»w/77—…`ìC«ÔÕÕCCCÕÕÕ'Ož\ZZÚû“ãããÇ?nܸýû÷¿öÉ’k­=À4 ¾ÿþûC‡]¾|ÙÑѱ—§uttDEE?þêÕ«©©©#FŒ`-!…cÀ,C³ãÊ•+«W¯>tèÏkŸÜÖÖ¦  ÀB*A¸H¡yóæ9òÝwß}úôéæÍ›9N/O~Uûòx¼®®®¡C‡Š&#€¨à0dkk²páB÷{¸{÷îˆ#æÏŸáÂ…¾œØ &PÀ@˜¾¾þ;wÔÔÔ?~ü¦ß>{öìüü|//¯'NèëëŸ;wN!„;{€cÀDüúë¯þþþ'Nœðôô|»=TWWwuuikk 7È2œ„Å*0)qqq .\½zõ–-[„{¥Ž––EEE!îd.Ä2ÁÍÍ-111""ÂÓÓ³²²RX»mii100˜5kÖñãÇ_¼x!¬Ýô Ä‹žž^ttô¸qãlmmÃÃÃ…²OEEż¼¼+VܸqcäÈ‘«V­Ênúk­=À´8ˆŒŒ\¶lÙŠ+¶mÛ&'''¬Ý644äääØÙÙ k‡ Ýp ˜U(`1QQQ±téÒÖÖÖÓ§Oˆúåx<žŠŠŠ¨_$ Žƒ,âr¹aaasæÌqrrbážÁ_|ñ…‰‰É_|ßÕÕ%ê—‡©^07)))|ð››ÛD:IMKKû÷¿ÿýïÿ»ººúÎ;¦¦¦¢{-X‚f X 566þßÿýß­[·NŸ>íêê*ê—ËÍÍ5448×ju(`V¡€ÅÖå˗׬Y³jÕª¯¾úJ^^žý---fffì¿4cÀEQÞÞÞ÷ïßOIIquuMOOg?@NNއ‡Ç˜1c6nÜxëÖ­ÎÎNö3€tÀT¯˜‹¿'NlÞ¼yÍš5[¶lay*Ìçóïß¿âììÀæ«˰Í*°D(--]µjUYYÙ‰'ÆŽK$Cgg§?£ bKÐÝéëë_¿~}íÚµÓ§Oß¼y3‘{¾ª}O:ÖÜÜÌr (`lË—/øðaqq±µµµ°.]Ù»wïÖÕÕ={ö¡C‡I'±ƒµÖ` Z…‡‡òÉ'&Lسg¦¦&é8EQuuuáááüñÇÁƒ•””HÇ€·cÀ¬BK¨ÆÆÆ¯¿þúìÙ³ß~ûíÇ,Ü€lÂ1`€×SVVÞ³gOXXØÉ“'Ç—œœL:Qonݺemmýå—_Þ½{·££ƒt` ¤­­mLLÌš5k¼¼¼V¯^ýüùsÒ‰z6yòäcÇŽ 4hãÆ:::{öì!X…µÖ` Z:ÔÕÕíØ±ãÌ™3Û·o_½zµ8^¨²²’Çã5ŠtèÇ€Y…–&k×®­­­Ý½{·§§'é8o,,,LKKËÞÞ‡´ˆÀ1`€·deeuûöí;v|öÙgžžžOžsè—Ãá,X°àÉ“'K—.ýøã'Ož.x`XðÉôPNNŽÙU{{»à-ÚÚÚæÌ™Ã ;::¶nÝ*#((HpWYYYoô&¼}}}??¿ÀÀÀâââððð1cƈú (`Ý.Ú¼k×.Á³yÍÍÍÛÛÛé¯9Κ5k˜G9NIIIWWóä9sæ0½Èáp~ûí7f8`À€¼¼<æ@/‡ÃüFz¸|ùòǯZµjÆ ...¡¡¡¯zrgg'³+yyyÁûþÊÉÉmܸ‘òù|---fØÖÖÆ ›››ýüü˜!Ç344d†MMM|ð3loo?qâ3ìêê*))¡Þ™™Ù!C^ÞÎçóW­Zuøðጌ ¬ˆ^‚·EDš››»ºº˜áúõ뙡±±q]]3ܹsgKK 3ÌËËëììd''£³³3((ÈÊÊÊÁÁáܹsì¼nWWWMM 3lkk»ví3lhhذa3¬©©±¶¶f†µµµžžžÌ°©©éСC̰³³³¸¸¸——nmm=vìØòåËMMMµµµ—.]ÚÏŸ@Ò‰®Ð4=@ ËéÓ§ëë뙡‰‰IQQ3{öŒt¨~QTTtuue†ººº?üð3433KNNf†òòò–––ô×ZZZ|>ÇŽffffffÇŽ{òäɧŸ~Ê<¹¶¶6&&Fô?€Ãçmz€! jjjêèè:t(=üðÃ,X0wî\zXWW§ªªJ.1¿©©‰¹qdZZÚÓ§O}}}éáñãÇŽ9BSRRªªªfÍš%¬ä(`VI}—––:thçÎô°±±±µµ•™@?ÕÕÕ?~üðáÃJJJûÛß–,YÒã%/€ÖÑÑakkkkkëæææèè8vìXEEÅ7ÚCgg§œœýubbbyy93?Þ¿qqñ?þH“’’ZZZ&Nœ(Äü õPÀ¬’¾æóùIIIÌ 2---—/_^´hÙTÒÏçߺuë×_ŠŠòõõ]µj•½½=éP⨫«ëÉ“'ñññqqq)))µµµùùùBÜ[[›‚‚ýutttSSs áÎ; °eËz«   xáR Ì2é+à®®®Ù³gc*ƾ²²²'N=zTSSsÕªU‹/fVSáe¯º—bSSSSS“àå<ûÏç·¶¶2î›7o8¹ÖöíÛõõõW¯^MTUUqm„f•tð–-[|||HŠ¢¨®®®ˆˆˆß~ûíîÝ»¾¾¾~~~ãÆ#J’ÄÄļóÎ;ºººÎÎÎS¦L±±±é+vûÞ™3g¸\î´iÓè¡¿¿¿··7=LKKÓÒÒ6l˜H#(`VIhwuuÕ×׫©©Ñä¤$cccÙ7%%%'Ož¤(ÊÏÏÏÏÏOðê`Ð ú3ÇÉÉÉÉÉÉÆÆÆ6l ¦¤¤DII‰ù÷õóÏ?ÛÙÙ¹»»Óï¿þzêÔ©Ì0''GGG‡ér,(`VIhTUUáãC’"!!áäÉ“.\pvv^¶lÙ¼yóÞôä#xYdddII‰“““¹¹¹à½#YöäÉMMMfÁ|ãÆï¼óΔ)SèáÎ;çÎkkkKŸ?®ªª*//O$*¼ ˜U’RÀ­­­ÉÉÉãǧ‡]]]ÿo§¹¹ùòåËIII>>>Ë–-sssÃÇÀÞÚµk×Î;—’’RVVfkk»sçÎI“&‘ÕÝŸþijjÊåré¡ÏçŸÎ’سg···‘‘=<Lj@³JR ¸¦¦æoû[PPþ-JJJΜ9sòäɶ¶¶Å‹/Z´ÈÜÜœt( öâÅ‹”””Ñ£GÎòf.\¸0uêTmmmzèààpòäI+++zxäÈ‘ùóç ÷d4è ˜Uâ\À·oß¶¶¶ÖÔÔ$D%%%åìÙ³AAAZZZï¿ÿþÂ… ™ÉËøñãÛÛÛ¬­­Åy–)¸¸µgÏžeË–1ÿprrº|ù2sÁ•+Wf̘!7“ ¢k¬XJ˜?ÿü³°°t !‡Ÿþ¹°°ðÀEEE®®®ãÆ;xð`yy9éhÒ#<<|ïÞ½cÆŒ‰‰‰Y²dÉóçÏI'êà¡¥Ï>ûLð÷ï›7oêëë3ÃÐÐÐÎÎNf8iÒ¤††f˜ÐÑÑ!â°ðÄwªGXÍ€ÛÛÛsrrðéC™ÕÑÑqþüùk×®ÙÛÛ/\¸ÐÛÛ+,èêêúé§Ÿìíímll˜aÉ’žžnmmM¢âóùîîîôǬù|¾··÷¥K—˜©nn®±±1ɸâ 3`Ù•™™ùÏþ“t fàÀžžž'Ož,--ýôÓO£¢¢LLL<<<Ž9R]]M:4knn®¬¬Üµk—™™™žžž$^9nìØ±Ì "çÖ­[ÌENø|þßþö7¦}›››çÍ›Ç|ckkë¦M›˜!ŸÏ¼ 8‹MõÄñpGG‡œœN­‚µ´´„……?>,,ÌÎÎÎÛÛÛÛÛ[âN5’,EEE=Þõ¹©©©±±QB§È¯ÒÔÔtöìÙ+VÐÃÊÊJ—¼¼†Ä*ö ¸¡¡áèÑ£d/­R€Ï秤¤\ºtéæÍ›¥¥¥sçÎõòòš>}ºŠŠ éh²îèÑ£.\°²²²´´´¶¶¶°°‘?”æææªªª#FÐÇž:uê‡~ ‡‰‰‰—.]bNs©¯¯¯­­544$“õPÀ¬b¿€;::~úé§7ârt ,EEEW¯^ ¹wïž‹‹‹§§§§§'.îAJeeåýû÷>|˜™™™‘‘ñá‡ÊÎ1Ô^ÔÔÔ1÷Õ¸uëÖ•+WöïßOãããÿþ÷¿ÓÃÆÆF‡Ãþ§œQÀ¬b­€ù|>δQãñx‘‘‘aaa¡¡¡rrr³gÏž3gΔ)S”””HGƒîŽ=ZQQann>zôh333æNƲ©¨¨¨¨¨ÈÍÍ^ºt)::: €ÆÇÇ.\¸¶¶¶ÊËË‹âr¼(`V±SÀ·oß>qâ}WvdddܼyóæÍ›©©©ãÇ÷ôôœ={6>ý)>ÂÃ㣣Ÿ~ü¸²²²©©©™™söºsçNccãìÙ³éá÷ßÏáp6oÞLèèèØ—]¡€Y%º·»³³³±±·ñÁçóß ˜UB»›››qÆ)H®òòrº‰oݺÕÔÔ4yòäñãÇO:ÕÒÒÿC—ÍÍÍyyy=þòôâÅ‹ãÇ3ÆÊÊ 4í ˜UÂ}»Ï;—Àœ› ÑòóóïÞ½sûöíúúz77·‰'º»»ÛØØ Œ%}ɬ¬¬ŒŒŒúúzOOÏàà`Ò¡Ä ˜UÂ}»;;;ÛÚÚ0éS\\üçŸÒ‡+++ÝÜÜÆ7~üxgggÜ^Õ××WWW½üÐãÇÏœ9cbbbjjjbb¢££Ã~>^MMmüøñt[XXˆâZEÀ²¶¶¶? |ýúõsçΙþ‡™™™ªª*ûñ„ ̪þ¿ÝÉÉÉ...Š ¡ø|~VVÖŸþI—qee¥³³³“““««ë¸qã455Ia¢O`&ÊóçÏß²e éPý…f– D¤ªª*)))111...11QCCÃÅÅÅÍÍÍÕÕuìØ±ƒ "ذeË–   z–lbbâéé9zôhÒ¡^ ̪·~»cccqý €¾àóùÙÙÙ ±±±IIIOž<133srr?~¼«««©©)N«–VmmmÙÙÙOŸ>ÍÍÍõööîñ’×yyy Ð××'û?U0«Þúí^±bÅ—_~ijj*ôHR¯µµ5===!!!..îÞ½{555¶¶¶ŽÿallŒ>–5›7o>{ölUUÕðáÃŒŒvîÜéììÌ~ 0«° @\MMMJJJJJJRRRrrr]]­­­¥¥¥½½½ƒƒƒ••ÕÀIg6´µµååååççÛÙÙõøñ§ƒòx<ƒQ£F‰â#R(`V¡€ÄÍóçÏÓÓÓ322îß¿ŸœœœŸŸoaaammmkkkoo?vìXÜÇIf?þÁƒEEE¹¹¹¹¹¹ááávvvBÜ? ˜Uoôv|ÿý÷"‚x<ÞÇ322RSSSRR233¹\®½½½=KÆU¡33³¶¶6CCÑ#G~þùç}üˆ ˜Uoôvóx¼¨¨¨wß}W¤‘ ]]]ÙÙÙ)))ô,9%%…Ïç[[[[ZZZZZZ[[[YY©¨¨Ž $µµµ<{öì‹/¾èñzm¿ýö›–––Áˆ#è›<¢€Y…%hIWRR’™™ùðáCú¿YYY:::VVVVVVt1›››÷x) q6l((((*****ª¯¯¯««SPP@³ e:;;óòò˜>ÎÈÈÈËË322¢û˜þ¯‘‘®Ò‚Z[[ „0«úòvGDDÄÄÄ|óÍ7ìDájkkËÊÊzôèÑÇéJ®ªª¢/ A/\›˜˜Œ=w•0«úòv744ZZZ² D­¡¡áéÓ§ÙÙÙ=ÊÉÉÉÉÉÑ××777733³°° [YKK‹tR` ˜UX‚Š¢:;;sss³²²ž>}š™™I·ò€ÆŽ;zôhæ–£FÂE4¥ ˜U(`x•ŠŠŠ‡>}ú”ž.çääêêêšššZYYYXXÐ×76lé¤ (`VõòvçææþöÛo?üðË‘@lutt<}ú4###++‹¾ÄqSS“‰‰ }{cccú³§#GŽÄ¼$ ˜U½¼ÝõõõIII,GÉRWWGEÎÎÎÎÍÍ-,+åÑ õIDAT,ÌËË+++300 [™^Ä622200PTT$^ Ì*,A€(´µµ={öŒž"ÓÝLäTKKËÄÄÄÐÐÐÐÐÐØØØØØØÀÀ`øðárrr¤# ˜](`` ŸÏ§¯c\TT”———ŸŸ_XXXUUeøô©^ǧ/Ï„C± ̪ßî?þøÃÅÅEMMH$5---Ïž=+,,ÌÏϧ[¹¸¸¸¨¨¨¦¦fÔ¨QÆÆÆ#FŒ>|8}qcƒaÆáfä¢ ºÆé}5fÌ0°CQQÑ¢Ûö––f–\\\F¯c———s¹\z){Ĉ#FŒ ×± q9ñ„p° §³³³°°þXTQQÝÊÅÅÅ………ÊÊÊô\YOOËåêééÑ={T¼– Y…iRUUEO— JKK+**ÊÊÊ  DÏ’ tuu¹\.}¤ÙÀÀ ~40«º½Ý|>§<€Tª©©¡gÉååå%%%ôì¹££C[[›>ÌÌåruuué#ÍÚÚÚC‡%%(`V ¾Ýõõõ&LHNNÆË@¦466VTT”––TUU•••—””TUUñù|z5›>1[___OOÏÀÀ@[[[[[[SS“t|¡A³ªÛÛ]^^Nß–hõõõeee••••••¥¥¥%%%ÅÅÅUUUÚÚÚô‚6ÓÊzzzÚÚÚ:::#FŒPRR"ýô ˜U8 Э­­UUUåå奥¥ôgš+++ËËËé/ŠŠŠ”””¸\.]ÒôÚÚÚººº:::ZZZºººâsÌ*0€H=þ¼²²’.骪*Á†¦çÐ---L+kiiéèèèééiiiÑ­¡¡¡¦¦¦®®ÎBT0«˜·;&&ÆÕÕŸm`YkkkeeeEEÝÓÏŸ?/--¥¿(++{ñâEmm-½ÐMW²ŽŽýµ––Ö!C˜¶ÖÖÖ0`@’ €YE¿Ýï½÷Þ©S§”••I'€îÚÚÚ˜J®úšššúúúòòòÊÊÊçÏŸWWWkii :TCCƒ>;lèСšššô1iú!MMM--­WÝÌ*,AH‡ÎÎΪªªúúúÚÚZº­ëëë«««+*****ª««ëêꪫ««ªª¨ªªJÏ¡ÕÕÕÕÔÔtuuUUU7mÚ„KQ¼999]]ݾ|’¥±±±®®ŽžF¿xñ¢¦¦†^]6Lõz€0ÐD×ý:4-ÅÒÒÒ®^½J:H-pÏ:;;»ººH§©…µÖ` hX‚*(`PÀ=ûá‡HGi†‘é Íp¶QpÐp€TA %\XXèãã3tèСC‡úøøõs‡ÅÅÅB Ð#i(`çîînoo_PPPPP`ooïááÑÔÔÔŸ}â„ RÒp¶ÑÞ½{SRRNŸ>ÍlY²d‰³³óúõëßn‡8 h8 «7×®]óóóÜâççB*ÀkICgffÚØØn;vì£GHåx-i(àÚÚZ Á-ššš555o··?þøC¡z3t’üýýwìØÑãC‡å0 S¤ál#.—›žžÎår™-åååvvveeeo·Cœ„ø;þEQ8 «w–––iii‚[ÒÓÓ-,,Håx-i(à¹sç n ôòò"•൤a¥¡¡ÁÆÆfÅŠŸ|ò EQ‡:qâDZZÚ[_LëN€¿@á¯P…%èÞ 2$:::))ÉÐÐÐÐÐ0999** —²q†ßïz€_{€Â_ (J” äüýýE±_I7eÊÒ€0ü  €¢(‘ý5ÀïwHÃ1`‰ƒ  @ €0(`PÀ €@€  @ ø¿ }||†:tèPŸ¢¢"Ò‰€€û÷ï¯Y³FMMÃáÎdܽ{wáÂ…ÚÚÚªªª®®®W®\!Ø–°bÅ ###}}ýiÓ¦]ºtI诂þ Çsww···/(((((°··÷ððhjj" ضtéRØØXÒA€˜É“'WUU]¹r¥¬¬ìàÁƒþþþG% Xµ~ýz;;»°°0—‘‘±iÓ¦;wnß¾]¸¯‚»!ýeïÞ½)))§OŸf¶,Y²ÄÙÙyýúõSA¸¬Ìúâ‹/~øáf $==}þüù999dSY¹¹¹ŽŽŽµµµBÜ'fÀ¹v횟ŸŸà??¿Ry€”üQð„‰‰ H¼¼¼œœœp÷‰þKff¦à–±cÇ>zôˆT¡¡¡VVV¤S1uuuôiŸ|ò‰p÷ŒE¶¿(((466ÊËË3[ÚÛÛUTTZ[[ ¦‚° EÕÔÔ¸¹¹ýþûï'N$Ø&¸2}úôÐÐPáN‚1èYEE…··÷áÇѾ²‰ÏçóùüŠŠŠ³gÏfffîÚµK¸ûGÿE]]½¦¦FpKuuµ††©<@VIIÉÌ™3·mÛ6uêTÒY€$E‹>}Zè'ã€ÿbii™––&¸%==Ý‚T ¨´´ÔÓÓsÏž=¤³€Xptt¬¬¬î>QÀ™;wn`` à–ÀÀ@///Ry€”ÊÊÊY³fíÞ½ÛÝÝtqqqæææÂÝ' ø/+W®Œ‹‹ûî»ïjkkkkkwíÚE_ …t.`Û¬Y³¶lÙ2{ölÒA€˜™3g†„„TVV¶··—””œ8qâã?þþûï…û*8Ïó¿òóó7lØEQ”‡‡Ç¾}û I‡¶õxJü3‘)=þ¨­­USSc? qëÖ­_~ùåÎ;uuuÚÚÚnnn_|ñ…‹‹‹p_ @– @€  @ €0(`PÀ €@€  @ €0(`PÀ €@€  ÿµpáÂ/¿üRp˦M›,X@*€ãðù|Ò@\TWWÛÚÚ^»vÍÖÖ–¢¨ÔÔÔY³f¥§§s¹\ÒѤ fÀð_ššš‡Z¹regggggçÊ•+þùg´/€(` Ý-_¾ÜÊÊŠÏçß¾}ûúõë¤ãH'0tWQQáááQWWmjjJ:€tB@wëׯŸ:uêóçÏ>|xàÀÒq¤ŽÀÿˆŒŒÌÍÍõöö^±bŃ"##I'N˜ÀÕÖÖ:99ýñÇÆÆÆE=zôhîܹ)))êêꤣHÌ€à¿Ö¬YóÁÐíKQ”……Åâŋ׬YC6€T €Ì€@€  @ €0ÿ:LFú‚ÁIEND®B`‚gsl-2.7.1/doc/images/rand-erlang.png0000644016036000116100000005023013373111455014143 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœìÝg\WÛðY^U`A@@¥X@QÀ‚Š5TP1 FÑhìš[L¬(*F‰í±wTD{,¥)¢H¥Iïuß›wŸ}ÌJÝ3»{ý?äÇÌÎÎ\;î=gΜaq8 è%C:€4B €`P€@ €`P€@ €`P€@ €`P€@ €`P€@Ö4ýÚâQ| Øl¶££ãúõë³²²D‰·+á~LšO€è  GÒ¡þ7ReeeBB¯¿þZVVfmm}þüùVí„Έr ŒÅ´?bŠÅjõoSÞÒ3zôèû÷ï[ZZ¶g?BÜ^Xï`8´€èÀb±ªªª,XÀf³¶ê>|øðÃ?¨©©¯X±¢ººš÷Ɔ††M›6)((ôèÑcïÞ½üoŒ3fŒŠŠŠ––Öüùó+++[ÕjìׯßâÅ‹wîÜÉ;÷‡²²²+V˜™™)++khhŒ=úúõë¼ >ë`øéøcTVVΛ7OKKKEEeüøññññügFàéjâX¼Í®]»fgg§¢¢¢¢¢bggÊ¿‡¦Ïq(À4ùþûïÞ¿/°I7xðàþýûgggß»w/==}ýúõ¼—üüüªªª""" :´k×®³gÏr_JLL3fÌĉSRRâãã­¬¬æÎÛÚ`“'O~ðàÁg+½½½ëëë#""JJJRSSüñÇÀÀ@Š¢¸áÿÝÁÞô§›3gŽ……Åëׯ“““Ççää”’’Òl°/‹ëÙ³g³fÍZ¸paZZZjjê?üðÍ7ßDFFò6hâ¼0‚À«VÐZMÿŠQµsçοEà® »wïÎÛfÍš5ü¯†††4ˆûóŒ3¶lÙÂÿêÆ¿´Û/­¯ªªRRRúlUUÕ’’’î§éOGQÔ† ø_Z¿~ý7ß|ÓD*þ÷~é¥I“&íÛ·ÿ¥ÀÀ@WWWÞfMœ7&@ަ¿ÎR•ššú¥·TUU­_¿¾gÏžJJJܲ-++ËÛ&99™ÿ]………;väþÌf³SRRø_MNNnm®¨¨PVVþl›Î;7++«%ûiúÓýû#$%%uéÒ¥‰T-)ÀݺuËÈÈà)==ÝÐÐðKå?oL€.hštíÚõK/­ZµêÉ“'§OŸÎÏÏçp8UUU ¼WŒŒø7îØ±cQQ÷çOŸ>uéÒ…ÿÕÏ["--MOOﳕgΜÉÏÏ755577÷ññ á49ª‰OGQÔgû×ÓÓËÏÏÿÒÆ-HMåææêèèð¯a³Ù999¼Å&ΠÐDNNîK/?>88ØÚÚZEE…¢¨Ï®ÊÈ|ñ÷TKK+;;›Íg‹-qåÊ•áÇ¶ÒØØøòåËÅÅÅgΜ±··ß¼yóœ9sšØIŸŽ¢¨?~¶¨­­ÍýYSS³¸¸˜ÿÕÔÔÔ–Äf³Ùyyyükòòòtuuy‹Mœ7&À?Pòªªªy‹GŽi᜜Î;Ç¿æôéÓ­:tlll@@À’%K¾ª  Ð·o___ß°°0Þ&EEÅÚÚÚVåÔ©SŸ-Ž5Šûs=ž>}ÊÿêáÇy?7q,›k×®ñ¯¹zõªM«‚Ôt Æ¿hÑ¢íÛ·ËÈÈ?~<--­…o\·nݰaÃÔÕÕÝÜÜ(ŠºpáBBBB³ïjhh(--}óæÍ•+WŽ;dnnþÙ6Æ óõõ>|¸®®î§OŸ‡ Æ}ÉÄÄäÆ_ýµ¬¬l s&$$N›6¢¨sçÎí۷ﯿþâ¾´xñâ… >|˜;<88¸°°÷Æ&޵|ùrgggMMÍÑ£GSuûöíµk׆……µ0y¤/BHˆ¦Åþ®ñVxzzvêÔISSÓÇǧ¬¬¬…oäp8ÑÑÑ£FRRRêÔ©“¯¯o^^ž‚‚BÓ åååµµµ‡êïïÿÙ0+ÞžïÝ»çææÖ¹sgEEESSÓ•+Ws_ 333ãVÄ–„¤(ª¼¼üÛo¿íر£²²òرcãââø· 433“““300X¿~}}}=ï½Mëòå˶¶¶JJJJJJ¶¶¶Ü Õ-tww×ÖÖÖÐа³³»rå éDb ¸œ=zTZZJ:ŽŽŽùùùW®\ÉÎÎ ô÷÷&J\á°Môø;;;Ïœ9súôé4G`‚åË—oݺ•7õU\\œ««kRRÙT"…kÀLáêêzéÒ%Ò)Zû8ÂM›6)((ôèÑcïÞ½­ÝɶmÛø'ž455ÍÌÌjL)‚Ü:...ááá•••¤ƒ´šŸŸ_UUUDDDaaá¡C‡víÚuöìÙöì0,,ÌÊÊJXñ¤ pëhiiÙÚÚÞ¼y“t€Vc³Ù›7o655UQQqtt ܵkïÕÖ>¸°°põêÕ4~‰‚ÜjS¦L¹páé­6kÖ,þE{{ûÄÄDÞb«žœ››;yòä   ¡C‡¶äÐþþþüåÜßߟÎ;´Y„%@Ó—Ü?}údfföñãG%%%:S´÷°ŒŒÌg+ÛP>|ø0a„;v899 / CaƒhiiY[[ߺu‹t€Öù¬ú~¦…]Ð?~?~üÎ;¥¡úŠ p[L:õâÅ‹¤SSKº óòòÆ÷Ûo¿9’lZ €.hšípÈÍÍíÕ«Wvv¶¢¢"m©ÚCà_¶Öö¯ÚØØ¬X±BªæB@4³°ÙìÞ½{ß½{—tZEGG{xx|Ö;]\\L:—XBn#777ôB€ØŒkmÛN`ï´¦¦¦2JtA Ð’‡¬¬,kkëììì:Г è‡.hÆÑ××ïÞ½ûƒH±„ÜvS§N=wîé –Ð-@ ;233û÷ïÿáÃ999RýÐÍD¦¦¦ m€Ü.îîîí|–H'àv™:uêÕ«WkkkI Ã³gÏæÌ™cll,//¯§§7jÔ(ÜÙf(Àí¢§§gee…§€”X¸p¡µµõÍ›7ËËË_¿~½bÅŠM›6­[·Žt.±„AX´ê’û>|xêÔ)‘F`¦äää‘"*„Å\S¦L¹qãFyy9é Má>ŽpÓ¦MFFF =zôØ»woûw+'''++ÛþýH!àöÒÒÒrpp¸~ý:é Íðóó«ªªŠˆˆ(,,}ú™3gH§h›ÍÞ¼y³©©©ŠŠŠ££c``à®]»x¯¶ðyÀ¼-555ÕÔÔüýýéþ$X&Mštÿþý’’ÒAš2kÖ,þE{{ûÄÄDÞbKžÌ¿ennî©S§âãã7oÞÜì¡ýýýùë4©EFÁ ,ÚpÉÝÕÕuâĉÞÞÞ"ŠÐNÜkÀ222Ÿ­lg¸wïž··wFFFûÒ1a1fäæû¬ú~¦å]Ðü ——'‚°’X8¾þúë§OŸÐF-ï‚æ÷äÉ“^½zÑ™Sb  ‡²²ò˜1c._¾L:€;6$$$//¯®®îÇGŽùöÛo·lÙB:—XBwwwLÇ’mÕªUÇ·°°PVV¶µµ ½xñâøñãIçK„%@Û.¹×ÖÖvíÚ5::Z___©€~„%äåå'MštúôiÒA@   “§§çÉ“'I§1€,LÆ +,,|ýú5é Àt(ÀÂ$##ãééyâÄ ÒA€é0K€ö\rOHH=ztzz: 0Kl˜››³Ù쌆,|ß|óÍþóÒ)€ÑÐ-@;;rssÍÍÍ333UTT„˜ è‡.hqÂf³®\¹B:0 °Hxyy?~œt `.tA Ðþ‡êêj}}ý˜˜LK ÖÐ-fÝÜÜðlø`QA/44XT\WWE:0 °yxxà†`ƒ°Ö%÷ääd‡¬¬,99¹öï è‡AXbÉÄÄÄÌÌ,<<œt``Ñòòò:zô(éÀ8è‚@ˆ%%%FFFïß¿×ÒÒÊ€Nè‚W&L8}ú4é À,(À"çããL:0 °È1¢´´4&&†t``‘“‘‘ñññ9|ø0é À „%€Ð/¹geeõë×/33SIIIˆ»Qà ,ñ¦¯¯okk{ùòeÒA€)P€iòí·ßþù矤SS  ZQt8ÔÖÖvëÖíñãÇ&&&ÂÝ3ˆº Åž¼¼¼§§'fÅ.´€Ñ÷·oߎ=:--MVVVè;Q@ XôêÕK__Ïf ˜fß~û-fÅ ]Љ®Ã¡¼¼ÜÐÐðÕ«Wzzz¢Ø?º %„ªªê”)SŽ9B:†°¢û¾CQTll¬‹‹KJJ †b0ZÀ’£oß¾l6ûÖ­[¤ƒI(ÀÌ›7ï?þ HB´"킦(ª²²²[·n/_¾444ÝQ ýÐ-Q”••=<<ð€Bi†°¢nS•àä䔞ž.'''Ò@{ ,iÌÍÍMMM¯]»F:L̼yó´ º %‚‚ÂÌ™3ÿüóOÒA€´€ §LQÔû÷žž®  @ÃᠵЖLfffýúõ;wîé @7`¾ÿþû}ûö‘NtC&l„ ùùù‘‘‘¤ƒ­P€ “‘‘™?þÞ½{IZa–´ Ââ***211IHH`³Ù´Zƒ°$YÇŽ§L™L:Ð-`hnS?f̘´´4L À(hK8KKK33³Ë—/“4AfŠ ’N4AfŠI“&eee½|ù’t  0SÈÊÊúúúîß¿Ÿt a @ÿ ,®üüüž={¾ÿ¾sçÎôþ ƒ°¤‚¶¶¶««ëH‘C XR-`êÿïGJMM•——'ø¡,-,--­¬¬Îœ9C:ˆ 0ã,^¼x×®]¤S€h¡3ÎØ±cëêê"""HBf‹µtéÒíÛ·“"„AX„ÅU[[kllÚ¯_?‚1ƒ°¤‹¼¼ü‚ HQA Xâ-`êÿ§¯¯O6 €4C XêtìØqæÌ™AAA¤ƒ€Hoê1ZÀE¥¦¦4(55UEE…t)…°4266:tè‘#GHácDSiÒ¦(*22rÚ´iïß¿ïСé,Ò-`)ekkkddtöìYÒA@ÈP€™nåÊ•[·neH‹„˜éÆŽ+##sãÆ ÒA@˜P€™ŽÅb­\¹rÓ¦M¤ƒ€0¡‹©S§é,˜VbT€)ŠZ¹reiiiPPé ˜VâU€‹‹‹{ôèñðáÃ^½z‘Î i0 ¾HSSsÑ¢Eëׯ'ZAœšz´¯0EQ=zô¸~ýºµµ5é,-`hŠŠŠÊÊ•+×­[G:´”˜5õè!v-`Š¢jkk{õêuêÔ);;;ÒY$ZÀÐ yyùŸ~úiÍš5¤ƒ@‹ KŽY³feddDDDÍC–rrr[¶lY¶lYcc#é,ÐŒf paaá¾}ûÜÜÜŒUTTTTTŒÝÜÜöíÛWXXHODh¹É“'«¨¨œ:uŠthÆ pVVÖܹsõôôN:5|øðÐÐÐììììììÐÐPGGÇ“'OêééÍ™3'++‹Î¸Ð4‹µmÛ¶5kÖTWW“ÎMùâà.%%%ccã;wŽ7NàaaaK—.MMM­ªªeBÄq4?777{{ûeË–‘ öLE9kÖ¬ýû÷+++7ñæÊÊJ??¿£GŠ"Aâ^€‡ ’йsgÒYÄ悦•¸`Š¢üüü”••·oßN:€xC¦•༼|øð‘#GöîÝûþýû¢®¾ååå#GŽ´±±IOOOOO·±±qrrª¬¬lâ-œÿ%ÒxâÂËË«±±ñôéÓ¤ƒÀçZ1%‹ÅÒÐÐÐÒÒ¢¡9uèÐ!;;»Õ«WwìØ±cÇŽ«W¯8p`pp°¨+aX,V@@ÀªU«***Hg€ÿÑ¢=hРøøø;wîÜ»wo„ ÉÉÉ"uíÚ5///þ5^^^!!!"=¨D²··2dȶmÛH€ÿÑ|×öÊ•+O:äììÌ]1þ|OOÏõë׋(›ÍŽ‹‹c³Ù¼5999ÖÖÖÙÙÙ·g±Xl6»  @KKkäÈ‘kÖ¬éÕ«W›.1×€¹²²²¬­­_¼xahhH: €˜!y 8---&&†W})Š5jTdddbb¢(quêÔ‰MçΛxüƒ‹‹ËùóçËÊÊ"##mmmcbbDO¼èëëûùù­ZµŠtø/†6õäåå+**äääxkêêêTUUkjjZòö   ›7o6½™¿¿ÿ—ñÌ<-mVUUeiiyøðááǓΠN¤n&¬ÖvA&77×ÄĤ¼¼¼mG—°.h®‹/®[·.::šÿk 4@´OÓ·ýPUYYéãã#ìHEQ–––±±±ükâââ,,,ZøvÉ+Ÿíçææ¦§§D:PTøÌ™3¶¶¶_ÚàöíÛ¶¶¶gΜE,ggçãÇó¯9~ü¸‹‹K ß~îܹÁƒ‹ —xÛ½{÷æÍ›óóóI€/àÄÄÄAƒM˜0ÁÑÑ1((èíÛ·eeeeee û÷ï:tè×_mgg'¢¡XsçÎ}òäɯ¿þZTTTTT´yóægϞ͙3‡·ÿ½ÈNNN.\ÈÉÉ©««KMMýõ×_7nܸeËQkæææ3gÎüå—_H€æ®çççŸ:uêÞ½{ÑÑÑÜ–“ŽŽw^ªéÓ§‹ôq³iii‹/¾sçEQNNNüwÑðwÊß½{wïÞ½>,))a³Ù#GŽ\½zuÏž=Û|h‰¼ÌURRbnnbkkK: €ºAXdIp¦(êØ±cÿý·¬¬,é,LGx.h$^^^ªªª˜×€¬त$///===999===//¯””Q'a±X{öìY»ví¿ó ´i¾¿zõjÈ!fff=*--}ôè‘©©©ƒƒC||< ù@úôéãíí½téRÒA¤Wó]ÛãÆ›0a‚ øWîÞ½ûæÍ›aaa¢ÌFŒd_檨¨°²²:tèШQ£Hg`.’ƒ°TTTRRRø'¥¢(*''ÇÄÄDRr' ˜¢¨ÐÐÐ¥K—ÆÆÆ*((ÎÀP$a}鯳’’’°Ã­&L˜`aa±}ûvÒA¤QóØÕÕõܹsŸ­<{ö¬›››h"}vïÞššJ:€Ôi¾e]QQáëëknn>cÆ ==½?ž}úìÝ»wüøñ¤³0 0­¤¶Suÿþ}//¯¸¸8MMMÒYÈC¦•4`Š¢.\XZZzôèQÒAÈC¦•”àŠŠŠ~ýúíØ±ÃÅÅ…tÂP€i%嘢¨'Ož¸¹¹ÅÄÄ|ö,iƒL+`Š¢V®\™””„;ƒ@ÊaΜ…ê IDAT&, Û† O:E:€dBSO´€¹¢££¿úê«èèh]]]ÒYÈ@4­P€yV¯^åÊÒAÈ@4áïïŸ}ðàAÒA$ šz ÌïÝ»wC‡}øða¯^½Hg ZÀ@LÏž=·lÙâááQSSC: €ä@SO´€ÿÍÓÓSKKk÷îݤƒÐ ƒ°h…üo%%%ÖÖÖ{öìqvv&€>(À´BèñãÇS¦LÁ]I UP€i…ü%k×®}ñâEhh(‹Å"€„Œ°víÚ’’’íÛ·“ öÐÔ-à&ddd 8ðòåËööö¤³ˆZÀÀݺu öðð((( @Œ¡©'ZÀÍZ¹rå«W¯®_¿.#ƒïp ÉÐfÙ¼ysyyùï¿ÿN:€¸BSO´€[âÇ ¸páÂàÁƒIg´€qºvízèÐ!OOO\ h4õ@ ¸åV­ZõòåË›7oÊÊÊ’Î |˜ˆƒV(À-רØèììleeµuëVÒY„]ÐÀP222'Ož¼téÒÙ³gIg'hê €°@µµµ ©©©¹¹¹yyyššš ,à¾;zôè;wîôîÝ;11qݺuêêêZZZ:::=zô?~<Ùäm&ºŠÐA;‰ôîÝ;OOO]]ÝÎ;ó^êÛ·ïîÝ»]]]###;vìèââRZZZPP––VQQ!°ççç§¥¥™››«ªªÒø!˜M=¤¶ÜØØýòåK__ß6¼}É’%ñññ7nÜhÉ€¬'Ož,\¸ðíÛ·FFFýû÷wuu8qb R¸ ¢uëÖ-//¯×¯_744´a'[·n­­­õ÷÷oÉÆ/^¼(..>yòäСCÛp8±&¥M½¦Ia xîܹVVVnnnúúúíÙOAAÁ Aƒ6mÚ4}út¡»sç‡Ã€° K¾™3g¾{÷îùóçAAAô”Åb:t(==ý×_õ±TTTúõë·iÓ¦®]»þøã¯_¿õÚOûZÛOº kkkååå‰:??ðàÁ¿üò‹—— ‡KII9vìX—.]æÏŸOÃá@à0­$¬“•0bĈ'NŒ5Št€VÃ5`WæææçÏŸ÷ôôŒ‹‹#›$..ß«€9P€%Jnn.é :4 ÀÅÅåãǤ2ÔÖÖz{{›››’ŠÀƒ,!ª««}||æÎK:ˆ`¾¾¾ÎÎÎåååDÈËËGGG>|øåË—&&&«V­"€;»kÀ®®®=zôVVV&ç‹|}}333¯^½*''G0FaaaRRÒÀ fqAX´¯üìÙ3WW×¥K—.]º”t–f444LŸ>]NNîĉ22è}1€L+ñ*À™™™‰‰‰NNN¤ƒ´Hmm­³³³©©éþýûIgàÑ£GvvvdèÀ((À´¯,vJKKGŽéììÜÂÒ¦¾¾~ܸq ¾¾¾¾¾¾]ºt!ÈÃmH 9ÔÕÕoܸqúôé={öÎò?:tèž——geeµlÙ2Ò‰@’¡©'ZÀ4ÈÈÈ6lغuë|||Hg ¤¤äýû÷ C4­P€éñþýû#FìÚµkêÔ©¤³†.h (Šjhh¨­­%D8ÌÌÌÂÂÂ.\xãÆ ÒYZáÓ§O¤#€$@³gϾqãFCCé,BÓ»wïzžRÜ~eeeVVVOŸ>%Ä °ØX¸paZZZHHˆ’’é,Â4pàÀK—.yzz>xð€t–æ©©©%&&ÚÙÙyyyÙÛÛߺu‹t"W¸Ø)¯ûûû‡††Þ¹sG]]t‘¸ÿ¾»»ûåË—Hgi‘ÆÆÆšššéÓ§“Î"„AX´b`¾r劃ƒƒŽŽé "tûöí™3g^½zuРA¤³ü˜V ,ÀR"<<ÜËËëÊ•+vvv¤³PFAƒ”3fÌ‘#G&Nœø÷ß“ÎÒv©©©îîî‘‘‘¤ƒ£¡³Œ?þÈ‘#...Ïž=#¥ttt† âîî>|øðÐÐPô¦€@èk]ÐÄ………Íš5ëÌ™3#FŒ ¥êëë/\¸ðûï¿Ï›7oþüù¤ã@á0­P€™àÁƒÓ¦M;räÈW_}E:KÛq8œúúz<^ @|¡ÓŠx>~ü¸ŒŒÌÌ™3 f`‚çÏŸ»¸¸Mž<™tR„%E¢££—/_Þ¿ÒAÈ8p`XXØ÷ßêÔ)ÒY„,;;ûýû÷¤SI(ÀÌRVVæîî¾gÏsssÒYÁÚÚ:""båÊ•üñé,mWWWWXXÈ¿&66vÈ!nnnÏŸ?ÿl㪪ªììlÓ(ÀÌ2þü‘#Gº»»“ <ضmÛ¦M›Hgù¢´´´³gÏòŸ={öÃ?ð=zôý÷ßóÃÂÂöìÙ“šš:bĈiÓ¦õë×oøðáüï]³f o1<<ÜÛÛ›·µwï^Þâ§OŸÞ½{'ìO´àÀ¿:-õõõ¿ýö[ee%‘£3\vvv¿~ý,XÐÐÐ@$@QQÑÇy‹Ïž=9r$o1%%åÀ¼ÅÒÒÒwïÞµd·µµµ'Ož,,,üÒ555¼ÅŒŒŒððpÞâƒV­ZÅ[¼}ûö† x‹999)))-‰_"ºŠ€AX„•””Lœ8QOOïèÑ£òòò¢>\AAÁñãÇ/^Ì]LKKÛ±cG`` w±¡¡¡¾¾^AAAÔ1Z%?????ß‚»¹víZîâ_ý•››ëææF. €øÁ ,JCCãæÍ›555_}õUii©Ð÷_QQ±hÑ"Þ¢¢¢¢ŒÌAŒŒŒxÕ—¢(YYY¦U_Š¢´µµyÕ—¢¨ñãÇóª/EQjjj:uâ-8p`×®]¼ÅÒÒR‰yÔ4€X@q¢¨¨xîÜ9ssó¡C‡feeµsogéÒ¥uuuÜEeee+++ÞW]•ü±‡h_~ùÅ××÷íÛ·ÂÚaß¾}ù'6™>}úŒ3x‹{÷î忺üöí[Œ)`3²²²^^^QQQ­}ûùóç‹ŠŠ¸?³X,KKK^³ÅbÍ™3‡Åb 3n;,^¼ØÀÀ`øðá“'OÅäØšššl6›·øóÏ?/Y²„·xóæMþé¬?~Üþo<ÀÄÒÒ¥KwïÞ=~üø°°°¦·¬­­­¬¬ä-¦¤¤ógÏž­¢¢"ª”íÓ¹sç5kÖ¤¤¤899Í;W½îMX´h‘‹‹ oñï¿ÿæo_½z5''‡Î<’£ sVAAAçÎé9–äyöìÙäÉ“7nÜ8gΜ/mãçç7lذéÓ§ÓLâýþûïÓ¦M366æ.ž8qÂÙÙYSS“l*QÀ ,É”˜˜Ø§OŸŠŠ ÒAĕݣG¶mÛ¶jÕªÆÆFîʇ=z”·Í¾}ûP}…nåÊ•¼êKQTBB×ýñãÇ1ž  Y(À$ýðÃ+V¬`l¨X055}úôéÓ§O'NœXRRBQ”®®®™™oæ\Ó…Ë—/§¤¤NAmÞ¼YCCƒûsCCÃßÿÝ¡CÞâÅ‹ÉE`.`bÎ;—ŸŸÏ?A´MEEEAA±±ñ Aƒ’’’zôè1xð`Ò¡hòîÝ;;;»3fÄÄÄÎòYYÙ}ûöñîà*))¹sçïÕŠŠŠ—/_ŠÀ,¸, ×€KKK---Ïž=ëàà ÒIªØÛÛó¦ã¨©©QPP^³fÍÙ³g‡ F6ÊÊÊ<¸{÷n›+W®ŽÓŒ„„„€€ÞÌÞååå ¼Ö3áq„´¢¡×ÖÖ†‡‡;;;‹ô(lþüù+V¬èÞ½ûgëïܹãéé¹fÍiëZ¨««‹ŽŽ8p é ­sãÆ+W®}x‹û÷ïOKK# @4P€¡äåå“““ëëëÛ¼‡ùóç_ºtiþüùëÖ­ãÝ%,mdeecbbÆŒóÃ?ôéÓçøñ㤵B=tuuy‹***ü×|èÚµ+ ºsçÎ7ß|óý÷ßÿôÓOüúÉÐÐÐ ++ËýùåË—Gå~3@›¡,öÞ¿òäÉÑ£G“Â,………ÎÎÎ 4ËÉÉéÅ‹·oß=zô‡h8¢¸¨¨¨°±±Ù±cǧOŸHgi;^õ¥(ªGóæÍã-¾xñâÖ­[$B4˜&¿üòË’%K´´´Ha–N:EEEñÿé)==½{÷¸X[[Ÿ>}šžƒ2ŸŠŠJPPЫW¯ÌÌ̼½½£££I'j/555+++Þb}}=ÿh¾”””ÂÂB¹þº z‡CddääÉ“1H„¢¨ƒVUUñßîI¿ÈÈHOOOGGÇ]»v©ªªLÂ(EEEÁÁÁ•••ëÖ­#E„¶nÝjll~üø—_~!˜HÁ5`pRÓRRRºwïN:Iµµµ{öìùý÷ß½¼¼Ö®]‹yƒ[+!!áèÑ£§NêÞ½ûƒHÇa–ßÿ]IIiáÂ…¤ƒÀ?p0­P€ÿ­¬¬LRÛôm–——·fÍšk×®mܸqÖ¬Y´=ÕXb466&''KÀãÂUUUUUUÅZñçŸZ[[ÛØØM%Í0 Hªªª²³³«¨¨ „Ytttþøãk×®?~¼o߾ׯ_'HÌÈÈÈ úþ›’’ÿÀÆ®]»ò?»óîÝ»¸1]b ©'ZÀÿV]]­¨¨H:s]¿~}ÕªU;wÞ¾};&Ïj¿µk×VUUÍœ9³oß¾¤³0Ë‚ ~úé'===îbqq1ñGkK<´€þi}P}›æììëíí=yòdOOϤ¤$҉쇇‡¢¢â¤I“úöí»uëÖ²²2Ò‰˜"00W}ëêêúôéƒûâÄ 0öéÓ§)S¦HÛí"í!++;{öìwïÞ™››ÛÛÛÏ;W:ÇŠ …¹¹ùÆSRRöìÙ“––&=óK·Šœœ\FFïö⌌ ²‘ UÐ×*@Û:Ž=êââ"I³Rp8ÞLÐ*EEE;vì8pàÀŒ3V¯^Íf³I'ÉW[[›’’Ò«W/îb||ü³gϾýö[²©$º ™îÇË–-“——'¤]8ÿ£pQ}Û¬cÇŽ›6mzûöm‡,--W¬X‘››K:”¤‰‹‹;|øpAAé L!//Ï«¾E)((hkkóð k¦AŽƒzxx¨ªª’Ò.YYY¿üò :E„EKKkçÎ111555Ë–-ËÏÏ'JrÔ××ߺuËÄÄ䫯¾úÏþƒëÄŸ155åï‘NJJzõêo1''§ººšD.ø/tA ÐÚ‡ºº:##£Û·o[XXˆ.ˆµ?þú믧OŸž3gÎÒ¥KuttH'’W¯^=}úôŒ3¦OŸN:ŽØX½zµ¹¹ùÌ™3¹‹¸ÞÔLÄA«ÖžîóçÏݽ{Wt‘D§±±1&&·ùÓ#33ó÷ß?}úôÔ©SW¬X!åŠsŒ7nýúõƒ "„‰p ˜Ñœœœ‚‚‚H§h£ÌÌÌ-[¶à{= öîÝûöí[6›=hÐ //¯øøxÒ¡$ÜÁƒ1½Y.\°¶¶æ-zxxàù4@‚N:õìÙ“tŠ6244<þoÞ<îb~~¾¦¦fÓ%˜VâX€Z®±±ñÉ“'!!!—/_æp8®®®_}õÕ!CZÛ2‘zûöíáÇlooÏkÏAû544ðfäõóó7nœ‹‹ wñíÛ·ŸÝ`†QÐ ÀW_}•””D:ˆ™!C†lÛ¶-))éÒ¥Kªªª?ýô“¶¶¶««ë¡C‡0|š!TTTÔÔÔþøã^½znݺ•t" Á?þþýûyÕ—¢¨€€€„„ÞbXXXQQ‘è’ ©'À—¾ïTWW§§§óOÝBVRR’©©)é !>}ú~ýúõððpƒqãÆ?ÞÁÁƒû˜ ))©¦¦ÆÒÒ’té²bÅŠ…   š>_*À.\øã?nß¾M$Ú444<þüÆ7oÞLNNvrr3fŒ““S÷îÝIGÖ¬Ys÷îÝ 0ÀÖÖ¶GÏ%\¸L«/îÉ“'Oœ8qÖ¬Y´'ú¯Y³f-_¾_„yyy7oÞ¼}ûö;wF5nܸ‘#GvìØ‘t4øGiiiTTÔË—/_¼xñâÅ‹7NŸ>t(‰‚L+§»´´´[·nd'ÀЉ‰±²²B¯ Ð/!!!""",,쯿þ222>|øˆ#;uêD:4/<<\[[ÛÂÂBAAt1ƒL+§ûĉ.\¸rå ‘HÌQ__}ÿþý{÷î=~üØÄÄdèСÆ >|xçÎI§Á–/_~ëÖ­¤¤$###›€€---Ò¡Ä 0­žî%%¥1cÆÐŸç矞6mîת««{ñâÅ_ýuÿþý¿þúËÀÀÀÁÁaÈ!C† Á5cª««{óæMTTÔŒ36…kkkåååéÆd(À´bÚ}À?îÓ§ššé M©¯¯‹‹{üøñ_ýõø}D5IDATñãÆÆF{{û!C†888ØØØà&c櫪ªÒÖÖÖ××ïÝ»wïÞ½­¬¬\]]I‡"˜VL+Àâ(==ýñãÇOž},,, Hg„æÕÕÕ¥¥¥½ÿ>))éýû÷½{÷öõõý÷f%%%:tøìùŒ‚L+Røñãǽ{÷&;ÑÓ”——¿yó&..îÍ›7¯^½Š¯ªªâŽÑµ²²²°°èÝ»7î?_{÷î]¾|yÇŽŒŒ ½½½ÇG:Ôÿ@¦ÿé>uêTttô¶mÛÈFž‚‚‚¸¸¸øøø×¯_¿~ý:>>^VV¶gÏžVVV½zõ233333ëÞ½;n|çãÇiiiiii={öØSññãGccc}}ý®]»Òy³2 0­øO·›››‹‹‹···ˆŽ5sæÌŸ~ú s;´G^^ÞÛ·oß¼yóæÍn‡gVVV÷îÝ-,,¸× {ôèaffÆf³I'…6âND˜žžž™™™}øðaOOOzL+Þ鮬¬ÔÓÓKIIÝl·¯^½²°°À᪭­}ûömBBBRRRbbbbb"÷‰~Üzlfffbb¢¯¯obbÒ­[7L®.^ëëë6‚===Ÿ?®¯¯ß­[7CCC//¯ö?³˜V¼Ó}éÒ¥„‡‡ wÿ˜ì €ˆââbÄÄÄ´´´ŒŒŒäääÜÜ\CCCSSScccSSSCCÃnݺá&@qT]]ùÿÒÓÓ§OŸÞ£GoTZZª««Ëf³ ÌÌÌšø›,ºŒï}Mùûï¿…>[CCƒ­­mDD~½h¦©©ikkkkkË¿²¦¦&)))55533399ùéÓ§Ü~ÎŠŠ ###SSSccãnݺèëëêêê¢Ëб¹ƒšÞ¬cÇŽ©©©oÞ¼ÉÍÍÍÌÌ<~üxÿþýÿ½Ydd¤H…°üßw8‹ÅîþKJJ444„»O®ÊÊÊ”””¤¤¤ôôôôôô¬¬¬¬¬¬ôôôOŸ>±Ùl^+YWW×ÀÀÀÐÐÐÀÀ k×®èÍ–$ß~ûmddä«W¯ÐM¡w8466FEE‰éMèÀ¯®®îãÇéééùùù999Üœ‘‘‘››«­­­­­ÝµkW}}ý.]ºp+´ŽŽN·nݺté‚Ùâ×€i%ôÓíççwéÒ%¡7¦€9êëësrròòò>~ü˜™™Éý9'''???===''GCCCGGGKKËÐаk×®l6›[°uuu¹? B3 0­0%ˆBþÿËÈÈÈÊÊÊÍÍýôéSnnnnn.w½¦¦¦ŽŽŽ¶¶6›ÍîØ±#·`óÖèè訫«c®š¡ÓJ(§;$$$55uÑ¢EB‰Ãá|úô)??ÿÓ§O999ÅÅÅEEEyyyÜÚÌmI—––rŸÚÛ¹sg Î;kiiuêÔI]]ÍfwêÔISS“Û˜ÖÐÐ`òüŽb˜VB9ÝYYYµµµÝ»wJ$®ºººüüü‚‚‚’’’‚‚‚üüü¢¢¢’’^ÍæVñ’’’šš MMM mmm---uuuÞncš÷·Á-##Cúó1 p3222/^|ûömŠ¢FОéÚÛvº9Npp°··7îñ&¨¯¯/ùÜftiiiiiiQQQiiiII ï¿¥¥¥ÅÅÅÅÅÅ***¼ÂÌ¥¢¢"//Ï[TWWWSSSSS“““ã•s%%%%%%ÒWTppSÊËËGŽéããLQÔþýûœœbbb”••Û¼Ï#GŽøøø´ê-,‹û TGG§ÍÇ–:tîܹUOª(++ãÖcnÙ.---//¯««+...))ÉÎÎ.---+++//¯­­å•󪪪êêjõÿ§¤¤¤ªªª¬¬¬ªªª¡¡!++«©©©©©Éb±455ÕÕÕ;tè ªª*''ÇÝ@AAAQQ‘[ÅEwB˜FZÀ»vízùòå‰'xkfΜ9pàÀ… ¶m‡,ËÍÍíÂ… Ín_ZZjooß¶H ^{ºººº¬¬¬²²²¢¢¢¤¤„Û/**¢(ŠÛønhh(++«¯¯/+++))©­­å–ðÊÊJ‡£¢¢¢  ÀmAuìØ‘×Ô¦(ŠÛIέÖ:tPSS£(Š[Ú•••:tèÀm©s·á–|Š¢¸õ¾mŸ -à¦\»vmÕªUük¼¼¼~ÿý÷6`Š¢¾þúë–l–]PP€ ”Ú555•••Üÿr8œââb^S›¢¨’’’ÆÆFnµ®««ãõÔÔT‡Ã}W]]ïK@UUwEqÛñÜCpK5·Æó*´ššZ‡¸MðOŸ>=yò¤¦¦FNNNà YÂ" -`6›Çÿœ“œœkkëììì6ì­¶¶VAA!''GàƒSÒÓÓ×­[wôèÑ6§‚***jkk?«ÐÜ9·´«©© :TEE¥ªª*22ÒÑу°¾H^^¾¢¢‚¿{¡®®NUUµ¦¦¦ { ;v,ï´ÔÖÖ.[¶lÏž=¼Å/^888´?60Ÿg†àˆ?99¹ÚÚZþ5ÜÇ 5ûÆuë։䜀Qñ’„°p» )Ì„Õ&8imƒóÖ68om€“Ö6¢;o’pϵ¥¥ell,ÿš¸¸8 Ryš% ØÙÙùøñãükŽ?îââB*@³$¡G¢¬¬¬oß¾sæÌùî»ï(ŠÚ¿ÿ‘#GbccÛ<*:jÚ'­mpÞÚç­ pÒÚ]ÐMQSS»{÷ndd¤¡¡¡¡¡á‹/îܹƒYÈ€Éð…H|Olœ´¶Áykœ·6ÀIkÑ7YQìWÜ >œtñƒ“Ö68omƒóÖ8im#¢ó†/DHÂ5`±ƒ @ 0(À € @ 0(À € @ 0(Àÿ•‘‘áææ¦®®®®®îææ–™™I:‘xˆŠŠòóóÓÔÔd±X¤³ˆ‡‡º»»kkkkhhØÙÙ]¹r…t"ñðìÙ³9sæËËËëéé5êâÅ‹¤C‰™œœ333üª¶ë_„~à”——9ÒÆÆ&=====ÝÆÆÆÉÉ©²²’t.1ðÍ7ßèèè<~ü˜t±áè蘟ŸåÊ•ìììÀÀ@ÿàà`Ò¡ÄÀÂ… ­­­oÞ¼Y^^þúõë+VlÚ´iݺu¤s‰ ‡ãíí½aÃÒAÄç }ÿxÒ?víÚõòåË'NðÖÌœ9sàÀ .$˜J¼ài£-´|ùò­[·ò¾PÇÅŹºº&%%‘M%Ž’““ PTTD:ˆxعsgLLÌñãÇñ«Ú4œ%´€ÿqíÚ5///þ5^^^!!!¤ò€Û¶mw–©©)®w´œœœ¬¬,éâ!&&æÐ¡Cûöí#þ øñññ}ûöå_Ó§OŸ7oÞÊÒ#,,ÌÊÊŠt 1SRR½”þÝwß‘Î"ªªª¼¼¼Ž9¢¦¦F:‹8ÑÕÕ•““ëÒ¥‹§§çÛ·o…¾àuêÔ‰MçÎ Iå)QXX¸zõꀀÒAÄw8Œ¦¦¦£££ššš¿¿?éDb`É’%S§Nµ³³#Dœ¸¸¸œ?¾¬¬,22ÒÖÖÖÑÑ1&&F¸‡À•€ÈËËWTTÈÉÉñÖÔÕÕ©ªªÖÔÔL%^pa©µrss§M›æïï?bÄÒYÄL^^Þ;w–-[6oÞ¼µk×’ŽÃh!!!;vì¸wﯻ¿ªmróæÍÿkßþ]ÙÂ0ŽÏý•),T¢(Ñ"EÐʈAA L“B°P [6‘`i‘FÐFP!?ÔÂ.¨#ØEDÔ8AF¬!·X1®»{÷Þ»q_göû)Oqæ!3‡'gSÁ9¹ /TU5 CUÕבûû{¯×›ÉdSÙ «ú?¹½½ ‡Ãº®Kg±«d2911q}}-äSknnŽÇã ¯#,ÕÿÁ4M—Ëõüü\Á9yý¢½½ýìììíˆan·[*œíîîn```yy™öýÙlV:Åg—N§ß}ÏúA¶:ØGüe¡€_øýþh4úv$ Iåƒe³YŸÏ·´´¤išt{;>>nkk“NñÙ•¾ñ:(ÍN677{{{+<é·÷æÏôôôÔÔÔ …r¹\.—[\\üò¶A:—ð8ýK^¯wccC:…ýô÷÷ooo›¦Y(nnnÖ××ëëë÷öö¤sÙKõ§4MÛÚÚÊd2…Báòò2 ÕÖÖ¦R©Ê^…“€²«««™™™x<®(Š®ë+++oOMð#ß}‘Åsõ¾û‹åóùªªªßÆF’Éd$9<<´,«®®®§§gvv¶»»[:—ýpüS‰D"‰Y–¥ªª¦i ­­­•½ ·œ €@ € 0(`PÀ €@ €@ € 0(`PÀ €@ €@ € @ÙèèèüüüÛ‘¹¹¹‘‘©<€ƒýU*•¤3ø,=ÏÎÎŽÇãQåääÄç󆡪ªt4ÀiØ(«©©Y[[ Åb±X,p8Lû0€÷&'';::J¥ÒÁÁÁîî®tÀ™(`©ëºeY‰D¢¥¥E:àL0€÷¦§§ûúúÎÏÏWWW¥ãÎÄ0€¯Äb±t:=<<<55uzz‹Å¤ÎÄ@Y>ŸïêêÚßßw¹\Š¢\\\øýþT*U]]- pvÀÊ‚Áàøøø—öUÅívƒAÙT€#±@;`PÀ €@ €@ €€¿T“žtn\]'IEND®B`‚gsl-2.7.1/doc/images/rand-exponential.png0000644016036000116100000004136413373111455015231 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœíÝy@Mùãÿñ›-„d)RÒ&¥b†J£0ö}‰l3ÃðÁXæÃ,Ì`ŒYf,ÃØ1d;=’6K´RB‘*õûãίO_®¤î=ï»<åÜ{ÏyuJ¯û~ŸsÏÑ+((i•]D  €0PÀ@  €0PÀ@  €0PÀ@  €0PÀ@  €0PÀ@ÿÒ{ ѹ”¦$ßËÛžS¸7ôõõMLL:tè0gΜÄÄÄ÷] ®J¹û_›~šÐ0ð?ŠˆUJJ/ùÞÈÊÊŠŠŠš?þóçÏ[¶l¹sçN±©Ôd[@)èiîß@¹ôô´ê¿Cé¾·½Jáòëׯ{{{Ÿ:uªY³f*JU–Š–ý@¡}%2`À€3f]2}úô¾}ûÊ¿ÖÓÓËÊÊúä“OêÔ©c``àëëQôÉûöísss300000pss;pà@áCzzz¯^½š;wn£Fôõõ7n¼|ùò¢¯=}útëÖ­+W®Ü¨Q£uëÖ•ä…òÁßk³èEG„÷ïßÿüóÏ«W¯nii9}úô/^”bŸ899MžúòåKCCCù‘WùÇråþÏ …aôõõsrrŠ>T®\¹W¯^½ó…o~;…K&MštóæÍ~ø¡qãÆ/^¼b‹Ù o[Ù£G;wî}NLLÌ”)S‚‚‚5jäææÖ³gÏîÝ»”}3UNNNÅŠßö]³cß\[~~¾üÍDñ{ ,?@Y8 xóæÍûþûï¿ù曀€€×zðàÁkÿ¬[·®ük“”””¢¦¤¤Ô«W¯ðŸ¯ý­/ªF<(ú®YÞ¾ï|a1vîܹvíÚ–-[Èd²{÷î•b%r{öì騱ãk ---wïÞýôéÓíÛ··iÓfÞ¼y£G.f%¯µïkŠÙ±5kÖ|úôiÑGcbbJ»,?@Yø%JêØ±cwïÞíÕ«×èÑ£¯_¿~ìØ±¢nݺõµvêÔIþµ³³ó¾}ûŠ>ºwï^ggç’lÔÃÃ#00°i+W®üÚйÐkcÊõë×—bý2™,44tÉ’%S¦LQø¨¾¾¾££ãرc:´cÇŽw¦z›bvlãÆ/\¸PôÑßÿ½ðëb¶U–Ÿ 4Muj¯øÿ©©©ÖÖÖÑÑÑòFDDXZZ¦¦¦¾vðàÁË–-KNNNNN^¶l™‰‰É;wäž;wÎÈÈH~ÎmJJÊ–-[jÕªuéÒ¥b¶[¸0<<¼~ýú6lxüøqFFƱcÇŠž„UÌ ›5k¶{÷î¼¼¼7|øÓO?É?LUüN(\ž———ššúÏ?ÿL:µnݺýõ×›Ïiß¾ý¦M›rss“’’fΜéëëûÎT 7WüŽÝ¶m›Í™3g233£££¿üò˱cÇ–d”å'( ¿RÀ¿Š“:pàÀo¾ù¦èógÍš5pàÀÂ×fddŒ5ÊÈȨjÕª;w¾qãFÑ'ïÞ½»U«VUªT©R¥J«V­‹nWa˜Â¯CBB|}}«W¯^¥JcÇŽ•ä…‡²µµ-_¾ü›åúäÉ“!C†ÔªU«fÍšþþþÏŸ?/IËUªT©nݺíÛ·Ÿ={ök§Y¾öäÉ“}úô©]»våÊ•mllf̘ñôéÓw¦R¸ªwîØ€€[[ÛŠ+š››Ï™3'//¯${  l?@)8­PÎÐð¾8 €00o€Œ€€@ (` €€@ (` €€@ (` €@K øÚµkãÆ«Y³¦žžžè,¼›–ð°aÃŒÏ;':%¢m÷ÖÓÓ¶ï •´d €f¡€€@„íò^ßÑ·ß~«pŸT¨PAÚ@}©¨°´í”¥²Ÿ„õôéS##£{÷îYZZ*+@C©îÜ^¦ _W³fM™L¶páBÑAÚŒ°â•Ô®];$$ÄÜÜ\)©Š°ÔFõÓO?‰NÐZZ2VxÊRkzzzÉÉÉM›6 355-[4€cü O0+Ë MLL†ºdÉe% (-+—üýNbb¢““STTTݺuE'ˆÁX33³þüóÏ¢ƒ´#` ßï$%%µhÑ"<<ÜÄÄDt(€ªSÀ ÝÝ“&M*W®ÜâÅ‹ÅFAKªèîNNNvpp «_¿¾ØT ®]»¶víÚ­[·>{öL„cÀÂÔ«WoĈ ,Ô°aÃŒÏ;':ˆÆc¬Àkïw?~loobff&0¨Õ Õ #`‘êÔ©3jÔ(Á4šÂ )\ièÄû—÷õæû'Ož4iÒ„A0Í¥p$W–á#à2b\"µk×5jÔ?þ(:¨Š^±D§ÓBpIM:uÛ¶m ¢ƒ€J÷ø2®|öìÙżJÍž=[{HÉtbá}é½eÂá¿ÿýoZZÚ¯¿þ*}$(#…ÙÞöç®Ô+Ô>ªû6ub÷½¯·íî§OŸ6nÜøâÅ‹VVVÒ§€²xó/[NN޾¾~áB½b癕[ÞDuß&SÐï¡fÍšãÇÿî»ïD€ÒˆŽŽ.úÏ+W®ý§J§ ñ& øýLž<9(((22RtxoÇ¿téRVVVZZÚÁƒýýýe2Yrr²è\:J'&ÞWñ‹-:þü®]»¤Œe¤§§÷믿ÈÇÁvvvŸþùþýû¯\¹òàÁƒ÷ZÏ› µ¸J8,©âw÷‹/ììì¶oßÞ¦M)S@YèÈ![¥ã°©\¹ò×_ýÍ7߈Ð`piøûûÇÇÇŸ>}Zt€¦¢€K£|ùò3gÎüꫯD€’bþYÝPÀ¥4tèÐG?~\t€F¢€K©|ùòsæÌùïÿË›J@)PÀ¥×¿ÿråÊíܹSt€æ¡€KOOOoÁ‚ÿýïsrrDg)œ9sfÀ€uëÖ544tssÛ³gèDŒ.“Ž;ÚØØ¬]»VtB‡=z´gÏž¤¤¤€€€Ù³gó°Ôø\¶ïõ±ëÐÐPŸÛ·oW¯^]¥©@¸iÓ¦-\¸°ðbX7nÜèÝ»÷k—˜Ö2\ KRï»»‡ Ò¤I“¯¿þZu‘ Œ”~;B™L–••eddôòå˲ESk\ K­}ÿý÷Ë–-{üø±è ©C‡988ˆN¡©+PŠ÷;&L¨T©Ò¢E‹T Êè#à÷½pjjª»»ûš5kÚ·o¯Äœê†°ºûæ›o6mÚ/:”Ò{ÝøáǽzõZµjU ÛwöìÙzEÌž=[ʧ½í b1V tïw¾þúëÄÄÄõë׫"”‘ß¿¿k×®‹-òòòRR:õÅIX’*ÝîÎÈȰ³³Û»w¯‹‹‹*R@Y¼ù—-''G__ÿ}§ sæLÑAjаJy¿“™™igg·gÏWWW¥¤H°æ100˜={öÔ©SE¨# X…üýý?~¼ÿ~ÑAj‡V¡òåË/\¸pÚ´i¹¹¹¢³Ô ¬Z]ºt±´´\±b…è õÂIX (÷{TTTÇŽ#""êÔ©£¬u¤Á•°$¥ôÝ=iÒ¤—/_®ZµJ‰ëH€–”ÒwwZZš½½ý¸U0h>†¤ÙŒŒŒ¾ûî»)S¦ˆP°DF•žž¾k×.ÑAj)hT4ápêÔ©‘#GFEEéëë+}åU` ZtìØÑÑÑqÙ²e¢ƒÄc¬€êÞïDGG»»»‡††Ö¯__ë(gAKJ¥·­ž5kVBBÂÆU´~€QÀ’Rigee5kÖlÆ :tPÑ&ÊÂ1`íQµjÕüñóÏ?ÏËË ,@ÿþý4hðÛo¿‰†)hT:-éáá^·n]•nP–”,“ɦL™’™™É8Ô,)i 8==ÝÞÞ~Ïž=­ZµRõ¶¥ÃIXZ¨Fß}÷ÝäÉ“y:ˆÉßß?//oýúõ¢ƒ¤Æ´ÒLAË………y{{‡……q6¨!ŽKJÊ–Éd“'O~þüùÚµk%Û" „(`II\ÀÏŸ?oÚ´éæÍ›¹6¨NÂÒfÕ«W_¼xñ矞››+: @"°ZèׯŸ™™w*ÝÁ´OAËݽ{·M›6×®]333“xÓ€·a ZûY[[7nÊ”)¢ƒ¤ÀX!#`™LöâÅ‹æÍ›/[¶Ì××Wú­ÞÄYÐ’UÀ2™ìÈ‘#cÇŽˆˆ000P,),“Ɇ bfföã?Š (DKJl?|ø°E‹GŽqtt• ÇIX:ÄÄÄä‡~3fÌ«W¯Dg¨ ¬Žüýý«W¯ :@U˜‚V@ì´Ü;wÚ¶mËÇ‚@,¦ uŽ­­íøñã'Mš$:@%(`õõå—_†……íÛ·Ot€ò‰ŸkUCê0-wúôé!C†„‡‡×¬YStÐE| IRêSÀ2™ìÓO?ÕÓÓ[µj•è  ‹(`I©U?{ö¬yóæüñ‡‡‡‡è, s8 Kwþúë¯#GŽÌÈÈ 4j4ÔSj5–>|¸¡¡!7 ‰1-)5,à´´4‡¿þú«M›6¢³€a Z×-Y²däÈ‘/_¾ °ÆèׯŸÝ?ü :@ Ôn®U¨á´\RR’““Ó¡C‡œEgÀ4d2™¬~ýú?þøã¨Q£rssEg” ¬aFŒ!¯aÑAe¢¦s­b©í´ÜƒZ¶lyðàAÑY@Ë1ÿ155]¸páèÑ£srrDg”¬‘†nff6þ|ÑA¥¤Ös­¢¨ù´œüŒh&¢@¥˜‚ÆëêׯÿÓO?5ЉhÐD0Ô“žFŒ€åúõëgkkË\4¨ׂ–”pJJŠ““Ó_ýåîî.: h!¦ ¡˜±±ñªU«†ÎÍ @³hÌPOJ4–=z´žžÞš5kDmÃÅY²dÉÉ“'÷îÝ+: ¤4l¨' Ëd²óçÏ÷éÓ'44ÔØØXtМ„%)M,`™L6mÚ´øøø;vˆÚƒ)h¼Û÷ß±eËÑA撚C=UÓаL&‹ˆˆðòòºté’………è,  £Dš5köÅ_ >üÕ«W¢³ŠCk›/¾ø¢R¥JóæÍPMkU)Í‚–KNNvqqÙ±cG»víDgÍÆ4ÞC½zõV¯^íçç—žž.: @1Íꩈ¦€å>ýôÓÜÜÜuëÖ‰Œ0ÞÛ¢E‹Îž=»k×.ÑA hÃPOé´c,“É®^½Ú¥K—K—.5jÔHtÐHŒ€Q...3fÌ2dH^^žè,€ÿCK†zÊ¥5#`™LVPPЭ[·æÍ›/X°@tÐ<\ ZRÚTÀ2™ìñãÇÎÎΫW¯öññ4 ,)-+`™LvöìÙ\¹r¥Aƒ¢³€&á0ʤ}ûöãÇ>ÞÍÍmûöí~ø¡è, .Cå6løÇ <8))ItÐ~0þÇÛÛû³Ï>ëÛ·ïË—/Eg-§‹s­ï¤›SÐrƒ ª\¹ò† Dgñ˜‚†DôôôÖ­[ : h3ÝêC—GÀrqqqmÚ´ávIÀ’²°°Ø²eË!CâââDgíDC1/¿ü²gÏžYYY¢³€Òõ¹V…˜‚.4tèÐråÊmܸQtƒ)hˆ±fÍš[·nq¿BPº ¢@­U©Råï¿ÿvsskÒ¤I÷îÝEÇíÁ\«LA¿&88¸k×®GmÑ¢…è, )¦ !’««k@@@=RRRDg-A£Dú÷ï?|øðÞ½{s•JP æZ` Z¡‚‚‚T­Z•«TÐLAC<==½ 6DDDÌŸ?_tÐxœ÷PµjÕ½{÷¶iÓÆÆÆ¦ÿþ¢ã€£€ñ~êׯ¿oß¾N:5hРmÛ¶¢ã€¦b ï­yóæ[¶léÛ·ïíÛ·EgME£4:uê4oÞ¼®]»>yòDtÐHœî«gA—З_~yáÂ…#GŽèëë‹Î*¡ºF i €K(??àÀ+Vܼy³žžžè8 || êH~£¤¸¸¸™3gŠÎ†F™T®\900p÷îÝË—/4 CBYÕ®];((¨}ûöõë×ïÓ§è8 8ةǀK!44ô£>Ú½{·»»»è, 4†ºsttܸq#€zG§¦¦®X±¢OŸ>––––––}úôY±bEjjª4¡):wî<þüÎ;ß¿_tPwo-àÄÄÄ1cƘššnݺµcÇŽHJJJJJ:pà@‡¶lÙbjj:zôèÄÄD)ãBÍ1büøñ;wæýï­SÛUªT±´´\¼x±Â':tè‹/¾ˆ‰‰ÉÎÎVeB8\F3fÌ8sæÌ±cÇ Dg€2p!Ž#F¬\¹²jժż8++kܸqÚwwX ¸Œ ÆŒsÿþý½{÷V¬XQt(=®„%) ¸ì^½zÕ§OCCà 6p‘,š‹³ ¡aÊ—/¿mÛ¶èèè3fˆÎêèÝܯ_¿”””צ¥¥ 4H5‘ %ªT©rðàÁcÇŽÍ;WtP;ï.`KKË-ZlÞ¼¹pÉÑ£G]\\¬­­U ÚÀÐÐðСC›6mZºt©è, ^J4µ2zôèúõëÿòË/¡¡¡¿þú«½½½J“ÅÇÇOž<ùèÑ£2™ÌÛÛ{É’%æææo{ò›GË2eÏ1`åJHHøðÿþúë‘#GŠÎïGð1à–-[^¾|¹cÇŽžžžÍ›7?uꔪÛ7##ÃÓÓÓÙÙ9.....ÎÙÙÙËË+++«˜—ü_*‡÷bnn~äÈ‘¯¿þz×®]¢³€ºx“°ôôô ëÔ©#ÁI­kÖ¬qss›5k–‘‘‘‘‘ѬY³Z·n½víZUo*bkk{àÀqãÆ8qBtP %*à>ø ""âøñã'OžìÚµëÝ»wUkß¾}~~~E—øùùªt£P)''§¿þúkРAçÎÔ@Á»LŸ>ÝÌÌlß¾}…KŽ=jmmýÍ7ß¼óµ¥fllœœœ\tIRRR½zõÞö|™LfbbR¡B…zõê <8**ª,[/ÉnAé=zÔØØøâÅ‹¢ƒ@‰¨®Þ=޽~ýz·nÝ —têÔéÊ•+*½éMZZZ­ZµŠ.©]»v1—îÞ½ûÎ;Ÿ?~åÊ•V­ZuèÐáúõ몋‡RëÔ©Ó¦M›zôè,: ˆ¤¦§ûVªT)33³èU sss«U«öòåË’¼|ÕªUAAAÅ?möìÙsæÌQøPfffñ—áDY~úé§AAAŽŽŽ¢³@qtîJXFFF¯wŸâÜtD‰ 8::ÚÏÏÏÔÔ´bÅŠ¦¦¦~~~÷îÝSu2uæâârôèÑ?þøcçζ¶¶ ¢iƒøúúÒÁtÁ» 8,,¬]»v¶¶¶gÏžMOO?{ö¬»»{DD„ùÔYÛ¶mƒ‚‚öîÝkff&:‹–èÓ§ÏòåË}}}¯]»&: ¨Ö»§¶}||ºví:a„¢ —.]¤­Ÿ‘å$,±?ùä“ÀÀÀ>ø@tºNäIX÷îÝ311)º099ÙÚÚ:33S™„£€…;tèЈ#¶oßîáá!: &ò$,}}}…Ë«T©¢ì0Z¥W¯^_|ñErr²è É?õo IDAT××÷Ï?ÿ8pàÁƒEg•xw÷îÝûÏ?ÿ|máŽ;úô飚HZbùòåÿùÏbccEÇÑ<:t ô÷÷§ƒh¥w¬333ÇŽkoo?xð`SSÓlÙ²%**jíÚµÚz¿ %N8$''/[¶ìÒ¥Kò+Šà}]ºt©G+W®ìÝ»·è,t‘ÈcÀzzzï\‹–1å°Z íÚµë·ß~;fÌÑYèÕ5»/äDA,GGÇ3gÎx{{?}útÚ´i¢ã€rp%,‘8››+:…°²²:sæÌ† ¾úê+ÑY@9(`a²²²–,YbccóË/¿<þ\tu× AƒÓ§OMœ8‘YZ€¦jÕªGݽ{÷•+W¬¬¬V¬X!:‘º«S§ÎñãÇCCCüòåKÑq L8ÛHéOŠ‹‹KNNæÂO%ñâÅ‹aÆ=yòd÷î݆††¢ãÐrÜŽPRœ­æòóóÿóŸÿœ;wîàÁƒõêÕ€6ãv„º+??_tµS®\¹€€€^½zµoß^ÇoÌ@sQÀj-**ªqãÆË—/ÏÈÈEí|ýõ×S§Nýðù}!MD«5{{û-[¶œ>}ºQ£FS¦Lá’–¯ùä“O–-[Ö¹sç£GŠÎï‡Vw|ðÁÎ;CBB*UªtñâEÑqÔNïÞ½wíÚåçç·aÃÑYà=p¶‘œ„¥qn߾ݵk×|ÿý÷%¹x*”gAKŠÖD?þøãíííW¯^]¡Â»¯± %ÁYÐx«1cÆÜ¸qCtÁêÔ©sìØ±‡öìÙ“sÖ¨? Xã5lØÐÒÒ²k×®žžž{÷îÕå-6hР}ûö‰‰‰¢ã@q˜kU@§ sssÿúë¯%K–L˜0aèС¢ãöóÏ?/Y²d×®]\\ @q XRšXÀ…òóóË•cbC¶ÿþ‘#G 0@tŒ–”F0 ………uïÞ}äÈ‘_}õ§F(NÂB™\¿~}Ö¬YºvX´yóæ.\8pàÀàÁƒ³³³EÇ€ÿƒÖ µjÕÊÈÈpttìׯ߉'tg|_¯^½Ó§OWªTÉÝÝ=>>^tø X'4lØpéÒ¥±±±^^^“&MÚ±c‡èDÒÑ××ß°aCÿþýÛ¶m,:ü‹ƒ hý1àW¯^•/_^t ©Ž;ö·ß~ëÙ³§è,4'aIJë Xg]»v­gÏžcÆŒá´,%ÄIXP¹ñãLJ‡‡‹¢BÎÎÎW¯^=yòäÇüìÙ3Ñqè4 ÿjР‰‰‰¯¯o»ví6nܨ­§ ×­[7((¨aÆmÚ´¹uë–è8ts­ èòt^^ÞV¯^=`À???ÑqThݺu3gÎ\»víÇ,: õÅ1`Iérë”Ë—/÷íÛwäÈ‘ß~û-‡„(DKŠÖ>ìׯŸ‘‘ÑÆ EÇ v8 j!$$ÄÁÁaÙ²eiii¢³(‡‰‰ÉñãÇ5jäêê*:Bã=899­X±ââÅ‹VVV ¸xñ¢èDJP±bÅ¥K—Î;×ÛÛû·ß~€®`®U¦ ßééÓ§;vìhРA·nÝDgQšÛ·o8ÐÞÞ~Íš5U«V€Zà°¤(`õâÅ‹Ï>û,$$dçζ¶¶¢ãcÀÐ$ÁÁÁú¦råÊëׯÿì³ÏÚµk·mÛ6Ñqh3†z 0.‹'Ož|øá‡999~~~#FŒ077¨4"##û÷ïïìì¼jÕ*ÑqãvíÚÛ¶mKIIqvvž:uªèD¥Ñ´iÓ‹/pÁ,*ÂPOFÀÊòâÅ‹¤¤$KKKÑAJoõêÕ_}õÕÒ¥K $: 8 KR0Šº~ýúàÁƒ]]]W¬XQ½zuÑqHŠ)hh›áǯ\¹255Utwsrr ®R¥Š««kHHˆè8´ 1|îÜ9++«=zìܹStœw¨Zµêo¿ýöÝwßùøø,_¾œ eÇ\«LAK&==}Ïž=W¯^]ºt©è,%r÷îÝAƒÕ«WoÍš5&&&¢ãP9ŽKŠF1rssçÌ™³nݺU«VõìÙStªEKŠV—.]ªS§Žµµµè \¼xqèС^^^‹/æƒÂ€ã$,è¢ .´mÛ¶M›6K—.}ðàè8ÿ‡››[HHÈË—/¯\¹":ÍÃPOFÀê#//ïøñãÛ·oß»woHHHÆ E'zÝÎ;'L˜ð駟Κ5«bÅŠ¢ãP2¦ %E«¡œœœJ•*‰N¡ØÃ‡ÇŽ»qãFGGGÑq(SÐÐuokߌŒŒôôt‰Ã¼ÆÄÄdÏž=ãÇ÷öö^¼xq~~¾Ø<4 ÍvæÌ™† öîÝûÏ?ÿÌÊÊCOOoìØ±/^ ìØ±ã;wD% )(`h¶.]ºÄÆÆvïÞ}ýúõ¦¦¦bï!heeuòäɾ}û¶mÛvÑ¢E¯^½€šã`§ÖPOž<ÉÏϯ[·®è ²˜˜˜Ñ£Ggeeýþûïööö¢ã(=ŽïV»ví·µï‹/¤LbiiyìØ±#FtèÐáçŸf( àM õ`¬e^¼xannîââÒ¿ÿÞ½{׬YS²MÇÄÄŒ5*;;›¡0 ¡¥W¹reùœð5j4vìXÉ6miiyüøqùPxΜ9/_¾”lÓÔC=k±çÏŸGGG·lÙRâíÞ¿„ 7oÞ\»v­»»»Ä[Pj\ˆCR°nÊÈȨV­šJ7ñ÷ßOœ8±gÏžóçϯQ£†J·@)˜‚TnÚ´i666Ó¦M»pႊ.¦Ñ»wïððð¼¼¼fÍšíÚµK› )ê)ÀXg…††þý÷ßÿý÷“'ONŸ>mkk«¢ ;wî“O>±²² °°°PÑV”SÐ’¢€q÷î] ‹ *¨n999?ýôÓ’%Kf̘1iÒ$•n @©QÀ’¢€ñ6/^¼ˆ‹‹³³³SÖ ïÝ»7nܸ‡®ZµÊÍÍMY« ,ÔBtt´———½½ý_|qòäɲ_aÃÊÊ*((húôé}ûö5jÔ£G”’€ú£€÷ààà°yóf##£éÓ§Oœ8Q)«4hPdddÍš5V®\É•³]À\«LA£„^½zU¾|y%®0<<|âĉiiiíÚµS⚔ǀ%E£Œ6mÚT·nÝ:T©R¥/ÿóÏ?§Nêáá±`Á‚úõë+=€’ã0 I233,XP¯^½.]º¬\¹233ó½^Þ¿ÿÈÈÈúõë·hÑâ‡~à–€Vb¨§#`(ųgÏŽ9røðက€Ò …ïÝ»7uêÔ°°°Å‹üñÇJOà˜‚– µrôèÑI“&™šš.Z´¨E‹¢ãº…)h@Ûœ”——·víÚyóæ¹ººÎŸ?ßÞÞ^TH@+1-) š%???##cÍš5 .ìÞ½û·ß~kff&: %˜‚ðVfff‡þôÓOsssœœ¦L™’’’":€âPÀ€ÆkÞ¼yBB„ ÒÓÓ¯]»Ö¾}û¼¼¼¦M›Îš5+55Ut:Š1תSÐÐhyyy*THHH˜;wîîÝ»'MšôŸÿüÇÀÀ@t.@#q XR0´Fttô7ß|sòäÉ3f<~üøöíÛ^^^^^^666¢£š– -öí·ßž;wÎÓÓSOOïÌ™3åË—ß¹sgëÖ­EGÔ,) Z),,lîܹ§OŸž2eŠ···MõêÕE‡ÔgA(«æÍ›ïرãøñãׯ_÷ññYºtéÓ§O_{NAAÁرcW­ZÎÛP@¥(`@·4kÖlëÖ­gÏž½{÷®­­í·ß~›––Vøhnn®››Û•+Wz÷îmbbâçç'0* Ý˜kU€)hèˆØØØyóæíÞ½ÛßßÒ¤I 4(úhbbbTT”···¨x€:` €ò5jÔhÍš5!!!ùùùŽŽŽŸ|òɽ{÷ 533{[û^¾|yÚ´i{öìár@©QÀ€®377_´hÑ­[·LLLÜÜÜ|ýúõâ_R§NCCÃ5kÖØÙÙÙÙÙ­[·Nš¨€6a®U¦ ¡³ž?¾zõê¥K—6iÒdÚ´iïœÎÏÏŒŒ,_¾<7€¶âcH’¢€¡ãrss·oßþóÏ?—+WnêÔ©ýû÷¯X±b)Ö3þüÔÔÔvíÚ¹»»+=' ŽNÅŠ‡ výúõ~øaýúõVVV?þøã›ŸYz§N:­Y³¦qãÆvvvªH h(†z 0Š ýå—_öïß?lذñãÇ—â2–ùùùÖÖÖU«VUEB@u˜‚– ¼éÁƒ¿ÿþû|0iÒ$OOO¥¬6//ÏÉÉÉÉÉÉÝÝÝÕÕµE‹•+WVÊš¥ €%Eo“½yóæ¥K—–+Wn„ C† )ã 6??ÿÖ­[.\8þüÕ«WÓÒÒbcc•P XR0P¼‚‚‚'N,[¶ìüùóþþþŸ~ú©•••RÖ,¿—â›Ë³²²²²²êÔ©£”­%ÇIXÔˆžžž——W``à¥K—d2™››[·nÝ>\ö¿S ÛW&“]½zÕÆÆ¦I“&~~~K—. -ã†áê)Àx//^¼ØºuëòåËÓÓÓÇŒ3f̘Zµj)}+òÏ[[[Ožqvv–8À±cÇî߿ߪU«&Mš”+Ç ”€)h U«V¿ÿþ{TT”……Eß¾}[µjµzõêôôtÉdgg>|¸W¯^5kÖüðÃÏœ9#Ù¦÷ÅPOFÀ@Ùåçç=ztõêÕ'NœèÑ£ÇØ±cÝÝÝ%ÛúÓ§O¯^½Ú¸qcsssÉ6 ­Ä´¤(`@‰RRR6mÚ´fÍšŠ+Ž;vèСFFFb#µmÛ677×ÅÅÅÕÕÕÅÅ¥yóæåË— j‹– (]AAÁ™3gV¯^}àÀŸ#Fx{{‹ª½ÌÌÌëׯ_½zõÚµkÁÁÁÇ711’ê– ¨NZZÚ¶mÛ6nܘ0tèÐáÇ7mÚTt(òóóþùggggGGǺu늎a8 €–0227nÜÅ‹?^¾|ù>úÈÝÝý·ß~+ÅÍT*;;;%%eÞ¼yvvvõë×4hèDÐ6 õ` HæÕ«W‡þã?Ž9òÑG >¼sçÎêvD6!!!..®]»vo>”•••™™ÉY‹1-) ÞÓ§OwìØñÇÄÇÇrrrŽ9²}ûö´jÕjàÀ½zõþIâ÷•’’ríÚµ°°°ˆˆˆððð#F|þùç¢C¡D(`IQÀ€ÊÎÎ>pàÀŽ;Ž=Ú¡C‡véÒÅÐÐPt.eZ»víÇ›4iÒ¸qc;;»J•*‰N XZ0 ÎÒÓÓ÷ìÙó×_>}º}ûö èÞ½»v4ñ‘#GNœ8qëÖ­[·nÅÆÆîß¿ßÓÓSt(]GKŠ4BFFÆÞ½{ÿüóÏS§N¹»»÷êÕ«Gš{œø5¹¹¹ Á¿ÿþ»­­­ôÙt ,) Ð,ܳgOPP‹‹K¿~ýzöì©5Mü¦… ^¹råÎ;wîÜ©W¯Þ¹sçêÕ«':”Ö¢€%E*;;ûСCýõWPPƒƒCÏž={õêeii):—ª¼zõêÞ½{ÖÖÖ o~¼víZ [[[sssu»¶‰¡€%EšîåË—'NœØ³gO`` ±±q×®]{ôèѺuk…E¥•rrr&L˜}çÎG9::^¸pAOOOt.ÍCKŠ´F~~þåË—÷ïßøäÉ__ß.]ºøøøèÔ¡Óìì옘…7½xúôéï¿ÿnooïàà þ<‚– h¥{÷î:thïÞ½/^ìСƒ¯¯¯OP—„ü†QQQáááééé¾¾¾;wîJ½PÀ’¢€í–––väÈ‘      ##£^½zõìÙÓÅÅEw&¨JOOòä‰Âw$7oÞܲe‹­­­Ÿàö& XR0 # ‚ƒƒÿþûï}ûö=zôÈËËËÓÓÓÇÇÇÌÌLt4õrïÞ½M›6ݹsG~PÙÇÇgË–-¢CI„– è øøøãÇ?~üðáà 4ðõõõõõuww¯P¡‚èhj'''Gá”÷ïß¿mÛ6ÛÿÏÎÎN .BKŠtÙ«W¯._¾|ðàÁ   »wïvèÐÁÛÛÛÇÇÇÊÊJt4u{æÌ™ÂrïÞ½gΜ):TYQÀ’¢€È¥¤¤;vìèÑ£AAA5jÔðôôôððèØ±£NUº™3gîØ±C>J¶±±ñõõmܸ±èPoEKŠðš‚‚‚°°°'Nœ8qâìÙ³ 6”0þðÃkÔ¨!:†ÉÉɉ‹‹»sçÎíÛ·ïÞ½Û«W/…—¼Ž‰‰)W®œ©©iÅŠ¥Yˆ–  ¯^½ >~üø‰'._¾Ü¬Y3OOÏN:µiÓ¦råÊ¢Ói/¿ürëÖ­=233³´´œ;wnëÖ­¥AKŠPB/_¾¼pá‚üì­°°°Ö­[{xxxxx¸ººêëë‹N§ rrrbbbbcc[¶l©pæ? ##ÃÜÜÜÊÊJ‘¢€%E(…çÏŸŸ9sæäÉ“§OŸ¾y󦫫«‡‡Gûöí[µjU­Z5Ñé´ÖöíÛ¯_¿žp÷îÝ»wï9r¤eË–J\?,) @eddœ={öÔ©SçÎ urròððhÓ¦»»»|2GÙÙÙåä䘛›[XX4jÔhêÔ©%üAPÀ’¢€(QvvöÙ³gÏž=ûÏ?ÿ\½zÕ¢}ûömÛ¶mÛ¶m£FD§Ó999‰‰‰‰‰‰qqq÷îÝ›6mZÕªUß|Úo¿ýV§Nssó† ÊoòHKŠ "yyyׯ_ÿçŸÎ;wþüy™LæîîÞ¶mÛvíÚ999qÑá&Ož—žžþìÙ³J•*QÀÒ¡€H#66öܹsçÎ;{öl\\œ‹‹K»víÜÜÜ\]]MLLD§Óu/_¾Ô××g,) €ôž={vþüù .\¾|ùÊ•+†††îîî®®®­Zµâœj(`IQÀÄ*((¸yóæÅ‹¯^½zéÒ¥›7o:88¸¸¸¸ººººº6mÚTÇoÜ$% XR0µ’‘‘qíÿ»|ùòÇÝÜÜ\\\œ]\\,,,DÔf°¤(`ê,%%åòåËW¯^ ¾víZnn®‹‹K«V­ä•lnn.: V¡€%EÐ IIIÁÁÁÁÁÁW®\‘÷qóæÍåóÕÎÎζ¶¶ÌW—,) €æzôèÑ7 û8%%¥iÓ¦......Í›7oÖ¬—åz/°¤(`Z#===""B>Y~óæMsssGGÇ-Z8888884jÔHOOOtLõEKŠ ­òòò¢¢¢®_¿ùäÉ{{{GGÇfÍšÉ+Y~(ÈQÀ’¢€èŽôôty‡‡‡GDD„……8:::88È+¹Y³fº|ýj XR0]–œœ,ïãÈÈÈ7nDFFÖ®][>8nÒ¤‰­­mÓ¦MŒŒDÇ”,)  ÄÄÄ„……EDDܼyóöíÛQQQÕ«WoܸqãÆìììlmm-,,´òX2,) ŠwçÎÛ·o‡‡‡ßºuëöíÛÏž=³···µµµ±±±µµµ··oÖ¬™\A“– ïëéÓ§QQQwîܹsçNtttddäíÛ·ëׯ/ïc;;;KKËŠ+Šû(`IQÀPvyyy±±±ÑÑÑò±²¼˜ï߿ߠAy+7nÜØÖÖ¶aÆ¢ó*FKŠÉÍ͉‰‰ŽŽ¾uëVttttttBBBll¬¡¡¡¼mlllll5jdaaQ·n]Ñy)`iQÀ ±„„ùXYÞÊqqqqqqyyyVVVæææÖÖÖ666ÖÖÖUªT‘,,) ÔAZZZLLL|||áX9&&&&&¦V­Z 6477777·±±±²²’ÏcW­ZUé(`IQÀ ¶òóó“““cccãããïܹ#/éøøx333sss sss33³† 6lØÐÔÔ´B… ¥Û,) 4Ñ£Gcccå_$$$ÄÇÇ?|ø°nݺ5’·²¼¡åõüÎÃ̰¤(`Ð&yyyIIIqqqñññ‰‰‰‰‰‰qqq ™™™¦¦¦ÆÆÆ 4³©©©‰‰IýúõÍÍÍ+W®LKŠ‘•••˜˜øøñãû÷ïˇˉ‰‰)))??¿¢KüüüEåà´¡€#""‹.iÑ¢Edd¤¨<¼“6̵VªT)33³bÅŠ…Krss«U«öòåËÒ­)h€œê¡‚*Vª)fÏž=gÎ…éééI S´a¨gbbrãÆ “Â%ÉÉÉ-[¶LJJ*Ý ƒßÈø5€L&ã$¬â5kÖ,44´è’7n4mÚTTÞI ¸[·n7n,ºdãÆÝ»w•€wÒ† –çÏŸ;::Ž=ú³Ï>“Éd+W®\¿~}hh¨AéVȼø€Œ_Èd2¦ ‹W½zõ'N\¹rÅÂÂÂÂÂ"88øøñã¥n_$Àû;xÛ ~ ã×2™L•¿ågÏž­ŠõjºŽ;ŠŽÁø€Œ_Èd2•ýðþ´á0‡@ (` €€@ (` €€@ (àÿ‰ïÓ§O5jԨѧOŸ„„щ ÀµkׯW³fM===ÑY Æ™3g P·n]CCC77·={öˆN©]¼xqôèÑ–––•*U255íÔ©Ó®]»”¾ ø_žžžÎÎÎqqqqqqÎÎÎ^^^YYY¢sAjÆ 366>wîœè ¦C‡=Ú³gORRR@@ÀìÙ³×®]+:$5qâÄ–-[edd„‡‡OŸ>}îܹß~û­r·ÂÝþõË/¿\½zuóæÍ…K†Úºuë‰' L¸¬Îš6mÚÂ… §@nܸѻwïèèh±© ÖÝ»w]]]ÓÒÒ”¸NFÀÿÚ·oŸŸŸ_Ñ%~~~¢òå§Ÿ~*zÂÆÆ†R¨X±bùòå•»N ø_ŽŽŽE—´hÑ"22RTjâСC¢S@˜gÏžÉO øì³Ï”»f&ÙþU©R¥ÌÌÌŠ+.ÉÍÍ­V­ÚË—/¦‚@LAC&“¥¦¦º»»¯Y³¦}ûö¢³@jE'B¼½½:¤ÜA0#`PìáǽzõZµjí«› >|¸uëÖˆˆˆyóæ)wý𿌌ŒRSS‹.yòäI­ZµDå Öýû÷;wîüÍ7ßxxxˆÎ‘Œ ´yóf¥Ÿ Oÿ«Y³f¡¡¡E—ܸq£iò>t‘IDATÓ¦¢òèÁƒ¾¾¾‹/öòòjÁÕÕ5%%E¹ë¤€ÿÕ­[·7]²qãÆîÝ»‹Ê@”””Ÿ xzzŠÎuqþüù&Mš(wð¿ÆŒsþüùùóç§¥¥¥¥¥Í›7O~%ѹHÍÇÇgæÌ™]ºtÂtîÜ9000%%%77÷þýûëׯ5jÔ?ü Ü­pžçÿÄÆÆNž<ùøñã2™ÌËËkÉ’%¢CAj ¯@É¢ðw --­fÍšÒ‡'Ož\¾|ùéÓ§Ÿ={V·n]ww÷iÓ¦}ðÁÊÝ  €LA  €0PÀ@  €0PÀ@  €0PÀ@  €0PÀ@  €0PÀþgÀ€3fÌ(ºdúôé}ûö•Ðbz¢3POžôòòzöìÙ‰'lmmEÇ´ àu'NôððxüøqXXزeËDÇ´Ç€üÇŽ»{÷n¯^½F}ýúõcÇŽ‰Nh'FÀþ'--­U«V‡¶¶¶–Éd‘‘‘ݺu»zõª‘‘‘èh€¶a àÆ7dÈyûÊd²¦M›Î%4y.}ÍÃý‚(++O:5((H؇„oĈÚÚÚ®®®»wï.--í1‡ú:…¾66(`c,^H‡Ð?Ê9/Haaá¦M›¾þúëÿþ÷¿ÂbˆØñš››=zôí·ß644L™2åÊ•+ƒZ •ˆºá’ß,r22õîìéôµTïéQQQkÖ¬),,<¢PñLž••5{ö옘ssó¡¬Gˆó kY€Þ° ’iéÒ¥_}õ÷”mÛ¶½ûî»ìËÈÈ477¯[·NCCCIIÉËË+77—{æÐÐP'''%%%%%%''§°°0ÎC222]]]{÷îÕ××1bÄĉ{lYÞ»wÏÁÁAAAA__ÿ—_~È‚ìM«{ѹ··ÊÊÊ6lØ ¬¬l``°mÛ¶ÖÖÖÁ¾ ööö%%%üŸ`vv¶©©)÷R555&LèèèàžhjjúðáCþÏ´¥¥å³Ï>ÓÖÖÔV£µµõæÍ›9ÂYû Û¶m3119räèÑ£gÏž}óæMF߯[ïѹcðùÕóLË…çXœÙ†òž)Ås'ýñ÷¾zõjܸq™™™ì322´´´***8Ë.[¶ìرcååååååÇŽÓÖÖ.,,d?š˜˜¨¦¦öÛo¿UUUUVVž?^UU5%%…³ìÚµk¿þúë§OŸ666ÆÄÄþþûïìGóóó544‚ƒƒß¼y“œœl``={?î)zzzgΜihhxþüù’%K¶oßÎÿEè==**ÊÐаß'hkkÃYêøñã£Fúã?8S¢££§NÚï3]µjû!žñø$ÏËË322ê1ÏâÅ‹7oÞüâÅ‹öööšššÐÐÐ9sæôµž£sfãÿ«ç™Š{Ù¾Ê{¤ ÄU¿ÿ§¼qã†]ggggg§­­íùó繗ݳg÷ÚvïÞ½råJö¿-ZtâÄ îGßyçβ;wîä~4,,ÌÑÑ‘ýï•+W:tˆóPHHÈܹs² ÿæV[[Ë©ÒpUUÕåË—ÇwìØ±~ŸàÉ“'}}}9ÓmllÎ;çååÅ™²|ùò³gÏöûL9Â3X¿Ï®¥¥EQQ±Ç<£Fê«Ëy¾n½Gç.Q>¿z x(ïZ(`WÙóá‡:tèàÁƒóæÍë±,g£‡­  @GG‡ýï &s?ZTT¤§§×ײµµµªªªì=yò„û¡±cÇdA>î---»wï655UTTdÿ'cذa}-řΡ¤¤äààpæÌΣ|ž`]]ªªjMM ‹ÅÊÉɱ´´d±XÖÖÖìùkjj´µµ›››û}¦ÏŸ?ç¬÷³ë¡©©iäÈ‘=æqppX³fMiié@ÖÃstîå󫸀‡òž©…q5®¨¨0777nwU°—miiážÒÜÜ<|øpö¿GŒÑÚÚÊýhkkëˆ#8ËvuuõF^^¾Ç¹¬¬ì@äóáþùçŸ{xxddd466²X¬––>KñŸ>'èëëËÞVÞ²eËÁƒY,ÖX,Ö±cÇ6lØ0gÚÞÞÎ'Ÿ„¹¹¹ÆÆÆ=æyöìÙ¢E‹Þzë­?ü0$$¤»»»¯õðûãó«ï½¶®®®üކòž©…wˆ«|~}öÙgþùçÏ?ÿüÙgŸõXvP[ÀÅÅÅÜ[3|Âhhh¼|ùràò᮫«[RR™Î>iˆÏ:ùLgãÿ£¢¢ÌÍÍ;::tttÊÊÊX,Vii©¾¾~WW—……ENN{¶Á>Óγoß>žó´¶¶feeýôÓOööö«W¯îk=ý¾Î|~õ***uuu=l xàïZ8 $VDDDaaáâÅ‹ýýý³²²"""¸ îñã¬Y³Øÿ¶±± å~ôÆ666tæÌ™×¯_ ­‚‚B{{;χZZZ8?ž={V€õsãÿg̘ÑÒÒ²sçNsss]]]ƒ1vìX##£€€€Q£FMž<™=›ÀÏ”ìììcÇŽmÙ²…ç£#FŒ°²²Z»vmxxø¥K—Øù¼n}áó«Ÿ8qbbb"÷£gΜáü›ÏXCyÏ€ô"ý?ñ÷ÖÖÖ°ÌÍÍ500¨­­å,»|ùòãÇWTTTTT?~\[[ûéÓ§ìGãããUUUÙg´VUUýöÛojjjÉÉÉ|ÆåL|øð¡ŽŽÎ¯¿þúêÕ«ÆÆÆˆˆîS“ø,hnn~íÚµÎÎÎÞ-_¾Ü××·¼¼¼²²òàÁƒì/Sñø¿8üŸ ‹Åú÷¿ÿ-##sîÜ9Δ_ýUFF†û@ò`Ÿi_ ;;;kkkïß¿¿uëVMMÍ«W¯öžÇÅÅåüùó%%%ååå_ý5ç¼0>¯Ïáøÿê/^¼hllÛÔÔTPP°}ûöµk×äw4”÷ H-¼@\ñÿ?åûï¿¿k×.îùwìØñþûïs–mllüè£TUUGŽéááÁÙ³ÊvíÚ5{{{EEEEEE{{ûëׯsË3 çß™™™^^^ÊÊÊŠŠŠ3gÎŒˆˆÈ‚ááá&&&Æ ë]®555¾¾¾jjj***«V­jhhbó‚,«¤¤DYY¹¡¡3¥¡¡AGG§©©‰{¶A=ÓÞ Ùäåå555]\\zœfÅYOtt´ººº‚‚‚±±ñW_}õúõköC|^7ž«ê÷Whbb"''7~üøÝ»wwvväwÄÚ{¤.ìÒ—4âp €0Ø@¶€@€  @ €0(`PÀ €@€  @ €úpqq±“Éd2™>>>%%%}ÍÙÕÕuâÄ [[[•Ñ£GÛØØœ8q¢««‹Ê´ƒBÓnlltss³±±)*****²±±qwwonnæ9ó¦M›ÎŸ?ôèÑ’’’’’’£Gþú믛6m¢83ÀÀÑô~ÀGMOO¿págÊŠ+6nÜØ{f&“™““£¯¯Ï™òâÅ KKËúúz ¢€¦[À¡¡¡~~~ÜSüüü®_¿Îsf…ÞE’ @hZÀ¹¹¹VVVÜS,--óòòxÎüé§Ÿ¾ÿþûqqq ±±±K–,ùì³Ï(I šî‚–——ojj’““ãLéèè5jT[[[ï™Y,Ö;ï¼™²hÑ¢?ÿüSFF†Š¬`Ñ’œœ\{{;÷”öövyyyž3ÿý÷&L¸víZmmmmmíµk×&L˜pèС~Gùæ›ox¾&<÷i€tN±õBÓ-`mm휜mmmÎ”ŠŠŠ)S¦”——÷žÙÀÀàìÙ³3fÌàL‰‰‰Y½zõ³gÏ]F†¦/ PLt@ÓcÀæææÙÙÙÜSrrrÌÌÌxÎ\VVfggÇ=ÅÎή¬¬L„ù††¦ìííÄ=%((hÁ‚ƒÁ055ݲeË’%KÇ€€Mt€¦á lRw€dC€  @ €°ŒŒŒõë׫¨¨ ö öB¹â}llìÒ¥K555GíääÄ}]ý¾íaè¤ €°•+WjiiÅÇÇÝÕÕµºº:$$¤¼¼<000 àôéÓüéqMcjrJ|߆| ˆì‡P>¬¾üòËp6dsrrÞyç‚‚‘*Fð5$š*++Û°aƒ²²²Á¶mÛZ[[©½¹¹yݺuJJJ^^^¹¹¹ƒ]ÃÁƒ¹w#—””5#ð†ggg[[Ûòòòèè袢¢Ý»wS9º¿¿¿™™ÙÇ ===ÝÝݾ[xx¸……ÿyÆŒ#''§££ãëë˾!@ºö$ ´í`a©««³³³+,,dÿÈÿ¥ÞŸ3ì‚Þ³gÏÎ;9SöìÙSPPÀ¹™Í`ÔÖÖN›6íÔ©S...}-µpá­[·ÚÛÛ¿zõêêÕ«û÷ï¿}û¶µµõÀc‹6‚ˆî3,Öð²Àµ´´ìÞ½ÛÔÔTQQ‘ý¡:lØ0×6؃QXXÈ=¥  @GGG°Ñ+**Þ~ûí¨¨¨A-uòäI~gûæ›oDÒaóÍ7ßöš°DÙØÔã[À0@›6mÊÏÏß¿ÿĉ•””Z[[þ` ¸¥¥EAA3¥¥¥…Édvtt vè²²²yóæ>|ØÝÝ}P VVV566vDq!ºF.Š•H‰+W®$''7Žýc㯃Ý,€—/_rÿ¨©©9Ø/_¾ôòò:v옛›Û``sE`8 @p=6@Ïž=Ëýh¿û6‡.88¸Ç³fÍT€ªª*OOÏï¾ûN€öe0—/_vvvÊSZØœ——צM›:$++ôâÅ ¡Áè£GÙw@¿|ùò‰'îß¿?¨õ{zz~ýõ×sçÎHww÷O>ùdúôéêêꥥ¥/^>>L&“Édúøøð¿°L/BÉ …PÀ„­\¹RKK+>>žÈènnn666EEEEEE666îîîÍÍÍ|Å55¥¾oþ†Dp7¤¡X=z4==ýÂ… œ)+V¬pppظq£è#øM•••mذAYYÙÀÀ`Û¶m­­­TŽÞÜܼnÝ: %%%//¯ÜÜÜÁ®!44ÔÏÏ{ŠŸŸßõë×…—xC ‰³³³­­myyytttQQÑîÝ»©ÝßßßÌÌìáÇ………žžžîîî=n‰Ø¯ÜÜ\+++î)–––yyy|3fŒœœœŽŽŽ¯¯o~~¾ ¹» y’¶, ,uuuvvv………ì{?`vAïÙ³gçΜ){öì)(( xyyù¦¦&999ÎôŽŽŽQ£Fµµµñ\jáÂ…[·nµ··õêÕÕ«W÷ïßûömkkëÇ/Ø @G­­­{öìyë­·FŽ)##£¦¦VTTÄy”‚ûûúúöø1""B¤®_¿îâ⢠ 0nܸM›6lß¾½ß¥¸Oœ r¶¾f ›z<` hÓ¦Mùùùû÷ïŸ8q¢’’Rkk«¢¢¢À l·´´(((p¦´´´0™ÌŽŽŽ¯D[[;''G[[›3¥¢¢bÊ”)åååY¼²²ÒÈȨ±±qà#ŠlÐÑ•+WNŸ>=eÊ%%%ƒÑãøkï¯Ì ýë³/_¾ìñ£¦¦æ ˜››gggs¯$''ÇÌÌl€°¹"00€àzl€ž={–ûQ vA÷øqÖ¬Yƒ àííÍ9fÌ´`Á‚¸|ù²³³óО„”BÎËËkÓ¦MUUU‡zñâ…Ї࿭üèÑ£ÀÀÀÊÊÊÊÊÊÀÀÀ'NìÚµkPë_³fMBB·ß~[WWWWW·oß¾¤¤$žÜÝݯ^½ZQQÑÑÑñüùóo¿ýößÿþ÷þýûû¤€ŠÀÀ@ƒannnjjš——×c x€¸÷ ÷Ø?\[[«¦¦ÆgÙŸþ9;;{Ò¤I†††aaawïÞ566ÔèÊÊÊQQQ©©©zzzzzziii‘‘‘ì=ê½íر#88ØÂÂbäÈ‘...ùùù÷ïß·±±ÔˆÀ†³xÀIX@Ož>>%%%|fîîî 477WPP°°°¸tée9@Ónlltss³±±)*****²±±qwwonnîkþõë×çääܸq£¾¾þܹsçΣ2-À`ɰX,Òx8zôhzzú… 8SV¬Xáàà°qãÆÞ3GGG9r$44TX£ËÈÐôeЉ®hºêççÇ=ÅÏÏïúõëtèЪU«455555W¯^}àÀ;wö»`@@€ /d)GÓ³´µµsrr´µµ9S***¦L™R^^Þ{fhhhp¦TWWëëë755 6:NÂ6©; ËÜÜ<;;›{JNNŽ™™Y_3S @hhZÀÞÞÞAAAÜS‚‚‚,XÀsæÅ‹ߺu‹{ÊÍ›7íííE˜`hhº¯µ¡¡ÁÊÊÊßßÿ“O>a0'Ož<{ölvv¶’’{î}­­­îîîëÖ­›;w.ƒÁ¸yóæÖ­[¯\¹2sæLÁFÇ.h`“º]ÐÊÊÊQQQ©©©zzzzzziii‘‘‘œöíAAAáêÕ«wîÜ™8qâ¸qã~þùçK—. ܾÀ¦Ø6©Ûl(`PÀ €@€  @ €0üCKKKgg'çGï*ü¡€€Á`0üðÃ/\¸`hhxúôéîînÒ‘$.zÌ® ÒãÇܵk×öíÛ7lØ //ÏæôôôÍ›7ËÊÊ^½zUCCƒš„d‰®Ð4< €A°X¬M›6EFF^¿~ÝÈÈh€KuwwïÚµ+88ø¯¿þš8q¢HÐèa¸(V ô÷Å_¤¥¥%$$0™Ì/%++»wï^CCÃ9sæÜ»wOOOOt $ @}÷ÝwÑÑÑÑÑуj_ŽÕ«W755Íž=;99YUUUèñ¤öµò€]Ð Ù"##ýüüÒÒÒttt†²ž-[¶†„„ÈÈÈ+Ýà~À ååå~~~çÏŸbû2Œï¿ÿ¾ººúðáÃB  m°©Ç¶€A‚-[¶ÌÈÈhïÞ½BY[qq±]bbâÀOã/8 šR(`T‘‘‘}ôQ^^ÞÈ‘#…µÎC‡EDDüõ×_ÂZ!­`4 UGGdž Nœ8!Äöe0ŸþyYYYHHˆ× PÀÒâôéÓzzzóæÍîjåää>¼}ûvî+H@¿°¯•ì‚ÉÓÒÒbjjbcc#ŠõÏš5ëý÷ß÷÷÷ÅÊÂ1`J¡€Aòìß¿?;;û÷ßÑúSRRÞ}÷Ý'Ož(((ˆh"PÀ”Bƒ„inn600ˆ555Ý( .ôôôüä“OD7õpî—_~qqqiû2Œ;vPÀ’éüùó+W®$5º­­íˆ#I ?0€zþüù³gÏfÍšE0Ãòå˱€0€ºzõêâÅ‹‡N0Ã{ï½÷ÇtwwÌ@g(` tõêÕwß}—l†‰'jjj&$$@[(`ISRRòüùó3fÂx÷Ýw¯^½J:M¡€$ÍåË—-ZDvÿ3Û’%Kþøãœ À @Ò„„„¼óÎ;¤S0 †©©)“ÉLII!€ŽPÀ¥¶¶öÁƒtØÿÌ6þü°°0Ò)è QnÝºåææ¦  @:ÈÿÌ›7ïæÍ›¤SÐ @¢„……Í›7tŠ¿M›6­¤¤¤´´”tÚAHŽ®®®»wïzzz’ò·aÆyxxܺu‹tÚAHŽøøx}}ý±cÇ’òóæÍÃa`€ÞPÀ’#<<|îܹ¤SôäááqïÞ½¶¶6ÒAè 9ÂÃý¼¼H§èIMMÍÜÜüþýû¤ƒÐ @BTTT”””888ƒ‡‡Ç_ýE:½ €$DxxøìÙ³‡ F:žžž(`€PÀâöíÛ´:ÿ™›]UUUqq1é 4‚]]]sæÌ!„7YYÙÙ³gß¹s‡tAH‚ÔÔÔ±cÇêêê’Ò'Û·o“N@#(`I1kÖ,Ò)øqwwŽŽîîî&€.PÀ’ 22ÒÝÝt ~tuuµ´´²²²H  0€ØknnNKKsqq!¤îîî‘‘‘¤SÐ @ìÝ¿ßÚÚZYY™t~ €¸¡€Äý÷?³Í˜1#!!פ`Cˆ½¨¨(±(`33³ÄÄDÒAh ÞÞ¼yóøñcGGGÒAdæÌ™÷îÝ#€PÀâ->>ÞÑÑQ^^žtyûí·ãââH§ 0€x‹¥ÿùÏÎÎÎ)))ííí¤ƒ‡o±±±®®®¤S “Éœ8qbzz:é ä¡€ÄXssóÇéy ¾¼ýöÛ8 À@ˆµÄÄDkkkEEEÒAÁÅŇ(`±&^€ÙÞ~ûí„„„®®.ÒAë§€kkkOœ8áããc`` ¤¤¤¤¤d``àããsâĉÚÚZj"@_âââÄ®€ÕÕÕuuu³³³I ¬Ï.--]³f®®nppðŒ3ÂÂÂÊËËËËËÃÂÂ\]]ûí7]]]ÿÒÒR*ãGGGGZZÚÔ©SI´éÓ§ß¿Ÿt ÂdX,Ï Ž9âééÉs†ððð/¾øâùóç---¢LH€ŒLŸ/ }$%%­_¿>##ƒtA;þ|hhèåË—IèŸè¡Ï-à¥K—¦¥¥õÕ¾ ÃËË+--méÒ¥¢ˆýŠ‹‹›>}:é‚ÀyX >[ÀÒ [À .\èëë»dÉÒA1a„¨¨(cccÒAúA` èŒÅb%&&Šé0ƒÁpvvÆa`rýð{ï½WUUÕcb]]ݲeËD ú——Ÿ‹„ IDAT—Çd2uuuIÎÃè¿€ ,--/\¸À™r÷î][[[###Q~âããI§ô_À?zô¨··÷Ó§O7nܸwïÞ°°°½{÷Š4Yqq±“Éd2™>>>%%%Yª¢¢ÂÄÄDFFF¤Ùˆ‹ßýÏ ⪪ªººštbt xÊ”))))3fÌpss›Ø³gH³ÐA||ü´iÓH§œ¬¬¬££cbb"é Ä â$,™Ñ£GkhhP°}yêÔ)''§;v¨ªªªªªîرÃÁÁáôéÓü—:zô¨¶¶6NƒÄ«ªªª­­õÿƒEmÚ´i ¤S3 ÎÌÌtttÌÍÍŒŒŒŽŽž7o^aa¡Hc…††úùùqOñóó»~ý:ŸE²²²N:uâÄ ‘ ƒøøø©S§ÊÊŠ÷·œãããI§ fx¿s|õÕWÁÁÁ?üðƒ··7ƒÁ8~üxDD„‡‡‡¯¯ïîÝ»E+77×ÊÊŠ{Š¥¥e^^^_ó·´´øùù={VYYYD‘è#!!A¬÷?³999eff¶µµ1‚túÿô‹/²²²ØíË6kÖ¬ÔÔÔ'Ožˆ.V]]šš÷uuu>·زeË{ï½çää$ºHô!î§@³)))Mœ8133“t2ú/àK—.©««÷˜¨ªªzñâEÑD´ë×¯çææ~ýõ׃]0 @†Q„–¶¶¶œœ{{{ÒA„{¡AšÑô’ªªjíÝšššÛÄ_|ñÅùóç‡ 6ØQX¼€™™™¦¦¦JJJ¤ƒÁÔ©S“““I§ £Ï^µjU¿_ûinn^µj•°#1 †¹¹yÛ…æä䘙™ñœ¹°°P__¿Ç&,¶eAR%''KÌÑGGG0H­> ø÷ß···ˆˆèk†»wïÚÛÛÿþûåííÄ=%((hÁ‚G»ÈÂý€€Á¬ýÏl©©©ÝÝݤƒPm@\PPàçç§««+''§««ëçç÷ìÙ3Q'€ÞRSS%ãÀjjjÚÚÚùùù¤ƒP­ÿ~ðàÁôéÓMLLâââêëëãâ⌧M›–››KA>à`±X)))¶Ì`0ðe$BýïÚöôôœ7oÞgŸ}Æ=ñ?ÿùÏ_ý.ÊlÄà0ÐÓ“'O<==%oÿS```nnî?þH:$ÇÅÅ-Y²¤ÇÄ¥K—ÆÆÆŠ"ô%))Iò6 †““¶€A õ_À}ݨDQQQØa€É;‹ÍÚÚº   ±±‘tJõ_Àï¼óÎåË—{L¼té’h"o’ZÀrrr¤ƒPªÿ]ÛMMMk×®4iÒòåËuuu_¾|ùÛo¿=zôèôéÓ#Gޤ&%Åp h¨µµUCC£ººZ"w>mÞ¼YWW÷Ë/¿$ 'Ñ5Âð~ç5jû;wîäžÎ};BÔ€¨¥§§›™™Idû2 GGÇ«W¯’N@©þwAó¼aîß@±””‰¹Co¸-H!\ @>>%%%}Í»téRMMÍÑ£G;99…„„P™`(’’’hø à´´4;;;Ò)xsttLOOïêê"`¨hZÀnnn666EEEEEE666îîîÍÍͲ··ÿøãI© ºF éphh¨ŸŸ÷??¿ëׯóœùàÁƒÜW±766泿€>>|¨££C·öe0Ÿ~ú)»}·lÙB:NONNN8 €¦œ››keeÅ=ÅÒÒ2//o ˆ‡‡[XXˆ&€0Ñÿ#GŽüñÇ›ššHùœ ’¦\WW×c³@]]½¶¶¶ßkkkwìØqìØ1‘Eš¤¤$š_‚CVVÖÀÀ °°t033«¬¬|õêé CBÓLeeåâÅ‹øá—Ì ˨s°‰Å5°LMM=zD:Å?ÈÊÊÚÛÛ'''“0$4-`UUÕÛ»555ü••••yxxìÚµkæÌ™% €Å‹à¹¬®®®¼¼ÜÜÜœt~Ìœ9óÎ;¤Sô„½Ð hZÀæææÙÙÙÜSrrrÌÌÌúšÿåË—^^^GŽqww}:!HHH°··6lé ýXºtéš5kH§èiÚ´i÷ïß'`HhZÀÞÞÞAAAÜS‚‚‚,XÀs檪*OOÏï¾ûÎÍÍ’tB;Àc%diiiÑp?ù´iÓÒÒÒÚÛÛIM xÍš5 ß~ûm]]]]]ݾ}û’’’üýý93p©õôôüúë¯çÎK")€€âââèVÀUUUÓ§O'b@˜L¦±±qzz:é ‚£i+++GEE¥¦¦êéééé饥¥EFF*))ñœ933sÙ²e=N¤zýú5Å™®¥¥%''‡n¡¼yóæ¸qãH§(—¸¸8Ò)GÓf0úúú×®]«¯¯¯¯¯¿víšžž÷£Ü§Jñ<‘JEE…òÈ•’’baaÑ×ÿ)I¹|ùò¢E‹H§(±Fß`4Üÿ\XX˜™™)^ßÝÝM:€€PÀа€ïܹ³zõjÒAj̘1jjj¼@ á®<àf R………êêꤳüCww7Ÿ;·´´›ššR‰?›õëד’LênÆ Á233õôôèÖ¾ ƒOû2ŒÄÄDZíò}ûí·cccI§ €j111®®®¤S š›››’’Òµk×HùÛÌ™3ïÝ»‡ýU ¦PÀT»wïž80ƒÁøÿïÿÐg#xüøñ#FŒxòä é ‚@Pª««+!!ng` ···¼¼ü7Hù›««ë½{÷H§ €RÙÙÙºººZZZ¤ƒBFFæÄ‰o½õé CƒøBPŠVûŸ[ZZ:;;µˆ““­ xÆŒÑÑѤS @©{÷î½ýöÛ¤SüÏîÝ»H§CCÃáÇ0h(`êtwwÇÅÅ͘1ƒtƒÁÈÎÎ>{öì† H*WWט˜Ò)  @¬¬¬1cÆhkk“Âèììüè£80fÌÒY†jÆŒ(`G(`êÄÄÄÌœ9“t ƒÁØ¿¿––Ö|@:ˆÌœ93**Št €ACP'::š&ûŸçÎ{úô顯§¡¡aè+"CCCyyù§OŸ’08(`ŠtuuÅÇÇÓä ,[[[]]Ý¡¯gùòåB)ò!ruuŹРvPÀÉÌÌ;v¬˜~¸/‡Ú±cGjj*Ù8 â @‘ÈÈH777Ò)„ÌÔÔôÔ©S>>>c¸»»GEEá¢Ð ^PÀ¹s率‡é·`Á‚µk×®^½š`† &¨¨¨dggÌ0X¸ñ-¸0]SS“ŽŽÎË—/GE:‹HTVV’ýzÕçŸ>vìØmÛ¶Ì ÷o111ööö¤Ú÷îݻ۷oéÄ¿Üyò„²† Zmmmqqq³gÏ&„R²²²Gݼy³‹‹Ë;w(×ÃÃãÖ­[” 0(`ÑŠŽŽ¶´´TSS#„€µk×^¹reõêÕùùùÔŒèååNÍXC„+Nð€ q€}þùçcÆŒù׿þ%ê?~ljj*êQÐÐР¬¬LÍXcÇŽ-++“Ô žõp!quëÖ­¹sçŠtˆ7oÞ,[¶lÅŠ]]]"H0”µ/ƒÁ5j”ƒƒCdd$e#  Byyyííí"ýRdd¤•••¦¦f\\ܰaÃD7¸˜?þÍ›7I§è @„nܸ±páBÑ­ÿÏ?ÿ\½zõO?ýtüøqÑ $F.\ÚÝÝM:@?PÀ"*Òk@zyyåääˆãM–NŸ>ýÑGUWW }ÍzzzZZZÄoQ Ð/0€¨TWW?zôÈÕÕUtC(**Ž=Ztë¥K—ª¨¨XXXœ8qB臮,X*Üu @TnÞ¼9{ölyyyÒAèHYYùðáÃQQQþù§½½}[[›W>þü7nq…¢€• eUy•cssóÈÈÈŸ~úiĈB\­½½}MMMAA× t(`‘hhhˆúàÖÖÖ#GŽ_¾|Y(ÁhÈÞÞ^¸+”••õññ¹råŠpW \(`‘ ™1c“ÉÊJ~ýõ׉'ÆÅÅEFFž9sFXÙ¤Á{gšCˆÄ•+WÞ{ï½!®DQQñÏ?ÿ¼víš¹¹¹PR‰‘ŽŽÿÄÄDÁwvv®¬¬¤òVƒ…¾†††¸¸8ooï!®géÒ¥vvvB‰$vX,–­­íŠ+\]]ÃÂÂû½^ö^è«W¯Š(ÀС€„ïÚµkCßÿ,åäåå?ùä“'Ož|üñÇ7nìÞ{ï½K—.‰"€Pà®<àf 0DsæÌY»ví»ï¾ÛïœUUUgÏž=wî\\\œºº:ÙÄTSS“’’Ò a±XFFFׯ_Ÿ>þõë×›6møRúúú™™™ãÇ]6ŠåË—;88ðùµ²X¬üüü„„„¸¸8…ü‘Êx@[(`J¡€¥PuuµŸŸ_zzº‚‚ÂôéÓçÌ™3¨£¹'Nœˆ‰‰Á hé,11ÑÏÏ/??ذa¯¤¸¸¸¹¹yâĉ²²8~'-PÀ”BK¡®®®[·nÙÙÙéèè°¬©©iPPдiÓD‘ „eúôéŸþùPŽÓ_¼xq×®]UUUS¦L±³³[¶l™­­­ ¡€)…–0¥¥¥YYYééé999ÙÙÙÉÉɽóÁ… ~ùå—èèh!®D!44tçΙ™™222CYÏëׯÓÓÓÓÒÒœœœ\]]…è L)°„qww———·µµµ²²²´´411âþC‹eiiyøðá9sæk ",ËÊÊêàÁƒ"hóæÍ¥¥¥“'O622Ê~o L)°ihhÈÏÏøðannîªU«ÌÍÍ)²wïÞ´´4ŠÇÁÿøã±±±"åÉ“'™™™999yyy<¸pá‚“““HGÑAS ,.üýý/^¼8iÒ$sssssó÷ß„ T`±X666{öì™?>•ã‚Àººº&Ož|üøñY³f‘ÎÂØ¶mÛèÑ£MLLLLL”••I'PÀ”B×ÝÝ]RRRPPPTTôüùó™3gº¹¹õž­¡¡ìgÖü±ÿþÔÔÔ!S*]¼x1000!!tFppðÇŸþŸÒÒRž ²PÀ”B·sçÎ_ýÕØØX_____áÂ…ÖÖÖ¤CõÔÕÕemmýý÷ßÏ;—t„îînKK˃zyy‘ÎÒ¿ÎÎÎ9s晘˜°ÿ"lllH‡’.(`J¡€EçÙ³gÅÿÇÓÓsûöí¤C èçŸމ‰!íÆ_ýuVVý¯ ÝÙÙËÞD.,,¬¯¯ŒŒì=[WWWCCn¹( (`J¡€‡¢²²²¤¤DNNÎÊʪ÷£wïÞ½té’¾¾þ„ Æojjª««K}È¡«¯¯ë­·BCCñ5P1åéééíí½aÃÒA„£¸¸xòäÉ,k„ &L°²²Ú¿?éPL)°bbbÖ®][RRÂd2Ç÷î»ïþë_ÿ"J„¾øâ‹úúúS§N‘zøð¡»»{^^žp¿NÖ›7oJKK‹ŠŠ:::.\Ø{†¢¢¢Ã‡kjjŽ7n„ †††Ôç/(`J¡€¹½xñâôéÓ•••ÕÕÕ%%%ÆÆÆ—.]ê=[}}}yy¹žžž‚‚õ!)–žžîíí““ƒÛÊŠµ-[¶ÔÔÔœ;wŽtêTTT\¾|™ý·\RR2nÜ8žO¿ººúÁƒ:::šššÔç¤0¥¤¤€ëëëãâ⪫«++++++UTTvíÚÕ{¶âââsçÎiiiikk7N___Êÿ ;;;·lÙâëëK: Iss³¥¥åÑ£Gñ-²ÒÓÓ·nÝZQQQUUU__¿téÒ .ôž­¹¹¹¹¹Yâ?PÀ”÷nmmÍÌÌ|ýúu]]Ý«W¯deeyèzþüù† 455555uttŒŒŒxþýï'%%………‘BùÑGegg÷u›Bhooomme2™½ ýàƒØ#K–,Ù±cÏ5 >\|o_¦m ¸³³óÁƒÕÕÕ¯^½’‘‘Ù¼ysïÙJJJÞ{ï=UUUMMMccã7RŸV"¥¥¥Í›7/-- ·”Ÿ}öYeeååË—IWíííÕÕÕUUU#FŒ033ë=Ã… >üðC MMM55µE‹ñüàjkkc±X4<†…¦õÜÖÖþêÕ«úúúúúúîîî={öôž­ººzöìÙcÆŒaÿsܸq[¶l¡2§”«¯¯·µµ=pàÀâÅ‹Ig¡iii±··ÿꫯV®\I:‹Äêêꪮ®®®®®­­ÕÒÒš4iRïyN:õÙgŸ±X,uuuMMÍU«Vñ¼ysuuuCCÃèÑ£GMÍ·ÈPÀ”âËÝÖÖvøðáúúúºººúúú®®.žÿÑnnn^¾|¹††“Éd2™šššŸ~ú©P€°tuu-\¸ÐÀÀ 00t2öÑaaavvv¤³H»¶¶¶W¯^½zõJYYÙÐа÷ çÎÛ³gÏëׯ߼y£  °uëÖ€€€Þ³åää<~üXEE…ÉdŽ=ZKKKMMM°H(`JÉÈÈTVVÖ×׿yóæÍ›7}ú”tp8€‡êêê>ø µµ5>>G¥Í¾}ûôôô\\\~þùç Ž [À=]¿~ÝÊÊÊÒÒòÎ;h_é´víÚÍ›7ûûû¿yó†tLRÀÅÅÅ>>>ì/Ñúøø”””Nb©¤¤ÄÇÇgÛ¶mW®\ùî»ïð#iæää”-''gnn~éÒ%œB' ÜØØèææfccSTTTTTdccãîîÞÜÜL:ˆ“’’’Ï?ÿ|Ê”)VVV999ÎÎΤy£Fúᇮ\¹ràÀ‡›7ovww“’CN÷=zôhzz:÷Í:V¬Xáàà ðq´ôèêêº{÷î/¿ü½jÕª/¿üRKK‹t( ‹uíÚµo¿ý¶¾¾~ݺu¾¾¾cÆŒ! (‚¯!ñãææ¶}ûö9sæp¦Ü¹sçûᅩŒl…(`‰WUUsûöí°°0==½?üpÅŠÊÊʤsÝ%$$œ:u*$$ÄÚÚzîܹîîîÖÖÖâ{Ÿ0?ÚÚÚ999ÚÚÚœ)S¦L)//l…(` ÓÜÜüìÙ³§OŸ>zô('''##£ººÚÅÅeΜ9sçÎåy½Y>ZZZ¢¢¢ÂÃ㣣ËÊÊlll¬­­ÍÍÍMMMŒŒtttHaBó#//ßÔÔ$''Ç™ÒÑÑ1jÔ¨¶¶6ÁVˆ­­­eee £¾¾¾³³óõëׯ_¿®¯¯¯­­eß·±²²²©©I__ßÄÄdÒ¤I“'O¶±±155ÅV EmmmzzzVVV^^ÞãÇŸ={öúõkö]Ë444ÔÔÔØ¬UTTTVV>|øˆ#LLLŒŒŒäååILJþ‰°XâONN®½½{J{{»¼¼|¿ ~óÍ7"yM@‚ˆ¨¼$aSOzvAÓ6Ù…l‚¡m6Úc › p)J~ÌÍͳ³³¹§ää䘙™‘ÊÐ/I(`ooï   î)AAA¸€Ð}·ú®¡¡ÁÊÊÊßßÿ“O>a0'Ož<{ölvv¶’’’`+¤íÎÚc › M0´ÍFÛ` dvA󣬬•ššª§§§§§—––)pûP€¾ÿé ˆ¶ÿ£m0² ÙCÛl´ Æ@6A‰.Û°€€Q¬WÜ͘1ƒtÞhŒl‚B6ÁÐ6mƒ1MP"ÊFßÿtH0I8 vPÀ €@€  @ €0(`PÀ €@ó Ó éDQíííÿûßÿæçç·µµÕÔÔܾ}ÛÚÚz×®]¤s±X,ƒÁ˜9sæýû÷›ššRRR¬¬¬N:E:Ôÿ˜™™}óÍ7>¤É¯²¡¡ÁÈÈhïÞ½µµµµµµ{÷î511ijj"ëèörqÐù=Fç¿M~¦Q„.O•VèóèËáÇW®\É¢wÔ‚‚Ò)X,këÖ­ÝÝÝœ³³³ŒŒæá‰&¿Ê#GŽøúúrOñõõýÏþC*O_hòrqˆÅ{Œƒ>›4üL£ nGÈo Í`0²²²–-[–’’¢¬¬Lç¨ÅÅÅ666¯^½"¤§ææfUUÕ¶¶6ÒAþ&¿J77·íÛ·Ï™3‡3åÎ;ßÿ}dd$ÁT½Ñäåê =ßctûÛ¤çgIp ˜·1cÆÈÉÉéèèøúúæç瓎󷖖??¿³gÏ*++“ÎÒ§7oÞ°‰}òÉ'¤³ðnaaA:MåææZYYqO±´´ÌËË#•GLÑö=FÿM:¦‰¼D½‰-Ž,XÛÒÒRRRrôèQ--­ÌÌLÒ¡þçã?Þ³gçGºý¹ßZ³gÏîìì$¨§ššSSÓØØXÒAz¢É¯RNN®½½{J{{»¼¼<©<}¡ÉËÅ=ßc´ýÛ¤ígE@—§Jg'Ožôðð ‚Åb±BBB\\\¸ÿrèófåVYY¬««»{÷nÒYþ¡¢¢âí·ßŽŠŠ"„šü*QÀCDç÷‹~›âò™ÆMÐô©Rf ;***”””¨LÅÖ;›‘‘Ñ‹/zÌC}0ÖÀ^·¨¨¨ñãÇS™Š­¯l¥¥¥VVVÔGâŒó(õ‘zÓÒÒª¨¨àžR^^>fÌRyúB“—«âï±"õ·Ù}>Óú%Š"öcÀܯŸy¨ŒÄ=nl………úúú=¾—Fä›ÊyÝìì쪪ª¨LÅÆ3ÛË—/½¼¼Ž9âîîN}$>ÁèÆÜÜ<;;›{JNNŽ™™©Óú%Š?[i/à¸|ù²³³3é ßÍ&ÒÑxHHHxë­·H§`0Œªª*OOÏï¾ûÎÍÍtºóöö âž´`ÁRyÄ…x½Çèó·)FŸi")‚m(K77·+W®”——···?{ölß¾}ééé¤sñFŸßàœ9sBBB*++ÛÛÛKKKÏœ93vìØ[·n‘ÎÅb±XS¦L¹xñ"éý É¯²¾¾ÞÀÀ`ß¾}œ q566’ÎÕM^.:¿Çèü·ÙM~³Ô-ž*­DFF.^¼X]]}øðácÇŽ]¹re~~>éP}¢É›•ÅbEEE½óÎ;ì×MGGÇÇÇ'))‰t¨ÿáù_Ϻº:Ò¹X¬>²‘ôüùóE‹)+++++/Z´¨Ç!:²hør±Ñù=Fç¿ÍÞhò ¥¦èò•g©‚cÀ €@€  @ €0(`PÀ €@€  @ €0(`PÀ €@€€¿-]ºô«¯¾âž²mÛ¶wß}—T &Ãb±Hgº¨©©±¶¶ µ¶¶f0™™™žžž999ÚÚÚ¤£HlÀßÔÕÕOž<¹fÍš®®®®®®5kÖ>|í Ø€žV­ZeaaÁb±bbbnÞ¼I:€dB@O•••îîîoÞ¼‰ŠŠ211!@2¡€ §7Μ9óÕ«W<8~ü8é8’ Ç€à""" /^ìï•A:€dÂ0ü­®®ÎÞÞþöíÛFFF #//ÏÛÛ;==]UU•t4Iƒ-`øÛúõë}}}ÙíË`0ÌÌÌ–/_¾~ýz²©$¶€À0(`PÀ €@€ àÿ·jff7MÚIEND®B`‚gsl-2.7.1/doc/images/rand-fdist.png0000644016036000116100000004114213373111455014006 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœíÝy\Uuâÿñs]XYD‘EDEAp#pMÓÌ,5µ,˯––öÓ雥ÔèLÙ7+-[,5GÍ­Òµ4wQpAeUöYÜbô ÷žÏ]^Ï?æ!÷ž{Î[&|óùœÏ9GQSS#yµCD  €0PÀ@  €0PÀ@  €0PÀ@  €0PÀ@  €0PÀ@‚)Tipcccc{{ûÁƒðÁiiil£Æljß§Ú÷è( ¯æ! n\ZZzåÊ•üãÅÅŽ{÷Þ¹sçcQÎ ¤n•õÿ¨Ð4…â1~ Un|éÒ¥áÇ=zÔÇÇGmÂöêú, Ç:¯W¯^ ,Xµj•òËÚgqqñâÅ‹===Û´icii9|øð}ûöÕnðÀt·B¡¸wïÞ¼yóìííUÎ<—––Ξ=»}ûöfff£GŽ‹‹«}Kå·ö(*U»ÙÞ½{ûõëgfffffÖ¯_¿°°°º{¨ªªZ¾|y§NŒ»téòå—_6ï[h Ð&LøóÏ?xñÅ_¬¬¬<|øpaaabbâ›o¾¹fÍI’”ãч§»_ýõ$$$¨°Îš5«[·n±±±7oÞ5jTHHÈ­[· ö¨c)>}ú¥—^š?~RRRbbâo¼1}úôsçÎÕn0wîÜ{÷î>|8//oݺuŸ}öÙöíÛûM´ÜÃ'ŸÈé±~*õî½{÷LMMØÆÜܼ°°°‘û‘$iÕªUÚL’¤?ü°î[|ðÁôéÓëIU÷³zëé§Ÿþꫯ꾵fÍšgžy¦v³÷ß¿î»aaa}ûöUù7tçfÁšX’¤ÒÒR[[Û»wïÖݦoß¾¾¾¾Ë–-ëØ±cƒûQ(‰‰‰:uR¹™B¡¸yófçÎkߺyóæOðå°aÔîҥ˩S§ê¾»~ýúÚ?×s,??¿½{÷Ö}å·ß~óóó{¬`€Ž¢€TUU•ŸŸ¹hÑ¢áÇýõ×ÞÞÞl3hР͛7§¥¥UVVfdd¬ZµjРAÊ·ÜÝÝ÷ïß_UUÕø#^¹reÍš5™™™™™™kÖ¬ùꫯ–.]ª|kÁ‚óçÏ?~üxiiéÍ›7ÿ÷ÿ7''§öƒõkÑ¢Eï½÷ÞÖ­[³³³³³³·nݺtéÒwÞyçñ¾€Ž’uÉ€‡<ÖaíO®‘‘‘­­íO<š––¦r‡GŽ™8q¢‰‰‰‡‡Çßþö·‚‚å[ðôôlÙ²¥ôèµÊ5ÿ½’¹¤¤ä•W^±¶¶nÓ¦ÍÈ‘#cbbên¹fÍOOÏÖ­[;;;ðÁ•••µŸ­ÿX¿þúk@@€©©©©©i@@€òDuc"ºŽUÐÀ4PÀ@  €0PÀ@  €0PÀ@  €0PÀ@  €zRÀQQQsçε²²R(¢³Ð0=)àéÓ§ÛÙÙEFFŠ@£(jjjDgP'…BßþF½¤'#`t  €0"Ôè—Çú-[¶Lå÷ÄÄÄDÞÿÚKC…¥oK–Ô²«™;ÉÌÌìÙ³gfff3c„ÓÜÚ^ Xý;©®®nÓ¦MQQ‘‘‘Q3“ÄÒ\sXýZ´háààpûömÑAÚ‹Ö—””Ñ)Ú«•èêQ÷”µ8»Nê§'¬mg²)`@ý˜‚Ö—ÔÔTÑ)Ú‹ÖFÀ€úQÀAê§o׫Eó¯ú*..vtt,..VW$€\¬cÚ¶mÛªU«üü|ÑA誨¨¨¹sçZYYÕ½ÊChm0Ck ³Ðšcúôévvv‘‘‘¢ƒªºêH»¦ƒ=kÖ,777###GGÇaÆýüóÏ¢CI’$;vìù矷µµµ´´ìׯßîÝ»E'Òa°f¹¹¹ÝºuKt :fþüù½{÷>xð`IIIllìâÅ‹—/_¾lÙ2ѹ¤ÁƒgggïÞ½;==}Íš5¡¡¡ßÿ½èPºŠEX*¨ñ”û/¿ü²iÓ&~IÐL7oÞìÓ§O~~¾Ø‹-Z¹reíµL111Ï<óÌ7ĦÒ(aé*OOÏ„„Ñ)¨ŸÏÉ“'k¿¼wïž——צM›4t¸Ö­[·lÙRx°O>ù¤î•Ä©©©jÙ³¢€5ËÃÃ#11±ªªJtjöÀ3wMMM—-[¶}ûvµ¨°°PyæuΜ9ZL’¤tïÞ]{6LA« Þ ggç'N¸ººªk‡´AÝgî*_ÉËËëÒ¥KNNNýlücwën9|øð4f,C°ÚÝ0`ݺuO<ñDƒ©tSÐ:ŒYh@/Õ>s·ö•òòòÚ‡ÛK~RPM½Þ233sëÖ­qqq+V¬h~°ƒ†„„˜šš:::Κ5+77· Á$IÊÌÌœ0aÂ×_ÝÈö UÔ*çfÚ@°ú¿ã†I½ß–×^{míÚµjÜ!-±lÙ²·Þz«öË+Vøùù=°ºþ=‰ˆˆpvvn~°áÇïß¿¿¸¸833söìÙcÆŒiB˜´´4__ßÇ7á³:GsEI« Þo÷Ê•+,X ÆÐ±±±NNNÕÕÕ555çÏŸoӦ͆ ØæáOš6(***266Vc0å>ÍÌÌ7ØíÛ·{ôèÞÈ0ºNsÌÃ4ÎÓÓóرc¢SP¿ÚÉ^ssóqãÆ=úÅ_lðS5M:¡xòäI///õ‹ˆˆx¬`YYY£Fú裂ƒƒ¤¡b×iêý¶ÄÆÆzyy©q‡´Ç²eËhfftïÞ½‡7hÚ¿'#FŒØ½{wfffyyyZZÚúõë;vì¸ÿþÆï¶Á`QQQnnn×®]{¬`½{÷þé§Ÿë#ºNsEI« ÞowYY™‰‰Iee¥÷ @KÄÆÆJ’4mÚ´ÒÒR•4íß“ˆˆˆgžyÆÆÆ¦U«V:t˜8qâéÓ§kßÍÍÍm×®]s‚9rÄÅÅåÌ™3Lå@.??ÿq÷£C4WÀ\†¤‚Ú»ºº=zÔÍÍMû 4qËš5k®_¿¾fÍš¦}|ûöí .üí·ßüýýÕL/q’nëÚµëõë×E§ 'Ö¯_ÿòË/7í³«V­Z¼xqxx8í+#`Ôþûμyó<<<Þ|óM5{à `-ùÇöáë’‹‹‹ÍÍÍ…„Ñ š³ Z^^^qqq¢S•–4î´3•ab Z^^^W¯^ E(`9PÀ€PÀrèØ±ãÝ»w…?È =(`™tíÚõÚµk¢S´,ooof¡µ(`™0ÔEË„uX€º(`™xyy]¹rEt €¶àNX*hâ¾'åååVVVFFFêÝ3@s¸´Î322ruuMHH (`ùøøøpCJ€,ŸnݺÅÇÇ‹NÐ °|(`@- X>0 « UÐК·û÷ï[[[³t« õ±±±‹‹Ë7DˆGËŠYh€,+®D(QÀ²êÖ­ (`™õìÙ3&&Ft €x¬‚VAskÞ*++---333ÍÍÍ5±€z± ZO´jÕª[·n±±±¢ƒ£€åæëë{éÒ%Ñ)‚QÀróõõŽŽ ,·^½z1°KÍr—$©¨¨¨cÇŽ………-ZðÛh;aé ;;»„„ÑA"QÀôêÕ‹ÓÀ`à(`zõêuñâEÑ)"QÀøûûŸ?^t €H,ÂRA£‹°$IÊÌÌôööÎÍÍU(š;  ùX„¥WìííÛ´i“””$:@ X ÿ .ˆN†ƒG‹Ñ§OÖa€!c– š^„%± t‹°ô ë°ÀÀQÀž;wNt €°00, X  ‹°Ta–$I………NNNùùù­ZµÒô±MÃ",=diiÙ±cÇ«W¯Š€)00ðìÙ³¢S €Eâ40, X$FÀ`°X„¥‚<‹°$Iºÿ¾Mff¦™™™ ‡<.aé'ccc__ß3gΈ,ØÀ###E§ÈlàÀ'Ož 7Ϋ Û9`I’rrr<<}ºèh óŒ€ÓÒÒ^}õUGGÇ­[·2$,,,======,,lðàÁ[¶lqttœ5kVZZš&b¡ñìíí'L˜P;êussûã?þö·¿íÞ½[l0@=Y즦¦nnn«V­5j”Ê 8ðöÛo'&&Þ»wO“ Э°$IW¯^2dHbb¢©©©ò•¨¨¨Ñ£GÿñǾ¾¾b³€NÓ\#|îܹµ¯ÄÇÇwíÚµeË–S€®PÀ†L øìÙ³“'O¾~ýz«V­DgýÁ*hm‘ŸŸŸšš*:… ÎÎλvíÐ( ð¤I“”ëŸëÊÏÏŸ2eŠf"iµÝ»w/Y²Dt Õ/^¼råJ»€aj¸€ÝÜÜzöì¹yóæÚW:äïïo˜w~ˆíÞ½»èª3¦U«V{÷îа† xåÊ•øì³ÏÆŽ›0þüåË—‡……-_¾\£ÉRRR&Nœhaaaaa1qâÄú'~ÑP*m.`I’–,Yú¨Að7nß¾-s$€J:Ü»woå݃ƒƒ{ôèqôèQoooÆ*)) öóóKNNNNNöóó )--­ç#5ÿMCÁbcc{ôè¡¡7ßøñãëݽ{·uëÖµ¯TTT˜››ß¿¿1ÿúë¯÷ìÙsðàÁú7 ýàƒT¾¥ß–Æ;wîܤI“®]»¦%Mep·¢´··‰‰±··¯}%##£wïÞéééùxff¦»»{IIIÓŽ®‹·¢|ØøñãCBBæÏŸ/:è0·¢œ9sfý—ýH’TZZ:sæLuG’$Iòññ‰ŽŽ®ûJLLL·nÝùq=¨Ïæ[¾|ùG}ÔäßBõÈÞ¶m[@@ÀáǵÁ¡C‡¶mÛ¦‰XcÇŽ}àæ¦M›Æ×ÈïØ±càÀÈ¥Kzôè1lذO>ù¤1WUUUTTh:à/Z•’’2sæL##£Aƒ­]»öÊ•+EEEEEEñññ_}õUPP±±ñË/¿œ’’¢‰µaEEEnnn+V¬ÈËËËËË[¾|¹rJ¹vƒºÉƒƒƒwîÜ™žž^^^~ëÖ­+V´oßþÂ… M>ºÊoËõë×Ï;×ä} ‘––fccÓ˜ÿ>ÿüóñãÇß¿_†T Cê)Êfj`j;;;{ëÖ­G޹xñbvv¶$IvvvÊûRMž<ÙÆÆFs¿$%%-X° <<\’¤Ï?ÿÜÕÕµöݺ“ò_~ùå±cÇ íí탃ƒ—,YÒµk×&ZåŒÿÊ•+³²²þïÿþ¯É»âÝwßÍÈÈX¿~}ý›UTT<÷Üsååå¿üò ë¶ –Á-ÂKå·{Μ9Ý»wýõ×…Dj²¢¢"//¯½{÷úûû׿% ãyÀâݺuK¯µ°°X¾|ù¼yóü¨uëÖÛ·o722ªçÄ?@]UÀ7nܘ1c†££cëÖ­g̘qëÖ-M'Ó6:ZÀ’$½ôÒK•••[¶lipK##£_~ùe̘12¤×p_¾|9((ÈÓÓóøñãEEEÇ÷ðð0`@\\œ ù´ÇðáÃ;uê$:ES´hÑbõêÕï¼óNQQQƒkù®@o4<µ=jÔ¨1cÆÌ›7¯î‹_|ñÅÁƒ8 ÉlÂèÇ80kÖ¬¶mÛ~öÙg¢ƒ€.¹ËÌÌìÖ­[uoJ%IRFF†»»ûÝ»w5‘I8½,àœœŸC‡õìÙStÐ"a=jA¬©©©ºÃ@ƒÚ·o¿|ùò×_½ ÿ%UWWk"²† ø™gžÙ±cÇ/nß¾}âĉš‰Myå•Wªªªõ”¤GIHHð÷÷¿s玆R€ajxd}÷îÝ×^{ÍÛÛ{êÔ©ŽŽŽwîÜÙ²eË•+W¾ÿþû6mÚÈ“Rfz9­5vìØË—/?ÖMT>ùä“o¾ùæðáÃnnnšËZHä9àÆ,‹Õ³ºÒã–$iáÂ…¹¹¹?þøãc}ê›o¾ùÇ?þqðàÁÆ?ôwÂ’•~piiiÏž=?ûì³§žzê±>¸eË–½{÷jèñ (`Y=üíþâ‹/æÍ›×¢…žÜ8,<<ü•W^‰‰‰±°°x¬ÖÔÔp¡0ƒBËêowQQ‘³³saa¡ÀHj7gΜÊÊÊuëÖ‰Z{A‹tûöíŽ;Š»¾R IDATN¡fŸ|òIxxøÁƒEE7L/ ØÜÜü‡~xíµ× DgCD7ìÎ;ŽŽŽ¢S¨ßСCŸzê©… 6g'ùùùܦš€n˜§§ç¤I“D§Ðˆ?þøèÑ£aaaMÞÃûï¿ÿüóÏ—••©1a© ß—!= 22rÒ¤IQQQMøøýû÷_z饴´´Ý»w?ÖÍ=@'° š2pàÀW_}uæÌ™Mû/ÌØØxëÖ­O<ñDÿþýÔô• õÏ FÀ’$UVV2düøñ‹-jòN6lØÐ½{÷€€5á¸XV†VÀ’$¥¥¥ìÚµkàÀ¢³€a šåääôÝwßM›6-??_t07Ôk +-X°àÆ¿ýö÷›%FÀÃÇœ‘‘±fÍÑA@ÿQÀ ¸|ùòöíÛE§‰‘‘Ñ®]»þùÏ?~\-;\¾|ùÕ«WÕ²+Ð3pNŸ>}èÐ!Ñ)äãêêúÃ?¼ð ™™™Íß›““ÓàÁƒÿý÷æï ô Ü€œœœöíÛ‹N!«'Ÿ|ò•W^™8qbyyy3wõÒK/ýüóÏ3gÎüôÓOÕ’ ôÜ€ÜÜ\C+`I’–.]jooÿÆo4WAAA§OŸÞ¶mã`¨‹n@NNŽÞaQ¡Püøã§OŸ^»vmó÷æââ9räÈæï ôF+Ñ´ÝÓO?ííí-:…æææ»wï8p`÷îÝ Ô̽©%è ½àµ~{ðÃÂÃçOŸ~üøqwwwÑY@®†!!!|ðÁ˜1c¸C¨Œ¼úê«ãÆ›0aÂýû÷Õ»çß~ûíÒ¥KêÝ'è  ûè£ìíí›üÈÂG)//1bÄ÷߯Æ}€®àd§ œ~XYYÙˆ#úõë·råJ5îöêÕ«Ï>û¬¿¿ÿÚµkÍÌÌÔ¸gP ÎC0“={öìß¿ÿóÏ?Wãn½¼¼Îž=Û²eË?üP»íÇPOFÀ’šš´bÅŠiÓ¦©wÏ•••­ZqQ­ÃXŒsçÎmÙ²Et -âìì|ðàÁE‹………©wÏ´/CC×çüùóêz.ÞðööÞ³gÏË/¿|ôèQÑY@‡QÀõ1À'14F``àöíÛŸþù3gΈÎºŠ®Onn®Þº1† ²qãÆñãÇGEEièÉÉÉ£FJJJÒÐþ@, ¸>Œ€ë1zôèo¿ýv̘1º™†‹‹ËðáÃÿõ¯ibÿ Ë}U¨]óvàÀOOOщ´×/¿üò?ÿó?û÷ïïÓ§&ö=mÚ4//¯ï¾ûÎÚÚZ‡€zhn4¬—!=–Ÿþù7Þ óóóÓÄþïß¿ÿé§Ÿ¾ùæ›Ü©€ü(`YQÀkÏž=³gÏÞ³gOß¾}EguÒ\#pñ%Ô`üøñ­[·7nÜÏ?ÿ$:èaA=ž|òÉ-[¶Lœ81<<\tÐ0Ôfذa?ÿüó /¼°sçN·wï^š@C‚‚‚:´páÂÕ«WkúX¥¥¥o¿ýö”)S²²²4},P; jÖ£G'N|ûí·‹-ÒèZ¶€€€èèh—ž={nذust üHׯ_ÿôÓOE§ÐI®®®'Nœ8uêÔ‹/¾XQQ¡¹™šš~üñÇ¿ÿþ{xxxyy¹æjG?RBBBDD„èºÊÚÚúСCO=õTQQ‘Fåëë»yófcccÔ‹~¤âââ¶mÛŠN¡ÃLMMýõWOOÏ   né  €©¸¸ØÂÂBt ÝÖ²eË5kÖÌš5kÀ€'Nœ´üHÅÅÅæææ¢SèƒùóçoذáÙgŸ]¿~½œÇ=wîÜêÕ««ªªä<(4üHC‡2eŠèzbäÈ‘þùçǼ`Á‚ÊÊJyjeeµgÏž€€€cÇŽÉsDh}Ö­[gee%ÏAè Í5#`ÈÇÊÊjß¾} èÓ§Ï™3gä9èsÏ=Ì’:Z…¡ž Œ€5mß¾}³fÍzï½÷Þxã ÑY ><ŽPV° nݺ5iÒ¤.]º¬[·ŽÅn´SÐÐ7;wŽŒŒ477ˆ‹‹ãÎ;¢ ÀÀQÀÆÄÄdݺuÿû¿ÿ;tèеk×Ê?ë™™Ù»wï×_=33SæC Áf̘qöìÙ­[·Ž5*==]ÎCÛÛÛÇÇÇûøø,Y²$??_Σ0pð#½ýöÛÅÅÅ¢S„N:9rÄßß? àðáÃrÚÆÆfÕªU/^ÌÉÉ “óÐ «TPžr733ËÊÊ233Ç€9rdƌӦM åá ´‹°äVUUuÿþý6mÚˆbX†•àïïöìYÑq@ƒ(`ÕJJJÌÌÌ …è ÇÖÖv×®]K—.?~üû￯ÑÇ 7FNNŽl÷Î`P(`Õx¡XÏ=÷ÜÅ‹£££cbb&Y»v­——ׯ©aêE«feeõé§ŸŠNaÐ~ûí·7ß|søðáK—.-++céÒ¥7nÜ´i“ϦM›¨aêÂ",¸–VIOOóÍ7£££¿ù曡C‡ŠŠqäÈ‘ï¾ûîÇ422•€ü¸¥¬(`-´oß¾yóæ 2dÕªUÖÖÖ¢ã0¬‚†¡;vìåË—-,,ºwï¾uëV~C ëê©ÀX›>}úõ×_oÛ¶íW_}åãã#:Ž$IÒ?ü0dÈwwwÑA¨#`àßúõëwöìÙçž{.88øí·ß.**HJMMíß¿ÿ¤I“¸v@ãQÀÐ=-[¶œ;wnlllQQ‘··÷† ª««æ MLLü‰'žX¸pann®èP:{ö¬ØyrÚ†V[Qê##£·Þz+66¶¬¬ÌÛÛûÿøGII‰èPÿVYY¹`Á‚.]º¬Zµ*//OtZVÖQvvvk×®ŒŒŒ÷ððøüóÏïß¿/:”ÔªU«ÈÈÈ-[¶DGG{xx¼ûVíÞ½{¦¦¦¢S ‰<==7oÞ~ôèÑ.]º¬[·NøS•$IêÛ·ï?þxýúõ±cÇŠÎ@<a© P(<Ø«W/{{{ÑYÐ\gΜyÿý÷oÞ¼¹lÙ²^x¡eË–¢Ð%¬‚–—!éŸcÇŽ½÷Þ{YYYï½÷Þ”)S´³†ÃÂÂhee%:€¿° h–Aƒ;vlíÚµëÖ­óòòúá‡ÊËËE‡ú/ÕÕÕ[·nuss›qâ„è8˜‚–l._¾¼|ùò?ÿüsÞ¼ysæÌi×®èDÿ%//OÛ"†‰)h@Ízôè±}ûö#GŽ$&&zzz¾ù曉‰‰¢Cý…öô ƒæííýý÷ßÇÆÆ¶iÓ&00p„ GŽª>3gΜ={ö±cǘ¤ts­*0m˜îÞ½»yóæÕ«WÍŸ?Ê”)&&&¢C=(55õ§Ÿ~Ú¼ysIIÉ´iÓÞyç6mÚˆè3¦ å6gΜÒÒRÑ) +33³Ù³gÇÆÆ~ôÑG»víruu]²dIZZšè\ÿÅÙÙyñâÅ111¿üò‹$IZø+€Fb¨§‚B¡hÛ¶ííÛ·¹¥!KHHøòË/·lÙ2bĈ7ÞxcÀ€¢€UвR(¦¦¦¹¹¹ÜEEEëׯÿæ›oZ·nýꫯNŸ>ÝÚÚZt¨>|øÔ©SÏ?ÿpàÀÕ«W–/_îèè8{öìðððÊÊJÑéçŸ~Ú¡C‡_|qÇŽ999¢ãz…¡ž Œ€¡v)));vìØ¹sç­[·ž~úéÉ“'2¤eË–¢s5,%%%,,ìÀÇŽÛ±cLj#D'dÅ´¬(`hNJJÊÎ;wìØqëÖ­±cÇN˜0aĈ:qKçÊÊÊšš]œHšƒ–•B¡xçwþùÏŠ}–––¶{÷î_~ù%**jĈO?ýô“O>iee%:×c«®®ž6mZÿþýƒƒƒ}||DÇÔŒ–•B¡èÝ»wTT”è 0999{÷îݽ{÷Ñ£Gýüüž|òÉgžyÆÝÝ]t®Æª¨¨ØµkWDDÄ‘#GJJJÆ÷Ýw߉¨ ,+…BxæÌÑA`XJKK=ª,ãöíÛ=zôèÑAAA:4뛜œ|íÚ5ÎCŸPÀ²R(|8$$Dtà/UUUgΜٿÿþýû“““>>ÊañÀµü*•––ž?> @ÃCŸPÀ²¢€¡ëÊÊÊN:uäÈ‘ˆˆˆèèhÿ   AƒµiÓFtºæ*++ëÓ§ÿôêÕËÌÌLt(è- XV0ôIqqqdd¤²£¢¢zöì9`À€   þýûÛÛÛ‹N×ÕÕÕñññ§OŸŽŠŠŠŠŠÊÏÏ¿víšèPÐ[°¬(`è«{÷î={öøñã§N:uê”ÍÀŸxâ‰xyy) Ñ›¢¦¦FeòìììË—/ûûû[ZZÊŸ zƒ– CPSSâĉÈÈÈÈÈÈ‚‚‚þýû80((ÈÏÏO&u/^¼øÖ[o]ºt©}ûö=zô˜0a‹/¾(:t,+…B±iÓ¦éÓ§‹È'##ãÔ©SÇ?yòäåË—ÝÜÜ п??¿îÝ»ëª««oÞ¼ݦM›'Ÿ|Rtè XV …â­·Þúì³ÏDĨ¨¨ˆ‰‰9yòä™3g¢¢¢n߾ݷo߀€ÿ>}ú¸¸¸ˆ¨Nüñ¶mÛºÿG`` \N 5¢€e¥P(-Z´råJÑA­——wòäÉóçÏGEE]¸p¡¢¢BYÆÊ>îØ±£è€ÍrïÞ½øøøË—/ÇÅÅ]¾|yúôé/¼ð‚èPÐ"°¬ ŻᄏbÅ ÑAmtçÎsçÎ)ûXùÔÎ>}úÔ^¤ÓOŒ¨ÇG}”‘‘áããÓ£GnݺYXXˆN™PÀ²R(Ë–- ÐiiiçÏŸ?þü… .\¸Ðºuë>}ú(Ï÷êÕK‡l\¿S§N>þàÁƒAAA¢CA°¬ E\\\·nÝDtOrròùóç/^¼wñâÅ¢¢¢=zôìÙÓßßß××·[·nÆÆÆ¢36WMMMuuµÊ…i+V¬011ñòòêÞ½»«««üÙ v°¬¸ P—œœœ˜˜˜˜˜˜¨¨¨K—.ݸqÃÕÕµGÝ»wWN纻»ëî뇭_¿þòåËW®\‰ÍÏÏOII±±± ÍBËŠ4¤¢¢âÚµk±±±—/_V.}JOO÷öö®ícgggÑ1Õ£¸¸ØÜÜüᛄÔÔÔÌž=»sçΞžžzpÕµ£€eE²¹{÷®rù±òôjllì½{÷j/ êÖ­[×®]EÇT§ŠŠŠ7&$$ܸq#!!!;;;##Ct(<,+ (77·ö¢ øøøk×®•••ùøø(+¹K—.žžžnnn-Z´T³nß¾=cÆ å(ÙÓÓ³k×®^^^¢C" XV0 Uòóóccc••œ 5zyyyxxxxxtéÒÅÇǧ[·nzöàÂÒÒÒÈÈHå(9!!ÁÜÜü§Ÿ~zx³ÊÊJ…B¡Oçѵ ,+ ÐrEEEW¯^U–Óõë×ããã¯^½jkk«<¥êùîîîz°èº~þùçˆ#•ßp]õ¢€eE:§ªª*55µöÄêõë×RRRìíí=ëðððèܹ³‘‘‘è¼êTQQ‘’’’˜˜Ø®]»çŸþámnÞ¼yîÜ9ggg777=;§®i°¬ Å©S§úõë':€f©ªªJNNVNá^¿~ýÆ7nÜHMMUŽ•ceww÷N:¹ºº¶mÛVt^ ŠŒŒ\½zujjê­[·Š‹‹.\ø÷¿ÿ]t(Ý@ËJ¡Püúë¯O?ý´è Ô¯¢¢")))á?“““Û¶m«låN:uêÔI9VvppÐÑÇ$×£¸¸øþýûíÛ·ø­uëÖ­[·ÎÙÙÙÙÙÙÕÕuðàÁ~~~ò'Ô*°¬ ž}ûÆŒ#:ùܾ}[9DNII¹uëÖ7’““sss]]]===;uêäâââîîÞ¹sg''';;;Ñy5"??ÿúõëiii©©©ÉÉɃ š0aÂÛEEE¥§§ÛÚÚvìØÑÁÁA¿—€QÀ²R(¿ÿþûˆ#D XyyùÍ›7•­œœœ|ãÆÄÄÄ´´´»wﺸ¸(‡‰ÊË¢”vppÐûë£$IÚ²eËÖ­[333ÓÓÓsrr¾üòËW_}õáÍ***Z·n-<õ¢€e¥P("""†*:-uïÞ½¤¤¤ÔÔÔ¤¤$e+§¦¦¦¤¤äæævèÐAYÆÊ‰\eU[[[‹N­UUU&&&¿5{öìmÛ¶)¿ sçÎíÓ§ü ›‰–•B¡ÈÊÊâ¡ÜWyyù;w”Åœšššššš–––œœœššZYY©lb'''—N:999)KZe{é‡ÂÂBålvzzzPPÊ{‰,_¾üÚµkNNN;v´µµ2dˆ½½½üQ…–—!P»âââ””e+§ü‡òl«‰‰I‡”}¬,:88tìØÑÙÙÙÁÁAtp;þü•+WRSSïܹ“™™ùÎ;ïøûû?¼Ù¯¿þZTTdkkkÿòÌoSÀ²¢€È)///33S9\NII¹sçNVVVZZZZZZAAA‡:tèàââ¢\÷ääääèèhkkkPu_|ñÅ… rrrÒÓÓ³³³wíÚ¥òbѳg϶jÕÊÎÎÎÖÖV-·a¡€eEÐeee·oßV.wJKKËÈÈHOOOMMMOOÏÊʺ{÷nÇŽ•ÃA'''[[ÛöíÛ+ÇÓúºT»~sæÌ9uêTvvvvv¶™™ÙÉ“'½½½Þ,))ÉÜÜ\åµX €eEÐ eee©©©™™™™™™)))·oßVOzzúíÛ· •£ä:(ÿààà`ooïêêªìl+++ÑÍÊÍ͵°°P9S=bĈóçÏZZZÚØØDDD¨|fZZš³³3, €(++ËÉÉQÖsvvvVVVFFFVVVrr²rH]^^^[̵Uݾ}{[[[åwûöíõûfÚUUUEEEÙÙÙnnn*{:00ðܹs°|(`† ¬¬,;;;333++KùeU+ϳ*_455U íìììíí•=­@+ÿlaa¡g÷Ö~Sв¢€@)??¿¶ž322”SÜÊ‘tNNNNNNaa¡‘‘‘ƒƒƒrÝ“µµu»ví”%­lnsssÑ•&¢€e¥P( -,,DP\\¬\™¬ìéüüü‚‚‚ìÿP¶uee¥¥¥¥rZÛÊÊÊÊʪvÆÛÚÚZù–ާ)`Y)Šüü|½_ž²¹ÿ~aa¡²’ •kåŒwAA²°kÇÓ¶¶¶666VVVvvvíÚµ³°°PNw+›[y–ÚÒÒ²U«V2$§€e¥P(JJJÌÌÌDƒS\\œ••UPP—————§\'õpU›˜˜(»¹vݶm[[[ÛvíÚYZZZü‡­­m“o7FËJ¡PÜ¿_Û¦Au•””ÔíæÂÂÂââ✜œìììüüü¢ÿÈÎÎ622²²²²°°P³¥¥¥¥¥¥µµuí ÛÒÒÒÊʪ¶¶k ›–•B¡¨ªª2„Gš€(***(((**R³òkÛZùJaa¡r›¢¢"I’”e|ãÆ X>¬‚WVV¦,é.]ºPÀò¡€JškfY€@ (` €€@ øAiii¢#ôü ÜÜ\Ñú~Pee¥èýG?¨¢¢Bt€þ£€Dd@?ÈËËKt€þã©*ð0€c@¯PÀ@  €0èI§¤¤Lœ8ÑÂÂÂÂÂbâĉ©©©¢P}(à’’’àà`??¿äääääd??¿ÒÒÒ¦íí?þPo<¦¼nݺ~ýú-Y²ÄÚÚÚÚÚzÉ’%ßÿ}ÓövõêUõÆàaúPÀ{÷î1cFÝWf̘±gÏž¦í‡1d çëë[÷•ž={ÆÇÇ7moÜ  }(àüüüvíÚÕ}ÅÆÆ&//¯i{£€2h%:€H¡¡¡|ðÊ· …ÌaEž:`oocoo_ûJFFFïÞ½ÓÓÓ›¶CÆHü ’$ñ0†úùøøDGG×}%&&¦[·n¢òÐ }(à±cÇnÚ´©î+›6m7nœ¨<4H¦˜Š‹‹}}}gÍš5gÎI’Ö®]»aÆèèh33³¦í™7@â$‰)èúµmÛ6""âܹs®®®®®®çÏŸorû ~ÃU_ü‰@’$Mþ ´ ÕÄ~uÝ!CDGÄã4öƒÀo¸ ç€Ð90PÀ@  €0PÀ@  €0PÀ@ÿ%%%eâĉ'NLMM **jîܹVVV …Bt@ŒcÇŽ=ÿüó¶¶¶–––ýúõÛ½{·&ŽBÿ[IIIpp°ŸŸ_rrrrr²ŸŸ_HHHii©è\€Ü¦OŸngg): ÌàÁƒ³³³wïÞžž¾fÍšÐÐÐï¿ÿ^íGáiHÿöÙgŸ]¸paóæÍµ¯L›6-00pþüùSñ<`¬E‹­\¹²v(&&æ™gž¹qã†zÂøßöîÝ;cÆŒº¯Ì˜1cÏž=¢òDùä“Oêž‚ñððÐÄII øßâââ|}}ë¾Ò³gÏøøxQyZâÀÝ»wWûn™bú7##£»wï¶nݺö•ŠŠ ssóû÷ï LÄ4 IR^^Þ€Ö­[÷ÄO¨wÏŒ€P-33s„ _ýµÚÛW¢€kY[[çååÕ}%77·]»v¢òĺ}ûöÈ‘#—.]:tèPMìŸþ7Ÿèè躯ÄÄÄtëÖMT€@wîÜ=zôªU«BBB4t øßÆŽ»iÓ¦º¯lÚ´iܸq¢òDÉÊÊ5jÔG}¬¹£°Èâߊ‹‹}}}gÍš5ÓŸÿIDATgÎI’Ö®]»aÆèèh333ÑÑ1X„ƒåçç·xñâÉ“'kô(ü€ý%))iÁ‚ááá’$…„„|þùç®®®¢CrSyJþ¡€AQùSŸŸoee¥Î£ðs€ü8 €0PÀ@  €0PÀ@  €0PÀ@  €0PÀ@  €0PÀ@øËóÏ?ÿ·¿ý­î+‹/~öÙgEåô˜¢¦¦FtÚ"77·W¯^{÷îíÕ«—$I/^5jTLLŒ½½½èh€¾a à/666k×®}õÕW«ªªªªª^}õÕO?ý”ö40€Íœ9³{÷î555GÝ·oŸè8€~¢€<(333$$¤°°0""ÂÓÓSt@?QÀ4þü¡C‡æää\¾|yõêÕ¢ãú‰sÀþËáÇoÞ¼9a„Y³f]ºtéðáâú‰0€¿äççüþûïîîî’$ÅÇÇ;öÂ… ÖÖÖ¢£ú†0€¿Ì;÷…^P¶¯$Iݺu›:uêܹsŦô#`` €0PÀ@  €0ü›C&KõÒIEND®B`‚gsl-2.7.1/doc/images/rand-flat.png0000644016036000116100000002411013373111455013617 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœíÝTTuþÇñ;¿ÄQÜVIÐDSÁPÊ5 4a5ŽJeIbæÉŒ´MksS`µÚLtEtÏÑ#{XS“Ý„%£ÝD m›¡H¢1@ ‚#ß?¦ï4 Ã0À Ÿ;×çãó¹÷~î{î½3¯¹Ÿ¹ÜQµ¶¶J wÝ'ºîE0À@  €0À@  €0À@  €0À@  €0À@  €0ÐKTÆè'Y°µZ’påÊ•6óô|Emº²`Ÿï 3è=­í˜¿¬9ɤ볡¡áìÙ³ï¿ÿ~]]]@@@zzz—ŠìÍ$nq/Sué-@·©T¾ÜLL2£3LŸ>ýÈ‘#£Gîy™ßR˶Ž3`@^®^½ºlÙ2WWWŸU«V555Iÿ¦ØfàÚãÇ_±bERR’î¡~ÙºººU«Vùùù9;;÷ë×oúôéŸþyG+R©T¯¿þºZ­6:òÜÐаdÉ’¸¸¸DDDé'­V¿£ëÒÏ–••ìâââââ|ðàAôZíºuë† æàà0bĈ­[·š¿Y9 €y™|ø_|aΈ´V«­©©9vìØÊ•+§OŸ¾}ûöQ£Fµ™çñÇß½{÷•+Wîܹ£Ñh’’’üñ®®HïìÙ³ÉÉÉÉÉÉ)))kÖ¬ÑMZ±bE\\ÜÑ£GJJJ~ÿûßÿôÓOæ<©•+WþáسgOUUUUUÕž={Ö¬YóÎ;ï˜_ w.üîI&^núIׯ_ŽŽöððpww_´hQ]]~Rvv¶ŸŸ_Ÿ>}:êGÿ¢¶··÷òòš2eJ||ü•+WŒ®(777**ÊÓÓÓÑÑÑ××÷í·ß®­­íhEF×h8µ¾¾þå—_îß¿¿³³óŒ3 çLNNöóó³³³{àîܹcâI®ëÀAAANNNNNNAAAº/ªÍ) ° ܆‚@` €€@` €€@` €€@` €@!|âĉ¥K—º»»«T*ѵÐ9…ð‚ xìØ1Ñ…`Ukk«è,I¥RÚ3(’B΀°-0ÀˆÐª,]zFk×®5ºM{w'äËJ¥´K–,rWrt¬— A  €0Ü/ºË0¼¥þÿ| -…0Y °- A  €0À@€Õ]ºt)**ÊÍÍÍÍÍ-**êòåË&fVµcbΞז——7oÞ]RRváÂ….•×Fvvö˜1cLÏc~y0ÅJ?shÓØ,:R]]ýàƒêšókgg×ÜÜlØIss³½½}G«ˆŒŒÌËËkll¼|ùò¦M›xòäI£sJ’”˜˜hØ’°`Á‚.•gèúõë#GŽÌËË3±Ì/O¬—$0½ÆÆÆ„„„‘#G:99ér«OŸ>]ê¡«ÜÆ¶mÛf̘at’$I%%%†-çÏŸø`Ĉ...MMMNNN]z‹P«Õ………jµZߢÑhÊËËÍY¼¢¢bøðáõõõí'©TªÆÆFGGG}Kcc£››[KK‹ùåé\½zuæÌ™7n ëÒ‚&ÊS.Â1ÒÓÓwîÜàââ"IR›oXÛÿQlû?=zô©S§ —*,,ô÷÷7³Óïþ×®]kóÐËË«Kåé–ŠˆˆHJJêjúvZL €À”6§˜©©©†S;½”$iÖ¬Yiii†K¥¥¥EFFšYÀþýû'OžÜÑÔ={ö´y8mÚ´.•WYYþᇆ††šY’ùåÁKŒc+ ›€Þüùó£££ËËË+**6lØðôÓOwõ-âæÍ›>>>ëׯ¯®®®®®^·nnÌV?ƒa‡¡¡¡éééåååÍÍÍ.\X¿~ý€òóóÎ,IÒüùó·lÙ¢Ñh4Í–-[Ôjõ?þØ¥òöîÝkb†.•§<ÖK’Æ€Þõë×£££=<<ÜÝÝ-ZTWW×·ˆ‹/Ξ=ÛÕÕÕÕÕuöìÙ¥¥¥†S ;ÌÉÉ™3gާ§çý÷ß?dÈ ãááa¸`}}ýË/¿Ü¿ggç3fvµ6£çf555Ý(O‘¬—\mda§äääsçÎ%''‹.äÂEXi×®]/½ô’è*`œêÁ0@‡3`…@` €ÀêNœ8±téRwwwÃ@•——7oÞ>>©©©S§NÕ·9r䥗^êÆ¸·­°^"4FÀô† òßÿþ÷W¿ú•îá™3gF­‹°Æôµk×ÂÃÃ7oÞjzN•JURRòàƒê[JJJ¦L™ríÚ5óË31OûRííí«««ûöí«o©¯¯÷ôô¼}û¶éRmCÐ F›SÌÔÔTé‚®¬¬ ÿðÃ;M_={ö´y8mÚ´.•g´½£úýë_ççç¶|÷Ýw<ð@WŸ&$L‹ˆˆX¾|¹F£©¬¬üøãKKK-¾ ÃsÐðððwß}÷·¿ý­93K’töìÙäääŠŠŠŠŠŠäää”””5kÖX¯¼åË—/\¸0++«¶¶¶¦¦&##cáÂ…+V¬°ìÁ4½êê길¸ììì»wïΙ3gË–-®®®]}‹0:Ìk8ŽmzL»¦¦ÆÝÝ]WŒŸŸßõë×õ3××׿ñÆŸ}öÙíÛ·§L™²aƇ~¸Kµ­Öð ¶y˜žžž””T\\,IÒÈ‘#ß|óÍgŸ}¶‡k”3¾îU0yJNN>wî\rr²èBî!| víÚõÒK/‰®–Á©žœt8@Q` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@`¸ßôäêêê½{÷>|øÄ‰•••’$ 8000044ôùçŸ÷ððè•"PšÏ€¯\¹²xñbooï={öL:õàÁƒåååååå ùä“O¼½½ccc¯\¹Ò›å  ªÖÖV£œœœ|||’’’ÂÃÃÎý»ßýîâŋ֬P•ªÃ͸§X/:<ž7oÞ÷ßßQúJ’ñý÷ßÏ›7Ïe lœêÁ0@GÀ0°žÎø™gžÑ]ÿl¨¦¦æù矷NI(_çìãã3vìØÝ»wë[¾úê« & >Üš… df mŸuêÔ_þò—Q£FYµ²K—.­X±â«¯¾’$iúôé›7o~à:šY¥RµiéÉ=ßtðÝwßM:544ôá‡>r䈵ӷ¾¾>44400°¬¬¬¬¬,000,,¬¡¡ÁÄ"­ÿ˪åÐC]¸K¥Rõë×oÀ€íO7-nÇŽÁÁÁ«W¯îß¿ÿþýW¯^=qâÄ;wZ{½ô³øäÉ““&M***ÊÉÉÉÍÍ9sfII‰UËÊÊÊŠ‰‰1l‰‰‰ÉÌÌ´êJè5ðÛo¿¿k×.µZ½eË–+V̘1cíÚµÖ+«¨¨hܸq†-cÇŽ=s按E dgg7xðàèèèââbëÕ@ÏuÀ¥¥¥³fÍÒ·L›6íøñãçγ^Y555m~éÁÓÓ³ººº£ù###ÓÓÓëêêŽ?RPP`½òè©VY²³³knn6linn¶··7sñm۶͘1£ÓÙLœÄw§è^dgg§¯ÓÑÑQ÷P÷¯»»»a£½½½¾ÑÁÁA×èèè¨o´··7ìÍÙÙÙ°7WW׎Va¥Þ nÓ›““SûÞÚ4ö°7ó7¦¾7ÝÓ·jo=ÜÑ=ì-$$Dô!f½DéßÛ¨ÕêÂÂBµZ­oÑh4åååæ,^QQ1|øðúúúî­]Ά¤R©š››õo¦MMMMMMîîîZ­¶OŸ>ºÆ[·nݽ{W’$µ¶¶ªTªºººûî»ÏÅÅEר›¿¶¶ÖÅÅEß[KKË­[·:êM×e{Ó5vÔ›£££.Et½Ý¼yÓÓÓÓ°·¦¦¦–– ö¦Û˜†½ÝºuK’$}oºIõÖÒÒÒ~×tµ7­V[[[ÛQoæìh;;;Kõ&ç×Ð;¬÷*è°ßE‹¥¤¤8;;›X¸¡¡áµ×^KMMµxY¡¡¡ï¼óΓO>©où÷¿ÿý§?ý)''ÇœÅ5¯¯¯RX¶µAy8Þ¼oß¾   C‡u4ÃW_}´oß>k”5kÖ¬´´4Ö´´´ÈÈH3ß¿ÿäÉ“­P–ÑaŸ;wnÒ¤I3gÎ Ù¾}{qqq]]]]]ÝÙ³g·mÛ6eÊ”§žz*88ØJ—b-^¼ø›o¾yÿý÷kjjjjjÖ¯_ÿí·ßÆÆÆêg0ü[ä°°°¿ÿý殮¥åâÅ‹ï¿ÿþÿøÇ>øÀ…`œYWUUíÙ³'77÷äÉ“UUU’$ 8Pw_ªçž{ÎÓÓÓz••––®X±B7æ¶yóæ¡C‡þR·Á˜ÀáÇ·nÝš——wãÆ µZºzõê‘#Gv{Õrv“smPŽ7@ÀwÀ÷29¿éȹ6(ÇÀï (fðùóçcbb¼½½íìì¼½½cbb.\¸`íÊP°Îø‡~øÍo~ãççwôèÑ›7o=zÔ××÷±Ç+**ê…úP¤Î‡¶ÃÃÃgΜùúë¯6þùÏþòË/³³³­Y›0rþÞKεAy8Þ‘a¹¸¸\¸pÁð¦T’$i4šáÇënë£ù䓳gÏîܹÓô¢m—œ‡Ýä\”‡ã ù°áM;¢°—¨œßtä\”‡ã °Þ«àþNçàå€Åq', €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €€@` €¡íÈy³È¹¶žX»v­$IÎÎÎ’$ 4H’${{{;;;I’úõë'I’——W@@€®]÷P7¿ný‚ºÆ®öæáá1~üø6½999ö6xð`ÃÞ\]] {Ó5ö°·Aƒö¦+Xß›®`]oŽŽŽí{Ó7Z¤7ý‚úÞ ·°~cö¦{úúÞtO_×›~ÁöÖ¥­k´Ôa£Û ÙÑ–íM7§¾·ž6=éÍR;Ú²½…„„tïÝI²Ú»®J×; ©TòÝ,r®ÍRZ[[U*UCCƒþõ/I’V«mllìÛ·¯nª®±¥¥E«Õ:::.ÞÔÔtß}÷é^‡]í­¥¥E÷>¢×ÜÜ,ýÿ«Z¯£Þ´ZmŸ>}zØ[kkë­[·:êÍ°àæææ»wï¶ú}úô±To*•êöíÛí7¦ƒƒƒ¾7­V{ûöm3k3ºk,Û[›]Ó§OŸúúz‹6ºÞœœœz¾£-Û›®àŽzëÆaÓÃÞzaGwµ·n¿yZï]WùïæÝ ç“smPŽ7(† ˜ï€! ñññ¢K€^ÅÇ[#äü©_εõ„RŸ—­c¿@18@Ý•ž²ÂÇ[#äü©_εõ„RŸ—­c¿œ (0dA†£C`UŒ/!ça79×åáx‚@Q` €€(Ÿ o·ÇFÈùÂ9×åáxƒbp', I0dB†£C`UŒ/!ça79×ÖJ}^¶ŽýÅ`dx»=>Þ!çOýr®­'”ú¼lûà E!€! 2«b|É9»É¹6(ÇÀ4ŠB  €0@ùdx»=®°0BΞȹ6(ǃ;aI"€!2«b|É9»É¹¶žPêó²uì(CÐ ÃÛíññÖ9ê—sm=¡ÔçeëØ/gÀ(  YáèXãKFÈyØMεAy8Þ† P` €Ê'ÃÛíq……r¾ðDεAy8Þ Ü H ™áèXãKFÈyØMεõ„RŸ—­c¿@1‚@Þn·FÈùS¿œkë ¥>/[Ç~8@Q`È‚ G‡Àª_2BÎÃnr® ÊÃñ0 €¢À@  P>Þn+,Œó…'r® ÊÃñÅàNX@’`È„ G‡Àª_2BÎÃnr®­'”ú¼lûŠÁ4Èðv{|¼5BΟúå\[O(õyÙ:ö À0ŠBCd8:VÅø’rv“smPŽ7€!h…@`€òÉðv{\aa„œ/<‘smPŽ7(wÂ’DC&d8:VÅø’rv“sm=¡ÔçeëØ/P † @†·Ûãã­rþÔ/çÚzB©ÏËÖ±_΀P² ÃÑ!°*Æ—Œó°›œkƒòp¼ A (0À@”O†·Ûã #ä|ቜkƒòp¼A1¸$2!ÃÑ!°*Æ—Œó°›œkë ¥>/[Ç~b0 €2¼Ýoó§~9×ÖJ}^¶Žýp €¢ÀŽ€U1¾d„œ‡Ýä\”‡ã `E!€€@ |2¼ÝWX!ç Oä\”‡ã ŠÁ°¬åÒ¥KQQQnnnnnnQQQ—/_]¦(!€ëëëCCCËÊÊÊÊÊÃÂÂD×….áèX•Æ—6mÚ”ŸŸ¿{÷n}Ë /¼0qâĸ¸¸îu(ça79×ÖJ}^¶ŽýÅ`Ú*²²²bbb [bbb233EÕÞnO øÀÊ*ñIDAToÕjuaa¡Z­Ö·h4š€€€òòòîu(çOýr®­'”ú¼lûà Ø”ššÃOOÏêêêžôyçÎýÿ›››oÞ¼Ùf†¦¦¦¦¦¦67oÞlnnÖ?¼{÷®$IµµµF{ÓMÕ÷ÖþK놆†ö½µYP«ÕÞ¾}[’$ÃããÎ;---mzkii1,C7ÿíÛ· {»{÷®¨Þ$È•œ£½iµZÃÞ$Ijjj2ìM«Õö°7£¯ACwîÜ1ìMǪ½é î¨7s6¦e{“íaÓÐÐ`øÖ­ë¤Í[÷;wjkk¥ÿ}³µŠVÛggg×ÜÜlØÒÜÜlooßé‚2‘È•ÂK ãK÷Ô´l±Ñº‡íÖ=l·n`£uCЦŒ=úÔ©S†-………þþþ¢ê SJàY³f¥¥¥¶¤¥¥EFFŠª€N)aD¢®®nܸq±±±¯¾úª$IÛ¶mKMM=uꔋ‹K÷:d ¦ØhÝÃvë¶[7°Ñº‡!hS\]]>|üøñ¡C‡:ôûï¿ÏÉÉévúÐ ø@dŸ»Ö=l·îa»u­{¬·Ýúp^£¦N*ºÛÃFë¶[÷°ÝºÖ=VÚn| @%| €Í!€€@` €€@` €€@ø—.]ŠŠŠrsssss‹ŠŠº|ù²èŠlÉ'–.]êîî®R©D×bòòòæÍ›çååÕ¯_¿àààŒŒ ÑÙ†o¿ý666ÖÇÇÇÞÞÞÛÛ{Ú´iÿøÇ?Dec4ŸŸ/Us¨Ú±ø*àŸÕ×ׇ††–•••••†……544ˆ®Ë,X°`àÀÇŽ]ˆÍ ©ªªÊÈÈ(//ONNŽß¹s§è¢l@\\\@@À—_~Y__úôéU«V­[·níÚµ¢ë²­­­ .LLL]ˆÍhý_ïŸ_CúÙ¦M›òóówïÞ­oyá…&Nœ'°*Û¯šiåÊ•}ô‘þuaaáܹsÏŸ?/¶*[TRRòÈ#ÔÔÔˆ.Ä6$%%¤¥¥ñR5G/l%΀–••cØ“™™)ª(؆  ‡³|}}ù¾£{ìììúôé#º ÛPPP°cÇŽ””Ñ…àðÏŠŠŠÆgØ2vìØ3gΈª÷Žììì1cƈ®ÂÆÜ¸qC÷Uú«¯¾*ºÐØØ“ššêêê*º[2hÐ ;;»ÁƒGGG[¼øg555†-žžžÕÕÕ¢êÁ=¢ººzõêÕ›7o]ˆÍÐ]ãîîâêê/º"ðæ›o>óÌ3ÁÁÁ¢ ±%‘‘‘éééuuuÇ )((°ì*ø&àgööö·nݲ³³Ó·´´´ôíÛ÷öíÛ«²-|±ÔUÏ>ûl||üO|ø0þ|ccc…ž={Ξ=ûÉ“'¤sµã¿äää´µµ‡ºiÓ¦¬¬¬/¶àá¾Oï €N(À|º|ùòرc­­­ïÝ»WZZÊd27oÞ;xð`ÒÑZŠÅb±X¬ªªªÄÄÄ?þø£¼¼ÜÚÚúÂ… ­Ú %å$ ƒÅb‘Î ~’““Gõøñãnݺq¿ÞÔÔ´bÅŠÝ»w“ Ör ¿þ±±±ÎÎÎ<°´´lË~¸½ > jÐàÇîÝ»ýüü¾¨¾EIIIqWßììì… *++úûû×ÔÔ°_g0UUU¾¾¾êêê«V­b±XÕÕÕ?ÿüsçÎÕÔÔ-ZÔÐÐÀÇÆÍ´%úöí»téRίÀéq–——ûûû›˜˜(**ªªª:;;߸qƒ³g4›ó©êêêE‹ikkóy®ªªš7ož†††’’’‹‹KBBç-ž}\ÎQx‹³Ùõë×íìì””””””ìììBCC¹÷ÐØØ¸eË999SSÓ´ü´ 0?îÞ½ëââòÝÍmllrrr"""˜Læ¦M›8oýòË/)))ÏŸ?ôèÑ®]»,X0`À€?¾zõêÕ«W‡âoãfÚ'N|øðá/úøø444ܽ{·´´4--mÉ’%E±û£¬ÿú"ðÇyvXçÌ™caañöíÛ”””1cÆ899¥¦¦~7Ø·ŽÅöüùó™3g.^¼8===--máÂ…?þøcTTgƒ TWWß½{·¨¨èèÑ£{öì9wî\KO €0° õäååkjjZõ‘¢¢¢=z°¦(jß¾}œ·"##•””¸_yòäIß¾}ùظ™ƒ~á[ý«««¾Ø¦cÇŽ¥¥¥-ÜEQ»wïþÖfEmÞ¼™û­M›6ýøãͤâþì·Þš0aÂÁƒ¹ß pwwçl¶nÝ:îwCCCÈó7  0?äåå«««¹_ùú{muuõ¦M›zöì©  À~]ZZš³qff&ç³¥¥¥_¿¢¢¢ÂÇÆÍô ß*À•••ŠŠŠ_l3`À€¹sçfeeµd?E¥¥¥}k3Š¢RRR¸ßJNNîÚµk3©ZR€»wïž‘‘Áý“ÉÔ××ÿÖA‹ŠŠ:uêôõ±hƒ!h~èêê2™LîW8©8¯¬^½úéÓ§gΜ)((`±XÕÕÕœw¹¯«¨¨|ýJYY7ЖHOO×ÑÑùâųgÏ›››Ïš5+$$„Åkl™gà¯}±‚‚‚omÜÔÔÔ‚ÔT^^ž––÷+ÚÚÚ¹¹¹œ¦÷»:u*..nÉž„¤ébiøðáׯ_ïÙ³g3Û\¸páÅ‹ºººìæ—9¿žmÔÌ=6-߸ùƒ¶ÄÕ«W‡ öÅ‹†††W®\©­­MJJzñâÅÖ­[¯]»öÏ?ÿ|k'222ÍâÓ§O=zôànjjj²VSS+))QSSã¼›––Ö’ØÚÚÚùùùzzzœWòóó»téÂiJI¡¿¢"øáçç·{÷îæË[uuµ¼¼<§yüøqáçjëAãââöîÝ»lÙ2žïÊÉÉõéÓÇ××7,,Œ3ƒI^^¾®®®UG þ¢9räHöϦ¦¦Ïž=ã~÷ßÿåüÜ̱úõëwýúuîW®]»Ö¯_¿V  0?,,,¶mÛæèè¸gÏž?ÖÖÖ–——'%%mß¾³‹‹‹ŸŸ_nnn~~þÎ;ÓÓÓiÆÇA‹‹‹###W®\éììhnnþÅ6C† 9uêTVVVCCCnnîîÝ»‡ Â~ËÈÈèæÍ›­èNLL ÈËËËËË 8xðàúõëÙo-]ºtñâÅ?®ªªJIIY³fÍçÏŸ9læX+W®\»vmpppAAAAAAppðúõëW¯^ÝòTt#uñ@ÄÄÄ̘1CWWWFFFQQÑÜÜ|É’%ñññìw ½¼¼ÔÕÕÕÔÔfÍšU^^Nµ`2Ñׯ´jãfúõGØdee555¼qãÆ/¦Yq>áááѹsgyyyccãU«V•””°ß 311‘––n&ð¿NEEÅO?ýÔ©S'EEÅÑ£GsÎ[@@€‰‰‰ŒŒŒžžÞ¦M›Ø·8·äXW®\±µµe/ jkk˾PÝ’HD`Y0 @ 0(À € @ 0(À € @ 0(À € @ 0(À  !8::zÁ‚jjj ƒt€ï“üã?jiiEFF’Ð" ‹E:ƒ 1’ö€D’0€xA €–diÕo´aÞç¤C‡ôþOÑ%¤‚%iS–Ú> +::ÚÆÆFÂN ðGxs{Q€¿Äb±¤¤¤>|ø`bb"¨T ¦„W€q øKì¥|èììL: @›\¸páÅ‹ºººìfjj*÷»­‚†6Âô÷?£Ð ª««ååå9ÍãÇs¿+Ô!hø ð÷¹»»_½zþ@ܹ¸¸øùùåæææççïܹ3==t¢v øûLLLTTT^½zE:@›PeiiÙ³gÏwïÞ}Ñn!Î̦/~†Öj—Ð[ëëKîkÖ¬‘––Þ²e ©H@„ð&a¡Ü"&LÀe` à±µµ-,,üøñ#é !P€[DJJê‡~ÀÓ @PP€[ 7#€aegg/\¸PYYÙÐÐÐßß¿¦¦¦Uß±c÷Â“ÆÆÆ™™™‚ÎØ^ ·Ž››[xxxUUé üptt´±±ÉÉɉˆˆ`2™›6mjËÞ¬¬¬•­½Á4Í88;;ÿüóÏîîîtF¸âââþýû§¤¤°›­}pQQ‘ƒƒÃÑ£G,¬ˆ"CÐ"dÒ¤I/^$ Õjjj6oÞlff¦¨¨È`0ÔÕÕ™L&çÝV=8//oâĉ-¬¾7ndpÙ¸q#›}k²Ðæ¡ùï;Ÿ?611ùôé“‚‚©ÚÈÏÏ/))iÛ¶m¦¦¦JJJ555 |TìììqãÆíÚµËÉÉI9EŠðzÀ„±Sɦ¡¡amm}ûöí &ÎÐ .\xñâ…®®.»™ššÊýn ‡ ?}úäââ²wïÞ#F)g;!h~Lž<ùÒ¥K¤S´Nuuµ¼¼<§yüøqîw[2ŸŸ?f̘?ÿüÕ·í0ÍÃwòòòÌÌÌrrr¸ÿ(ˆ8///ƒ±sçN))©“'O¾xñââÅ‹­ªýúõó÷÷oWk!`–hÑÖÖîÕ«×ýû÷Ih…€€Š¢,--{öìùîÝ»/zÀ-3mÚ4Æÿ*))BXɇ0-ù¾³oß¾øøøþù‡žH@„ðzÀ(À<´ätgeeY[[çäät耉l CÐ"GWW·G>$Ä 0ÿ&Ož|þüyÒ)@,aš‡8dffÚØØdggËÈÈÐ è‡!hQ¤§§gllŒ¹ÐÀà6ñôô>>BŠÐv~~~IIIÛ¶m355URRª©©QPPhcˆˆˆðññÉÈÈTHQƒ§!ÑŠÓ}îܹ'NܼySH‘Ú®[·n/^¼ÐÕÕe7ß½{giiÉùç®åCÐÜÊËË555Û>™KdaZÔýðÃÏž=+,,$à›ª««ååå9ÍãÇs¿Ûò!hnOŸ>533bhÉ…,ŠŠŠ£Fºrå é ßäâââçç—›››ŸŸ¿sçÎôôôÖîaôèÑ!!!ùùùõõõÙÙÙÇÿé§Ÿ¶mÛ&„°’X`<==±ˆ²€€Š¢,--{öìùîÝ»/zÀ-±zõê“'OZXX(**ÚÚÚ†††^ºtÉÅÅEa%®óÀ߈]]]·nÝbbb8×W@Üá°••0a™3gH1€,H^^^§OŸ&Ä ° 2¤¨¨èíÛ·¤ƒ€¨C$)))//¯S§N‘¢“°xhË%÷ÄÄDggg&“)Á+£´˜„%6ÌÍ͵µµ>|H:ˆ4`ÁûñÇÿóŸÿN" CÐ<´qÀ!//ÏÜÜ<33SIII€©€~‚'ÚÚÚx<04X(¼½½Ož¼¬¬,66–t!(ÀB'%%5kÖ¬ÿý—t!˜„ŃÀ/¹geeõíÛ733SAAA€»aÃ$,ñ¦««kkk{åÊÒA@T Óä§Ÿ~úçŸH§Q!h„1àPWW×½{÷ÈÈH###Áî„CÐbOVVÖËË «bzÀ<éûNRR’³³szzº´´´Àw€°$033ÓÕÕų€B¦ÙO?ý„U±€Â4OÂp¨¨¨Ð××óæŽŽŽ0ö‚…!h ѱcÇI“&?~œt =`„÷}‡¢¨¸¸877·ÔÔTLÅ}èKŽ>}úhkkß¾}›t ˜€yóæýý÷ߤSI‚æA¨CÐEUUUuïÞýõë×úúúÂ; ´† %Š¢¢â´iÓð€B€ö =`„ݦ(*11ÑÉɉÉdÊÈÈõ@ÐèKsssccãëׯ“d 3oÞ¼#GŽNd`š† )Šª­­Õ××üø±‰‰‰°üÁ´’““›1cÆ?ÿüC:€0ôô€)ŠúøñãàÁƒ™L¦œœ ‡€ÖBX2™˜˜ôíÛ÷üùó¤ƒÝP€ ûå—_|˜t:ô€y Õ¦þ{?RZZš¬¬,‘À =àöÂÒÒÒÊÊêìÙ³¤ƒ€p¡‹œ¥K—îÙ³‡t .`‘3zôèúúú»wï’B„,r ÆòåËwîÜI:&añ@p[]]¡¡ahhhß¾} ÆLÂj_dee-Z´wï^ÒA@XÐæx˜úïC‚ãããuuuÉ&hÏÐnw:uê4cÆŒÀÀ@ÒA@(ÈwõD(ô€)ŠJKK8p`ZZš’’é,ízÀí‘¡¡áàÁƒ?N:žHtõDˆô€)ŠŠŠŠš2eÊÇ;tè@: @{„p;ekkk``pîÜ9ÒA@ÀP€EݪU«¶oß."=r`Q7zôh))©›7o’‚„,ê ƪU«¶lÙB: °˜‰zWÑïS•““Ó«W¯wïÞiii‘Î ±Ð†/uíÚuêÔ©¸ ¦Ä «G?±èS•••Õ·oß„„mmmÒY$nC¢•¸`Š¢–,Y"--{‚„˜VbT€Ù÷ÇÅÅéêê’Î P€i%F˜¢¨U«V•••’ P€i%^¸¤¤ÄÔÔôÑ£Gfff¤³HÌ‚†oRSSóóóÛ´ié Ð âÔÕ£xõ€)Šª¬¬455½qㆵµ5é,=`hŽ’’ÒªU«6lØ@:´”˜uõè!v=`Š¢êêêÌÌÌ‚ƒƒíììHgèÃwÈÊÊ®Y³fݺu¤ƒ@‹ KŽ™3gfddܽ{—tø>`É!##³mÛ¶+V455‘Îßñ\TTtðàACCC%%%%%%CCCƒÑZnâĉJJJÁÁÁ¤ƒÀw|³geeÍ;WGG'88xذa¡¡¡999999¡¡¡C‡=}ú´ŽŽÎœ9s²²²èŒ Íc0;vìX·n]MM é,МoNîRPP044ܽ{÷˜1cxn¶|ùò´´´êêja&$@gAsóðð°··_±bé bÀR”3gÎ#[qq±ºº:÷+;wnæñnnn.\(//ŠŠ²µµ:thll¬ðâ‰]]Ý ¬^½štø?"ÚÕ“••­¬¬”‘‘á¼R__ß±cÇÚÚÚ–|<000$$äÖ­[Ío¶qãÆouâEó´ð­ººÚÒÒòßÿ6lé,â¤Ý­„ÕÚ!è/äååUTTðwt ‚f»téÒ† bbb¸¿Ö@ó AÏš5«ùÛ~(Šªªªš5k– #QEYZZÆÅÅq¿oaaÑÂK^ùl;ÀÀ@ÒA€¢š)ÀgÏžµµµ½{÷î·6¸s玭­íÙ³g…ËÕÕõäɓܯœ}úô?þ(.....ÞºuëóçÏçÌ™ÃÙ€û^d''§‹/æææÖ××§¥¥ýñÇ¿ÿþû¶mÛ„L¬™››Ï˜1cíÚµ¤ƒÀ÷®GDDÄÄİ{NZZZìu©¦N*ÔÇͦ§§/]ºôÞ½{E999íÝ»—û.îAùû÷ï8pàÑ£G¥¥¥ÚÚÚ#FŒøí·ßzöìÉ÷¡%ò0[ii©¹¹yHHˆ­­-é,b ÝMÂ"K‚ 0EQ'Nœxñâ…´´4é,¢ŽðZÐ I¼½½;vìˆu=ÈjQNNNöööÖÑÑ‘‘‘ÑÑÑñööNMMv2ƒ±ÿþõë×ý˜g Í÷ ð›7o dbbòøñã²²²Ç;88$$$Є¡wïÞ>>>Ë—/' ýúþÐö˜1cÆ·hÑ"î÷íÛwëÖ­°°0af#F²¯³UVVZYY=ztäÈ‘¤³ˆ.’“°”””RSS¹¥¢(*77×ÈÈHRr× 0EQ¡¡¡Ë—/‹‹“““#@D‘œ„õ­h5nÜ8 ‹;w’Ð}¿»»»Ÿ?þ‹Ï;çáá!œH@Ÿ½{÷îÙ¼–’ IDATÛ·/--t€vçû=ëÊÊJ___ssóéÓ§ëèè|úôéôéÓ‰‰‰ÇŽSTT¤'%ÍÚÉ4ÛÎ;oß¾ν¸°‘¼Ü’—%¬\µ«ÜØØhoo?þüÙ³g“Î r°­ÚU¦(*>>ÞÙÙ966¶k×®¤³ˆ¬„BÔ»wïyóæÍ›7t€v(Š¢Ö®]›ššzéÒ%ÒAÚ‹ö5ÖÚBímšíÙ³g“&Mzóæºº:é,¢×€iÕ> 0EQK—.-**:qâé ¢˜Ví¶WVVöîÝûÀ...¤³ˆ`ZµÛLQÔƒ¼½½ãããÕÔÔHg ˜Ví¹Sµxñâ²²²   ÒAÈC¦U;/À•••}ûöݵk—››é,„¡Óª`Š¢ž>}êááûÅS°Ú`Z¡SµjÕªäädÜ íVºmÞ¼ùÇÁÁÁ¤ƒH&tõx@˜-&&fìØ±111]ºt!€ AÓ ˜ã·ß~KHH¸zõ*é d`ÈØ¸qcNNΑ#GH4èêñ€0·÷ïß<øÑ£Gfff¤³Ð =` ¦gÏžÛ¶m›6mZmm-é,’]=Ðþš———††Æ¾}ûH &aÑ øk¥¥¥ÖÖÖû÷ïwuu%€>(À´Bæ)22rÒ¤I¸+ Ú`Z¡Ëúõë_½zÊ`0Hg &aHX¿~}iiéÎ;I{èêñ€p3222 påÊ{{{ÒY„=`Ý»w?vìØ´iÓ Igcèêñ€ðw­ZµêÍ›77nÜ’Âw8dèƒhÙºukEEÅ_ýE:€¸BWô€[";;»ÿþ/^ttt$@XБӭ[·£Gzyyáb0ÐÕã=à–[½zõëׯoݺ%--M: €àa!Z¡·\SS“«««••ÕöíÛIg< Aƒˆ’’’:}úôåË—Ï;G: €8AWô€yª««KLLLKKËËËËÏÏWSS[´hû­¸¸8ggç{÷îõêÕëÇ6lPQQÑÐÐÐÒÒ255uqq!›€o«„±SHïß¿÷òò222ÒÒÒêÒ¥KçÎ9oõéÓgß¾}îîîQQQ:urss++++,,LOO¯¬¬äY€ ÒÓÓÍÍÍ;vìHã/ *ÐÕã¡Ýö€›ššbbb^¿~íëëËÇÇ—-[–póæÍ–LÈzúôéâÅ‹“’’ lllÜÝÝÇÏÇA„ ×€A¸nß¾=kÖ,---ooï·oß666ò±“íÛ·×ÕÕmܸ±%;88¼zõª¤¤äôéÓƒæãpb­võš×{Àsçε²²òððÐÕÕmË~ ¸eË–©S§ $ؽ{÷X,–£££‚‚‚@vÐ*¸ ‰Ví° PllìèÑ£oݺemmÝö½;v,..ÎÖÖv̘1>>>ÚÚÚmß-@ ¡ÓJ‚ 0‹Åb0Â>Ê•+W/^üüùónݺ d‡•••> [¶l™¡¡¡@ö Ð(À´’È\TT´cÇŽ¨¨¨»wïÒp¸­[·^¿~ýÁƒòòò4@H0 øWQQ±yóæž={–””?~œžƒþúë¯ÆÆÆÞÞÞ4|•ÉÊÊš={vXXX}}½° ((À’oÆŒïß¿ùòe`` žž=e0Ge2™üñ‡°¥¤¤Ô·oß-[¶tëÖmÉ’%oß¾öÚNÇZÛN† ëêêdee‰º  ÀÑÑqíÚµÞÞÞ4.55õĉ]»v?> ‡€ö×€i%a˜¬ÄÄÄáÇŸ:ujäÈ‘¤³´®ƒ¸277¿pá‚——W||<Ù$ñññø^¢X¢äå呎ÀÃàÁƒ÷îÝëææöéÓ'Rêêê|||ÌÍÍ÷îÝ[TTD* °„¨©©™5kÖܹsIámÚ´i¾¾¾®®®DÈÊÊÆÄÄüû￯_¿622Z½z5‘¸ØÉƒØ]ÎÈÈpww755=v옢¢"é8ßäëë›™™yíÚ5‚1ŠŠŠ’““ @0ˆ L¢•xàçÏŸ»»»/_¾|ùò夳|GccãÔ©SeddN:%%…Ñ(À´¯œ™™ùáÃ'''ÒAZ¤®®ÎÕÕÕØØøÐ¡C¤³ððøñc;;;²t)(À´¯,vÊÊÊFŒáêêÚÂÒ¦¡¡a̘1‰‰‰¾¾¾¾¾¾]»v%ÈÃmH 9TTTnÞ¼yæÌ™ýû÷“Îò?:tèp÷îÝðððüü|++«+VN’ ]=ЦAFFÆ!C6lØ0kÖ,ÒYx(--ýøñcÿþýIÂ0M+`z|üøqøðá{öì™|H:Ë÷)++øðÁÎÎÎÛÛÛÞÞþöíÛ¤€¸ÂÅNDððÆCCCïÝ»§¢¢B:‹Ppà§ùùóç÷ïß ú·Z°à+¤NKCCßþYUUEäè".''§oß¾‹-jll$ ¸¸øÑ£GœæóçÏGŒÁi¦¦¦>|˜Ó,++{ÿþ}Kv[WWwúô颢¢omP[[[XXÈifdd„‡‡sš>\½z5§yçÎÍ›7sš¹¹¹©©©-‰ß"¼Š€IX<Ÿ„<•––Ž?^GG'((HVVV؇+,,}¸6™:uêôéÓ9Íp_]NJJÂ\0¡B1#--àíííààÝÚ_¸p¡¸¸˜ý3ƒÁ°´´ätû Æœ9s † ã¶ÁÒ¥Kõôô† 6qâDa,Ž­¦¦¦­­Íiþúë¯Ë–-ã4oݺŽœudddÛ¿ñ7`KË—/ß·oŸ‹‹KXXXó[ÖÕÕUUUqš©©©%%%œæìÙ³•””„•²m:wî¼nݺÔÔT''§¹sç cÔ½~~~nnnœæ‹/¸;Ä×®]ËÍÍ¥3€äÁl#蜄UXXعsgzŽ%yž?>qâÄßÿ}Μ9ßÚfÁ‚C† ™:u*Á$Þ_ý5eÊCCCvóÔ©S®®®jjjdS&aI¦>ôîÝ»²²’tqegg÷øñã;v¬^½º©©‰ýâ£G‚‚‚8ÛnoX,Öýû÷SRR|}}Ig€¦¦&àà`ö+UUU¸ä€kÀÐ.DDD$$$vŸZZZááávvv666÷ïßìÎŃÁprr’ŒêKQ”””Ô•+W8Õ7//{°@, «Çƒ¾ïøùù 8pÚ´iß³XËÎÎîÖ­ ºwïÞ?þøË/¿¬Y³†ûA¿ ¥¥¥Ù?¿~ý:((ˆûùÍ|CXì}üøñôéÓÎÎΤƒˆ–¢¢"WWׯÆFŽåääôêÕ«;wî8;;gggÓpDqQYYÙ¯_¿]»v}þü™tþqª/EQ¦¦¦óæÍã4_½zuûöm¡šƒL“µk×.[¶LCCƒtÑ¢®®ÍýO§PéèèDDD¸¹¹Y[[Ÿ9s†žƒŠ>%%¥ÀÀÀ7oÞ˜˜˜øøøÄÄÄNÔVÊÊÊVVVœfCC÷l¾ÔÔÔ¢¢"¹þ† yø€CTTÔĉ?|ø€I"E9r¤ººšûvOúEEEyyy :tÏž=;v$˜D¤;v¬ªªjÆ ¤³ÑöíÛ 'OžL:ˆ¬„E+ŸîË—/×ÔÔLŸ>]€û_Ÿ>}RTT$þìØŠŠ ??¿Grä&ǶJSSSûYe,%%¥¦¦ÆÒÒ’Ý|þü¹ŽŽN÷îÝɦÃ$,ñ“œœÜÞþøñcÒ)@WW÷Æ+W®?~ü’%K$oÚ‘ÔÕÕ/Y²$11‘t:qª/EQQQQ™™™œfEE‰P NP€…Åßß?44”t ZùøøÌž=›t ™>}úÛ·o«««---/^¼H:Ž••}ðપêÈ‘#‡zöìYÒ‰hµhÑ"GGGNsÔ¨Qoß¾%˜DÆZyhû€CBB‚³³sJJ çi-’jûöíãÆãîHž§OŸÎ›7ÏÀÀ`ÿþý†††¤ãˆúúúÐÐм¼<î™Ûö¿!ì ÕMMM®®®W®\‘““# Z CÐbfÛ¶m~~~_})в¶¶VWW'B¸¢££ °yóæÚÚZÒ‰DŒŒÌ„ Úsõ¥(ŠÁ`pngb±X¿þú+§ú–——sO®†v XðÒÒÒnß¾ýóÏ?“Bggç®]»’N!t222«W¯ŽŽŽŽ‹‹ëÝ»÷;wH'c±±±ÜFh¤¥¥ Äi–——s? ¢¼¼\4—©aC¼Î;_¼xQYY™t¡`±X#FŒÈÈÈ „==½K—.íÚµkÁ‚nnn>| H,­[·N__õêÕíd®Ö×tttüýý9ÍÈÈȵk×̤à0¸ ©y©©©=zô ‚¤ºººýû÷ÿõ×_ÞÞÞëׯǺÁ­•˜˜Ü£G‡’Ž#Zþúë/…Å‹“ÿî¦ ð×ÊËË%µOÏ·üüüuëÖ]¿~ý÷ߟ9s&mO5–MMM)))pã¸`UWWWWWs¦VüóÏ?ÖÖÖýúõ#›ª=Ã$, ©ººÚÎή²²’tÑ¢¥¥õ÷ß_¿~ýäÉ“}úô¹qãéDbFJJ Õ÷k Ü»uëÆýìÎû÷ïãÆt‰®è­¦¦F^^žt ÑuãÆÕ«WwîÜyçÎX<«íÖ¯__]]=cÆŒ>}úÎ"Z-Z´fÍv³¤¤„ø£µ%zÀ@÷²>¨¾Ísuu‹‹óññ™8q¢——Wrr2éDâmÚ´iòòò&LèÓ§ÏöíÛËËËI'œê[__ß»woÜ'¾P€·ÏŸ?Oš4©½Ý.ÒÒÒÒ³gÏ~ÿþ½¹¹¹½½ýܹsÛç\q077ÿý÷ßSSS÷ïߟžžÞ~Ö—n™ŒŒ ÎíÅnnnd#A«`¬•þ‚‚‚ÜÜÜ$iU ‹ÅYIZ¥¸¸x×®]‡ž>}úo¿ý¦­­M:H¾ºººÔÔT333v3!!áùóç?ýôÙTCТ.;;{ÅŠ²²²¤ƒ´ ‹Åâ~.ª/ß:uê´eË–¤¤¤:XZZúûûçåå‘%iâããÿý÷ßÂÂBÒAD…¬¬,§úR%''§©©Éi&&&âA×¢X0Ž92mÚ´Ž;’Ò&YYYk׮Šˆ hhhìÞ½;66¶¶¶ÖÂÂbÅŠ¤CIކ††Û·o;ö?ÿù®ÁØØ˜{D:99ùÍ›7œfnnnMM ‰\ð0ÍCkêëë îܹcaa!¼T Ö>}úôÇœ9sfΜ9Ë—/×ÒÒ"HBTVV^»víÌ™3Ó§OŸ:u*é8bã·ß~377Ÿ1c»‰ëMÍÀB´jíé¾páB``àýû÷…Ixšššbccq›?=233ÿúë¯3gÎLž<Ùßß¿/(¢c̘1›6m8p é ¢×€Eš““S`` é|ÊÌÌܶm¾‡ÑCOOïÀIIIÚÚÚôööNHH JÂ9rÓÑ¿ëâÅ‹ÖÖÖœæ´iÓð|  €ººzÏž=I§à“¾¾þ… 0úD'MMÍM›6¥¤¤˜››9ÒÕÕ5<<ß„¡²²òÅ‹666 øý÷ߣ££I'Q;väžCêëë˹¡£±±qåÊ•MMM„¢I2àöˆÅbÅÄÄNÑÞ©¨¨¬Y³&--mâĉþþþ½{÷>qâU,%%¥þù'''çÏ?ÿ,--=|ø0éDâaøðáœ{¯kkkMLL8ÍÒÒÒ   bÉ$ ®ó ñKQ2™ÌeË–]¼x_Ñq÷îÝ;wÆÅÅÍ;wÁ‚]ºt!€‡ìììÓ§Os§˜———žž.Ù1 ‹V_€Ad½ÿ~ÿþýgÏžuuu]´hQÿþýI'j‚‚‚ \\\¬¬¬Hg3/_¾¼}ûöºuëØÍüüü¦¦& ûúˆIX )))¤#ÀwôìÙóàÁƒÉÉÉVVV“'Ovpp8{öl]]é\ÎØØ8==ÝÍÍ­GË–-ËÊÊ"Hl 0€S})ŠŠˆˆøçŸ8ÍŠŠ \‰\Ä ÌCK¾ï¸»»»ººÎž=›žH|kjj³T%R}}}hhhPPÐÇÇ?kÖ¬!C† OF›ÊÊJ%%%Ò)$Jzzº¾¾>ûÏp}}½££ãÓ§OEáj † iõÝÓ]XXhllÌd2UTThKÕreee¢ „!??ÿôéÓAAAeeežžžÓ§OïÝ»7éPí׉'GŒ1hÐ EEEÒqÄUSSÓû÷ïÍÍÍÙÍüü|OOψˆ"a0-ZdeeÏœ9#šE®ªªÊÁÁ¡¢¢‚t ‰––ÖÒ¥KãââBBB¤¥¥ÝÜÜlmm÷íÛ—M:Z{Ô·o_…-[¶hkk>üÕ«W¤‰%)))Nõ¥(J]]{½ý7oÞøøøÈ%`èó î·!a®f{ÖÔÔtÿþýàààk×®YYYyzzNœ8QÂF ?îÓ§ŽŽé,’¦ºº:##ƒsýøöíÛ!!!‡Òá0M+q,ÀbzƒOmmmxxøùóçCCC{õêåéééîîŽJ,"þüóO {{{MMMÒYÄ^MMMQQç‹Î‰'RSS7mÚ$¨ý£ÓJì pccãÀCCCµµµIg‘SWWwûöíóçÏß¼yÓÌÌÌÝÝÝÝÝ]Ä'ðK6‹µuëÖÈÈÈgÏžuéÒÅÑÑñèÑ£˜,)(ÕÕÕåååZZZìæ–-[äååW¬XÁnÖ××sÏÄn `Z‰]¦(ª  _¥¡yõõõ—.] éÚµë„ Æß·o_Ò¹Ú¯¦¦¦„„„wïÞyzz’Î"±jjj:vìÈnúùù™››Ï›7Ý,((PSSk¾$£ÓJ 0@Ë555=}ú4$$äÊ•+,ËÝÝ}ìØ±ƒ jmÏ„*))éßÿutt´··çôç í9+ò.X°`̘1nnnìfRR’žžÞ7˜a4ð0vìØäädÒ)@üHII 4hÇŽÉÉÉ—/_îØ±ãš5k455ÝÝÝ=ŠéÓ"BIIIYYùï¿ÿ633Ó××ß¾};éD‚{=üC‡qª/EQ{÷îMLLä4Ê‹‹…—]=¾õ}§¦¦†Édr/ÝBVrr²±±1é !>þ~ãÆððp==½1cƸ¸¸888`rŸ(HNN®­­µ´´$¤}ñ÷÷_¼x±žž† éó­|ñâÅ¿ÿþûÎ;ôG MccãË—/oÞ¼yëÖ­””''§Q£F999õèуt4àaݺu÷ïßïß¿ÿþýmmmMMM1ŸK°p ˜Vß:Ý'N?~üÌ™33 ’E«IDATiOôfΜ¹råJ|zäççߺuëÎ;÷îÝ“““9rä˜1cFŒÑ©S'ÒÑàÿ+++‹ŽŽ~ýúõ«W¯^½zõûï¿O:•t(‰‚L+ž§»¬¬¬{÷îdÀе²²Â¨ Ð/11ñîÝ»aaaOž<1006lØðáǪ®®N:|_xx¸¦¦¦………œœé,b˜V}ú”žžžžžÞ³gOž#ÕwïÞýôé“¡¡¡®®n·nÝè¼Y˜VܧÛÃÃÃÍÍÍÇÇGHÇš1cÆš5k°¶3@[äçç'%%½{÷îÝ»wìϬ¬¬=zXXX°¯Ašššš˜˜hkk“N |b/DÈd2333srrþý÷_///zL+Î鮪ªÒÑÑIMMÞj·oÞ¼±°°ÀÁª««KJJJLLLNNþðáÇØOôc×c###]]]##£îÝ»cquñÒÔÔÔÐÐÀ³ìååõòåK]]ÝîÝ»ëëë{{{·ý™­(À´âœîË—/>|8<<\°ûÇboD”””°ç}øð!===###%%%//O__ߨØXOOÏÐÐÐØØX__¿{÷î¸ PÕÔÔdþ“Éœ:uª©©é×›–••uéÒE[[[OOÏÄĤ™“…W€ñ½¯9/^¼øJl¶¶¶wïÞÅ_oš©©©ÙÚÚÚÚÚr¿X[[›œœœ–––™™™’’òìÙ3ö8gee¥±±±¡¡a÷îÝõôôtuuõõõ»té‚!+‘%//ÏžÐüf:uJKK{÷î]^^^ffæÉ“'mll¾Þ,**J¨B˜îï;,‹Á`vÿ¥¥¥ªªª‚Ý'VUUUjjjrr2“Éd2™YYYYYYL&óóçÏÚÚÚœ^r—.]ôôôôõõõôôºuë†ÑlIòÓO?EEE½yóCÐôø€CSSStt´˜Þ„Üêëë?}ú”‘‘Ád2 rssÙ…9###//OSSSSS³[·nººº]»veWh--­îÝ»wíڳŮÓJà§;''gÁ‚—/_xgDGCCCnnn~~þ§OŸ233Ù?çææ0™ÌÜÜ\UUU--- }}ýnݺikk³ v—.]Ø? B‹ `Za)J†‚ÿÊÈÈÈÊÊÊËËûüùs^^^^^ûu555---MMMmmíN:± 6ç---¬ÕC3`Z ät‡„„¤¥¥ùùù $H<‹õùóç‚‚‚ÏŸ?çææ–””ççç³k3»']VVÆ~joçÎUUU;w¡¡®®®¢¢¢­­­®®®¦¦ÆîL«ªªŠòúŽb˜V9ÝYYYuuu=zôH$¶úúú‚‚‚ÂÂÂÒÒÒ‚‚‚âââÒÒRNÍfWñÒÒÒÚÚZUUU555UUUMMM Î+ìÎ4çv‡[JJŠôï'rP€¿###céÒ¥wîÜ¡(ÊÙÙyïÞ½mY®¿ÓÍb±Ž;æããƒ{|@444”þ»]VVVVVV\\\VVVZZÊùoYYYIIIII‰’’§0³)))ÉÊÊrš***ÊÊÊÊÊÊ222œr®     @ú×ÜÜœŠŠŠ#FÌš5ëØ±cE:tÈÉÉ)66VQQ‘ï}?~|Ö¬Y­úƒÁ`ÕÒÒâû¸‚Ò¡C‡Î;·êIåååìzÌ.Ûeeeõõõ%%%¥¥¥999eeeåååuuuœr^]]]SS£ò_ ;vTTTìØ±£ªªª´´´šššššƒÁPSSSQQéСCÇŽeddØÈÉÉÉË˳«¸¼¼¼ðNˆ¨‘„ðž={^¿~}êÔ)Î+3fÌ0`ÀâÅ‹ùÛ!ƒÁððð¸xñâw·LHH(++³··çï@ƒÓŸ®©©)//¯ªªª¬¬,--ewÄ‹‹‹)Šbw¾ËËËÊËËKKKëêêØ%¼ªªŠÅb)))ÉÉɱ{P:uâtµ)Šb’³«u‡”••)Šb—vEEE99¹:°{êìmØ%Ÿ¢(v½çï÷B¸9ׯ__½z5÷+ÞÞÞýõߘ¢¨~ø¡%›åää¢d†vmmmUUû¿,«¤¤„ÓÕ¦(ª´´´©©‰]­ëëëÙE=--Åb±?U__ÏùP]]ÍÞEQì~<ûìRÍ®ñœ ­¬¬Ü¡CvüóçÏOŸ>­­­•‘‘á¹B– HBX[[;>>žû9'¹¹¹ÖÖÖ999|ì­®®NNN.77—çƒS˜Læ† ‚‚‚øN UVVÖÕÕ}Q¡Ù=rviWVVà¤ñç?8o|ÀIㆠ›£¬¬|ÿþý¨¨(}}}}}ýW¯^Ý»w«€(Ã"ð=‘8iüÁyãÎpÒø#¼ó&½qãFaìWÜ 6Œtñƒ“Æœ7þà¼ñ'?B:oøB@€$\;(À € @ 0(À € @ 0(À €ü222<<óýºü^<χ={øì÷ü6ö·t.Åðù|uuu÷îÝ“¢¾ï…üøü’_ww·Õj}úôi`R[[›““ÓÒÒ"˜JYø·Ñjmm}øðaàµÝn¯¨¨˜ŸŸ—M¥D‡#++ËãñHQ†®®.›Íf4¹Uâ¼J¬€ýFGGõz}ðD¯×›L&©<c= ~œ•œœÌ~Çá¨ÕêS§NI§P›Í688øøñcé ØCû}øðáòåËÁ“K—.ÍÎÎJåÁÉ1>>žžž.Ba¼^ïîVzSS“tØÜÜÔëõOž<‰ŒŒ”΢$ñññjµúìÙ³555sss!?>ìçñx¢££ƒ'111n·[*N·ÛÝÖÖÖÓÓ#D1v¿UPPÙÑÑ!HnݺUYY™——'DIÊÊʆ‡‡¿~ýúöíÛììì‚‚›ÍÚS°à±±±¡V«“oß¾>}zkkK0•²°±ô»œNgUUUGGGaa¡t…q¹\f³ùöíÛíííÒqŽ5“Éd0,Kàq=·ê! ˜L¦‰‰‰“Ëà§Ñhìv»F£ L>}ú”™™¹ºº*˜JY¸«ËòòòÕ«W ƒN§“΢T‹¥®®nqqQ:ȱ–œœl6›nÕCp:IIIëëë!<& ýÒÒÒÞ½{<±Ûí©©©RyÞVVVJJJºººhßÿ#++ËårI§8îGbbâ¾ß³Ñ[ÃØQ|d¡€ýJKKFcðÄh4–••IåAs¹\ÅÅÅ<ÐjµÒY”íÍ›7)))Ò)Ž;ßCéhJòüùó+W®„ø ?^›“immíüùón·Ûívß¿÷iƒt.%áít@™™™Ïž=“N¡ŸO:€ãâË—/£££*•jff¦¸¸Øn·k4éh@¸a `OLLLCCÃÎÎÎÎÎNCCƒÁ` }£À À~7nÜHOO÷ù|/_¾“Ž„' À~N§S§Óy½Þééé .HÇ `¿–––ÂÂÂÏŸ?¿ÿ¾··W:žØð©©)‡ÃQ^^^__o³Ù¦¦¦¤á‰0€=';;{rr2))I¥RÍÎΖ––Z­Ö3gÎHG +`{š››kjjvÛW¥R¥¦¦^¿~½¹¹Y6–X €0(`PÀ €@ €@À?H×…T¢Pv4IEND®B`‚gsl-2.7.1/doc/images/rand-gaussian.png0000644016036000116100000005003313373111455014506 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœìÝy@Ìùã?ð)&JJJŽ$W‡RHIE‘Õ*r”Z6÷:×Z»D,Ö^²$kÙ$GR ‘b9J*ÊUèÐ}èÖ9¿?úüúÎ2ÕT3ï×{fž¿ôž÷¼ßÏF3Ïy¿Þ—‹ÅbµÄIE(`PÀ €@€  @ €0(`PÀ €@€  @ €0(`PÀ €@€è‚W¯^­\¹räÈ‘RRRRRRcÆŒYºtéÝ»w‰„ãù[õéÓGYYÙÜÜ|×®]¹¹¹|ZiÛ¢xû‹ðüeà0·.]ºdkk«¯¯SQQ‘••µ{÷îäädSSSÒÑx†Åb±X¬ÚÚÚçÏŸïÛ·¯ªªJ__?88¸K ¡²Q· ¸ÄX,é  ##ÃÊÊ*..nðàÁìÓ[ZZ6oÞ|àÀRÁxHLŒÃBrròÌ™3ÿý÷_mmíž,‡‡óóê¹da €+ذaÃ'íË`0ÄÅÅÙÛ÷ýû÷_ýµ¬¬¬ººú–-[>~üØ:ã†ZÛĪªª-[¶Œ5JZZº_¿~3gμråJ§±/³ƒõ677ïÙ³gøðá}úô=z´¯¯o—~ññãÇoܸ±íwì4së m£ÙmϪ««[»v­²²2Ç‘çÚÚÚ+V 0@FFÆÆÆ&--íóWéó—®½uµÍadd$#####cddtõêUö%ôð•è!0W¢££mll:ÍÄÄd„ ùùù·oßÎÊÊÚµk7 ÷ððhjjŠŽŽ®¨¨xûöíúõë>ÜéC\®wõêÕuuuÑÑÑeeeÇ÷ññ9þ¥í]Ô6eëÖ­ñññgÏž-..f±XuuuÍÍÍí-°¥¥¥íßçÎ+..9r¤¦¦æ’%KÂÃÃÛÛÁC\®wøðáì3÷ïß¿¼¼¼K¿û»wïTUU?™ÈM0vŸï>g÷ÉòUUU‹‹‹Û›™ý¥ë@aaáÀÙ§(++´ýØóW GÈô>€ Y¶lÙ¯¿þÊñ¡¶÷‘ªªjNNNÛôÖ#‰Zÿ-//_^^Îþ¬ŒŒŒOÞ€?~LNN>vìØ¤I“–.]ÚéCܬ—ã{¼½7~{Ó÷îÝëééÉqžŽƒu¼dw[À¿t¬ëó-àììlö-à"Pm\IKK4hÐ'=ѪíS»ÿþ­Û ­6oÞÌ`°½víû³~øá‡ö>îKJJddd:}ˆ›õö¼€“““•””ÒÓÓ;~.{0IIÉúúúN—ÌòÇdh÷îÝmû€;~é:X×çû€}}}çÌ™ÃM$ `€+ZZZ?ýô“‰‰‰Ïëׯëë뫪ª^¼xñË/¿´Íccc³aÆ‚‚‚¢¢¢ß~ûíÝ»wmmܸqݺuqqqµµµ™™™ßÿ}IIIÛ£fff¹¹¹MMM033ëô!nÖÛ=ÍÍÍååå÷îÝûöÛogΜyôèQMMÍOæé ˜††Æµk×:~ÿÜóçÏ>\XXXXXxøðá#GŽìر£õ¡Ž_ºÖõí·ßnß¾=((¨¸¸¸¸¸8((hÇŽ[·níÚkÀ?¤¿’'Ož¸¹¹ 2„ÉdJKKkjj®_¿>55µõÑÒÒRWWWyyù%K–TUU±¿Å>|èô¡¶§w°^ŽïñöÞøm JJJ¦¦¦ÞÞÞŸfÅMæÈÈÈQ£FõêÕ‹Ë £ººú«¯¾êß¿¿´´ô¬Y³Ú^ÒN_ºŽ×:iÒ¤Öë†Nš4©uGu7^~ÀEdÀ4(`PÀ €@€  @ €0(`PÀ €@€  @ €úpvv¶³³³œœœœœœ³³sNNN3‹}†²œÝ@Ó®®®¶°°000ÈÊÊÊÊÊ200°´´¬­­íà)¬ÿ¢,*@7ˆÑ³«|||?~Ø6ÅÍÍÍÐÐpݺuç£é/ÀM·€#""ÜÝÝÙ§¸»»‡‡‡“ÊÀ[4-à´´4===ö)ºººéééÝÏÏoÖ¬YζsçNޝ‰¤¤$Åÿ @[Ý©1.ÐôØ%eeåÔÔTeeå¶)úúúùùùÜ<½°°PCC£ººº{kÇ!]Њ@Ó!hmmí””ö)©©©ZZZ\>õ 4GÓž={v@@û”€€.Ÿ~áÂ>äà šŽµVUUéééyzz®ZµŠÁ`øùùùûû§¤¤ÈÈÈ´ÎÀ>&`ii¹jÕª©S§***æææž={ÖÇÇçÆÝ[;†  •È AËÊÊÞºu+!!AMMMMM-111&&¦­}?±mÛ¶   iiiSSÓ/^ܽ{·Ûí @lêq€-`h%r[À  @ €0(`肤¤¤Õ«WËËË‹‰‰‘Î"ØPÀЋ/8pà½{÷Hx8߆œ†Ð)ù¨ÄiHÐSÆÆÆ222bÿE:—ˆBˆ„;wî,X°ÀÕÕõÍ›7GŽ‘”” …­Xz‰„®‘q)¶¶¶S¦LÙ¾}{Û”]»vEGGÇÅŵþØñ¦ð矊"òQ‰!hè‘,Z´ˆ}Š››Û‹/Ú~ìøîñ=\»···9ÞÞÞ=ÌÏ"ñý¥«Däkˆ&“YUU%))Ù6¥®®N^^¾¾¾¾{ ‘Jl@())åææ²OÉÉÉÍ>åÔ©SVVVm?òu>×›t ‚———‰‰‰¼¼üÂ…  FPPЉ'=zD:—èÂ0€H;vìÍ›7###GŽ9räÈ›7oÆÄĨ©©uu9ìƒÒ î ‘Ø…ÞU"rdt a0(`PÀ €@€nÅÆÆÎŸ?_II©_¿~FFFaaa¤ 0\ ¸enn>}úô°°0}}ý´´´eË–•””xzz’Î%pÅ p!޾ýöÛ_~ù¥íÒW©©©NNNdSñÿMà „RDDľ}ûRSSkkkÙ§wû¯¶¶¶ÿþݾ¡¡@À•° Gîܹ³`ÁWW×7oÞ9rDRR2  'í©££ÃÃ"›z` „­­í”)S¶oßÞ6e×®]ÑÑÑqqq­?v|O…Ï?ËÊʦL™rüøqSSSž§¥l@>žÁ`˜ššþúë¯]=‰ˆã‘Òåååòòò¼‰H?¸¥PÀÐ a0(`PÀ €@€  @ €0(`PÀ €@€  @ €0(`PÀ €@@ßÎÎÎvvv–“““““svvÎÉÉáæY£Fãw<€ž iWWW[XXdeeeeeXZZÖÖÖvü,‹åáá±{÷njBt›‹Å"ŸÇ¶Mqss344\·n]Ï:pà@rrr@@€˜X~¯>„ÿ¦[ÀîîîìSÜÝÝÃÃÃ;xJrròñãÇ9Âçh<@ÓNKKÓÓÓcŸ¢««›žžÞÞüuuuîîîþþþ²²²üOÐS4k•¨©©a2™mSûöí[__ÏqþU«V©ªªzyyµþˆ!hà ‘‚î’ððð´´´~ø¡«Oôööã„!ØÑ´€û÷ï_VVÆ>¥´´TAAãÌß|óÍéÓ§{õêÕÕµx{{³8éfh—˜˜¸téRYYÙO¾’Nž<ùرc?~$@¨Ð´€µµµSRRا¤¦¦jiiqœ933søðáŸlÂb[€{ŽŽŽNNNššš¯_¿fÿ>ÚÔÔäíí}íÚµQ£Fýý÷ߤ“šðìÙ³ا888pœ™ã&,¶e¸tîÜ933³W¯^}ûí·***ìöêÕËÆÆ&<<<44ôÏ?ÿtvvþðᩨ„¦GUUUéééyzz®ZµŠÁ`øùùùûû§¤¤ÈÈÈ´ÎÐñ^q„À¥;w?¾Ó™6oÞ}ýúõaÆQ€8‘;KVVöÖ­[ jjjjjj‰‰‰111mí =Çb±Ö¬YsíÚµøøxnÚ—Á`HHH:thÅŠ¦¦¦¯^½âwBá†M=° ¢`Ó¦M>¼~ýz7Ξ÷÷÷ßµk×;wÔÔÔø‘ €>ø×½ù±P ¹½{÷Þ¾}ûöíÛÝ»vÍ’%Kª««gΜyÿþ}EEEžÇØÔã[À ÜÂÂÂÖ¯_ÿðáÃOŽ·êª­[·&&&^¿~½wo|•¡Å¿F@Óp€!öüùóiÓ¦]½zuâĉ=\TKK‹½½ýèÑ£}||x’ €†PÀ”Bƒ°jll422Zµj•§§'OøáÇñãÇ;vlÖ¬YÕÔÔtîÜ9WWWÒAºfÀ€æææ—.]"€00€ ŠŠŠ1bÄèÑ£Ié²Å‹Ÿ>}št ÂPÀ‚êôéÓ‹/&¢;ìííSSSsrrH  *++¯_¿>oÞ<ÒAºCBBÂÉÉ)((ˆt’PÀéâŋӧOWTT$¤›0 €Hnnn¤Stß”)Sjkk“““I  xòòò’““mllHé>11±E‹9s†tbPÀ‚çÌ™3ÎÎÎRRR¤ƒôˆ››[PP.K "  xΜ9#p§ÿ~nìØ±***wîÜ!€ 0€€yþüyYY™™™é <àêêŠc¡Ad¡€Ìùóç]\\ÄÅ…áÍëââÚÐÐ@:Âð)ÁÁÁzúïç† ¢©©C:(`AòôéÓªª*CCCÒAxfÞ¼yÁÁÁ¤S€$ÁÁÁ ,#„g\\\._¾ŒQhA(`A"LãÏ­ ¤¥¥uóæMÒA¨†)))õõõ'N$„Ç\\\0 " 0.\¸0þ|an5wîÜË—/üø‘tJ¡€†ð?·RQQÑÓÓ‹ŠŠ"€R(`Á””ÔÜÜl``@:_àXhAô-àììlggg999999ggçîÝýàÁOOOuuu UUÕ3f„„„P€ÁÁÁóçÏ'‚_œ¯^½ŠQh)4-àêêj ƒ¬¬¬¬¬,KKËÚÚZŽ3¯[·N__ÿúõëÕÕÕÏž=Û²eËž={vîÜIqf¾ºxñâܹsI§àeeeŒBƒ¨c±X¤3pàããóøñãÀÀÀ¶)nnn†††ëÖ­ãæé™™™'N,//ïÞÚÅÄhú²€ÈJNNvrrÊÌ̾#°Úøúú&$$œ:uŠt€ÿà_#Ðt 8""ÂÝÝ}Š»»{xx8—Og2™½zõâC.2BBBæÎ+ÄíË`0æÎ{åÊ\‘DM 8--MOO}Š®®nzzz§O¬¨¨ˆ?þªU«ø–€j!!!ÎÎΤSð—ŠŠ ® "…¦\^^®  À>EQQ±¬¬¬ƒ§ˆ‰‰‰‰‰ÉËË›››ËÊÊz{{ó7"UÒÓÓ«««…éúÏí™;w.Ž ÑAÓî‹Åb± ƒ‚‚ÒÒÒöîÝÛéS¼½½Å8¡ -÷BCCœœDá/ÓÉÉ)""¢¹¹™t*д€û÷ïÿÉöniié'ÛÄ 8páÂ…'Nœètfooo'ÝÏ À¡¡¡sæÌ!‚ Æ :tèÝ»wI M X[[;%%…}Jjjª––—OŸ8qbQQrP-777++ËÄÄ„tŠ|ñÅaaa¤SP¦<{ö쀀ö)\>=>>~ìØ±|È@µK—.988ôîÝ›tŠ|ñÅ¡¡¡ˆQ@Ó^¶lY||ü¾}ûÊËËËËË÷îÝÛz¹«¶Ø÷‡Íš5+<<¼¨¨¨±±ñýû÷þþþ_}õÕO?ýD"8………}ñŤSPGGG§OŸ>Ÿ €%𰬬ì­[·ÔÔÔÔÔÔcbbddd8μuëÖ€€---iiéI“&]½z5$$ÄÆÆ†âÌ|ø@:¿ €h‡ÅbEDDˆxKKK›™™EFF’À/(`ÚyôèQ¿~ýFM:a…ᆠ˗/‹ìáWììííoܸQ__O:_ €h'<<Ì`0¨©©yçÎÒAø @/YYYÅÅņ††¤ƒÐ‚½½}DDé| —ððp;;;qq¼7 ÃÞÞþòåˤSðÞäôaooO:]èèè0™Ì§OŸ’À{pYYÙ‘#GœÕÕÕedddddÔÕÕ9RVVFMDÑQ]]ýèÑ#Q»pÇlmm1 B©ÝÎÍÍ]¶l™ªªjPPдiÓ®^½šŸŸŸŸŸõêUssó3gΨªªzzzæææR@¸]¿~ÝÄÄDVV–tqpp@ƒPj÷>ÃRRRêêê°¶¶æ8Cddä7ß|óöíÛºº:~&$€·_蘛››™™ÙòåËI¡‘ÆÆÆAƒ=}útРA¤³€(â_#´»<þüÄÄÄöÚ—Á`ØØØ$&&Ο?Ÿ±DPcccdd¤é ôÂd2gÍš…`>íðÉ“'¥¥¥;~²´´ôÉ“'yœ@TÅÆÆŽ=zðàÁ¤ƒÐ.‰B GAÐnÀÐ[[Û{÷îUUU‘ÀKð¼yóŠŠŠ>™X^^¾páBþDQ¸e{úöíkllE:/u^Àêê꺺ºmSnÞ¼9a ~-ÉÉɽ{÷ÖÒÒ"„¦pE2\ÜõäÉOOÏAƒùøø>|8%%åÏ?ÿÔÔÔ¤ 8 ¨·{÷îÊÊÊß~ûtšÊËËÓÕÕ-((èÝ»7é, ZÍN__ÿÑ£GÓ¦M³°°7nÜ¿ÿþ+Äí @.€Õ1UUÕáÇÇÇÇ“À3]8KLL¬_¿~ ã_ ”——÷öí[ÒAh 7f!ÃU?yòdòäÉiii111·oß¶³³ËÌÌäw2Ñakk‹ÁÕŽ988„……‘NÀ3ðwß}çàààííýÏ?ÿ(++:thãÆ³fÍÚ¹s'ùDÆŸ¹¡¯¯ßÔÔôòåKÒAx£ó~÷î]rròìٳۦ̘1#!!áÕ«Wü  *jjjââ⬬¬Hvvv8„Fç|þüyEEÅO&öïßÿìÙ³ü‰ Z¢¢¢ŒûõëG:ˆÀn`&¸aæÞôéÓŸ>}ZRRB:´[ÀK–,©­­íøÉµµµK–,áu$ÒÒÒríÚ5Ü€K3f̸zõ*é <ÐnŸ;wnÒ¤IÑÑÑí'7ÃR IDATÍpóæÍI“&;wŽ?ÁDÂýû÷ 4|øpÒAF¡Ah´[À¯^½šqâÅ:îèèH:…0ÓÓÓkiiIKK#€[4½ó¼ÏãÇÛ¦¸¹¹®[·îó™¿ýöÛ_~ù¥íæn©©©NNNÝ^;ÿn¿ ¢©²²rèСïß¿ïÛ·/é,ÂlÆ üá‡H¡Â¿F épDD„»»;ûww÷öÆ—~ýõWö[«Ž9²ƒñjê]½zÕÜÜíËoŽŽŽØ„¦œ––¦§§Ç>EWW7==›çFFFêèèð'@w`ü™fffïÞ½Ã÷o4-àòòrö)ŠŠŠeee>±¬¬lÛ¶mä[4€®©¯¯¿qã†é ¯W¯^¶¶¶¸;! šp÷Ι3çèÑ£¦¦¦ÜÌïíí-Æ ¿s‚H¹uëÖ¸qãTTTHùTssó»wïbccOŸ>Ëq__ßÉ“'»¸¸,Z´hýúõô¿Ü#Ž…BÓ£”••SSSÙoSPP ¯¯ŸŸŸßÞSÞ¿ogg÷ûï¿[ZZöpí8 xhåÊ•£Fúæ›oHùóçÏùå—JJJÇWSS³±±Y´hÑç³ÕÕÕ=~ü8??¿±±±¸¸xüøñæææŸÏ–””TUU¥¯¯/''Çÿì©­­UUU}ûömÿþýÉ&¡Á¿F éY‰ÚÚÚ)))VVVmSRSS;¸ˆn^^žÍÁƒ-,,( À‹qçÎ"kojjÊÍÍ>|øçÍž=»¼¼\RR²ã%HIIM:µÓ¥¥¥;v,55uذa&&&k×®%u†´´ô´iÓ"##9~Ÿ šAÏž=; €}J@@@{×Ñ-**²¶¶Þ¿?ÚèæÑ£G #Gޤr¥ïÞ½óóóspp0`Àúõë9Î###ÓiûroñâÅwïÞ-++ ÐÖÖ&»£Ð (h:ÖZUU¥§§çéé¹jÕ*ƒáçççï’"##Ó:û˜€Á–-[,XÀ«µcxå‡~ß³gek¬¬¬ÔÒÒ²²²²¶¶¶°°0`e«îTcc#“Éä÷ZJKKGŽ™ŸŸÏÃo Êø×ômšwïÞmܸ1&&†Á`XZZ-DŠÈ] @„‡‡ÛÛÛó¼}‹‹‹÷ìÙ£®®Î~­V0hР͛7§¥¥>}zРAü[‘££cDD¾FÍ¡€ø%44”·7ÎËË[¶lÙ˜1c²³³###ù·Éo“'Ož3gÿ–?jÔ(yyù‡òo=GÓÓ]AAÁóçÏy{d~Ÿ>}ÔÕÕ_½zE«C«xëãÇ<9xÊÉÉ)44ÔÈȨç‹àlðÅ¥K—ììì$$$x¸LEEÅ~øAˆÛ·¦¦FCCcëÖ­%%%=\Ôœ9s‚ƒƒy’ €OPÀ|Ê×QV¡$##óðáÃêêê±cÇzyy•——w{Qúúúbbb©©©<ŒÀ[(`Þ+--}ôèû¥Üº$66ö¯¿þâm$A1dÈ__ߤ¤¤‚‚‚#GŽôdQsæÌ¹t鯂ð €÷"""f̘ÑvÝî½|ùÒÉÉÉÃãÛg± ‡aÆ?~|ûöí=Yˆ““ è  À{!!!sçÎíê³6mÚdjjjllüüùs~)ÆÆÆååå/_¾$€3\q‚\ˆz¢ªªjèСÙÙÙ]½JFddääÉ“?¹6ôÄ×_=dÈ­[·’ âW®\155íÆ5ªlllоòòòÚ°aCEE73;;;‡„„ð;@÷ €x,$$ÄÙÙ™t ¡µ~ýúºº:mmí .t:³™™YvvöÛ·o)ÐUkåCÐÐm­7„ÏÌÌTTTlož–––úúz)))*ƒ ™û÷ï¯\¹rôèÑžì»lÙ2--­7R „† Ãõë× ;hß””ccãcÇŽQ™Jø'&&nÞ¼¹Ó91 ´…à¥ÆŸ?~ü¸mÛ6++«•+W®_¿žâ`‡ÉdNž<¹ÓÙ,--_¼x‘——GA$€.AðL}}}dd¤ƒƒÃçµ´´˜™™½zõ*55uÉ’%4¼_¯°b2™¶¶¶aaa¤ƒ|  À3ÑÑÑãÆãx£=qqñóçÏ+++SLÄaè  À3—.]êàúÏêêêT†Yß|óÍöíÛÛ¦XYY%%%õü¼…àÆÆÆË—/ã$â¶lÙ’œœlbbòâÅ‹Ö)RRR³fÍÂ(4Ð €7¢££ÇŒ3tèPÒAD²²rDDÄÒ¥KÍÌÌÚŽ6wqqáæ¼a*¡€x#88¸õÎýõr&KLLlåÊ•÷ïßWUUmbkk›˜˜XTTD6;\q‚\ˆºª±±QUU566vÇŽ™™™gÏž3f éPð®®®fff+V¬  .Ä@kQQQC† ±³³SUU½ÿ>Ú—†æÍ›‡Qh lêq€-`è*www&“éäädggG: pöñãGUUÕôôtÒY@ð¯Ð4 €¡K>~ü8xðàôôtœãKs&L˜4i’±±1é, 00 @_W®\™0aÚ—þ.\èáá±fÍšúúzÒq@Ô¡€zêìÙ³ .$:7cÆŒìììÂÂB“ÌÌLÒ‰@¤¡€º¬²²²íßUUU111ŽŽŽó—z÷îíäätõêÕ‹/.Y²dÊ”)YYY¤CèBtÍýû÷utt?~ÜúcXX˜¹¹¹‚‚ÙTÀ¥ œ;wŽÁ`¬Y³æÑ£Gjjj¤èBtÁ±cÇæÌ™óçŸN˜0¡uʹsç,X@6poêÔ©%%%ééé í dáp_p4|®¹¹ÙÓÓóñãÇ—.]9rdëÄòòò#FäääôíÛ—l<àÞ¦M›äää¼½½IÁ€£ ëÕ«×´iÓºaƳgÏ~ùå—‘‚øTHHˆ––VUUU󤧧—••™ššR– xËÍÍ-00°½GÍÍÍf̘Ae$58߆œ†$²X,Ö®]»NžqâÄuëÖ‘=RWW7tèЧOŸ4ˆË§äää(++KHHð5Ð † 袦¦&""×ßRRRŽŽŽAAAÜ?åÀüK¢ Ð5!!!fffSƒ@ðððèÒ(ôfÍšehh˜˜˜È¿T "PÀ]sêÔ)Ò)€7LMM«««Û»,åçÄÄļ¼¼|}}íìì®]»Æ×l ôPÀ ŠÒÓÓmmm?~üØÕ'æææ¦¦¦ÚÙÙñ#POLLÌÍÍ­«‡b988\¿~ý¶Ý€‘såÊ•éÓ§/X° W‘}ø ˆøòË/ƒ‚‚»ô,}}ýÑ£Gó)ˆ0ˆ‹õã?®^½:<<ÜÝݽK Äø³QWW5jÔ7H‘ƒ’››ûàÁƒGuãéñññ ÃÐÐ×¹€0Ò)@äà„Wp0p´téR--­Í›7“}º‡ËÙ°aÃöíÛ[ZZx’ „ €+gΜ±´´8p é ÀžžžýõW7t¼¼¼îÞ½ëèèXQQÁ«` ÄPÀ\9qâÄW_}E:ð‹‘‘‘´´ô;wz²%%¥›7oª««effò*+0§ÚÚÚÇójÏMbbbYYÙÌ™3y²4 §eË–;v¬‡ a2™‡Ú°aÓ'Ox’ „Ž6âa º÷ïßñÅZZZ'Nœ`2™=_ §§çÈ‘#·nÝÚóEmUTT¨««?þ×v8 €[÷îÝ›÷sww'•h%77×ÔÔ´±±ñöíÛ|j_ƒ:dÈ´¯hZ·nÝ¡C‡ø´p111´/0h[ÀiiizzzìStuuÓÓÓIåúxýúµ‘‘Ѽyó‚‚‚¤¥¥ù·¢C‡­_¿žË:spp(((xôèé Ìh:Ö*!!QSSÃ~£ÆÆÆ¾}ûÖ××wüD A ½ÆÆÆ˜ššòu-IIIsæÌÉÌÌÄ–ŠÈ:pà@RRûŽ0M"7M ooo1NH炎0™L~·/ƒÁøý÷ßׯ_öeË–-»qãFvv65«{üøqrr25ëš i÷ïß¿¬¬Œ}Jii)ÏFõööfqÂÛµ€Àyÿþý7póA'++ëîîîëëKÍêÞ¿oee…+žŠš°¶¶ö'g˜¤¦¦jii‘Ê"åàÁƒýúõ#Û¸qã?ÿüSQQAÁºbbb¼¼¼6oÞÜÔÔDÁ8šðìÙ³ا888ʤS¼Æªªª“'Ovzˆ‚!C†Ì˜1ƒ²û#7.!!áÙ³g›7o¦f@M6ªªªÒÓÓóôô\µjƒÁðóóó÷÷OII‘‘‘i¡½½â8Kh444¬]»öÝ»w7nÜ r½|øð!F¡Ubbâ¼yó^¿~MÙÍÍÍ>|PTT¤fuÐ)‘;KVVöÖ­[ jjjjjj‰‰‰111míû9öã§p,•ÈËË›6mZIIÉÅ‹©\oë%Š6lØ@åJÎ&Nœ8dÈÐÐPÊÖØ«W/´¯ˆÀ¦Ø&ëÑ£GNNN«W¯þþûï)þ"uñâÅ?þø#..ŽÊ•Í…††þòË/÷ïß'Èà_# i8@“•““óêÕ+KKKêWmhh¸mÛ6GGGêW ´ÕÒÒ¢©©yüøq333ÒY€‘‚Q6tèP"íUSScooOýªÎÄÅÅ¿ûî»}ûöÌP^^~óæM‚€PÀÿ³wïÞíÛ·‹‹ãMŸZ¼xñË—/HÈÉÉùꫯvìØÑÜÜL*ð>k ãîÝ»yyy...¤ƒ1™Ìo¾ù†àF°®®nbbb||üÌ™3óóóIÅÞBI555>| ‚Á`0vîܹmÛ6þÝ[ §§gbb"ÁàFEEMŸ>}æÌ™Ø(` æåË—ÆÆÆŸ\q…ˆ»wïfgg»¹¹‘ô%))¹eË–={öÌ ..îååuïÞ=|S(` ãôéÓ¦¦¦k×®¥Ã5§¶oß¾cÇÜz:¶bÅŠÔÔTâ÷(ÄER…>q€€uëÖݺu+&&fܸq¤³0nÞ¼YXX¸hÑ"ÒA€î$$$¶nݺsçÎÈÈHÒY@à„Wp0¿%''3FJJŠtƒÁ066þæ›oæÎK:€ÆÆFMMÍ'NL›6t Î¡2~üxš´ohhhmm­““é ˜LæÎ;·oßN:ȰX¬;väää]ƒÑÕÜܼcÇŽýû÷ãÜ_àž««kEEŵk×Hù™I“&QyÍjè9Œµr€!hqòäÉ¿ÿþW~†® Û±cGrr2­¾º=xðÀÝÝÝØØøÐ¡C8P‹‡0 ©¦¦æàÁƒôü6ÓÐÐðã?îß¿Ÿt<_|ñ…¬¬ì¹sçHù##£'OžÈÈÈÄÇÇ“Î\Á¦Ø扄„77·©S§úùùõéÓ‡tœOýñÇ111—/_&Ò¿ÿþëé陞ž.!!A: ðî†D)p555ýôÓOGŽñõõ¥çÑÅåååššš111ÚÚÚ¤³€ rpp˜6mÚ¦M›HþBS ÜCqqqûöí;qâÄàÁƒIgálÆ MMM¾¾¾¤ƒ€{ùò¥©©izzú€Hg>BS ,Ü^½z5uêÔ´´4%%%ÒY@°­[·ŽÅb>|˜tN´´´¨ªª’"pÏlذaëÖ­h_è9ooïàààÔÔTÒA:ñäÉ“ñãÇÿý÷ߨ´ 0ˆ–ðð𬬬µk×’Â@AAÁÛÛ{Íš54/¶ &ܺuëÏ?ÿ´±±ÉÎÎ&þ =òæÍº3Z]]ݦM›>Ìd2Ig!±|ùòººº³gÏ’Ò û÷ïO›6mÒ¤I………¤ãƒ}Àa07ššš8ðÛo¿EEE?žt®ìܹóåË—t;}ÝÇÓÓÓåääHgé\QQÑÀI§$8‹R(àN=~üxùòåJJJþùçðáÃIÇáJFFÆ”)Sžxð í t0uêT//¯9sæTUU‘ÎÂ3ÚÚÚ¢Ó¾|%ü›zÝ Ü[À_}õ•ŽŽNëÍ[Hgá±›7o.^¼øÞ½{¤³üŸU«V½{÷îÊ•+½zõ"º 7c ”p°°JOO·°°¸xñâÔ©SIgøÆÆÆY³fîÕ9¸qñâÅ÷ïß{zz Ù—{ At$77×ÖÖö÷ßGû 1™Ì‹/FFF ÷ ƒG}ïÞ=uuu//¯ÂÂBÒq X8544577“B…’’kk믿þÚÕÕ•tή_¿~ðàÁÓ§O“ÎÂ/ººº.\¸ÿ~yy¹––VNNéDt‡±Vzº  àرcÇŽÓÓÓ PRR"ˆ¿***f̘ann.܃{ ^½zeaañ믿.\¸tþª¬¬”““#‚70 \9xð ––VAAÁÍ›7###E¡}gΜ9mÚ4´/„Ñ£GGFFnÚ´),,Œtþšöå+ÞÔãÁÝ~ûömÿþýåååI¡Buuõ¬Y³&L˜pèÐ!ÒYºàÉ“'666ÿý·é,T{ðࢢ¢`Å„-`àŠºººˆ´oII‰¥¥¥žžÞüA: @×èëë_¾|ÙÓÓóüùó¤³P-))ÉÔÔÔÒÒòÂ… ¤ã†<µµµgÏž‘¬8z÷–hÀ¸IDATî©©©•••ŸŸ.¸‚ÈÐÐðæÍ›ß~ûíáÇIg¡ÔêÕ«³³³—/_þ矪©©•––’ND’ Žµò=‡ Y,V\\ÜÉ“'ÃÂÂLLLþþûoѼÓÀ“'Oìíí·nÝúõ×_“ÎÐ#YYYÖÖÖööö?ÿü³~•|óæÍˆ#H§è.ÄA)zðÊ•+ïÞ½»téÒE‹©¨¨ŽCÆÕ«W—.]zôèQ'''ÒYx ¬¬ÌÑÑqðàÁ'Ož”””$8@SŠž\]]Ý·o_Ò)ˆa±X¿ÿþûÁƒ/]ºdhhH:ÏÔ××õÕW™™™.\:t(é8ä>}úþýû...¦¦¦t¸x'Â!555§‹rû–””888\ºt)>>í B¦OŸ>§OŸvrrš4inóÇ`0,,,† ¶yóæÁƒ¯Y³&33“t"~¡ã¦qD¶€_¼xvéÒ¥¦¦¦¤¤$Š×NgÑÑÑK–,quuýñÇ™L&é8ürÿþ}WWW›ß~ûMJJŠtòÞ¾}{þüy---‚10M)Š ¸©©IGG§®®ÎÞÞÞÉÉÉÜÜœ£.tðñãÇ~øáâÅ‹'Ož´°° €ï***Ö¬Y“””tæÌ}}}Òq€Á@SŒú-ବ,555*×HñññË—/×ÔÔ}úŽCGåååfffVVVÖÖÖfff|}•°Xà•••…††¾zõŠã£h_vžžžóçÏ÷ööFû‚¨Y´hÑ“'Ož={¦««{åÊÒqè¨_¿~þþþ »ví8pàš5kH'êlsÀÃï;ñññgÏž½{÷î›7oLLL¶oß>eÊž,Y(ÕÕÕùøøøøø,]ºtÛ¶m¸œ,ˆ¸ëׯoÚ´iÈ!¿ýö›®®.é84UVV–••Å¿{ ASЇ/÷õë×ÓÓÓ'Nœˆˆ:ÐØØxòäÉ={öLš4éçŸÖÐÐ €šššŽ;öã?Z[[ïØ±C ®\A×®]KNN611100••íÞBPÀ”êÒË]XXøøñ㦦&¾¦V §NÚ¿¿††ÆîÝ»ŒŒH' ÊÊJ___{{ûï¿ÿ^°nf@PBB¹sçîß¿Ÿšš:lذ_~ùeöìÙ]] ˜Rܼܙ™™›6mJJJª­­500pppX»v-5ñ„F~~þ‰'Ž=ª¯¯¿mÛ6 ÎtìLJòõõ511Y»víôéÓEð–ÝÓÔÔôìÙ3EEEŽ—:innîàÜ0¥Ø_î>p¼¿PEEELLŒÁðáÃ) 'ø###Ož{öì÷ßgß²Bw";;{ãÆ7oÞd03gÎ|øðáÇÊÊÊÊÊÊ’’’¢¢¢¢¢¢ÂÂÂüüüìì좢¢¾}ûŽ1BCCcÈ!#FŒ=z´¶¶6ýõõõééé/_¾ÌÈÈÈÎÎÎÊÊzýúunnn¿~ý 4lØ0%%%eee•()))**ÊÉÉõë×ONNN4ïÑ„„DMM û×·ÆÆÆ¾}ûÖ××woBPÀ?~LJJJJJª©©©®®nlllhhh½Ópyy9ƒÁ¨®®®¨¨¨¯¯¯¨¨¨«««¬¬¬ªªêß¿ëÛ¬_¿~ ***ÊÊÊJJJJJJƒ6l˜²²2.  ”JJJòòò²³³‹‹‹ ‹‹‹‹‹‹KKK++++***++[ZZdeeûõë'###!!Ñ¿99¹^½zIIIIJJöêÕ«õìÖ‰ãÆ377—‘‘!ý›õ%ø˜LfCCû”†† ‰NŸ¸sçN¾¼¦ DøT^¿©Ç¥!hÚc [w![÷Ð6mƒ1­»p;ÂŽhkk§¤¤°OIMMÅÅ•€Î„¡€gÏžÀ>% ·F:£ïV?÷ªªªôôô<==W­ZÅ`0üüüüýýSRRº½óŸ¶ƒ!´ Æ@¶îB¶î¡m6Úc [waº#²²²·nÝJHHPSSSSSKLLŒ‰‰‚Cï@ˆÑ÷KA´ý.FÛ` dë.dëÚf£m0²uÿ²õòööæÇrÝ´iÓHGàŒ¶ÁÈÖ]ÈÖ=´ÍFÛ` dë.>e£ï—!& û€ €0(`PÀ €@€  @ €0(`Ä>C:£F¢O¶xzzª««KHH¨ªªÎ˜1#$$„t¨ÿ‰?¾’’R¿~ýŒŒŒÂÂÂH'ú?III«W¯–——§Ïevv¶³³³œœœœœœ³³sNNéDÿ‡†/W+:ÿÑù½ÉŽnŸiT >Cÿ—¥¥¥ÅÊÊ*((ˆ>Q'MšäëëûâÅ‹úúúÒÒÒ7nŒ?~ÇŽ¤s±X,ƒÁ˜>}úÝ»wkjj=z¤§§wüøqÒ¡þGKKkçÎÏž=£ÉeUU•††Æž={ÊÊÊÊÊÊöìÙ3jÔ¨ššÒ¹þ‡n/W:ÿÑù½Ù††Ÿi$¡Ë¯J+ôù hÏï¿ÿ¾xñb½£fddÈËË“NÁb±X›7oniiiû1%%ECCƒ`Žhò_yàÀWWWö)®®®üñ©<í¡ÉËÕF þÆÚÐç½Ù††Ÿi$Áí9 ó­¡ FrròÂ… =z$++Kç¨ÙÙÙ%%%¤ƒ|ª¶¶¶ÿþõõõ¤ƒüMþ+-,,¶nÝjeeÕ6%**êçŸމ‰!˜ês4y¹ÚCÏ¿±6t{oÒó3‚$ØÌ™ŠŠ “É4h««ë‹/HÇù?uuuîîîþþþ²²²¤³´«¢¢¢u—تU«Hgá 22RGG‡t šJKKÓÓÓcŸ¢««›žžN*€¢íß ß›tþLã{ð{[988ÄÆÆÖÕÕåääøøø 8ðÉ“'¤CýÏÊ•+wïÞÝö#ÝþÙÿ´fΜÙÔÔD:ѧJKKÇŒK:ȧhò_Éd2ا444HHHÊÓš¼\ÑóoŒ¶ïMÚ~¦QPtùUéÌÏÏoÖ¬Y¤S°X,VXX˜©©)û;‡>¬ì ƒ‚‚TUUwíÚE:˘™™Ýºu‹thò_‰î!:ÿ±è÷Þ”Ï4Š€¦¿*e¸ (((‘‘¡2U«Ï³ihh¼{÷î“y¨Æâîu»uëÖСC©LÕª½l¹¹¹zzzÑÑÑÔGê8XÛ£ÔGúÜÀ اäç竨¨ÊÓš¼\Ÿ þ7Æ%RïÍÏÑç3­Sü(QßÌþZt0•‘Ø×ûI¶ÌÌÌáÇr^‘3•¹yÝ&NœXTTDeªV³åååÙØØ8pÀÒÒ’úH£mmí””ö)©©©ZZZ¤ò:üq‰Ô{ósôùLë?Þ¶¢^Àܸpႉ‰ é F‡›M¤£q?vìXÒ) £¨¨ÈÚÚzÿþý¤³ÐÝìÙ³ا888Ê#(ëoŒ>ïMúLãKp·¡,B,,,‚ƒƒóóóÞ¼y³wïÞ<~ü˜t.Îèó?heeVXXØÐЛ›ûÏ?ÿ <øÚµk¤s±X,–¾¾þÙ³gI§èMþ++++ÕÕÕ÷îÝÛv! êêjÒ¹>E“—« ÿÆèüÞüMþg©)Züªÿ¯};fI-Žã8|.´:„Cˆc¸Hƒ‹/@Z4!itqpÌWÑÒЩ%0il‰¢ ZÂ9(¤ ç^ð^ïm¼÷w8÷yF§/Ç#Ÿóç`¦\__·Ûíb±¸±±Q.—ŽŽ^^^¢G})#7kš¦ÓétyÝJ¥R§Ó¹½½õÃ=çóyô®4ýb[ì¤ÙlÖjµ …B¡PhµZk¯èbeðr-eùËòoówùBÿM²ò—gø¯x 0` À@€ €@€ 0` À@€ €@€ 0``¥ÛíŽÇãŸ?999988ˆÚ9ö-MÓè @V|||Ôjµ‹‹‹Z­–$ÉýýýÞÞÞãããÖÖVô4È'``¥X,žŸŸƒÅb±X,ƒÁéé©úÂßà ¬;>>ÞÙÙIÓôæææòò2zä“ëÞÞÞvww???§Ói¥R‰žù$ÀÀºÑhÔh4ÞßߟžžÎÎ΢ç@>y üb2™¼¾¾¶Ûí~¿ÿðð0™L¢A>9+óù¼^¯_]]moo'IòüüÜl6ïîî677£§AÞ8+Ãá°×ë-ë›$IµZ=<<‡±« —œ€ €0` À@€ €@€ßCg#7ÖBšƒIEND®B`‚gsl-2.7.1/doc/images/rand-gaussian-tail.png0000644016036000116100000003422613373111455015443 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœíÝy\TõÂÇñ ²‰€(iF஡$ˆ(¡ jV`i‘¥eåRjÞÇ[áÞµRŸ«ÖÓª™a©=IfjŠûV¸ ¹å‚¢((ÛEEyþ˜.ÍEÖaf~3¿ù¼ÿè%g†s¾sˆóå÷;çÌØh4L«ìX#  (`$ €€@  (`$ €€@  (`$ €€@  (`$ €€@  (`$ €€@ ÖîôéÓ/¿ü²¿¿¿£££££c»ví^|ñÅ={öH ccccصU¥–1ªzfùzìíí½½½ÃÃÃg̘‘‘‘QéJê¯Æ<õ\-  «öÿ÷ƒ êÖ­[RRRAAAzzúÌ™3SRRÂÂÂdG3Ž{¿4ÈÊ‹ŠŠNž<9wîÜÂÂÂnݺ­Y³¦N+1eR·076ùU,ÑÙ³gû÷ï¿{÷îûî»OwyYYÙäÉ“,X +˜1ØØèóË^ÕwUº<%%¥_¿~;vìèÔ©“‘Ré÷*êÿ½€10†õZ°`Áĉ+´¯¢Aƒºí{ùòå×^{ÍÅÅÅ××wêÔ©·oßÖ.¯tDU¾°°°pêÔ©mÚ´qrrruuíׯßO?ýTãCºë¬f»¥¥¥³gÏ~àìííÛ¶m»dÉýö@^Zºví:iÒ¤ò]Wã®Ð>¡Â¬¸Í­[·^ýuooïJgž‹ŠŠÆŽÛ¬Y3gg稨¨ãÇ—?TÍO¤ªm•?mýúõ!!!ÎÎÎÎÎÎ!!!6lÐ]ƒ¡v8 ‹†õÚºukTTTOëÕ«×Ã?œ™™¹}ûöôôô3fÔfåÏ?ÿ|IIÉÖ­[ Ο??a„ŋ×øP-·;nܸ[·nmݺ5//ï³Ï>[¸páwß}W»m€—V'Ÿ|rçÎVõz+LŒ—?ÿÕW_ =sæL¥ÖÑ£GwìØñرcçÎ8p`dddZZZÁªÚ–Ö^xá…ñãÇ_¸páüùó¯½öÚÈ‘#“““ËŸ`¨ü `­nß¾]§oÉËË{ðÁµÿ®ô×§|aãÆ *]I5Uõ+Ya»o¿ý¶î£6lèÑ£GõÉküe¯ô¥Uõ]U-¿uë–££c…çÔéõ !,XPÕÓ„3gÎÔ}hÆŒ#Gެ&U5¯¥|ÉO<±téR݇/^]þ4=v8P# ÖËÁÁáÖ­[ºKîýÛôÖ­[3fÌh×®£££vyÆ ËŸ|ï:Ë3&##ãÞçTóP-·{îÜ9ÝïÊËËsww¯þÅÞ›¶6/­®|óæM''§ Ï©ÍëÕ]rþüùªžvïk?{öl‹-ªIU›¾ÿþû/^¼¨ûPzzzëÖ­«Úhmv8P#¦ a½Z¶l™žž®»¤ü£|É´iÓöíÛ·jÕªììlFsëÖ­ÒÒÒªVXVVVþïo¿ý6;;Ûßß¿C‡qqq‰‰‰å«­æ¡Zn÷Ð}²»»{~~~]_~^Z-]¸pÁÇǧÂÂÚ¼^]÷ž•×Uaý>>>ÙÙÙU=Y÷'R«W¯zyyé.ñööÎÊÊ*ÿÒ ;¨HJíæ`̘1ï¿ÿ~¥•ÿjøøø\ºt©|¹ö’í¿ÝÜÜòóóu¿ëìÙ³~§nß¾’’òÉ'Ÿ½øâ‹5>T›íVúk[ãïò½O¨Í&ªZmUËçÌ™3zôèJŸSýë­~Í¢v#àê"ÕlëÞðÅ‹uGÀÕDôÆÿC°^ÇoÑ¢E…ºVùáÕÝÝ];@ÔšT›íŠA6QZZšŸŸ¿wïÞ)S¦ôë×ïã?îСC…çTózýüü~þùç:M}Ÿf̘œœœÑ£GËÎ@•l4ì õ5eÊ”ùóçÛØØh¿LMMŽŽ>{ö¬ÜTTC…® ¨¨ÈÝݽ¸¸Xvª¤Â9à 6nÜØ¹sgÙ)¨Žj#༼¼ÐÐÐÏ>û,,,Lvª¦QHVVÖ#<²mÛ¶Z>ÿÝwß­tŸ888˜ø§0[Fê,uFÀ—/_`Åäääܸqã¨3Žj³9k;Bïõ2†ú–/_>aÂÙ)`-Ö¯_ß³gOggg“ÍÓ^¾|ùµ×^sqqñõõ:uêíÛ··- õi4šß~ûMv X…;wŽ1"666---++kéÒ¥+V¬0ê±W¯^?üpffæöíÛÓÓÓg̘a¼mi5oÞÜÎήE‹±±±§N2öæTe]3 µdm,Ê›?þ[o½uùòeÙY ¸Aƒ…††þýï/_2cÆŒ­[·îÞ½[ûeõCá{yòä   œœœµk×Λ7oóæÍ]»v­}HËÂ4 ?í/ÏÁƒeú8ðì³Ïê.yî¹çtLjÕB»[¼}ûöÌ™3Û·oïäädccÓ´iÓôôtãmN‘˜˜æààвeˉ'ÆÇÇO›6­ÆïŠ¿÷òi“‰×ïÅ õi4š† RÀ0 ->>>ׯ_7Þ§M›¶oß¾U«Veggk4š[·n•––os÷ŠŽŽÞ³gOO‹¯þ¯£2ÏVáÀꕕ•uìØ199Yv¨ÏÓÓ3##Ãßß¿|É¥K—î»ï¾ò/ë:'\£5kÖüúë¯-[¶Ô~™––¦û¨Á7g¤•X'FÀPŸF£ f èÛ·ï×_­»ä«¯¾êß¿ù—ÕÔôØâ­[·Ê¿\¶l™î£ßܽV¯^Ý«W/ƒ¬ÊÚ0†ú4M‹-ìíí/\¸ÀÝÀ0ª·ß~»W¯^nnnÏ<óŒ"!!áóÏ?7øEøº—EEEMœ8ñƒ>hРÁŠ+.\¸`ØmUØ\ddä+¯¼Ò»woŒŒŒU«V-\¸póæÍߨ5` õi4›   Á0¶öíÛoÙ²eãÆþþþþþþ[¶lIJJjݺu]×S~õP… !òòòš6mZþÌÅ‹ !:uêÔ®]»'NT×sLŸ>=!!¡sçÎNNNaaa§NÚ³gO`` ÷ÛT†ÛÔ2sæÌÒÒR;;»›7oΛ7Ov ^/^|úôimïŒ׌€¡>í¸{÷¡€/¿üòÅ_”À9`¨¯¼€:¤ý·ìD€þŽ9"; ƒ0ÔWVVÖ AƒfÍš5iÒ¤ÂM  õ•z™…`>(`¨¯¼€~øáC‡ÉŽBPÀ°Œ€˜! êÓ9r¤¬¬Lv" €aÊ ¸iÓ¦§OŸ–(`XíUÐÚü}@0Ô§{ïoPP‹ÀPÀPŸn3`&(`¨O·€?^\\,7PÀPŸn;::¶mÛöèÑ£r# õUxÿgf¡˜ êÓ½ Zpó@Ãêÿú믲S°v0ÔWaÜ©S§¬¬¬üü|‰‘€†ú*œnРA`` ³Ð䢀¡¾ ,„èÑ£³Ð䢀¡> €¢€¡¾ 瀅=zô8pà€F£‘ (`¨ïÞp‹-ÏŸ?/+PÀPß½,˜…  õQÀÌ õUZÀÁÁÁ܉@" ê«´€»wïžššz÷î])‘€†úî½ Záìììëëûûï¿K‰0ÔWéXð±H¤¢€¡¾ª ˜E  õ1`†(`¨¯ªîÒ¥Kzzúõë×M (`¨¯ª¶µµ}衇:dúH@C}æÞ« µBBBöïßoâ< (`Xƒ²²²JGÀBˆž={8pÀÄy@PÀ°UMA !zöì¹ÿ~> €éQÀP_5ìãããäätîÜ9G ꫦ€§HBC}Õ0§HAC}Õ\-„†úª¿Æª[·n§OŸ¾yó¦Éò€ €a *ý4¤rööö¼'%£€¡¾êÏ !BCC™…`b0ÔWckï6Y0¬AÜ«W/ÞŽ€‰QÀP_ìíííââræÌ“E ê«þ",­ž={îÛ·Ï4y@PÀ€§˜ õÕ8-„ e À”(`¨¯6SÐ/^ÌËË3M$ €¡¾ÚŒ€mmm»wïþ믿š&PÀP_m X0 À´(`¨¯6SÐBˆÐÐн{÷š  Ö –#àž={zô¨ " «P›œ`B0ÔWVVF070ÔWË)hA0! ê«åUÐBˆ6mÚgdd;PÀP_íGÀBˆÁLÀ| øðáÃãÆsss«Í¡Óæ&HKQ§æS˜†ùðÈ‘#½¼¼jÿÆšÿdÔl°,u*`N0 [ÙªtüøqÙ ˆ:p÷îÝ?^TTääädÔT¬œùŽ€C©S;::vîÜ999Ù¨‘@nÞ¼¹]‹-bccO:%;ÌHí¯‚ÖêÝ»÷ž={Œ—„2>>¿ÿþ»ñ"€šL‰BW] XÑ»wïÝ»w)U xõêÕ½zõ’æB¿æ40£²ÔÖ=žFFF®]»6++ëîÝ»çÏŸŸ;wî¬Y³æÍ›'1ÌŠÆ€Q™oë^UýåQÓ§OOHHèܹ³““SXXØ©S§öìÙhÚ¼0_u½ IáëëkggwîÜ9#Eó}'¬êÏãê>aüD°TzŒ€…aaa»víòóó3F$0ß0`(z0³ÐŒ‡†úê36F0¬~Ü¡C‡ÂÂÂŒŒ cD êÓh4u½KaccÃÍHŒ‡†úô~c–Gy„YhFBC}z܆¤ÅuXŒ‡†úô;,„ÈÈÈÈÍÍ5x$ €¡>½ ¸aÆ!!!{÷î5x$ €¡>½ X0 Àh(`¨O¿« µ¸€‘PÀP_YY™Þ#àààà'N6PÀ@uìíí8 ;ÕPÀPŸÞ·!iq70c €¡¾ú\„%„ß±c‡áâ€0¬A= 8444%%åæÍ›Œ0ÔWŸ« …NNN]»vÝ¿¿# õÕç*h­>}úìܹÓPy@PÀ°õœ‚œ`0P3íiࢢ"ÙA¨ƒ†úêy’ø÷i`Þ€QÀP_ý§ …Û·o7H0¬A ¸oß¾0¢€¡¾úOA !zöìyüøñëׯ$PÀPŸAFÀöööAAA{öì1H$ €¡>ƒ°`€AQÀ@mEDDlÛ¶Mv Š €¡>ƒœBŸ;w.??¿þ« ê3Ô´­­m=vïÞ]ÿU õÕóÃtõéÓ‡÷¤`0ÔWÿc(×·o_ €APÀPŸ¡¦ …Ý»wOKKËÍÍ5ÈÚX3 ê3`ÛÚÚöìÙ“ÓÀêꆻ õê6$­ˆˆˆ¤¤$C­ €Õ¢€¡>^-„ ¼zõêåË— µBÖ‰†ú x´¢Aƒááá¼%€z¢€¡>^„¥É,4€z²Ñh4²3˜v‹R4hPZZjÀ>sæLŸ>}˜…¬ñ0Ôgðp›6m5jtêÔ)®€µ¡€¡>ö¯Vddä–-[ ¾ZÖƒ†â {V¹~ýúQÀꃓ•à°JJKKíííKJJ »ÚÜÜ\??¿ììl;;;î€Yá0 'ƒŸÖòððð÷÷ß¿¿Á× ÀJPÀPœ‘ XÑ¿f¡è†âŒWÀœPœì¬ç€UR\\ìêêzûömc¬ÙËËëÂ… îîî_93Á9`@O†ý$]ööö¡¡¡|2ýPÀPœñ¦ …ýúõÛºu«‘V@m0gÔ~ôÑG9 @?0gÔîÒ¥ËÍ›7ÏŸ?o¤õP ŵ€mll"""ød$z €¡8£°`€¾(`(N£Ñé*h­þýû'%%•––o”DCqFú0†r>>>÷Ýw_rr²ñ6@I0gì)h!ÄÀ7mÚdÔMP ÅQÀÌ Å™ €{÷îýÇdggu+CCq&(`;;»ððpÞ @PÀPœ±¯‚ÖŠŠŠÚ¸q£±·@%0gì« µ ´iÓ¦²²2co€2(`(ÎSÐBˆV­Zy{{s3€Ú£€¡8Ó°bРAÌB¨= Š3YGEEýüóÏ&Ø5PÀPœi.ÂBôîÝûìÙ³W¯^5Á¶(€†â4i6dkk¹yófÓl€¥£€¡¸²²2ÓŒ€7#¨ Š3Ù9`!DTTÔ/¿üÂ'#¨ 8//oéÒ¥111¾¾¾ÎÎÎÎÎξ¾¾111K—.ÍËË3MD >LYÀ-Z´hÕªÕo¿ýfšÍ°hUpFFƘ1c|||úôé³aÆÌÌÌÌÌÌ 6„‡‡óÍ7>>>£GÎÈÈ0e\ ®LYÀ‚YhµfSÕ%*ŽŽŽ¾¾¾ ,8p`¥Oظqã›o¾yþüù[·n3¡66UîXœsçÎ 0àìÙ³¦ÙÜ®]»Þ|óMÞ‘P†ñ¡ÊððáÃ]ºtÙ±cG‡Œ¬NFŽéååµwï^ÙA`v¤ðã?¾aÃnfP ÛÚ?ÕÆÆÆÕÕµY³ff8Ê<~ü¸ì0S&¾ ZËÏÏÏÝÝ=99988ØÄ›`)ju`:räH=Ž?ž””´}ûöÁƒŸ;wÎØÉƒ2B :ôÇ4ývXŠš ø­·Þ:th||ü—_~éííýÏþsÒ¤I x÷ÝwM¨'Yüøã'&&š~»,EÍ|áÂ…”””!C†”/yôÑG“““OŸ>mÌ`€aÈ*à   ÜÜ\“½&‹Ss÷Ýwº»»¯ZµÊ8‘L'>>Þ¦2²sÁdpƒ † Â[b¨ŠU¿V||¼¦2²sÁ4é/ÂÒâ40€jTy`Š‹‹«ñ­|ŠŠŠâââ  0¤²²2Y³ýúõ;räHnn®”­0sUð·ß~´uëÖªž°eË–   o¿ýÖ8ÁÃ5-„°··ïÛ·ï¦M›¤l€™«²€OŸ>Ý£GÁƒ‡‡‡üñǧN*,,,,,~¦÷믿N˜0áÀR¶ž››ëï•eoo/%€z2^#ÔðNXžžž&L˜0a‚1¶m@ô%ª"wìááÑ¥K—mÛ¶EEEÉÊÀœ¿èaÌ¡€£££øá‡²²2¹1˜•š ¸ªÛ' 0|XvòQÀPœYMA !žzê©{ßÙ€2£` æs´Öˆ#V­ZeVãrRPÀPœYBtéÒÅÕÕuÿþý²ƒŒ†âÌm Zü{,;ÉÌëÀœNöŽ1bíÚµ¥¥¥²ƒ‰†âÌm Záççwÿý÷'%%É@& Š+++3·)h!ijÏ>ûÍ7ßÈN@&³;0†e†#`!Ä3Ï<óã?Þ¼ySvÒPÀPœy°——WHHÈúõëe  Å™g !bccW®\);i(`(Îl ø‰'žØ»woNNŽì ä €¡8ó¼KѸq㨨¨µk×Ê@s<0d¶#`!Ä3Ï<Ã;rV‹†â̹€xâĉôôtÙAH@Cqæ\ÀvvvÑÑÑ|8`(`(Μ XûÕW_ÉN@ Š3ÃcÐV\\|ðàAÙA˜šù˜ƒ0·Ï®ÀÆÆfÔ¨QË—/—€©QÀPœ™OA !âââ¾ûî»ââbÙA˜ õ™y·lÙ²k×®‰‰‰²ƒ0) Š3ó)h­^xYhÀÚPÀPœùOA !¢££ûí·K—.ÉÀt(`(Î̯‚Örtt6lŸÍXs?0õ¤ÑhdG¨•¸¸¸eË–YJZõGCq1-„èÑ£‡½½ýîÝ»e`"0g¶Ÿ†t¯—^zéóÏ?—€‰XÆ Ð›¥Œ€…#GŽ\¿~}~~¾ì L†â,¨€=<<¢¢¢¾ùæÙA˜ ÅYP !ÆŒÃ,4`%«¨±0?IDAT(`(΂Î !úôésóæÍäädÙAŘýXÖØÆÆ&..î‹/¾€ÑQÀPœe°âÅ_\½zõ7d`\0ÔgYܼyó°°°5kÖÈÀ¸(`(Î">Œ¡‚±cÇ~üñDzS0. гˆ÷‚® **ê_ÿú—bj³°PWwXacc3f̘>úHvFd+;`\úñ/¾øb›6mrss=<}ìØ1ÙA ÅYÖ‡1T`gg7vìØ%K–ÈÀð,õÀÔ’åžÖzùå—W¯^——';£€¡8K/`OOÏAƒ-_¾\vFCq–^ÀBˆñãÇ/Y²¤´´Tv†DCq pppð}÷Ý÷Ã?ÈÀ(`(΢oC*÷ÆoÌŸ?_v †dñ& z}R¹Çû,$$dúôéîîîîîîÓ§OæÞGèGÕ õõõ]±b…ì ôa¦¼~ýúQ£Fé.5jTbb¢¬<°\ê݆¤kÆŒ3gÎärhÀ™i?~< @wÉC=tâĉj¾¥yóævvv-Z´ˆ=uꔑÂb(<-„ mß¾=÷–ÈL 8??¿iÓ¦ºK<<<òòòªzþСC׬YSXX˜œœž’’bü˜°j°ø÷™àââbÙAÔ™p]%&&†……988´lÙrâĉñññÓ¦M«ñ»âããï½|Z탵R¾€{ôèðñÇË nÌ´€ÝÝÝ+Œwsss+Œ‰«½gÏžŸ¯©Œ>‰a®T½ I×üùóß{b‚ÙAÔ™˜:uêtôèQÝ%©©©;v¬å·S¢(§üXѾ}ûAƒ½ÿþû²ƒ¨3-à!C†T¸¹bÅŠC‡­å·¯^½ºW¯^FÈËc ,„˜1cÆ'Ÿ|’™™);€Ú2Ó3f̾}ûæÎ›ŸŸŸŸŸ?gΜŒ=ºü º‡ÔÈÈȵk×feeݽ{÷üùósçÎ5kÖ¼yód‡Ù±’nÕªÕèÑ£ãããeP[fZÀ...Û¶mKNNnݺuëÖ­<˜””äìì\é“§OŸžÐ¹sg''§°°°S§NíÙ³'00ÐÄ™až4ò瀵¦M›–˜˜xüøqÙAÔŠ §KïecÃnQG\\\xxø /¼ ;ˆ),Z´hÛ¶m?þø£ì €:Œ×V12€5³†« Ë7îäɓ۶m“@ͬåÀ«e%瀵5j4kÖ¬iÓ¦1…˜? 곞B >\±jÕ*ÙAÔ€†âÔþ0†{ÙØØ,]ºtÊ”)ׯ_—@u(`(Îz®‚.Ô¿ÿ¹sçÊ :Öu`‚²Î³¡ï½÷Þ—_~yòäIÙAT‰†â¬ê*èrÞÞÞÿûß_~ùeëüû°Vw`‚µ±ª« u½úê«×¯__½zµì *GC}ÖYÀ 6\ºtéäÉ“ egP г¶« u…††FFFΞ=[v• €¡8+¼ Z×?þñeË–q5`†¬÷À+aåW!y{{¿ýöÛ¯¼òŠ•ïÀ QÀPœu^­ëÕW_---ýä“Odð¬úÀ+aµç€µ4hðÉ'Ÿ¼óÎ;²³ø  ÅYímHº:vì8~üø±cÇÊà/0gÍWAëš6mÚÕ«W¿úê+ÙAü‰†âkÙÚÚ~ñÅo½õVff¦ì,„ €¡<+¿ IW@@ÀË/¿ü_ÿõ_²ƒ‚†ò¸ýF×ôéÓ322¾þúkÙAPÀPSкììì–/_>yòäôôtÙYkGCqÜ\A@@ÀÔ©ScccKKKeg¬&¨p“&Mrrrš3gŽì €U£€¡8FÀ÷jРÁ×_ýÉ'ŸìرCvÀzq`‚⸫RÞÞÞŸþù /¼——'; `¥(`(Ž‹°ªóÒK/ñ7  Å1]÷Þ{ïêÕ«K–,‘°F¶²FǸ*vvv+W®ìÙ³gppp=dǬ #(Ž÷‚®Þƒ>øÅ_<ýôÓÙÙÙ²³Ö…†â8\£!C†ÄÆÆ>óÌ3%%%²³V„†âx/èÚ˜={¶££ãäÉ“e¬&(ŽK|kC{gð¦M›–-[&; `-¸ Šã*èZrssûñÇ{÷îíïï&; >LþÔ¶mÛeË–=ûì³²³ê£€¡8Î×ÉàÁƒ'Mš4xðàëׯËÎ(ŽÇUÐuõÆo„‡‡ÇÄÄܹsGv@e0Ç}ÀzX¸p¡‹‹K\\—°ÆCCqŒ€õаaÃo¾ùæÒ¥Kܘ ÅQÀúqttLLLܲe˼yódgÔÄmHP¬7ww÷Í›7‡……5mÚtìØ±²ãª¡€¡8î®-ZlÞ¼¹OŸ>...Ï>û¬ì8€R(`¨p}øùùmÞ¼922²Q£FÆ “P ÅqtýuìØqÓ¦MBÐÁ€¡PÀPç€ " `Ó¦MQQQ%%%#FŒP ÅQÀ†°eË–?ÿüó²ã†â(`êÔ©SRRRÿþý _{í5ÙqËFCq¼´aµk×n×®]ýúõËÎÎŽç@o˜ 8.Â2¸Ö­[ïß¿ëÖ­qqqwïÞ•°T0ÇØ<<<~ùå—ÜÜÜAƒñ¹I€~80Aq|œ€‘8;;ÿðþ¾¾W®\‘°<0ÇEXÆckkûé§Ÿ6¬gÏž)))²ã††â(`c›6mÚ‚ ú÷ïŸ ; `I¸ Šã° ÄÄÄ´mÛ6:::99yþüùvvv²€ÇØ4ºté’œœœ––Ö§OŸŒŒ Ùq @Cq°É¸¹¹­[·î±Ç þå—_dÇÌ Åq°)ÙØØL›6-!!aôèÑS¦L¹sçŽìD€ù¢€¡8FÀ¦×§OŸ#Gޤ¥¥¥¦¦ÊŽ˜) Š£€¥ðððøþûïßxã~ýúÍ;·¤¤Dv"ÀìPÀP,ÑóÏ?ðàÁ;w†††=zTvÀ¼PÀP·!ÉÕªU«M›6½òÊ+ ˜2eJaa¡ìD€¹àÀÅ1–ÎÆÆ&...555''§cÇŽ«W¯–0 0ÇUÐfÂËËkÙ²eß~ûíœ9sxâÄ Ù‰É(`(ްYéիסC‡¢¢¢"""ÆŒsùòeÙ‰i(`(Ž67¶¶¶&Løã?š5kð·¿ý-??_v(@ Š£€Í“««ë¼yóRRRrssÛµk7wîÜ7nȘ Åq´9kٲ姟~ºgÏžcÇŽùûûÏš5+''Gv(ÀD80AqŒ€Í_Û¶mvìØqéÒ¥víÚM˜0áâÅ‹²CFGCq°¥hß¾ý§Ÿ~zìØ1{{ûÀÀÀ‘#G8p@v(Àˆ(`(ŽÛ,K‹-æÏŸŸ––Öµk×Q£FuíÚõÿ÷yû(‰†â[¢&Mš¼ùæ›üñÇ‚ ’’’Z·n=vìØh4Ùу±áè{ÙØ°[Ôáææ–žžîêê*;ô—™™¹lÙ²o¾ù¦¨¨(66vÔ¨QmÛ¶• ÖÂx@ÓT‚V‰««kFF†‹‹‹ì 0€ÔÔÔ¯¾ú*!!¡U«VÇòÉ'|ðAÙ¡ 8 ؤ(`•4iÒäÊ•+7–SZZº}ûö5kÖüøã^^^O<ñÄ!C~øaî7ƒ1PÀ&E«ÄÅÅ%++ËÙÙYv^YYÙúé§ÜÜܨ¨¨~ýúEDD4oÞ\v4¨ƒ6) X%ÎÎÎÙÙÙNNN²ƒÀ¸ÎŸ?¿iÓ¦-[¶ìܹ³yóæ>úh¯^½z÷îíãã#;,lR°Jœœœrsse‰”••>|xÛ¶m{÷îÝ»w¯§§gïÞ½ƒ‚‚BBB:wîÌ45êŠ6) X%ŽŽŽùùù²ƒ@‚²²²ÔÔÔýû÷'''ïß¿ÿÊ•+ݺuëÞ½{PPP×®]ýýý6l(;#Ì\ƒ‹/Nš4iË–-Bˆ~ýú-Z´¨U«Vz¯V‰ƒƒCAA½½½ì ///ïСC‡:xð`JJÊ•+WÚ·oß©S§.]ºtèСM›6~~~vvv²c¼PÀÕ¹qãF×®]ãââÆ'„øè£¾úê«””½OûQÀ*±··¿qãGUÜ«¨¨èĉÇŽ;vìØ‰'Ξ=›‘‘áçç×®]»6mÚøûûûùùµjÕªeË–ügÍ(àê,\¸ðСC+W®,_òÜsÏ?^¿RÀ*iÔ¨QQQ‘­­­ì °ÅÅÅ'Ož<}úô™3gΞ=›–––‘‘qùòå¦M›Þÿý-[¶lÕªÕý÷߯måûï¿ßÓÓ“¿í”GW'""bÚ´iýû÷/_òË/¿üãÿHJJÒo…°Jlmm‹‹‹9Õ½•••eee]¼x1##ãÒ¥K/^¼té’öÙÙÙnnn^^^žžžÍ›7÷òòjÖ¬™««kÓ¦M====<<Êÿ-ûE@pu¼½½SSS½½½Ë—deeuëÖ-33S¿RÀ*iذáÝ»w¹öÆ Ñhrrr²³³srr233¯]»–}ýúõ¼¼¼ìììÜÜÜ‚‚‚œœœüü|77777·&ÿæêêÚ¸qcGGG'''WWWíC¶¶¶...Úÿººº6jÔÈÑÑÑÁÁA»Dökµ^pu5jtóæM݉ »wï6nܸ¸¸X¿RÀ*iРAii)ŸÇ‰ÊÊÊ òóó¯ÿ[AAÁÍ›7‹ŠŠŠŠŠ®_¿®}¨´´´°°°¤¤Dû„»wïß½{÷ÆBwww!DãÆíììììì´ïïæì쬗””ØÛÛ÷ìÙ³  àرcwïÞ-àää4vìØ©S§ò%z0b#h,ŸÝ;wt—ܹs§Q£F5~ã»ï¾k”} Pˆ‘ÊK…¡SÐæ€¦ö›~Øoz`§éÇxûM…c:u:zô¨î’ÔÔÔŽ;ÊÊ@T(à!C†¬X±BwÉŠ+†*+5RaF¢°°0 `ôèѯ¼òŠâ£>Z¶lÙÑ£Gõþ&jôÀNÓûM?ì7=°ÓôÃtu\\\¶mÛ–œœÜºuëÖ­[m´–¦L™2þüò?¨SSS£££Ïž=+7•%:wî\÷îÝóóóe± ,HIIY±b¿ªµa‚½ÄøOëׯ5j”î’Q£F%&&ÊÊ…½ÿþûºÓYþþþœïÐ]Æ e§° )))Ÿ}öÙÒ¥KeÁ_(à??~< @wÉC=tâÄ Yy`=6nÜØ¹sgÙ),LAAöTú+¯¼";‹¸uëÖ¨Q£–-[æââ";‹%iÞ¼¹]‹-bccO:eðõSÀÊÏÏoÚ´©î¼¼3fLiiiiié˜1c>üðCÚ0FÀ*Š‹‹ëܹ³F£Ù±cÇO?ý$; & @EW¯^ŒŒ,((ضm[›6mdÇÔD¨hüøñ}ûöÍÉÉùý÷ßÿùÏÊŽ¨‰sÀþÃÖ­[Ï;÷ä“OŽ=:%%eëÖ­²jb à/ùùùAAA›7oöóóBœ8qbÈ!‡rww— P #`7n\ll¬¶}…;v|öÙgÇ'7 $FÀHÀ (`$ €€@  (`$øesbñ÷I”IEND®B`‚gsl-2.7.1/doc/images/rand-geometric.png0000644016036000116100000003014013373111455014647 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœíÝ\Tu¾øñ3Á ‚Œ*huSjób3#ÁJ‹Øjn¹–¶¡^»7ÌÖÚ}È£Û°vÝ[+»éÍšÌß­²èêÞ7S²À6Ї?0AZ™d¾ÌýžÇ ?DÎùŒs^Ï¿ôpfæí¨ï—gDçt:% ®kD€` À@€€ @ €0` À@€€ @ €0` À@€€ zräÈ‘ÿøÿ7nÜàÁƒ|ÓM7ýêW¿Ú»w¯è¹.N§ëÇM\ •––¶xñâS§N]áÝö:áÞç€ß0°0Э¿üå/÷Ýw_RRRQQѹsçìvû+¯¼rðàÁ‰'Šíÿ(§Óét:›››:´dÉ’ÆÆÆ¤¤¤Í›7_Ö¨™@r‹«‹ÎétŠžðEÇŽ»çž{>ÿüók¯½ÖýxGGÇÂ… —-[&j0w:R…½ÞóÁƒï¾ûîüãñññWr?xþ@ÝPWÀ€wË–-{öÙg;ÕW’¤k®¹Æ½¾Ÿ}öYJJJpppLLÌÿüÏÿ¸ŸYXX˜šššššºcÇùC:®¹¹yΜ9ÇÿÍo~ãt:[ZZæÍ›9lذgžyæ§Ÿ~êùQ\|òkÅòÁ–––gžy&**Êëëºv»}æÌ™£F4hPbbâÆûþœÜrË- ,ùòÝ666¾ð ±±±!!!C‡½ûî»·oßÞï ›››çÎ;|øðÐÐЩS§VVVº?o]§’ÅëcɧõüÛqéÒ¥W_}5&&fРA7Þxã›o¾Ù÷§è''obcc9Òó9‡>|øºuëÎ;÷å—_Ž3f÷îÝ®}ñÅ}ôQ}}ý™3g>üðÃððð¯¾úÊõQI’fÍšµfÍš†††£G¦¦¦.]ºtÖ¬Yï½÷ÞÙ³g]GÞxã^¥ë_aI’ž|òI×Éî]?°Ûí£G^¼xñ‰'.^¼XRRòàƒzý¥u·ªªªÆŽÛ震zhÁ‚ß}÷][[ÛÙ³g ï¹çžþM(IÒôéÓ—/_^[[[[[»|ùò¨¨¨ãÇ÷0•ûm»ûP¯¿sæÌY´hÑÑ£G›ššþñÜpà 6lðú …Þ_¼x±çsžxâ‰?þñòO·mÛvß}÷¹~üàƒ¾õÖ[î'¯X±âá‡výX’$¹¯N§sß¾}¡¡¡îGöîÝ{Ë-·ôú(^“³lÙ²®]?˜5kÖ¢E‹zþEuwÏ.---ƒîtÎ!CÜkÚóýô<¡$I¯¼òŠû‡/^üÄOô0U_ÜëoÇ‹/¾èþÑ;vÜvÛm^EÀ@!À€wÁÁÁ---îGº¾t4vìX÷«ä†††k¯½Öõãû·«®®v¿¹Ýn7ò]ÕÔÔÈ:wî\×#ƒ¡×Gñšœ“'Ov=èúÁ¨Q£z½¬ïîž].\¸Ò霔””Ù³gŸ:uª/÷Óó„’$É×».ÇŽ5jTSõ%À½þvtzІ††ððð® Þ³x»}ûö›nº©ë‡ä7û 4¨­­ÍýC×\sÍ¥K—$I >wîÜ Aƒäµ¶¶:ôâÅ‹®{èèèpÿ ¥×#½>J×·étº¶¶6½^ïu`½^þüùÁƒ÷úËïî MUUU¿øÅ/Ž=ê~ÎÉ“'Ÿ{î¹]»vÅÄĤ¦¦>øàƒYYYò'e/kB×gˆƒƒƒåµ´´ †ööv¯÷ÖÑÑ ß¶ëc¹ŽôúÛqéÒ¥k®¹Æëm…ð&,À»I“&ö|ŽÁ`8}ú´û?i]]”$)**ª¾¾Þýäúúúèèhù§]ßOÔÝWÑôð(^uj›»áÇwúZÞ˵mÛ¶»îº«ÓÁ1cÆlݺõÇܰaÃÏþó¼¼¼ìììþM(IÒéÓ§;ýtĈ®6ìÇtÿèÉ“'û2v¯¿ê ¨€?s€wÏ>ûì²eËNœ8ÑÃ9“&M*((ðú!“ÉÔ©ßýë_M&S?&éáQ‚ƒƒ;]÷lÊ”)ï¿ÿ~?fp)//_¾|ùsÏ=çõ£®·UÏ™3gçÎò›«/wBI’Ö­[×é§“'OvýøÆoüâ‹/Ü?úÞ{ïÉ?îá±ð·0J¿Æ \½ÞÿýèèèeË–9räâÅ‹çÏŸ?tèÐïÿ{ù/ηß~;jÔ¨÷ßÿ_ÿúWSSÓ§Ÿ~*¿=jß¾}ááá®·ÝÖ××ôÑG_~ù¥ë£]ÿêõp¤‡G‰ßºuëO?ýÔÃý¸”ß}òäÉ‹/~ñ޾ ú§Ÿ~jhhØ»wïÂ… GŒ±eË–®çLœ8ñÃ?¬©©ioo¯­­]´hÑÔ©Sû7¡$I=öØŸÿü纺ºººº?ÿùÏQQQGu}týúõãÆÛ³gÏ… Ž;öÛßþvΜ9òm{x¬Ëýíèî 0€øôä›o¾™1cÆu×]§×ëCBBn¾ùæùóçWTT¸Ÿ0uêÔ°°°ÁƒOš4éÓO?•?´uëÖääd×ÿa™œœ\PP è²Üãìܹ3666 @êþHž2cÆŒ”””œœœ^oÛÑÑ»aÆääd%g ÿ|ô ¸°°Ðb±¸±X,}¹íöíÛ£¢¢¨/À—ùh€+++Ý$$$TUUõå¶Ë—/Ÿ?¾2s00|ô%è    .èõzùH{{û!CZ[[{¾á?ÿùÏûï¿ÿĉ ÏÀèú&_ ×ëÛÚÚÜ´µµõzçžzêµ×^ë㣼üòË^Ÿ“àà`•>«?ë½ŽŠŠª¨¨ˆŠŠ’ÔÕÕ%%%ÕÖÖöp«ýë_7ÝtÓÑ£G#""®äÑu:}Z*S®>ú9àøøøòòr÷#qqq=ßê¿ÿû¿ÿýßÿý ë € |4À™™™6›ÍýˆÍfËÊÊêá&ííí+W®äíW€«‚xöìÙ%%%K–,q8‡#//oÿþýÙÙÙò :®ÓM¶lÙ×ëU2¾ÀGV\\\ZZj4FcYYYQQQhhh7yã7¸ü\-x·‘¼ ࢹ7aàß0` À@€@몫«Íf³Á`0 f³¹¦¦¦‡“u]¨6§Ÿ!À iMMMééé&“Én·Ûív“É”‘‘ÑÜÜÜÃM:ýŸÆªêgøz/ø2$Ú‘ŸŸàÀµk×ÊGf̘‘’’’““ãõ|­mH¾ ЙN§knnž;wîðáÃCCC§NZYYy¹wRXXh±XÜX,–‚‚‚Þ`¸ŠeggÇÅÅ}ûí·ÇŸ2eJFFƉ'.ë*++Ý$$$TUUõp“èèh½^?jÔ¨ÇüðáÃý™®j7ß|óüùó££££££çÏŸÿôÓO[­Vù£]ß0ÕõÍS‡£Ó7‘‹ŒŒlhhèî³²²6oÞÜØØXZZšœœœ––vðàAe~q~N[/å÷‘Ö>Ãà*¥ÓéŽ?~à 7ÈGŽ?>qâÄÓ§O÷ýN‚‚‚.\¸ ×ëå#íííC† immíËÍW®\YPP°k×®žO³Z­‹/îûTëå—_vÿwÉeQ®”Æ  ઠÓéZZZ‚ƒƒå#---ƒ¡½½½ïwUQQ%©««KJJª­­íËÍÏœ93vìØ¦¦¦¾?âÕ…7a¼èt±{úôé#FÈ?íËKÐñññåååîwRQQÑ÷oíÊåJ¿`¸Š­[·®ÓO'Ož,ÿÔÙ#×9™™™6›ÍýNl6[VVVØ´iÓ„ ®ì¡Q¼Öê/A¸*ètºÇ{,55õÑG•$iÓ¦Myyy{÷î7n\ß櫓±1111;;{Þ¼y’$½ýöÛkÖ¬)//—¿»ûJÌÈȘ7oÞwÜyêÔ©õë×çççÿýï7™Lý‹ó¼ ðâÝwß-//¿ùæ›o¸á†;v|òÉ'—U_I’Š‹‹KKKF£Ñh,+++**’ëÛInnîºuëÆ2qâÄÇïÝ»×ë«(.õ¼à ÀUe¥®€ð+0\­xýùªF€€ @ €0` À@€€ @ €0` À@€Àw\]]m6› ƒÁ`0›Í555=œÜÑѱbÅŠøøøàààñãÇoܸQµ9è pSSSzzºÉd²Ûív»Ýd2edd477wwþÓO?]QQñ׿þõüùó|ðÁ| æ´\.Óé=ƒùùùX»v­|dÆŒ)))999]OÞ½{÷²eË êÑu:}Z*S®>z\XXh±XÜX,–‚‚¯'¿ûî»ÿõ_ÿ¥Ê\  peeebb¢û‘„„„ªª*¯'ñÅMMMiii!!!aaa“'OÞ·oŸ*cÐO>`‡Ãá~$22²¡¡ÁëÉuuusçÎ5k–Ýn?qâÄc=ö‹_übïÞ½ªL @Š`tttüñœ5k–ë§¿úÕ¯$IzñÅwïÞ-r,ºç£WÀááá®wÏž=ÛéšX™™™é~äøê«¯z}«ÕªóæJ& /|4ÀñññåååîG***âââº;¹bµZÞôïÞè; pff¦Ífs?b³Ù²²²¼žüÐCýíos?²}ûöäädçàÊøè¼666&&&fggÏ›7O’¤·ß~{Íš5ååå¡¡¡®Ü¿0ëâÅ‹sçνï¾û$IÚ¾}ûÂ… 7oÞÒÞÞ>dÈÖÖÖ¾Ü|åÊ•»víêù4«Õºxñb¯òͧE5¹N§»té’ÆŸ.Ê}ØGUQQ%©««KJJª­­íËÍÏœ93vìØ¦¦¦þ=ºÆß„uéÒ¥   K—.‰D˜ÀÀÀ‹/Š€xš{V|||yy¹û‘ŠŠŠ¸¸¸>Þ\Ëù¼r¢§I¯×ÿôÓO¢§àç|4À™™™6›ÍýˆÍfËÊÊêãÍ7mÚ4aÂæÒ„ŽŽŽk®ñÑ?ê $À”æ£{vöìÙ%%%K–,q8‡#//oÿþýÙÙÙò ËÈÈØ²eK]]]{{ûÉ“'—,Yò»ßýîµ×^1¸? À€ |tφ……—––F£ÑXVVVTTêõäÜÜÜuëÖ?>$$dâĉ‡Þ»w¯ÉdRyf¿A€ 0húÝFÝÑø›°¯½öÚóçÏ‹D˜Q£F}óÍ7ÑÑÑ¢ žæÞ„¸æ € 4½gá&ÀT é= ¯0 MïYxE€ 0hzÏÂ+L€¨@Ó{^` @šÞ³ðŠ`*Ðôž…W˜P¦÷,¼"À€ 4½gá&ÀT é= ¯0 MïYxE€ 0hzÏÂ+L€¨@Ó{^` @šÞ³ðŠ`*Ðôž…W˜P¦÷,¼"À€ 4½gá&ÀT é= ¯0 MïYxE€ 0hzÏÂ+L€¨@Ó{^` @šÞ³ðŠ`*Ðôž…W˜P¦÷,¼"À€ 4½gá À”¦é= ¯°^¯'À”¦é= ¯0/AP¦÷,¼"À€ 4½gá&ÀT é= ¯0 MïYxE€ 0hzÏÂ+L€¨@Ó{^` @šÞ³ðŠ`*Ðôž…W˜P¦÷,¼"À€ 4½gá&ÀTà»{¶ººÚl6 ƒÁ`6›kjjúr«ºººØØXN§ôx~Œ`*ðÑ=ÛÔÔ”žžn2™ìv»Ýn7™LÍÍÍ=ßÊétΜ9ó•W^QgHE€ 0øèž]µjUjjjnnnxxxxxxnnnJJÊêÕ«{¾U~~~TTÔôéÓÕÒ_` @>ºg -‹û‹ÅRPPÐÃM<¸jÕª·ÞzKáÑü&ÀTà£{¶²²211ÑýHBBBUUUwç·´´X,–5kÖ„……)?Ÿ#À€ |tÏ:Žˆˆ÷#‘‘‘ ÝÿÜsÏ=òÈ#©©©Êæÿ0 س•••‹-ºÜZ­V7J y!À€ |tφ‡‡wºÞ={öl§kbÙ¯ýë?ü0 àrÅjµ:½éçÐþ‚`*ðÑ=_^^î~¤¢¢"..ÎëÉlj‰ét ˵l¿` @>ºg333m6›û›Í–••åõd¯—°\Ëö&ÀTà£{vöìÙ%%%K–,q8‡#//oÿþýÙÙÙò \Ý*‡`*ðÑ=V\\\ZZj4FcYYYQQQhh¨è¹4`*=@·bbb¶nÝÚÝG{~y™Ÿ¯&ÀT é= ¯0 MïYxE€ 0hzÏÂ+L€¨@Ó{^` @½¼ «¡¡aýúõÅÅÅ_ýu}}½$I#GŽ4™LéééÓ§OïÂU`*èvÏž:ujöìÙ£G^·nÝ]wݵcÇŽÚÚÚÚÚÚ;v¤¥¥}ôÑG£GÎÎÎ>uꔚãB800°½½]ôü\·WÀ±±±cƌٶmÛ”)SÜÇÅÅÅÅÅåääìܹó׿þulllKK‹òsB=ýøµý‰ë—Ï?D(ªÛý2mÚ´²²²Nõu7uêÔ²²²iÓ¦)3„!<¯BP^·WÀï¿ÿ~¯7 éËi¸º`éÿ8((Hô üVï{öwÞñz77÷™gžqýtìØ±/½ôÒСC.\È·öKX"À”×ûžýüóÏ}ôÑN§M›¶gÏeF‚`X"À”×ûž4h×ãƒèaà°D€(¯÷=ûðÃoÚ´©ÓÁ7šÍfeF‚`X"À”×ûç€ßxã9sæœ;wî±Ç=zôéÓ§?úè£C‡­^½Z…ù >,`Êë=ÀC† qýàÅ_t?¾~ýzùÇ|ïBB€% @y½˜¸j –0åi}Ï¢+,`ÊÓúžEWX"À”§õ=‹®°D€(Oë{]`I’ÛÛÛEOÀŸùîž­®®6›ÍƒÁ`0˜ÍæšššîÎÜ¿vvö˜1c‚‚‚F=yòä?þXÍQý –$)00ðÒ¥K¢§àÏ|tÏ655¥§§›L&»Ýn·ÛM&SFFFss³×“srr’’’víÚÕÔÔôí·ß¾ð ¯¾úêË/¿¬òÌ~ƒK¼ @y½’«V­JMMÍÍÍuý477×õ_ääät=ù«¯¾’qÏ=÷Œ;öÖ[o]¼x±Jãú,`ÊóÑ=[XXh±XÜX,–‚‚‚>Þ\¯×(0—&`‰PžîÙÊÊÊÄÄD÷# UUU½Þðܹs{öì™6mÚ¼yó›ÎÏ`‰Pž¾íp8"""ÜDFF644ôpN'ÿøî»ï¶Z­ Íæ÷°D€(Ïö¬Óét:gΜY·n]eee^^^¯7±Z­:oT˜Ö—`‰PžîÙðððN×»gÏžítMìÕÈ‘#§OŸ¾víÚ¾|³&«Õêô¦ÿsû,`ÊóÑ=_^^î~¤¢¢"..®7¿õÖ[ëëë˜K°D€(ÏG÷lff¦Ífs?b³Ù²²²úxó’’’Ÿýìg Ì¥ X"À”ç£{vöìÙ%%%K–,q8‡#//Ïõß]É'¸¦öÞ{ï-((¨¯¯oooÿþûï׬YóÔSO½öÚk"÷X"À”ç£{6,,¬¸¸¸´´Ôh4Ʋ²²¢¢¢ÐÐP¯'ÿö·¿µÙlqqq!!!ÉÉÉ;vìøøã§NªòÌ~ƒK€ò|ôË$IЉ‰Ùºukwu«Ô¤I“&Mš¤ÊPš@€% @yZß³èŠK€ò´¾gÑ–0åi}Ï¢+,`ÊÓúžEWX"À”§õ=‹®°D€(Oë{]`‰PžÖ÷,º"À <­ïYtE€% @yZß³èŠK€ò´¾gÑ–0åi}Ï¢+,`ÊÓúžEWX"À”§õ=‹®°D€(Oë{]`‰PžÖ÷,º"À <­ïYtE€% @yZß³èŠK€ò´¾gÑ–$)00°½½]ôüY èàsœN' ¼té’N§=ˆ0:NãÏ 4 ì\N×ÑÑ!z ‘‚ƒƒ[[[ƒƒƒEø-­_è “ŽŽŽ€€ÑS@¼Áƒ_¼xQô€?#ÀðÀ'€áL€E±jáÃ…JcÕ† ”ƪ…  (U .P«0\‚ƒƒ[ZZDOø3V-<`¸p (U .|0 4V-<`¸p (U .P«0\0 4V-<`¸`@i¬Zx Àp!À€ÒXµð@€‘¯8x IDATá2hÐ  (ŠU .| 4V-<`¸ð4 4ß]µÕÕÕf³Ù`0 ³Ù\SSÓÝ™{öì™6mÚˆ#†šššºmÛ65çô3.Pš®Ú¦¦¦ôôt“Éd·Ûív»ÉdÊÈÈhnnözrZZÚ?ü°mÛ¶ÚÚÚ+VX­ÖÕ«W«<°ß Àp!À€Ò|tÕ®Zµ*555777<<<<<<777%%¥»¬.\¸°¨¨h„ !!!ÉÉÉ6›íõ×_Wy`¿A€áB€¥ùèª-,,´X,îG,KAAד—.]ªÓé䟎7®‡×«Ñ3  (ÍGWmeeebb¢û‘„„„ªªª¾ÜvçÎãÇWf.ÿG€á·#”(zïGDD„û‘ÈÈȆ††^oØÐЛ›»jÕ*ÅFós.| 4¿ZµgΜy衇V®\9qâľœoµZuÞ(=§/#Àpá%h@i>ºjÃÃÃ;]ïž={¶Ó5q'ßÿý½÷ÞûÒK/Mš4©bµZÞô ”棫6>>¾¼¼ÜýHEEE\\\wçŸ>}zêÔ©Ë–-ËÈÈP~:F€áB€¥ùèªÍÌÌ´ÙlîGl6[VV–דëëë§L™òú믧§§«2?#Àp!À€Ò|tÕΞ=»¤¤dÉ’%‡Ãápäååíß¿?;;[>Áý3µS¦LY´hÑ}÷Ý'bRC€áB€¥ùèª +...--5F£±¬¬¬¨¨(44ÔëÉß|óÍôéÓ;½‘êÇTyfÿ@€áB€¥ùè—!I’³uëÖî>êþV)¿mj``¸ðuÀ€ÒXµð@€á¢×ë%Iúé§ŸDø-V-<`ÈxP«0dP«0dP«0dP«0dP«0dP«0dP«0dü_€¢Xµð@€!ºj›ššÒÓÓM&“Ýn·Ûí&“)##£¹¹¹»óŸx≑#GîÛ·OÍ!ýdŠòѯ^µjUjjjnn®ë§¹¹¹‡Z½zuNNŽ×ó+++UœÎŸ`@F€¡(]µ………‹ÅýˆÅb)((5v`@F€¡(]µ•••‰‰‰îGªªªDÍ£`(ÊGW­Ãለˆp?ÙÐÐ jí À€ŒCQš^µV«Uçè¹D"À€ŒCQ>ºjÃÃÃ;]ïž={¶Ó5ñ•³Z­NoöQ®.`(ÊGWm|||yy¹û‘ŠŠŠ¸¸8QóhdŠòÑU›™™i³ÙÜØl¶¬¬,QóhdŠòÑU;{öì’’’%K–8‡Ã‘——·ÿþììlù¦V9 4¨µµUôð[>ºjÊ‹‹KKKF£Ñh,+++** íî|÷÷Oñ^ª+A€WÀP”þOX’$ÅÄÄlݺµ»vz«”Æß95€0 #ÀP«0 #ÀP«0 #ÀP«0 #ÀP«0 #ÀP«0 #ÀP«0 #ÀP«0 #ÀP«0 #ÀP«0 #ÀP«0 #ÀP«0 #ÀP«0 #ÀP”ï~3A€Ypppkk«–¿µZ```ss³^¯=ˆ"Àð@€™N§ëèè=…H111§N3fŒèAü«0YLLÌwß}'z ¿Åª… @F€Ū… @c·ÛEOá·Xµð@€ÈŒF#WÀÊaÕ ã%hE±já`E±já]ýõuuuííí¢ñO¬Zx ÀdÑÑѧN=ˆbÕÂàŽW¡•ê… ÀV«0w|)°rXµð@€¸ãK•ê… À/A+‡U €;¬¾!<`î®»îºï¿ÿ^›ß9((Èáp(wÿ0wz½^³ÿÇwÜñå—_*wÿ¬Zx Ààrçw~öÙgÊÝ?«0¸¤¥¥`¨‡€Ë„ ÊÊÊ”»V-<`p2dH\\œr÷Ϫ… ²;ï¼S¹;gÕÂYZZšrwΪ… ²‰'*wç¬Zx À :t¨rwî'«¶ººÚl6 ƒÁ`6›kjjDOtµ"À XµMMMééé&“Én·Ûív“É”‘‘ÑÜÜ,z®«uèœN§è®T~~þÖ®]+™1cFJJJNNNÿîP§ó‡§¥ìp8‚ƒƒE>A¹"øÃµNaa¡Åbq?b±X DÍsUã Ôá«¶²²211ÑýHBBBUU•¨y®jÔ᯵]¸pA¯×ËGÚÛÛ‡ ÒÚÚÚ¿;ÔòKÐííí4\,‚óê§×ëÛÚÚÜ´µµõz×_~Y‘çàGŠ—?\êEEEUTTDEEÉGêêê’’’jkkûw‡Â¯€€|a`_˜Áð‡WãããËËËÝTTT(ú?hp…ü!À™™™6›ÍýˆÍfËÊÊ5½ò‡Ïž=»¤¤dÉ’%‡Ãápäååíß¿?;;»ßwÈç†yx$žžI’x”|Ä‚a@|÷Ýw ,(**’$)##cùòåF£QôPý'üsÂñ H< <<’$ùõ“à·¿°«šÿë#ž‰'g€g@’$¿~¬V«èàÅ]wÝ%zÁx$žžžI’ü÷IðÛYàËüáMX\u0` À@€€ @ €0` À>¤ººÚl6 ƒÁ`6›kjjDO$À×_ýôÓO6L§Ó‰žE€={öL›6mĈC‡MMMݶm›è‰ÔæúfÞcÆŒ =zôäÉ“?þøcÑC‰TWW«Á¿º.DO4ð°¯hjjJOO7™Lv»Ýn·›L¦ŒŒŒææfÑs©í‰'ž9rä¾}ûD"FZZÚ?ü°mÛ¶ÚÚÚ+VX­ÖÕ«W‹JU999III»víjjjúöÛo_xá…W_}U³ßÞétΜ9ó•W^=ˆNO¢Çx|7$_‘ŸŸàÀµk×ÊGf̘‘’’’““#p*üø›€öàùçŸÿÃþ ÿc¿¢¢âá‡>vì˜Ø©Ä:~üø­·Þêp8D"À²eË @ô,zœG€}…Ãለˆp?ÙÐÐ j×ÐЛ›»|ùrуàzÓͰaÃÒÒÒ¬V«è‰ÔöÜsÏ=òÈ#©©©¢&++kóæÍ¥¥¥ÉÉÉiii=ÔóÿÙ¯AAA.\Ðëõò‘ööö!C†´¶¶ œJ -|¨gΜyôÑG­Vë¤I“DÏ"L}}}QQÑÂ… çÎûÒK/‰G=úÓŸvïÞ-¿ö®ñ¿’$­\¹²  `×®]¢HZÿMõQQQQQQò‘ººº¤¤¤ÚÚZS ¤åóý÷ßßÿýúÓŸ222DÏ"ÞîÝ»gΜY]]-zõŒ7®¨¨Èh4ÊG´ü×ÁåÌ™3cÇŽmjj=È@â%h__^^î~¤¢¢"..NÔ<åôéÓS§N]¶lõu¹õÖ[ëëëEO¡ªãÇÇÄÄtúXýZØ>òË`_‘™™i³ÙÜØl¶¬¬,Qó@ˆúúú)S¦¼þúëééé¢gñ%%%?ûÙÏDO¡*gòAÑ£ ³iÓ¦ &ˆžb uý†çÏŸ3fL^^^CCCCC믾êz½Eô\ÂhógRRÒúõëEO!Ò=÷ܳmÛ¶3gδµµ:uê½÷Þ»öÚkÿö·¿‰žK0­ýuHOOß¼ysmmm[[Û‰'òòò†~àÀÑs 0­^Á§|÷Ýw ,(**’$)##cùòåîŸÒ¯/²içO©×_¾Ãá6l˜úñ{÷î7ß|ó³Ï>;wî܈#n¿ýöçŸþ¶Ûn=—`Zûpqqñ›o¾¹gÏžsçÎEEE¥§§çææÞtÓM¢ç`ÚúMÀGð9` À@€€ @ €0` À@€€ @ €0`t:èM À@€€èIIIIttô;ï¼#zÀߊ€ïÚ¾}ûþçnÚ´éÎ;ï= ào0ï>øàƒ+VìÙ³Çh4ŠžðC€K—.---ýì³ÏBCCEÏø'Óé=¢ÓéÚÚÚF]QQ1jÔ(Ñã~‹7aèL¯×ÿá¸óÎ;>,zÀoq ÀƒN÷kaûöíóæÍ[¿~ýwÜ!z(Àq À»ÌÌÌ7N›6mË–-¢güoÂЭÛo¿ý“O>™:uê©S§ž}öYÑã~…— €— € @ €0ü?r§«ã‡‚ IEND®B`‚gsl-2.7.1/doc/images/rand-gumbel1.png0000644016036000116100000004473613373111455014245 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœíÝy@Lûã>ð™¨TJ¥L²$)J¡%%ÊÒEÖ‘¥¸á^ëÅ•írBd ¹¡ WEÂU!…’j´X²´hWRJëüþèûëÎ'íÍÌûÌ™çõWΜ™óœÓòx¿çÌ9L‡ÃÁ#@¡€@€  @ €0(`PÀ €@€  @ €0(`PÀ €@€  @ hŽÙ4exþü¹“““¼¼|+7úúõëÕ«WkjjJIIIII 8pÙ²e=ây°v„¦žXl%%%Y,ÖøñãwïÞ™™É“6ƒ·ßMAþl€(CÍq¸|ÿOÁX¼xq="##[³ò?ÿü3eʃÐÐÐâââ´´´={öÄÇÇ;–ß9y¢îØ–••¥¤¤üöÛo%%%W®\iÓ‹²Q·@ S†Èb2 ÿÀ· 55uÒ¤I½zõâ^^[[»qãÆÃ‡ 8O[ŸØèòøøx ‹û÷ïëêêò)XG¾³Ä*@da ¢käÈ‘ÁÁÁ &$$ôîÝ»ººšÉd–••­ZµJIIIFFÆÊÊ*))‰{ÍuéÒ¥_¿~çÎãI¤Ã‡¯_¿¾Aû2 11±úömtÄÆ=[VV¶råJEEE%%¥-[¶p8œòòrGGÇîÝ»ËËËÿøãÕÕÕõOÀ>:tÆ ßç/))Ù¼y³–––´´t·nÝ,,,nÞ¼Y¿Bƒw ˜Lfyyù?þÈb±ynfGš9bMm«~µ7nŒ9RFFFFF¦Á “ɬ©©Ù·o_¿~ý$%% püøñö"Q‘ÑàÞÛÛ{âĉ ÖY¾|ùÞ½{ëV^°`Á‘#G²³³³³³9Âb±Þ¾}[·ÚË—/•””¼½½‹‹‹Ÿ>}ª®®ÞÖßÓÒÒzýúu;^¤~!ƒÁXºt©§§gaaá›7oFŽùçŸ.]ºôüùóŸ>}ª[rôèÑú•Û·MíHSË“““544¬3sæÌ 6|øð¡²²òÓ§O7nܘ4iRS¯Ã`0ìííëÂ4º×ÍìH‹G¬©‡?~¬¨¨xùòå¼¼¼ÜÜÜ‹/*((DGGׯ¶råÊ_~ùåÍ›7¥¥¥÷ïßïß¿¿¯¯o£Gà{(`! þÔVVVöêÕ+11±~IAA¼¼|nnnÝÊ{öìá^÷îÝ‹/®ûzñâÅýõWýCS¦Lik€ïuéÒåÛ·oíxî:©ïW‡)##ýäÑ£GC‡­_¹}ûØÖ.//—’’j°N×®]¹Û´ù×a0‡njµæw¤Ý}Z¿rƒ.,++ëܹsÝ× ÞÍkG€455_¾|Ùüs¿‘ššîGkkk<ñû%õ_´oÛZÀIIIššš Öy÷îÝŒ3ºt颭­½téÒ€€€úœ–beeeS›k~GZüúõëoß¾}ùò%%%å÷߯®¦¦æÃ‡¿~ýšššºuëÖ•+W2Z1¡úý’vïcS;R¿¼ººº°°ðÑ£G7nTVV¾zõê÷ëŒ;öâÅ‹UUUÙÙÙ¿üò‹••UÝCººº×¯_¯®®nþеrGš?bÍl+22RAA¡î,è¼¼¼Ë—/+**r¿IÑL$€ágDHSƒ‚‚ ÆŽ;¬\ZZº|ùriiéÉ“'³Ùlîââ⬬¬dee¥¤¤&L˜pïÞ½f¶Û¦ÿûÆÅÅ-Z´¨wïÞâââÒÒÒƒ Z·n÷ÖÝÜÜ´´´ÄÅÅûôé³{÷îºÏõ6µÍpûö±™®#!!¡¬¬†@ €0(`PÀ €@€  @ €0(`PÀP·€ÓÓÓmlläääääälll222šY™ùåhŠpii©™™™¡¡aZZZZZš¡¡¡¹¹yYYY3Oáü/EhŠÞØÕÕ566öÒ¥KõK-ZdddäììÜèúL&Ew Q߸qÃÎÎŽ{‰]`` ©<¼EÑNJJÒ××ç^¢§§—œœÜÌSTTTÄÅÅ{öì¹pá—/_ò9 @‡P´€‹ŠŠ¹—tïÞ½°°°©õ­­­¯\¹RRR3bĈñãÇÇÇÇó?&@{q(I\\¼²²’{Iee¥„„D+Ÿîîî>yòäWÛµkW£Ç¤K—.þ.eµ§ÆZ¢ç.±X,6›Íb±ê—ääädgg·æé¹¹¹¥¥¥íÛ:Né€:ükŠNAëêê&$$p/a³Ù:::­|:ê(Ž¢77·nå={öp¯¿{÷îÅ‹×}½xñâ¿þú«þ¡€€€)S¦´5@[öïߟûÕÚô§»Å­7¿ËüØ"=ðo71zwrrâŸ={vúôé=zô¨ûçÂ… ¹×_¸pá½{÷ê¾ŽŠŠâ¾ýÚ¸qãÜ •'¾}û¶gÏmmmiii&“©¨¨˜––Vÿh‹­ÐÍì2Ÿ¶XÏÅÅ¥™SÖùÍÅÅ¥ƒùùA$ÞBo+9³€f¾ÿÍ-((8pà«W¯”””jjjú÷ïåÊ##£º•ËËË»téR¿ryy¹œœ\UUƒÁ””¬¬¬ä~)11±ššš¶hÞúõë_¾|yàÀÈÈÈ|ûöMJJªÝ|ZÜzó»Ì-Òÿv#` -%%¥Y³f>}šÁ`ª¨¨Ôµo¬¬,²²”••ë¾–““ËÊÊâÿµØ¾ípåÊ•³gÏÔÝê­ÁÛ±ÍéÚ·Åfv™O[„f €€ÎÖ­[wòäɪª*77·ü‘û!ooïÿœ8qbÝ×&L äw¶ãQOOOîGù1!ÜÌ.ói‹ÐŒÎ¤ðÑàÁƒµµµwíÚ•’’2wî\î‡RRRÜÜÜêúûûŸ8qâÑ£GuíÚµËÂÂBJJjÚ´i]ºtyòäÉáÇ¿ÿPSk43ieeµ~ýú¿þúKLLÌËËëÇíxý6m½™]šÿ/hÂaFMýæ1Œ;v4X¹´´tùòå ÒÒÒ“'Of³ÙÜ+ÄÅÅYYYÉÊÊJIIM˜0áÞ½{Íl·©?­Ÿ>}RTTlꉟ>}Z¸p¡¢¢¢¼¼¼½½}III;þø´~ë-îrÇ·HKüÛ;‘x ½­DäÌQ^^®¨¨˜ššÚ«W¯ú…‚ù5wss{ýúµ››¿7DÁ­Óÿ~T0 töùóç#GŽØÙÙq·¯Àœ?þüùó‚ß.¶-ÂP¯Ð“ɬ›k½pႜœ\ƒ‡ðk­0@›5ówí ÄácH €@€  @ €0(`PÀ €@€  @ €0(`PÀ €@€  @ €0(`PÀ €@€  @ €0(`PÀ €@€  @ €êpzzºœœœœœœMFFFkž•““£¥¥Åd2ù #(ZÀ¥¥¥fff†††iiiiii†††æææeeeÍ?‹Ãá,Y²dÏž=‚ ÐnL‡C:C#\]]ccc/]ºT¿dÑ¢EFFFÎÎÎÍ<ëðáÃñññ^^^Lf‡ö«ƒOÚà_#Pt|ãÆ ;;;î%vvvÍ<%>>ÞÃÃãĉ|ŽÀ-त$}}}î%zzzÉÉÉM­_^^nggçéé)++ËÿtEѹV ‰¯_¿Š‹‹×/©ªªêÚµkEEE£ë;::ªªªîܹ³îŸ˜‚ž¹)è6 LJJúå—_ÚúDfcø€E‡z,‹Íf³X¬ú%999ÙÙÙ߯¬©©ª¦¦V¿#`à ‘ëêê&$$p/a³Ù:::®üöíÛ~ýú5Âb, TFÑž6mš——÷///kkëFWæ|§~¡ ²´EçZKJJôõõ †»»»§§gBB‚ŒŒLÝ ÍÏ ` xB䦠eeeÃÂÂbbbÔÔÔÔÔÔž={Zß¾ÂC½F` uDn @o(`PÀ €@€  @ €0(`PÀ €@€  @ „^MMMFFF^^^mm-ƒÁ¨®®þøñcII é\ÍéL:@{ÔÖÖFEE„††¾|ùRII©¢¢¢  €ÃátêÔIEEåóçÏ=zô;vìäÉ“­¬¬HGøL‡C:å0™8,Ô•——wúôi›‰'6LRR²ÁjµµµoÞ¼ ¿sçNXX˜‰‰‰ÝÌ™3¿_ ük4M#PÀÔôùóçßÿÝÃÃÃÆÆfíÚµC† iåËÊÊ.\¸œœ¼aÃ''')))¾FÚà_#à=`ÇÓÓsРAŸ>}JHH8}útëÛ—Á`HKKÛÚÚÞ½{÷æÍ›?8p §§gÝƤ`¨×Œ€)%==}ùòå%%%îî†Á§OŸþüóÏåååÇ5jTÇ_h #`Q!!!#FŒ077ŒŒäIû2 cc㈈ˆM›6ÙØØlÞ¼¹¢¢‚'/ Ð&ê5#`Špuu=tè¿¿ÿèÑ£ùñúùùùŽŽŽ©©©ÞÞÞ:::üØ;Œ€A´ÔÖÖ®[·ÎÓÓóñãÇ|j_ƒ¡¬¬|õêUgggSSS///>m Qê5#`²jjjììì²²²ºuë&€-&''ÛØØ˜šš;vL\\\[a0ˆŠºöÍÏÏ¿uë–`Ú—Á`èèèDGGgeeYXXf£ âPÀ@!ÇÑÑ1///00PÀÕ•••½~ýúÈ‘#ÇŒ“––&ÈM€hÂ¥(BvìØ‘JäBbbbTUU;vìíÛ·qZð ¨ÂÓÓóêÕ«QQQ]»v%ÃÙÙ¹{÷î'N¼qãÆ°aÃ&zÃÙFÀIX‚1gΜ 8tƒÁ Z±bÅõë×ùw6œ„t–‘‘1oÞ¼‹/R¤} †µµõÅ‹gΜùðáCÒY€ž0ÔkFÀ‚ôíÛ·qãÆÍ;wãÆ¤³4>þüÀÀÀ‘#G’ÎdànH…¤µk׿ççûúú2™LÒYboo÷î]===ÒY€LA=ߺuëÌ™3Ôl_ƒaeeåææ6eÊ”wïޑδ‚³ ˜¼¼¼•+Wúùù ì‚í3gΜÂÂÂI“&=zôHEE…t  ̵6SЂ1sæÌAƒýöÛo¤ƒ´ÊÞ½{îß¿/++K: Þ(°üý÷ß®®®ÑÑѤ³´–££ãÛ·oƒƒƒq½hÑ(0¿eeeüûï¿ÂufSMMÍŒ3zöìyæÌÒY@@pЊ““““““pµ/ƒÁèÔ©“Ottô¡C‡Hg¡‡“°@ÐüüüÞ¾}ëïïO:H{tíÚõÆ£FÒÖÖž:u*é8 Ä0×ÚLAóÏ—/_ttt®^½*Ô—¶xúô©µµuXX˜®®.é,À_xX PÀü³aÆÒÒRÒA:êòåË»v튎ŽVTT$ø,P(`>a³ÙIIIJJJ¤³ðÀæÍ›ãâân߾ݩS'ÒY€_PÀ…æ ‹™3g:99‘Â555S¦L144>>AAA¤³€ðÁP¯ó\MM¾¾þÁƒ§M›F: EGGOŸ>=22RSS“tà=Œ€A¸;wŽÅbѯ} †‘‘‘‹‹‹MYYé, L0ÔkFÀ¼URR¢­­}ãÆ CCCÒYøÅÎÎNLLìÂ… ¤ƒa Bì?þ˜8q"Û—Á`œ:u*66öܹs¤ƒ€ÐÀP¯óPnn®®®n\\\Ÿ>}Hgᯗ/_Ž?^è.p ÍÄÕÁƒ.\Hûöe0ÚÚÚ‡Z°`Þ €ÖÀP¯óÊÇõõõEç>ö‹/–‘‘9uêé ÀƒP:pàÀ²eËD§} †»»{hhè?ÿüC:P†zÀ˜'rrrœœœÜ£GÒY*66vÊ”)ÑÑÑjjj¤³@GáR”…扟þ™Ãá>|˜tþú믠  ððp\&@Ø¡€ Üqùùùƒ b³Ùªªª¤³P[[kii9vìØ;w’΂(pÇíØ±£°°ÐÝÝtb²²²† výúu¡¾ó1 € ÜAÅÅÅššš111ýúõ#…¤€€€M›6ÅÇÇËÈÈÎí$ŠgA§§§ÛØØÈÉÉÉÉÉÙØØddd4µæ“'OÔÕÕ%$$TUU'NœxíÚ5AF…Nœ81uêTo_ƒ1cÆŒqãÆýüóϤƒQ´€KKKÍÌÌ ÓÒÒÒÒÒ ÍÍÍ›º¾³³³ÁíÛ·KKK7oÞ¼oß¾]»v 83Ô)++;vìØÖ­[I¡WW×»wï“”CѹVWW×ØØØK—.Õ/Y´h‘‘‘‘³³skžþöíÛáǵo똂îˆãLJ‡‡c¢^ddäìÙ³ãããY,é,Ðf"7}ãÆ ;;;î%vvv­|º¸¸8>þADMM««ë¦M›H¡{{û•+W’ÔBÑNJJÒ××ç^¢§§—œœÜâ‹‹‹>|8oÞ}øðáyyy|ÈMJOO¿ÿþ’%KH¡.111—÷ïß“ÎäQ´€§M›æååŽÄËËËÚÚº•OŠŠÒÖÖæC.hÒñãÇíììºvíJ:¥ 8pëÖ­Ë–-«­­%£h¯X±"**ê·ß~+*****Ú¿Ýå®êWà~§vòäÉyyyUUU?~ôôô\¾|ùHQeee.\Àäsk¬_¿¾¶¶öøñ㤃a-`YYÙ°°°˜˜55555µgÏž…††6uAÝ­[·zyyéèèHKK1"88øÚµkVVVÎ,Ê.^¼8zôèþýû“"ÄÄÄΞ=»oß¾7oÞÎ$ál£Fà$¬¶ÒÓÓ;zôè„ Hnnn>>>¸b ʼnÜIX DBCC Ú·MÖ¬Y#))yôèQÒA€ õp›ØØØLš4iÕªU¤ƒ™÷ïßGFFjii‘ÎMÂý€ ÜzYYYúúú>|À-oÛ¡n"úÑ£Gbb˜‹ (LAE:uÊÖÖíÛ>kÖ¬;yò$é @†zÀ¸•ªªªÔÔÔÂÂÂð©ëv{õêÕ˜1c¢££ÕÕÕIg€F` T4pà@´oG 8׈M(`h?+VN!ô6nÜXYYéááA:æZ)èÖÈÈÈ000ÈÈÈ’’"Eè½|ùrüøñ111}ûö%þ¦ r<<<-Z„öå mmíuëÖ­\¹’t õp‹jjjúõë2xð`ÒYh¢ººzäÈ‘kÖ¬±··'þƒ0PKHHHŸ>}о<Ô¹sç‹/nݺ533“t0´ÇÙ³g¹oN<1hÐ ''''''ÒA@0×ÚLA7/;;{ðàÁiii¸û/ÏUUUîÚµköìÙ¤³ƒ)h ”¿ÿþ{öìÙh_~?}úôúõë‹‹‹Igþj¡Ø }||ž?ž——Ç`0zôèahhhff¶`ÁEEEAå(Œ€›Ááp´µµ/^¼hddD: m999ÕÔÔœ>}št 1ÎÌÌ\±b…ªªª···©©ipppvvvvvvppðøñã/_¾¬ªªêàà€FDMDD„„„Ú—¯|ØÒÒ²ÑBBB~þùç÷ïß———ó3!7ÃÞÞ^OOoÆ ¤ƒÐÜíÛ·_¼x©~²ÜŽpéÒ¥îîîÒÒÒÍ<¹¬¬ÌÉÉéÂ… üHF ¸)%%%jjj¯^½RVV&…þ–-[Öµk×cÇŽ‘ Òp?`B7åüùóÁÁ‰(ÝÖ IDATÁ×®]#D$ 2ÄßßôèѤ³ˆ.œ ”àååeggG:…¨PPP8v옃ƒCEEé,À{-ðœ9sêÎæVTT´`ÁþDŠzÿþ}JJÊ”)SH!³fÍ4hÐþýûIÞk¹€ÕÕÕõôô.]ºT¿äßÿ6l˜††?ƒåxyyÍŸ?_\\œtÑrâĉS§NÅÇÇ“<Öª©í¸¸8‡ž={ºººº¹¹%$$œ:ujРAÈGÞþ‡ÃÑÒÒòóó6lé,"ÇÃÃãܹs‘‘‘:u"@ä~ØÀÀ ::ÚÔÔÔÌÌlÈ!÷ïß§qûB£"##%%%ѾD888ÈÉÉáthšiÃIXL&³[·nJJJL&“€š.^¼¸dÉÒ)D“É ‚ÀÀÀáÇ÷êÕ‹t‘¶aÆÊÊÊ3gμÑrøð!>>~Ú´iõK&Nœóúõk~ ¹xñââÅ‹I§ubbbgΜٹsgFFé,À8Ý·8 š[^^ž¶¶vFF†ŒŒ é,ÀØ¿ÿÓ§Oƒ‚‚H¸ãããcmmö¥ˆ-[¶¤§§ãj 4ÐdÛÛÛ—••5ÿä²²2{{{^GjÁü3¥tîÜùĉëÖ­+**":¤Éöõõ1bĽ{÷šZáßÿ1b„¯¯/‚%$''çææN˜0tø‰‰ÉÌ™3qGHa×d¿~ýÚØØxêÔ©ãÇ?yòäË—/KJJJJJRRRÜÝÝÇŽ;}úô‘#GâT,z»|ù²­­­˜Þª –DDDܺu‹th¿Þ[ÎÏÏ÷öö‹‹ËÏÏg0=zô044477Ÿ?~÷îÝ•S pV‡£©©yíÚµ¡C‡’Î ………ÙÛÛ³Ùìnݺ‘Î@g¸°@¡€ëDEE-_¾<%%…thœ££cMM > ÀW8 ðõõµµµ%šôÇܽ{·™5€ÊZUÀ©©©vvvªªªââ⪪ªvvv¸&-íUWW_¹rLe²²²§NZµjÕׯ_Ig€6k¹€_¼x1fÌ--­ˆˆˆ/_¾DDDhjjŽ=:))Iù€”ÐÐP555Üõ™â,--MLL~ýõWÒA ÍZžÚ¶´´œ:uê?þȽðèÑ£·oß ág6bð0ƒÁX²d‰¡¡áºuëHèéé]¿~ÝØØ˜t"y–ŒŒÌ»wïX,÷œœ ºN|¡€¿}ûÖ«W¯¤¤$ÒY eþþþ»v튋‹ëÒ¥ é,tCò$,IIÉF—KIIñ: PEPPÐðáÃѾÂbîܹ:::{öì!Ú åž5k–¿¿ƒ…~~~666ü‰äy{{ãô+áâîîîééùìÙ3ÒA µZYýúuåÊ•ƒ ²µµUUUÍÊʺ|ùrJJÊÙ³g¥¥¥“RÀD| º¨¨H]]===]NNŽth??¿½{÷ÆÆÆ65kí@ò=`&“Ùâ«Ð¬®D¼€Ïž={÷îÝï§=€úæÎÛ¿ÿƒ’@$ßæ´?’)˜^îîî^^^111¤ƒ@ËDz¨×Qgggëêêfeeá|Z!åíí}ðàÁgÏžIHHÎ@¸%ˆŸŸßŒ3оÂËÖÖ¶_¿~û÷ï'Z€†ÿáçç7þ|Ò) CNŸ>}úôéçÏŸ“ÍAÃÒÒÒÞ¾}kffF:tHÏž=>¼dÉ’ŠŠ ÒY I(`øÏÕ«WgΜٹsgÒA £lmm €KsP þãçç7wî\Ò)€7NŸ>}áÂ…èèhÒA q(`ø?ïß¿OOO755%xCIIéÈ‘#K—.ýöíé,Ð0üÿY³fuêÔ‰tà™9sæèêêîÚµ‹th þ¯¯ï¼yóH§;qâ„——×Ó§OI€†PÀÀ`0¯^½ÊÏÏ;v,é Àc=zôpss[²dIYYé,ð?PÀÀ`0>>>sçÎÃÏ Íž=ÛØØxãÆ¤ƒÀÿÀ\`0 œÿLcnnn·oß !þƒFBB·oߌI~‘““»páÂÊ•+ Ig€ÿCÝNOO·±±‘“““““³±±ÉÈÈhj͇Λ7OYY¹[·n#GŽ dNðóó›7o^kî; ÂkܸqóæÍsrr"þE ¸´´ÔÌÌÌÐÐ0-----ÍÐÐÐÜܼ©³HÆŸŸŸíæææââröìY^§®€I¾Û·oß‹/|}}Iƒ²·#tuu½téRý’E‹9;;¿ò¦M›þøãú›Íž5kVjjj»·.R·#|úôéÒ¥KSRRHAˆ‹‹›|¨­­M: åð¯èß4í@û®©©éÝ»wDD„¦¦&é,@ gÏž=qâÄ“'O$%%Ig ‘›‚¾ºÿ~ï޽ѾPÏÁÁaÀ€[¶l!@„ €E‘¿¿?®ÿ œ>}:((èæÍ›¤ƒˆ šÏµ¶½§ «ªªzõêõìÙ³¾}û’ÎÔecc«ªªJ: U` x&,,LKK í ß=zôš5k/^\[[K: ý¡€EŽŸŸnMÙ¶m‡ÃÙ»w/é ôGç¹Öv£ñtee¥ªª*›ÍÆ#4%''gøðá.\˜8q"é,äa xãÞ½{:::h_h†ŠŠÊ¥K—ìììš¹÷ t X´øûûcþZdjjºzõê ÔÔÔÎ@[´kíºNAcþZ¯¶¶vÒ¤I&&&»wï&€$LA`þZOLLìòåËçÏŸ !€žPÀ"Äßß÷„Öc±X¾¾¾ööö>| €†è9×ÚA´œ‚®¨¨PUUMLLìÙ³'é, LŽ=zùòåGIHHÎ@¦ ¡£nݺ5tèP´/´Õºuëúöí»iÓ&ÒAè,*pþ3´Û¹s炃ƒýüüH εvý¦ ËÊÊTUUß¼y£¬¬L: %6›maa¦««K: €@a :䯣FBûB»éééýñdzgÏþòå é,4 >>> , „Û’%KÌÍÍq«^¡Û\+OÐl úóçÏýúõKOO—““#„[UU•™™Ù¤I“vîÜI: €€` Úïúõëæææh_è8qqñ+W®œ9sWçè80ýùøøÌŸ?Ÿt   {{ûÔÔTÒY„­æZy…NSÐyyyÚÚÚ?~”’’"èãôéÓnnn?–••%€¿0 ítåÊ•©S§¢}·V­Z5vìXœÐ(`šÃùÏÀ'ÇŽûüùóŽ;HV(`:KOOõê•……é @CâââW¯^õ÷÷¿téé,B©3éÀG~~~³fÍ'èIII)((h„ 1bé8B#`:Ãü3ð›ŽŽŽ‡‡‡MNNé,BL[¯^½ÊÍÍ7né @sÖÖÖ+W®œ1cFyy9é,ÂL[>>>óæÍ÷ønûöí °³³ÃIÑ­‡¿Î´…û‚À0™L¼¼¼mÛ¶‘Î 4PÀôÿíÛ7cccÒA@THJJ^¿~=((èøñ㤳œMO~~~óæÍc2™¤ƒ€QTT¼uë–‰‰Iÿþý§L™B:ÕÑçš‹<$ì—¢äp8êêêAAAzzz¤³€ÈyüøñŒ3îÝ»7dÈÒYx—¢„6xô葜œÚˆ5jÔ±cǦM›–™™I: ¥a š†.]º´páBÒ)@tÍ›7¯  `òäÉŠŠŠ¤ãP”pϵò‰POAWVVöêÕ+&&¦_¿~¤³€HÛ¸qã£G¤¥¥Igh?LACk…„„èêê¢}¸?ÿüSCCcÑ¢E555¤³P ˜n.]º´xñbÒ)L&ÓÓÓ³´´ÔÙÙ™t*â¹VþÞ)èÏŸ?«««øð¡[·n¤³0 FII‰©©é¬Y³¶oßN: @{ð¯p­\½zÕÂÂí Ô!++|H: % €éãòå˸þP™±±±¯¯ïœ9sbbbHg Lñññeee&&&¤ƒ4g„ çγ¶¶f³Ù¤³†¦‰ºËOâöG@}Ó¦M;qâ„¥¥eRRé,$á,h:¨©©ñññ % UfÍšU^^nii¦¥¥E:(`:¸{÷nŸ>}´µµIh­… VVVNœ81<<¼ÿþ¤ã€¦ƒ .,]º”t €¶±··¯¨¨033 WWW'@Єò¯ü&\Ÿ.,,ÔÐÐxÿþ½¼¼<é,mæáá±ÿþÐÐP ÒYKQB“|}}---Ѿ ¤V¬XQUUennŽq0ˆ°Ðóôôüí·ßH§h?'''ƒ1a„{÷îijj’Ž (`áÆf³óóóÍÍÍIè''' SSÓÛ·o<˜tA@ ·óçÏ/]ºTL Ÿç¡çàà ++kaalhhH:ß ÓÙF#,'aUTTôéÓ'::º_¿~¤³ðF``àªU«FŽI: ƒ“° Qúúúh_ “~øABBâ‡~ðññ133#€0u)ÄΟ?oooO:YYY]¹reÁ‚AAA¤³ð‘p̵ ˜PLAgdd :433SJJŠtÞ{þüùôéÓ÷íÛ‡ÿeY¢x?àôôt999999›ŒŒŒfV~þü¹“““¼¼¼èÜÀËËkîܹh_ +CCÃû÷ïïÝ»÷àÁƒ¤³ðE ¸´´ÔÌÌÌÐÐ0-----ÍÐÐÐÜܼ¬¬¬©õ/^Ü£GÈÈHA†$ˆÃáxzz.[¶Œt>ÒÒÒzôè‘··÷† jkkIÇà1ŠÎµºººÆÆÆ^ºt©~É¢E‹ŒŒŒœ›"Oæ ¨?úÓO?%$$ÀwŸ?ž1c‹Åòòò’””$DŽÈMA߸qÃÎÎŽ{‰]`` ©}"€g(ZÀIIIúúúÜKôôô’““Iå¡”üüü»wïÚÚÚ’ ’’’uŸJ266~ùò%é8¼AÑÏ)**r/éÞ½{aa!©<”rîÜ9Ü}D “ÉtqqéׯŸ©©©¯¯¯©©)éDEѰ`¸¸¸0C:WsjkkÏž=‹ùgMK—.õööž?¾——é,EÑVPPh0ÞýôéSƒ1qǹ¸¸pÃÛ­ðÖÝ»wFŒA:fff÷ïßß³gÏöíÛqj45а®®nƒS|Ùl¶ŽŽ©<ÔqòäIGGGÒ)HÒÖÖ~òäIDD„Mii)é8íDÑž6mZƒ)&///kkkRy("===**jþüù¤ƒ¦¤¤tïÞ=%%¥Q£F¥¦¦’ŽÐ-à+VDEEýöÛoEEEEEEû÷ïò䉃ƒCý §–ONŸ>½hÑ"iiiÒAÈ“ðððX³f͘1cîÞ½K:@›Q´€eeeÃÂÂbbbÔÔÔÔÔÔž={*##ÓÔúÜçO ŹTíPQQqîÜ9Ì?p[½zõÕ«W—.]zôèQÒYÚ†ê—|"‚šWºtéÒÅ‹ïܹC:夥¥Íš5kÀ€]»v%hE䮄ß;qâÄš5kH§ "55µÈÈHYYY##£””ÒqZ,bccsrr¦NJ:EuéÒåÌ™3›7o655õññ! eTœk%Ž‚SÐvvvúúú?ÿü3é T—0{öìÉ“':t7o€Žã_#P®i¨€jœ=xðà·oßâò“­Q\\¼|ùò>øúújjj’Ž ï‹´“'OÚÚÚ¢}Z©[·nW¯^]¶l™‰‰ .Z ”E­¡EPj\^^®®®¡¥¥E: €ILL\°`Á!CN:%''G:%Œ€E×ßÿmllŒöh‡ÁƒGGGËËË6ìÉ“'¤ãü õ¨ƒ:#àÚÚZmmísçÎ;–t!výúu''§eË–íÚµKBB‚t&‹¨ÀÀ@EEE´/@Íœ93>>>))ÉØØøÅ‹¤ã0(`ŠûóÏ?7mÚD:°X¬€€€uëÖ™››8p ººšt"u(`ꊈˆ(((˜1cé ô±téÒØØØððp“ÄÄDÒq@¤¡€©ë÷ß߸qc§NH •>}úܹsgÅŠfffûöí«ªª"DUÎ6¢*œ„•˜˜8yòäwïÞáR>|’™™¹zõê?ž;wÎÐÐt (œ„%röïß¿nÝ:´/ÿôîÝûæÍ›?ÿüóÔ©S7oÞ\VVF:ˆ0½|ù2,,ÌÉɉtú[´h›Í®»àëÍ›7IÇB~®•‚ˆOA/^¼XGGgÛ¶m3ˆš{÷î­]»vÀ€ÇŽëׯé8@˜‚!¯_¿¾sçný `'Nd³Ù£F1bÄÁƒ+**H'šCSŽ‹‹Ë† pÝZÁ“ضm[ttô“'OtuuÿùçÒ‰€Î0Ý‚SЉ‰‰oÞ¼éÚµ+‘P'44ô§Ÿ~RTTxð7 ½ªªª+W®=zôÓ§O«V­Zºt©²²2éPÐZ8 K PÀoß¾5jÔ“'Oú÷ïÏ× uDGGŸ:u* ÀÒÒÒÑÑqìØ±¤AËPÀÅïæp8&L˜1cÆúõëù· ¦âââ¿ÿþûôéÓÇÁÁÁÖÖVEE…t(h΂¦ww÷êêjgggÒA€€nݺ9;;'%%9s&11QGGgúôéׯ_Ç=D FÀàëøÕ«WcÇŽŒŒÔÒÒâÓ&@ˆ|ýúõêÕ«žžžÉÉÉ ,°³³6léPðLA ÿwUUÕèÑ£V­ZÅ×áõþý{//¯‹/JJJÚÚÚΟ?W °@ñïpÿòË//^¼ ÂíS QçñãÇ>>>W¯^íӧϼyóæÎÛ§OÒ¹D X øt¸ÃÂÂìììâââð hQMMÍýû÷}}}¯_¿®««;wîÜ~ø¡wïÞ¤s‰°@ñãpçåå 6ìüùó¼}e ·ÊÊÊ;wîüóÏ?7oÞTWWŸ9sæ¬Y³H:—¨@ Ïwuuõ¤I“LLLöîÝËבR]]qýúõþùG^^~ƌӧO>|x§NHG£3°@ñüpoÞ¼9!!!$$÷ €Žãp8ÑÑÑ·nÝÊÊÊš4i’•••¥¥¥’’éh4„(Þî .ìß¿ÿÉ“'Ý»wçÕkÔÉÌ̼}ûvHHHhh¨ŽŽÎ”)S,-- ñß}^A ÷ýû÷çÏŸÿàÁ¼a|UYYRPP`nnnnn>aÂ\ﶃPÀūÜœlffæëëkjjÚñWh¥ôôô{÷î………………IJJN˜0ÁÜÜÜÌ̬gÏž¤£ °@ñäpgee3fïÞ½ .äI*€vHII ¿wïރƌcff6~üx555ÒÑ„ X :~¸sssMMM—-[¶iÓ&^¥è‡“’’òðáÃððð‡vîÜÙÄÄdôèÑ&&&úúú;w&¢PÀÕÁÓ“caa1wîÜ;wò0¥¦¦FEEEEEEFF~øðAOOÏØØØÄÄdĈ}ûö%ŽBPÀՑÖ–faa±dÉ’íÛ·ó6Ÿ”””<þ<**êÉ“'Ïž=«ªªþÿ 6¬W¯^¤’„¨vî/^L:uÓ¦M?þø#ÏSFVVÖ³gÏbcccccŸ={Æd2‡n``0dÈ}}}---‘ºš= X Úw¸CCCmmm;6oÞ<~¤ "33óÙ³gÏŸ?OJJŠ‹‹+,,2dÈàÁƒ‡ ¢££3dÈz_ä,Pí8Ü'NœØ·oŸŸŸß¸qãø” € ÙlvRRÒ‹/“’’¤¤¤† 2dÈAƒiii 4ˆN·œA T›wii©££cBBB`` ºº:_ƒPPFFFbbâ‹/RRR^¿~ýêÕ+&“YWÆZZZššššššZZZ222¤“¶ X Z¸Ÿ>}jgg7~üø£GJIIñ;€PÈÉÉyùòå›7oÞ¼y“šššššúæÍ›îÝ»s÷±–––†††´´4é°-@ Tk÷·oßöîÝ{þüùãÇÛØØ&€âp8Ü}üúõë>ÈÈȨ««kiiõíÛ·oß¾}úôéÛ·oïÞ½IGþ?(`jñp‡……­Y³FWW÷ĉ,K`Áh&//ïÝ»w©©©éééu_TUU©©©Õ•qŸ>}ÔÔÔúôéÓ§OŸÞ½{ xº,PÍî”””_~ù…Íf>|ø‡~p0QRR’žž^WÆ™™™iiiééé™™™™™™;wîÕ«Wß¾}Y,V=úöíÛ«W/Ì „ù {IDAT‹¥¬¬¬¬¬ÌóS²QÀÕèáNJJ:xðàÝ»w7nÜèìì,))I$€ˆ+))ÉÌÌLOOÏÍÍÍËËËÌÌüøñcÝ×¹¹¹_¿~­kâž={*)))++³X,‹¥¤¤¤¢¢R÷E›ÆÐ(ध§oذáßÿe0GŽéÓ§O»_ûpWWWŸ>}:..ÎÙÙyíÚµ²²²¼ ¼VYY™ŸŸŸ››››››ŸŸŸŸŸŸ“““ŸŸ_PP››[÷µ¸¸x=ê¾èÖ­[]mËËËËÉÉuëÖ­{÷îÊÊÊ(àæ”––:ÔÞÞÞÉɉÁ`¸»»ÿý÷ßñññí>¹®îp?þüòåËÞÞÞ+W®œ;wn—.]xøòåK^^^qqqAAAAAAQQQqqq][þüùË—/ÅÅÅŸ>}ÊÏÏ—””,--E7ÉÕÕ566öÒ¥KõK-ZdddäììÜŽW+//—––ÖÒÒª©©Y¸páâÅ‹µ´´x„FII‰œœ ¸Ifff[·n4iRý’»wïþþûï¡¡¡í{A&“ùüùó¡C‡ŠÔõNà{˜‚n‹Åb³ÙÜÊÉÉ100ÈÎÎnß òïp€pA7GBBâëׯâââõKªªªºvíZQQѾD@þ5Bg~¼¨°pqqÙ½{w£aòøŠC=LA· öNxaï„öNxñoïÄøñ¢¦««›À½„ÍfëèèÊÐ":ð´iÓ¼¼¼¸—xyyY[[“ÊÐ":Ì”””èëë;888::2 wwwOOÏ„„„vß{Ó) {'¼°w {×>tËÊʆ……ÅÄĨ©©©©©={ö,44THïü "‚Îÿmi7üoNxaï„öNxaïÚ§“‹‹ ?^WØ™šš’ŽÀGØ;á…½^Ø;áŧ½£ó[(‹ï0(`PÀ €@€  @ €0(`PÀ =|øpÞ¼yÊÊÊݺu9rd@@éD<öüùs'''yyy&“I: Ϥ§§ÛØØÈÉÉÉÉÉÙØØdddNÄK´ü–Õ¡÷¯Û“'OÔÕÕ%$$TUU'NœxíÚ5Ò¡ø"''GKK‹f?ŸÌïð|(à†ÆŸŸŸíæææââröìYÒ¡xiñâÅ=zôˆŒŒ$„gJKKÍÌÌ ÓÒÒÒÒÒ ÍÍÍËÊÊHçâú}ËêÑû×ÍÙÙÙÀÀàöíÛ¥¥¥‰‰‰›7oÞ·oß®]»Hçâ1‡³dÉ’={öÂ{œÿÅó×ÇÝÚ´iÓüQÿŸ6›=kÖ¬ÔÔT²©ø6·ðtuu½téRý’E‹9;;LÅ´ù–Õ_·:oß¾>|xQQé ¼tøðáøøx///šý| `whu¼ø¡¬¬LAA¡¢¢‚tÞ£Ío‹™™ÙÖ­['MšT¿äîÝ»¿ÿþ{hh(ÁTü@›oYShüëV'==ÝÐа  €tž‰_°`Att´¬¬,Í~>°;˜‚nAHHÈàÁƒI§€æ$%%éëës/ÑÓÓKNN&•ÚÆ¿nÅÅÅuox;::’ÎÂ3åååvvvžžž²²²¤³ð…ŠŠŠ¸¸xÏž=.\øòåKž¿> ¸9………Û·o?räé М¢¢"EEEî%Ý»w/,,$•Ú‡®¿nuçïÈËË?^VVÖÅÅ…t"žùé§ŸæÌ™3räHÒAøÂÚÚúÊ•+%%%111#FŒ?~|||<·Á&äääŒ7.,,Œt~¡Íw_\\¼²²’{Iee¥„„©<üC›oÙ÷hÿë–››ëíí­ªªº{÷nÒYx# `ìØ±ÕÕÕõKhüóÉápÜÝÝ'OžÌÛפՔ};pŸYÎ}(>~ü8uêÔC‡™››“ÈÅMí]ý£ôøî³X,6›Íb±ê—ääädggLÅ´ù–5@_·Ö_²dIzz:é < ©©ª¦¦V¿„®?Ÿurss544JKKyøš¢>ÍýŸ‘ú…YYYVVV‡ö?îýèêê&$$p/a³Ù:::¤ò@›Ðæ×­5†ž——G:o¼}û¶_¿~ >&˧ÏËR?þŠŠz///ÏÒÒòàÁƒfff¤³@«L›6ÍËË‹{‰———µµ5©<Ðz¢ö륭­M:o|?¡Z¿t4¾ð÷÷711áñ‹òvF› |||H§Ú|÷¿|ù¢®®¾ÿþÂÂÂÂÂÂ}ûöÕÍ‘ÎÅ{´ù–Õ£÷¯Û¤I“rss+++333ÏŸ?ß«W¯[·n‘ÎÅ/túù433»råJvvveeå»wïöï߯¤¤ËÛ­Ðyʾ}?)**’——|~ht…ýÇàÇ6l¨û௹¹ù‘#G¸ßšv´ü–Õ¡÷¯[xxøñãÇ,..f±XfffÛ·o8p o·BŸã Dð0(`PÀ €@€  @ €0(`PÀ €@€  @ €0(`PÀ €à?óæÍÛ²e ÷’Í›7Ïž=›Tcr8Ò€*>}ú4tèÐ7n :”Á`ÄÅÅYZZ²Ùl‹E:Ý` ÿéÞ½»»»ûŠ+jjjjjjV¬XqèÐ!´/?` ÙÛÛ<˜ÃáÜ¿ÿæÍ›¤ãÐ ÊÍÍ577/.. ÓÒÒ"€žPÀг³ó„  ^¼xqìØ1Òqè ïÀÿ¸wïÞÛ·ogΜéààïÞ=Ò‰è #`øOQQш#îܹ£¡¡Á`0’““§M›«  @:Ý` ÿqrrZ¸pa]û2 [[['''²©h #`0  @ €0(`PÀü?X 0‰(_¡IEND®B`‚gsl-2.7.1/doc/images/rand-gumbel2.png0000644016036000116100000004535313373111455014242 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœíÝy\Ìùãð™t麄ش•(¤¡DH[¤¥ØvQXåú®c˲b7÷V«uì:²I9·’6W‡Tº!%…)ºè ‹Róû£}´óKM‡fÞŸ™y=ÿâ=ŸÏ|^óéxõù|Þó:‡Ã¡€`I ŽPÀ €@€  @ €0(`PÀ €@€  @ €0(`PÀ €@€  "ŽÞ1Áˆ‰‰qrrRSSëׯŸ©©ippp§«äææ®\¹RGG§oß¾}ûöÕÓÓûöÛoccc{=[wBG+¶î[uuussóÝ»w¿xñ¢W6Ê#Fï~5ö½b "ŽÃåãÿ €¹¹ù«W¯‚ƒƒ‹‹‹}||ÜÝÝO:Åcù¿ÿþ{æÌ™FFFoÞ¼a³Ù{öìÉÈȘ2eŠ`¢–}[WW—½wïÞêêj##£Ë—/wëIY¨[ ….°_CÄÑé¾á7oÞ|ðàÁÖßò,ËÁÁ!//¯Ý…óòòf̘qïÞ= îñæææM›6yzzön¶ïŽVlw<##cúôéÑÑÑ| ö)_Y"ß4ƒ8355 k3˜™™9dÈ>Ðéôººº+V¨ªªÊËËÛÚÚfeeq/y÷î]YYÙaÆ>}º£­:tˆûKGG§°°°£…===ׯ_ߦ}i4š„„Dkû¶{ÄÆ}2¶®®nùòåÊÊʪªª[·nåp8õõõ«V­RQQéß¿ÿš5k>|øÐºb¯¼FÞÆŽûý÷ßœ¿ººzË–-ºººrrrýúõ›>}úõë×[hs¥€N§××ׯY³F]]½Ý3Ï<^=ÖѶZ 555•—————oó C§Ó›šš~ùå—aÆÉÈÈ >ü÷ßïÙ.1Åm¾á¬­­Û,³lÙ²Ÿþ¹eáo¾ùÆÛÛ»¸¸¸¸¸ØÛÛ[]]=??¿e±œœUUÕ€€€7oÞ$&&jiiEEEu%Õ+W˜LfGêêêææævëU´¤ÑhK–,ñõõ­¨¨xò䉩©é¡C‡–,YræÌ™òòò–‘ß~û­uួƎ~ut4þèÑ#mmí6ËÌ;÷ûï¿þüyCCCyyyhhèŒ3:z¶téÒ–0í¾j/¤Ó=ÖÑC÷ïßWVV>þ|YYYiié¹sç”””’’’Z[¾|ùöíÛŸ|Ø:òúõëþýû—––¶,¼gÏîåwïÞíììÜòoggçÇ·>KLLl]¸MÖÕÕIJJ¶ü[ZZºÍÕ ›~ñâ…¡¡á;wx'ÔÑÑÉÉÉáþãWÑÔÔÄýhsss›?iýGÏ^cw 8++KGG§Í2OŸ>3gެ¬ìˆ#–,YÜš³ÝRlhhèhs¼_H§{¬£§•‘‘isBâÝ»w222­‹555u´.@§0 ÄšªªªƒƒÃüA£ÑBBBhbbÒúhQQ÷ÂEEEjjj-ÿf0EEEÜ?K-¿ÓÛUTTdkkëééieeÅ;……Ehh(ïeú÷ï_UUÅ=òìÙ3îÿ~<çˆÇ;mzë5òå±ÌðáÃïß¿Ï=ræÌ™®$iW¯¼FÞ233½½½7lØÐî£222†††Ë—/¿xñbË ¬¬lCCC·¶Âã…ðÞc<¶Åd2Ûü=tíÚ5&“Ù­`ì7I}Ã[YYmÛ¶M]]ýýû÷Ü /X°àÈ‘#%%%%%%GŽQWWòäIË£>4hÐÙ³g_¿~]SSsçÎŽ&av=äÙ³gèéé™››ûîÝ»·oßfgg8p 5|`` ŽŽNLLLmmm^^Þ?ü°|ùrZN¨~<Òã×ØÑžlÿðáCEEEllì¦M›ÔÔÔ®\¹òñ2S¦L9wî\aaacccqqñöíÛmmm[200 úðáWÑõÂ{ñØV\\œ’’RË,è²²²óçÏ+++s_¤à  Sø^1ÒÑ/Çk×®Ñh´;v´Y¸¦¦fÙ²eJJJrrr_|ñ‹Åâ^ ==ÝÖÖVQQ±oß¾]ßm÷ßÊÊJ9ÓÓÓ-Z4dÈ)))99¹‘#G®[·Ž{ë>>>ºººRRRC‡ݽ{wËûz;z¼ ¸g¯‘G·––VSS›2eŠ»»{›iV­ëFEE9::ª¨¨ÈÊÊêèèlݺµªªªå¡ððp]]Ý>}úðx]Ýz!<öïm·ÜÔØØ8$$„ÇŽå±g>†[ÀÐêëë•••óòò¸ï€$_I’@XUU•···‹‹ËÇ÷Ÿà0ˆ5:ÞrÆòìÙ³¤³€xÁI6ð6$PÀ €@€  @ €0(`PÀ €@€ €º\PPàèèÈ`0 †££caaaGKÒÛ#---È´ÝBÑ®©©±´´d2™l6›Íf3™L++«ºººvæ|ÄËËkþüùÎ Ðuý<`//¯ÔÔTÿÖ‘E‹™˜˜¬]»¶Óu›››uuu/\¸`llÌÏŒ=GÑ#àÐÐPî—®¬{ýúuuuu´/PE 8++ËÐÐ{d̘1=êʺÞÞÞëÖ­ãO.€ÞAÑSÐÒÒÒµµµRRR­# ïß¿ç½âƒfÍšõôéSIII>gøÏ`¢))©†††iiéNW\¶lÙ¾}ûº¸•]»vµ»OdeeüUÊêIuE€ÕÕÕY,–ººzëHII‰‘‘Qqq1µ^¿~­§§÷äÉeeåOÙ:NÑÝÆ¿F è5`ƒÌÌLî‹¥¯¯Ï{­?þøcÞ¼yŸØ¾@Ѷ³³óóóãñóó³··ç±JccãñãÇ1ý „E ØÍÍ->>~ïÞ½•••••• ®®®­ Ðéô6«\¹rE__¿Ó£d* h+**FFF&''kjjjjj¦¤¤DDDÈËËóXå·ß~Ãá/ Ì6j&a@ ±›„ ÚPÀ €@€!Fï˜`ÄÄÄ899©©©õë×ÏÔÔ488X0Ûm•––¶zõêþýûwú’{kŸt}‹À „÷u?þ¯˜››¿zõ*88¸¸¸ØÇÇÇÝÝýÔ©S‚Ùt ggçÄÅʼnðEÞoÓ¼ @ùÉݼyóÁƒ[Y,–ƒƒC^^ž€cкðò{}ÿˆÉ¯J¼  {LMMÃÂÂÚ fff2äÇt:½®®nÅŠªªªòòò¶¶¶YYYÜKÞ½{×ÄÄDVVvذa§OŸîh+‡â>«££SXXØõ/_¾üî»ïµ´´¶lÙòîÝ»®¯Û¼_2 DÓºuë¼½½Û úøø¬\¹²åóÂ]]]õõõ>|˜ŸŸoccceeõôéÓ–Å?~XáѾEEE¶¶¶žžžÝj_vùòåS§Nµ|Ô[›Ë±<ÞâÜã7àòxÉ|Ú"ð€Q¶nݺãÇ766úøø¬Y³†û¡€€€6ÿµ¶¶nù·……EHHHWž¿¬¬ÌÆÆfÿþý–––ÝÍÖæxÔ××—ûQÞg/»»­<^2Ÿ¶|XBBÂÏÏïùóç=~™]Ü:— ôðÚ±HÃnFýä^»vF£íر£ÍÂ555Ë–-SRR’““ûâ‹/X,÷ééé¶¶¶ŠŠŠ}ûöµ°°¸sçNGýXeeeË£åååÊÊÊ.//_¸p¡²²rÿþý—.]Z]]݃_><~±·Ùz§/ùÓ·(’ø÷êÄâzw‰ÉÌ1Q__¯¬¬œ——§¡¡Ñ:(˜sŸÜÜ\~oˆ‚[üûVÁ)heUUUÞÞÞ...Üí+0gΜ9sæŒà·K…­C§p¨×ˆ:Þr®õìÙ³ £ÍCø1‡®À0@·ñø½‰öâð6$PÀ €@€  @ €0(`PÀ €@€  @ €0(`¨[ÀŽŽŽ ƒÁ`8::òX¸¹¹ÙÇÇÇÀÀ@VVvÔ¨Q/^XN€ h×ÔÔXZZ2™L6›Íf³™L¦••U]]]G˯^½šÅb]»vííÛ·ýõ×_ý%È´ÝEçp8¤3´ÃËË+55Õßß¿udÑ¢E&&&k×®ýxᨨ(OOÏÐÐÐÞÚ:NÑÝÆ¿F èphh¨‹‹ ÷ˆ‹‹KHHH» ÿùçŸß}÷@rôŠpVV–¡¡!÷Ș1c=zÔîÂ÷ï߯©©177—““STT´¶¶Ž‹‹HL€¢hWVV*++s¨¨¨TTT´»pIIÉŠ+–,YÂf³Ÿ>}º`Á‚/¿ü266V IzB’t€^ÐÜÜ|øðá%K–´ü÷Ûo¿¥Ñh;wŠ"  c=VRRjs¼[^^Þæ˜¸•ŠŠŠ÷ÈìÙ³“’’:ÝŠ»»;½=Ÿ’ +(ZÀ™™™Ü#,K__¿£…{¶wwwN{zöl]GѶ³³óóóãñóó³··owá¹sçþóÏ?Ü#ׯ_766æc>€OCÑ7¼VWWººº®ZµŠF£;vÌ××733S^^¾eî7f½{÷ÎÊÊjÅŠ3gΤÑhׯ_ß´iÓåË—-,,z¶u¼ZˆÝû€###“““555555SRR"""ZÛ· YYÙ+W®ÜºukøðáC† ùóÏ?/^¼ØãöêµGÀÐB쎀D €0(`PÀ €@€  @ €0(`PÀ €@€  @ €0(`PÀ €@ I:­±±1+++;;;//¯ªªª¦¦¦¾¾¾OŸ> CUUuРAZZZÇ:t(餽†ÎápHg :»E²²²þþûï;w¦jiiéëëëèè(+++**ÊÊÊ655½}û¶¼¼üåË—OŸ>}üøq]]Ýøñã­­­---Ç×§OÒ¯DÿMÓ0_ÕÖÖúûû;v¬ªªjÞ¼y3f̘zôè„ ø±‰æææÐÐPooo6›½yóæo¿ýVFF†qƒ#`V!!!&&&Ó¦MKHHàSûÒh4 ‰/¿ü2*** <<\[[ûÈ‘#ïß¿çÓæ>õÚ#à^Ááp~úé'ÿK—. rÓ»víÊÈÈØ³g³³³„þЀÂ$,Bº††WW×¼¼¼k×®©ªªɰqãÆúúúƒZ[[ÉÂ,P(àOT__?oÞ<))©ÀÀÀ¾}ûLÂápþþûïíÛ·ëèèx{{ëêê Â×€AhÔÖÖÚÚÚª¨¨\¹r…lûÒh4:îèèøðáC ‹I“&íÚµëÝ»wd#´@CozÿþýܹsµµµÏž=+)I•JIImÚ´)##ãÑ£GcÆŒ‰ˆˆ § ÛƒSÐ=ÓÜÜüÕW_õéÓ' €²÷‰ü矾ûî»)S¦üú믤.N€Á)h;wî|õêÕ¹sç(Û¾4mæÌ™<0`À¨Q£Î;G:ˆ/êµGÀ=øã?&&&ª©©‘ÎÒ%éééK–,ÑÒÒúã?ÔÕÕIÇŠÇ#à‚‚GGGƒÁ`0 y,LÿˆÀrFËÌÌ\·n]HHˆ°´/F322JNN600;vìßÿM:ˆŠpMM¥¥%“Éd³Ùl6›ÉdZYYÕÕÕñX…óÿ ,*TVV:88øøøŒ=št–î‘––öðð Ú¶m›‹‹KUUéD F(ZÀ'Ož455ýñÇ•”””””~üñG“S§N‘ÎíX¾|¹½½½““é =djjšžžÞ¯_¿±cÇÆÄÄŽâ‚¢êââÂ=âââB*täÌ™3Ož<Ù¿?é ŸDNNÎÇÇçĉß|óÍÎ;ñ‘J -ବ,CCCî‘1cÆ€®À¡^;pÜ‘††ƒ'NXYY‘ÎBF\\œ““ÓêÕ«·mÛ†[Žˆ±;j:}ú´®®®Ø¶/F333KJJº~ýú¼y󪫫IÇ!††®z÷îÝÞ½{÷ìÙC:aƒŽŽŽVSS311á}w6PÀÐUþùç¸qãÆO:yÒÒÒ'NœØ¶m›……>Êz;ÛkÀ{÷î¶¶vXXØØ±cIg¡´´´¹sç.[¶lçθ$ ’p ;}úôøñãѾm0™ÌÄÄÄ[·n988à’0t :×ÐÐpðàÁ;vBEŒŒŒ8pà„ rssIÇ¡†Î;wnäÈ‘¢}ãÉO!--}üøñ 6L™2åŸþ!„.v¶×€¹5779òÏ?ÿ477'…êæÍ›·nݺ͛7“ν׀˜k×®õë×íÛ¦¦¦ —.]Z°`A]]é8@i(`èÄáÇ7mÚD:…Ð2dȽ{÷¤¤¤ÌÌÌž?N:P xIHH(..vtt$D˜ÈÊÊþõ×_K—.8qbTTé8@Q(`àåèÑ£kÖ¬éÓ§é ÂgíÚµ ,8sæ é,@E˜mÔLÂjñêÕ+==½üü|%%%ÒY„Õ“'OìììfΜyèÐ!IIIÒq Û0 8}ú´ƒƒÚ÷Sèêê&&&>~üxÆŒååå¤ã… €¡}MMMüñÇêÕ«Izýû÷¿~ýº±±ñ„ ðá Ð  í»uëÖ€˜L&é ¢@BBâÀ»ví²°° #( íûóÏ?—/_N:…Hqvv¾víÚÊ•+÷íÛ‡I€ÙFíÀ$¬¢¢¢Ñ£G³ÙlÒYDÍË—/çÍ›7tèP___yyyÒq ˜„åëë;þ|´/?hhhDGG+((Lž<¹  €t  mq8œ3gθ¹¹‘"²dddΜ9ãììBÃZ>¿–t q7dÈØØX))©I“&={öŒtà0üëùóçOŸ>µ²²"h²²²gΜY¼xñ¤I“"##IǾ@ÿ._¾ìàà€§Žõë×,Z´è?þ z þuùòåùóç“Nÿ……Ž{÷¼½½7nÜøáÃÒq 7‰ét_ÞÄpô³gÏ&NœøòåË>}úÎmUVV~óÍ7>|¸pႪª*é8â³ ¿®\¹2wî\´/5)))………'''“޽ 4Î?S^Ÿ>}öíÛçíímggwúôiÒq ˆÝ¹Ö®·SÐl6ÛÄĤ¨¨GÀÔ—››koooccsøða̘œ‚> š={6ÚW( >G)wîÜ?~<ÚWØÑéô~øáìÙ³NNN¿ÿþ;é8Ð%-ବ,CCCî‘1cÆ>¾±±qÒ¤IOŸ>%x¡hwKHHHVVÖöíÛ»»¢»»;½=üIA}ûö>|8é ЛäääΟ?¿lÙ²I“&…††’Ž¢èl#uuu‹¥®®Þ:RRRbddT\\üñÂ:::ššš­#˜„Õåååžžž¤ƒ_$&&:99}óÍ7?ÿü3nZ Ðcb7 ËÀÀ 33“{„Åbéëë·»p~~þ°aÃÚŠձlÏ„‡‡ÛÚÚ’Nü2a„”””´´´éÓ§—””ŽmQ´€íììüüü¸GüüüìííÛ]˜ó‘ÖAAdN>Ä[VD›ªªjxxø´iÓŒïÝ»G:ü?-`77·øøø½{÷VVVVVVzxx$$$¸ºº¶.€£ÛOtëÖ-sssÜKäIHHìÚµëôéÓ_}õÕðW)uP´€###“““555555SRR"""äååIç8ÿ,Vf̘‘””týúõ™3g¾~ýšt Ñ(; ‹,‘Ÿ„ÕÜÜ|ø°sç΀€€ .Lœ8‘tá v“°€¯ÒÒÒTTTоâFRRrß¾}¿ÿþûܹs}||HÇw(`qtëÖ­/¾ø‚t cöìÙ÷ïß?{öìüùó+++IÇ_(`qtëÖ­3fNÄ´Ü0kèСcÇŽ%@L‰øÅΞíkÀÕÕÕC† )))éÛ·/é,@XxxøÒ¥K7oÞ¼aü³ ]Ä®WTT=zÔÑÑQKKK^^^^^^KKËÑÑñèÑ£<îÌ T5a´/Ðh4[[Û¤¤¤+W®ØÛÛ———“Ž ^:,à/^¸¹¹ <8 `Ú´iaaaÅÅÅÅÅÅaaaæææçÏŸÎ?·Ï>û,&&fäÈ‘FFF‘‘‘¤ãˆ‘¬ûöí«¥¥åééiccÓîááá7n|öìY}}=? Ú§ ‡~õêÕÑ£G“ÔrçÎ¥K—º¸¸ìÙ³§OŸ>¤ãPÿ¡Ãç]²dɱcÇäääx¬\WW·zõê³gÏò#A"\À&&&ÅÅŸà{õêÕÂ… ?|øàïï?xð`Òq(À5à³gÏòn_&'''zí+Ú¢¢¢¦M›†ö…v©©©Ý¸qÃÒÒrܸq!!!¤ãˆ8¼ I¼DFFZZZ’NÔ%!!±cÇŽk×®mÚ´ÉÅÅ¥¶¶–t"‘ÕyÏŸ?¿¬¬¬Í`eeå7ß|ßHÀG-GÀ¤SÕ§¦¦ÒéôqãÆ%&&’Ž š:/`--­1cÆøûû·ŽÜ¾}{ܸqÚÚÚü ½///Ãá >œt 㯿þúå—_æÌ™³gÏž¦¦&Ò‰DM—®-§§§»ºº4ÈËËËÇÇ'33óĉ#GŽ@>"DuÖÉ“'ïÝ»×æƒ–x+..vvvnjjòóó:t(é8‚FøÃŒŒŒ’’’¦M›fii9zôèèèhn_eaaA:™AƒݺuËÆÆfüøñçÎ#@ttcNïׯŸªª*æÐ ©èèh\†غuëíÛ·:ôÍ7ßTUU‘N ºTÀééé&LÈÊÊŠˆˆˆŠŠš5kV~~>¿“Aïzüø±ŒŒŒ––é ¬ÆŒ“””¤¦¦6vìØ»wï’Ž ô:/à­[·ÚÛÛ»»»Ÿ9sF]]ýÈ‘#ßÿý_|±k×.äƒÞ‚ùÏðédee9rüøñ lÙ²åýû÷¤±Î øùóçvvv­#ÖÖÖÉÉɹ¹¹ü ½,::€¡WØÚÚfee1™ÌÔÔTÒq„•hN÷ýD¢7 šÃá <8!!ASS“tçÏŸß°aÚ5k~øáIIIÒqø‚ð,hv999rrrh_è] .LKK‹4iRvv6é8B¦Ã^ºti]]ï•ëêê–.]ÚÛ‘ ÷aþ3ð‰††Fxxø²eËÌÍͽ¼¼š››I'ð… ŒïܹÓÑ·oß666¾pá‚AoЉ‰177'DN_±bEBBBpp°¹¹9f‡tQ‡œ››;a„Y³f™››?~<''§ººººº:;;ûرcS¦L™={¶©©)~Ø„ÂÝ»w§NJ:ˆ²Ï?ÿ<**ÊÉÉiòäÉ8èŠN®-¿zõ* ***==ýÕ«W4mÀ€L&ÓÊÊê믿VQQTN±IXOž<™>}úóçÏI±ðôéÓ%K–Ðh´Ó§Oëêê’Žð©ø×"Õ4½EÄ øÔ©S÷îÝû믿HqÁápNž<¹cÇŽ7nÚ´©OŸ>¤ôfACÏÅÄÄL™2…t #t:}ùò剉‰·oß633ËÊÊ"€ŠºTÀyyy...ƒ–’’¸®®®Ý…×®]kddtãÆššš‡nÙ²å—_~Ùµk—€3S Ž€A¨Y[[gffš™™ïÝ»÷Ý»w¤ô2ŠÎ6òòòJMMõ÷÷oY´h‘‰‰ÉÚµk»²z~~þøñã+++{¶u˜„URR2jÔ¨W¯^uå]dTöüùóM›6¥¦¦~üxqþ¨Q¼ ÄÄôéÓSSSÝÜÜæÌ™³lÙ²—/_’NÐ -`;;;???î???{{û.®?bÄ>ä¸ âCBBbñâÅÙÙÙ 044ܾ}û›7oH‡èа››[||üÞ½{++++++=<bkÈ!§OŸŽŒŒ¼qã†Á•+W„z2ˆ<ážmÄ'B= +$$äĉááᤃtûöí­[·ÊÈÈyòdôèÑS§N]¹reo'Ào(`‘ÒòfŒ6wñ…mÛ¶åääôë×oôèÑÛ·oïñ§¥ô°HÁùg”””8‘‘ñúõk]]ÝíÛ·¿~ýšt(_(`‘’””„àmÈ!þùgjjjUUÕˆ#~úé'Ü»ˆ@‹t‘¦¦æ±cÇRSS_¼x1|øðTWW“â,:jkkŸÜßß?222--M[[{ÿþýoß¾% D Xt €>¾¾~```TTTVV–ŽŽŽ»»{EEéP šPÀ¢ Ð[FŽyîܹû÷ï¿|ùRWWwãÆEEE¤C¨A‹ˆ7oÞ9’tÑ¡­­}òäI‹ÅápFý¿ÿý/??Ÿt((`‘––6vìØ>}ú j444<==srr”••'NœèääÄb±H‡Q€ÉÉÉ8ÿ À?jjj?ÿüó³gÏ&L˜`kk;{ö츸8Ò¡@¸¡€EDJJб±1é"N^^~Æ ùùù³fÍZ¼xñ”)SBBBš››Iç¡$ÄŸ<Ï?üûøeþùüóÏoÞ¼©««K:€¸hjj :|øpUUÕÆ]\\dddH‡‚ÞÇ¿F¾¦¡+àW¯^ééé•——ÓétÒYÄNLLÌþýû333ÿ÷¿ÿ¹¹¹©©©‘N½‰€SТ %%eܸqh_"¦NúÏ?ÿ„‡‡?{ölĈ+W®ÌÍÍ% „ X$''ã0YcÆŒ9yòdNNÎÀ§N:{öìèèhÒ¡€ÒPÀ¢ @jjjîîîÏŸ?ÿòË/W¯^mll|þüù††Ò¹€Š„ìb§`Ý5àAƒ%''2„tø‡Ã ;räÈÇW­ZµråJ\F¸ *,,¤Óéh_ª¡Óévvv·nݺ}ûvaa¡žžÞÒ¥K“““Içª@ =Ü‚€â þüóÏ'OžŒ9ò›o¾a2™gÏž}ÿþ=é\@ Xèá0€PPQQÙ²eË“'OöïßñâÅaÆýôÓOøŒq†z¸€¡Óé3fÌŠŠª¨¨=zôœ9snܸÛi‰!!›m$B4 ‹Ãᨨ¨<~ü“;„Qmmí… Nœ8QYY¹zõêo¿ý¶ÿþ¤CÁÿƒIXо¼¼¼~ýú¡}„”¼¼ü²eË’““ÏŸ?Ÿ––¦¥¥õí·ß&%%‘΂€n)))˜ &L˜àïïÿøñã‘#G.\¸püøñÇŽ«¨¨ ø,ÜPÀ¢dÀ€›7o~üøñ¾}ûâââ´µµ.\x÷î]Ò¹€/PÀ 3°D„„ÄôéÓÏŸ?ÿìÙ3SSÓÿýï£Fòöö.++# z“ÐÌ6$a™„ÕÔÔ¤¬¬Ìf³1k@´ÅÄÄøúú†„„XXX¸¹¹Í˜1CB‡O‚#(a)ବ,‡Ç“‚PSSxêÔ©âââÅ‹»¸¸à#À³ ¡-ŸBH:ˆ‚‚‚››[bbâ?ÿüSWW7uêT33³?þø£ªªŠt4è °KKKc2™¤S€ 5ê×_-,,ܾ}{dd¤––Ö×_}óæMÜÍC¸ €…Xjj*ހˤ¤ä¬Y³.^¼øôéÓ©S§îرCSSsûöíYYY¤£A—ÇÅNŠkÀMMMJJJ˜-²²²þú믋/2Œ%K–8;;0€t(¡'Ž×€  ƒÁptt,,,ìhɘ˜'''55µ~ýú™šš 2')¹¹¹ @û@+ƒƒ>þüøñãYYY#FŒ°··¿xñb]]éhЊpMM¥¥%“Éd³Ùl6›ÉdZYYuô=dnnþêÕ«àààââbww÷S§N 8°àáü3´‹N§Ož<ùÌ™3………óçÏ?{ö¬††ÆÂ… ¯_¿ÞÐÐ@:ü‡¢çZ½¼¼RSSýýý[G-Zdbb²víÚÞ¼yóÁƒétzËY,–ƒƒC^^^·.§ 7lØ ®®¾uëVÒA€ê^¿~}éÒ¥ÀÀÀœœœ9sæ899YXXôéÓ‡t.á v§ CCC]\\¸G\\\BBBÚ]øÐ¡C­íK£Ñtttxœ¯iii8€®PUU]½zõ½{÷ÒÒÒFŽùã?2dݺu Ô?Øa=ÔSWWg±Xêêê­#%%%FFFÅÅÅ®{õêÕ½{÷¦¦¦öxëÔ?æp8JJJùùù***¤³€ðyòäI``à… êë뜜¾þúë±cÇ’EQbw',iiéÚÚZ))©Ö‘ÆÆF…÷ïßó^±¢¢bÒ¤I'Ožœ2eJ·NýÎÍ͵µµÍÏÏ'„‹Åºxñb`` ¬¬ìW_}5gÎ4qbw ºgJKKçÎ{üøñ.¶¯»»;½=üÎùéð!HÐ+ÆŒãáᑟŸúô麺ºyóæéééíܹ3##ƒt4ÑGÑC½œ‚~ùòå¬Y³~ýõW++«OÜ:õ€7nܨ®®¾eËÒA@Ô¤¤¤\¾|ùêÕ«gΜ9óæÍ355Š#>»#`ƒÌÌLî‹¥¯¯ßÑòEEE¶¶¶žžžŸÞ¾BGÀÀ'ãÇ?pà@^^^PPƒÁpuuÕÒÒÚ¸qc\\nuÙ»(z¨çéé™––ÖæmHÆÆÆëÖ­ûxá²²2kkëýû÷Ïœ9³W¶Nñ#àææf%%%| !ÆÃ‡¯^½TZZjoo?gÎ+++iiiÒ¹Dì&aUWWººº®ZµŠF£;vÌ××733S^^¾eî=Âd2·lÙòõ×_÷ÖÖ)^ÀÙÙÙ_~ùenn.é ^ž>}”••5sæÌ9sæØØØ(((ÎÅ_bWÀ4íùóçßÿ}DDF³²²òööÖÔÔl}”{´{q¢²²²Çˆ/àsçÎ…‡‡bª¤¤$$$$((èþýû&&&³gÏž;wîСCIçâ q,`‚(^Àëׯ:tèÆIqW[[:dÈ[[Û9sæ‹Ò¤-°@Q¼€'OžìááannN:À¿ššš’’’®_¿\YYicc3{öl›¾}û’Žö©PÀEånùÂ/^0 ÒYÚñôéÓððð   äädsss[[[[[ÛaÆ‘ÎÕC(`¢r?|øpþüùÙÙÙ¤ƒt¢¢¢âöíÛááá7nÜPVVž5kÖÌ™3'OžÌ}—CêC • øìÙ³çÎ# «8NjjjXXXxxøãÇ-,,lmmgΜ©¡¡A:ZçPÀEå^³f¶¶öúõëIè‰×¯_ߺu+,,ìæÍ›ƒ¶°°øâ‹/¦M›&''G:ZûPÀEåž8qâ¡C‡&OžL:À'ijjJKK‹ŒŒ¼qãFZZš™™™­­­¥¥¥éhÿ X ([À>|PRR*..ùw¾€XyóæÍíÛ·oÞ¼U__okkkmmmii9`ÀÒÑPÀ‚EÙÎÌÌ\¸páÇIà—¼¼¼7nܾ};&&fèСӧO·µµ}:&&毿þ"€ïšššRSS[æQ³X,SSSKKK ‹qãÆIJJ , X ([À«V­9räÚµkI¨·oßÞ½{722222’ÍfO™2ÅÚÚÚÊÊÊÀÀ€ßwÝB e ØÄÄÄËËËÌÌŒtb^¿~Y]]=mÚ4KKK+++mmm~l,PÔ,àÆÆÆþýû—••µ~$€˜+((ˆŠŠŠˆˆˆˆˆ033377·´´ÔÓÓë­M €ŠšœžžîììŒXíÊÏÏ‹‹‹ŠŠŠŒŒlnn¶°°033›4i’„„DŸ,PÔ,àS§NÝ»w3°:•››_VV6eÊKKK333##£îNàB 5 3°z ¬¬,::::::66öùóçãÇ777·°°011éÊ[›PÀEÍÆ ,€OTUUuÿþý»wïFEEeee;vÒ¤I-gªÕÔÔÚ],P,`ÌÀè]µµµ‰‰‰qqq÷ïß¿ÿ¾ººú¤I“&Ož`‡£¦¦öàÁƒAƒ‘Ê-Äî}ÀŠŠŠ‘‘‘ÉÉÉšššššš)))­íû1îùSÔ™KÕ3ÙÙÙýúõCûˆ6IÒ:4lذ   Žmó÷5ã{&::zÚ´i¤SQôXœÝ½{×ÜÜœt à/Š^&‹ì5` øøxMMMR •Ø][999222h_‘‡¦–èèhœ(`jÁ`1kÀí x xðàÁqqqZZZD¶mà°XÈÎΖ––Fûˆ0…DDDX[[“N‚€¦¨¨( Ò)@p ¸D®777«««gddhhhxÓÐ\}jjjh_1¦ŠÈÈHKKKÒ)@@PÀTqûömÌÀ¸ÜÁ_®­­|¸ 7 Â)hQ–™™)))‰ö+(`ò®]»fooO: ˜¼+W®Ì›7t (0ayyyeee'N$ LØÕ«W$$ð…/ø½OØÕ«WI§AÃÛÚ!°·!±Ùlcc㢢"IIIlº oCMçÏŸŸ7oÚ@ ¡€I \¸p!é@ ˜˜ôôôêêêI“&‘ €‰9þü¢E‹èt:é @&aµC“°Þ¿?lذ¨¨¨#FðuCð)0 KÔ\¼xq̘1h_±…&ã÷ß_»v-é@ ˜€ØØØÊÊJ[[[ÒA€0‡^¿~=n? Îp AKNNÎÈȸxñ"é @ÂmÛ¶m;w‘!HB Ô­[· /^L:†œ÷ï߯]»ö×_ÅÍŸ7âhŸÞv½}ûögÏžöú3ŸàF(((pttd0 ÃÑѱ°°t¢¶¢¢¢|}}½½½IJ…®©©±´´d2™l6›Íf3™L++«ºº:Ò¹þóìÙ³… ž?^]]t Q8íå啚šêïïß:²hÑ"“ßjªwO8<~üxÖ¬Y[·nussë­çÁÀ)h^BCC]\\¸G\\\BBBHåá6mÚ´;w¢}€›(LÇÍÊÊ244ä3fÌ£GHå¡Ñh'..îàÁƒ?¾téÒ”)S† …SÐÒÒÒµµµRRR­# ïß¿ïÙvë„ÇJKKKKKëêê*++ÙlvJJÊÝ»wåååÝÜÜV­Z%--ݳ@? –#ü¤¤¤¸G¤¥¥;]q×®]|Ù§ BøT^¢p¬®®Îb±¸'—””÷ì ùø÷t ¾T€¯qøP&añb``™™É=Âb±ôõõIåè”(°ŸŸ÷ˆŸŸŸ½½=©<…óÕÕÕ†††®®®«V­¢ÑhÇŽóõõÍÌÌ”——ïÙâ´qøP¾ ÄáK@8Í‹¢¢bdddrr²¦¦¦¦¦fJJJDDDÛ@ðçU;ðW'qøP¾ ÄáK@üû*ôqwwçÇó »iÓ¦‘Ž îð% |ˆÃ—€ øôUÀŸWˆÂ5`¡ƒ  @ €0(`PÀ €@€  @ ø?ŽŽŽ ƒÁ`8::’N$ʺµ·éXN1”––¶zõêþýûc? @·ö6~&&&ÆÉÉIMM­_¿~¦¦¦ÁÁÁüØ ø_555–––L&“Íf³Ùl&“ieeUWWG:—hêÁÞæü‹*†œ G:ˆXèîÞÆ‚`˜››¿zõ*88¸¸¸ØÇÇÇÝÝýÔ©S½¾|Ò¿¼¼¼RSSýýý[G-Zdbb²víZ‚©DUw÷6>•ìvAêÊÞÆWD`6oÞ|ðàÁÖs ,ËÁÁ!//¯w·‚#à…††º¸¸p¸¸¸„„„Ê#Ú°·€Ê:Ä}†_GG‡%QÀÿÊÊÊ244ä3fÌ£GHåm=ØÛ”’’4hÐÂ… srrø€¢ðƒ@Dxxø¨Q£zýiQÀÿª¬¬TVVæQQQ©¨¨ •G´uwoÛÛÛ_¾|¹ºº:99ÙØØØÜÜ<##ƒÿ1¨?DTTTüøãÞÞÞ½þ̸¢ð/iiéÚÚZ))©Ö‘ÆÆF…÷ïßL%ª>qo?~<$$äÆ| 4®8 Vö6~ ´´ô«¯¾rww·°°èõ'Çð¿”””Ú•——·9JƒÞò‰{ÛÁÁ!66–¹„ ~øíåË—_|ñÅO?ýÄö¥¡€[dffr°X,}}}RyDÛ'îm–ÐðƒÀgEEE¶¶¶žžžVVV|Ú ø_vvv~~~Ü#~~~ööö¤òˆ¶OÜÛ—.]233ãC.a‚þ)++³±±Ù¿¿¥¥%7ÇÃá¼}ûVKKËÃ㢢¢¢¢â—_~ÑÖÖ®©©!K4uº·¹¿3---/_¾\\\ÜÐÐðôéSUUÕÔÔTÁÅ ~?R»{?¤ò{+øûϳgÏæÌ™£¨¨¨¨¨8gΜçÏŸ“N$Êxïmîß;sçÎUQQ‘””ÔÐÐpvvÎÉÉx^1‚¿Ô‰÷ÞÆ)í~]*++{w+˜å@®€  @ €0(`PÀ €@€  @ €0(`PÀ €@€  @ þãää´uëVî‘-[¶Ì›7TFçp8¤3U”——;644tìØ±4-==ÝÆÆ†Åb©««“Ž jp ÿQQQ9v옛›[SSSSS“››Û¯¿þŠöà@[K—.5j‡Ã‰ŽŽ¾~ý:é8¢  m•––ZYY½yó&22RWW—tÑ„€¶Ö®]kaañúõë9r„tÑ„kÀðÿܹs'??îܹ®®®wîÜ!@4áþSYYill|óæMmmmöèÑ#;;»ÔÔT%%%ÒÑD Ž€à?«W¯^¸paKûÒh4}}ý ¬^½šl*‘„#`p @ €0(`PÀ €ø?ù;NRÚòá»IEND®B`‚gsl-2.7.1/doc/images/rand-hypergeometric.png0000644016036000116100000003164313373111455015730 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœíÝ{\Ôu¢ÿñD.£€Šb…®R=ÀäAª5´´ˆ£ÎîZ^&[ѲM<íV»'O…%Ö®­è⥲4'ÃK¶BhvN‚…Jnj ±å¥“‹Á¤Œ  Ìï9¿9³Ã0Ìàwø|gx=ÿÂÏ|/yóùÎw¾£4™L гúˆ@oD  €0PÀ@  €0PÀ@  €0PÀ@  €0PÀ@  €0PÀ@Ã;)•Ênܺñ¸)ÿ¿~ýú…‡‡Oœ8qùòåçÏŸ¿ÁÍv™PÚ§˜ÿ0p èíÜZ0&“Éd2555}ûí·+W®lll;vì|àÒFz²©[ô¥ÉdžRÙéÿm7õNî{@ìnùÔ©SS¦Lùì³Ïbbbnd;./Õº€K˜£—JLLÜ·oŸÍ`IIÉM7Ýtýúu¥RÙÔÔôøã4(00pÚ´ieeeÖK~þùç þþþ#FŒxçw,ãJ¥²¹¹yÉ’%áááÖs©’’’ûî»/00pРAO<ñDSS“õ­mM¡Päçç'&&Úd6‡\´hQhhè AƒþøÇ?šL¦æææÅ‹‡…… 8pÉ’%ׯ_w¼s ˱b÷Â:°^¯ôÑG‡ Ö¯_¿¸¸¸;w:ÿÈßqÇO?ýôêÕ«m6ÛØØøÜsÏEEE 0`Ê”){÷îívBOŸÝ9®e/v÷eYÌñÓÑÖÖ¶bÅŠ#Fôë×ïÖ[o]·nó z#àüß6ß”““3yòd››,XðÊ+¯˜—yä‘GÖ¬YS]]]]]½fÍšððð3gΘ«¨¨4hPNNÎ¥K—þñŒ9òàÁƒ–?öØcæ›,›ýç?ÿ9dÈuëÖÕÔÔÔÔÔdggÏž=Û’ÐÁÖ¾øâ‹ÐÐÐ÷ß¿®®®¶¶ö½÷Þ ùòË/-ûš?þ–-[¾ÿþûÄÄÄU«VÍŸ?óæÍõõõ摵k×:“¹ãCÔñ^XÓëõË—/?{öìÕ«W‹‹‹§OŸîÒ³P^^>jÔ(›ef̘ñôÓOÿðÃ---õõõùùù÷Ýw_÷:~ú즲^·³›º|:-ZôüóÏÿý÷F£ñ³Ï>ûÅ/~±cÇ»`2™(`x§.ÿîlii>|ø7ß|cYå§Ÿ~8p`mm­yõ—_~ÙzƒË—/Ÿ7ožùçyóæ½þúë–›rssxàË~W¯^mföìÙ¯¾úªõÈ+¯¼byYw°µéÓ§¯_¿ÞzÅììì™3gZöeéW“ÉtäÈ‘ÀÀ@ë‘ÇßqÇÎdîøèu¼–ÅæÏŸÿüóÏ›œÐY777÷ïßßf™   ë6u¼Ç ?}Ý.à.ŸŽ^xÁúÖ}ûö?Þî=L0¼U—3`“É”™™™––fíµ×¬_£-&³Ó§O6Ìüó¨Q£¾ûî;ËM Ç·¬xîÜ9›=†‡‡Ÿ={ÖzäÌ™3–¶vË-·TVVZ¯¨×ë###-ûªªª²ÜtéÒ¥Ž#*•Ê™Ì6íÞ ËbÆ ³Þ”= W®\ °Y&!!aáÂ…çÏŸwf;Ž:~úº]À]>6;mhh é¸/ÀŒ†wr¦€/^¼zñâE“Étýúõ[n¹åÿø‡e™ææf뵚ššúöíkþÙÏÏÏfJݧOËŠ---6{ôññé¸5K [ëׯßÕ«W­W¼zõj¿~ý,ûjoo·¹kGœÉÜñ!êx/,‹õíÛ·©©Éä„Ξ…²²²Ñ£GÛ,söìÙéÓ§ûûûß~ûíóçÏÏÍ͵ÜW:~ú:n­­­Í™îòéhkkël] #NÂBï5hР™3g¾ùæ› …"//oèС –[/\¸`½ð… lþY¥R]¸pÁúÉü næëëÛqGÕÕÕÖ#Öÿt°µðððºº:ëëêê†jùgÇó‰:ûãÌu¼ÖwÇæ³¼®ÊÍͽ÷Þ{mG޹gÏžŸþyÇŽwÞy§ùøD÷*>}üù短o=wîœ3±»|:úôá.à¿ zµ¥K—nܸ±µµ5;;{É’%Ö7åääØüsòäÉæŸ'Mš”——çü^’““wíÚe=²}ûvË϶¦V«óóó­G>úè#µZíü®Ù‹¿¿KK‹ó›š:uê»ï¾Û f%%%kÖ¬ùýïo÷VóiÕ‹-Ú¿¿åäjW*>}·Þzë_|a}ëæÍ›-?;Ø—„O Ppx^ÊÁÿm››’““ÿó?ÿ3<<üÚµkÖËÌž=ûoû›ù¼å¿ýíoáááßÿ½ùÖo¾ùfذaï¾ûîO?ýd48àà„&“ÉôÏþ3<<|Æ µµµµµµëׯŸ3gŽeI[;räHHHˆù´Ûººº÷ß?44Ôú8y—÷Ú™½ÄÄÄìÙ³çúõëŽ=Ë å,èsçÎ]½zõ‹/¾èò,èëׯ744>|ø™gžzô袢¢+W®œ>}úOúÓ¢E‹,ë:Ø—«OGgƒ€ÿ9àœ/à>úH¡Pü×ý—Í2F£qÁ‚!!!÷ßii©õ'Ožœ6mZpppÿþý'MštàÀÇû=yòääÉ“û÷ïºhÑ¢ºº:Ë{‡¶f2™öìÙß¿ÿþýûÇÇÇçåå9¸ŽG:ÛËþýû£¢¢|||¿j3xîܹ9sæ <Ø××÷Ž;îØ¹s§Ý{mùCßÏÏoðàÁ&LÈÈȰ9Íʲكj4š°°0ÿÑ£Gÿñüù矻—°Ë§/;;;**Ê××÷æ›o^¾|¹ùÓÒÎìË¥§£³AÀŒk¾ ·knn =}úôðáÃ-ƒî¾Ò§Ÿ~úì³Ïž:uÊ}» s¼Œ^íçŸþóŸÿ¬Õj­ÛצOŸ~èС˗/ÿôÓOÿûß,XðôÓO»udŽ0z/¥Ri>>ùî»ïªT*››¤ýÕøðÃW¯^ýõ×_·µµ3fÉ’%sçΕpû< €‚@ (` €€@ (` €€@ (` €€@ùpee¥F£Q©T*•J£ÑTUUu¶¤Ò??¿žL €KdZÀF£1))I­Vëõz½^¯V«“““›ššì.lê ++ë׿þugÀy2ý>ବ¬'NlÛ¶Í22wîÜ„„„ôôô.×mooŠŠÚ±cG||¼;3Ð}2çççkµZë­V›——ç̺{÷î §}r&Ó.++‹‹‹³‰-//wfÝ5kÖ,]ºÔ=¹†LAûùù]¹rÅ×××2ÒÚÚtíÚ5Ç+~ýõ×>øàÙ³gûöíëæŒÜ€Žg0ɯ¯oKK‹õHKK‹ŸŸ_—+.X°àÕW_ur//½ô’ÝÇÄßß¿‡Ÿ€lu§Æœ Ópxxxiiixx¸e¤¦¦fìØ±ÕÕÕÖúé§Ÿn»í¶ï¿ÿ>44ôFö®TÊôaô0÷5‚Lßމ‰)))±)--ŽŽv¼Ö›o¾ù«_ýêÛ€ ÓNIIÑétÖ#:.55ÕÁ*­­­7näô+€Gi/\¸°¸¸xåÊ•ƒÁ`0dff=z4--Ͳ€R©´Ye÷îÝÑÑÑ]Î’™ppppaaá±cÇ"#####?^PPè`•µk×2ýx Î6²ƒ“°f½î$,¼ €0PÀ@ðT_}õÕ“O>9pàÀŽŸKtž²I²Íš5kðàÁ HLLÌÍÍuÇF*++5J¥R©T¦ªªJŠìŽ˜?:räH??¿ˆˆˆÉ“'øá‡îÞ©·¢€xªyóæ 2äÈ‘#7¸›+ôJ’mâĉ/^ÌÍÍ­®®ÎÎÎÎÈÈxûí·¥ÝˆÑhLJJR«Õz½^¯×«Õêää䦦&g¶Üí¿3ÒÓÓÇŽûÉ'ŸÆo¾ùæ¹çž[±bEg×Õ‡c|ÞÆ>†x–ùuÓïû³Ï>û—¿üÅÒs¥¥¥3gÎ<}ú´„ÉÊÊ:qâĶmÛ,ËÏ;7!!!==½Ë-Kx¯Ïœ93nÜ8ƒÁ ÉÖdˆ!èu”Je[[ÛŠ+FŒѯ_¿[o½uݺu¢CýÇñV­Ze=Ë=zt7Ž;ÞH~~¾V«µ^^«Õæåå9“\auìÝÕT6|}}}||np#½ @¾ž|òÉæææ444lÚ´)++kçÎ’ïeèС¾¾¾Ã† ›3gNEE…;âíß¿̘17˜Óf#eeeqqqÖ ÄÆÆ–——w¹ó|îÆ¹_ºtÉü.õâÅ‹»½‘^ÍM_sèÑxX9P(/¼ð‚õȾ}ûÆowI»ƒÎ¼ô¥¦¦577WUUeee 2ääÉ“ÒÆ«¯¯¿í¶ÛŠŠŠºÏÁFºý½é¦{Äl–œ2eÊõë×Ù©‡r_#Ð4vPÀ€(Š3gÎX444„„„Ø]RªnذáþûïwfI'ãÕÔÔÜsÏ=………7’ÊîF$/`WÕÖÖæääDDD,_¾¼Ë…Åž¨õÒK/uûnº¯8ÛÈNÂäÀü&kŸ>}l;þzJø;[[[;jÔ(£Ñ(I¼üñÁüë_ÿšœœÜíHm$<<¼´´4<<Ü2RSS3vìØêêjgÂKõˆ¨®®nii9{ölffæ AƒNœ8áÌ–';vìöíÛ»—ÊÂñF._¾©(((˜1cFXXXß¾}‡>oÞ¼ŠŠ Ë­õõõ¡¡¡Ý‹g7›Á`p)^—9wîÜôéÓƒƒƒƒƒƒ§OŸþÃ?8~ÿþýQQQæÏﺩ°°pæÌ™æGlذaæèÑ£.mÁ㸯8ÛÈN P(²³³¿ûî»ììlÑAºÃ£ÃË 'a@OÛ¼yóoû[Ñ)ºÉ£Ã÷Lõì` 0c €W¡€€@ (` €€@ (` €€@ (` €€@ (` €@¾\YY©ÑhT*•J¥Òh4UUUnooÏÎÎŽ‰‰ñ÷÷3fÌÎ;{,'Ý Ó6IIIjµZ¯×ëõzµZœœÜÔÔÔÙòO>ùdiiéG}tùòå­[·nݺµ'Óà*¥ÉdÁެ¬¬'NlÛ¶Í22wîÜ„„„ôôôŽ þøc둽{÷ÆÇÇ»17F¦xmllŒ‹‹KKK[¼x±B¡Ø°aÖ-[JJJÍ X0ëêÕ«ÉÉÉ?þø< P(öîÝûÌ3Ï|ðÁ“&MêÞÞù0À¬×}888¸°°ðرc‘‘‘‘‘‘Ç/((°´¯ ÿÝ»wÿÏÿüÏ­·ÞzÓM7½õÖ[;wîìvûИêÙÁ `ÖëfÀx7 (` €€@ (` €€@ (` €€@ (` €€@ (` €€@ (` €€@ (` €€@ (` €€@ (` €€@ ä[À•••F¥R©T*FSUUå`ae=–€niƤ¤$µZ­×ëõz½Z­NNNnjjr°Šé_õXTºA)Ï®ÊÊÊ:qâĶmÛ,#sçÎMHHHOO·»¼R)å‘vkÏå¾Fé 8??_«ÕZhµÚ¼¼>~âĉ§NrLºI¦ovúùù]¹rÅ×××2ÒÚÚtíÚ5gV߸qc^^Þ'Ÿ|âx±ŒŒŒåË—Û½Iž  ‡¹ï=`™pxxxiiixx¸e¤¦¦fìØ±ÕÕÕά^[[;jÔ(£Ñؽ½sÀ¬×„SRRb=RZZíäê7ò`ýðà {,ÂÇǧ½½½Û÷ [2-à””Ng=¢ÓéRSS\}×®]wß}w÷v=bÄE‡O‹àøÓÏ%Ó^¸paqqñÊ•+ ƒÁ`ÈÌÌü©¸¯xY—µ>}úøûû755‰,wœ ^‰–;ÎïDË ^‰–;N„¯DË3`ðJ°Üqx% XW¢€åޝDË'a€W¢€å.((èÊ•+¢S$Fˇ À+QÀrG€W¢€åŽ÷€À+QÀrÇ ¼,w\ˆ¼,wÌ€À+QÀrG€W¢€åޝDËgA€WRšL&ÑdG©”ÑÃÒÞÞîëëÛÞÞ.:ˆB©TÊ!ô$÷5‚|gÀ•••F¥R©T*FSUUåÌZ555QQQJ¥ÒÝñzLŸ>}ÚÚÚL2@€„dZÀF£1))I­Vëõz½^¯V«“““›šš¯e2™}ôÑ—_~¹gBö6>>>mmm¢S€—ѱVkYYY'NœØ¶m›edîܹ éééÖZ½zõ©S§t:Ý 1Õ!hùèß¿¿Á`ð÷÷zN¯;ŸŸ¯Õj­G´Zm^^žƒUN:µiÓ¦õë×»9ZïÅ $$Ó.++‹‹‹³‰-//ïlùææf­V»eË–àà`÷§ë¥(`L Ø`0„††Z„……544t¶üïÿû_ÿú׉‰‰îÖ{õíÛ—©È´€]’——WVVöüóÏ»ºbFF†Òw„ôÌ€@B2-à›ùn}}½ÍœØâøÃ{ï½çãããê^222ì~Þ¦›¡½ ’iÇÄÄ”””X”––FGGÛ]øÌ™3#FŒ°™Â2—• ’i§¤¤èt:ëN—ššjwa»SXæ²’£€@B2-à… ¯\¹Ò`0 †ÌÌÌ£G¦¥¥Y`vÛó|||®_¿.:x ™ppppaaá±cÇ"#####?^PP(:W¯Æ $ÔWt€N1bÏž=Ýêøð2ŸÝ Ét ¢€@B0œE€„(`8‹ QÀp—¢ uqVCCÃöíÛ ¿ú꫺º:…B1dȵZ””ôÈ#tvi*x%fÀ ¡NgÀçÏŸ_¸paDDDNNν÷Þ»oß¾êêêêêê}ûöMœ8ñý÷߈ˆHKK;þ|OÆ…@0H¨ÓpTTÔÈ‘#sss§Nj=žž¾ÿþ?üáQQQÍÍÍîÏ ñ(`P§3àY³f?~ܦ}­M›6íøñã³fÍrO0È êtüî»ïv¹r@@€3‹Á;p)JP×gA¿ñÆvdz²²¤Yc 꺀322ŠŠŠlwïÞ½fÍ÷D‚LQÀ ¡® øïÿ»V«Õëõ–‘Ç/]ºtÿþýî Ù¡€@B]ð]wݵnÝ:FsåÊ…BQQQñðÃïÞ½;::Úýñ #0HÈ©oCJII©¯¯ì±ÇÖ®]ûÐC½ñÆwÞy§»“An(`³_Gøè£ÖÕÕÅÆÆ®Zµ*%%Å­™ O0HÈ…ï~öÙgŸ~úé¾}åûÂp+® ê´M•Je—+ó½÷½ 3`P§L¹Â âëá, $Ôi?öØcMMMŽWnjjzì±Ç¤Ž™¢€@BðŽ;âãã8ÐÙŸ~úi||üŽ;Ü ²Ãµ @Bðwß}7~üø|pâĉ7n¬¨¨hlllllüöÛo7lØ0a„‡z(11ñ»ï¾ëɸˆ0HHéød«‹/æääÈ 꺀ƒ‚‚Ì?¼ð ÖãÛ·o·üÌu£z® 꺀)W˜1 q%,8‹ QÀp ¢€á, $DÃY0HH¾\YY©ÑhT*•J¥Òh4UUU-yôèÑ´´´‘#GúùùEDDLž<ùÃ?ìɨ½ ’iƤ¤$µZ­×ëõz½Z­NNNnjj²»pzzúرc?ùä£ÑøÍ7ß<÷Üs+V¬x饗z8³×ãË@BJy~Ê(++ëĉÛ¶m³ŒÌ;7!!!==Ý™ÕÏœ93nÜ8ƒÁн½+•2}XÄÚ¾}ûÞ½{ßÿ}ÑA ç¸¯d:ÎÏÏ×jµÖ#Z­6//ÏÉÕ}}}}||Ü«Wã4HH¦\VVg=[^^Þ劗.]***š5kÖâŋݖ®—¢€@B]_ KƒÁj=ÖÐÐà`¥RiùyÊ”)nÊÖkQÀ !™Î€»Ád2™L¦ÚÚÚœœœ²²²ÌÌÌ.WÉÈÈPÚÓi=ׂ É´€CBBlæ»õõõ6sb»† òÈ#lÛ¶Í™/kÊÈÈ0ÙÓýÜ^0HH¦SRRb=RZZíäêãÆ«««sC®^ É´€SRRt:õˆN§KMMurõâââÛo¿Ý ¹z5 $$Ó^¸paqqñÊ•+ ƒÁ`ÈÌÌ4_îʲ€õ;µ÷ß^^^]]]kkë?þ¸eË– ¼úê«"‚{3 $$Ó.,,ÙÁ•°ì*..~î¹ç>,:ôœ^w%,È3` gQÀ ! ΢€@B0œE€„(`8‹KQ€„(`8‹0Hˆ†³(` gQÀ ! ΢€@B0œE€„(`8‹ QÀpVß¾})`  g1 QÀp ¢€á, $DÃY0Hˆ†³¸4Hˆ†³˜€„(`8ËÇǧ½½]t ð0\ T*é` p¤BÃ\ ¤BÃÌ€@*0\@€T(`¸€©PÀp R¡€á.†R¡€áfÀ  . €@*0\@€T(`¸€©PÀp R¡€á ¤BÃ\ ¤BÃÌ€@*0\@€T(`¸€©È·€+++5J¥R©T¦ªªª³%‹ŠŠfÍš5xðà$&&æææödÎ^…©È´€FcRR’Z­Öëõz½^­V'''755Ù]xâĉ/^ÌÍÍ­®®ÎÎÎÎÈÈxûí·{8p/Áµ @*2-àM›6%&&.[¶,$$$$$dÙ²e Õê3ÏòÈ#6'RýüóÏ=œ¹7 €@*2ý’B¡1bÄž={:»ÕúT)N›ê1\Ф"Ó0ä‰0H…† (`  PÀ  . €@*0\@€T(`¸€©PÀpׂ©PÀp3`  PÀ  . €@*0\@€T(`¸€©PÀp_ÆR¡€áfÀ  . €@*0\@€T(`¸€©PÀp R¡€á® R¡€áfÀ  . €@*0\@€T(`¸€©PÀp—¢©PÀp3`  PÀ  . €@*0\@€T(`¸€©PÀp R¡€á® R¡€áfÀ  . €@*0\@€T(`¸€©PÀpׂ©PÀp3`  PÀ ùpee¥F£Q©T*•J£ÑTUU9Xø«¯¾zòÉ'¨T*{,a/D€TdZÀF£1))I­Vëõz½^¯V«“““›šš:[~Þ¼yC† 9räHO†ì…(`ŠÒd2‰Î`GVVÖ‰'¶mÛf™;wnBBBzzºã•J î‘$ñJgÏž2eÊ™3gD€â¾Fé 8??_«ÕZhµÚ¼¼\XXxìØ±ÈÈÈÈÈÈãÇXÚ·#ëó§8—Ê}˜€T˜êÙÁ ¸3mmmýúõãm`½‡û¡¯;6 oåããÓÞÞ.‡£ }úôimmíÓG¦‡p K0\ÓÞÞ.:‚B¡P555‰ÝÄ)88Øh4ŠNÝGÃ#QÀ< Dðt0< ÀÓQÀðHAAA¢S@÷QÀðHÌ€x: ‰³ x: ‰0OGÃ#QÀ< Hðh0<ïðt0<‡ x: ‰àé(`x$.ÄÀÓQÀðHÌ€x: ‰“°x: ‰0OGÃ#QÀ< ÄIX<Òd2‰Î ;J%‹Üµ··ûùùµ´´ôéÑÜÈ}À‹}üýý›ššD€n¢€á©8€G£€á©8 €G£€á©(`†§âDh†§b À£QÀðTœ„À£QÀðTÌ€x4 žŠàÑ(`x*NÂàÑ(`xª   +W®ˆNÝDÃSq€G£€á©(`†§â=`†§b À£QÀðT\ˆ€G󒮬¬Ôh4*•J¥Ri4šªª*щàvÌ€x4o(`£Ñ˜””¤V«õz½^¯W«ÕÉÉÉ|U»×£€x4o(àM›6%&&.[¶,$$$$$dÙ²e o¿ý¶è\p/ €Gó†ÎÏÏ×jµÖ#Z­6//OTô ΂àѼ¡€ËÊÊâââ¬GbccËËËEåAÏ ljjRÊ@FF†è€çQšL&Ñn”ŸŸß•+W|}}-#­­­AAA×®]ëÞ•JoxX7Î}Ð×õË—/·{“R©ìá0€^Ŧzááᥥ¥ááá–‘ššš±cÇVWWwoƒ’ü½#ÕM„é=a¤Úa<"ŒTÛ!ŒG„±ËÞމ‰)))±)--ŽŽ•€.yC§¤¤èt:ëN—šš**]ò†^¸paqqñÊ•+ ƒÁ`ÈÌÌ|øÊ•+_~ùe\\ܦM›D…‰_·n]EEŵk×êëëÿû¿ÿûŽ;îxñÅEå1koo¿ï¾ûrrrÄ>YÂÿ«X{üñÇÓÒÒNŸ>}íÚµãÇO›6Mt¢ÿ“••5{ölQ{ê©§ÆÿùçŸ_¾|ùÒ¥KŸ}öÙ¸qãžzê)!a8ºyóæººººººwÞyçÎ;ï¼zõjpðB'·×dk2úMó«W¯ž3gŽõÈœ9sÖ®]+*…ðWÕgžy¦½½ÝòÏ’’’Q£F ÌcãôéÓ›á¯ýë¼yóL¢Ÿ,áÿU, SRRD§°¯­­í¿øÅ—_~)*@ppð¹sç¬GÎ;,$Ì=÷ܳeËë‘wÞygýúõ=Ÿ¤ãÿ^Ù¾&›L&AK,??_«ÕZhµÚ¼¼ÝúÿðôéÓ­ßåéI&Lغu«õÈæÍ›…¼îuüÝ‘ík²‰÷€%'Û'[>\SSsÏ=÷Šò¿jkksrr"""–/_.$@nnî„ ¬ë_>O–ÉdÚ°aÃý÷ß/d×¾¾¾ßY¼÷Þ{…„±¶`Á‚W_}Ul†?ÿùÏ·ÜrËž={ÌçíÙ³ç–[nyýõ×…„)((4hÐÖ­[/^¼xñâÅ-[¶„……ùûû÷| ¸W2dHMMõHuuõСCEå±Ékúùóçãââ8 :ˆ­Â›o¾YÈ®GõÃ?XÈäÉ2«©© ²ë¡C‡^¼xÑz¤®®. @H‹‹/†††Ö×׋1bĈƒZûì³I“&öïßÿî»ïÞ¹s§0wdûšlâ$,ÉÅÄÄ”””X”––FGG‹Ê#+.\˜6mÚêÕ«“““Eg±5nܸºº:!»>sæÌˆ#l>w+ü¸¦=Vß“bbbDíÚ7ß|óW¿úUhh¨Ø?þøã¸qã¬GÆ÷ã?ŠÊ3qâÄÂÂB£ÑØÔÔtøðáÜyç¢ÂX“ók2,±””Ng=¢ÓéRSSE呺ºº©S§¾öÚkIII¢³ØQ\\|ûí· ÙuÇ¿‹-ƒBòØØµk×Ýwß-d×3fÌøøã­GöîÝ+ðÄc…BÑÚÚºqãF±§_™ÝrË-'Nœ°ùòË/o¾ùfQyllذaáÂ…¢S(2MîÑùv/pùòå‘#GfffZ>ô=jÔ(£Ñ(:—ø£šcǎݾ}»Ø ÷Ýw_nnnmmmKKËùóç7oÞ<|øð?þXt®ÿ%ðÉJJJúàƒª««[ZZΞ=›™™9hР'N ÓÜÜ|×]wÙ¼³(ö윜œ)S¦ `‘ùÑG ó{À7ÝtÓºuëDåyðÁ¿úê«–––3gÎ,Z´è‰'ž£ãïŽl_“M¼ìçΛ>}zpppppðôéÓmÞÞëaòù«ËnƒÁ $LaaáÌ™3ÃÂÂúöí;lØ0FsôèQ!IìXÀ3fÌ0?2ÇŸ7o^EE…¨0&“éÂ… sæÌ éׯßwÞ)üìñãÇïÝ»Wl‹]»v%&&8pàÀãÇß¹s§À0;v숎Žöóó»ýöÛ׬YÓÖÖÖ“{wüB'«×dkJ“<sЫð0PÀ@  €0PÀ@  €0PÀ@  €0PÀ@  €0€¡T*EGz (` €8R\\ýôÓiÓ¦?þ?þã?DǼ ‡ €CÐ@  €0PÀ@ ÀÿŽN­[æÛCšIEND®B`‚gsl-2.7.1/doc/images/rand-landau.png0000644016036000116100000004135613373111455014150 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœíÝg\gâöñs4 €RDEQA…H±€½@¬X‰%Q\Ýh,I4šØb6Q£±DÝËêFb‰«Ä¶&ˆcA¢€ˆ¨4… ó¼àÿ°,""ž™û”ß÷E>q8Ì}z13÷™QªT*W ÑÐG0PÀ@  €0PÀ@  €0PÀ@  €0PÀ@  €0PÀ@  €0P}J¥RKRþµjÕ²²²êѣǢE‹îÝ»'Ñ ¥«Rï‘íñ¤@zJ¥R©TªÜÜܘ˜˜¯¿þ:''ÇÝÝ}ÿþý¯´9+º…ŽQªT*Ñm¥TÊôRû@®ðúõëo½õÖéÓ§% ö:wD¶G[À€Tîß¿ÿá‡Ö­[×ÎÎnΜ9ýõWÉr¥RYTT´dÉ’æÍ›×ªU«eË–7n,û‹7nÜèß¿¿‰‰Iýúõ§Nš››[ÅÕ>Ÿá•¶ÝÜÜfΜ¹fÍšr¿›““3gÎGGGccc33³·ÞzëÈ‘#¥7(Ý›]ú[yyy}ô‘••U…{žsss'Ož\¿~}“þýûGEEUž¶t” Ç*½Ùáǽ¼¼LLLLLL¼¼¼Ž=Zv •?à€0 •.]º´k×.%%åÔ©SIII‹-*ýÑ´iÓòòò‚‚‚233üñÇo¿ývïÞ½%?JHHðññéׯ_BBÂ7Z¶l9qâÄ*®öõ 6ìÌ™3åþío+,, ÊÎÎNLLœ1cƆ  EÉö¨êÿ+½ý|йs縸¸ 7X'NœØ¦M›7n$$$ôë×ÏÛÛûöíÛ/ ö¢±J\¼xqüøñÓ§O¿sçNbbâ‡~èïïåÊ•ÒTò€¨TWÕßA™™™-Z´(ý­üãezôèQOOÏ’ÿ;vìâÅ‹Ëþô‹/¾xÑ@åV[õ„/Zž——gddTî6uêÔÉÎήâz Åš5k^t3…BQîÞ-Z´Èßß¿*w¡Â±JþgèС›6m*û£ 6 >¼ôf•<à€(0P}•p^^Þ¢E‹ZµjeddTòÇnÍš5K+!!¡ì333-,,JþßÊʪÜOãããKª|µUOø¢åOŸ>566.w›Ž;Nš4éÞ½{UYB¡HLL|ÑÍž¿ïñññ7®Ê]¨¤€mllîÞ½[öGIII¶¶¶/´ìˆÂ.h@óæÍ»páÂÏ?ÿœ‘‘¡R©òòòŠŠŠJÚ¼yó²7¶°°ÈÊÊ*ùÿ‡Z[[—ýiÙV¾ÚrŠ‹‹_5ö;wÊ®P(öìÙ“‘‘áààкuë &ª* Õ¤I“J~úü½ËÈÈxÑ«xÒÒÒ6lXv‰••Ujjjé?+yÀQÞÐMû÷ï¿téRÓ¦MKþYî0g/üÛ·~ýú>>%ÿ_ù]¨d,Ç—]ò믿zxx¼R0@f0 ‰þýûüñÇ©©©ééé«V­ºsçNñË/¿Ü¸qㆠÒÒÒÒÒÒÖ¯_ëÖ­ª¬væÌ™Ó§O?wî\nnnBBÂüùó>|øÒáŠŠŠ²²²BBBfÏžýÖ[omÙ²¥uëÖånÓ½{÷Ÿ~úéÞ½{………©©©kÖ¬éÞ½{Éìíí;VÉnðçÅÄĔ޻ 6lÚ´©d–ÙKïB%cÍž=ûóÏ?ÈÈÈÈÈÈøâ‹/æÍ›WõT€‚AÚ¬’÷Ô£GÆŒS¯^=ssó &äää(^<™¨ÜÂððð>}ú׫WoÒ¤IOŸ>­ÊjU*Õ†  š5k¶hѢ½ÇKÓ6hР[·n .,7ͪôwO:åççgiiY»vm‡¹sçþùçŸ%?:~ü¸££cÍš5«xï Å“'OÞ{ï= ccã¾}ûFDD”½e%w¡ò±<Ø¡C#####£:”¨®âÁ™e€]Ð@  €0PÀ@  €0PÀ@  €0PÀ@  €0hnß½{×ÏÏÏÔÔÔÔÔÔÏÏ/99ùE·<{öì¨Q£4h`ffæååuèÐ!9sP ZÀOž<éÝ»·‡‡GRRRRR’‡‡‡··wnnn…7îÑ£GFFÆ¡C‡RRR6lذpá­[·Ê€W¢T©T¢3TàÛo¿½zõêO?ýTºdìØ±;vœ>}úó7ž={öÊ•+•JeÉ?#""†/SV^†n>|xܸqe—Œ7.00°ÂóÍ7¥í«P(*Ù_ €&ÐÐŽŠŠruu-»¤mÛ¶ÑÑÑUùÝãÇ»¸¸H“ õÐÐ]І††OŸ>500(]òìÙ³:uêäççWþ‹™™™;wþñÇ»uë&qF^ƒJ#”]RPP`hhXùo¥¦¦vïÞ=88¸Š£|ùå—>&µk×–ùYh¬j6ÙËhè°••UDD„••Ué’ÔÔTww÷”””ýÊýû÷¸zõjooï×]©ÔЇ 3éAC;;;‡‡‡—]ѦM›ÝþÁƒýû÷_³fÍë·/2ÐÐöõõݵkWÙ%»ví"e¿\*++ËÜܼzCSÀ€úXÀQÀ€z7 ÝF  €0PÀ@  €0PÀ@  €0PÀ@  €0PÀ@  €0PÀ@  €0PÀ@  €oˆŸŸèС„„„{÷î%''7iÒ¤ÿþ>>>&&&¢£ÐlC¿¨Tª={ö´nÝzÇŽ999...“'OnÙ²åÆ7nýôSh馩¬“®_¿Þ¯_¿•+Wúûû+•ÊÝ,))iêÔ©÷ïß/ÙP–3! $]#° z!::zÀ€[¶l7n\%í«P(lmm;öÑGy{{_»vM¶„ô ›z` XÇ$$$ôìÙsùòåcÆŒ©úo9rd„ {÷îíÝ»·tÙh8vAËŠÖ%ÙÙÙŸ}öÙ{ï½÷ª¿4f̘]»võíÛWŠl4,+ X—Lž<¹F[¶l©Þ¯_¸paذaÇŽk×®zƒÐ °¬(`qúôiÿÈÈHssój¯äèÑ£S¦Lùã?š6mªÆl´“°€W–››;iÒ¤M›6½Nû*Š~øá‡ƒ~úô©º²›z` X7Ìš5ëáÇ»víRËÚ&OžüðáÃýû÷רÁŸ­€a´¬(`påÊ•!C†DFFZZZªe…ÞÞÞƒ š3gŽZV@+PÀ²¢€u@¿~ýÞ~ûí‰'ªqwïÞíСÃo¿ýæêêªÆÕÐd^AXXXttô¸qãÔ»Z›Õ«W¿ûî»yyyê]3=Ħ^ØÖvÆ óööþðÃ¥XùèÑ£›4i²zõj)V@Ó° ZV°V‹ŽŽöññIHH022’býþù§››ÛöíÛ9C Ø TÕ’%KfΜ)Qû* ssóï¿ÿ~âĉìˆð:ØÔ«[ÀÚ+!!¡sçÎñññuëÖ•t wÞyÇÁÁ᫯¾’t± ZV°özï½÷lmm¿øâ ©JMMuuu=s挓““Ôcˆ–¬¥=zäààpûöm †[¿~ý¯¿þ$ÃXDá0ðr”§} Å|™™ùóÏ?Ë3CCwìܹóoû›lÃÕ¬YsóæÍ³gÏ~üø±lƒÐ0tDDDDFF†···œƒzyyõéÓç믿–sPºƒà°6š5kV:u/^,ó¸iii.../^´··—yh2`–¬(`­SXXhccsöìYùG_´hQll,ƒÄ$, 2GŽqttÒ¾ …bΜ9.\ 2:-ECüóŸÿ?~¼¨ÑŒŒ/^üé§Ÿ²ã@ÕQÀÐzééégÏž}ûí·fð÷÷/((Ø¿¿À ´  ­·ÿ~___©Ï=Y¹5j¬ZµêóÏ?/,,€¡€¡õ:4|øpÑ)½zõjÞ¼ù?ÿùOÑAh¦ûV€YÐZ$;;ÛÖÖöþýû&&&¢³(BCC‡ vëÖ-é®Å@fÌ‚*vìØ±îÝ»kBû*ŠöíÛ·oßþûï¿€ €¡Ý~ýõ×!C†ˆNñ_K–,Y¾|yNNŽè 4ûZ+À.hmñìÙ³FEEE5jÔHt–ÿò÷÷oÕªÕçŸ.:5`4P3gδjÕJ£ÚW¡P,\¸pýúõYYY¢ƒÐh0´Ø¡C‡4jÿs {{ûAƒ­]»Vt}­`´¶°³³;~ü¸“““è å%%%µoßþÖ­[²]œ€DØ ”wíÚµ7ÞxCÛW¡PØÚÚ4hýúõ¢ƒÐ\lêU€-`­°páÂÜÜÜ•+WŠR±„„OOÏøøxsssÑYT[À@yGŽ4hè/dooïëëËF0€aS¯lk¾GÙÛÛgddˆÎòB ^^^qqqlÚ‹-`àwíÚU“ÛW¡PØÛÛ÷ïßÓ¦M¢ƒÐD0´ÒÉ“'}||D§x¹/¾øbýúõOž<€Æ¡€¡•‚‚‚¼½½E§x9‡ž={þðâƒÐ8ì¬Ç€5\RRRÇŽSSS•J¥è,/Þ¿ÿ„„.‘h#Žÿäãã£í«P(\]]Û·oÏu‚”CCûœ>> FFF¢³:ŽcÀÐ ………´ïKµiÓÆÓÓsÛ¶m¢ƒ¨> $""âÍ7ßB;|ñÅ+W®,((@5QÀÐ ‘‘‘p¹»»;;;ïÚµKtÕDCƒÜ¸qÃÅÅEt ­±`Á‚åË—Š :(`hˆˆˆ¶mÛŠN¡5ºvíÚ¬Y³ŸþYtÕÁtß 0 Zˆââb33³û÷šŠÎ¢5‚ƒƒ§L™ÃÕ‰0 ºïöíÛ 4 }_IïÞ½­¬¬~ùåÑA¼2 š‚XÕ³`Á‚Å‹‹àÕPÀÐpõôëׯN:‡À«¡€¡)nܸáìì,:…VúüóÏ—,YÂÄ@»PÀÐlW›¯¯¯R© À+`ºo˜-¿¼¼¼úõëÿù矢³h¥#GŽÌŸ??<<¼F þªÔ‰YÐÐqÑÑÑŽŽŽ´oµùúúÖ©S‡éЀ¡€¡Øÿüú-Zôü£¨¨HtUBC#PÀ¯¯OŸ>7Þ³gè ª„†F €ÕbÉ’% .äìЀV €¡¢¢¢¸ ÃëëÚµ« —H´Ó}+À,h™=zôÈÁÁ!++Kt]2vìØ›7oŠÎèfAC—qB5êÒ¥‹““Ó¶mÛDð0ÄãXêµdÉ’%K–äå剠20Ä‹ŠŠ¢€Õ¨]»v;vüî»ïDP â± Zí¾úê«+Väääˆà…(`ˆM«—‹‹K¯^½6mÚ$:€bºo˜-§””77·´´4ÑAtÍÍ›7»uëgff&:  Å„Í‚ÎÌÌÜ´i“ŸŸŸ‰‰‰‰‰‰ŸŸß¦M›233¥}Ãþg‰´jÕjðàÁß|óè *ö¾wïÞ¤I“¬­­zöìyôèÑ””””””£GöèÑc÷îÝÖÖÖ'N¼wïžœq¡{(`é,Z´è‡~HMM@^¸emdddgg·fÍš~ýúUxƒãÇòÉ'‰‰‰º÷mvAËiâĉ;v|ÿý÷EÑMŸ|òIAAÁ† D´•€]УF }Qû*Šþýû‡††Ž5JŠXÐ| XRóçÏß³gOBB‚è ÊcS¯lËF¥R™››'%%™››‹Î¢³/^÷¯ýKt@+q*J覤¤$SSSÚWR³fÍ ŠˆˆÀÿxy1"==½Ü¬¬¬wÞyGšHÐ#\IuêÔY°`ÁüùóEð?^^ÀvvvmÛ¶ýé§ŸJ—üþûïíÚµ³··—2ôS å1yò丸¸   ÑAü×Ë xåÊ•ÇÿöÛo}}}ãââ¦OŸ¾dÉ’£G.Y²DÒdwïÞõóó355555õóóKNN®äÆ×®]›6mš¹¹¹R©”4Ô‹³@ËÃÀÀ`éÒ¥³gÏ...Àÿ©Ò1`ww÷Ë—/÷ìÙ³wïÞo¾ùæéÓ§[·n-i¬'OžôîÝÛÃÃ#)))))ÉÃÃÃÛÛ;77÷E·÷÷÷oذaHHˆ¤© vlËfĈÆÆÆ{öìÀÿy£ê7U*•fffõë×—a+óÇôòòZ°`AÉ?,X³uëÖéÓ§Wxû¨¨(©#A튊Šnݺ%õs(µjÕª1cÆøùùÕªUKtUÛ óôôŒŠŠ:yòä©S§(õ× >5t çÀ’Ÿ“““ŸŸßâÅ‹EP…Þ»w¯¥¥e¹…?ÿü³4‘ä³páBeEDçÒÑÑѰü-Z´{÷nIÿ€Pz&, ‹rÛ»=*·Müú.\¨ªˆzGÁ‹DGG·iÓFt ½Ó AƒO?ýtîܹ¢ƒúî…š9sfddäÉ“'EôÚ xÏž=:t¨äÔ9¿ÿþ{‡$úZ¡¯¯ï®]»Ê.Ùµk×àÁƒ¥ B$$$X[[‹¢ —.]úé§Ÿr^@ ð­[·<==Ø£G-[¶ÄÆÆæäääääÄÄÄlÞ¼¹[·nƒ òòò’èHÒ¤I“.\¸ðõ×_geeeee-]ºôâÅ‹'N,½GjµûŸÅ9r¤‘‘—HzÉU–222N:–‘‘¡P(6lXr^ªÑ£G??9Kîܹ3sæÌ’½dÞÞÞk×®µµµýoîÿ½>T…}\í£¹\ŽP_ýuNNβeËDÑ_×®]óõõ‰‰133Ð\Ò5MS XcÇŽíÓ§O¹Ó­@fï½÷^ýúõW¬X!: ¹¸0t » 5Á²eËvìØqóæMÑA}T¥Ž7nœµµµµµõ¸qãnß¾-u2è°âââ[·n999‰¢ï6l8oÞ¼>úHt@½¼€###»víêèèxîܹÇŸ;wÎÁÁ¡sçÎ\ÿÕ–˜˜Ø Aƒ:uêˆÅôéÓSRRŽ=*: w^¾k»_¿~,÷7òºuëþóŸÿ?~\ÊlÂp XjGŽÙ¼yó±cÇDB¡Pœ8qâ£>ŠŒŒä*IÀóD>wîÜÈ‘#Ë-5jÔÙ³g¥}Àe4Jß¾}W­Z%: _^^À/ú£ØÈÈHÝa /bbb¸ °FY·nÝÚµkEôÈË xøðáûöí+·pÄ\½ IDATïÞ½~~~ÒD‚îc ´¦±±±™1cÆ'Ÿ|": G^¾kûéÓ§ï¿ÿ~ëÖ­ß}÷]kkëìÞ½;&&fëÖ­ºzAŽKJ¥R™™™%''sþRPPжmÛ5kÖ 0@t@ƒˆ<GUNú¨cuEK*))©k×®ÉÉÉ¢ƒ ¼ß~ûíƒ>ˆŒŒ¬]»¶è,€¦9 «Â öqý>T€5VŸ>}Ú¶m»|ùrÑA½À™° 7¦@k²7nÙ²…où2 €!7¶€5YãÆ.\øÞ{ïq¥B@j0äÆh 7yòdƒ~øAt@Ç1Û¨LÂ’”……EBBB½zõDÁ ݼy³[·n×®]kÚ´©è,€`\ :âþýûµkצ}5\«V­¦M›ÆEIQÀûŸµÅgŸ}wàÀÑAECV°¶044ܶmÛôéÓ³²²Dgt YÅÄÄPÀÚÂÓÓsøðáŸ~ú©è €n¢€!+¶€µËòåËOŸ>ýûï¿‹è ²ŠŽŽæKÀZÄÄÄdãÆS¦LÉÍÍÐ50ä“––¦T*6l(:^Aÿþý»téòÙgŸ‰è òá$”ZjÆ JNNÐn0dÂhÑ®]»>ø`Ò¤I©^ ™°¬K>ûì³ìììõë׋h1fU€IXRhÒ¤ÉÅ‹›5k&:ÔãöíÛ^^^¿ýö››››è,€„˜„íöçŸ>yò¤iÓ¦¢ƒ@mZ´h±zõê1cÆp z(`È¡äÀJ¥Rt¨“¿¿¿»»; ª‡†˜¥«6oÞ|âĉÀÀ@ÑAíCC| XW™ššîÞ½{òäÉwïÞÐ20ä@ë0//¯Ù³g1¢  @t@›PÀ¬ÛfÍšemm½`ÁÑAmBCrÙÙÙ?æ H:L©Tnß¾ýÀ‡Ð0$Õ¦M¦@ë6 ‹€€€)S¦$&&ŠÎh ’cÿ³žðòòúì³Ï† Æ7ƒª €!9 XLŸ>ÝÍÍíý÷ßÐ0$Gë•-[¶DGG÷Ýw¢ƒšî Ñ û¸ ƒ^122Ú·o_—.]ÜÜܼ¼¼DÇ4[ÀVVVÖÓ§O9 ´^qppضmÛˆ#0$É`TݲeË:uê4xðà§OŸŠÎÈ„†$"""Ú¶m+:´†R©Ü¸q£‹‹K¿~ýž €!‰¨¨(vAãU)•ÊÍ›7ÛÙÙ 6,//Ot@ZL÷­³ _Snnnƒ ²³³ßxƒsâ•?>%%%00‹C8fAC›DEEµjÕŠöEõÔ¬Ysçζ¶¶ýúõ{üø±è8€T(`¨€ñšjÔ¨±uëVwwwooïÌÌLÑqIPÀP?NB‰×§T*×­[×¥K—>}údddˆŽ¨ õã;HP ¥R¹víÚ#FtïÞýîÝ»¢ãjÆQ:¨_dd$ u™;wn:u:wî|üøqm@—PÀP³ôôôÂÂÂÆ‹ÝñÁ˜ššöíÛ÷СC;vPvAC͘)øûûÿðà :~ü¸è,€zPÀP³ððpö?C ¾¾¾ÿûßwíÚ%:  삆š]¿~½gÏž¢S@7yyy:ujÀ€÷ïߟ?¾è8Àka jvýúu777Ñ) ³œœœBBB80qâÄgÏž‰ŽTç\¬§¢¬¶¿þúËÒÒ233³V­Z¢³@—=}útìØ±999¿üò‹¹¹¹è8ÐeœŠÚáÆŽŽŽ´/¤fbbràÀ¶mÛvîÜ9!!At :(`¨ûŸ!›5j¬Y³fÆŒ]»v=uê”è8À+£€¡Naaaîîî¢S@LžøwïÞ}÷ÝwëÕ«·cÇKKKÑq }8%4]XX›¿Ð@666§NjÕª•‡‡'Ì‚F¡€¡ÌÀ‚Æ200øæ›o¶oß>nܸ3fp²h êÁ ,h8ooï°°°»wïvêÔ)&&Ft€†š\»vÍÃÃCt  2õë×?xðà”)Szôè±fÍšââbщ ×˜mT&a½ª¬¬¬æÍ›geeÕ¨ÁŸtЉ‰‰ãÇW(;vìhÑ¢…è8ÐhL‚F õðð }¡-ìììN:5dÈ//¯õë׳) !øÄ„\ºtÉÓÓSt àÔ¨QcÖ¬Y/^ ìÚµ+G…!? jÚ¾}{Ñ)€WÖ¢E‹   ±cÇöèÑcñâÅùùù¢APÀPƒË—/³ -¥T*§M›výúõøøx—'NˆN}Ál£ 0 ë•Ü»w¯}ûö©©©¢ƒ¯ëèÑ£}ô‘——×êÕ«7n,:4“° ¹._¾Ü±cGÑ)58p`TTT‹-\]]×­[WTT$:tŒ×uåÊ•:ˆN¨‡‘‘Ñ’%KÎ;wøðáöíÛŸ?^t"è, ¯‹-`èžV­ZÍ›7o̘1ï¼óNrr²èDÐA0^KqqñÕ«W™ 4jÔ¨˜˜˜’ 9,Z´(77Wt"è ¯åæÍ› 4à*oÐUÆÆÆ .¼zõêÍ›7œœþõ¯qÖ¨ Œ×Â`蛀€€}ûömÙ²ÅÓÓ388Xt"è ¯åÊ•+†žðòò ™={ö”)Súõë&:´Œ×rùòe¶€¡?”JåÈ‘#£¢¢† âëëûÎ;ïÄÅʼnmE£ú ¢¢¢ÜÝÝEde``0uêÔ[·n¹ººvíÚuÒ¤IL“F5PÀ¨¾ëׯ;::‹`bb2oÞ¼›7o6jÔÈÝÝ}êÔ©III¢CA›PÀ¨¾óçÏwêÔIt @$ssó¯¾ú*66Ö¢]»v“&Mº}û¶èPÐ0ªïüùóݺu¯~ýú_ýõ­[·7nìåå5nܸèèhÑ¡ é(`T“J¥¢€²êÕ«·xñâøøxgggooïáÇÿñÇ¢CAsQÀ¨¦ØØØ:uê4mÚTt@³˜ššÎ;÷öíÛ>>>þþþݺu äôxŒj:wÀ‹M›6íæÍ›3fÌøúë¯[·nýÝwßq2K”E£š(`à¥jÖ¬ùöÛo_ºtiëÖ­'Nœ°³³ûâ‹/RRRDç‚F €QMçÎëÚµ«è€vèÖ­ÛÁƒÏŸ?Ÿ™™éâââïï*:£€QwïÞÍËËkÕª•è €6qttܸqãíÛ·ÝÜÜFŽÙ©S§Ý»wççç‹Î1(`TGÉæ¯R©Ð>fffŸ|òI\\ܼyóvîÜÙ¼yó ðía=D£:øðšjÖ¬9dÈß~ûíôéÓýõW§N|||öìÙñþPªT*Ñ4ŽRÉÃò...;wîl×®è €Ž(((8tèÐÖ­[¯_¿þî»ïNš4ÉÙÙYt((R6MS ¸r=jÑ¢EfffÍš5EgtÍ;w¶oß¾cÇŽ&MšŒ?~ôèÑæææ¢Cé5é]Ðxe%§€¦})4oÞ|ñâÅwîÜùòË/O:egg÷Î;ï;v¬°°Pt4¨ŒWÆ7€©Õ¬Y³ÿþ{÷î½}ûv÷îÝ—.]Ú´iÓ?þøÊ•+¢£AmØ×ZvAW®]»vëׯïÒ¥‹è €IHHøé§Ÿ~þùçÂÂÂQ£F=úÍ7ßJ/p XVp%RRR\\\ÒÒÒÞxã ÑY}¶gÏž}ûö1bĈ...¢Cé2 XVp%vìØqâĉ={öˆè»+W®ìß¿ÿþý†††Ã‡>|xûöíùv¾ÚQÀ²¢€+1räÈþíoÀÿ¹zõê¿ÿýïƒ>yòdèСÆ ëÞ½;Ó$Õ…–ü"………VVVQQQ5@y±±±ü÷¿ÿ}çÎ__ßAƒõíÛ×ÄÄDt.íFËŠ~‘sçÎÍœ9““È.99ùðáÿþúëÅ‹;wî<`À€´hÑBt.­DËŠ~‘Ï>û¬fÍš_}õ•è ª$''çĉÇ?v옹¹yIwëÖÍÐÐPt4­AËŠ~77·Í›7wîÜYt¯F¥R]»víøñãG‰‰éÕ«Wß¾}ûôéÃfñKQÀ²¢€+ôàÁƒ¶mÛ¦¥¥1¹Ðj>üý÷ßûí·ß~ûÍØØØÛÛ»W¯^½zõjذ¡èhšˆ–\¡mÛ¶sæÌ™3g.]ºdoo_RÆ;wÖÃO XVðó‚‚‚>ÿüó‹/Š@VÏž= ={öìÙ³gCBB5jÔ¹sçÎ;{yyµnÝZf„PÀ²¢€Ÿ7iÒ$''§O>ùDtÂGEE?þâÅ‹—.]JIIiß¾½———§§§§§§•••耒 €eE—SPP`mm}ýúõ¦M›ŠÎ@Sdee•4q ssó’2îØ±£›››‘‘‘è€êAËŠ.çÈ‘#+W®<{ö¬è 4”J¥ºuëViGGG;88´k×®C‡íÚµsuu­]»¶èŒÕDËŠ.gìØ±;wž6mšè ´CAAAddäÕ«W¯^½Û²eK·2ÌÌÌDg¬* XVpY¹¹¹Mš4¹yó¦Î~ ùùù‘‘‘aaaׯ_¿~ýzDDDƒ Êö±èŒ/DËŠ.kÿþý[·n=qâ„è tDqqq||üõ2òóóÛ¶mëâââââòæ›o:;;kÎ&2,+ ¸,???__ß &ˆ@g¥¥¥EFFÞ¸q#***"""::ÚÒÒÒÙÙÙÙÙ¹U«VmÚ´qrr²°°’–\êñãÇ666wîÜÑóSá“J¥JLL¼qãFLLLlllttôÍ›7kÕªÕºuk'''''§’ÿ±±±Q*•R‡¡€eE—Úµk×E ïRRRbccoÞ¼›™™YÚÇŽŽŽŽŽŽuëÖU︰¬(àRÞÞÞ“'O9r¤è P^NNNlllLLLLLL|||\\\\\œ©©iË–-Z´haggggg× AƒjBËŠ.1`À€ÄÄDÑY JîÝ»Ÿ˜˜˜˜˜xûöí¢¢¢’íc‡’JnÑ¢E“&Mªr*M XVp‰¿ÿýŽóçÏ^KfffÉöqBBÂíÛ·KŠ9##£Y³fvvv¶¶¶Íš5+ù¯]³fÍÞxãÒߥ€eE+Š´´´Ö­[ÇÅÅYZZŠÎê—ŸŸŸ”””˜˜˜”””œœ|÷îݤ¤¤;w¦Z[[ÛÚÚÚØØØÚÚ~õÕW5Â/¿ ôÒwß}7räHÚ€®ªU«VË–-[¶lYnù³gÏJÊ899ùÎ;Ò`S¯lçççÛÙÙöp"üŸS§N…††îܹStÐ 0 …"55uüøñ›7o622ô» ¡(((9rä¤I“(: è =mT9}›„5iÒ¤ÌÌÌ_~ùE©TŠÎšEºF`´¾[½zõÕ«WÏŸ?Oû€œ(`ý¥R©V¬X±yóæóçÏ‹ŽúEGŽß½{×ÏÏÏÔÔÔÔÔÔÏÏ/99Yt"M—ŸŸ?a„}ûö?ÞÆÆFtÐ;ºPÀOž<éÝ»·‡‡GRRRRR’‡‡‡··wnn®è\šëîݻݻwöìYHHí BèBÿøã^^^ ,°°°°°°X°`AÇŽ·nÝ*:—&ÊÊÊš;w®‡‡‡ŸŸßO?ýÄ—Ž@](àÇ7®ì’qãÆŠÊ£™îܹ³téÒV­ZýùçŸsæÌaÖ¤ “°¢¢¢\]]Ë.iÛ¶mtt´¨<šãÑ£G‘‘‘çÏŸ?xð`rròСCÏ;תU+ѹ:ñ=`CCçOŸ”.yöìY:uòóó«·BMþpvvvNNΓ'Ož>}ªP(òóósss‹‹‹³³³sss³³³}úH1n‡6nÜ›ŸŸÿèÑ£'N¸¹¹}ñÅjH¡PôêÕëüùóOŸ>½|ù²««ë?þ¨öQT*U›6m¾üòË7nHñpåääØÛÛ/Y²$33333sÉ’%ŽŽŽOŸ>Uû@’Þ‹Rò<)²½ÆJIú–)!χÀäÉ“'NœŸŸŸÚ¿U©Tß~ûí»ï¾«Þu~øá‡žžžgΜyüøqvvöéÓ§Û·oÿᇪw•JT¯^½íÛ·§§§§§§oÛ¶­S§Nýõ×믹’w¥DŸ pd.àÕ«WûûûË6n||¼¹¹¹ÚWûé§Ÿ—þ3<<ÜÞÞ^í£”%ÅõfÍš1cÆ”]2f̘uëÖ©} R’>éò?)%$z•’á-#Û188Ø××WêQžWTTÔ¢E‹Ë—/«wµuëÖMLL,»$11±nݺêE¥RuïÞ}ÇŽe—lÛ¶mÓ¦Mjâùg_¢O ¸rpXX˜““ÓãÇe7))ÉÒÒRêQž>}jhh(éR<\½zõ:qâDÙ%'NœèÝ»·Ú*%ç‹M†'¥„¤¯1yÞ22ÊóÖ®];cÆ µ¯öƒ>=zô¹sçrrrrrrΞ=;räÈ>úHíU¨d¿±t¤údxÍ×Iƒ>{öl^^^rrò·ß~Û°að°0)š2eÊâÅ‹Kÿ)ÝÓQöë­· %¨Ä£GZµjuöìYIG‘âá200((((»¤  @Ò­FÙÞƒR?)ò¼Æd{ËÈð!P«V-KK˲Ç2---Ï;§ÞQʉˆˆhÖ¬Ù³gÏÔ¾æâââ¡C‡–} :´ìuéÖ­ÛÎ;Ë.Ù¾}»zߤϿ®$úd €_nóæÍ}ûöUûj:Ô­[·²ŸSR§¥¥X[[/Z´HºQRSS»wï,Ý%(ઓíI‘ô5&ÿ[¦”ÏËìÙ³§zG)ç½÷Þ[¶l™k^±b…ÍÁƒK¦)P)*D½OJU¨å5ö<)Þ2U¤–r5jôü±LcccõŽRVFFF½zõ=z$ÅÊ›7o~êÔ©²KN:egg'ÅX§OŸîÕ«—‰‰‰‘‘Q—.]öîݫޞ]IôÉ ïÇ€Ë=è/º%$$4oÞ¼Ü _ó‡U¹;íÛ·OOO¯ö• ôàÁƒþýû¯Y³ÆÛÛû5×_É(’rvv/»$""¢M›6òŒ.µ?)U¡–רó¤xËT‘¯@gggµ¯³rßÿýÛo¿]¯^=)V~ÿþýöíÛ—]Ò¾}ûû÷ïK1V=‚ƒƒŸô½€«bß¾}]ºtQûjŸÿk¨t¡ÚÇ*ëÂ… NNNj_mzzz¿~ý–/_Þ»woµ¯\6¾¾¾»ví*»d×®]ƒ•ç5‰zR$z‰zË(¤ù6lرcÇÊ.9räH‡Ô;J©gÏžmÙ²EŠéW%lll®^½ZvÉåË—›5k&ÑpemÞ¼yÒ¤I’!Õ'CÕ6”õHïÞ½÷ïߟ’’RPPpûöí¥K—Ö¯_ÿêÕ«2 -ÅÓѧOŸC‡¥¥¥Ü»woûöíMš49vì˜ÚrwwÿùçŸÕ¾ÚJHñp=~üØÎÎnéÒ¥¥_····òä‰Ú*%é{Pž'E¶×Øó$zôäùÈËËëܹs¹c™Ò§xë­·$Z¹J¥Ú°aƒ­­í¯¿þB"ó‹IDATš••Ur ¸iÓ¦7n”b¬^»v­   !!áý÷ߟ2eŠz×ÿüëJ¢O ¸¼“'O6ÌÒÒò7ÞhÒ¤‰¿¿ll¬¼M´×-ÛWIEND®B`‚gsl-2.7.1/doc/images/rand-laplace.png0000644016036000116100000005370313373111455014304 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœìÝw@wã?ðDÙ‚µ2”!œ€ jÑ¢2WÕª¥Š~m«8ªV­‹ªT­•â,E+ÃÅDY 2dÏüþÈóË“b’Ü‘¼_ÉåîsoBäÍÝ}r¡2 ×¢ˆ#0PÀ@ @0PÀ@ @0PÀ@ @0PÀ@ @0PÀ@ @0pC¥RûŘ]íˆiРAêêê“&MÚµkWII‰€Â°†âï7( §«¸¸XFFÆÇLJÂöD}N»î÷ýö:UW’ê{^¾Ö:Ë–-“‘‘éôß ¢ŒÁ`0Œ†††ììì}ûöÕÖÖZXXܸq£Gƒów±ÐöµsçΑ#GžzôÈØØ¸/ãðq}~mË»òòòáÇ߻woÚ´i„è‹^'ìjCòË=Ò»o‡}«ˆˆˆùóç¿{÷NEE…ßéà_p ½÷öíÛõë×+((èèèøùù5551—S©Ô†††o¾ùFUUUNNÎÅÅ…N§÷h …RXX¸téR Aƒ™™™]»võÐãÇmmm¥¥¥µµµÿøãe677ÿî»ïŽ9ŠÊüGmm­ŸŸŸ¾¾¾¬¬¬’’ÒÔ©Sÿúë/Ö NKR©ÔÆÆÆ 6¨««s<óÌåÛçx€ÂÚ Ç}±V»wïžœœœœœœ]xx8ûííí{÷îÕÖÖ4hÁo¿ýÖÕ“lkkûyûvB£ÑFžäãÇ#FŒhmme_8jÔ¨ÌÌLîñ>×ÕÞé[ÎÌÌtqq‘““SUU]»vmCCû \^ Ü7ä»»ûÖ­[Ù—øùù-X°€•ûK½/?²®¾;.vûâò?ŽÅÅÅÅÂÂâÏ?ÿìù³=ÄñÜ ÷Wˆ––Öùóçkkkß¼yóõ×_oÛ¶µÕâÅ‹;VZZZZZzìØ1uuõ¼¼¼ÏÇìj„ÂÂBMMÍ]»våçç755ÅÅÅÍ›7ùÐË—/UUUƒƒƒkjjuttbbbz>++KWW·Ó:óçÏÿî»ï ZZZ>~üÈ<:ìj …âããÃÌðùîxÿö9nÛÕCñññ***W¯^ýðáÃû÷ï/_¾¬¬¬üüùsÖj«W¯Þ¾}ûëׯëêê=z4räÈŽÏÀܹsOž<Éñ¡N¬¬¬=zÄúòĉòòò·nÝb-‰‰‰±··ï6ÞçxyÂsssÕÕÕYÏä‘#G/^Ìz”Ë+û†Ü¿åN***†žššÊüòÅ‹C‡-++cmËågÝ——ïŽû†\^B ®ÿgÙ79qâÄW_}Ååi¾@7¼ÿ‰VYY9räHÖV»wïft×®]^^^ÜÇdaÙ²eÛ·o縚——×áÇY_Þ½{wæÌ™= ߨØ(##Óiyyyö6å>…B9räHW«õâÛ祀ç͛ש5X¿%)ÊO?ýÄþhxxøØ±c9~G#FŒÈÊÊâøP§§Nòðð`}iiiyéÒ%Ö’%K–\¸p¡ÛxŸãå ÷ôôìôLîØ±ƒõ(—W÷ ?ß÷ƒ“°°0kkë¶¶¶¶¶6++«Ë—/³oËågÝ——ïŽû†Ü ˜]§ÿ³ìÑétmmmŽ[¡€.ÜØØ¸k×®Q£FÉÈÈ0aIHH°¶b0åææjhht“˯^½â¸_]]]ö‡*++¿øâ‹…¯¯¯—••í´Ž­­íªU«JJJx‡B¡¼yó¦«Õxüö»Ú¶«‡FŒQTTÄþPaa¡––VW;­¬¬TVVþ|_ CFFæÓ§Oê ªªJYYùãÇ #==ÝÔÔ”Á`˜››3“|üøQ]]½¡¡¡ÛxŸãå g?šdÊÍÍe=Êå•À}Cîß2GË–-;|øð¡C‡fÍšÕi[.?ë¾üȸ|wÜ7äòâþ–}“ššÖÿ0pÃåwÓþóŸéÓ§¿xñ¢®®ŽÁ`466²·Hcc#ûÊ ì4&—Èüµþ9))©NG* èQx:®§§×iüüüyóæIKK=zÙ²ewïÞíèèèj …ÒÒÒÒÕîxüöYÚÛÛy)àAƒ555±?ÔÔÔ4hÐ Öjííí]mÛ ïÌ`0<<<Ž;Æ`0|}}:Ä`0<èïïÏ`0Ž;¶~ýzãu:²äå —øü™d=Êå•À}Ãn¿åÏ•••>¼Óß…ÜÖ}ù‘qùî¸oÈå%Äýÿ,û&(`á@7\~7ijj³¾dÎ=amÅË! —† ÖÕ°ªªê»wïúþçŸ^¹r%ÇušššÒÒÒ~ÿýw›åË—w5N·G±\¾ýÁƒWUUuz´wGÀEEEì‡S\"u¢¥¥Åã)hƒmllÜÚÚª¡¡ñöí[ƒQRR¢­­ÝÞÞnbb’žžÎK¼®p¹Èry%ðýxÆ ·oß>sæÌ† :mÛ£#`Þd\¾»^ŸDáþ–}œ‚Ì‚†^jll”––f}yáÂöGƒƒƒ;}9eÊÞG˜1cÆÅ‹9î×ÑÑ144´·©)4íØ±c¾¾¾eθ^½zuDDkÞµ´´tKKKöÂåÛ700ˆgôüùó¬sÙ—¥¥å½{÷Ø—„……YZZö(“……ELL +Ož<¹±±ñ§Ÿ~266ÖÔÔ¤P(_|ñ…®®®¿¿¿¼¼ü˜1cúãÎ2uêÔNÏä•+WXÿæòJà¾aOEFFæååÍŸ?åÊ•iii‘‘‘ìrùY÷åGÖë×9——÷ÿ³ì¢¢¢,,,z±wè¢ÿRãò Y²d‰‡‡Giiéû÷ï:Ä|ck«%K–œ8q¢¬¬¬¬¬ìĉêêê¯_¿î4&—X³ ß¼yÓÔÔÏš™™©¡¡qñâÅŠŠŠºººÈÈÈn'aµµµUVV>{ölóæÍjjj7oÞü| &\¾|¹¸¸¸µµµ´´tûöí¬©FÆÆÆwîÜikkãþ´ðøíÿùçŸzzzOž<©¯¯ÏÍÍݶmÛêÕ«YÛrÙWll¬²²2sJ퇮^½ª¢¢’˜˜ÈK¤N&NœÈýIc·gÏ*•zéÒ%Ö’‹/R©Ôóçϳ–p÷9.O8+ÃëׯÕÕÕYÏäñãÇ—,YÂz”Ë+û†<>KL•••ººº¹¹¹Ì/étºŽŽNee%k[.?ë¾üȸ|wÜ7äòâþ–}4‡€€.O ð ¸áòGÛÇ=<ƒÁÐ××—””üòË/wíÚÕÖÖÆÚ–û¾îܹccc######cccúùÞ9Fꤢ¢BJJŠãóÆq“ââb…ÚÚZÖ’ÚÚZ úúzöÕ¸Äû—'œ=F›6mš¬¬¬ŠŠÊªU«êëëÙåòJà¾a§o™Ëë|Ñ¢E;vì`_ÿ‡~X´hk[î?ë¾üȺúî¸oÈå%Äýÿ,k¨û÷ï4¨¢¢‚ãÓ|$R·€’±[ ‰¤+V$&&&%%±&ÄB/ˆÞK½¡¡ÁÆÆÆÎή§·¸^µWèýV=ÅÅÅ‹/f¿ =%z/uŸW¯^}ùå—Dg}¢öê2½ßJá¥}Wð6$ €€ €(` €€ €(` €€ €(` €€ €(` €€ À@¢‘²²ruu5Ñ)€ † †¥ hÜ~JÅÓŠ § € €(` €€ €(` €€€xñâźuëL¥R‰ÎÒ¿¡€ ¼¼¼†Kt~7=æ÷‚è–˜üªÄ½ €Þ¾}»~ýz??¿¦¦&¢‰/0€7nœ••UiiiLLLaaá®]»ˆN$¾ÄâBO‰ÉysUUUÖÖÖyyyÌ/¹Oªúü·¢˜üªÄ)h諦¦¦Ý»w=ZVV–J¥ª¨¨²epÕÇ]ûûûS‰ãïïßÇü‚ ¿ô”˜üYâfÓ¦M/_¾Ü¿¿œœ\SS“ŒŒL¯݉ɯJÁ}›1(Ð7‡Îü2??ŸýÑžž‚†>Bˆ‹ÆÆFiiiÖ—.\`+d¸ .\\\6mÚTVVöáÇÇH¬¡€ÄE@@…B1665jTVVV§#`±f6uú7ô”X\Bï)1™YÝ\#à€(`·€‹ŠŠÜÜÜÝÜÜŠ‹‹¹¬üùÛ®…– HZÀuuuNNN–––………………–––ÎÎÎ \6áïM[Ф³Ž=š’’råÊÖOOO[[Û7r\Ÿ¿É1 ˜ÄnÖ½{÷¼½½Ù—x{{‡††•€¿HZÀt:ÝÌÌŒ}‰©©iVV—M† &))©¡¡áááñòåKGOž87nœ••UiiiLLLaaaWgyabb¯l↤<{öì   ö%AAA®®®|øpøðá^üpg̘±}ûö™3g ØA@gìGÀ(`Q@¡PŒG•••Õ阩©©‹/î4AºººZaEæV@gcÆŒ¡P(ZZZ±±±DǾQQQaÿ”9JÏù1|„#`ø—ÚÚÚŠŠ  …¢¥¥…kÀ‚€ÉÌÌ4220`§   ÿ’™™É<ÿL¡PFŒñöíÛöövb#ˆ$0üKff¦±±1óßRRRªªªïÞ½#6€HBÀ¿°Sp@`PÀð/¬÷ 192??ŸÀ<¢  ÿSQQÑÚÚª¡¡ÁZbhh˜••E`$Q…€ÿétøK¡PŒét:QyD þ‡N§³f`1¡€ ÿóy9òÇõõõDEU(`øŸÏ xÀ€ÙÙÙDEU(`øŸ¬¬¬N×€)8 (`ø¯²²2 …¢¦¦Öi9 @PÀð_t:ýóÃ_ @0PÀð_Ÿ_fB þ««ÖÖÖþøñã§OŸ„ @„¡€à¿h4š©©éçË `dd”‘‘!üH"   …ÒÑÑÑÕ0…B155MOOr$ц …BÉËËSUUšÉÌÌ,--M‘Ä @Üåå婨¨(++w»&.ð @ÜÑh´nÏ?3™››£€ø îx/`æ[;:: @ €Ä/3°˜¬ªªšŸŸ/èHâ îh4Z·ïAbÁ<,~Aˆµªªªêêj×Ç<,~Aˆµ´´4SSS*•Êãú˜‡À/(`±Ö£óÏœ‚à0€Xã} 4“ŽŽÎ§OŸ*** @L €ÄïS ™¨Tª©©)>  ïPÀ⫵µõÕ«WÆÆÆ=Ú g¡ø ¾²³³µµµeee{´&Bð @|õôü3&Bð @|õt“‰‰É«W¯ZZZ @| €ÄWï XZZZGG';;[‘Ä @L1ŒÔÔÔ½ ˜ÅÜÜüÅ‹| VPÀbêÍ›7²²²Ã† ëŶVVV)))| VPÀb*%%ÅÊʪwÛ¢€ú ¦úRÀ–––™™™mmmü VÈ[ÀEEEnnnŠŠŠŠŠŠnnnÅÅżlUVV¦¯¯ÏûåÄV_ X^^þ‹/¾À<,€¾ i×ÕÕ999YZZZZZ:;;744pߊÁ`,]ºt÷îÝ Ð1g`YZZözœ…è#’ðÙ³gíìì~øáeeeeeå~øÁÖÖöܹsÜ·:zô¨ººúâÅ‹… ÿ*((––îÝ ,&+++L„è ’ð½{÷¼½½Ù—x{{‡††rÙ$--íìÙ³'Ožp4QðâÅ‹^Ÿf²´´Ä0@_´€étz§û˜ššfeeuµ~cc£··÷… Ÿ ß{ñâE_Î?S( ‹ôôôööv~E7$-પ*ö%C† ©¬¬ìj}__ß… ÚÙÙ >€(HNN¶±±éËJJJ˜‡Ð$-à ¥ÓéÛ·oïé†þþþTN€< FJJеµuDZ±±INNæK$1DÒVVVît¼ûñãÇNÇÄ,ßÿýåË—%$$zº'½ ÐOäççËÉÉ :´ãX[[£€z¤lllÜéóÎÒÓÓŒŒ8®œ——§­­ÝéDz]éûùg&kk뤤¤¾ žHZÀ³gÏ b_äêêÊqeއ°8–èJrrr§@3YXXdffâs z‡¤¼jÕª¸¸¸}ûöUUUUUUýüóÏ +W®d­€£[€^ã×°¬¬¬®®nfff߇C$-`…èè褤$-----­ää䨨(999¢sô{}¼;ÌÃèµDè’¶¶ö;wºz”ûéeœ|èJNNŽššZWS{Š9kõêÕ| @¬ô¤/ŸÁð9ÌÃè50€xyþü¹­­-¿F333{ýúucc#¿(`ñ¯XLRRR†††iiiü@| €ÄH[[[FF†¹¹9ÇÄ<,€ÞAˆ‘ÌÌL---þ~f .ô @Œ$%%ññü3“  PÀb„¿€™ŒŒŒÞ¾}[SSÃßaD @Œ$%%õýC:‘033KMMåï°" ._½zejjÊ÷‘­­­Ÿ?Î÷aD @\¤¤¤KKKó}ä±cÇ&&&ò}Xц vvv‚ÙÎÎ.>>^#ˆ00€¸HLL;v¬ Ff~ wQQ‘ U(`q!¸#` …bkk›  ÁD @,¼{÷®¥¥eäÈ‘—z  âââwøK¡Pìììp Ð#(`± ¸ ÀL6664­¹¹Yp»1(`± Ж““Ó××§Ñh‚Û€ˆAˆ¾ÖÖV&ЦP(öööqqqÝ€(Aˆ¾””===yyyîÅÞÞïà @ôÅÅÅ988z/Ïž=ô^D @ôÅÇÇÛÛÛ z/ºººÅÅłހh@ˆ¾„„!Sp 'PÀ"®°°°µµUGGGûÂe`Þ¡€D\\\ܸqㄳ/ð â„p˜ÉÚÚ:++«¡¡A8»è×PÀ"îÙ³gB;–––3fLRR’pvЯ¡€DY}}}NNŽ¥¥¥Ðö8nÜ¸ØØX¡í ÿBˆ²ÄÄDssóAƒ m˜‡À 0€(æ ,&æpGG‡0w С€DY\\œÐf`1©««+++çääs§ý @d1ŒÄÄD~ 0Gx3@·PÀ"+++KEEeذaBÞï¸qãPÀÝBˆ¬'OžLœ8Qøû?~üÓ§O…¿_€þ ²ž>}:aÂáï×ØØ¸ººúÝ»wÂß5@?‚YÏž=›4i’ð÷K¥RLJƒ`îPÀ¢)//Á`ç3>7qâD0w(`ÑôäÉB™&Nœøøñc¢öÐ/ €DÓ“'O¹ÌdnnþöíÛŠŠ ¢ @45šIBBÂÞÞþÙ³gD ?0€*..®««=z4&L˜€³Ð\ €DPLLÌäÉ“©T*&OžüèÑ# @=~ü˜ÀXLÖÖÖoÞ¼ùøñ#±1H  ‚=z4yòdb3 8ÐÞÞoFè @Ô0/„2iÒ$\è @Ôá0.p5d¸Ìļ \YYIt2BˆšG9::‚Bùÿ—ŸiÒ¤«W¯jjj®\¹²¤¤D±fÏžľ$((ÈÕÕ•ÇÍãââÈs3z!xðàÁôéÓ‰NÁÍ”)SžéèèüüóÏ••••••{÷îÕÕÕ­««c­Àž|Ú´iwïÞ}ÿþ}KKKIIÉùóç¿øâ‹¿ÿþ»×{çò´“……Ell,Ñ)ºaggMt €ž\#tyìîîžœœ}úôìÙ³™K"##׬Yãáá±k×.Á'$®C±~ýz--­-[¶¤444Š‹‹‰ÎÐ="¯¤¥¥±Ú—B¡L™2%))éÕ«W‚¼ Ÿ5kÑ)zFVVÖÁÁoFÀ¡8†~!##cîܹùùùDé±ß~ûíÅ‹çÏŸ':@÷p',è쯿þš3gÑ)zÃÕÕ5<<¼££ƒè Dê²€}||¸oÜÐÐàããÃïHÀ“þxþ™iĈC‡MJJ":‘º,à›ÈÈÈ®Vxøð¡MHHˆ`‚7•••™™™“&M":H/Íž=;<<œèDê²€_½z5vìØY³fMš4éôéÓ/_¾¬­­­­­ÍÎÎ>uêÔ„ æÌ™cgg‡©X„øûï¿ Dt^š5kÖ_ýEt "usm¹¼¼<888&&&55µ¼¼œB¡ :ÔÒÒÒÙÙyÑ¢EC† VN¡Â$, ¿… Κ5kÙ²eD饎ŽMMÍ„„mmm¢³p#¸F@Óp€’knn6lØ«W¯ÔÔÔˆÎÒ{>>>VVVëׯ':7˜ ÿ3f̘~ݾ ÅÕÕ5,,Œè„á©€sss½½½555%%%555½½½ûã[DFXX˜««+Ñ)újúôéÏŸ?¯®®&:1º/àŒŒŒñãÇëëë?}úôÓ§OOŸ>ÕÓÓspp ÓéBÈ0Œ{÷î‰@ËÊÊN˜0Ìb«ûSÛ3f̘5kÖ† Ø?~üþýû‚ÌF\2KIIñôôÌÎÎ&:œ;w.&&æêÕ«Dè‘“°äääòóóÕÕÕÙ–••éêêÖ×× "áPÀ@f;wîlnn>pàÑAøàýû÷†††ïß¿—””$: gDNÂêê†222üÝ óÏLêêê£Fzúô)ÑAÐ}õÕWׯ_ï´ðÚµknnn‚‰]****--;v,ÑAøs¡Alud]__¿zõjCCÃ%K–hjj¾{÷îêÕ«ÙÙÙçΓ••NJ!Ã)h ­€€vîÜ9¢ƒð NŸ5kVAAÑA8#ò0•Jív«+0ÖÔ©S¿ýöÛyóæ„Ÿôôônß¾mjjJtˆ¼Ìà ’@'?~|þüùÔ©S‰ÂgóæÍ»uëÑ)„ wÂè7îÞ½;}út999¢ƒð™››ÛÍ›7‰N l(`€~ãÖ­["9ùÑÎή®®N4ÞÙ À;0@ÿP]];sæLaî´µµ5&&FÐ{¡R©óçÏÇA0ˆ0@ÿêä䤠  ÌÖ××/Z´H÷ussÃe`7(`€þáÖ­[ ,ô^:::Ø¿q€;a©TTTèéé½}ûVpïþøñ£©©éõë×Ç' ]ðbóæÍrrr»ví"0@'DÞ ˆuçÎ3fôþT*õàÁƒÄ¶/…BqwwÇe`(`² Y´h‘@w¡¢¢âáá!Ð]ðÂÆÆ¦­­F£@PÀ¤V^^žšš:}út¢ƒÉ‚ 0 Ä €Ô®_¿>{öl¢ƒ s.4&a€8@Úµk×ÜÝ݉Nñ/ ãèÑ£‚ÜÜÜ|РA)))‚€TPÀäURR’M¶Ï¤R©)))~~~áÂ…!!!€FbñòòúóÏ?ÛÛÛ18y €ÈëêÕ«šœ¼mÛ¶;wözs%%¥Ë—/¯Zµª¬¬Œ©˜ôôô†Í÷‘H @R4íÓ§O‚xoîßÿ}÷îÝ#GŽôeqãÆ}ûí·=âS¨ñôô¼råŠ F Üò‰Ü È`Ë–-222»wïæï°¥¥¥VVV7nÜ ü¶\”——ËËËÄî„ ^ÚÚÚtþyÛ¶mk×®%sûR(55µñãÇß¹s‡è „C=p „ ß·o_ll,ßG®©©‘———àûÈüuóæÍÓ§OGEEÄŽ€ÄËÅ‹—.]*ˆ‘•””Èß¾ ÅÕÕ5###??Ÿè ‚‚ ÊÊÊÈÈȯ¿þšè D’’’rwwÇT,a(`Ò ž9sæàÁƒ‰Òc |mÙ²e—.]Âõ U(`Ò¹téÒ²eˈNÑcÙÙÙfffUUUüÐÊÊJ^^þéÓ§ü€TPÀäB§ÓKKKœœˆÒc†††sæÌñññáã1«——×¥K—ø5©·€‹ŠŠÜÜÜÝÜÜŠ‹‹»ZóÉ“'îîîjjjJJJvvvwïÞfNþbN¿â×<©ÒÒÒyóæµµµñe´nýòË/ïß¿ïã->Øyyyݾ}»®®Ž_I ¸®®ÎÉÉÉÒÒ²°°°°°ÐÒÒÒÙÙ¹«ËK“&M*//¿{÷niii@@€¿¿ÿ¹sç„€/˜oÿõòòâËhíííVVVäˀݒ””¼víÚ¡C‡222ø2 ººú¸qãð†`M R:r䈇‡ûãÇs\yóæÍ¬/i4š®®n_öNÚ§DÞ½{÷ìííù5šŸŸß´iÓÚÛÛù5 rrrø¸Ó7nLž<™_£ô”à¤GÀ÷îÝóööf_âííÊqåC‡Q©TÖ—zzz\ÎWY``àêÕ«ù2Ô;w®_¿~õêÕ„ýßÜÀÀ€;;wî«W¯²²²ø5 I´€étº™™ûSSSÿFDD˜˜˜&€'$$ðëí¿Ã‡¿{÷®ªª*_F#¤¤¤··÷üAt>#é=¥¤¤êëë%%%YKZ[[ååå›››¹oXYYéààpöìÙ &ôzï¸%bÇŽÕÕÕ'Nœ :é¼yófìØ±EEEÒÒÒDg±ƒ[Qòäýû÷óçÏ?}ú4íëïïOåDÐ9>×ÖÖvþüy~1:::–––·nÝ":?‘´€•••+++Ù—|üøQEE…Ë&oß¾>}úŽ;yÜ‹¿¿W—Ü„,,,LWWWOº²víÚÓ§O€ŸHZÀÆÆÆ4}Izzº‘‘QWë¿{÷ÎÅÅåÈ‘#ÎÎ΂OÀ§OŸ^»v-Ñ)"??îܹÝ^?ânöìÙ%%%©©©üJ@8’ðìÙ³ƒ‚‚Ø—¹ººr\ùÇ3fÌ8pà@¼y…BÉÍÍMOOŸ?>ÑABGGGJJjÍš5}DBBbÅŠgΜáW*‘t¶Qmm­™™ÙÊ•+™Ç§NºpáF“““c®À~UÜÒÒÒÏÏoÑ¢EüÚ;&aùúúJKKïÛ·¯×#”””üþûï{öìác*>jhh˜8q¢»»û–-[z=Hii©‰‰É›7où˜ €;±›„¥  ””¤¥¥¥¥¥•œœÅjßNRSS/^Üi"Uuuµ3ôN}}ýåË—¿ùæ›^PWW7gÎ2z’¬¬lhhh@@@xxx¯ÑÐИ:u*n "‡zà„)00ðáǽžâÛÞÞ>oÞFccã¾´/…B?~¼’’Ò?ÿüïHB)::šÁ`Lž<¹×#]¿~]h·@¸uëÖýöÛoD§àœkå§ AhæÍ›çââÒ— À⦩©IKKëÙ³gúúúDg± ¸F@Óp€á(((°±±)((èj‚!pôÃ?ÔÕÕ?~œè PÀB…áøþûïøË/¿„0ííí=ÝêÝ»wcÆŒÉÏÏWRRD*v˜„ jêëë/]º$ªw¿â‘‡‡G§[îðBSSsÊ”)x?ôw8ÔãGÀ ?¾yó&ÑAˆ”íèèÜÓÛØÅÇÇ{zz¾zõªÐ=‚#`‘ÒÞÞ~üøñï¿ÿ¾G[utt,_¾<..N@©„ÏÐÐðÚµk‹/ÎÈÈèцööö·oßP0!@àæÍ›šššööö=Úê?ÿùÏ›7o,--”Š“&M:qâ„››[kkk6ܼyóÁƒ” @p®•œ‚A³µµÝ¾}û¼yóxßdçÎýõWLLŒHÞ ùýû÷êêê=Ú¤££ÃÐÐðìÙ³'NP* NAˆ’èèèÚÚÚ®>Ý‹£àààëׯGDDˆdûR(”ž¶/…B0`ÀæÍ›8 ˆ<B€C=p 5eÊ//¯¥K—ò¾I}}ý§OŸ444—ª?jnnÖÕÕ ±Óò@*x°P¡€Ap’’’ÜÜÜrss¥¤¤ˆÎ" ~ýõפ¤¤¢ƒ€ÈB  ÇÍÍmòäÉ}ùô`WWW7räȸ¸8===¢³€hÂ5`Q¿bÅ ¢ƒôýõW{{{·«ÉËËûí·˜ ýõ8À0ˆ———‰‰ÉÖ­[‰Bvííí3gÎTUU êöV•••úúú©©©#FŒN<+8-T(`„üü|;;»ÜÜÜng2ÇÇÇôñ£sû»ÆÆÆ¹s窩©ñÒÁ~~~---ÇŽN6+8 ÐïýüóÏk×®í¶}cccçÍ›—““#œT¤%##Z^^¾råÊŽŽî+ûúú^¹r¥´´T8Ùø yyyaaa›6mâ¾ZbbâW_}uåÊá#3™»wïšššv»æ°aÖ-[†÷Cÿ‚s­à4ðÝÒ¥Kõôô~úé'.ë$&&ººº^¸paæÌ™B &2*** SSS‡Nt)¸,T(`௜œœ‰'¾~ýšûù縸¸šš¡1Û¶mûôéÓ©S§ˆ",T(`à¯E‹YZZúùùDÄUUU=:>>~äÈ‘DgÑ*0ðQFFÆŒ3^¿~-++KtÑ·{÷îüüü‹/D X¨PÀÀG³gÏvqqùöÛo‰":rss5559þAS[[k``edd$ü` ’ð6$€~)...++kÕªUD)3f̨©©ùü!…-[¶pŸì@(`úñÇwîÜÉñsbcc…ŸG4:tÈÂÂÂÉÉ©¼¼üóG×­[—”””˜˜(ü`=‚”þù§¬¬ÌÓÓóó‡vïÞ½|ùrŽÇpÐ-*•züøñ™3gNš4©¤¤¤Ó£ÒÒÒÌ¿{ÉÀ;0€@tttlÛ¶mïÞ½n£ØÞÞ¾víÚ»wï>yòDII‰¨x"`Ïž=ëׯçx“,ŸüüüÈÈHá§àfq€IXÐw/^{ö¬Ó§™…‡‡3ç¨?zôÈÈȈè8@v8 ‘ÈÈH+++##£ššš‹/¢}û—Y³f9::ºººŽ=šè, ÖPÀ=óéÓ§M›6]¾|9--íÇÔ××':ôØÉ“'#""ž>}Jtk(`€žQTTLOOONN–X¿~=Ñq 7TUUW¬XQWWGt_¸ØÉ®w4mÚ´iÏŸ?Çgök+W®¤R©gÏž%:®Ess³··÷‘#GоýÝñãÇ?~Ì~kލ¨¨Ç Ä €›Ïÿòݶm›¡¡¡‡‡!y€äää.]º´qãÆ²²2惱dÉ’ÿû¿ÿkii!6ˆ0g­­­?ýôÓ7ß|þðáÇ·nÝ:uêQ©€¿ìííW¯^½téRæ_ZÌ{ªdeeÙÛÛgeeDy ¸¨¨ÈÍÍMQQQQQÑÍÍ­¸¸˜ËÊ/^¼X·nÝàÁƒñ†à‹ôôt;;;¶{÷nÖÂòòòåË—_ºtIEE…ÀlÀ_?þøcmmí‰'˜_ª©©…††®]»öÀÄ‘GÒ®««srr²´´,,,,,,´´´tvvnhhèj}//¯¡C‡ÆÆÆ 3$ˆª£GN:uýúõaaaÆ c.ìèèðôôôöövtt$6ð×À¯^½ºÿþçÏŸ³®\¹2((ˆÀT H:Ý÷èÑ£)))W®\a-ñôô´µµÝ¸q#÷ ù2] ³ ÅÜ“'Oôôô455ÙîÞ½;&&&22RBB‚¨` 8¡¡¡›6mJIIÁé èDìfAß»wÏÛÛ›}‰··whh(Qy@¬Lœ8±SûþóÏ?gΜùóÏ?Ѿ¢jîܹ ,ðôôìèè : ˆ ’0N733c_bjjŠ9@ˆ¢¢¢eË–³NGƒHÚ¿CCÞ={¸¬C£Ñš››… DI ¸ªªªÓ‰ !C†TVV•ÄVSSÓ‚ 6oÞtèвeË|||***„D Ig©««§§§«««³–”••YXX”––rß“°€ùùùëÖ­+++ ´³³ëjµ“'Ož9s&..NNNN˜ñ€X§OŸ Œ•——ç¸B]]ÝÎ;ëêê~ÿýw!gá»IXÆÆÆ4}Izz:>¹øâÔ©ScÇŽ:ujrr2—ö}øðáž={nݺ…ö7k×®uppøúë¯ÛÛÛ9® //ÿ믿 9ˆ’ðìÙ³;½ /((ÈÕÕ•¨< J,,,RRR¾ÿþûvµNNNŽ——×7ôôô„™ HâĉMMMÛ·oç².WA‘ô\kmm­™™ÙÊ•+×®]K¡PN:uáÂÆ:éêœNACß}üøÑÞÞ~óæÍ«W¯&: ¦²²ÒÁÁaÓ¦MkÖ¬!: IìNA+((DGG'%%iiiiii%''GEEq9È> s© /šššæÍ›÷õ×_£}ÅœŠŠÊ½{÷víÚÉûV·nÝÂç)p¨ÇŽ€ECkkkee%ûT¾nutt,Y²dÀ€W¯^Åßp@¡Pž={¶`Á‚ÈÈH^Ö ûÏþciiùË/¿àú…h»#`€>ºsçΘ1cz´•ŸŸ_iié… оÀ4~üøãÇÏž=›ûçÁ°¸ººfggÛÚÚÚÛÛûúúâOyà‡zà¸_{ö왟Ÿ_SSÓ/¿ü2uêTÞ7üå—_®^½úøñceeeÁŃþèèÑ£gÏž}ò䉪ª*›TTTÜ¿ßÓÓS Á@×hPÀýW{{»‹‹‹··7óL2ïž={öÀOŸ>íth¦~øááÇQQQ Dg¡B  XÜܺukãÆÑÑÑ£F": —¯¯obbâ?ÿüƒ·†‹\”›7o®_¿þŸþAûw‡ÖÕÕ?~ccc¯inn~ðàSAÿ…†þª¦¦¦ïƒÜ¼ysÆ ÷ïß766îûh Ú páÂ55µ¹sçöºƒKJJ6oÞlggÇå#@L €¡ÿùðჟŸŸžž^·÷ç.44”Ù¾>û +AAAjjjnnn½û\B]]]öý÷ßoÙ²eüøñiii| ý ú“âââM›6644¤¥¥ihhôz¨ðððo¾ù&<<í ="!!qéÒ%99¹¯¿þº¥¥¥# 0`áÂ…ééék×®år?Ty˜mÄ&a‘VPPPzzú÷ßß—ê¥P(7nÜØ°aCXX˜­­-¿²Ximm]²dImmííÛ·eee‰Ž„YÐB…mçÎÛ¹sçýû÷ÇŒCtèÇÚÛÛW®\™››†÷Ž‹0Ì‚à}ûöíß¿ÿñãÇh_è# ‰óçÏÛÚÚNš4éÝ»w|ùúõëû÷ﯮ®æã˜@B(` –––+W®¼|ù’¿ÃvttlÚ´éúõëÏž=ÃMz/¨T꯿þêáá1~üøW¯^ñkXSSÓœœ===__ßüü|~ dƒùðáÃîÝ»µµµƒ‚‚úòVËÏ577{zz¦¦¦>~ü¸×:ÙºuëO?ý4yòäÄÄD¾ 8zôè‹/Òh4III;;;t°¨ÂÅNp ˜=úꫯ.\øŸÿüÇÈȈ#WTTÌŸ?ÿ‹/¾¸xñ¢´´4G`ùûï¿}||N:åææÆÇa››› ÄÇ¡§0 K¨PÀ„hlllhh2d‡¥Óé®®®‹-Ú»w/>ãŠF£Í™3gÕªU?þø#^l"}1Â`IDAT,T(`‘ñ×_-_¾üÈ‘#øPŽÒÒÒùóçkkk_¸pAFFFp;ºÿ~ssóìÙ³%$$· `4ˆŒÖÖÖ[·nñ}‚Õç ÆÁƒ×®]{ïÞ=´/††Æ£G¤¤¤&L˜PRR"¸1ŒC‡iiiíØ±£¨¨Hp;ÁAƒdggûùù1â·ß~ûôé“@÷õéÓ§ ܾ};!!aìØ±Ý@'ÒÒÒAAA‹-²µµŒŒÐ^\\\ž={öàÁƒššKKKLÔêp®•œ‚æ»ÐÐеk×z{{ûøøúC‡^¼xáîî>cÆŒ_ýUJJJ ûàâñãÇ+V¬Ø±c‡@Oc¢–@á°P¡€ù®¥¥eÀ€B¸ííÉ“'wïÞýÛo¿-\¸PÐûèÖû÷ï===ÛÚÚ‚ƒƒñþ·~ ×€¡“’’tûÖÔÔ,Z´è?þˆ‹‹CûI¨««?xðÀÑÑÑÚÚ:::ZÈ{?þ¼««ëµkׄ¼kà øãÝ»w‡266&äãÕ¢££ÍÌ̆ §««+ü]0`ÀŽ;.]º´téÒM›6ñ÷3ܹ»»/\¸ðâÅ‹_|ñÅÒ¥Ksrr„¶kà úêÞ½{NNNcÆŒyùòåï¿ÿ.äO÷kjjÚ¶m›——×o¿ývòäIÜgÈiÊ”)™™™cÆŒ‰ÎNåää¼¼¼"""rrrÌÍÍÛÚÚ„³_à.vr€kÀ=][[;cÆ áOIHHX¶l™µµu@@>Žú…ëׯoܸqÕªU;vì””$:t“°„ L~õõõ;wî àïÿ­¬¬lõêÕEEEgΜ!ü©«««üñÇ… Ž?÷ôà“°€H))){öìñðð :È…‡‡›˜˜TTT¤§§£}¡ß6lXXXØÖ­[çÏŸ¿aÃA¿-ž;*•:|øp___MMÍåË—ß¿ŸÀ0â ]êèèøî»ï´´´<<<>}ú´|ùr¢QŠ‹‹¿þúëï¾ûî?þ¸xñ¢ªª*щziñâÅ™™™ÍÍÍ&&&ׯ_'*†’’Ò¶mÛRRR­­­qS-a¹Vp šå?þ°··çïgõNccãáÇOœ8±~ýú­[·b²ˆŒgÏžmذaðàÁÇŽòFà® •¸p[[[KK‹¬¬,ÑA8c0×®]Ûºu«ÝÁƒµ´´ˆNÀgíííçÎó÷÷Ÿ3gΞ={ÔÕÕ‰NÔÙš5kfΜ9eÊq;ó„kÀÀ¿ÿþûܹsUUU¯]»FtÎÇøðá«W¯^»v í "IBBâ›o¾yùò¥¢¢¢‰‰É/¿üÒÔÔDt¨Ù¾}û¸qãBBBôôôÌÍÍ ‰N$ ÄëPGâp¸k×®)S¦Ìš5‹œÒ¾|ùrçÎqqq{÷îõòò0,‚XxýúõÖ­[SSSýýý===É63¹­­-99ÙÚÚZw–% œ‚*q(à––Ò~PAvvö¾}ûþùç__ß 6öÜ8€àÄÆÆþøãïÞ½Û¾}»‡‡G¿h»úúúóçÏ;99Q©T¢ãð NACÏ|üø1,,lË–-ÞÞÞW gûfee-^¼ØÑÑÑÈȈy€öñ4nܸ˜˜˜ÀÀÀ   Q£F]¸p¡µµ•èPݨ­­ÍÈȘ;w®††Æ¢E‹BBBˆNDv¢¨× ýú¸®®ÎÆÆæÝ»wöööãÆsvvvpp :T÷RSS÷íÛ÷ìÙ3__ßuëÖÉÉÉ€,bccýýýóòòüüü|||ÈÿɃEEE111mmm+V¬ : à´Põë¦P(t:}ôèÑd»tăÁxðàÁ‘#G^¾|éëë»zõjòp”°oß¾äääo¿ýö›o¾!á¼ %$$?^SS“è,<Á)hø¯‚‚‚àà`__ß &tõÙ&ÆÆÆäoßúúúÀÀ@ccãÿû¿ÿóòòÊËËÛ´iÚ +vvvaaa‘‘‘oÞ¼100X½zuFFÑ¡z£ªªêêÕ«fff#GŽôððHHH :aú÷¡ž€öxÁ‚ñññöööcÇŽµ¶¶¶··ï÷£HOO?sæLHHȤI“6lØ0yòd¢ô3>|8sæL``àÈ‘#W¯^½`Á‚~÷«€Á`¼|ù2))ÉÒÒÒÄÄ„è8Üà´P[ÀÅÅŃ :tèçÕÕÕÉËË ?_455]»v-00ðíÛ·+V¬X±bÅðáÉеµµÝ»wïÌ™3ÉÉÉ^^^kÖ¬100 :߬_¿žB¡X[[›™™xå,TÂ/àÄÄÄÛ·o¿xñ"%%EZZúÀ]Í^î¯\¹2vìØ5kÖ¸¸¸ÿ 9@?RPPpöìÙóçÏ=zÙ²eóçÏWTT$:T_%&&&$$¤¤¤¤¥¥åææÒétB’ €…Jø•””dfffmm­¦¦&Ì] N ‘””ôôôôöö1bÑ¡DVKKKxxø¥K—=zäìì¼dÉ’Y³fõ»SÓµ¶¶8ã{‹¯_¿n```hh(¸Cd°Pññ鮯¯OII¡Óét:ÝÐÐ000/#“V^^Þµk×BBBª««-Z´xñb ¢Cˆ‘êêê;w¤Ì™3ÇÝÝ}êÔ©’’’Dçâ¿ÖÖV///:ž——§­­meeuùòe¾ï,T||ºãââ¶lÙbbbbbbblllff6dȾŒL6YYYaaa·nÝ*))Y°`»»»ƒƒî @ ²²²›7o†„„ää为ºÎŸ?ßÉÉI$ßkÐÚÚš]TT4{öìÏmhh`ÿôn X¨xyº›ššâãã_¿~›››››+!!qãÆ áÄ#úúú¨¨¨ˆˆˆˆˆ*•:kÖ,77·‰'â/©ß¾};44499ÙÁÁÁÅÅeæÌ™úúúDç’ׯ_/Z´(;;[EEE__ßÑÑqÇŽ¼oŽ*ö§»­­ã]XËÊÊÜÝÝõõõõôôôõõGEò™ô|”••õðáȈˆøøx›™3gº¸¸ ºñéÓ§ÈÈÈû÷ïÿý÷ß²²²3gΜ1cÆ„ ÄáÞs £¸¸øõë×íííÓ¦Mû|…’’’””--­#F¨¨¨°–£€…§­­MRRrýúõ¯_¿~ýúuuuuEE…(ÝX¼w cbb"##£¢¢ddd¦L™2cÆŒ©S§*(( zŒÁ`Ðh´ˆˆˆ¤¤¤˜››O™2ÅÙÙyìØ±"yµ˜ÏŸ?ß³gOQQQaa¡„„ĪU«8@A •J=~ü¸®®®¶¶¶Ø¾óòò¢££?~ÛØØèèèèìììììLÔ›@ž={““cee5aÂ''';;;јDÝ åååMMM_~ù%,d¤½– UWW'%%%$$ÄÇÇ'''KII9::::::88Œ5 §D^MMM||üÓ§O£££ÓÓÓG5vìX[[[ñü%€*ñ)àOŸ>%''gddÐh´„„„·oßZXXŒ;vܸq666DÂ477Óh´øøø„„„¤¤¤?ÚÛÛ[ZZŽ3ÆÒÒROOOLú,T"\À™™™™™™4íÅ‹¥¥¥æææ¦¦¦¦¦¦vvvýâS€åååqqq©©©t:=99¹ººÚÒÒÒÂÂÂÄÄd̘1FFF222Dg°P‰F·µµÐéô¬¬¬×¯_¿|ù’N§+**2ÿ·˜˜˜XZZ¢q ÊËËSRRh4óoúœœœáÇ›˜˜èé阚šŽ5JII‰è˜|€ª~WÀ---oß¾ÍÍÍ}ͦ¨¨HCCÃÈÈÈØØ˜õF)eee¢Ã€jkk{ýú5NÏÍÍÍÉÉÉÈÈÈÉÉ‘••Õ××g½]S___[[»ßýB i ¸¾¾¾°°°¤¤¤¸¸¸¸¸¸°°°   77÷Ǻººì¯u]]]??àÝ»wÌÖáAaaaGG‡®®®®®îˆ#´´´†>|øð#F 6Œœ•QÀÝ(**úî»ï>|H¡P¦NzìØ1æôñÞ!°€ FEEŇŠŠŠJÿ¿¢¢"fã644hkk³^¯Ì—¯žžÞ—_~‰›>@¿PSS“›››ŸŸ_\\\TTTTTÄ<¨¨ªªúòË/™¿Ü¾üòË¡C‡6Œ¹DUU•À Ì(`nêêêÌÍÍ}||Ö­[G¡PN:uéÒ¥´´´^ßòTpOwUUUuuõû÷ïËËË+**Þ¿_VVÆüsayyùàÁƒÕÕÕGŒ¡¡¡¡®®®©©Éü#ñË/¿™J褩©©¸¸˜YÆ………>|(---))yûömyy¹¤¤¤†††ššššššººú°aÃXÿfþCIII@çüPÀÜ=z4%%åÊ•+¬%žžž¶¶¶7nìÝ€¼?Ý 555µµµ555555UUUŸþ?æ—Ì¢ýôéÓÇËËË™ýÊ|Åü¿öî/¤©÷ãøùb¾l;›Ìa5¤˜Ò, ‚(RË D2©Q”]EyUyaQ„7E‚E E¡#$"ìŸZŠYa‘Ûüל&.õü.sé,Ù÷·=ëýºÊ£œ>;ÏsÎgÏŽ›ééé©©©çVØO¾€¿™×ëu¹\UŠÛíöx<ýýý.—Ëãñ ô÷÷{½Þ%K–¤¤¤X,“É”ššj±X—\³Ù¬ªªÑh4™L&“IUU“Éd6›øŠ7ü;ùùù•••¡Ÿíùøñãêêêæææö6==pãÆ?~x½ÞÑÑÑ@¡Žùý~¯×;22òíÛ·@ã&&&šL¦À¸‡9Àd2%%%¥¤¤$''«ªj±X’““ù•cˆ’ÑÑÑþþþ¡¡!¯×ëv»‡††‚k¡àº(¸F\¨Õ ªª&%%©ªª×ëÿý÷_ƒÁàp8¢T”ñ°Øêìì´Ûí¡[Ö®]ÛÕÕÙÞ7SŸ={–˜˜h6›õzýªU«TU5 º O tu:Ýÿáþ3ƒÁ`0þY¹uTà%Ì‘‘ŸÏ799\by<žññqŸÏ½Àñ°Öétccc¡ŸØüãǃÁ011Ù¥ý-h@ŒE¯âa±ªªª³gφý–œ¿ ˆñ°ÔKKKëèèHKK nq¹\ëÖ­ëëë‹l‡Ò®€¥ ¦-Rd‹Œ´Ù¤ ¦-RÑËoÍÎÎnooÝÒÑÑa³ÙDåàâ¡€‹ŠŠêëëC·Ô×׋ÊÀÉ»ê_8ŸÏg·ÛËËË;¦(Jmmm]]]{{»^¯l‡Ò¾"m0…l‘"[d¤Í&m0…l‘â%èß1N§óÅ‹™™™™™™/_¾lnnޏ}ˆyŸt$ís1iƒ)d‹Ù"#m6iƒ)d‹Tô²%TUUEc¿‹Ý¶mÛDGOÚ` Ù"E¶ÈH›MÚ` Ù"¥lò>é ŽÅÃ=` (` €€@ (` €€@ (` €ÃøgщÂp¹\YYYòd{þüyyyùÊ•+u:]FFÆöíÛïÞ½+:ÔO---eee)))&“iÓ¦M¢ÍxýúuEE…Ùl–g({{{KKKUUUUµ´´ôóçÏ¢ÍðpÈ<Çd>7CÉvM‹Eh˜CþÃ2==]XXØÐÐ OÔ7^»v­»»{bbbppðÑ£G¹¹¹§OŸKÓ4MQ”¼¼¼§OŸŽµ¶¶Úíöëׯ‹õ“Íf;sæÌ»wï$JŸÏgµZÏŸ??44444tþüù¬¬¬±±1ѹ~’ípÉ<Çd>7ƒ$¼¦Å ‰,U*òÌ€ùÔÔÔ˜¶°ãæt:—/_ËTóeûòå‹ÝnojjŠ}¤ß ~7ö‘æJMMu¹\¡[úúúÒÓÓEå™$‡káslD›sÉsMû£hÁß~8ôXüægb)ôÿ•­§§gÅŠ³Þ—&äÊ 9n6lðx<±L6Ûׯ_wïÞ}éÒ¥‚‚‚ØGúM0Ùdgg···‡néèè°Ùl¢ò,"2̱unÎ%Ï5í¢qÚþí¼·oßÞ¼y³èŠòÛe“èha<{ölÍš5¢S(Š¢x<ž]»v]¼x1??_tÙÕ×ׇn©¯¯/..•g±X\sLžss]Ó¢R [(ÿEòóóïܹÓ××ç÷û?|øpáÂ…äääW¯^‰Îž<#XXXØØØèv»ý~ÿ—/_nÞ¼¹lÙ²ˆÎ¥iš¶nݺ[·n‰Nñ’ åÈÈÈÊ•+/\¸ü «Õ:::*:×l’® ™ç˜Ìçæ\’ŒllŠ@Ї*•æææ’’‹Å²dÉ’eË–þ\t¨ŸÂ>õKÓæÉ&6ÒÇ÷ìÙc4Fãž={fÝ¢KÂà ó“ùÜœK’MÈò–gþ*Ü@ (` €€@ (` €€@ (` €€@ (` €€@ (` €Ì(++;uêTè–“'OîÛ·OT Žý£išè d188˜››{ïÞ½ÜÜ\EQÞ¼y³k×®ŽŽŽ´´4ÑÑ€xà À ‹ÅR[[{äÈ‘©©©©©©#GŽÔÔÔо@4°0ÛáÇsrr4M{òäÉýû÷EÇâ `6·Û]PPàõzNgVV–è8@|¢€Ìvüøñ¼¼¼·oß^½zUt >qÀ/šššzzzJJJÊËËÛÚÚšššD'â+`3†‡‡7nÜøèÑ#«Õª(JWWWQQÑ«W¯’’’DGâ +`3***G }E±Ùl¨¨¨› ˆK¬€€0PÀ@  €0PÀð?2!ûO{[IEND®B`‚gsl-2.7.1/doc/images/rand-levy.png0000644016036000116100000005215113373111455013656 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœìÝw W{ü?ð2’¨dDF2ÊȪ–hP*Q¡¡t•ê¶w·ºíº £«½”-ܶ2ÊÕ2ŠB!{+df~~|¾__¿.2ÎçóþŒçã/Îçœ×yQ>ÏÏyŸsÞ‡N§Ó€µzn€!€@€  @€0`À €@€  @€0`À €@€  @€YøøøîšAHHHZZz„ ûöíËÉÉaR{Í¥¨ý‘ þX Àèt:N¯®®NJJ:|øpEE…žžÞ­[·:U„•ˆ¸^ÃG§ÓI÷Àøøˆý}µºë÷ïßOž<9<<\SS³;u(\Ÿªm8Ž€Èxþü¹A¯^½|ùòe–œœ¬­­ÝÔÔôÓšMMMZZZ|||<øé¥¸¸899¹†††ŽìQWWwÆ ®®®Œo›8+**¶nݪªªÚ»wï¾}ûNž<ùþýûÍ+4f7oUSS³fÍiiéVGž«««%$$DDD,,,š_jõ·y/­î«yµ{÷ˆˆˆˆµüUðññ566~ü(##sõêÕ¯_¿VVV>{öŒqCcc£ššš„„Ä!C~ÚÖÌÌlÇŽÒÒÒ-¯Õjk× %%%ÿþûïæÍ›[Žf·\gܸqׯ_ÏÎή¯¯ÏÏÏÿã?,,,/ijj´ì¡ÕŠÖbyþüùÿýwAAAAAÁßÿ---͸^šN§ß¸qCEEåÅ‹UUU©©©Û·o_¾|yó¶íì+22²ÿþ>>>EEEEEE>>>âââÍÃïí·À¶ð€YÚÿÈûîÝ; QQQaaá‰'>{ö¬å¶/^¤Ñh.\øoÙþù‡F£íÚµ«#»”””7nÜÞ½{ºÌª¹™°°0›ôêÕKEEeÛ¶meeeŒ—=z¤ªªÚ³gOZÛgjéÿWVVþöÛoýû÷ïÝ»÷Ô©Sããã[®éáᡪª* //¿oß>ÆÌÙW@@À¨Q£„……………Gôß½·ÚÛÂÔ3¦¦¦F\\<55uРA¤{€®ëèýûÀÊÊÊÜÝݾœ À1øøøãºW¯^%Ý t† ÀmH €@€  @€0`À €@€  @€0`À €@ÀOºvÔ¿ÿ²²2Ò][ ÓéÌ(ËǤº¿ Ñ˜™‚  @€0`À €@€  @RllìªU«úõëÇÇÇÇ=deeÙØØˆ‰‰‰‰‰ÙØØdgg³ C®„ iÑ¢ERRR‘‘‘ÑCee¥©©©¾¾~fffff¦¾¾¾™™Yuu5 šä>˜ô¸˜ XÞy~Ùƒ››[LLŒ··wó’… ¬]»–ùÝ‘¹ ØQffæâÅ‹edd„„„tttüýýY¹÷ððp###aaa ÇÓh´·oß1o÷îÝspph¹ÄÁÁ!((ˆy{äb`€.ÊÊÊ266VVV~ùòeyyù¹sçüüüX¶÷ÈÈH{{ûƒïÙ³ÇÞÞ>//ÏÅÅeÍš5ÌÛiBB‚ŽŽNË%ÚÚÚ‰‰‰ÌÛ##?âÁ†Øa ØŸ£££¬¬ì¡C‡Z}µý šþû&ÓÙwžéÓ§O™2eݺuŒoíììäååoܸ‘––&((Ȥ«ªªš—Ô××÷éÓ§¶¶¶ãs A°'Ož,Y²¤­WéíêþÞ_¿~=kÖ¬æo'MšäêêêääÔœ¾,è¡ãöîÝËGÎÞ½{YùÃvõZ#`èòòraaaJªuöGPP°¢¢BHHˆñmll¬¡¡aVV–ŒŒ óz––Ž—––n^RPP §§—ŸŸßå²9° ‰œœœ¶^mÿ˜¬û{—‘‘ùúõkó·ÑÑÑ¢¢¢LíASS3..®å’øøx ®ý< ÐEæææW¯^mëUfÿêêê7{éÒ%™èèh¦ö`iiéååÕr‰——×Ì™3»ö#ð8Œµ¶CÐÐYYY£Gvvvvpp‘‘y÷îÝÑ£GºV­ÕwžvÞŽþý÷ß9sæxyyŸ}ú”)SÖ­[ÇøÖÎÎN^^þÆiii‚‚‚]롤¤ÄØØøâÅ‹ãÆkuAAÁªª*æ%õõõ}úô©­­íx眅‰‰ÐþÓ"I™8qâ“'OZ.yò䉩©i;›¼{÷nذaåååt:½›?ÛþZ€­ÈÈÈ$''SU­³ï<âââéééÍß^¼x±G{öìérãÇ mgººº–KêêêY|Ïž=-£§­>™´Zw~-ÌK6=Ô“––Ž—––n^RPP §§—ŸŸßêú555†††.\`œüÀ0°€€€@yy¹°°0%Õ:ûÎ#((XQQ!$$Äø666ÖÐÐ0++KFF¦ {ÏÍÍ>}º‹‹‹™™Y;«uöÍ™ ðÜEX¥¥¥?=sÀ€%%%m­¿qãÆ¹sçvöÒ€îÈÉÉiëU¾vuï222_¿~mþ6::º±±QTT´ =äååYXX¸ºº¶Ÿ¾4MSS3..®å’øøx îÿ8<ˆM¸S‚‚‚þøãÎn¸wï^&ýa/077¿zõj[¯þr`³›tuuƒƒƒ›¿½té’ŒŒLtttg{(**277ÿ믿LMM¹SKKK//¯–K¼¼¼fΜÙý‡Q2M9))©‚‚‚–KòóóØêÊÊÊÊ-—tóçbÛ_ °•ÌÌLYYÙ}ûö¥§§ÿøñãÕ«WVVV]®Öê;O;oGÒÒÒOž<©¨¨8xðàĉwìØammÝÐÐЩýêééݸq£ƒ•——+)):t¨¤¤¤¤¤äàÁƒÊÊÊ•••Ú#ga^"°iÒtê",Ê?^ € ƒÒÓÓ,X )))  ««ëïïßÙ í¼w}ûöM\\¼m}||ÔÕÕTUUJKKgâºß@iiiËZ®Ÿžžnee%*****jeeõÓñ÷a^"°éÕF®®®±±±?݆4jÔ¨æ îÛ‡‹°€ xxx$''{xxn„§1/Ø4i***tttœœœV®\I£ÑΜ9ãéé'""ÂX¡ý߸€žžÞ•+WôôôH7ÂÓxî*hQQÑÐÐШ¨(EEEEEÅèèèæôàïÞ½Cúr1êµGÀÀÀsGÀÜ  @€0`À €@€  @€0`À €@€  @€0`À €@€  @€0`À €@€  @€0`À €@€  @€0`À €@€  @€0`À €@€  @þÏ·oß6mÚ4räHAAA>>¾^½zM™2åÉ“'¤ûàB`ø÷îÝ>|xccã©S§ÊËËétúׯ_ûí·•+W:::ÖÔÔn€«ðÑétÒ=°>>üZ€ç\½zuçηoß=zôO/UUU9;;gggß»wOLLŒH{¤0/4­@¯ñòòúóÏ?Ÿ}út§Ò—F£mß¾=;;ûîÝ»Lj €G°iWVVšššêëëgfffffêëë›™™UWW·ºòÚµkõôô?~\YYùñãÇ­[·räÈ¢¢"&ôÀÙjkkÏŸ?¿nÝ:ª :täÈ‘¾¾¾TàlÀ–––?Møîåå5sæÌnþòåËaÆ1¡/Îæçç§«««®®NaÍuëÖ¹¹¹aР³Ø4€—-[öòåËÇ—–––––:tˆ1ÝUó -ÏÔN:5((¨¨¨¨¾¾>77×ÓÓó·ß~;r䉯ØÚßÿÝÁ›é;nÒ¤It:=<<œÚ²\MXTT4444**JQQQQQ1:::$$DDD¤Õ•·oßîå奡¡Ñ»wïQ£F=xðàÎ;,î€Í½zõª²²rêÔ©Ô–åãã[½zõéÓ§©- ÀõpµQ+pp¥E‹1býúõ”W®¬¬TTTŒ4håÅÈÂÓX  Üçëׯjjj©©©ââą̂¿zõjIIIÌÁÜÌR`à>ÇŽûüùóåË—™T?))iÒ¤I-çÏà>>aaa[[ÛšššnhddD§Ó£¢¢:ß&ÏAp³¬¬¬¤¤¤ÎÎ~õ矖””ÐéôüüüÉ“' u|[{{{ŸN¶ À‹p²³8 \ãÈ‘#YYYgÏžýiyCCC@@ÀÀÇ×µÊß¿—““ûiyjjê˜1crssùùù»V€­à0tÅ7æÏŸßrI]]Ý… ÔÔÔN:Õ·•wïÞéêê.]º455µårEE۰°.Wà`®õáÇïß¿;¶yIaa¡¶¶v@@€ÏóçÏÇßåâãÇOMMURR266Þ²eKEEEóK ,À(4À/a¬µ‚î°cÇöÓ£9ÿý÷ß–‘Ü}EEE»víÚ²e‹ªªjó’aÃ†åææ S¸#"04K!€ Ðéô!C†ikk³~ï“'O^±b… ëw @-œ€Îyùò¥°°0‘ô¥Ñhööö7nÜ ²kNàN7nÜX¸p!©½Ï™3'$$¤¬¬ŒTì À…}}}ûöíKª11±ñãÇß¾}›Tì À…¶nÝZYY©££C°‡~ýúmÛ¶­´´”`ì  Àmöïßéҥ͛7S{µsg>}ºººzôèѹ¹¹Û`[`®rõêÕ;wîðóó¯X±‚l'}úô™5kÖðáÃ'L˜™™I¶6„à*vvv»víRWWWPP Ý mÞ¼yeeeëׯ‹‹#Ý ÛÁ ¯­À}ÀÀÑõôôÖ®]KºZMMÍ Aƒ>}ú$%%Eº€.Â}ÀÐ!õõõ÷îݳ¶¶&ÝF£ ›››’n€!€¸JXX˜ššÚRDÊìÙ³HwÀŽÀ\% `öìÙ¤»ø?Ó§Oýú5nFø/0‹ŒŒÌËËkþ¶©©)((ˆMÆŸz÷îmbbrÿþ}Ò°0§JJJ²±±IKKk^òêÕ+IIIeee‚]ý×ìÙ³ïÞ½ÛrI@@ÀöíÛIõÀ&À©¸¸ØÒÒòĉ-gÛ¸sç[þ2̘1#,,¬²²²y‰‰‰IPPÐ… v@€óÔÕÕÙØØ,X° åãètúÝ»wçÌ™C°±VõïßôèÑ>l¹äþýû{öìyþü9ÁÆÈBpžÌÌL ½{÷¶\øöíÛ^½zijjjª=666wîÜi¹DYYÙÛÛÛÞÞ>''‡TWdaƉV`"àD[·níÕ«×þýûI7ÒŠoß¾)++çææŠˆˆ´\þüùó1cÆðóó“j à—0üÂÝ»wmllHwѺŒ9288ø§å&L@úÏBpƒwïÞÑh4²Ïlßœ9s~…àq`nÀž—_µ4{öì‡ÖÕÕ‘n€] €¸ÁÝ»wÙj¬ÿ’––ÖÔÔ !Ý»@p€ÌÌ̆††¶^MNNþþý»+[êÌ Ð€ÝUTTLž<944´­nß¾mmmÍÇÇÇÊ®ºÀÚÚ:00°OoÞ¼ABï@°» 6˜˜˜L™2¥­Øí mrss ÔÎ “&MZ³fͬY³XÖR7 :ôæÍ›íܲœ’’²mÛ¶Ÿ @ ó¡ÍºK–,9sæLïÞ½ÛÙ¸ººzÕªUW¯^eFg!€S”•• <8//¯ý?U¶²yófQQÑ={ön C0/C§¸~ýz@@g,FDD¬[·.66–t#‚¹  AAA4øÌ`llœ›››‘‘AºÂ~ÀsçÎ-**úiaii©½½=sZ€©®® ™1céF:§gÏž³fÍ⬣vføu+))ikk{{{7/yúôéˆ#”••™ÙüÂãÇG%..Nº‘NÔX´ž~÷î“““ŒŒŒ›››‡‡G\\ܹsçÔÕÕYÐ8 ùùùYYYõêÕë—k.Z´ÈØØxåÊ•,èŠZõõõüøñ£ŒŒ é^~ð9`==½·oßš˜˜˜šš><<<œ‹Ó€ ìÞ½»#íõõõ=â¸À AAAYùË—/‹/Ægbà>¸‹¯oß¾ì?å,'ªªªZ³fÍÙ³g………¹rhhè°aÃdeeYÐ3X[[wð4°’’RrròµkטÝ‹u(€ß½{ghh˜q[;| IDAT6}úô/_¾0»3^óǘ˜˜Lš4©#+ß¾}󮮠Ù-1¹¹ùÛ·o¿~ýúË5{ôèqþüùíÛ·² 1–ùõÐö¶mÛ|}}Ïž=kiiÉXòìÙ³+V,X°`ß¾}ÌïœÖ+,,444ŒíÈEU²²²¯_¿VRRbAoL2gÎKKË%K–tdåmÛ¶åääøøø0¹)€Ÿ‘<œ‘‘ñþýûæô¥Ñh“&MŠŠŠJNNfFC¼IZZúÓ§O¼¤ùÅ‹ ¾4ÍÆÆæÎ;\yÏž=µµµLm €•p¨× ›[½zµœœÜöíÛI7Ò-òòòYYYbbb¤{hf€ÿÑÔÔÄ)nŸ¨¨è¸qãUTTTTT$%%9sfܸq3fÌ022Â¥X,ÄãÏ  1bD;ô¸Ø/Î-ûúú†……½{÷®¸¸˜F£IIIéëë›™™ÙÙÙ 0€U}².ÂÖ 1bD§.AúðáÃÌ™3ÓÒÒ¸f>ØØXOOOÒ´Ïf)0°@^^žŽŽÎëׯ;õ\“}ûö•——»¸¸0¯1ËÍÍÕÕÕÍÏÏçççïøV/^¼x÷îݺuë˜×®‚à6[·nuvvîìSÅ­¬¬˜Ôƒ RRRzþüy§¶2dÈÁƒÓÓÓ™Ô t(€SSSdeedeeÒÒҘ݋ŒŒŒˆˆØ±cG§¶JII)((066fRW¤ØØØÜ¾}»S›ÈÉÉmܸqãÆLj €~À>|;v¬ªªjDDDyyyDD„ŠŠŠ±±qBB úàJ[¶lqqqéÔV·nݲ±±éÙ³'“º"eÞ¼ywîÜihhèÔV›6mJLL|üø1“º`¶_m›››OŸ>}Íš5-ž|vüøqæ4@£‘½KDD$--MZZºå‚‚ee媪*fôDØPzzúèÑ£sss¹ï˜F£9r$77÷Ô©S¤øÉ‹°„„„Z]Þ‘G–Unݺ5{öl®L_6gΜ»wï655‘n€u~ÀÖÖÖ7oÞüi¡¿¿?G?‹€ãܼysÞ¼y¤»`UUÕFDDn€u~À'Ož|ýúõÁƒÓÒÒ~üø‘––vàÀ7oÞ¸¹¹1µ³¬¬,111111›ììì¶Ö|ñâ…­­­¤¤dß¾}ŒŒ™Ú륥¥åææŽ?žt#L4wîÜ[·n‘î€u~=´Ý‘ w(¯¬¬ÔÕÕutt\µjF;sæÌµk×Þ¿ß»wïV;œ8qâôôô–-[¶zõj''§.ïç€ÝðÂ)Ò´´´1cÆäääpë0;p(ž› ËÍÍ-&&ÆÛÛ»yÉÂ… Ö®]ûß•·lÙrìØ±æ ñññÖÖÖ©©©]Þ;(×ÐÐPQQÑ¿ÿ®m®¯¯ïîîÎÝGÀ4mäȑǟ8q"éFþÏÍ„uïÞ=‡–K‚‚‚Z]ùøñã-ÓUTTÚ¯ ââŋ˖-ëÚ¶©©©cÇŽ¥¶%64oÞ¼ÿ^qÒAt:ÝÛÛ»¾¾žÚ–˜‡M8!!AGG§åmmíÄÄÄŽlûèÑ#---æôÐ߿߿ÿŸþÙµÍóoôèÁ¦­š;wn@@@ccc¶åããóöö>þ<å]0 ›þI—––Š‹‹·\2`À€’’’_nXRR²sçNwww¦µÐi‡š1c†¶¶v×6¿yó¦­­-µ-±'%%%…ÎÎ ÝÌÅÅåàÁƒ¥¥¥ÔvÀ$lÀ]SXX8{öì³gÏŽ7®#ëïÝ»—¯5ÌîxJZZš§§çþýû»¶ù—/_ ¹oþç¶tçZhMMMkkëƒRÛ“°éÕFÒÒÒñññ-§ß*((ÐÓÓËÏÏok“ÜÜÜéÓ§»¸¸˜™™usï¸ (TXX3mÚ´®m~øðá“'ORÛÛÊÈÈ000ÈËËëÔÓ ›kiiýôîÐyò¤;o޼ɃãÏ âââcÇŽmköÙŽkhh¨®®¦¤%Ê!€(–‘‘qòäÉŸæRí¬ÐÐÐAƒ :”ª®8΂ |||ºYdïÞ½{ö졤Êádg+pºcþüùêêê»wïîN‘%K–èëë·úø/ñãÇ99¹?8°ËEŠŠŠ455_¿~­¬¬LaoÀSxîq„d!€¡Ë¢££­¬¬>þÜÖEûQ]]-''—””ÄãJ8::êêê®[·®;E8””„ë¹ ËpgxõêÕ¾}ûº“¾4-((hôèÑ<ž¾4mÑ¢Eׯ_ïf‘7>þ<66–’–(„C½VàÈš>}ú‚ æÏŸOºšššž>}ª®®Þ:÷ïßWRRÒÔÔ¤ª1à)‚f)0T\\¬¦¦–ݧOÒ½·yófaaánx† xÅ7f̘ôeX°`Áõë×ñ¸€½øøø,X°€tìBOOOTTôåË—¤ €¤¤¤deeᩚ-ÍŸ?ßÛÛ›tÔÃÉÎVà0²sçÎÚÚÚ'Nn„äææjkkçää “îxΰ¯ÐÐКššî×ijjº~ýºƒƒC÷Kq“Aƒ9200t#CtKFF†­­mEEE÷KËÈÈhkkw¿—qttôôô¤¤TLLŒ››%¥º c­­À4tœƒƒƒ²²2%ÛÚÚNœ8qÅŠÝ/Åeêêêää䢣£ºYª°°PSSóÝ»wòòò”ô\÷³:èãÇ“&MJIIíf©oß¾©¨¨¤§§÷ë×’Þ¸ÌêÕ«¥¤¤þüóÏî—Ú½{w~~þ¥K—º_ x˜¥ÀÐA³gÏ611éædÅ îîî±±±^^^Ý/Å•âãã---ÓÓÓ{öìÙÍRß¿WSS{þüù°aÃ(é ¸.Â`GG¥jÄøÒ¥KË–-£¤WÒÖÖ–––~öìY÷KõíÛwëÖ­~~~Ý/Ð8ÔkŽ€Å^¾|éèèøéÓ'>>>Ò½°¯óçÏ?{öìÖ­[Ý/ÕÔÔÔ£? C0ÍR``±¥K—jhhlÞ¼™t#l­¢¢BQQOiC³X©¬¬lÈ!Ÿ>}’’’"Ý »[¶lÙ!CvìØAºà!8 Àµ®]»faaôíˆßÿýܹs¤ €°‹/:;;“î‚3èêêJII“n€`€Îijj¢°ÚóçÏétúøñã)¬ÉÝV¬XqîÜ9Ò]P Ð ¹¹¹zzz T<þ<;ÅÎÎ.222;;›ª‚t:=!!ªj‡è„}ûöM›6ŸŸŸ’j_¿~}üøñ¢E‹(©Æ#DDDìíí/_¾LUÁ‚‚‚ &äççSU ƒp¹o+p4´êÓ§OãÇONN¦j¶ÈcÇŽ}úôéÊ•+”TãIIIfff™™™”ܲeKeeåÙ³g)©\WA·uëÖíÛ·S•¾t:ýÒ¥Kîuuueeåû÷ïSUpçΈCtH]]¼¼üï¿ÿNUÁ'OžôéÓÇÐЪ‚|••%Ý g[²d‰ººú¶mÛH7Ü ÌR``ª£G&&&^»vt#ïÇiii‚‚‚¤{®…Û¸D}}ýéÓ§7lØ@ºn0|øpuuuÒt M^^^ÔÖôóó:t¨®®.µeyÖ¦M›Ž?Ž!+àD`€6ýñÇÔÖtuuݸq#µ5yÙÔ©S›ššBBB(¬I§Ó-,,ÒÓÓ)¬ ð_`€Ö½yó&""bÓ¦MÖ|úôiCCƒ¹¹9…5y߯]\\¨­9vìXÌË̆«Z‹°€N§3fåÊ•Ô>)aêÔ©ööö˜|ƒZµµµC† yøð¡ŽŽU5kjjÔÕÕ}||ÆŒCUMàP¸ €¥^½zÕÐа`Á k~øðáãÇöööÖ&$$ôûï¿»»»SXSXXøðáÃ7nÄgq`êµGÀ@£Ñ~üøAí4U .ÔÖÖÞºu+…5¡´´TMM-66V^^žªšt:}Ù²e‡’––¦ª&p"ÜÌR` \ZZÚèÑ£SSSEEEI÷¶oß^SSsòäIÒ·A³(·|ùrYYÙ½{÷’n„k1f¦LHH‘‘!Ý p0K!€Z999ºººÉÉÉâââ¤{áfk×®>zô(éF€« €Y  Ôúý÷ßûöí{øðaÒp¹üü|mmí„„)))Ò½÷@³(”­««ûéÓ'IIIÒ½p¿Õ«W‹ŠŠ9r„t#À=À,…æMéééòòòüüüÔ–ýý÷ßÅÄÄ ¬ÁíOJJÂÇ  î`®úúúiÓ¦…‡‡S[6++ËßߟÚé´ rrrvvv'Nœ ¼òË—/CCC)/ ¼  @£Ñh§OŸ>>Ô–}ûöíìÙ³1Ý C³˜‹¥¦¦¿{÷ŽÚÙ›ššŒW­Zåàà@aY JMM¦¦æ¥K—(öX¾|yïÞ½ÝÝÝ©- ì÷PæìÙ³”Ïå{áÂE‹Q[¨",,ìââ²fÍÊ/¾;r䈟Ÿ_rr2µeàP¯8†NÉÏÏ×ÑÑ ÕÒÒ"Ý ´gæÌ™»ví¢¶lzzº’’µ5}`š¥ÀÐ)666šššxêûËËËÓÓÓ WWW'Ý p A°©ÀÀÀ„„„;w’n~MVVv×®]+V¬À'l`ìÀYYY666bbbbbb666ÙÙÙí¬»jÕª~ýúá)%ÀJåååk×®=sæ ¦}æ¿ÿþ{ccã… H7À®\YYijjª¯¯Ÿ™™™™™©¯¯offV]]ÝÖú‹-’’’ŠŒŒde“[·n>}:åÖóôèÑãüùó»wïÎËË#Ý ð:6=ÙéææãííݼdáÂ…k×®mCJëq˜Ë4551cfæÐÐPGGÇøøxÜÊqöíÛ}ïÞ=Òà¹sÀ÷îÝûé~J‡   RýçÊÈÈ5jTCCµe«ªª–/_~îÜ9¤/'Ú¹sgAAÁÕ«W™Q<>>žeû°i'$$èèè´\¢­­˜˜Hªà\+W®œ7o???µe7lØ`jjjaaAmY` ~~þË—/oÛ¶­ý‹Kº ´´tÊ”)ïß¿§¶,p%6 àÒÒRqqñ–K PRRBªàP¾¾¾›6m¢¶l```hh¨‹‹ µe•´µµ7nܸhÑ"jŸÜ¿ÿ#GŽ,_¾¼±±‘²À•Ø4€YcïÞ½|­!ÝP£¤¤dóæÍgÏž¥öð7//oåÊ•>>>¢¢¢–ÖÛ²eKÏž=)zÕ’%KÄÄÄNŸ>MmYà>lzµ‘´´t||¼´´tó’‚‚==½üüüö7ÄEXÐ,//ïáÇNNNÖ¤ÓéS§N?~<å³)999#G޼wïÞ¨Q£(,›œœaaaÊgn¡ÓéWƒŸ €K”””¬\¹òðáÃÖ,--µ²²rqq9r$…emõèÑÃ××÷É“'ÔNÝÔÔtìØ1LÍ?ÁÉÎVà0'²±±QRR:qâUëëëÍÍÍGŒqìØ1ªjGøô铉‰É­[·ÆGUÍ”””1cÆ„‡‡c>ŽƒsÀíñôôLOO§öðwÅŠbbbýõ…5# 6ÌÇÇgÞ¼y©©©TÕTUUý믿æÏŸ_[[KUMàt8ÔkŽ€9NAAAUU•²²2U÷íÛwÿþýðððvn~îvùòå¿þú+22RJJŠªšóæÍ›7onfã,ÌK$M+À<îÂ… ǧö8ÑÞ½{`[¸ €F£Ñ¾|ù¢¢¢²sçÎî—òôô\½zõãÇ‘¾Ð)BBB·nÝ·°°(++ëf5//¯ùóçPÒpêµGÀ\ïÀW¯^}ô葚šé^€#555mܸ1$$äáÇòòòݬöøñã‰' QÒP q°˜‹Õ×ׯX±">>þÞ½{$Ýp6WWWww÷   Ü;ÎÅ0 @²²2 ‹oß¾…‡‡#}¡û6nÜèîînnn~ÿþ}Ò½çA¯HKK366ÖÑѹ{÷.žqT±¶¶¾ÿþŠ+þþûoÒ½‡ÁXk+0Í}BBB.\¸gÏž+Vî¸PffæŒ3 O:…S¹\CÐÀ£^¿~ÝÍ xétúÑ£G-ZtãÆ ¤/0‰¢¢âË—/ËÊÊ&L˜™™Iºà ``_áááVVV999]®ðõë×éÓ§ß¿ÿÍ›7&&&Ôµð³>}úܼysÞ¼y†††Ý)•––¶víZŒÃq=0°©ÄÄD;;;___…®UxõêÕˆ#tttº£À/ñññmܸ1((hÆ ›7onhhèZAƒ½ÿ~ëÖ­Ô¶ì ì(//oÚ´iG555íÂæMMMGŽ™={ö©S§Ž9ÂÏÏOy‡m144Œ‰‰ùüùó¸qã¾|ùÒ… BBB÷îÝ Æ,•Ü  ìèéÓ§kÖ¬Y¼xq¶MOOŸ8qâ³gÏ¢££g̘Ayo¿$..þÏ?ÿÌŸ?ôèÑ—/_îB…¾}ûÞ¿ÿäÉ“·oߦ¼=`¸Ü·¸ šCÑéôK—.íܹsÛ¶m6lèÑŸ/°„„™‹/ÊÈÈtvóÄÄDEEEfô„™°X ̉233¿}ûvíÚ5 Òíüúúúƒž?þĉ .$ÝtnChSCCƒ››Û¨Q£&L˜ðêÕ+¤/°}ûö=|øÐÕÕuêÔ©];+ \  œ-**ÊÐÐðÑ£G¯^½Ú±c®·ö¤¯¯ÿöíÛ)S¦9r„’Ç §C§***Z¶l™••Õ† ‚ƒƒ•••IwÐ~~þM›6EGG¿~ýzøðá="݆òŽ=úìÙ³Ž¯_WWwüøqMM;}û&%%á¼pEEÅ   ww÷ 6L›6-))©S›×××ûöI½‹!€°cÇŽyzzjiiupý€€MMÍÿý÷åË—'Nœcj{Ì`aañáÇ)S¦L˜0aíÚµÏÔ€€“ââb¦¶¬’\\\.]ºÒ‘‡>þ|ôèÑû÷ï?{ölPPªª* :`õë×'%%ÑéôaÆ|èèè¸~ýú_ž¦æA³˜ˆÊÊJooï'NÈÊÊnÙ²ÅÒÒ’tS$egg»»»_»vmÖ¬Yë©€^IDATׯ>|8éŽx¦¢n–°råJEEŧOŸ^»víÅ‹3fÌ@úÈËË»¸¸¤¤¤ 2dúô鯯Æ>>>˜E‹k €¢££§M›öÓóÉëêênݺeff6yòd™?Þ¹sg̘1¤š`Oýû÷ß¹sgzzúöíÛ¯]»6xðà]»veffþwÍׯ_755±¾C茵¶CÐÔò÷÷_³fÍ… ¬¬¬K¢¢¢¼¼¼üýý‡îìì<{öl²MpŠÏŸ?Ÿ;wÎÇÇGKKkñâÅ666}úô¡Ñht:ÝÜÜ\PPÐ××WTT”t›Üç€Y L•ÆÆÆ;wÞ¼y3 @GG'''Ç××÷ÚµkuuuxÐ)@×ÔÕÕ=xðàêÕ«3fÌppp011ijjZ·n]xxx`` ššé¹˜¥ÀTIIIÙ²e˱cÇÂÂÂüüü>|ø`ccãàà`llŒS¼”(..öõõ½~ýz~~¾­­­­­m||ü®]»ž}úäïïïïïÿãlj'.[¶ÌÈȈtSÜÌRàîÈÎÎþ矢££'Ož~þü¹––Ö´iÓ&Ož}äååååååÿ—‚‚‚ŒŒ ???kzC³µ¿îúúúüüü¼¼¼âââÌÌ̼¼¼‚‚‚‚‚Ư=z0þ?ÉÉÉ1þ“)((ÈËË4ˆ .^莢¢¢œœœììlÆy·æ¯¿~ý*%%Åx·”’’8p ¼¼¼œœœ¤¤¤œœµSò!€YªS¿îªªª¢¢¢ÂÂÂââ⢢¢‚‚‚âââ¯_¿—””HII 4HRRRAAAVVvàÀdd­˜˜S–öÑéôÿý÷Úµkýû÷Ç4ÎðKÿþûïÇíììúõëG°†††ÜÜ\Fdggçææçää455 8PJJJRRRZZšñ…¤¤¤¬¬¬„„„¤¤¤„„DÇïºD³Tó¯ûû÷ï………¥¥¥ß¿/..nŽØ¯_¿2þÉ‹ŠŠètº¤¤¤ŒŒŒ”””„„ÄÀÿÒŒeŒ/ØpÐøû÷ïׯ_pttœ?¾ŒŒ 馀ÝÅÄÄ?~üÉ“'Ó¦M³³³›:uj˹iÙDEEcб¸¸¸°°°¨¨ˆñ¦ŸŸÏXXRRÂHbiiiiiiÆ›6#³ÅÄÄÄÅÅ%$$ ÀøÑÀ¬ÓØØÈÏÏ?`À€oß¾‰‰‰IJJ0 oß¾Œ­æ$ Æ¿‡ÎÂXUUµk×.{{{Ò½‡)))ñ÷÷÷óóûã?¦NJºNkhhhÏ-Ç/ËËËKJJŠ‹‹¿}û&(((..ž““ƒf>>¾¢¢" ^˜e ZUUUõíÛ7EEE&%¦l¤¤$G§oCCCTT”««ëÔ©S_½zEºà!õõõ7n *..&ÝK·ˆˆˆ(((0¯>˜ =zTBBâ·ß~ûòåËÊ•+µµµIw<¤¶¶VZZúüù󪪪ÚÚÚ{÷î%Ý›â’!謬¬ 6<}ú”F£Mž<ÙÝÝ]^^¾ËÕØa"ŽîÈÈÈå¸ùÞ€Ë466ÆÄÄäååYYY‘î¥ëpV{*++uuuW­ZE£ÑΜ9síÚµ÷ïßwù9ÒlÀ………ááá>|HHHøðáÃÔ©SOŸ>Mº)€® :qâ„––––––†††––{>îÜ77·˜˜ooïæ% .400X»vm× àšššV'` ;s挖–ãù_***lxƒ@G0IÎ8œHLL433Û³gé¦Zn©©éöíÛ§L™Ò¼$88øèÑ£!!!]+ÈúþôéÓþýûw‘gffš˜˜|ˆn  `UU•€€@ó’úúú>}úÔÖÖv¡Z^^Þ Aƒ†ÊxZÖ‰'þ»ZbbâØ±c¿ÿ.,,,((8bÄÆ%`?)..¾yó&ã’(Æ$L½¨€7eee¥§§1æ.œ8qâÈ‘#ÿ»Ú–ÿ×Þý…4õÿq?_~éÌËüC˜ )¦4‹„ Ô2Í@j éEW}««¢P¨ "¼ vaPBQ:B"Ä4•x‘*9Å?˜™¸Òó½PæÚfÊ~lïÏÖóqçÉêµÏù|ÎkŸ¶ýûoCCƒëÒ]WWwæÌï_khhhhhèêêúùó§¦i*J=ôEDD8N÷#N§322rÝ¿¨æý€RT^á°–} :˜” ¦‘Í_dó²Ù” ¦‘Í_ËÄ‘žžn·ÛÝôõõ™L&©<¬+ ¸  Àjµº±Z­………RyX—º»þ›5›Íååå•••š¦Õ××766Úíö¨¨(ÿþAe_ Q6˜F6‘Í?ÊfS6˜F6ñôŸ ›ÍöæÍ›””””””®®®¶¶6¿Û€ P÷I‡ eŸ‹)L#›¿Èæe³)L#›¿—í|O…OAþ¤•S6˜F6‘Í?ÊfS6˜F6(›ºO:cáp€C €@ € 0(`PÀ €@ €@ìÃ?^¤ùàp8ÒÒÒÔÉÖÑÑQ^^žšš™””tøðáÇK‡ZÑÞÞ^ZZºuëÖÍ›7ïß¿¿¹¹Y:Ѫ·oßVUUÅÄĨs*‡††JJJ¢£££££KJJ†‡‡¥­Rp¸–©<ÇT^›îT»¦£txQX–––òòòšššÔ‰š••u÷îÝ………ÉÉÉ–––ÌÌÌ+W®HçÒu]×4-;;ûÕ«Wsssf³ùÞ½{Ò¡V˜L¦«W¯¾ÿ^‘S9;;k4«««§¦¦¦¦¦ª««ÓÒÒæææ¤s­Pm¸\Tžc*¯M¯iAH¢ÊCUŠ:3`-µµµeeeºÚQ?~ü#B×uýÂ… KKK®ív»ÑhÌã“"§²®®Îb±¸±X,·oߖʳE†Ë%$昋:kÓEÁkZ’ðu„>¨üÕК¦õööžµŽ9òë×/éDž&''wîÜÙÞÞ.Ä“"§2""Âétºq:‘‘‘RyÖ¢Èpù¤æSvm*{M B¨òPUV__ôèQ麮ëÍÍÍt_9êLVwcccMMMIII×®]“Îò‡ÃqèÐ!›Í&ÄEN%üRyŽéê­ÍP¹¦é)EjÐläŇÃÌT˼³Æ/_¾xüNðƒé7›Í¶}ûö`¦Z¶V¶‘‘³ÙÜÚÚüHæúÓàGòïp8ÜŒŽŽ&$$HåY‹"ÃåA|ŽmÔÚô¦Î5m](‚¿ý°ûXüáw‚ÉýÿõÈ688¸cÇ÷¥‰¼Sy#ã¶oß¾ñññ`¦Zæ3Ûׯ_;VWW—››üH¦šôôt»Ýî~¤¯¯Ïd2Iå !*̱ ’Z›ÞÔ¹¦­+Ëöo/àxøðá¤ShÚ·MÒÑ|xýúõ®]»¤Shš¦ççç߸q#''G:‹ê ¬V«û«ÕZXX(•'T„ÖSgm†Ð5- E°±ò_$''çÑ£G£££N§óÓ§O555[¶léîî–Îå›:g0//¯¹¹yllÌétŽŒŒÜ¿?99ùÙ³gÒ¹t]×÷ìÙóàÁéëPäT~ûö-55µ¦¦ÆõAF£ñû÷ïÒ¹<)2\.*Ï1•צ7EÎlpŠ@‰‡ª”¶¶¶ââ⸸¸M›6%''—•• H‡Z“"“U×u›ÍvüøñåqKLL,))éèèµÂçSÏééié\º¾F6ÙHŸ?.**2 ƒ¡¨¨Èã,‡k™ÊsLåµéM‘œ"På-ÏüU¸ € 0(`PÀ €@ €@ € 0(`PÀ €@ €@ € 0(`«JKK/]ºä~äâÅ‹'NœÊ„±t]—Î@“““™™™Ož<ÉÌÌÔ4­§§'??¿¯¯oÛ¶mÒÑ€pÃÀª¸¸¸úúúŠŠŠÅÅÅÅÅÅŠŠŠÚÚZÚvÀ<={6##C×õ—/_>}úT:ž(`žÆÆÆrssgffl6[ZZšt ;;{bbâÝ»wwîܑބ'îøMkkëàà`qqqyyyoookk«t" <±°jzz:++«¥¥Åh4jšÖßß_PPÐÝÝ+ 7쀬ªªª²X,Ëí«išÉd:uêTUU•l* ,±@;`PÀ €@ €@ €€ÿ²Bgi™â*`IEND®B`‚gsl-2.7.1/doc/images/rand-levyskew.png0000644016036000116100000004650113373111455014552 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœìÝ{@Lyã?ðIéF¥R¡’\ª-JÖ¶(—"-&KbÖ¥ÖeÉڵصK–Ú¬‡ÜV¬]—‘,é¡Md©H’î µ-‰ ÝÔD÷Róû£ïožÙt›š™Ï™™÷ë/Μ™ónš™wŸs>sŽ—Ë¥€xõ#@¡€@€  @ €0(`PÀ €@€  @ €0(`PÀ €@€  @  {rrr·~úôéñãÇ«««kiiÍ;7&&†H0¹ÿ¯ÿþzzz“'OÞ¹sç‹/Ú­#ÄÍ ý1…þh} ´€€€cÇŽ—––Þ½{WAAaÚ´i¤Âp¹\.—[WW÷÷ßTWWÛØØ„…… ô bþ£AlÛ”—Ë%€êä䈽S ãââFÅ[âççççç'þ`n+33súôé·oß¶°°èËãq}aÝ@Ô0è«;wîØÛÛ+++ÿþûï4íñãÇVVV­­­íÖlmmµ´´”““‹ŠŠjwSVVÖСCß½{×nyUU•ÿ^û¾/11qÈ!ÇŽë,XVVÖèÑ£ùïRQQ1|øðææfþ…£G~ôèQw?7F£7nãÆû÷ïoû/oÄY]]½yóf333•NŸ>ýêÕ«¼x{³y÷ª¯¯_¿~½žž^‡{žëêêV­Z5xð`UUUWW×ììlÞMŽqy[ép[¼Õ"##TUUUUUø)rrr---»wï666îß¿ÿ¨Q£Ž9Ò“'@\èNï”ÜÜÜÁƒ‡††¾yóæÁƒ&&&qqq\.—Á`œ>}ºÝʧNš8qbhhè´iÓÚÝ´råÊ]»v½ÿø“'O>pà@O‚EFF>üÎ;]?~üíÛ·y÷:tèššZxx8oI\\Üĉ»Þ¿œœSSÓvëÌ›7oãÆÏŸ?ojjª¨¨ˆŒŒœ1cFgC£Ñ–/_ÞõýÍÑh4OOÏ8p@OOïéÓ§]¤â¿og7Ý¿_KKëܹseee¥¥¥gÏžÕÔÔLNNæ­öùçŸ÷ÝwOž<©©©¹}ûöˆ#þøãŸ€ÞAt¯‹^ºtéþóÞ¯\¹2kÖ,.—›’’bllÜØØÈ»©¡¡ÁÈÈ(**ª©©ÉÐÐðÑ£G¼›^¿~=hРÒÒÒ÷?;;{ôèÑ666[¶la±XÏŸ?ï0XÛD-þ[; vôèQ///Þr:~æÌWWWÞ’Å‹Ÿ:uªçOB}}ý€Ú­£¦¦Æß¦]?FÛ¿g«Ñh´ü‘ÿ¦;w.]º´‹T=)à¹sçþòË/ü7>|xþüù¼Õ~øáþ[£¢¢&L˜ÐáOÐ;(`€îuQÀ¦¦¦?æý·²²ÒÐаíßÎÎÎüƒ×   ›¶ûûû{{{ón ä5Êûš››oݺµ}ûvƒ¡¥¥5cÆŒââbþ`?ÿüó‚ jjjzŒÃáhjjVTTp¹\6›meeÅårÇWXXÈår+**ôôôêêêzþ$ÔÖÖª¨¨´[ÇÞÞÞÇÇçÅ‹=yöìÙ³ÎV£Ñh¼ñn›¼¼<}}ý.Rõ¤€‡Þö#óu¶ÑÊÊJMMÍ÷·Ðk(`€îuQÀJJJíëôë×¯í¦›7oêèèTWWs¹Ü·oßêèè\ºt©í¦òòr--­òòr.—ûîÝ»áÇ?xð 'Iêëë?ÿüóO>ù„¬©©iðàÁ¯^½êy0//¯¶¿ ¾ú꫽{÷r¹ÜŸþÙÏÏËå8p`ݺu= ÙÙÙ#GŽl·N~~þܹs•••ÇŒ³lÙ²+W®´¶¶vö8m?Eg›£Ñhõõõü7ÕÕÕ)((töh---=)àþýû744ðßÔÐÐпÞj---Ý@(ðzè^Ÿ¼–­­m[±íرcìØ±¼âr¹ÞÞÞ»wïær¹áááööö=SYY©®®ÎìäÉ“#GŽüûï¿{,66Ö¢¹¹Y__ÿåË—\.÷Å‹ÆÆÆ---–––l6»Ã{uö$ðæÛ­ÓÐЙ™yüøq;;»+Vtö8ÝŽb»4ˆÃá´»µw#àÂÂBþp‘„¯'€îuñÉ»`Á‚àààÎn SWWÏÉÉQWW?{ö,ÿM>444ljjš2eJ»›ø­_¿þÝ»wüK=zd``Ð.XddäСCïÞ½Û“`­­­#FŒØºu+ÿ\0ggç~øÁÁÁ¡³$> ™™™:::999]¬Ãår_¿~­ªªÚöoeeeþCãÝ‹¿DÛMOûñÇy{ìííí¯]»Æëwß}Ç»oÛzÿð‘#GæÍ›×“HB×@÷ºøä}ô葾¾þéÓ§_¿~]SSsëÖ­¶¹NmZZZF5xðà#F´ëQ.—ëììüí·ßêééµ+‰v›¶±±¹|ùrUUÕ›7obbb¬¬¬~úé§÷ƒÝ»wÏÀÀ ,,¬'ÁvíÚ%''wæÌÞ’Ó§OËÉÉqâDþŽlW ÙÙÙÇ ê6XQQ‘ººzÛñé6ÕÕÕúúúµµµÝ> JJJ:::ŽŽŽ~~~í¦YñòÄÅÅ1 mmmeeå‘#GnÙ²¥ªªªí¦ëׯ›™™ÉËËw±£˜ûﮩ©Y¹r¥¦¦¦ŠŠÊÌ™3Ûí$?|ø°™™™¢¢â°aÃvîÜÙö]êžlëòåËvvv 0`€]DDDgOl z §‰ ¦¾¾^KK+//ÏÐÐt7ÒdTUUÕ˜L&Ú@6¡€““kÛ›zúôiÒY€ ì‚ c  @ €0(`PÀ €@€  @ €0(`¨[À……… CCCCCCƒÁ`u¶fRR’···‰‰‰’’’Á´iÓÂÃÃùW{èãt…¢\SSãääD§Ó ètº³³s]]]‡+ûúúÚØØDGG×ÔÔEwA[XXdeeñ/a³Ùæææ=¼»­­mYYYg·¢>€8а››‹Åâ_Âb±ÜÝÝ{x÷ÄÄÄ1cÆtvëÅ‹'MšÔ§|}CÑöññILL àp8Çßß¿ítW¼øÏf5sæÌˆˆˆ²²²æææ—/_ž:ujåÊ•?ýôSÛ­ÎÎΗ.]*))inn~öìY@@À®]»x·AÑVWWMII122222JMM‰‰QUUípå­[·²X,sss;;»¨¨¨ððpWW×¶[·mÛjii©¢¢âè蘛››@§ÓÅøÓ´‡ùDÃ$,Ù!s“°¤ €0(`IõîÝ;ÿÑ£G«¨¨˜šš~÷Ýwõõõ¤CAO¡€@Ú¤§§¯]»vРAüßW¤r†ÂÂBƒ¡¡¡¡¡¡Á`0ŠŠŠz¸•ÿüç?/^??_IIID”””jkkyKš››ÕÔÔ» Üöà¼HÚÚÚQQQ&Là_:i%vA€L¸qãÆ²eË:»µëË›÷}ëIIIŸ|ò ï¿Ó¦MÛ¿¿··7¯}Å¡¸\nCCC^^ž¿¿¿‡‡ÇÙ³g)˜ÖÏÏOŽ???qþ°=„ÁœÀD÷×(**¾}ûvÀ€By4Aß­JJJÕÕÕýû÷oûozzú„  õõõE—AOOÍfëééñ–”””ØØØ÷âÁÓÒÒ<<<ž={FÁ´ #` ƒ~ñâEg·v=ÊéûÖõõõ_¿~ÍûojjjKK‹ºººH3XXXdeeñ/a³Ùæææ½ûÆŒÃß…O+ãPÀ@!...§OŸîìVQïP7nÜ_ýÅûïo¿ý¦¯¯Ÿšš*Ò nnn,‹ ‹ÅrwwïáÝÛý½òàÁ333ʦ…éú×ïÓ :;wî|öìYCCÃýû÷çÎÛëGëðÝÚÅ[øîÝ»zzz7nܨ®®Þ½{÷Ô©S¿ýöÛùóç¿{÷NtÞ¾}kbbâïï_YYYYY¹{÷nSSÓšššž¦ÑhÆÆÆaaaUUUoß¾ý믿LMMÏœ9C0­ôÝg>ºD`(`‘zöì™———ŽŽŽ¢¢â¸qã.\¸ è#t1ب¨¨ÐÒÒêâ¾çÎ;v¬¢¢¢™™Yvv6‡Ãiû°3pßûyöìÙܹsÕÕÕÕÕÕçÎûüùsÞM]¦ÑhëÖ­300——WWWÿè£ÂÂÂ*Ä´RItŸù˜O$0LÂ\‡~üøñáÇIé©®ããH 0 @Nž<¹bÅ Ò) q¡çðדÀð''P>ŽÄ#`hí+ÑPÀ €@€  @ €0(`PÀ €@€  @ €0(`PÀHj2 ƒQTTÔÙšIIIÞÞÞ&&&JJJÓ¦M gT€÷Id×ÔÔ899Ñéô‚‚‚‚‚:îìì\WW×áʾ¾¾666ÑÑÑ555=Ú¼yóîÝ»wìØ!æÌüä¸\.é  JKK á-Y²d‰½½½¯¯oOîþôéS[[[‡Ó»­ËÉI䓽 ºÏ|‰GFF2™Lþ%L&3""¢‡wWTT”——A.€ž’ÈÎÎζ¶¶æ_bee•““Óíß¼y¿páÂ5kÖˆ,@÷$roª’’Rmm­¢¢"oIss³ššZcccgw‘““ãý{úôéׯ_ïõ » dvA÷—Ëår¹¥¥¥¡¡¡ÙÙÙþþþ¤€L“ÈÖÔÔ¬¬¬ä_RQQ¡¥¥Õíuuu===CBB~ûí·nWöóó“ëHïsüYÀYYYüKØl¶¹¹yïnkk[VVÖíj~~~ÜŽô&1À¿Id»¹¹±X,þ%,ËÝݽ‡wOLL3fŒrô”D°Obbb@@‡Ãáp8þþþm§»â­À¿£xæÌ™eeeÍÍÍ/_¾óÑ%Cƒ¤8vìØÎ;™L¦œœ\»[SRR6mÚ$//þüy===" ¨—#ÁlÛ¶íСC÷îÝûì³ÏÞo_fggëèèhkkËf³ÅŸ@Æa0'0Œ€ú‚‚‚Nž<¯©©ÙíÊaaaëׯ sttC6É‚]Ð‚Š»|ùòƆÚûܺuËËË+**ÊÖÖV¤Ù$ ˜BPÀ@e………vvvW¯^µ³³èŽþùçêÕ«ïܹcff&¢l’HtŸùø€ôhmm]²dÉW_}%hûÒh4ww÷ÒÒÒ¹sç>xð@MMMñ€sÃ(ëøñã!!!wîÜéׯ—ó+W¯^]QQqñâÅçmÈ ì‚¦0PSEE………Å_ýeeeÕëilltttd2™ëÖ­b6É…¦0PÓš5k:ÔÇÇÉËËûðÃcbb>øà¡h(` AåååMœ8ññãÇ=ùÞQ·X,ÖþóŸÔÔT%%¥¾?€DÉ8 +;wîôõõJûÒh4&“9räÈ€€¡<tƒ9a T“““3uêÔ¼¼>~áÂ…:::tppxÿ;‘rïqvѺ|ùòäÉ“Åܾ4ÍÒÒrÊ”)ÁÁÁbÞ.€T¢h×ÔÔ899Ñéô‚‚‚‚‚:îìì\WW×áÊ“'O.//¿råJqqñáÇýüü~ûí·vëpÿMô?€]¼xqÑ¢ED6½}ûöýû÷×ÖÖÙ:€4¡èÞÔ   ´´´Þ’%K–ØÛÛûúú¾¿ò7ß|óóÏ?óƵl6{þüùyyy¼„»» ¬¶ýÏ………DxzzÒéôo¾ù†ÈÖÄLævAGFF2™Lþ%L&3""¢Ã•÷îÝË¿WyäÈ‘]ì¯t‘‘‘ü1©ö¥Ñh?üðÁ}GÑÎÎζ¶¶æ_bee•““Ó“û^¿~ÝÒÒ²ÝÂ!C†(**êëë{yyåææ -(€Ø]ºt‰Á` `nnîèèøë¯¿Ì (ZÀ§ÝåÏ´µµ+++»½ceeå¶mÛ8À¿ÐÝÝ=,,¬ºº:%%ÅÎÎnòäÉ™™™BN uuu±±±sæÌ!cÛ¶m{÷î­¯¯'@¢Q´€{§´´tÞ¼yÁÁÁŽŽŽüË#""•••‡úå—_úùùmݺµÛGóóó{ú4fPY7nܰ³³#~u^kkk;;»S§N‘ Ñ(:ŸHOOÍfëééñ–”””ØØØwv——/_Ξ={ß¾}ÎÎÎ]?xii©©©iMMMï²a´råJkkëg#ŠÙƒ-ZôäÉÒYDHæ&aYXXdeeñ/a³Ù]\ŽôÕ«W®®®û÷ïï¶}i4ê$Tkkëµk×fÏžM:F£M˜0ÁØØøÂ… ¤ƒH*а››‹Åâ_Âb±ÜÝÝ;\¹¬¬ÌÅÅ%00ÐÉÉ©'~ñâÅI“& !%€x¥¤¤hkk›šš’ò¶lÙ²gÏüE Ð;-`ŸÄÄÄ€€‡Ãápüýý“’’¼½½y+ð‹uqqùî»ïfÍšÕáC9;;_ºt©¤¤¤¹¹ùÙ³g»víúé§ŸDþ3[TTE†¿mfΜٯ_?\' w(ZÀêêê±±±)))FFFFFF©©©111ªªª®œ‘‘áééÙnªTUUUÛ­Û¶m µ´´TQQqttÌÍÍMHH Óébüi„ãêÕ«nnn¤SüœœÜæÍ›÷ìÙC:€DÂ|"aQRRbaaQVV&//O:Ëÿ¼{÷nôèÑçÎspp @$dn´sóæMgggJµ/FSPPøúë¯1è0€døë¯¿¦OŸN:E–/_ž””„Ì  ¸\nLLÌ´iÓHéÀ€V­ZÕîôsÐ-ÎŽƒøeff.Z´ˆ²£ÌòòòQ£FåææòŸ<@:à0€Lû믿f̘A:E§ttt,X€Ë3 nݺEÍýÏ<_~ùåÑ£GI(`ªkjjzðàÁÇL:HWÌÍÍétú¹sçH(`ª»ÿþرc D:H7¾úê«ýû÷c†@¡€¨...nêÔ©¤StÏÙÙYAA᯿þ"@2 €¨.66¶‡!nãÆAAA¤SH|£F`øˆS]]žž^IIIgçB§”¦¦&ccãèèh+++ÒY„_CQmבˆö¥ÑhJJJk×®=|ø0é  @iwîÜ‘ˆÀ<«V­ ///'€êPÀ”ïèèH:…ttt<<<Ž;F:Õáp¦Àp Ħ¡¡AWW·¤¤DEE…tüóÏ?S¦Lyö왲²2é,}…cÀ²())éƒ>¬ö¥Ñh£G¶¶¶¾páé ”† .‰ÛÿÌóå—_âúH]CPW||<ÅÏ@Ù—–––;wî@]8œ)0ñhnnÁ1`™“žž>bÄ m_Æd2Ÿ>}J:E¡€(*11ñÃ?$¢÷ °bÅŠ_~ù…tŠBPTBB¤I“H§è“uëÖ±X¬·oß’@E(`Šºÿ¾¤°¡¡á´iÓNŸ>M:¡€¨èéÓ§rrrFFF¤ƒôÕ† >ÜÚÚJ:å €¨H †¿m&Nœ¨¥¥E:å €¨(!!á£>"B8¾üòK\$à}(`*JJJš8q"éÂááá‘———™™I:µ €(§ºº://ÏÚÚštáPTTüâ‹/pfJ€vH€öRSSǧ¤¤D:ˆÐ|þùç#GŽ,))2dé,T0åÜ¿_jö?·ÑÔÔ\´h. À @9III¤SÙ—_~yìØ±††ÒA¨ @9ÉÉÉÒWÀffft: àAPK~~¾¢¢¢¡¡!é ·aÃLÅàAP‹Tîn3cÆŒ¦¦¦¸¸8ÒA( @-ÉÉÉ&L B$äää0àAPvaxÇ IDAT˃¤µ€i4“ÉLNNþçŸH  @!ÍÍÍ=²±±!DT”••½½½9B:y(` ÉÊÊ255USS#D„Ö¯_ZQQA:a’ZÀ……… CCCCCCƒÁ`u¶f||üÂ… uttèààpåÊqæHrr²½½=颥««ëææöûï¿“@˜DpMM““N/((((( ÓéÎÎÎuuu®|ØÏÏï·ß~s`€JMMµµµ%Bä6nÜxäÈ‘ææfÒAH’ãr¹¤3,(((---$$„·dÉ’%ööö¾¾¾ï¯üÍ7ßüüóÏrrrmÿe³ÙóçÏÏËËëõÖåä$òI‰`ii2nÜ8ÒADÎÉÉÉÇÇÇÓÓ“t€nˆî3_"GÀ‘‘‘L&“ “ÉŒˆˆèpå½{÷òÚ—F£9²‹ýÕUWWXZZ’"_}õÕþýûI§ I" 8;;»Ý•Ú¬¬¬rrrzrßëׯËÈHœôôtkkk™¸FÙ¬Y³ª««ãããI F" ˜Ãáhiiñ/ÑÖÖ®¬¬ìöŽ•••Û¶mÃy€šdäp›~ýúmܸqß¾}¤ƒ#‘Ü;¥¥¥óæÍ vttìÉú~~~ruNY©©©ãÇ'B|˜LfRRNÊ2K" XSS³Ýx·¢¢¢Ý˜¸—/_Μ9sûöíS§NíáVüüü¸é}n€.¥¦¦ÚÙÙ‘N!> X³fMPPé dHd[XXdeeñ/a³Ùæææ­ÿêÕ+WW×ýû÷;;;‹>@o¼y󦬬lÔ¨Q¤ƒˆÕ_|qáÂ…’’ÒAÈvssc±XüKX,–»»{‡+—••¹¸¸:99‰%@o¤¦¦ÚØØôë'‘oÉ^ÓÑÑY¸pá±cÇH @"¿ÒZ]]mmmííí½fÍvôèÑS§Neee©ªª¶­Àÿµ-:¾yóæE‹ këø0ˆB```EEÅÞ½{I·üüü‰'æççóÞ¿”‚ïÿ‹ººzlllJJŠ‘‘‘‘‘QjjjLLLgïÞŒŒ OOÏv©ªªªÄœ kiii25‹gĈŽŽŽ§OŸ&@Ü0˜FÀ #FŒˆŽŽ–µcÀmxð€t1é´€_¼xáããc``:eÊ”¨¨¨âââââ⨨¨É“'Ÿ;wÎÀÀÀÛÛûÅ‹⌠}ªªªÊÊÊFM:aŠŠŠ›6m $@L:]=`À“ýû÷»¸¸t¸Âõë׿þúëgÏžÕ×׋2!åàkH \±±±;vì¸{÷.é ä544˜ššÞ¸q× ê ð5¤… ¦¦¦vÖ¾4ÍÕÕ555uáÂ…¢ˆ ;ÒÓÓét:é” ¬¬¼nÝ:<È& æ†0———׌3>ûì3ÒA(áÍ›7#GŽLII166&€FÉ8¤XZZFÀ<\µjÁ º/à ”••µ[Èáp<==E @†ÔÖÖ3†t Ù°aÃ… Š‹‹I­î ØÄÄÄÊÊ*$$„·äæÍ›ãÇ755e0™••eaa¡¨¨H:…èèè,]ºtß¾}¤ƒˆVvmgddx{{ëëë>|8++ëØ±ccÇŽC> Â1`¢#GŽøûï¿uttHgYGø°Mrrò”)Sœœœ>øàƒÛ·oËlûÎÕ!}}ý $„¢ž>}êàà——7pà@ÒY@v‘<üüùóÌÌL^ûÒh´iÓ¦¥¤¤<~üXdwÍÔÔtÖ¬Y‡&@$0˜FÀ ,¾¾¾ÆÆÆ_}õé ÔõäÉ“>úèñãÇ)8€JOOǸkfff®®®8 R©Ó^¾|y]]]×w®««[¾|¹°#È.—ûðáCkkkÒA¨ÎÏÏïÈ‘#˜ Ò§Óþã?ìììnݺÕÙ 7oÞ´³³ûã?D @Ê=}úTSSSKK‹tªk›D:€uZÀ?ž0aÂìÙ³'Ožœ››[]]]]]ý÷ß=zÔÑÑqΜ9˜ŠÐ;¸ aÏýðÿüòKyy9é ÂÔͱåòòòÐÐи¸¸ŒŒŒ¶W¿®®.Nwvv^´h‘¶¶¶¸rR&aP|÷ÝwÊÊÊÛ·o'D2¬^½Z[[Ûßߟt9¢ûÌG—  B1kÖ¬Õ«W»»»“"ŠŠŠlllrrrtuuIgÙ‚YÐÒ&33'¡ì¹aÆ-Y²$ €t¡éQçåå1™LEEE&“™ŸŸ/êdR¬¬¬¬©©iøðᤃH’ï¿ÿ>$$> 5º/à‡~ôÑGfffwïÞ}ûöíÝ»wGŽùá‡fgg‹!€TJOOÇðWPƒ^·nÝ?þH:€pt¿kÛÅÅeöìÙëׯç_xðàÁèèèëׯ‹2Eá0ôÝž={ÊÊÊpÍyAÕÔÔ˜™™EGGãûÓ 6$ß½{÷ÓO?m·páÂ…ñññ¢ ²²²P!½ ¦¦¶yóæ;v Ýpÿþý;\>`Àa‡(à^[»vmffæýû÷Iè«î xþüù/^l·ðÂ… C4‘¤\}}ýóçÏÍÍÍI‘Hýû÷÷óóÛ²e é }Õ}|øÇ€¨‘œ„ÅíQ$Vl6ÛÊÊŠt Éæââ2|øð'NÐ{8€¸effâ2À}wàÀ;wVVV’ÐKØ›*0삆¾hmm4hPAA¦¦&é,oÕªU{÷î%¤.Æ@!(`苼¼¼éÓ§?{öŒtiPVVfiiyÿþ}SSSÒY@jÉâÅ  ††††††ƒÁ(**êbåôôôµk×4¨Ã)crïYj€ndddà$”¢««ûõ×_óÍ7¤ƒôE ¸¦¦ÆÉɉN§´]¸®®®³õ—.]ª««{ïÞ½ÎVÀ¬1 œ‚C¸6nÜøðáÃ[·n‘ 0ŠîM JKK á-Y²d‰½½½¯¯o×wìp_pw `4ô…»»ûòåËçÍ›G:ˆô¸téÒîÝ»ÓÒÒäååIg)$s» ###™L&ÿ&“‰ï݃À.h¡óððÐÓÓûõ×_I E 8;;»Ýn:++«œœœ^?à!Cõõõ½¼¼rssû 7***ª««I‘6ûöíÛ¹sgEEé  hs8---þ%ÚÚÚ½þŸ»»{XXXuuuJJŠÝäÉ“333…@0YYYVVV˜(t–––‹-Ú¶mé  èáL%%¥ÚÚZþ“Ì577«©©566v}Ǟ쬎ˆˆˆŽŽîz5??¿;wvx5Ÿ4 ¾   gÏž:tˆt)ôæÍ ‹ÿþ÷¿ööö¤³€T‘¹cÀšššíÆ»íÆÄ½6þü„„„nWóóóÃy7A¸233qXD¸gÏžµk×¶´´ÎÐ#-` ‹¬¬,þ%l6[X—oC‰)™™™ø’èxyy 8ðøñ㤃ôE ØÍÍÅbñ/a±XîîîByð‹/Nš4I(ÐsMMMyyy¤ƒH³àà`??¿ââbÒAºGÑöññILL àp8Çßß?))ÉÛÛ›·Bϧ±8;;_ºt©¤¤¤¹¹ùÙ³g»víúé§ŸD S999&&&ÊÊʤƒH³Q£F­X±bË–-¤ƒt¢¬®®›’’bddddd”šš£ªªÚÙúüç˜lw¾ÉmÛ¶…††ZZZª¨¨8::æææ&$$Ðét1ý$ÿ.‚$Û·oOLL¼qãé Ý è,h*Ù° w6nÜhhh¸iÓ&ÒA¤_llìÊ•+>|¨¦¦F: H<™› }Ú¾L:…Lprrúøã·oßN:@W0˜FÀÐ;ƒÎÉÉÑÕÕ%D&TTTXZZþ÷¿ÿ8q"é, Ù0l………JJJh_±ÑÖÖÞ¿ÿªU«šššHgè @²²²p 1óôô466  c(`qÈÈÈÀhñ;~üxpppZZé @ˆ›ÍÆ ,ñÓ××ß»wïÊ•+±#( ¸ 0)L&ÓÔÔt×®]¤ƒ´‡ ½Ã,hÔÛ·o «ªªäååIg‘E%%%666¸PôfAH06›mii‰ö%eÈ!‡f2™uuu¤³ü @ä0‹8{{{œ#( r˜E‡ŠŒŒ¼~ý:é ÿ r¸ 0 4ˆÅb­\¹²¤¤„t “°z“°@ ïÞ½8p`YYY—ó±Ù¾}{rròµk×úõÃðz“°$Unnî°aÃо±}ûöÚÚÚ½{÷’€±ÌÌL|˜:BCC8pÿþ}ÒY@Ö¡€D L5Æ ;qâ„§§gEEé, ÓPÀ¢…¦ 77·O?ý”Édb>„­¬¬,L¦ ÿ7oÞìÙ³‡t] ¤H³¢¢"yyy}}}ÒA =EEÅK—.ÙÚÚŽ?~úôé¤ã€,Â@„p`*2d‹ÅZ¶lYQQé, ‹PÀ"„Àçää´qãÆùóç××דÎ2 Bééét:t èʦM›>øàÒA@æ €D(==—a ¾£G>~üxÿþý¤ƒ€lÁY†SQBq8ccc‡ƒ³R_aaáĉO:5cÆ ÒY€Zp*JÉ“™™iee…ö•Ç¿xñ"“ÉÌÉÉ!d>D—–,“&MÚ·oßœ9sÊÊÊHg™€°Äñòòúì³ÏæÌ™SWWG: H?0€¨ €%ÑöíÛ-,,/^ÜÒÒB: H9Ì'&aAOÔÕÕéèèp8%%%ÒY@0ÍÍÍsæÌ111 &ÈÃ$, óðáÃ1cÆ }%QÛY*SRRvîÜI: H3œ @$p ‰¦¦¦víÚµ>úHGGgíÚµ¤ã€tBˆNÁ!étuuoܸññÇkkk/\¸tBØ éééãÇ'úÄÄÄ$::zÆ ׯ_'¤æ “° [MMMšššååå***¤³@_%&&Λ7ïÒ¥KŽŽŽ¤³˜„ I²³³MLLоÒáÃ? õððHJJ"¤ @ø2220Kš8;;Ÿ9sæ“O>yðàé, =PÀ‡)ÐÒÇÅÅåôéÓŸ|ò ÆÁ ,’ZÀ……… CCCCCCƒÁ`u±rzzúÚµk $'''¶„ Ë0Z*¹ºº¶uðÝ»wIgi ‘\SSãääD§Ó ètº³³sçn]ºt©®®î½{÷ÄdVKKËÇQÀRÉÅÅåüùó±±±¤³€Ä“È ½AAAiii!!!¼%K–,±··÷õõíúŽB™Ì†YÐеG1Œþù‡t•»wïzxxœ9sÆÅÅ…t9Ì‚þ—ÈÈH&“É¿„ÉdFDDÊÀ/-- ß–nŽŽŽË–- '$˜Dž +;;ÛÚÚš‰••.£ –7nܘ5kVUUÕÊ•+Ilj$‘#`‡£¥¥Å¿D[[»²²’T~(`amm}ûöíÀÀÀ;và°ô‚D°xøùùÉu„t. ´––6›ï É33³{÷îEGG¯X±¢¹¹™t0YÀšššíÆ»íÆÄ}çççÇíˆp·R&''ÇÐÐPCCƒt]]ݸ¸¸ŠŠ WW×·oß’Ž’D" ØÂÂ"++‹ ›Í677'•€§àA***—/_633›2eJqq1é8 1$²€ÝÜÜX,ÿ‹åîîN*OZZš­­-é nòòòÁÁÁ ,˜0aBZZé8 $²€}||8‡Ãñ÷÷OJJòööæ­€#µ@Jjjªé@Æ·ß~{èСY³f]¸ptYÀêêê±±±)))FFFFFF©©©111ªªª­Ï? s©@tš››q,7wîÜ›7o~ûí·?üðCkk+é8@i8©“Àp&,èLFF“É|øð!é @Xyyù§Ÿ~ªªª2hÐ Òq Op&, ’’‚ýÏ@£ÑtttnÞ¼9jÔ(;;»G‘Ž…0ð(((ìß¿ßÏÏÏÉÉéܹs¤ã¡€„ íxyyݺuk÷îÝ+V¬èâŠm ›PÀÂQWW———geeE:P‹••UjjjKKË„ p,à‡ŽŒŒ %%%ÒA€rTUUÏœ9ãëëëèèxâÄ Òq€*PÀ‘œœŒýÏП۷oÏ;·¼¼œt  ÉÉÉ&L (ÍÜÜ<))iôèÑãÆ‹ŽŽ&ÃWZ†ïC‡FŒqýúõÑ£G“àöíÛË–-›3gΞ={TTTHÇ®à{À”VVVVUU5jÔ(ÒA@2L™2%33³ªªjܸq‰‰‰¤ã(`!h;ŒSœBÏ 4èìÙ³{öìñððؼysCCéD n(`!À`èyóæeeeŒ7.!!t+0€yòdKK éPÐ'(`€>Á ,§áÇŸ;wîòåËgΜ±¶¶¾rå éDÐ{˜O$0LžwïÞiiihjj’Î2çÚµkÛ¶mSVV˜:u*é8R “°¨(##ÃØØí DÌš5+--Í××÷óÏ?Ÿ9sfJJ éD 0@ïݽ{×ÑÑ‘t ]ýúõóôôÌÉÉ™?¾‡‡‡››[FFéPÐS(`€ÞKHHøè£H§Y§¨¨¸jÕª'Ož¸ººº¹¹-Z´(''‡t(è  —¸\î½{÷PÀ@JJJ_|ñÅãÇmmm-Z”M:t ÐK?VQQ6lé ÿ£ªªºiÓ¦¼¼¼ñãÇ;;;ÏŸ?dž)  ÐKwïÞÅð¨IUUõ›o¾ÉÏÏŸ:ujÛ±áí¡€zéÎ;S¦L! S***ëׯò䉛››§§çÔ©SoܸA:ü¾Ò*0|Ú ><66väÈ‘¤ƒtïÝ»w.\ TRRÚ²e‹‡‡G¿~€õˆè>óÑ%CFËÏÏÿøã_¼xA:€¸\nTTT```IIɆ –/_®¦¦F:ÕáDÔrûöíÉ“'“N 99977·„„„³gÏÞ½{wĈ;vì(++#KF¡€z€A¢Mœ8ñâÅ‹÷îÝ+--3fŒÏãÇI‡’9(`€Þ¸sçFÀ éÌÌÌŽ;öäÉ“¡C‡:::2Œ»wï’%Cp8S`8 OŸ>ýøãqit&µµµ,ëàÁƒjjj7nüôÓOI‡¢ ˜˜gggÒ)„IUUuÍš5ÿýw``àü1|øp??¿×¯_“Î%ÍPÀCƒ´’““›6mZddä7 Gåã㓞žN:—tÂÞTa´Œkmm2dHzzúСCIg­²²²“'O;vÌÐÐpýúõóçÏWRR"JÜdqtaa!ƒÁÐÐÐÐÐÐ`0EEE½^Yî="ÎÒŒÍfkii¡}AèêênݺõéÓ§›6múý÷ߌŒ¶oß^RRB:—” h×ÔÔ899Ñéô‚‚‚‚‚:îìì\WW×땹ÿ&–¤ö?ƒ¬‘——Ÿ7oÞÍ›7oß¾]QQaaa±xñbÌ—î;ŠîM JKK á-Y²d‰½½½¯¯o/Vîì‚–q®®®>>>óçÏ'€Œ7oÞœ9sæØ±còòòëÖ­[ºt©ŠŠ éP"$s» ###™L&ÿ&“Ñ÷•ú¢¡¡!11#`eôõõÍÎÎ>tèPtt´±±ñæÍ›óóóIç’<-àììlkkkþ%VVV999½^yÈ!ŠŠŠúúú^^^¹¹¹B 2">>ÞÊÊjàÀ¤ƒ&''7uêÔË—/'%%Ñh´‰'ºººþùçŸ---¤£I Š0‡ÃÑÒÒâ_¢­­]YYÙ»•ÝÝÝê««SRRììì&Ožœ™™)ŠØ õ¢££]\\H§ #FüüóÏ‹/ 1b„ŸŸßóçÏIç’=œ©¤¤T[[Ë–ææf55µÆÆÆ>®L£Ñ‚ƒƒ#""¢££»Îàçç·sçÎo¢æ“b`aaÁb±ÆO:EeeeýþûïçÏŸ···_»v­«««¤_÷Pæ.G¨§§Çf³õôôxKJJJlllŠ‹‹û¸2F+--555­©©é]6LÂ’Y………vvvÅÅÅ’þ j .\.--]±bŲeˆ F:T/ÉÜ$, ‹¬¬,þ%l6ÛÜܼï+Ó0~…ÞŠŽŽž1cÚ [ÊÊÊŸ}öYRRRxxxÛˆÈÝÝ=** GˆùQô£ÄÍÍÅbñ/a±Xîîî}_™F£]¼xqÒ¤IBÉ 2åêÕ«³gÏ&@’Ðéô_~ù¥¨¨hÞ¼yþþþFFF?üðC×'V’!\Jzûö­‰‰‰¿¿eeeeeåîÝ»ÛvóVàOÞõÊNNNaaaÅÅÅMMMùùùþþþƒNKKëu6Ê>i Rµµµ¬ªª"@‚eggûúújkk»ºº†……566’NÔ=Ñ}æSt¬®®›’’bddddd”šš£ªªÚ‹•·mÛjii©¢¢âè蘛››@§ÓÅøÓ€4ˆ‰‰±µµÅúÂÜÜüàÁƒ………‹/6lØ×_ýøñcÒ¹ÈÀ|"a–lòññ±´´Ü°aé ÒãÙ³g'Nœ8uêÔèÑ£W¬XáááAÁ“jÉÜ,h*CË ÖÖÖ¡C‡Þ»wÏÄÄ„tiÓÔÔtõêÕS§N%&&zxx,[¶lâĉ¤Cý ˜BPÀ2(11qõêÕl6›tiöêÕ+‹uêÔ)¶xñb&“I…?yeîkH”réÒ%ƒA:€”300غuë?ÿüsöìÙÊÊÊ &8;;Ÿ;w®¾¾žt4‘À`N`Ë.—kll|íÚ5 ÒYdHcccdddÛ®é9sæ|öÙgS§Nÿñ± šBPÀ²&))iÅŠ] D­´´ôÂ… §Nâp8‹/^¼x±¥¥¥Ø¶Ž]ÐÄ\ºtiÁ‚¤SÈ.===__ߌŒŒˆˆˆ–––Y³fY[[ïÙ³§°°t´>Á`N`Ë.—kbbùÁÎ4ÖÚÚš>vìØÅ‹/X°@[[[D›Ã.h AË”øøøuëÖaþ3555ݸq#44ôúõëŽŽŽ‹/vwwïì”M½†¦°LYµî™ ÞIDATjÕˆ#¶lÙB:tª¦¦æÊ•+¡¡¡÷ïߟ5kƒÁpuu0`€PL!(`ÙÑØØhhh˜‘‘!¹WR)åååááááááiiinnn ,˜>}º²²r_L!(`ÙqåÊ•ƒÆÅÅ‘‚)-- ÏÌÌtqqùôÓO]]]{×Ä(` AËŽyóæÍ™3gÅŠ¤ƒ@/•••]¹råÂ… ™™™³gÏž?þôéÓ:NŒ¦°Œ())177/,,TSS#úª¸¸øòåË—/_NNNž4iÒüùóçÎ;xðàn°ŒØ³gO^^Þ‰'Haª®®¾~ýzxxø7ÆïæææææfffÖÙú(` AË.—;zôè³gÏN˜0t‰úúú›7o^½zõÚµk***nnn³gÏvttTRRâ_ L!(`Y·aÃ|ý@p¹ÜÌÌÌk×®]½z577×ÙÙyÖ¬Y³fÍ2d L)(`Y0oÞ<—U«V‘bU^^~ýúõ¨¨¨›7ošššÎœ9ÓßßL(`©—ŸŸïààðüùsÒY€ŒwïÞÝ»wïæÍ›(` AK½70 €t » ),ݪªªFމ³_@\Ž@L:äîîŽöQÃ`N`K±ÚÚZSSÓøøøQ£F‘Δ€0€8üòË/NNNh_ 憰´ªªª=zôíÛ·ÇŽK: PFÀ"èîîŽöñÀ`N`K¥—/_Z[[gee’΂0€hmÞ¼yÍš5h_ 憰ô‰g2™ÙÙÙ]%dFÀ¢ÒØØ¸zõêÇ£}@œ0˜FÀRfóæÍùùù—.]"¨HtŸù ¢xPI‘’™™I:Èì‚ÙU^^¾dÉ’ßÿ]WW—t9(`Q---K–,a2™®®®¤³€,ÂáLá°tøâ‹/òóó£¢¢úõß¡Ð)¦;v$$$ܹsí ¤ €Aæøùù]¸p!>>~РA¤³€ìBƒ inn^¿~}jjj||<&^Y(`¥¥¥Ÿ~ú©††F\\œºº:é8 ëdâXaa!ƒÁÐÐÐÐÐÐ`0EEE¤¸…‡‡ÛØØ899EDD }€ ¤¿€kjjœœœètzAAAAANwvv®««# Ä$??îܹ۶mûïÿ»cÇ̺Šþ£'N888lÛ¶MSSSSSsÛ¶mööö¿ýöé\ rÿý····½½½ƒƒCVV–ƒƒéDÿ#ýÉd2ù—0™ÌˆˆRy@Ôž>}zèСI“&9;;6ìŸþÙºukÿþýIçøé?§„žž›ÍÖÓÓã-)))±±±)..îÝâDTóúõë'Ož°Ùì”””¸¸¸†††Y³f}òÉ'... ˜f}"ºÏ|éï%%¥ÚÚZEEEÞ’ææf55µÆÆÆÞ= X<š››‹ŠŠŠŠŠš››ß¼yÓÚÚZWW×ØØøæÍ›ªªªâââׯ_—””äååÑh4333KKK[[[GGGKKKÒÙ@zˆð3Ÿ+훚šø—455)))u{Ç;vˆä‰"¢z’þÁœŒì‚¦f*‚ ÁEÍ`ÔLEC0Á‰.˜ôO²°°ÈÊÊâ_Âf³ÍÍÍIå ÉB»¹¹±X,þ%,ËÝÝTš,Lª®®¶¶¶ööö^³f F;zôè©S§²²²TUU{÷€ÔÜOBÍT4‚ ŠšÁ¨™Š†`‚Ã.èÞSWWMII122222JMM‰‰éuûEÿâ 2jþ™FÍT4‚ ŠšÁ¨™Š†`‚]0y???Q<®t›2e é f*‚ ÁEÍ`ÔLEC0Á‰(EÿânÒ €‚PÀ €@€  @ €0(`PÀ €@ Lî=¤µWRRbffF‘`IIIÞÞÞ&&&JJJÓ¦M 'ŠF£Ñâãã.\¨££3pà@‡+W®NôÒÓÓ×®];hÐ Šü  ††††††ƒÁ(**"èÿPí‰jCÙ×e߉ü(õÙ%Žz.ˆâOZkkëŒ3BCC)’ÓÎÎîÈ‘#¹¹¹7nÜ7nÜöíÛIçâÒh´©S§&$$ÔÖÖ&''[[[Ÿ8q‚t(.—Ë577ß±cÇ£G¨ð¬®®655ݽ{weeeeeåîÝ»ÍÌÌjkkIçâr)öDñPöuEÙw"Õ>»Äƒ?§d¡È‹£3ûöí[ºt)—Â9óòò D:wÓ¦M­­­¼ÿfee™ššÌó>*ü÷ïßïååÅ¿ÄËËëàÁƒ¤òtˆ Oõ_W<y'òPí³K 1p9BQöªÑ4-33ÓÓÓ399Y]]²9 étúëׯIù—ºº:MMÍÆÆFÒAþ‡ ¿A''§­[·Î˜1ƒ·ä¯¿þÚ³gOLL ÁTíPá‰ê _W<”z'Rð³K 1p ¸7† ¢¨¨¨¯¯ïåå•››K:Îÿ©¯¯g2™§NRWW'¥coÞ¼i;B¶fÍÒYÚ»~ýº¥¥%锓mmmÍ¿ÄÊÊ*''‡T‰CÍ×ÕÞ‰”ýìùG½¨‡ØÒÇÝÝ=>>¾¾¾¾¨¨(((HWW7##ƒt(.—Ë]½zõ?þÈû/¥~¹ü/¹éÓ§¿{÷Žt¢©¨¨=zt||<é ÿB…ß ¢¢bSSÿ’¦¦&%%%Ry:D…'ªC|]QóHÍÏ.1|ÔSâç”hG9s&éÜ+W®8::ò¿(ò"æWZZj``°sçNÒYþ§¤¤äã?Ž%¤=*üQÀ½FÙ×—bïD‰øìâŠæ£žŠ?'uôdWAII‰ªªª8Sq; fjjúüùóvëˆ9U‡ÁÞ;lØ0q¦âvìÅ‹ÖÖÖ·nÝsž®Sñn¤vtuuKJJø—2„TžQá‰j‡ì몇ˆ¼ßG‘Ï®n‰â£Ç€»ÂÿLu±Ž8#ñ6Ú.ØÓ§OÛ}eMü_SîÉ3fkk[VV&ÎT´N‚½zõÊÕÕuÿþýÎÎÎbÎÓE*J±°°ÈÊÊâ_Âf³ÍÍÍIå‘Ä_W=Däø>Š|vuKoRp_]¼xqÒ¤I¤St5~"­½ÄÄÄ1cÆNA+++sqq trr"…ºÜÜÜX,ÿ‹åîîN*õIÐëŠ"ïDIùìÉG}ÏÊ𜜜Š‹‹›ššòóóýýýœ––F:W(òË1cÆ•+WJKK›šš^¼xqòäICCÃk×®‘Îŵ±±9þ<é]¡ÂoðíÛ·&&&þþþ¼q˜ššÖÔÔÎõ/Tx¢x(ûº¢ì;ñ}Tø…Šç£žüÏ)YbbbæÍ›§­­­  `hh¸téÒÜÜ\Ò¡:F…1—Ë?~Û3¦¯¯Ï`0’’’H‡âr;ùãšÃáÎÕq0‚yž={6wî\uuuuuõ¹sç¶;\GÕž¨.RQáuEÙwâû¨ð{ÏG=%¾ï kp €0(`PÀ €@€  @ €0(`PÀ €@€  @ €0(`PÀЩ… nÙ²…ÉæÍ›=< þ= ø*¥4ŽãO}‹¢¨ëz†”RìUð0°€ €@€ 0ø†hFõSK%IEND®B`‚gsl-2.7.1/doc/images/rand-logarithmic.png0000644016036000116100000003273413373111455015206 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœíÝ{\Ôu¾Çñ䣀ŠÚM­øœ#F3ÁJ7b­©,µ©N¨Ù¦ÝÛúhÃ6´=îñ²^ºhº‘yo‘ÀÜ=¹jäI­ 07o˜\ &AQ™ó93óñÇ|?3½žô€ßüfæãL~Þ~?¿ßüÆèp8 À·:©.€_#` €P€@` €P€@` €P€@` €P€@` €P€@ø™ÑhT]‚Á Y†Ž¶ã¡Œÿ§K—.±±±#FŒ˜5kÖÑ£G;ºB}ß!ï2` €±F…Ãáp8õõõß~ûíìÙ³kkk‡ ²aÆ z_þ¹¾†€“Ñáp¨®Áh”õ×Á½µz|ö¯¾úêÖ[oݺukBBÂÅ<ŽŽûëu_ £±Ú$///999""""""99yóæÍ®·ßvÛmÝ»wì±Çêëë]×^?üðÃO<Ù¯_¿^xáôéÓÍÛFcCCôiÓbcc[L\ÿmæ|¨óçÏ¿úê«}ûöíÒ¥ËUW]µxñbçMF£±¾¾~òäÉÑÑÑÝ»wÿýïïp8¦NÓ­[·iÓ¦;wÎõYšÙl¶‡z¨wïÞ]ºtILL\·n]Û_–k¯½öé§Ÿž7o^‹‡­­­}á…Þµk×[o½5??ßÛŸKãuhV__?eÊ”îÝ»GDDŒ3¦´´ÔõOí^•Æk躿Æ{j45^j@‡ÃáÐøëðÙgŸEGG¿÷Þ{UUU•••ï¾ûnTTÔçŸÞ|ë¿þõ¯ž={.^¼¸¢¢¢¢¢bÑ¢EãÇw}´¸¸¸+VÔÖÖ>|ø¾ûî{ñÅÏøÈ#¬^½úĉîe¸×c0&Ož³fÍ:tèÐéÓ§‹ŠŠÆŽ{A¯ÏÞ½{û÷ïßbŸ»îºëé§Ÿþþûï«««óòòn»í6?—öëðÀ,X° ¼¼¼¼¼|Á‚±±±Ô¨Jû5lþAû=Õ~©]ÀÀÏ4xìØ±K–,qݲhÑ¢»ï¾»ùçñãÇÏ™3ÇõÖ?þñÞ­¦¦æÊ+¯t>ã¼yó¼•á1<^zé%×-›7o¾îºëœ·:óÕáp|úé§®[vìØqíµ×¶xð‡~xÆŒKõVX aaa-ö¹ä’K\ÓTûqZ}^yå×›fÍšõàƒjTÕ–Ö~Oµ_j@0ð3¾âŠ+Ž9âºÅf³ÅÅÅ5ÿ{èÐ!×[<è|´†††Y³f]}õÕaaaÍc§   ç3>|Ø[ÃùòkVSSå¼µ¬¬ÌyÓ‰'Ü·˜L¦Þ»wïï¾ûÎÛÜca-œ:u*<<¼Å>Æ ›4iÒÑ£GÛò8­¾-þÔèÝ»·FUm `í÷Tû¥tÁ ÀÏ4NØ =qâD—.]œ[Μ9Óµk׿£¹;w®«« uÞÚÐÐМIƒá©§žÚ·oßœ9s®ºêªˆˆˆÓ§O7¯›Ÿ±±±188ØcOÂ:þ|§N¼íßÔÔäzŒÓã–|òäIç?ÚñúìÝ»÷·¿ýíþýû]÷9|øð3Ï<ó÷¿ÿ½oß¾ÉÉÉcÇŽMOOw”uÿsi¿ -^^“ÉtöìYÖÔÔÔüOoÏÕ¼Eû=Õ~©]pÐºØØØªª*×-UUU½zõjþ¹{÷îååå®·ºþºaÆåË—2$""Â`0:tÈuϩӪ‘ЂûI­~§{÷î->Ë{¡6mÚtË-·´ØØ¯_¿œœœŸ~úiíÚµ×_}VVVFF†Æƒh¿ÇŽkñk=šîÖ­ÛO?ýäzëáÇÛR¶ö{jhí¥.ÿ‡­3›Íyyy®[>øà³ÙÜüsjjêúõë]o]³fóç«·•+W¶ñICCCÛYq›=ú¯ýk»ï^\\¼`Á‚gžyÆã­Í§UOž±X,111¡¡¡ øýïÿÓO?µûÏUWW÷è£FEE…‡‡ß~ûí%%%®{.Z´hàÀÁÁÁ—_~ù¬Y³š?ëÜ–çÒxO `øçúû裞þù¯¾úJu!äâ0 ƒ±cÇnß¾ýäÉ“?þøãßþö·G}ôé§ŸV]ÑX:xÿý÷çÍ›÷õ×_Ÿ?~РAÓ¦M›8q¢ê¢ˆF #h €P€@` €P€@` €P€@`ÀGޱX,&“Éd2Y,–²²2o{= ñeµ\¡\WW—’’b6›m6›Íf3›Í©©©õõõwv¸™?þ½÷Þëãšh;¡ß<þü={ö¬ZµÊ¹eâĉÆ ›>}z«÷mjj8pàÚµk“’’:²FÚOè 8//Ïjµºn±Z­¹¹¹m¹o~~~ll,é Lh—––&&&ºn:gΜ6>ËË/¿ìñ5 õñ»«=1ÖBWÀ±±±%%%±±±Î-C† )//׸×?þxõÕWïß¿?::úbžÝhú²|¬ãAè1à„„„ââb×-%%%ñññÚ÷zóÍ7ï¹çž‹L_|@h§¥¥egg»nÉÎÎNOO׸ËÙ³g_ýuN¿ø¡†hÉh4Ö××O™2¥{÷îcÆŒ)--½ÐÉË˳Z­®[¬Vknnn[ŸÀéÛ¡`ðcñññß|óÍÁƒGššzèС z„ÒÒÒÄÄD×-ƒÞ»wo[î»`Á.AØnÌZ=` À/ÆW^y套^rnyå•W8àü2÷Ëæ»jnt!!!§N vn?{öì%—\ræÌígÿúë¯ï¸ãŽC‡uîܹýñA<˜0aB‹_?þøcç¯Ú_‘O½páÂǼ雙™éñ jßÈÌ̼È?lG`©ç+`~Áh4644„††:·444˜L¦³g϶ýAbccKJJbcc[***† R^^®q¯üñꫯ޿À;+`€ÇŽkñk=œ¿j¯ ›÷IHH(..v}’’’V¿ÚõÍ7ß¼çž{>}; ~lõêÕ-~5j”ó×¶Œ ÓÒҜnj›egg§§§k<éÙ³g_ýuN¿ºH|äÞ·ß~»hÑ¢ûî»Ï`0¬_¿~É’%;v츠G˜4iRbbâìÙ³§Nj0–.]ºsçÎ7ß|Ó¹ƒû vãÆñññ­®’¡0ø±·Þz«¸¸øßþíß®¼òÊÍ›7ôÑG ¸ GˆŒŒ,,,ܵkW\\\\\ÜîÝ» """4î²páB–¿³<à$,~f圄@@!€P€ÅüÙ¯À(@  €0 À(@  €0 À(@  €0 À(@  €0 À( 7€9b±XL&“Éd²X,eee;755-Z´(!!!44tРAëÖ­óY´ƒÐ®««KII1›Í6›Íf³™ÍæÔÔÔúúzoû?þøã%%%|ðÁÉ“'ßyçwÞyÇ—Õp¡Œ‡Cu ÌŸ?Ïž=«V­rn™8qâ°aæOŸî¾ó'Ÿ|2oÞ¼¼¼<½žÝhú²|¬ãAè 8//Ïjµºn±Z­¹¹¹w~ë­·žxâ ŸÔ€>„piiibb¢ë–ÁƒïÝ»×ãΟ}öY]]݈#ÂÃÃ###Gõé§Ÿú¤LÚIhÛíöèèh×-111555w®¨¨˜2eÊÃ?l³Ù:4~üøßþö·;vìðI¥´GgÕè ©©éÏþóÃ?ÜüëüÇ †—^zé“O>QYÞ ]GEEµXïVWW·X;ÅÄĤ¥¥¹n¹óÎ;?ÿüóVŸ%33ÓèÉÅT@[ à„„„ââb×-%%%ñññÞvnß³dff:}:55uÊ”)¿ùÍo C~~þsÏ=·aÆ‘#G¶ïÙù0 Ù¯îsÀ‘‘‘………»v튋‹‹‹‹Û½{wAA3}[ ݸqãÿ÷_uÕU—]vÙ[o½µnݺv§/>ÀRÏVÀ€f¿º0@áJXOεAšššä~–®©©©S§NçÏŸW]ˆ!((ÈápÀ  FÐÒ5°ê* ƒAÈ¿ 0ˆèìÐàp8„pPPPSS“ê* @ˆèìÐ ç°kPP+`Ð ,#hH":;4È `FР#Df zÑÙ¡AÎ1`FР#X:FÐDtvhÀ¬€@/":;4ȹø#hÐ,¨0#hЋˆÎ ¢˜0èEDg‡9Ìt$¢³CƒœcÀŒ @G°trVÀŒ @G":;4È `FР#D]Š’4èEDg‡9—¢d :"€¥c IDg‡9Ìt$¢³Cƒ¨cÀ¬€@/":;4È9ÌtDKÇ’ˆÎ ¢˜0èEDg‡9—¢d :"€¥µf zÑÙ¡AT³½ˆèìÐ '€A€ŽDtvhs ˜4舖NÎ ˜4èHDg‡9Ìt$¢³Cƒœf :ÑÙ¡AÔ1`VÀ ¹|äÈ‹Åb2™L&“Åb)++ÓØÙèÆguv49+`FР#Ý]]]]JJŠÙl¶Ùl6›Íl6§¦¦Ö××kÜÅñK>+µ£É `FР#ÝݲeË’““gΜ5sæÌaÆ-_¾\u] ðu„DtvwyyyV«Õu‹ÕjÍÍÍUUB|!$¡\ZZš˜˜èºeðàÁ{÷îÕ¸K¯^½‚ƒƒ{÷î=a„}ûöup¾Ã’ˆÎîÎn·GGG»n‰‰‰©©©ñ¶zzú† jkkwíÚ•””4bĈ¯¾úªãËôQÌ ô"¢³_¼ÜÜÜáLJ††^vÙeO=õTffæ‹/¾Øê½233ÝOŸ2ïu’s ˜4èHDgwÕb½[]]ÝbM¬áî»ïÞ±cG«»eff:>¾w—¢ƒ4$Ý]ZZZvv¶ë–ìììôôô6Þ}ýúõ7ÞxcÔ¥€œf :ÑÙÝMš4©¨¨höìÙv»Ýn·geeíܹ3##ùƒëT655uãÆgÏž=|øðìÙ³ÿøÇ?Ι3GEáúu)JFР¡YXX¸k×®¸¸¸¸¸¸Ý»wDDDxÜyæÌ™«W¯4hPxxøðáÃ÷íÛ·cdzÙìãš;ˆœ0#hÐQgÕxÕ·oßœœo·ºåMIIIIIñIQ È `FР#ä0#hБˆÎ r޳ÀÒ±€€$¢³Cƒ¨f zÑÙ¡AN3‚‰èìÐ ç0#hÐ,œ0#hБˆÎ r˜4èHDg‡9_GÈt$¢³Cƒ¨¯#d z!€¥c IDg‡9Ìt$¢³Cƒ¨cÀ¬€@/":;4È9ÌtDKÇ’ˆÎ ¢˜0èEDg‡9—¢d :"€¥µf zÑÙ¡AT³½ˆèìÐ '€A€ŽDtvhs ˜4舖NÎ ˜4èHDg‡9Ìt$¢³Cƒ¨KQ2‚½ˆèìÐ çR”Œ @G°tŒ  ‰èìÐÀYÐ`é䬀A€ŽDtvhs#hБˆÎ ¢NÂb z!€¥c IDg‡9Ìt$¢³CƒœcÀŒ @G":;4ˆ:Ì ôBKÇ’ˆÎ r˜4èHDg‡QWÂb z!€¥“³f :ÑÙ=:räˆÅb1™L&“Éb±”••µå^²dÔ…œf :ÑÙÝÕÕÕ¥¤¤˜Íf›Íf³ÙÌfsjjj}}½ö½ÇC=ôÊ+¯ø¦HßÀ¬€@/":»»eË–%''Ïœ93*****jæÌ™Ã† [¾|¹ö½æÏŸûÀø¦Hßs ˜4èHhçååY­V×-V«577Wã._}õÕ²eË–,YÒÁ¥ùš¨0#hЋˆÎî®´´411ÑuËàÁƒ÷îÝëmÿ††«ÕºråÊÈÈÈŽ¯Î§D0+`ЋˆÎîÎn·GGG»n‰‰‰©©©ñ¶ÿ3ωz‘ÒÙá¨æ“H )Þˆ `FР—VNª©©Y³fMaaá_|QUUe0zöìi6›SRRxào—¦‚ޤf ºðº´:zôè¤I“úôé³zõê[n¹eóæÍåååååå›7o1bÄ{ï½×§OŸŒŒŒ£Gú²Ü_!Q+`FР¯+àöë×oÓ¦M£GvÝ?}úô-[¶<ûì³lhhèø:½D0#hЋ×Î>nܸݻw·H_Wcƌٽ{÷¸qã:¦0üLZ³]x]ÿõ¯mõÎááámÙ CÔ1`FР—Ö—Vo¼ñ†ÇíóçÏ×»x mÌtÑzgÏÌÌܶm[‹7n\°`AÇ”„_À¬€@­wö¿ýíoV«Õf³9·ìرãÉ'ŸÜ²eKG†ŸÉù:B#hÐOëý†nX¼x±Åb9uê”Á`Ø·oßý÷ß¿qãÆøøøŽ/‚¾ŽÐÀôÓ¦oCJKK«®®~ä‘G.\xçw¾ñÆ×_}GW†fŒ  µõëz衪ªªÁƒÏ;7--­Ck‚+QÌôrßüüóÏ?ýôÓ;Ëý á€$ê0#hЋ×4mËqÇ@úÞ{±¤f ºðÀ„«Œ  IéìðFT3‚½xíì<òH}}½öëëëyä½KÂ/ˆº%#hЋ×^»vmRRÒÇìm‡>ú())iíÚµS~&jÌôâµ³÷Ýw×]wÝwÜ1bĈ×_}ß¾}µµµµµµß~ûíÒ¥K‡~çw&''÷Ýw¾,÷WHT3‚½x= ëòË/_±bÅŸþô§Õ«Wÿãÿxíµ×Ž?n0zöìi6›ï¿ÿþM›6ÅÄÄø°Ô_)iÌ tÑʇz{ôèñä“O>ù䓾©îDf z‘²´‚7ÒVÀŒ @mêì°Z­}úô îÓ§Õj=tèPGW†fÒ˜0è¢õÎþõ×_ßtÓMܾ}ûÉ“'·oß>`À€n¸¡´´ÔõAT3‚½´~aççŸ~æÌ™Ó¦MkþµÿþøÃºvíúÜsÏñ•À> ê0#hÐKëK«íÛ·ßwß}-6Ž7nÛ¶mS~AÔ ˜4è¥õÎÞ¥KÛÃÂÂô.ˆ `FР—Ö;ûÝwß½~ýú×­[g±X:¦$ü_G©õcÀ .œ}È!ÿûßëêê¾ùæ›^xáÕW_}ùå—}\s‘¶f º0Êü”Ñüùó÷ìÙ³jÕ*ç–‰'6lúôém¹ûÁƒ‡j·ÛÛ÷ìF£ —¥k×®eee&“Iu!ƒÁðì³Ï^zé¥Ï<óŒêBÀG:.¤,­ZÈË˳Z­®[¬VknnnïÔu) jÌô"¥³·PZZš˜˜èºeðàÁ{÷îmõŽ'NœØ¶mÛ¸qã¦NÚaÕù”¨cÀŒ @/­_ K »Ýíº%&&¦¦¦Fã.®)uë­·fffvPm>&jÌYР)ýâ9‡ÃQYY¹zõêÒÒÒ¬¬¬Vï’™™iôÄÕ¶¨f z‘ÒÙ[ˆŠŠj±Þ­®®n±&ö¨gÏž<ðÀªU«ÚòeM™™™OÚ_wv)JFР )½…„„„ââb×-%%%ñññm¼ûСC«ªª: .¸%$¡œ–––íº%;;;==½w/**ºæšk: .D Y€^¤tö&MšTTT4{öl»Ýn·Û³²²š/wåÜÁuQxûí·çææVUU={ö‡~X¹rå£>:gÎ…ëOZ³]Héì-DFFîÚµ+.....n÷îÝw~ñų³³ãããÃÃÓ’’6oÞüþûï3ÆÇ5wQŸA20‚ýý’Á`èÛ·oNNŽ·[]O•9räÈ‘#}R”¯‰ZþA€~5w¸À¬€@‚š;܉ú ’4èGPs‡;QŸA20‚ýÀ¢1‚€@%¨¹Ã´f zÔÜáNÚÇA€^`Ѥ­€A€^5w¸“ÀŒ @/‚š;ÜI `FРAÍîf º €E“ îK…IDAT¶f zÔÜáNZ3‚½jîp'íR”Œ @/‚š;ÜI»%#hÐ ,#hT‚š;Ü `VÀ  AÍî¤f zÔÜáNÚ1`FРX4FШ5w¸“ÀŒ @/‚š;Ü ¼%#hÐ,š´0#hЋ æwÒ˜4èEPs‡;iÌô"¨¹ÃÀcÀ¬€@°hÒVÀŒ @/‚š;ÜI `FРAÍî0+`Ð… æwÒŽ3‚½À¢ \3‚]jîp'0€Y€.5w¸ãë P jîpÇ×@ "€Ec JPs‡;iÌô"¨¹Ã´cÀŒ @/‚š;Ü <Ì t!7€9b±XL&“Éd²X,eeeÞöܶmÛ¸qãzôèѵk×äääM›6ù²ÎÅ• æîª®®.%%Ål6Ûl6›Íf6›SSSëëë=î÷Üs7ÞxcxxxRRRvvök¯½æã‚;ˆ´KQ2‚½ ༼<«ÕêºÅjµæææzÜyîܹ®)5`Àyµ‘¶f zÔÜ]•––&&&ºnðÀ-N¤úé§Ÿ|\sG`ìMxx8#h~MèÇ Cß¾}srr¼Ýêzª”¨Ó¦ôE{à €¿£¹‹æöu„rÀüÍ]4i_G(#hþŽ´7¬€ø;š»h°70GscÀÞp%,þŽæ.Ç€½áJXü,#hoAðw4wÑ`o`þŽæ.—¢ô†àï`ÑX{Ãç€ø;š»h°7¬€ø;š»h°70GscÀÞ0‚àï`ÑX{à €¿£¹‹F{Cðw4wѸ¥7\Š€¿£¹‹Æ¥(½áR”ü,#hoAðw4wÑ`o`þŽæ.Ç€½ácHüÍ]4Ž{l0Î;§ºh'X4Xçaðk°hŒ 5p€_£¹‹ÆIX`~æ.+` \‹€_£¹‹Æ1` à×`ÑAk` À¯ÑÜE#€5ÀüÍ]4¾X×âà×`ÑXk` À¯ÑÜE#€5ÀüÍ]4X#h~æ.Ç€5°à×`ÑXk €ø5š»h°€_£¹‹Æ¥(5p)J~æ.—¢ÔÀ¥(ø5X4FÐAðkr›û‘#G,‹Éd2™L‹¥¬¬Lcç/¾øâñÇïÖ­[€­ ` 0¿&´¹×ÕÕ¥¤¤˜Íf›Íf³ÙÌfsjjªÆ¼ñÁìٳ租~êË"}€cÀø0¿ÖYuž-[¶,99yæÌ™Í¿Îœ9óÛo¿]¾|ùôéÓ=î_ZZêÃê|‡cÀXðkBWWyyyV«Õu‹ÕjÍÍÍUU*Œ 5ÀüšÐæ^ZZš˜˜èºeðàÁ{÷îUU*°FÐüšÐæn·Û£££]·ÄÄÄÔÔÔ¨ªG.E©0¿&4€}#33Óè‰êºþ+` 0¿&´¹GEEµXïVWW·X_¼ÌÌL‡'ú>ËÅ €5p%,~MhsOHH(..vÝRRR¯ªU` \ €_ÚÜÓÒÒ²³³]·dgg§§§«ªGŽk =}ú´Çƒ>Ö©S§¦¦&Õ¯?#4€'MšTTT4{öl»Ýn·Û³²²vîÜ™‘‘áÜÁøëˆ%VÀšcÏãAãh4€vÚÜ### wíÚ·{÷î‚‚‚ˆˆoû;×"-~öw°_ˆˆˆ8uê”ê*ø¡WÂ2 }ûöÍÉÉñv«ã—§J9$9¥#Ø/ÀÚæ.šƒcÀþ€Ð°h¬€ý  hî¢À~á’K.!€\(š»h¾ŽÐ°Ð4wÑø:B¿QWW§º ~†´_`  hî¢À~Ð4wÑ8ì`í@scÀ~аhŒ ý  hî¢À~Ð4wѸ¥_ €´,+`¿À•°´Í]4Ø/°Ð4wÑ`¿À•°´Í]4ŽûVÀÚ°_ €´Í]4Ø/ÀÚæ.ì`íÐYuÐÂ1`¿^__/ä :sæLPPêB´‚°_èÔ©SSS“ê*~Ö«W¯ü166Vu!ZAsÆ…Š­¬¬T]€ÖÑÜEãëq¡zõêE~æ._Gˆ Q¡º ­#€Ec Åð4wÑ`\(ð4wÑ8Œ Eþ‚æ.Ç€q¡8 ð°hŒ q¡8 ð4wÑ`\(FЀ¿àJX¢q)J\¨îÝ»ÿøãrþ· ­¬¬4™Lª Äau%+`\¨   sçÎ9ĸýöÛ?øàÕ¯ Í]4þîÞ{ïݰaƒê*‰hî¢ÀðwéééÛ¶m;qâ„êBqhî¢98 ?yóÍ7ççç«.‡0ShÀ#£ÃáP]ƒ8F£”—¥k×®eeeœA ¿vòäÉØØØÓ§O«.Ä^\\<`ÀÕ…ÀŸt\"°º­©©)((HuÀE1™L jOÆn6{öl«ÕzþüyÕ/ `0L9rÄb±˜L&“Éd±XÊÊÊTW¤.E èhÚ´iÁÁÁ‹/V]`0F×ÕÕ¥¤¤˜Íf›Íf³ÙÌfsjjj}}½êºtàà$,@?:uzûí·g̘a ""bëÖ­ª_¨$å`çŘ?þž={V­ZåÜ2qâÄaÆMŸ>½}hs ¸K—.µµµ!!!ª  ³;vX,–5kÖ¤¤¤¨®Z:.aœ——gµZ]·X­ÖÜÜ\Uõèˆ0¨nºé¦uëÖÝyçŠWâF£‘å¸"R–z#66¶¤¤$66Ö¹¥¢¢bÈ!åååí{@£˜pçÎÏœ9ÃyX:ÔÖ­[ï¸ã GîÂÃçL™ò /ôêÕKu-?ë¸D„°ÝnŽŽvÝSSS£ª±à·ÜrË©S§”žîâàÁƒƒ¡ÿþŠgÿ§k×®øº«~µuÜØØèº¥±±1$$¤Õ;¾üòËøÊB…—”YëÅ9‚ÖåA(æWUŒ^C1~QŒ^C1~QŒG0‚NHH(..vÝRRR¯ªZœ–––íº%;;;==]U=´*xÒ¤IEEE³g϶Ûív»=++kçÎí~@Qdž)ÆŠñ†b¼UŒAX=ãMÇÇ€ Ã÷ßÿôÓO †ÔÔÔ ÄÅÅ©-©ã´Åx#ªƒ°z(ÆŠñ†b.ˆôúü—¨÷žb¼UŒAX=ã ÅxC1$(33Su ë–[nQ]Âÿ£oDcVÅxC1ÞPLÛIÿ)NÂÀïÀ(@  €0 À(@  €0 À(@ ¬¿#GŽX,“Éd2™,KYY™Âb¾øâ‹Ç¼[·nF£QaƒaÛ¶mãÆëÑ£G×®]“““7mÚ¤°˜æoŒîׯ_HHHŸ>}Fõþûï+¬Ç©¢¢bàÀjß,£…Å455-Z´(!!!44tРAëÖ­SU‰ûËb4CBBTÕsþüù%K–üû¿ÿ{·nݺvíj6›—,YrþüyUõ|ôÑG7ÜpCXXXttôƒ>XYYéËg×nt¢zò/8 «ÚÚÚþýû¿úê«555555¯¾úêÀO:¥ªžøøø—_~ù›o¾Qþ^ †‘#GîØ±ãÔ©SŸþybbâ²eËT“””´xñâ}ûö9s¦ººúÿøÇµ×^û‡?üAU=Íšššn»í¶Õ«W«}³”ÿ¯âjÊ”)8sæÌîݻnj£º¢ÿ7þüñãÇ«zö'žxâºë®ûç?ÿyòäÉ'NlݺuèСO<ñ„’b>þøãèèè+VTUUUUU½ýöÛ×_ýéÓ§}V€F£“Ö“] ú›æÍ›7aÂ×-&LX¸p¡ªzœ”wÕçž{®©©ÉùkqqqÿþýÖÓºu릶†ÿú¯ÿzðÁªß,åÿ«8¦¥¥©®Â³óçÏ_y啟þ¹ª"##>ìºåðáÑ‘‘Jйùæ›W®\éºåí·ß^²d‰ï+qÿ¿WlOv8Œ u–——gµZ]·X­ÖÜÜ\UõÈ1wî\×éЀ ‚ †ààà   …|õÕWË–-[²d‰Â¤yë­·žxâ ÕUx–ŸŸ›””¤ª€ÐÐP÷aaa¾¯Ä`0ìÚµ+--ÍuËwÞ™““£¤˜$÷dXg¥¥¥‰‰‰®[¼wï^UõˆµeË–Aƒ©®Â`0Nœ8Ñ||zêÔ©ªjhhh°Z­+W®ŒŒŒTUƒ«^½z÷îÝ{„ ûöíSUÆgŸ}VWW7bĈðððÈÈÈQ£F}ú駪ŠiaÁ‚O>ù¤Â~÷»ßÝÿýÛ·o¯­­­­­Ý¶mÛ}÷Ý7mÚ4…%µÐ<VNtOV½4ÁÁÁ®[CBBTÕã$ê½®®®¾úê«·mÛ¦¶ ׿·Þzë¹sçTUòØc½òÊ+®…©ªÄáp¤§§oÛ¶­¡¡¡¬¬lþüù={öüòË/•TÒ¥K—˜˜×#‹111Û·oWRŒ«’’’Ë/¿üìÙ³ khjj;v¬ëÿÃcÇŽu=ÊãKÇçw\·¬X±BIßsÿ»#¶';8¬;±o¶œ®¨¨¸ùæ› Uò³ÊÊÊÕ«W÷éÓgÖ¬YJ Ø´iÓðáÃ]ã_Λåp8–.]zûí·+yêàà`÷#‹·Ür‹’b\=úè£sæÌQ[ßþô§+®¸"''§ùÜ¢œœœ+®¸âÏþ³’b ºwïþÎ;ï?~üøñã+W®Œ‰‰ õ}%ð¯ZÏž=+**\·”——÷êÕKU=NBzúÑ£G?þøcÕ…´TXXxùå—+yêþýûÿý÷®[„¼YÍ***"""”üðC×-ùùù O<6 gÏž}ýõ×Õž~ÕìŠ+®Ø³gë–Ï?ÿüòË/WUO K—.4i’ê* á=Ù§ëí_“'Oöë×/++Ëù¡ïþýû×ÕÕ©®KýTsÈ!kÖ¬Q[ƒÓm·Ý¶iÓ¦ÊÊÊÆÆÆ£G®X±âÒK/ýðÃU×õ3…oVJJʆ ÊËË:”••Õ½{÷={ö()¦¡¡á†nhqdQíÙ«W¯¾õÖ[à´hÑ¢¸¸¸>øÀn·7¾ì²Ë/^¬ªž;î¸ã‹/¾hll¸oß>UÅ8ŽcÇŽM˜0!**ªK—.×_½ò³®»îºüü|µ58­_¿>99¹[·nݺu»îºëÖ­[§°˜µkׯÇLJ„„\sÍ5 ,8þ¼/Ÿ]»Ñ‰êÉ®Œc.~U8 €0 À(@  €0 À(@  €0 À(@  €0 À(@  àŒF£ê€_` €h)**êÕ«×o¼¡º ÐtV]¹òóó÷»ß­_¿þæ›oV] h`ž½óÎ;‹-Ú¶m[\\œêZ€Dð`îܹ»víúç?ÿ¡º 0‡êb4ûôéSRRÒ»woÕå‹“°´üŸÿùŸ7ß|ó¾}ûT×,VÀ~Áhü¹-äççO:uÍš57Ýt“ê¢€Ä €giiiëÖ­7nÜÆU× NÂàÕ 7ÜðÑG3æèÑ£O=õ”êr€€ÂA  €0 À(@  €ÿ Òš©Ž7 oNIEND®B`‚gsl-2.7.1/doc/images/rand-logistic.png0000644016036000116100000005045213373111455014516 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœìÝy TëãðQ!T’-Z\‰dͤRR¢EÚ©´j!­”[$ÝnhQФõ¦í*K‹[’¤MÑ!kY*R¡ìëüþp¾nI–™óž™y>qf朧‰yœsÞó‹Åju €¡€@€  @ €0(`PÀ €@€  @ €0(`PÀ €@€  @  è³Ú6¼Jàÿ ËÊÊŽ=ÚÕÕõÝ»wíÓ|Bö¾oú_  €û°«uX,‹Å*++{ýúõÎ;‹‹‹utt.\¸@$ ݶÀi,‹t®$ @ìׇ-›nr%/_¾7nÜÝ»wÕÕÕ9¦=á ¾çl‡=`Ž ÕÓÓÓÓÓ küh\\ÜøñãÅÄĤ¤¤V¬XQVVöãÚââbGGGeeeQQQqqñqãÆ]½zµá ¿{ƒÁÈÊÊZ´h‘œœœ°°°¶¶ö¹sçZ{РAööö^^^í S^^nkk+++Ûd²²²åË—KII‰‰‰Mœ8111±á¡&÷q¶Òü?¼™÷\@@ ¶¶vûöí¿ýö›°°°ŠŠÊÁƒ[þ¶p Ú¤™_ŸGõèÑÃßß???ÿãÇgΜ‘xúôiý£)))222ÌËËËËË;pàÀ¼yóÖÖðÅŒ3ìíí333«ªª¾|ù:~üøŸmºaIVV–¼¼¼««ë›7o***>|8}úôVåOJJRRRjg˜%K–|ýúõÇÍ1Œ¹sçz{{çæææææz{{ËÊÊfdd4“êÇ7çLJšÏ †³³sZZZIIÉÝ»wûõëÔä;@ 0@5SÀÓ§O?tèPã%033«ÿzÞ¼yîîîݶmÛÓ¥K—ÆÖü¦–,^¼ØÙÙ¹=ùËËËEDDÚÆËËëgOc0nnnruu]¸pa3©ZRÀÍ¿ç cË–- 6lX“ÿ"j €Ú¨™îÛ·ovvvã%YYY õ_ËÊʾyó¦ñ£?vÌСC—-[öîÝ»–lºa‰œœ\jjj{ò—––ŠŠŠ¶3ÌÛ·oö4ƒÑ°¿[/==]NN®™T-)àæßó7ZPP !!ñã¶(ƒsÀì÷ñãG™ÆKdeeóòòê¿þüù³œœ\ãG¿û¶^PPЧOŸú÷ï?pàÀ%K–„„„°Z0þèÓ§O½{÷nGvFff¦¼¼|;ÃôêÕ«™G¿[¿¼¼ü§OŸ~ö人º¤þÅ{Î`0~ûí·ÆJHH¶dÍ‚`?YYÙüüüÆKòóó{öìYÿµ””TnnnãG¿û¶ž¢¢â¥K—ŠŠŠ‚‚‚†¾cÇkkë_nZJJê»ky[ëò分†í #((ØÌ£>|øî[iiéú¯»wï^TTÔøÑ·oß¶$vóï9ƒÁèÐw@/ø‰`?&“ÚxÉ•+W˜Lfý×ÆÆÆçÏŸoüh``àÏVU?’ÙÆÆ&<<¼a§mašÜƒÁ˜7ožOý pYYÙ´´´úGû÷ïUZZšžžîäädccÓðÚf¶Õü{Þ|$"ðóÐFÍÿE{éÒ¥!C†ˆˆˆˆˆˆ 2¤þ¤iƒ/^Œ;VDD¤G666ùùù «­ÿ"22ÒÜÜ\RR²sçÎýû÷߸qcQQQýCáááÊÊÊ;vü±¶Y,ÖÛ·oçÏŸ/---((8hРsçÎ5Ÿ_HHHZZÚÀÀÀÅÅå»aVíó㪠FII‰•••„„„¨¨è„ âãã?óÀÊÊÊ‚‚‚}úôquu­©©ixmóÛjæ=G aZònÞ¼éààðòåKÒA€:8 @ÀôéÓ£££¿}ûöùóçþùÇÊÊÊÞÞžt( ö€öòòzõêUmm­†††­­í‚ H‡J¡€À!hPÀ €@€  @ €0(`PÀ €@€ €¾œmnnÞ­[·nݺ™››çääüì™?¶¶¶VTT’——;vlpp0•QZ‹¦\RRbddÄd2³²²²²²˜L¦±±qYYY“O¶³³ÓÑѹ~ýzIIIBB‚££ãöíÛ·nÝJqf€–£éý€÷íÛ{öìÙ†% ,:t¨]K^ž‘‘¡««[XXȱ€íBÓ=àÐÐPKKËÆK,--CBBZørAAÁŽ;r {д€µµµ/ÑÒÒJJJúå ¿~ýeaa±råJŽ¥h/š‚*--lXR]]Ý¥K—ÊÊÊŸ½D@@ áëqãÆ…‡‡c'è‹EK‚‚‚UUU—TUU ýò…?~ ——wuuýå“6P«sçÎÿ/mµ½ÌšEÓ=`YYÙøøxYYÙ†%yyy:::¹¹¹-yyddä¢E‹²³³Û¶uš¾-@1Î5MÏ«««ÇÅÅ5^¯¦¦Ö—ëêêæççs {д€'Ožìçç×x‰ŸŸßÔ©S[øò‡ªªªr {д€—-[öðáÃ;wîØ±£~º«†'4r5a„üüüêêê÷ïߟ:uÊÊÊÊÝÝDp€¡iwíÚõÎ;Ïž=SPPPPPˆ‰‰¹}û¶˜˜X“OvrròóóSSS2dHXXXppðĉ)Î ÐrmÔ Â€z|7 €·¡€@€  ­ðüùóU«VuïÞ½ñå Ð(`h…… ÊÈÈ*q°Áû÷ï׬YÓµkWEEEGGÇŠŠ Ò‰ø €èëë<8777222++ËÕÕ•t"þÅZ‹OŽ«Ÿ+,,ÔÕÕÍÈȨÿ¶ùAU?~*òÉG%A@{UTT¸¹¹©ªªŠŠŠ ôèÑ#++«áÑæïßÎM»¸¸ãââÒÎüœÀ¿´ŸüYüfݺuÉÉÉîîî***bbb"""mþ¸ã“JÎý3;qb¥@C.\xòäIïÞ½ë¿}óæMãG[{Ú  À/ÊËË;wîÜðí©S§?ŠŠ¥Îð‹‰'®[·.///??ïÞ½™™™¤ñ50¿8pàƒÁPWW0`@RRÒw{À-Ô0²é»¯¡µøâzkñÉÈø%Î5ö€@€  @ €0(`h©¨¨( iiiqqq==½Ë—/“NÄÅ0%´ÔèѣnjsùòeÄÄÄeË–}þüÙÚÚšt.®„'š€‰8šäàààááÑ0õU||¼™™Yzz:ÙT…‰8€ Þ¿¿fÍš®]»***:::VTT´êå{öìi<ñdÿþýsrrØ‘_ €øˆ¾¾þàÁƒsss###³²²\]]Û³¶ððp veã78ÖÚ‚~PXX¨««›‘‘Qÿmkï\PP0bÄ___NE¤‚€öª¨¨pssSUUèÑ£GVVVã¬f}·ª?Θ1ãÈ‘#-l_F\\\¨|ÚÏž@võš€=`àIëÖ­KNNvwwWQQ«¨¨iÃÇÝû÷ï'Mšäééill̉œ´Â¹F@Ó4 <©W¯^Ož<éÝ»wý·IIIêêê w-<ýáÃooo###ަ¥ Î5®àååå;wnøöÔ©SmIÍäç盘˜ìÚµ‹OÚ—£p€_Lœ8qݺuyyyùùù{÷îÍÌÌlíLLLœMMM9ŽïàXkpxRAA]xxx]]ÝŒ3|||ºvíÚª»&SvïÞ}1éç€)…€z¸ €§ €@€  @ €0(`PÀ €@€  @ €0(`:‘´ðùóç7n<}ú4!!!##ãÝ»w555‚‚‚ªªªZZZÚÚÚFFFL&S@@€tR!Àb±Hg ¼-À/jjj._¾|ìØ±§OŸ1BKKKII©oß¾‚‚‚UUU ¯^½zñâEDDDIIÉ’%Klllz÷îM:8E8×hš& €ÔÖÖž>>´±±Ù¼y³¨¨(‡BÐ ˜R(`àa¿ÿþû½{÷öíÛ7}úô6¯çÇŽŽŽ>ìÓ§Ù$ööö ááá:áo}àV˜Š’R(`à^¯_¿644¼víÚàÁƒIgaÔÖÖN›6MYYyß¾}¤³´&â€_+..ž9sæ®]»èо £cÇŽ§OŸ&€v°«×ì7b±Xfff½zõ:xð é,ÿ‘`ddtëÖ----ÒYZ {Àð »wïÎÍÍõòò"ä{>>>æææEEE¤³Ðvõš€=`à:÷ïߟ={öÓ§O{÷îM:KÓììì>|øpñâEÒAZ{ÀðS_¿~]¸pá±cÇhÛ¾ ÃÓÓ3;;ûøñ㤃Ðvõš€=`à.sçΕ––öññ!ä’““Guÿþ}ÒYZŠs€‹ó¸[PPP|||ll,é ¿¦ªªêââbiiyÿþ}\ €]½&`¸Enn®ŽŽNhhè!CHgi‹ejjj``àììL: @‹`"J¡€[L™2…Édººº’Ò 999ƒ¾}û¶¦¦&é,¿†AXð=??¿ìììÍ›7“Ò:}úôqww_´hQuu5é,$aW¯ ØúËËËÓÖÖg2™¤³´‹Å211144Ü´ié,¿€CДBýÍž=[YYyÇŽ¤ƒ´QVV–®®îƒ0"hL)0Ðܵk×Ö­[Oý½~Ùhÿþý—.]ŠŒŒ à§pþU\\¼bÅŠcÇŽquû2Œ5kÖTTTœuåÊ•üü|KKKÒA¨ **êââ²aÃÒA¨€ ¯šš''§½{÷òÞ¥G?³xñâ‚‚‚ÐÐPÒA8 @_§OŸîÙ³§©©)é Ô騱£»»û¦M›jkkIgà,0M•——»¹¹íܹ“tªMžŸœ¨Çw瀵µµ/ÑÒÒJJJjÉkÃÃÃ5448“ €#ÒÓÓ¯_¿nkkK:}IJJZYYá‚`à%4ÝÕ*--lXR]]Ý¥K—_î׌1Â×××ÀÀ Í[Ç0P »¿-ñùógUUUÌÐ ã»=à¶ùøñãŒ3Ž9ÒÂöuqqh §s4–‘‘¶zõjÒAèNJJjéÒ¥ <ƒ¦»z²²²ñññç¾ÉËËÓÑÑÉÍÍýÙKÞ¿?iÒ$OOOccãvn{À@¥¥K—*((lݺ•t.P¿‡k‚2|·¬®®×xI||¼ššÚÏžÿálj'zyyµ¿}¨”••Úäð~ø‘”””¥¥åÞ½{I`šðäÉ“ýüü/ñóó›:uj“OÎÏÏ711Ùµk—‘‘%騯ÝÝ}ÅŠ¸ö·åüüüòóóIh/šk-..ÖÖÖ¶¶¶^¹r%ƒÁ8|øð©S§âââÄÄÄêŸÐø˜“Étttœ3g»¶ŽCÐ@¼¼< Ün¯µV®\)))‰ûU5øî:`ƒ‘™™ioo_ᯱ±±···‚‚Bãߑ&‡MvïÞ½m›F5ª««½½½Iá2oß¾2dHzzz›ÇZŽ ˜ 0P °°PYYùÅ‹}úô!…û,X°@SSsãÆ¤ƒïCS  ضm[ffæ‰'HáJ‰‰‰ãÆËÈÈ!x ˜R(`à´ÒÒR%%¥¨¨(ÒY¸ÕŒ3ÆŽ‹ë§ÓPÀ”B§yzzÆÄÄ’ÂÅ^¼x1mÚ´ôôt!!!ÒY€—ñÝuÀ<¬²²rß¾}›6m"„»éèè 8Ðßߟt€6BPíÔ©SL&SKK‹t®çìì¼sçÎÚÚZÒAÚ @©ÚÚZOOO'''ÒAxÁèÑ£{öìL:@[ €(åïﯠ 0bÄÒAxDýN0m7BP‡Åbyxx`÷—LLLÂÃÃIh50u®]»Ö±cGÜ2„Ö¯_ïééI:@«¡€¨³wïÞ7âžÓìeaa‘žžþôéSÒAZ @‘ØØØŒŒŒY³f‘Âkmmm÷ïßO:@ë`Ɖ&`"à„Ù³g>ÜÞÞžtôíÛ7%%¥'Ožôë×tà5˜ ‹R(``»ŒŒŒ#FdddtéÒ…tÞ´yóæÂÂÂÇ“¼L)0°•••‚‚ŸþI:ÏúòåË€^½z%''G: ð0¥PÀÀ^ïß¿×ÒÒJKKëÑ£é,¼ÌÎÎNTTt×®]¤ƒOAS  ìåààPWW‡Ke8-''GGG'##C\\œtà(`J¡€êÇÅÆÆöíÛ—tÞ7þ| 6¼L)0°Ñ®]»^¿~ý÷ß“Ââãã'M𔑑{»àv„\©²²òÀëׯ'„_hii©©©áFËÀPÀäïﯥ¥…;Riýúõ{÷îÅA, ?0§°X¬ýû÷c÷—bãÇïÔ©SDDé ¿€à”ú[ôàÖ Ô³··Ç˜s ?0§xzz:88àÖ Ô›3gNrrò‹/Hh €#bbbRSS-,,HáGBBBëÖ­Û»w/é ÍÁõ6MÀeHÐ~Ç_·né |ª¸¸XQQñÉ“'JJJ¤³wÃuÀ”BC;½}ûvذaoÞ¼Á­Ú´iSYYnS턦 ÚiõêÕ=zôضmé |íãÇjjj)))RRR¤³CS  íñåË•ÄÄÄž={’ÎÂï–-[Ö§OÜ„ ÚL)0´ÇÖ­[óóó9B:0RRRFýöí[ÒY€[¡€)…†6+++STTŒŽŽVQQ! cúôé&LX¹r%é À­04w8}úôÈ‘#Ѿô±aÆ}ûöÕÕÕ‘ð=0Û°X¬ØÛÛ“ÿ3räÈ=z\½z•t€ï¡€ØæÊ•+]ºt9r$é ðööö^^^¤S| À6^^^¸õ ™››gffÆÄÄð(`öxöìYvvöÌ™3IïuêÔiíÚµ˜™èÃ}›€QÐгgÏÖ××_»v-é ÐÌL m†Ë(…†ÖÂÜ“ôçääT^^Ž™)¡µPÀ”BCkÙÙÙuéÒeçΤƒÀO}øðASS3--­G¤³7!VÀwîÜyþüy~~>ƒÁ‘‘a2™FFFsçÎåÕŸc0´JAAŠŠÊ«W¯äääHgæXYY)**þñǤƒ7!0Ç»wï–-[&//`hh–›››››6zôhyyykkëwïÞq"ñññ177GûÒŸ££ã¡C‡ÊËËI`0šÙQTTôòò211iò áááëׯûö-ïý4cZ®~îÉ»wï8tøµiÓ¦™šš._¾œtàö€-,,bbb~Ö¾ câĉ111œˆÀ-üüüFŒöå6lðòòÂÌ”@ØÕkö€¡…X,–ššš¯¯/f¿â"zzzÎÎÎS§N%¸nÆ@G˜{’­[·3Süº€gÍšU?þ¹±Â¹sçr&×ðööÆÜ“\gæÌ™™™™±±±¤ƒ¿ûu+**jii={¶aÉÍ›7Œ e€Ï=}ú433sOrú™)÷ìÙC:ð»Ú~ñâ…µµµœœÜ¾}û8wôèQu‚sÀÐfffFFFkÖ¬!Z­´´´_¿~÷ïßWVV&ê§[ IDATèŽð9`§OŸijj⊠€”””û÷ï/Y²„th 11±åË—ãL0ÕŠAXâââRRRœ À<<!8 Íspp¨««óôô$Ú%''‡Éd¦§§‹‹‹“ÎôEòpffæË—/Ú—Á`Œ;öÙ³g©©©œ@s_¿~=}ú4îûËúôé3a„cÇŽ‘| »zMÀ04ÃÝÝ=%%åôéÓ¤ƒÄÇÇ›ššfdd “Î4…™°h¡²²òÀööö¤ƒ{hiiihhüè§¼dÉ’²²²æ_\VV†Ë0€¯œ={vРAÚÚÚ¤ƒÛlذÁÃ÷gêý´€ƒ‚‚† rëÖ­Ÿ=áæÍ›C† âL0Úa±XûöíÃÜ“1 &“ill}ºxñbÒA€SDEEW¯^½{÷nÒA€üº€_½z5räHeeåèèèoß¾EGG÷ïßĈ‰‰‰ä ƒÝ»w¯]»VDD„tà Õ«W‡„„dee‘üâ×{Ö&&&“&M²µµm¼pÿþýׯ_çd6bp{ûöí!CÒÓÓ»wïN: p–ƒƒCuuµ··7é @#$Ï‹‰‰½yóFVV¶ñ¼¼<%%¥ÒÒRNd" ­^½Z\\|çΤƒÇ}øðASS3%%EJJŠt  ’ç€6E*Ç?ÈÏÏ ´³³#¨ //?sæÌƒ’|á×lffvþüùïž;wÎÜÜœ3‘hdÿþýóæÍëÙ³'é @‘7>|¸¤¤„tà}¿Þ³.--µ±±8pà¼yóäåå?|øàïïÿúõëãÇ‹ŠŠR“’b8 õŠ‹‹ûõë÷øñc%%%ÒY€:³fÍ9r$î8 õHžøåZx¬®PÀPoï޽ϟ?Ç­røMLLŒ¹¹yzzº   é,@&â   Fee¥’’Rxx¸¦¦&é,@µ &Ì™3w{ñ‰8øÐÉ“'uuuѾüÉÙÙyçεµµ¤ƒ/C4¡ººzÏž=›6m"È=ztÏž=/^¼H:ð20@üýý•””† F:S¿Œ³QÀ9(`€ïÕÖÖîÚµë?þ Hš8q¢°°ð•+WHž…øÞùóç%%%GM:æìììææ†`à0À°X¬;wnݺ•t oÚ´iÕÕÕ¤ƒoBüGHHˆÐ¸qãHòœÝÝÝIÞ„ø-[¶´dþà³fÍÊËË‹ŽŽ&x ànÞ¼YTT4uêTÒA€.:vìèèèˆ`à0Àÿlß¾}óæÍ:à÷þgáÂ…‰‰‰Ïž=#x >hþùáà ÒA€^„„„·mÛF:ðLzÜÌÍŸŒŒŒ-Z´hÑ"ÒA€v*++û÷ïéÒ%]]]ÒY€j˜ €³¢££³²²æÏŸO:Б°°°ƒƒÃŽ;Hž‚]½&`˜/\¸pñâŤƒPêýû÷Ó¦M+**b±X_¿~íÞ½{zzúOËÈÈèß¿¿¸¸x·nÝ píÚµŸVWWW[[Ë«·ð«¨¨PVVþ矆 B: P ·#¤ ˜ßܿɒ%¯_¿îÔ©é,ìQ^^~øðáôôô7oÞäääTTT¼yóæÇ§UVV&$$ˆ‹‹wèСk×®’’’Í @+**úöí[MMMmm­²²òOHHHmÚ4QQÑsçÎqbåÀóPÀÀ_Ž9¢®®®¯¯ÏÞÕ¦¥¥mܸ±oß¾;wî¤Õ¬PYYYYY9lذ‰'^ºt©ººš½ëßµk×æÍ›«ªªØ»Zà8ÖÚ‚æU%%%ÊÊÊZZZl\íœ9sîÞ½»hÑ¢eË–õïߟkv©¨¨>vìØàÁƒ½¼¼Ø»r“éÓ§¯X±‚½«šÀ9`J¡€yÕŽ;’““Ïœ9ÃÞÕ&&&*++ ±wµÀ œ˜I;66vÚ´i©©©¢¢¢ì]3Ð ˜R(`žTTT4`À€‡*))‘μfÖ¬Yõ«‘ì‡AXíåáá1cÆŒö´oVVó}”––=z´¬¬¬ÍkpssÛ³gÏ·oߨ˜ x øÂû÷ï}}}·lÙ҆ײX¬°°°1cÆL˜0íCx€ŠŠŠnÞ¼Ù¯_?—OŸ>µa 455õðð`{6àa(`à [¶lY±bE¯^½Zû‹/jjjnݺuùòå ¸MOêÕ«Wpppttt^^žªªjÛfÔÚ¾}ûÑ£GsrrØxNv6ç€yLBB¸qãRRRºuëÖÚ×úûûËÊÊŽ;–Á€†>~üXSSÓ†¿Õ †³³s~~þñãÇÙž âÇAXÙÙÙöööõ77nœ··wŸ>}~öäçÏŸ?~< àëׯíÿ¡€y̤I“LLLlmmI÷õë×ܾ}[]]t`¾„URRbddÄd2³²²²²²˜L¦±±q3C$.\(##óàÁ*CW¸wï^rròòåËIîV[[ûË爋‹;;;;99QxM Ø××WOOoóæÍ›7o:th3v]\\ðW'|‡Åbmذa÷îÝÍ_¤ûîÝ;{{ûÜÜ\Ê‚×9{ö¬žžÞÕ«W›ßZ¹reJJÊíÛ·) Ü‹¦jiiÙx‰¥¥eHH©<À¥‚‚‚:vìhnnþ³'dff®\¹rРA:uÂLÐŒ… :88lÙ²…ÉdÿlÂQAAÁíÛ·;99á4üM 811Q[[»ñ--­¤¤$Ry€UUUmÙ²ÅÝÝ]@@ É'„„„ 2DRR299yÏž=’’’'.Ò¡CssóçÏŸoÛ¶ÍÓÓ3%%ågÏœ5k–PPP•ñ€Ñt´‘PiiiãK>ª««»téRYYÙü Ùr¶ƒ°xƒ§§gttôåË—ö„¯_¿VWWKIIQ™ øAtt´¥¥err²°°0é,Ð^|7  íôåË55µ»wï8tàGÓ§O×××wpp Ú‹ïFAKHH4^òåË—=z°w+...MaïV€ˆ­[·ZXX }J?~løÚÓÓÓÃÃ#//` 9š°ººz\\\ã%ñññjjjìÝŠ‹‹ «)ìÝ Pïõë×.\غu+ƒÁ(((Ø´iÓöíÛI‡Þ·dÉ’Q£FÝ»wÁ`())-Z´èÏ?ÿ$ 苦RSSsòäÉØØØ¿þúëĉ'Ož¼ÿ>Îmq/¾„Å`0233íííë¯g766öööVPPhxô»w¤Éî6ÿÓPÀÜ«¼¼\]]ýäÉ“†††Ÿ>}’––&øZ]]¾¾þÊ•+¿›Ø¸?0A(`îµuëÖ´´´€€ÒAþõìÙ³éÓ§'''wíÚ•th 0¥PÀ\*''‡ÉdÆÄÄ4>X@ÜÒ¥KeddvíÚUWWW^^Þp* ¸ß]†ÐB1113gÎ,**b06l°µµEûݸ»»Ÿ8q"---::ZYYÙÛÛû—S?@·ÊÎÎ^°`Á´iÓÆ/&&v÷îÝ'Ož`Þ !YYÙ 6¬_¿~ôèÑwîÜQSS;þ<Ž´ñ90p¥‹/2™L%%¥””µk×îÛ·ODD„t4€&ØÛÛ§¥¥…††jjj^¹rÅ×××ÃÃ#66–t. ';›€sÀô—ŸŸ_[[+''Wÿíž={nݺA6@3nݺemm””$**J: ´aQ Ì]Þ½{§££óèÑ£þýû“ÎÐ ‹¸¹¹‘­€¦ ˜»˜››kiiÕO< @gyyyÚÚÚ÷îÝSUU%Z £ O=yò¤ùûª^»víÕ«W7n¤,@›õìÙÓÙÙyÍš5Í<ÇÈÈÈÃ㢢‚²T@ h*##cΜ93gÎlf¿²²2[[ÛC‡uîÜ™Êlm¶fÍš‚‚ÿŸ=áèÑ£?8p ¿¿]]•Ù€b8ÖÚ‚&î÷ß?sæÌºuëìíí›±âì윕•ÕÌg ÅÄÄL›6-!!ABBâgÏ‰ŽŽvttÔÔÔ}ŒÙ²Bþ„QДB·G]]'¨ª©©100˜?~ó·Pà _¾|ÑÖÖ>{ö¬¡¡!é,ð/Œ‚®ÁÞé!ÝÝÝÅÅÅW¯^ÍÆuЖ¤¤ä‰'/^üõëWÒY€ã°«×ìÓÄóçÏ'Nœî£Ù\aÍš5ÅÅÅÿý7ç6ñîÝ;!!!Îm‚g`è%##ÃÒÒòäÉ“œÛDiié¼yó8€ö~ãááñäÉ“óçÏsnTWW¨««ãÜV y(`h¼¼¼•+WêééõïßÖ¬YœÛ­­íÈ‘#gϞ͹MГ¨¨è… Ö®]ûöí[mb×®]ÇŽ;tè¶¶vXX‡¶ÍëD:p“üü|--­Å‹§¦¦JHHpnC=Љ‰áÜ&èLSSÓÉÉiÞ¼yQQQ‚‚‚œØÄ˜1c|xÒ¤I¤³ð/0¥PÀ­Y³æÓ§OçÎ#€fee)++;::~þü™Êíò0üGDDÄСC]\\¬¬¬:u¢tŒ^FF†••U`` ¸¸8•Û ¹7ŠˆˆüùçŸTnTAA!>>¾¬¬LUUuË–-˜„p¬µ |{ÚÉÉéÊ•+nnnæææTnº¢¢B__ßÊÊjÕªUTn€+èêêîÝ»×ÌÌŒâMgee¹¹¹7nΜ9oš&p˜R|[Àùùù’’’;v¤~Ó‹-ª««;sæ õ›à Ož<™:ujtt´ŠŠ é,üç€ 222DÚ×ËË+>>þ¯¿þ¢~ÓÜbذaS§N-**"؃OwõšÇ·{ÀDܼysñâÅ=êÛ·/é,tgkk›••uùòe:Ì›‘ŸŸ/!!Á¡yBè{ÀÀ6qqq³gÏ&„Á`0233---Ѿ-áååõíÛ·mÛ¶‘Â`0‡RUUõõõ­ªª"…+¡€ùÈË—/g̘ajj:|øpÒqeeefff›6m5jé,ÜAPPðܹs'Ož %…áêêzæÌ™K—.)++9r¤ººšt".ƒc­MàÉCÐ &Lptt´±±!‡QWW7kÖ¬nݺ:uŠt.óôéÓ)S¦Ü¸qƒ&Óµ>}úô¯¿þ:zô(OŽÆ(hJñd3ŒÊÊJaaaÒ)þµqãÆGݼy“>‘¸Hppðºuë=zDý Yü†s€»!ñúTÝÉ“'ƒƒƒ?~LŸHÜÅÜÜ<55uÚ´iQQQbbb¤ã@[à0úòå é͹uëÖæÍ›¯_¿.%%E: Û´iÓ Aƒ,XPWWG:ËOc­ŸAó‹uåÊ•¡C‡ÚÙÙ‘ÎòS/_¾œ?þùóçû÷ïO: ×;zôhqq1måëêê®^½ª¤¤´yóæOŸ>‘ŽC;(`^Àb±üýýµ´´\]]œœh;ŸTffæäÉ“>l``@: /üçŸvìØäÉ“SRRHgi…·oß4èôéÓ|8Ÿ%>¹Ãƒ¦N:~üøÎ;×ÖÖ’ŽÓR,ËÖÖ655õŸþ"€ÇM›6m×®]ãÆËÈÈ ¥¥===û÷ïïíí]RRB:u0X¾|yddäúõëÏŸ?ß¹sgÒqZÁÁÁ!&&æÆ˜(€–––•••ÆÆÆQQQÜrcccccãØØØ={ötìØÑÖÖ–t"Šàdgèvøýû÷rrr\wüÖÍÍíŸþ‰ŒŒ” €¿øøø:t(**JVV–t®‡©(ùZ¯^½HGh5ÿ¨¨(´/õììì¾~ý:vìØ;wîHKK“ŽMã²*ÞöèÑ#ÒØÃÃÃãøñãwîÜÁ_ߤlÙ²eÆŒFFF<0UFFÆž={ŠŠŠHa30yeee¾¾¾ZZZ6664ŸÆ¹%ÜÝÝOœ8É;î¼ÄÍÍÍÌÌl̘1yyy¤³´K‡^½z¥¤¤´jÕª¤¤$ÒqØL˜OŸ>}¼¼¼âãã%%%I'j—­[·ž={öÞ½{h_:puu;w®¡¡á»wïHgi;EEE??¿„„™±cÇ‘NÄômDTÂzùò¥””ÜÑ“Åbýþûï÷îÝ‹ˆˆÀ9'Zñòò:xðàÍ›7•””Hgi¯êêêÚÚZ*¯ÁLX”¢Û(hú«­­]¾|ùëׯúwïN:|Ï×××ÕÕõúõ뤳pÌ„Åõž>}J:§TUUÍ›7/;;ûÆh_zZ¶lÙÞ½{ÇÇ«ŸE‡â®{£€9«  `ÿþýêêê‹/þüù3é8ì÷íÛ7SSÓšššÐÐP̶@gsæÌ9~üø”)S®]»F: ûÕÔÔDGG+**ZYY=~ü˜tœAs››[¿~ýbbbŽ=š””$%%E:›½ÿÞÀÀ`àÀçÏŸ&~aÒ¤I!!!VVV'Nœ …Í ”œœ¬ªªjiiÉÿ@œìl»Žø'''÷ìÙ“WÊ&$$Lš4iõêÕŽŽŽ¤³@+¤¥¥™ššÎ›7ÏÅÅE@@€töc±X555‚‚‚lYaQ ƒ°~éÖ­[ ,Ø·oßܹsIg€VËÏÏŸ:uªŠŠÊñãÇq£”æa}=þ|çΤSP꯿þZ¸páÅ‹Ѿ\JFF&22²¼¼|ܸq<9<¥I©©©cÇŽ=sæLii)é,  ¸Í>~üèéé©¥¥5kÖ¬ªªªêêjÒ‰¨PSSckk»ÿþèèè‘#G’Žm'""rîÜ9}}ýaÆ%$$ŽC…+Vœ?¾OŸ>K—.‰‰!›ÇZ›Ð’¦¦¦²²²K—.9r$OžDùQaaáìÙ³ÅÅÅIÇö°··¯ M: E>~üгgÏ–ÆÃ9`JáðâããÍÍͧM›¶{÷îŽ;’ŽìôôéSsss›Í›7sÝO9 瀉)(( ¼S§N7nÛ¶m{÷îEûðž¡C‡>{öìöíÛ“'OæŸSÂ?QVVFÁ†PÀMKKKsuuUUU]²d é,$•””XZZzzzÞ½{wΜ9¤ã§ôìÙóÖ­[ZZZL&3::štb***|||zõê5wîÜÐÐЪª*Λh“[ÇIDATm ÇZ¿WZZÚ¥K99¹Y³fÍ›7oذa¤“””4sæÌáÇ8p@TT”t Âõë×—,YbooïààÀ'\~ôåË— .tèÐáÞ½{8Lšš>?ÖzòäI'''Å‹“ΔÊÉɱ°°””}îÝ»§¥¥¥££F:I½ï! þãêÕ«ÚÚÚ¿ýöÛ“'OÔÔÔHÇ2wìØhkk»lÙ²’’Ò‰x þUVV¶råJ;;»   ={öàæ 0jÔ¨¸¸8‹¥££Ã-·â"(``0Œ»wïjii•——¿xñÂÀÀ€t ‹®]»?~|÷îÝfffŽŽŽååå¤ñ0¿+((°¶¶^´h‘ÏéÓ§1ÅüÈÌÌ,>>þÝ»wZZZ·nÝ"‡G €ùÚùóç544ÄÄÄLMMIÇú’’’ ðññ±±±Y¼x1&)j?0ŸzóæÍ”)SÜÜÜ.]º´ÿþ®]»’N\`âĉ¯^½êÞ½»††Æßÿ YÛÌwJJJþøãaÆ9òùóçü<Ó´˜˜˜··÷•+W>>>ÁÁÁ~~~½zõ"¸[‡–,Y’œœ,++«©©¹cÇjîaÀ3PÀ¼ïÅ‹S¦LY°`ÁªU«?~ŒcÎÀF]ºtÙµk×ãÇ_½z¥¬¬|ðàAŽÞÀ€— €yYFFÆœ9s&Ožmdddkk‹û·øüù³¯¯ïáÇ•••mmm§L™Ò©S'Ò¡šƒ¦m ¸ªªêÒ¥K¾¾¾ ‹-Zµj•‚‚éP­V]]|äÈ‘ôôô%K–X[[ÿöÛo¤C5 L)p\\ÜéÓ§455mll¦OŸŽËŠ€¼~ýÚ××÷ìÙ³ÚÚÚK–,™1c†ˆˆéPÿ¦} 8333(((00ðÛ·o–––‹/VTT$ €Í*++CBBþþûïÇO:uΜ9cÇŽíØ±#é\  ˜bÄ øÓ§O¡¡¡þþþñññ³fÍš3gŽ€€ÁHÈÍÍ=þ|```NN΂ ÌÍ͇ BöÓL)RüéÓ§Ë—/Ÿ;w.66vüøñ³fÍš2e 6JJJ ¸téRqqñìÙ³gÍš5tèP"MŒ¦ÅœpõêÕðððøøø &Ìž=ÛÔÔ´sçΔ ­¤¤¤   àààoß¾™šššššŽ7ŽÊ þPÀ”¢ €«ªª¢¢¢®]»ZSS3uêÔ‰'¢wš”ššzíÚµ°°°gÏžNš4ÉÔÔ”‚;«¢€)Å¡·›ÅbÅÇÇß¹sçÎ;ÑÑÑjjj“&Mš4i·\@………áááaaa7nÜ““366622=zt·nÝ8±90¥Øøv×ÕÕ%&&>xðàîÝ»‘‘‘âââcÇŽ5223fŒ¤¤$[6ÀŸjkkcccïܹsûöíÇkii3fäȑÇg×VPÀ”jçÛ]SS÷àÁƒ¨¨¨ÈÈHiiéáÇŽ3¦oß¾lÌ õ***>|yÿþýØØXUUÕ1cÆèëë1¢SO£€)Õ†·;===&&&&&&66666VAAA_____ߨØX^^žC9àGUUU=ºwïÞÇ?~ܳgÏ¡C‡ß½L)›7o¦¦¦¦¤¤$&&¾~ýº°°PUUUSSSGG‡Édjjjâ^÷Ü®¦¦&--íåË—±±±qqq‰‰‰EEE PSSSSSSVVVWW×ÐÐ@S¤ªªJXXx̘1******ìÝ»7f‚ày%%%))) ÉÉÉiii )))(`êŸ h‚sÐ+¥^vv¶¹¹y·nݺuëfnnž““C:@sx¡€KJJŒŒŒ˜LfVVVVV“É466.++# à§xáXë¾}ûbccÏž=Û°dÁ‚C‡µ³³kÛ qêátsBCC---/±´´ !•à—x¡€µµµ/ÑÒÒJJJ"•à—xáX«Pii©  `Ã’êêê.]ºTVV¶m…8 õ8×8±RnáâââêêÚäC¸ê8Švõdeeãããeee–äååéèèäææ¶m…´Ý¦m0²µ²µ m³Ñ6ÙÚ ƒ°š£®®×xI||¼šš©<¿Ä |êÔ©¸¸¸ÖÞô±m†Ð6ÙÚ ÙÚ†¶ÙhŒlm…CÐÍéÚµë;wž={¦     sûöí6·/èûGA´ý[Œ¶ÁÈÖVÈÖ6´ÍFÛ` dk+Îeëèââ‰õr;CCCÒšFÛ` dk+dkÚf£m0²µ‡²Ñ÷Æ ç€¸ €0(`PÀ €@€  @ €0(à&ü€t¢&äåå)++Ó'ÛãÇ­­­…„„äååÇŽL:Ô¿¢¢¢,,,¤¥¥ÅÅÅõôô._¾L:Ñÿ<þ|ÕªUÝ»w§Ïevv¶¹¹y·nݺuëfnnž““C:ÑÿÐðíªGçŸ1:ÿn6F·Ï4*Š€? ÿÛRWW7~üø€€úD2dÈÁƒ“““+++¿|ù1hР?ÿü“t.‹Åb0cÆŒ¹ÿ~iiéÓ§Oµµµ}}}I‡ú—ššÚÖ­[hò_Y\\¬¤¤´}ûö‚‚‚‚‚‚íÛ·+++—––’Îõ/º½] èü3FçßÍ4üL£ ]þ©´BŸŸ€Ÿñôô\¸p!‹ÞQÓÓÓ»wïN:‹Åbmذ¡®®®áÛ¸¸8%%%‚yšD“ÿJ//¯ùóç7^2þüýû÷“Êó34y»pÅÏXúün6 ágIp;Â&ÐùÖÐ ãåË—sçÎ}úôi×®]é5;;›Éd~þü™tï•••IHHTVV’ò4ù¯422rrr?~|Ã’7nìÞ½ûöíÛSýˆ&o×ÏÐóg¬Ý~7éù™FAœnZÏž=åääæÏŸŸœœL:Îÿ”——[ZZž:uªk×®¤³üÔׯ_ëO‰­\¹’t–&„‡‡khhNAS‰‰‰ÚÚÚ—hii%%%‘ÊÃ¥hû3FÃßM:¦q¼8½‹Í¦NU^^ž““³oß>™/^õ¯ÿ×Îý…²÷Çq?¿Âv!òo)Z¢Q¦¸eË¿’6”"ÊêÛ.\rM­Üpáb—.vAq£H©Yr!7 Sr3\,6‘ÈÕ²Îïb¿ØwógõËÞó|Ü9V^ûü9/§ùógnnîõKÕf0yiuuu½¼¼H'Ju_WW·¿¿/$•"S™ŸŸ‹Å’¯Äb±‚‚©<Qd¸Þ¥æSvo*{OËB¨òVUæñxzzz¤S躮oll´··'ïuk²h4º²²RYY9;;+å/‘H¤££Ãï÷Ky‡"SIÿO*¯1]½½ùSîiú÷¢o5k2ùc@$),,Ìfª„ôl&“éêê*å5Ù¦g6n~¿¿ªª*›©>ʇ›šš|>_ö#}ìõ»Ù”®´´4‰$_¹¹¹)//—ÊóE†+…øËÔÞL§Î=íKßQ¿ýpòX|òšlFJþ¹)ÙB¡PuuuÊçÒD>©œÉ¸µ´´ÜÞÞf3U»ٮ¯¯ûúúm6[ö#}L5 '''ÉW‚Á Ùl–Ê󃨰Æ2$µ7Ó©sOûÒwlÛß^À™X[[kkk“N¡iŸ›¤£½ãàà ¾¾^:…¦iÚíímooïüü¼Õj•΢ºþþ~¯×›|Åëõ Håù)~ÖSgoþ {Ú·Afå_Äjµ®¯¯ßÜÜÄb±‹‹ ·Û]RR¤s½OìîîÞØØˆF£±X,///Æíímé\º®ëÍÍÍ«««Ò)¾ ÈT>==ÕÔÔ¸Ýî×Äa2™žŸŸ¥s¥Rd¸^©¼ÆTÞ›é™ÙìoU)»»»‡£¸¸8//Ïh4ŽŸŸŸK‡ú"‹U×u¿ß?88˜·ŠŠŠ¡¡¡ÃÃCéPÿy÷Wχ‡é\ºþA6ÙH———v»Ý`0 »ÝžòˆN–‚Õ òSyo¦SdB³Sª|ä€_…gÀ €@ €@ € 0(`PÀ €@ €@ € 0(`PÀ €@ €ðfdddff&ùÊôôôðð°T ‡ý£ëºtª¸¿¿·X,›››‹EÓ´£££ÞÞÞ`0XVV& È5œ€¼)..öx>öù|Ò‰€ÜÄ À›‡‡‡ÖÖÖ“ɤiÚÙÙY (**’ŽäNÀÞ¸\®±±±Dûjšf6›GGG].—l* 'q@'`PÀ €@ €@ €€ò>×þbÖÔIEND®B`‚gsl-2.7.1/doc/images/rand-lognormal.png0000644016036000116100000005027013373111455014671 00000000000000‰PNG  IHDR€àº³K³bKGDÿÿÿ ½§“ IDATxœìÝy\Ìùãð™îÝ%E%Ò©R(!¹B6ÂRäf­3–]¬•u´»¬+Ç"W‡{]!Ö‘¨¨$eº‹Ò}×üþ˜ï¯o_;M×Ìç=ÇëùÇ>øÌÌçóê£×¼?Ÿ÷ç3t‹EjI ŽPÀ €@€  @ €0(`PÀ €@€  @ €0(`PÀ €@€  ÀN'R­ý¼ôÿ'++«¥¥5lذ-[¶dgg·çµ]‰ÁÛý/nÿš ,PÀÀ ‹Åb±XUUUÉÉÉ;vì(//·±±¹xñb‡VBe¢nAXÐY,é ‡N¯ÿ5Zûy9.ýúõ¨Q£=zdnnÞÅõóêù¼z-•0è°°°°Aƒ1 ƒ1hР›7o¶|4>>~ôèÑ CCCã»ï¾«ªªjydµ±±qÛ¶m½{÷–••5119pà@;×L§Ó«««—/_®¥¥Õr…UUU‹-RSSÓÐÐøñÇY,Vuuõ’%KÔÕÕUTT–/_ÞÐÐм’œœœeË–)**¬[·®¦¦¦?~ÿþý}}}wïÞÝœý‡òòòuëÖ+(((++5êÆÍOh>šÍýÇiÞJUUÕâÅ‹544 †››[RRRË]ñïTÍ[ḭvîaîÿ:<Æ€áò¿FTT”ššZhhhaaaAAApp°ªªê‹/ئ¤¤tïÞýÀùùùùùù^^^Ík£Ñh‹-Ú°aCZZZEEÅ£Gúôésîܹö¬™F£Í;÷Ì™3¥¥¥-sΙ3çäÉ“ÅÅÅiiiƒ Ú¹sçœ9sNœ8QTTÄ^²oß¾æçëëëŸ8q¢¼¼<##cÚ´i?ýô÷Ÿ·µåoß¾544üê9“&Mòõõýøñc]]]QQQXXØèÑ£[[Ok?Nóf̘±wïÞ¼¼¼¼¼¼½{÷jii}øðKª–¯mí¡6÷0—žCpÀ¥€=<<<ØrI@@ÀäÉ“Ùöòòò÷÷oùèÖ­[[væM›Z>zóæÍ¶gÍ4m÷îÝÿÎÙ²_Ÿ>}Ê`0Z.‰ŒŒìß¿?Ǥ¸¸¸OŸ>ÜÞÖ–WWWËËËõœnݺµlSîëiíÇiþï¿þÚò¡-[¶Ìš5‹Kªöp›{˜Ë¿Ï¡€8àRÀzzz™™™-—0™L}}}öŸµ´´ÒÓÓ[>úáÇ–ÝÐ<Œc+..VUUmÏši4ZFFÆ¿sfee5ÿµ´´ôßK”””Ø®®®Þ²eKß¾}åååÙÀ$%%¹ÿ¼­-¯¬¬TPPøê9 .ÌÎÎnÏzZûqšÿðÕŽzÿþ½¶¶6—Tí)à6÷0—žÃl¸Lä‘““+--•••m^R[[«¬¬Ì>Ÿ*%%UQQ!''×ühuu5»«hÿ–QBâæ^4o‹ûšétz]]´´ôW¯mjjjyŽ“ãöúW­ZõîÝ;ƒQSSÃÅrùy[[þöíÛo¾ù&--­ås222V¯^}ûöíÞ½{4ÈÃÃcâĉÍ'e¿ZOk?Nsžêêê¯v£’’R}}=ǵ555±?L´¶­vîa.ÿ:<‡IX£¥¥UXXØrIaaa=ØÖÐÐÈËËkùèWýêý½ýk¦Ñh_ÕÛ¿g$µvÎÅ‹mll FKOOo-I›®^½:|øð¯\¹r¥¤¤äܹsƒÞ¾}û‚ ¸¬„ãÓ,77÷«¿jjj²ÿ¬¢¢RRRÒòÑŒŒŒöÄnssù×à9ü¶tŒ­­mXXXË%ׯ_·µµeÿÙÕÕõÂ… -={ö,OÖÜu_)Ož<Ù¹õÄÇÇïÝ»wõêÕ•••µ¶¶^´hQxxøùóçÙ åääêêê:´•3gÎ|õב#G²ÿlbbÕòÑ'N4ÿ™Ë¶ø½‡:†ú£Þ‚ËÿOŸ>UUUeϤ-,, USS‹ŽŽf?š’’¢¥¥uèС‚‚‚‚‚‚ƒz{{ÓZ?=Ùr!÷5sm{–xyyy{{çååìܹsÊ”)܃µ\ÞÐÐP\\ùÃ?hjj^ºtéßÏqvvÎÊʪ¯¯ÏËËÛ°aƒ››û!ssó+W®444pÉÉúßó¸^^^û÷ïgO&ß¿¿––VZZûѳgÏ=~ü¸²²òýû÷?ýôÓ¢E‹š_Ëe[<Ùü‚ß-¸Z½r劽½½¼¼¼¼¼¼½½ýµk×Z¾öÕ«W#GŽ”——WSS[´hQaa¡¬¬lój9n«=kîzy{{«©©©¨¨Ì;·¼¼¼=Ì&##£©©éìììçç÷Õ4«æ×>|øÐÓÓS]]]NNÎÈÈèÇ,))a?nll,))ÙÎÏ"4­¢¢bþüùªªª cÆŒIHHhùÌ€€ccciii]]Ý-[¶°¯un϶º¾‡xó øëîÝ»k×®}ýú5é Xp€Ç<<<žxð`ƒÑÚÏTB´õ¿vîÜiiiÉ~(%%eÊ”)¾¾¾……….\ؾ}û£GhÿÿvÍ/i^•“““]^^ÞÇ™Læ–-[:”$))ÉÚÚºå++«·oß¶çµÓ§O÷ööNOOÏÏÏ?x𠜜\PP8Œb“X@è(19®¼yóæÈÈHæããcmm½fÍö£×®];zôèÍ›7iíx'ùòåË€>|øÀþ+÷‘({U222•••ÒÒÒÍËëëë»uëV[[ÛfòqãÆ9::þüóÏÍK¶lÙrïÞ½'Ož´?@KbòV‰CÐäݾ}ûǼ}û6»}i4Ú³gÏ&NœØü„¡C‡ÆÇÇ·öòššš_ýÕÔÔTAAN§«©©1™ÌæGY\u=üóçϽ¼¼Z.™9sæ»wï¨ àççÇñH>5üüüº˜ŸÄâóKG‰ÉÇ:èèèèo¾ù&,,ÌÞÞ¾y¡¬¬l]]]˧IHH466Ò8½“¬ZµêÝ»wþþþ&&& £¦¦F^^¾Cï6ZZZ ZZZÍKòóómllòòòÚ|­´´tyy¹œœ\ó’êêj•öŒž9“·JŒ€HJII™4iRPPPËö¥ÑhJJJ¹¹¹-GŠìöåèâÅ‹666 ƒF£¥§§·|”ûŽýssó¯FØ fffíù455³³³[.ÉÊÊêÙ³g‡¡€Ú››;vìØ]»v=ú«‡\\\Z›„,''÷ÕฺººåôäÉ“-mÏà &µ|UPPPËcà\¸¸¸·\rúôé–?¿ÃW¤HhhhˆŒŒŒ‰‰IOO¯ªª’’’ÒÕÕµ´´trrjy¨ :gìØ±+W®üê*ÛæÍ›G%//?aÂ99¹çÏŸïÞ½›= ËÐÐðÖ­[îîî’’’ì'»¹¹­Zµj×®]AAA?~ìh’… Z[[ïØ±cÉ’%4íСCÏŸ??räHó¸/Ý´i““““ŠŠÊŒ3h4Ú™3g_¼xÑÑ À3Ü?òˆ'!Ú-999Ë—/WWWwppX¹råÁƒO:uìØ±M›6?^UUuøðá§OŸ®­­%@ˆqó|õê•›››¢¢¢¼¼¼‹‹Ë½{÷ØËÃÃÃÙíË^RTTäíí­¦¦¦¢¢2wîÜòòòN¼Ûdddxxx(*****zxx|üø±ù¡¢¢"555.¯5jƒÁ`0cÇŽMLLìèÖYmí ÑÿŸN,N¡w”PÌ,`±X»víúý÷ßçÍ›·råÊ–'ršÕÕÕݼyóèÑ£‰‰‰kÖ¬Yºt©ŒŒ õQ€©©©¤ƒˆþ5‚4 õ¿€ËÊʦOŸ^VVvæÌ==½6ŸŸ˜˜¸aÆ”””ƒŽ5Š‚„@=›'NØØØ"RPÀ”ð.((`_P¿gÏ)©œÅ¿}ûöâŋǿk×.þ%¸ þãóçÏÇ÷ððèPûÒh´±cÇ&$$”——8°÷®>A “ªª*ww÷I“&mÚ´©skPVV^½zõðáÃ/^¼ÈÛxÐ~}¬•=ííí-%%uêÔ©®_ÿúõëÉ“'Ïœ9sË–-¸Ä 5ük\,4BCC_¿~Ó¾ìß¿ttôøñãóóó>Ü|"P‡ …CVVÖêÕ«CCCåååyµNMMÍ|üøqÆŒ_ݯV\\Ü÷߯¢¢BêØñ",|}}—.]Ú¿Þ®¶[·naaaÕÕÕ¼]9€˜ãS?Íš5«{÷îOŸ>åÇÊ…"€ÈГd Ú9à;wî,[¶,11±å]dy¨¡¡aöìÙŸ>}ºvíGØbŽßï$Äß©ˆ .C_õõõ+V¬Ø¿?ŸÚ—F£IIIijjNš4 Ç¢þû·EDD888ÈÉÉõîÝûøñãÍ/iùÂæ'çää,[¶LQQÑÀÀ`ݺu555Tþ aaaƒf0ø¦#A€t'Nœ000pssãëV$%%ƒ‚‚fÏžÝÔÔÄ×m¯ná»sçNKKKöC)))S¦Lñõõ-,,¼páÂöíÛ=zÄ~IË6¯ÊÉÉÉÎÎ.//ïáÇL&sË–-”ýÓ§O÷ööNOOÏÏÏ?x𠜜\PP8ŒbŸî1-Ôg·TWW÷êÕëåË—”mÎÅÅeÙ²eÔl@äää°ÿ:kÖ¬]»v5?zõêÕqãÆ±ÿÜæ;IqqqŸ>}šÿÚÑ÷ꎾS¹¹¹mݺµå??¿!C†P@HñïÇ‹Ý×Q‚ó[õçŸNž<™Ê-–––²¿ìŒÊ‹ððpmmí”””æ%†††©©©Í-..îÙ³'ûÏÿ~'©®®Þ²eKß¾}›'[HJJv:LGß©TUU?|øÐrÉû÷ï544¨ °yóæ–u¾yóf*ŸÖÚÚƒ §Ð;J@fÔÕÕõéÓ'<<¼ù`5òòòœœœ¶lÙ2kÖ,*· ࢣ£¿ùæ›°°0{{ûæ…²²²_Íœhll¤qz'YµjÕ»wïüýýMLL FMM¼¼|§ßm:úN%--]^^Þr6IuuµŠŠJmm-5„nÄ!ŽÎŸ?onnNqûÒh4mmí[·n >¼Gøê$¶”””I“&µl_¦¤¤” ­­Ýž•\¼x1::ºW¯^쿦§§·|”ûd¨®w€¦¦fvv¶‘‘Q󒬬¬–ßdÊïðLÂ\{÷î]¹r%‘M›šš^¸paÖ¬Y)))D”ÜÜܱcÇîÚµkôèÑ_=äââríÚ5ޝ’““ûjp\]]ÝrzòäÉ–¶y ´‹\\\‚ƒƒ[.9}útËŸˆßàk]>ˆ-‚a·DDD˜šš655ÌpüøqSSÓ’’‚¥¥åž={8>ôæÍmmíS§N}þü¹¢¢âÞ½{Í“°ÌÍͯ\¹ÒÐÐÐüd///ooï¼¼¼‚‚‚;wN™2¥+ï6_Ëe…ÉÉÉjjj»wïÎËËËËËûóÏ?»wïþñãGÞ=üû1Åb÷u” üV͘1# €t Ö²eËÆßò@ q½¼zõÊÍÍMQQQ^^ÞÅÅåÞ½{ìåáááÆÆÆì­³—y{{«©©©¨¨Ì;·¼¼¼ï6\©©©qymllì¨Q£ ƒÁ;vlbbbG·Î=€HâßO'§Ð;ŠøÌ‚¢¢"ccã>¨ªªŒA£ÑÜÜÜú÷ï¿sçN²I M©©©¤ƒˆÜ K¼O˜0xûÒh4))© .\¿~ýÔ©S¤³@Nœ81oÞ<Ò) ½0æ€øØÂÂâðáÃÎÎÎ3´”šš:tèÐëׯ;88Î@)Œ€ÅÈ‹/êëë‡ B:È™˜˜üõ×_Ó¦Mûôéé,",pΞ=ëåå%h·G÷ðððööž5kî À8ÍÁCÐMMMººº<èÛ·/‘\466ºººŽ9òçŸ&€"8-."""´´´°}i4š¤¤äÙ³g>üàÁÒY„ X°°?“NÑ*mmíÐÐÐY³fåææ’Î ÜpšR‡ {ô裯¯OýÖÛoëÖ­÷ïß¿wïž”î%"‡ Å³gÏtuu¼}i4ÚÆåååùåÒA„ X€Üºukܸq¤S´MBB"88844ôÖ­[¤³+°¹yóæ„ H§h ÐÐÐ äåå‘Î ”PÀ‚‚ÉdÑ­¦† ²hÑ¢Ù³gãÊ`€N@ Š›7oº¹¹IHӿȦM›jjjþüóOÒA„0½Ý‹¶ðððñãÇ“NÑ1’’’¡¡¡þùçË—/Ig2¸ ‰ê/Cª««ëÞ½{zzºšš•Ûå‰7n¬Zµ*..NII‰tÃeH"îÙ³g¦¦¦Âؾ4m„ £G^¸p!é Â,îÝ»7jÔ(Ò):o÷îÝÉÉɧOŸ&@h €Â?ÿü3zôhÒ):ONNîÌ™3k×®ÍÈÈ @8à0Ÿ.**244üôé“´´4eå‡Ý»w_¾|9""BRR’tÞÀ9`QvÿþýaÆ {ûÒh´U«VÉÈÈìܹ“t!€&/""bøðá¤Sðû•{÷&@С€É{òäÉСCI§àž={8pÀÇǧ²²’t†sÀPy¸¨¨ÈÈÈèóçÏ¢tÞtÞ¼yÒÒÒGŽ! «pXd=yòÄÑÑQ”Ú—F£<|ø0,,ŒtÁ…&ìÉ“'ÎÎΤSðƒÁ8yòäâÅ‹ IgP(`Â"""DæpKNNNsæÌÁí±ZƒsÀPv¸¬¬¬W¯^Ÿ?–‘‘¡`s«««4hвeËæÍ›G: @'á°hzùòeÿþýE²}i4šŒŒLppðO?ý”žžN: €ÀA“=pà@Ò)øÈÜÜ|ãÆ³fÍjll$@° €Izñâ…ƒƒéüµbÅ eeeÒA Îs@Ù9àž={FEEéééQ°-‚rssmmm¯]»&ÚÃ}I8,‚²³³E¾}i4šŽŽÎþýûçÌ™S]]M: € @#ÇŸ›M›6ÍÖÖvýúõ¤ƒ 01ÑÑÑâSÀ4- àï¿ÿ~ôèé LŒX€i4šššÚÑ£GçÎ[ZZJ: y˜„Å“°X,–ªªê‡ÔÕÕùº!A³téÒòòò   ÒAÚ“°DMjjªššš¸µ/FÛ¹sçË—/ÏŸ?O:a(`2âââlmmI§ @AA!44tÅŠYYY¤³„BÖÎÎŽt 2lmm—/_>oÞ<œþq†&ClGÀl6l¨««Û¿?é Ä`üž„Åb±ÔÔÔRSS555ù·—‘‘1pàÀû÷ï[ZZ’ÎÐ*LÂ)éé銊Šâܾ4ÍÀÀÀßßöìÙuuu¤³€& ..NlO·4þ|]]Ý­[·’@ ˜1?ÜÒ‘#G_¼xA:ÕPÀÄÇÇ[[[“N!zôèàããSUUE: ¥0 ‹~OÂêÕ«×Ó§Oõõõù· á2{ölƒqèÐ!ÒA¾†IX¢£¸¸¸¢¢B¾…°ýnß¾}ãÆ ÒA¨ƒ¦Z||¼••N'D€())/Z´¨  €tŠ €©–˜˜haaA:…Àqrròññùî»ïH  ˜j‰‰‰VVV¤S¢_ý•Édž8q‚t* €©†)Э‘‘‘ ýñÇß¿O: ßa4ü›óÖÔÔ¤¬¬œ››«¨¨Èõ‹€Ý»w_½zõáÇ’’’¤³ˆå,èÌÌLOOO%%%%%%OOOîß^GÿÊrvHZZš––Ú—‹U«VIKKïܹ“tþЮ¨¨1b„­­-“Éd2™¶¶¶®®®ÜïÕÀú_”Eí¤¤$ÌÀâNBBâÔ©S{ö쉋‹#€´€;6hР7ªªªªªªnܸÑÁÁ!00t®®z÷î]¿~ýH§tºººûöí›9s&n"L@ 8,,ÌÇǧåŸk×®‘ÊÃ+ÉÉÉ(àö˜>}ú€Ö¬YC:¿h'%%}5UØÊÊêíÛ·\^Ò£GiiimmmooïwïÞñ9`'½{÷ÎÔÔ”t ápðàÁ»wï^¿~t¾Ðþò勚šZË%êêêÅÅÅ­=âĉ/^,//ùò¥½½ý°aÃ^¿~Íÿ˜Ãb±RRRúöíK:ˆpPTT ^¼x1n"I@/C’‘‘©¬¬”––n^R__ß­[·ÚÚÚö¼üðáÃ×®]»}û6÷§ùùùmÙ²…ãCüØ-ÙÙÙÌÉÉáùšE؆ Þ¾}{õêUÒA@L‰ÝeHªªª_w‹ŠŠ¾s1yòäÈÈÈ6ŸæççÇâ¤3‰Û'€;ÁÏÏ/;;û¯¿þ"€Ç´€ÍÍÍããã[.IHH033kçËsXŸœœŒÀ%##sþüù_~ùå«ßa' >>VVVëÖ­#€g´€}úìÝ»wÆŒ•••¤³t ˜"8ÍC3fÌpttüþûïIè<0X,VZZ ˜‡bccO:E:@'¡€©››Ë`0”••I çÏŸ_·n]JJ é,¦¾…ÌÍÍýõW//¯v~G€@ASÇŸùä»ï¾Ó××ÿé§ŸHè00Øwá B48qâÚµkøÂ`:(`*` 4ÿ¨¨¨œ9sæ»ï¾ËÌÌ$ PÀTøðბ‘é"kРA?üðÃôéÓëëëIgh/|¼½õvSSS·nÝŠŠŠäååyµNø ‹Årww777ÿý÷ßIg‘‚/cbÙÙÙjjjh_¾¢Óé§OŸ>wî\xx8é,í‚æ»>’N!úÔÕÕCBBæÏŸŸ““C: @ÛPÀ|‡¦Œ³³óÒ¥K½½½Hgh ˜ïPÀTZ¿~½¼¼ü/¿üB:@PÀ|—žžŽ¦Œ„„Dppphhè7HgàÌwSLCCãܹs ,HOO' U(`¾ûðáCŸ>}H§/ƒþùçŸ===«««Igà ×sÀë¾ŠŠŠŒŒŒ¾|ù“µA‡x{{3Œ£G’B × ž9# IDAT+&èÈ‘#Ož< !€0¡€ êÖ­ÛÅ‹W¯^ýæÍÒY¾†æ/L&ËÂÂb÷îÝžžžeee¤³ü0}üø±wïÞ¤Sˆµ™3gŽ9röìÙ˜îÌ_(`A°wïÞâââíÛ·“ð_(`þÊÌÌÔÓÓ#BÜIKKŸ;wîÈ‘#øª¸ ‰^M:g±X ãóçÏ ]_tÑóçÏ=<<¢¢¢ Hg¡Ë„R~~¾’’ÚW@ 4è§Ÿ~š6mZMM é,(`~b2™úúú¤SÀ­ZµÊÐÐpéÒ¥¤ƒ €ù ,€Ž?þòåËÇ“âNŠtQ†@ ãÊ•+NNNÎÎÎ¤ã€øÂ˜PÀ‚ÉÐÐ088øÛo¿ÍÌÌ$Ä ˜p°À5jÔÚµk=<<ªªªHg1…æ#Œ€™¯¯¯­­­®Ä"PÀ|„pÈÌÌܹs'é Ž0 ‹_ŠŠŠ¤¥¥•””HVÉÉÉ]»vmàÀfff&L Ä FÀü‚á¯PÐÖÖ>þüüùóß¾}K: ˆ0¿0™LÌÀ ƒ˜0aBAAé, FPÀü’••¥««K:´Ë´iÓ|||&Mš„»TePÀü‚ïA.›7o600À×ePÀü‚°p¡Óé?~ô÷÷'ÄfAó &a yyù«W¯8ÐÈÈhÚ´i¤ã€ˆÃ˜_0FÚÚÚ—/_^¶lY||<é, âPÀ|QWWWTT¤­­M:tØ€>|¸¡¡aùò夃€hBó XHII]¸páÙ³g{öì!DÎóEVV– éÐUŠŠŠaaaŽŽŽ¤ã€HÁ˜/0ººº×®][¼xñÓ§OIg‘‚æ Ü…C”ØÚÚž;wnòäÉ ¤³€è@óîÂ!b\\\vïÞ=qâD\ ¼‚sÀ¼WZZ*!!¡¤¤D:ð’··w^^ž››[dd¤²²2é8 ô0æ= EÕ?ü0bÄÚÚZÒY@èµQÀÅÅÅôôô400`0 ÃÀÀÀÓÓóàÁƒÅÅÅÔD:999={ö$øb÷îÝÊÊÊ .Ä·@µZÀÙÙÙ .ÔÑÑ9sæÌðáÃoÞ¼™—————wóæÍaÆ…††êèè,X°§Äþ #`&))yöìY&“‰t@Ñ[û ///o``°{÷î±cÇr|Bxxøš5k222ª««ù™:½ÕÝÒ~~~Íÿ‘TVV6|øpOOÏ7’ÎüÕÅFà¢Õð·ß~ÓZûÒh477·˜˜˜o¿ý–±„A‹<%%¥;wîïß¿ŸtV­Î‚>uêT›/VPPhÏÓÄ XhjjÞºukèСÚÚÚS§N%„.Câ=°˜èÓ§Ï­[·F­ªª:räHÒq@È´}ÒÔ©S ¿ZøåË—3fð'’ÐËÎÎîÕ«é@++«K—.y{{?þœt2m°••UHHHó’»wïÚÙÙò3˜°ªªªª®®VWW'(2dÈÓ§O{xxÄÇǓΤ]“»^½zµ`Ámmí={öÄÇÇÿõ×_ýúõ£ ]™ó–––6nܸ´´4ÞF÷÷߯X±âÁƒ}ûö%x‰À,è–lll^¼x1|øð#FXZZ>zôH„Û·‹püY|àw2!…gK—.7oÞèÑ£?þL: º¶ øÇœ8q¢ŸŸß‰'´´´öïßïëë;f̘͛7SOèà$1·~ýúo¾ùfôèÑ_¾|!ZÛüñãÇׯ_O˜0¡yÉÈ‘#_¾|™ššÊÏ` #`ضmÛˆ#ÆŽ[ZZJ: .~Mîj]™ófooèÐ!{{{ÞF¡³víÚ§OŸÞ¹sGQQ‘tè<³ ¡ýòòò0h4Úüaiiéîî^UUE: ¢V xîܹm¾qTUUÍ;—ב„Xccã§OŸzôèA:G§Ó>Ü»woššÒq@à´ZÀçγ··¿wï^kO¸{÷®½½ý¹sçøL(ª©©IIáÛ@£ÑhÇïÞ½û„ 0€¯´ZÀ©©©?~ü°aÃ>üîÝ»òòòòòòäääC‡9;;»»»4S±ZÊÍÍÕÑÑ!ˆ¤¤äéÓ§õôôÜÜÜ***HÇÒÆ¹åOŸ>9sæáǯ^½úôéFëÞ½»­­­««ëôéÓEõŽÇ>åvôèѰ°0žG¡ÖÔÔ´xñâ”””[·nuëÖtèþMÂÂ,h:½»9wäÈžGa‡R˜-rssqàHBBâèÑ£¦¦¦ãÆÃ±h µ³€ß¿ïã㣣£#--­££ãã㓞žÎïdÂç€ :~äÈ33³Q£Fá>YÐv'&&2ÄØØøÉ“'eeeOž<122rttLJJ¢ ŸpAwìk“œœœ\\\ HÇ’Ú>´=vìØñãÇ/_¾¼åÂ}ûöݾ};<<œŸÙˆéô›“'Oöïߟç‘@Älݺ5$$äîÝ»zzz¤³7$'a1Œôôt--­– óóó +++ù‘‰¸Nïn--­ÄÄÄîÝ»ó<ˆž}ûöíÝ»÷Þ½{†††¤³@«øWÀmß2BVV–ãryyy^‡nuuu¥¥¥¤ƒ€pX¹r¥‚‚‚‹‹ËÝ»wûöíK:P­ísÀ“'O¾páÂW ÏŸ?ïééÉŸHÂ*??_KKKBË¡½.\Èþê¤øøxÒY€jm€÷íÛ·hÑ¢ÒÒR///ÜÜÜÐÐÐäääÀÀ@ ò ÌÀ‚Nðñña0cÆŒ¹|ù²££#é8@¶mÓéô6×"bwóèÜÿË—/‡††þý÷ßüˆ¢íŸþ™5kÖ‰'ÆO: ü’7â`µ?’ Œ€¡ÓF¶`Á‚“'O’ÎÁ÷öðL~~>¾ˆ:ÍÁÁ!""ÂÍÍ-;;{Ó¦M¤ãßaÆÏ €¡‹LLLž={vùòåÕ«WãÀ€ÈCó ºNKKëáÇÑÑÑóæÍ«¯¯'øÌ3(`à •þù§¨¨ÈÝݽ¼¼œtà0Ï €W Æ•+WúôéãììœM:ð ˜7ššš>}ú„›P¯HJJ:tÈÇÇÇÑÑ1!!tà=Ì‚æââb%%%iiiÒA@¤¬^½ZWWwôèÑ/^tvv&x #`ÞÀñgà“©S§†††N™2åܹs¤³/aÌ(`àWW×û÷ï»»»§¤¤üòË/í¹9>Œ€y |eaauçÎéÓ§WWW“Ž<€æ öW!‘N¢¬G<‘‘quuýüù3é8ÐU(`Þ(((ÀøMNN.((ÈÅÅÅÑÑ155•tè0oà4PƒN§oß¾}ýúõC‡ýçŸHÇ€ÎCó ¨4wîÜK—.Í;wçθk4€Bó (6dÈèèè‹/úøøÔÖ֒ކæ LÂêõêÕ+""¢®®näÈ‘………¤ã@Ç €y ¾¾¾¬¬L]]t;òòòçÎ1b„½½}LL é8Ð(`(,,ÔÔÔ”ÀÎètú–-[öíÛ7~üøÀÀ@Òq ½Ð<€À@œ‡‡Ç“'Oöïß?þ|œ (`(((À ` ÎÄÄ$**ª¬¬ÌÕÕµ  €th ˜0 ƒÁ¸páÂèÑ£ I:pƒæÜ Nÿå—_§Nº{÷n\% °PÀ<€0š1cÆDGGŸ?~êÔ©eee¤ã(`ÀžžÞãǵ´´ O:| ̘„‚IVVöàÁƒ[¶l=zôáÇIÇ€ÿæ\†‚lÆŒ‘‘‘ÇŽ›6mZii)é8ð(`Àœ±±qTT”–––]\\é8@£¡€»®¶¶¶ººZEE…tndeeüýýÇŽû×_‘Ž(à.+((èÞ½;N' mS§NeŽž”¤S­ªªêýû÷ééé™™™999¿ÿþ;ǧ½xñBYYYII©wïޭݾ[YY¹=ÿ³IHHØÙÙ}ùò¥²²2##ƒÉdr,àÏŸ?{xxhjjöèÑ£{÷îzzzóçÏïÐF‚‚ž={¦N:gΜ¿ÿþ{ß¾} ð ¸KpX@èééiiiõîÝ[WW·¡¡AJêëßm))©cÇŽñj‹òòò‹-jóiŠŠŠþþþŸ>}ÊÏÏÿôéSkù|þüùرcºººúúúººº={ö”––æUÔ.rtt|ýúõ† ,--&OžL:€ˆÀ!hÚÀáÆGŽ ãw$1WRRòâÅ‹gÏž-[¶LCCƒtÞËÏÏß·o_VV“ÉÌÊÊÒÒÒŠŽŽ&êkÏž=[°`Aß¾}zõêE:EpZ@aÌo¿þúkHHH~~¾““SSSéD|Ñ£Gÿ6Ÿ1{ölCCCccccccggg â±±‡Â¿ýö›­­íÖ­[-Z„/è Œ€9hÿç;vTVVn߾ߑÄÖ£G444ÌÌÌ$$pÉ­¾¾>++ëÇ©©©ïß¿×ÑÑY»v-ǧñõöÛ·o.\())ù×_™™™ñoC‚³ )ÕþݽjÕ*ƒ•+Wò;’hKKK«®®¶²²"DD®ZµÊØØØÌÌÌÂÂÂÕÕÕÁÁ·›hjj:r䈟ŸßâÅ‹7lØ ''ÇÛõþ0F]‚CÐ]ñþýûßÿÝÚÚÚÅÅ%**Štѱ`Á‚ÜÜÜÀÀÀ1cÆ”””0™LžoBBBbÉ’%¯_¿~÷îµµõ½{÷x¾ ‘‡0íÿ¼3bĈM›6¹¸¸ð;’艋‹swwŸ8qâŒ3† ‚#ÌÔóõõ½}û¶¥¥¥¥¥¥¹¹¹³³³¦¦f'ÖsóæÍåË—4hçÎ={öäyN²pšRíßÝæææ/^Äi°N`±X, ½KP}}}JJÊ›7o’’’¾ÿþû1cÆtnUUUUþþþýõ×?þ¸råJÁ¹†  ëPÀ”jÿîÖÔÔLNNÉ cØÖ¬YSUUeeeefffiiÉå^ïß¿_±b“ÉÜ¿¿««+•!øç€Q}}}YYî ÄÅ“'O<==ÏŸ?O:tÞ´iÓÌÍÍ_¿~½qãÆ>}ú$''·öL##£[·níØ±cÑ¢ES§NÍÌ̤2'€ÐÁ˜ƒv~ÞÉÍ͵··ÏÉÉ¡ ’pa±X·nÝò÷÷/,,\½zõÌ™3»uëF:ðûÿ Ž—ÿ†„„˜™™™››ËÊÊÖÔÔüñÇ«V­Z½zµ¼¼<åIx#`ATXXˆ)ÐÅÆÆnܸqÅŠïÞ½ûî»ïо"ƒN§slßÆÆÆ‡Λ7OUUÕÔÔtñâÅ›6mzñâÅëׯÍÌÌ.]ºD}TÁ‡0íü¼sçÎ={öܾ}›‚HB‡Åbá6Ibˆ=±+55µù–Ñ?^±b…ººúž={,,,h4fÞpÁ­(.æí+ž¤¥¥-,,ØEË6tèÐØØØ£GŽ=ÚÉÉéöíÛÖÖÖööövvvìÛ·/Á´dá£hç¡€i4Z}}=é è$%%—,YòîÝ;###999SSS;wîpü>fñî¼ÂÂBqþ2à’’__ß±cÇ’ÂAEEå÷ßýúueeå_ý5nܸ½{÷r|æÓ§OwïÞQVVFqH*¡€;OlGÀ,ëôéÓfffÕÕÕ¸Ä:DWW÷üùóAAA°··çxK&“¹qãÆž={š˜˜SŸ€8Üy»uŸ°[¹rettôõë× @: %ggçgÏž]¾|yéÒ¥½{÷Þ±c‡]ó£öööööö4­±±1%%…Á`p\IYY™’’E‰ø³ 9hçœ7[[ÛÀÀ@[[[ " ”ÂÂB Ìe…®«¯¯?qâÄÖ­[œœ¶oßnddÔþ×Ξ=;,,lÀ€vvvööö®®®ÊÊÊü‹ b × ¢ÂÂBñwïÞí